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;
82 static object XlibLock; // Our locking object
83 static bool themes_enabled;
86 static IntPtr DisplayHandle; // X11 handle to display
87 static int ScreenNo; // Screen number used
88 static IntPtr DefaultColormap; // Colormap for screen
89 static IntPtr CustomVisual; // Visual for window creation
90 static IntPtr CustomColormap; // Colormap for window creation
91 static IntPtr RootWindow; // Handle of the root window for the screen/display
92 static IntPtr FosterParent; // Container to hold child windows until their parent exists
93 static XErrorHandler ErrorHandler; // Error handler delegate
94 static bool ErrorExceptions; // Throw exceptions on X errors
95 int render_major_opcode;
96 int render_first_event;
97 int render_first_error;
100 static IntPtr ClipMagic;
101 static ClipboardData Clipboard; // Our clipboard
104 static IntPtr PostAtom; // PostMessage atom
105 static IntPtr AsyncAtom; // Support for async messages
108 static Hashtable MessageQueues; // Holds our thread-specific XEventQueues
109 static ArrayList unattached_timer_list; // holds timers that are enabled but not attached to a window.
111 static Pollfd[] pollfds; // For watching the X11 socket
112 static bool wake_waiting;
113 static object wake_waiting_lock = new object ();
115 static X11Keyboard Keyboard; //
117 static Socket listen; //
118 static Socket wake; //
119 static Socket wake_receive; //
120 static byte[] network_buffer; //
121 static bool detectable_key_auto_repeat;
124 static IntPtr ActiveWindow; // Handle of the active window
125 static IntPtr FocusWindow; // Handle of the window with keyboard focus (if any)
128 static Stack ModalWindows; // Stack of our modal windows
131 static IntPtr SystrayMgrWindow; // Handle of the Systray Manager window
134 static IntPtr LastCursorWindow; // The last window we set the cursor on
135 static IntPtr LastCursorHandle; // The handle that was last set on LastCursorWindow
136 static IntPtr OverrideCursorHandle; // The cursor that is set to override any other cursors
139 static CaretStruct Caret; //
141 // Last window containing the pointer
142 static IntPtr LastPointerWindow; // The last window containing the pointer
145 static IntPtr WM_PROTOCOLS;
146 static IntPtr WM_DELETE_WINDOW;
147 static IntPtr WM_TAKE_FOCUS;
148 //static IntPtr _NET_SUPPORTED;
149 //static IntPtr _NET_CLIENT_LIST;
150 //static IntPtr _NET_NUMBER_OF_DESKTOPS;
151 static IntPtr _NET_DESKTOP_GEOMETRY;
152 //static IntPtr _NET_DESKTOP_VIEWPORT;
153 static IntPtr _NET_CURRENT_DESKTOP;
154 //static IntPtr _NET_DESKTOP_NAMES;
155 static IntPtr _NET_ACTIVE_WINDOW;
156 static IntPtr _NET_WORKAREA;
157 //static IntPtr _NET_SUPPORTING_WM_CHECK;
158 //static IntPtr _NET_VIRTUAL_ROOTS;
159 //static IntPtr _NET_DESKTOP_LAYOUT;
160 //static IntPtr _NET_SHOWING_DESKTOP;
161 //static IntPtr _NET_CLOSE_WINDOW;
162 //static IntPtr _NET_MOVERESIZE_WINDOW;
163 static IntPtr _NET_WM_MOVERESIZE;
164 //static IntPtr _NET_RESTACK_WINDOW;
165 //static IntPtr _NET_REQUEST_FRAME_EXTENTS;
166 static IntPtr _NET_WM_NAME;
167 //static IntPtr _NET_WM_VISIBLE_NAME;
168 //static IntPtr _NET_WM_ICON_NAME;
169 //static IntPtr _NET_WM_VISIBLE_ICON_NAME;
170 //static IntPtr _NET_WM_DESKTOP;
171 static IntPtr _NET_WM_WINDOW_TYPE;
172 static IntPtr _NET_WM_STATE;
173 //static IntPtr _NET_WM_ALLOWED_ACTIONS;
174 //static IntPtr _NET_WM_STRUT;
175 //static IntPtr _NET_WM_STRUT_PARTIAL;
176 //static IntPtr _NET_WM_ICON_GEOMETRY;
177 static IntPtr _NET_WM_ICON;
178 //static IntPtr _NET_WM_PID;
179 //static IntPtr _NET_WM_HANDLED_ICONS;
180 static IntPtr _NET_WM_USER_TIME;
181 static IntPtr _NET_FRAME_EXTENTS;
182 //static IntPtr _NET_WM_PING;
183 //static IntPtr _NET_WM_SYNC_REQUEST;
184 static IntPtr _NET_SYSTEM_TRAY_S;
185 //static IntPtr _NET_SYSTEM_TRAY_ORIENTATION;
186 static IntPtr _NET_SYSTEM_TRAY_OPCODE;
187 static IntPtr _NET_WM_STATE_MAXIMIZED_HORZ;
188 static IntPtr _NET_WM_STATE_MAXIMIZED_VERT;
189 static IntPtr _XEMBED;
190 static IntPtr _XEMBED_INFO;
191 static IntPtr _MOTIF_WM_HINTS;
192 static IntPtr _NET_WM_STATE_SKIP_TASKBAR;
193 static IntPtr _NET_WM_STATE_ABOVE;
194 static IntPtr _NET_WM_STATE_MODAL;
195 static IntPtr _NET_WM_STATE_HIDDEN;
196 static IntPtr _NET_WM_CONTEXT_HELP;
197 static IntPtr _NET_WM_WINDOW_OPACITY;
198 //static IntPtr _NET_WM_WINDOW_TYPE_DESKTOP;
199 //static IntPtr _NET_WM_WINDOW_TYPE_DOCK;
200 //static IntPtr _NET_WM_WINDOW_TYPE_TOOLBAR;
201 //static IntPtr _NET_WM_WINDOW_TYPE_MENU;
202 static IntPtr _NET_WM_WINDOW_TYPE_UTILITY;
203 //static IntPtr _NET_WM_WINDOW_TYPE_SPLASH;
204 // static IntPtr _NET_WM_WINDOW_TYPE_DIALOG;
205 static IntPtr _NET_WM_WINDOW_TYPE_NORMAL;
206 static IntPtr CLIPBOARD;
207 static IntPtr PRIMARY;
209 static IntPtr OEMTEXT;
210 static IntPtr UTF8_STRING;
211 static IntPtr UTF16_STRING;
212 static IntPtr RICHTEXTFORMAT;
213 static IntPtr TARGETS;
215 // mouse hover message generation
216 static HoverStruct HoverState; //
218 // double click message generation
219 static ClickStruct ClickPending; //
221 // Support for mouse grab
222 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 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
252 // Handle singleton stuff first
256 // Now regular initialization
257 XlibLock = new object ();
258 X11Keyboard.XlibLock = XlibLock;
259 MessageQueues = Hashtable.Synchronized (new Hashtable(7));
260 unattached_timer_list = ArrayList.Synchronized (new ArrayList (3));
261 messageHold = Hashtable.Synchronized (new Hashtable(3));
262 Clipboard = new ClipboardData ();
265 ErrorExceptions = false;
267 // X11 Initialization
268 SetDisplay(XOpenDisplay(IntPtr.Zero));
269 X11DesktopColors.Initialize();
272 // Disable keyboard autorepeat
274 XkbSetDetectableAutoRepeat (DisplayHandle, true, IntPtr.Zero);
275 detectable_key_auto_repeat = true;
277 Console.Error.WriteLine ("Could not disable keyboard auto repeat, will attempt to disable manually.");
278 detectable_key_auto_repeat = false;
281 // Handle any upcoming errors; we re-set it here, X11DesktopColor stuff might have stolen it (gtk does)
282 ErrorHandler = new XErrorHandler(HandleError);
283 XSetErrorHandler(ErrorHandler);
287 // Remove our display handle from S.D
288 Graphics.FromHdcInternal (IntPtr.Zero);
291 #endregion // Constructors
293 #region Singleton Specific Code
294 public static XplatUIX11 GetInstance() {
296 if (Instance == null) {
297 Instance=new XplatUIX11();
304 public int Reference {
311 #region Internal Properties
312 internal static IntPtr Display {
314 return DisplayHandle;
318 XplatUIX11.GetInstance().SetDisplay(value);
322 internal static int Screen {
332 internal static IntPtr RootWindowHandle {
342 internal static IntPtr Visual {
348 CustomVisual = value;
352 internal static IntPtr ColorMap {
354 return CustomColormap;
358 CustomColormap = value;
363 internal static IntPtr DefaultColorMap {
365 return DefaultColormap;
371 #region XExceptionClass
372 internal class XException : ApplicationException {
376 XRequest RequestCode;
380 public XException(IntPtr Display, IntPtr ResourceID, IntPtr Serial, byte ErrorCode, XRequest RequestCode, byte MinorCode) {
381 this.Display = Display;
382 this.ResourceID = ResourceID;
383 this.Serial = Serial;
384 this.RequestCode = RequestCode;
385 this.ErrorCode = ErrorCode;
386 this.MinorCode = MinorCode;
389 public override string Message {
391 return GetMessage(Display, ResourceID, Serial, ErrorCode, RequestCode, MinorCode);
395 public static string GetMessage(IntPtr Display, IntPtr ResourceID, IntPtr Serial, byte ErrorCode, XRequest RequestCode, byte MinorCode) {
404 sb = new StringBuilder(160);
405 XGetErrorText(Display, ErrorCode, sb, sb.Capacity);
406 x_error_text = sb.ToString();
407 hwnd = Hwnd.ObjectFromHandle(ResourceID);
409 hwnd_text = hwnd.ToString();
410 c = Control.FromHandle(hwnd.Handle);
412 control_text = c.ToString();
414 control_text = String.Format("<handle {0:X} non-existant>", hwnd.Handle.ToInt32());
417 hwnd_text = "<null>";
418 control_text = "<null>";
422 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);
426 #endregion // XExceptionClass
428 #region Internal Methods
429 internal void SetDisplay(IntPtr display_handle)
431 if (display_handle != IntPtr.Zero) {
434 if ((DisplayHandle != IntPtr.Zero) && (FosterParent != IntPtr.Zero)) {
435 hwnd = Hwnd.ObjectFromHandle(FosterParent);
436 XDestroyWindow(DisplayHandle, FosterParent);
440 if (DisplayHandle != IntPtr.Zero) {
441 XCloseDisplay(DisplayHandle);
444 DisplayHandle=display_handle;
446 // We need to tell System.Drawing our DisplayHandle. FromHdcInternal has
447 // been hacked to do this for us.
448 Graphics.FromHdcInternal (DisplayHandle);
450 // query for the render extension so
451 // we can ignore the spurious
452 // BadPicture errors that are
453 // generated by cairo/render.
454 XQueryExtension (DisplayHandle, "RENDER",
455 ref render_major_opcode, ref render_first_event, ref render_first_error);
458 if (Environment.GetEnvironmentVariable ("MONO_XSYNC") != null) {
459 XSynchronize(DisplayHandle, true);
462 if (Environment.GetEnvironmentVariable ("MONO_XEXCEPTIONS") != null) {
463 ErrorExceptions = true;
467 ScreenNo = XDefaultScreen(DisplayHandle);
468 RootWindow = XRootWindow(DisplayHandle, ScreenNo);
469 DefaultColormap = XDefaultColormap(DisplayHandle, ScreenNo);
471 // Create the foster parent
472 // it is important that border_width is kept in synch with the other XCreateWindow calls
473 FosterParent=XCreateSimpleWindow(DisplayHandle, RootWindow, 0, 0, 1, 1, 0, UIntPtr.Zero, UIntPtr.Zero);
474 if (FosterParent==IntPtr.Zero) {
475 Console.WriteLine("XplatUIX11 Constructor failed to create FosterParent");
478 DebugHelper.WriteLine ("FosterParent created 0x{0:x}", FosterParent.ToInt32());
481 hwnd.Queue = ThreadQueue(Thread.CurrentThread);
482 hwnd.WholeWindow = FosterParent;
483 hwnd.ClientWindow = FosterParent;
485 // Create a HWND for RootWIndow as well, so our queue doesn't eat the events
487 hwnd.Queue = ThreadQueue(Thread.CurrentThread);
488 hwnd.whole_window = RootWindow;
489 hwnd.ClientWindow = RootWindow;
491 // For sleeping on the X11 socket
492 listen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
493 IPEndPoint ep = new IPEndPoint(IPAddress.Loopback, 0);
497 // To wake up when a timer is ready
498 network_buffer = new byte[10];
500 wake = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
501 wake.Connect(listen.LocalEndPoint);
502 wake_receive = listen.Accept();
505 pollfds = new Pollfd [2];
506 pollfds [0] = new Pollfd ();
507 pollfds [0].fd = XConnectionNumber (DisplayHandle);
508 pollfds [0].events = PollEvents.POLLIN;
510 pollfds [1] = new Pollfd ();
511 pollfds [1].fd = wake_receive.Handle.ToInt32 ();
512 pollfds [1].events = PollEvents.POLLIN;
515 Keyboard = new X11Keyboard(DisplayHandle, FosterParent);
516 Dnd = new X11Dnd (DisplayHandle, Keyboard);
518 DoubleClickInterval = 500;
520 HoverState.Interval = 500;
521 HoverState.Timer = new Timer();
522 HoverState.Timer.Enabled = false;
523 HoverState.Timer.Interval = HoverState.Interval;
524 HoverState.Timer.Tick += new EventHandler(MouseHover);
525 HoverState.Size = new Size(4, 4);
529 ActiveWindow = IntPtr.Zero;
530 FocusWindow = IntPtr.Zero;
531 ModalWindows = new Stack(3);
533 MouseState = MouseButtons.None;
534 mouse_position = new Point(0, 0);
536 Caret.Timer = new Timer();
537 Caret.Timer.Interval = 500; // FIXME - where should this number come from?
538 Caret.Timer.Tick += new EventHandler(CaretCallback);
542 // Grab atom changes off the root window to catch certain WM events
543 XSelectInput(DisplayHandle, RootWindow, new IntPtr ((int) (EventMask.PropertyChangeMask | Keyboard.KeyEventMask)));
545 // Handle any upcoming errors
546 ErrorHandler = new XErrorHandler(HandleError);
547 XSetErrorHandler(ErrorHandler);
549 throw new ArgumentNullException("Display", "Could not open display (X-Server required. Check you DISPLAY environment variable)");
552 #endregion // Internal Methods
555 [Conditional ("DriverDebug")]
556 static void DriverDebug (string format, params object [] args)
558 Console.WriteLine (String.Format (format, args));
562 TimeSpan t = (DateTime.UtcNow - new DateTime(1970, 1, 1));
564 return (int) t.TotalSeconds;
567 static void SetupAtoms() {
568 // make sure this array stays in sync with the statements below
569 string [] atom_names = new string[] {
574 //"_NET_CLIENT_LIST",
575 //"_NET_NUMBER_OF_DESKTOPS",
576 "_NET_DESKTOP_GEOMETRY",
577 //"_NET_DESKTOP_VIEWPORT",
578 "_NET_CURRENT_DESKTOP",
579 //"_NET_DESKTOP_NAMES",
580 "_NET_ACTIVE_WINDOW",
582 //"_NET_SUPPORTING_WM_CHECK",
583 //"_NET_VIRTUAL_ROOTS",
584 //"_NET_DESKTOP_LAYOUT",
585 //"_NET_SHOWING_DESKTOP",
586 //"_NET_CLOSE_WINDOW",
587 //"_NET_MOVERESIZE_WINDOW",
588 "_NET_WM_MOVERESIZE",
589 //"_NET_RESTACK_WINDOW",
590 //"_NET_REQUEST_FRAME_EXTENTS",
592 //"_NET_WM_VISIBLE_NAME",
593 //"_NET_WM_ICON_NAME",
594 //"_NET_WM_VISIBLE_ICON_NAME",
596 "_NET_WM_WINDOW_TYPE",
598 //"_NET_WM_ALLOWED_ACTIONS",
600 //"_NET_WM_STRUT_PARTIAL",
601 //"_NET_WM_ICON_GEOMETRY",
604 //"_NET_WM_HANDLED_ICONS",
606 "_NET_FRAME_EXTENTS",
608 //"_NET_WM_SYNC_REQUEST",
609 "_NET_SYSTEM_TRAY_OPCODE",
610 //"_NET_SYSTEM_TRAY_ORIENTATION",
611 "_NET_WM_STATE_MAXIMIZED_HORZ",
612 "_NET_WM_STATE_MAXIMIZED_VERT",
613 "_NET_WM_STATE_HIDDEN",
617 "_NET_WM_STATE_SKIP_TASKBAR",
618 "_NET_WM_STATE_ABOVE",
619 "_NET_WM_STATE_MODAL",
620 "_NET_WM_CONTEXT_HELP",
621 "_NET_WM_WINDOW_OPACITY",
622 //"_NET_WM_WINDOW_TYPE_DESKTOP",
623 //"_NET_WM_WINDOW_TYPE_DOCK",
624 //"_NET_WM_WINDOW_TYPE_TOOLBAR",
625 //"_NET_WM_WINDOW_TYPE_MENU",
626 "_NET_WM_WINDOW_TYPE_UTILITY",
627 // "_NET_WM_WINDOW_TYPE_DIALOG",
628 //"_NET_WM_WINDOW_TYPE_SPLASH",
629 "_NET_WM_WINDOW_TYPE_NORMAL",
638 "_SWF_PostMessageAtom",
641 IntPtr[] atoms = new IntPtr [atom_names.Length];;
643 XInternAtoms (DisplayHandle, atom_names, atom_names.Length, false, atoms);
646 WM_PROTOCOLS = atoms [off++];
647 WM_DELETE_WINDOW = atoms [off++];
648 WM_TAKE_FOCUS = atoms [off++];
649 //_NET_SUPPORTED = atoms [off++];
650 //_NET_CLIENT_LIST = atoms [off++];
651 //_NET_NUMBER_OF_DESKTOPS = atoms [off++];
652 _NET_DESKTOP_GEOMETRY = atoms [off++];
653 //_NET_DESKTOP_VIEWPORT = atoms [off++];
654 _NET_CURRENT_DESKTOP = atoms [off++];
655 //_NET_DESKTOP_NAMES = atoms [off++];
656 _NET_ACTIVE_WINDOW = atoms [off++];
657 _NET_WORKAREA = atoms [off++];
658 //_NET_SUPPORTING_WM_CHECK = atoms [off++];
659 //_NET_VIRTUAL_ROOTS = atoms [off++];
660 //_NET_DESKTOP_LAYOUT = atoms [off++];
661 //_NET_SHOWING_DESKTOP = atoms [off++];
662 //_NET_CLOSE_WINDOW = atoms [off++];
663 //_NET_MOVERESIZE_WINDOW = atoms [off++];
664 _NET_WM_MOVERESIZE = atoms [off++];
665 //_NET_RESTACK_WINDOW = atoms [off++];
666 //_NET_REQUEST_FRAME_EXTENTS = atoms [off++];
667 _NET_WM_NAME = atoms [off++];
668 //_NET_WM_VISIBLE_NAME = atoms [off++];
669 //_NET_WM_ICON_NAME = atoms [off++];
670 //_NET_WM_VISIBLE_ICON_NAME = atoms [off++];
671 //_NET_WM_DESKTOP = atoms [off++];
672 _NET_WM_WINDOW_TYPE = atoms [off++];
673 _NET_WM_STATE = atoms [off++];
674 //_NET_WM_ALLOWED_ACTIONS = atoms [off++];
675 //_NET_WM_STRUT = atoms [off++];
676 //_NET_WM_STRUT_PARTIAL = atoms [off++];
677 //_NET_WM_ICON_GEOMETRY = atoms [off++];
678 _NET_WM_ICON = atoms [off++];
679 //_NET_WM_PID = atoms [off++];
680 //_NET_WM_HANDLED_ICONS = atoms [off++];
681 _NET_WM_USER_TIME = atoms [off++];
682 _NET_FRAME_EXTENTS = atoms [off++];
683 //_NET_WM_PING = atoms [off++];
684 //_NET_WM_SYNC_REQUEST = atoms [off++];
685 _NET_SYSTEM_TRAY_OPCODE = atoms [off++];
686 //_NET_SYSTEM_TRAY_ORIENTATION = atoms [off++];
687 _NET_WM_STATE_MAXIMIZED_HORZ = atoms [off++];
688 _NET_WM_STATE_MAXIMIZED_VERT = atoms [off++];
689 _NET_WM_STATE_HIDDEN = atoms [off++];
690 _XEMBED = atoms [off++];
691 _XEMBED_INFO = atoms [off++];
692 _MOTIF_WM_HINTS = atoms [off++];
693 _NET_WM_STATE_SKIP_TASKBAR = atoms [off++];
694 _NET_WM_STATE_ABOVE = atoms [off++];
695 _NET_WM_STATE_MODAL = atoms [off++];
696 _NET_WM_CONTEXT_HELP = atoms [off++];
697 _NET_WM_WINDOW_OPACITY = atoms [off++];
698 //_NET_WM_WINDOW_TYPE_DESKTOP = atoms [off++];
699 //_NET_WM_WINDOW_TYPE_DOCK = atoms [off++];
700 //_NET_WM_WINDOW_TYPE_TOOLBAR = atoms [off++];
701 //_NET_WM_WINDOW_TYPE_MENU = atoms [off++];
702 _NET_WM_WINDOW_TYPE_UTILITY = atoms [off++];
703 // _NET_WM_WINDOW_TYPE_DIALOG = atoms [off++];
704 //_NET_WM_WINDOW_TYPE_SPLASH = atoms [off++];
705 _NET_WM_WINDOW_TYPE_NORMAL = atoms [off++];
706 CLIPBOARD = atoms [off++];
707 PRIMARY = atoms [off++];
708 OEMTEXT = atoms [off++];
709 UTF8_STRING = atoms [off++];
710 UTF16_STRING = atoms [off++];
711 RICHTEXTFORMAT = atoms [off++];
712 TARGETS = atoms [off++];
713 AsyncAtom = atoms [off++];
714 PostAtom = atoms [off++];
715 HoverState.Atom = atoms [off++];
717 //DIB = (IntPtr)Atom.XA_PIXMAP;
718 _NET_SYSTEM_TRAY_S = XInternAtom (DisplayHandle, "_NET_SYSTEM_TRAY_S" + ScreenNo.ToString(), false);
721 void GetSystrayManagerWindow() {
722 XGrabServer(DisplayHandle);
723 SystrayMgrWindow = XGetSelectionOwner(DisplayHandle, _NET_SYSTEM_TRAY_S);
724 XUngrabServer(DisplayHandle);
725 XFlush(DisplayHandle);
728 void SendNetWMMessage(IntPtr window, IntPtr message_type, IntPtr l0, IntPtr l1, IntPtr l2) {
729 SendNetWMMessage (window, message_type, l0, l1, l2, IntPtr.Zero);
732 void SendNetWMMessage(IntPtr window, IntPtr message_type, IntPtr l0, IntPtr l1, IntPtr l2, IntPtr l3) {
736 xev.ClientMessageEvent.type = XEventName.ClientMessage;
737 xev.ClientMessageEvent.send_event = true;
738 xev.ClientMessageEvent.window = window;
739 xev.ClientMessageEvent.message_type = message_type;
740 xev.ClientMessageEvent.format = 32;
741 xev.ClientMessageEvent.ptr1 = l0;
742 xev.ClientMessageEvent.ptr2 = l1;
743 xev.ClientMessageEvent.ptr3 = l2;
744 xev.ClientMessageEvent.ptr4 = l3;
745 XSendEvent(DisplayHandle, RootWindow, false, new IntPtr ((int) (EventMask.SubstructureRedirectMask | EventMask.SubstructureNotifyMask)), ref xev);
748 void SendNetClientMessage(IntPtr window, IntPtr message_type, IntPtr l0, IntPtr l1, IntPtr l2) {
752 xev.ClientMessageEvent.type = XEventName.ClientMessage;
753 xev.ClientMessageEvent.send_event = true;
754 xev.ClientMessageEvent.window = window;
755 xev.ClientMessageEvent.message_type = message_type;
756 xev.ClientMessageEvent.format = 32;
757 xev.ClientMessageEvent.ptr1 = l0;
758 xev.ClientMessageEvent.ptr2 = l1;
759 xev.ClientMessageEvent.ptr3 = l2;
760 XSendEvent(DisplayHandle, window, false, new IntPtr ((int)EventMask.NoEventMask), ref xev);
763 // For WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN, WM_XBUTTONDOWN
764 // WM_CREATE and WM_DESTROY causes
765 void SendParentNotify(IntPtr child, Msg cause, int x, int y)
769 if (child == IntPtr.Zero) {
773 hwnd = Hwnd.GetObjectFromWindow (child);
779 if (hwnd.Handle == IntPtr.Zero) {
783 if (ExStyleSet ((int) hwnd.initial_ex_style, WindowExStyles.WS_EX_NOPARENTNOTIFY)) {
787 if (hwnd.Parent == null) {
791 if (hwnd.Parent.Handle == IntPtr.Zero) {
795 if (cause == Msg.WM_CREATE || cause == Msg.WM_DESTROY) {
796 SendMessage(hwnd.Parent.Handle, Msg.WM_PARENTNOTIFY, Control.MakeParam((int)cause, 0), child);
798 SendMessage(hwnd.Parent.Handle, Msg.WM_PARENTNOTIFY, Control.MakeParam((int)cause, 0), Control.MakeParam(x, y));
801 SendParentNotify (hwnd.Parent.Handle, cause, x, y);
804 bool StyleSet (int s, WindowStyles ws)
806 return (s & (int)ws) == (int)ws;
809 bool ExStyleSet (int ex, WindowExStyles exws)
811 return (ex & (int)exws) == (int)exws;
814 internal static Rectangle TranslateClientRectangleToXClientRectangle (Hwnd hwnd)
816 return TranslateClientRectangleToXClientRectangle (hwnd, Control.FromHandle (hwnd.Handle));
819 internal static Rectangle TranslateClientRectangleToXClientRectangle (Hwnd hwnd, Control ctrl)
822 * If this is a form with no window manager, X is handling all the border and caption painting
823 * so remove that from the area (since the area we set of the window here is the part of the window
824 * we're painting in only)
826 Rectangle rect = hwnd.ClientRect;
827 Form form = ctrl as Form;
828 CreateParams cp = null;
831 cp = form.GetCreateParams ();
833 if (form != null && (form.window_manager == null && !cp.IsSet (WindowExStyles.WS_EX_TOOLWINDOW))) {
834 Hwnd.Borders borders = Hwnd.GetBorders (cp, null);
835 Rectangle xrect = rect;
837 xrect.Y -= borders.top;
838 xrect.X -= borders.left;
839 xrect.Width += borders.left + borders.right;
840 xrect.Height += borders.top + borders.bottom;
845 if (rect.Width < 1 || rect.Height < 1) {
855 internal static Size TranslateWindowSizeToXWindowSize (CreateParams cp)
857 return TranslateWindowSizeToXWindowSize (cp, new Size (cp.Width, cp.Height));
860 internal static Size TranslateWindowSizeToXWindowSize (CreateParams cp, Size size)
863 * If this is a form with no window manager, X is handling all the border and caption painting
864 * so remove that from the area (since the area we set of the window here is the part of the window
865 * we're painting in only)
867 Form form = cp.control as Form;
868 if (form != null && (form.window_manager == null && !cp.IsSet (WindowExStyles.WS_EX_TOOLWINDOW))) {
869 Hwnd.Borders borders = Hwnd.GetBorders (cp, null);
872 xrect.Width -= borders.left + borders.right;
873 xrect.Height -= borders.top + borders.bottom;
877 if (size.Height == 0)
884 internal static Size TranslateXWindowSizeToWindowSize (CreateParams cp, int xWidth, int xHeight)
887 * If this is a form with no window manager, X is handling all the border and caption painting
888 * so remove that from the area (since the area we set of the window here is the part of the window
889 * we're painting in only)
891 Size rect = new Size (xWidth, xHeight);
892 Form form = cp.control as Form;
893 if (form != null && (form.window_manager == null && !cp.IsSet (WindowExStyles.WS_EX_TOOLWINDOW))) {
894 Hwnd.Borders borders = Hwnd.GetBorders (cp, null);
897 xrect.Width += borders.left + borders.right;
898 xrect.Height += borders.top + borders.bottom;
905 internal static Point GetTopLevelWindowLocation (Hwnd hwnd)
911 XTranslateCoordinates (DisplayHandle, hwnd.whole_window, RootWindow, 0, 0, out x, out y, out dummy);
912 frame = FrameExtents (hwnd.whole_window);
917 return new Point (x, y);
920 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) {
923 tool_caption_height = 19;
924 border_static = false;
926 if (StyleSet (Style, WindowStyles.WS_CHILD)) {
927 if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_CLIENTEDGE)) {
928 border_style = FormBorderStyle.Fixed3D;
929 } else if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_STATICEDGE)) {
930 border_style = FormBorderStyle.Fixed3D;
931 border_static = true;
932 } else if (!StyleSet (Style, WindowStyles.WS_BORDER)) {
933 border_style = FormBorderStyle.None;
935 border_style = FormBorderStyle.FixedSingle;
937 title_style = TitleStyle.None;
939 if (StyleSet (Style, WindowStyles.WS_CAPTION)) {
941 if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
942 title_style = TitleStyle.Tool;
944 title_style = TitleStyle.Normal;
948 if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_MDICHILD)) {
951 if (StyleSet (Style, WindowStyles.WS_OVERLAPPEDWINDOW) ||
952 ExStyleSet (ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
953 border_style = (FormBorderStyle) 0xFFFF;
955 border_style = FormBorderStyle.None;
960 title_style = TitleStyle.None;
961 if (StyleSet (Style, WindowStyles.WS_CAPTION)) {
962 if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
963 title_style = TitleStyle.Tool;
965 title_style = TitleStyle.Normal;
969 border_style = FormBorderStyle.None;
971 if (StyleSet (Style, WindowStyles.WS_THICKFRAME)) {
972 if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
973 border_style = FormBorderStyle.SizableToolWindow;
975 border_style = FormBorderStyle.Sizable;
978 if (StyleSet (Style, WindowStyles.WS_CAPTION)) {
979 if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_CLIENTEDGE)) {
980 border_style = FormBorderStyle.Fixed3D;
981 } else if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_STATICEDGE)) {
982 border_style = FormBorderStyle.Fixed3D;
983 border_static = true;
984 } else if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_DLGMODALFRAME)) {
985 border_style = FormBorderStyle.FixedDialog;
986 } else if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
987 border_style = FormBorderStyle.FixedToolWindow;
988 } else if (StyleSet (Style, WindowStyles.WS_BORDER)) {
989 border_style = FormBorderStyle.FixedSingle;
992 if (StyleSet (Style, WindowStyles.WS_BORDER)) {
993 border_style = FormBorderStyle.FixedSingle;
1000 void SetHwndStyles(Hwnd hwnd, CreateParams cp) {
1001 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);
1004 void SetWMStyles(Hwnd hwnd, CreateParams cp) {
1005 MotifWmHints mwmHints;
1006 MotifFunctions functions;
1007 MotifDecorations decorations;
1010 Rectangle client_rect;
1013 bool hide_from_taskbar;
1014 IntPtr transient_for_parent;
1016 // Windows we manage ourselves don't need WM window styles.
1017 if (cp.HasWindowManager && !cp.IsSet (WindowExStyles.WS_EX_TOOLWINDOW)) {
1022 mwmHints = new MotifWmHints();
1025 window_type = _NET_WM_WINDOW_TYPE_NORMAL;
1026 transient_for_parent = IntPtr.Zero;
1028 mwmHints.flags = (IntPtr)(MotifFlags.Functions | MotifFlags.Decorations);
1029 mwmHints.functions = (IntPtr)0;
1030 mwmHints.decorations = (IntPtr)0;
1032 form = cp.control as Form;
1034 if (ExStyleSet (cp.ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
1035 /* tool windows get no window manager
1039 /* just because the window doesn't get any decorations doesn't
1040 mean we should disable the functions. for instance, without
1041 MotifFunctions.Maximize, changing the windowstate to Maximized
1042 is ignored by metacity. */
1043 functions |= MotifFunctions.Move | MotifFunctions.Resize | MotifFunctions.Minimize | MotifFunctions.Maximize;
1044 } else if (form != null && form.FormBorderStyle == FormBorderStyle.None) {
1045 /* allow borderless window to be maximized */
1046 functions |= MotifFunctions.All | MotifFunctions.Resize;
1048 if (StyleSet (cp.Style, WindowStyles.WS_CAPTION)) {
1049 functions |= MotifFunctions.Move;
1050 decorations |= MotifDecorations.Title | MotifDecorations.Menu;
1053 if (StyleSet (cp.Style, WindowStyles.WS_THICKFRAME)) {
1054 functions |= MotifFunctions.Move | MotifFunctions.Resize;
1055 decorations |= MotifDecorations.Border | MotifDecorations.ResizeH;
1058 if (StyleSet (cp.Style, WindowStyles.WS_MINIMIZEBOX)) {
1059 functions |= MotifFunctions.Minimize;
1060 decorations |= MotifDecorations.Minimize;
1063 if (StyleSet (cp.Style, WindowStyles.WS_MAXIMIZEBOX)) {
1064 functions |= MotifFunctions.Maximize;
1065 decorations |= MotifDecorations.Maximize;
1068 if (StyleSet (cp.Style, WindowStyles.WS_SIZEBOX)) {
1069 functions |= MotifFunctions.Resize;
1070 decorations |= MotifDecorations.ResizeH;
1073 if (ExStyleSet (cp.ExStyle, WindowExStyles.WS_EX_DLGMODALFRAME)) {
1074 decorations |= MotifDecorations.Border;
1077 if (StyleSet (cp.Style, WindowStyles.WS_BORDER)) {
1078 decorations |= MotifDecorations.Border;
1081 if (StyleSet (cp.Style, WindowStyles.WS_DLGFRAME)) {
1082 decorations |= MotifDecorations.Border;
1085 if (StyleSet (cp.Style, WindowStyles.WS_SYSMENU)) {
1086 functions |= MotifFunctions.Close;
1089 functions &= ~(MotifFunctions.Maximize | MotifFunctions.Minimize | MotifFunctions.Close);
1090 decorations &= ~(MotifDecorations.Menu | MotifDecorations.Maximize | MotifDecorations.Minimize);
1091 if (cp.Caption == "") {
1092 functions &= ~MotifFunctions.Move;
1093 decorations &= ~(MotifDecorations.Title | MotifDecorations.ResizeH);
1098 if ((functions & MotifFunctions.Resize) == 0) {
1099 hwnd.fixed_size = true;
1100 Rectangle fixed_rectangle = new Rectangle (cp.X, cp.Y, cp.Width, cp.Height);
1101 SetWindowMinMax(hwnd.Handle, fixed_rectangle, fixed_rectangle.Size, fixed_rectangle.Size, cp);
1103 hwnd.fixed_size = false;
1106 mwmHints.functions = (IntPtr)functions;
1107 mwmHints.decorations = (IntPtr)decorations;
1109 DriverDebug ("SetWMStyles ({0}, {1}) functions = {2}, decorations = {3}", hwnd, cp, functions, decorations);
1111 if (cp.IsSet (WindowExStyles.WS_EX_TOOLWINDOW)) {
1112 // needed! map toolwindows to _NET_WM_WINDOW_TYPE_UTILITY to make newer metacity versions happy
1113 // and get those windows in front of their parents
1114 window_type = _NET_WM_WINDOW_TYPE_UTILITY;
1116 window_type = _NET_WM_WINDOW_TYPE_NORMAL;
1119 if (!cp.IsSet (WindowExStyles.WS_EX_APPWINDOW)) {
1120 hide_from_taskbar = true;
1121 } else if (cp.IsSet (WindowExStyles.WS_EX_TOOLWINDOW) && form != null && form.Parent != null && !form.ShowInTaskbar) {
1122 hide_from_taskbar = true;
1124 hide_from_taskbar = false;
1127 if (ExStyleSet (cp.ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
1128 if (form != null && !hwnd.reparented) {
1129 if (form.Owner != null && form.Owner.Handle != IntPtr.Zero) {
1130 Hwnd owner_hwnd = Hwnd.ObjectFromHandle (form.Owner.Handle);
1131 if (owner_hwnd != null)
1132 transient_for_parent = owner_hwnd.whole_window;
1136 if (StyleSet (cp.Style, WindowStyles.WS_POPUP) && (hwnd.parent != null) && (hwnd.parent.whole_window != IntPtr.Zero)) {
1137 transient_for_parent = hwnd.parent.whole_window;
1140 FormWindowState current_state = GetWindowState (hwnd.Handle);
1141 if (current_state == (FormWindowState)(-1))
1142 current_state = FormWindowState.Normal;
1144 client_rect = TranslateClientRectangleToXClientRectangle (hwnd);
1149 atoms [0] = window_type.ToInt32 ();
1150 XChangeProperty (DisplayHandle, hwnd.whole_window, _NET_WM_WINDOW_TYPE, (IntPtr)Atom.XA_ATOM, 32, PropertyMode.Replace, atoms, 1);
1152 XChangeProperty(DisplayHandle, hwnd.whole_window, _MOTIF_WM_HINTS, _MOTIF_WM_HINTS, 32, PropertyMode.Replace, ref mwmHints, 5);
1154 if (transient_for_parent != IntPtr.Zero) {
1155 XSetTransientForHint (DisplayHandle, hwnd.whole_window, transient_for_parent);
1158 MoveResizeWindow(DisplayHandle, hwnd.client_window, client_rect.X, client_rect.Y, client_rect.Width, client_rect.Height);
1160 if (hide_from_taskbar) {
1161 /* this line keeps the window from showing up in gnome's taskbar */
1162 atoms[atom_count++] = _NET_WM_STATE_SKIP_TASKBAR.ToInt32();
1164 /* we need to add these atoms in the
1165 * event we're maximized, since we're
1166 * replacing the existing
1167 * _NET_WM_STATE here. If we don't
1168 * add them, future calls to
1169 * GetWindowState will return Normal
1170 * for a window which is maximized. */
1171 if (current_state == FormWindowState.Maximized) {
1172 atoms[atom_count++] = _NET_WM_STATE_MAXIMIZED_HORZ.ToInt32();
1173 atoms[atom_count++] = _NET_WM_STATE_MAXIMIZED_VERT.ToInt32();
1176 if (form != null && form.Modal) {
1177 atoms[atom_count++] = _NET_WM_STATE_MODAL.ToInt32 ();
1180 XChangeProperty(DisplayHandle, hwnd.whole_window, _NET_WM_STATE, (IntPtr)Atom.XA_ATOM, 32, PropertyMode.Replace, atoms, atom_count);
1183 IntPtr[] atom_ptrs = new IntPtr[2];
1184 atom_ptrs[atom_count++] = WM_DELETE_WINDOW;
1185 if (ExStyleSet (cp.ExStyle, WindowExStyles.WS_EX_CONTEXTHELP)) {
1186 atom_ptrs[atom_count++] = _NET_WM_CONTEXT_HELP;
1189 XSetWMProtocols(DisplayHandle, hwnd.whole_window, atom_ptrs, atom_count);
1193 void SetIcon(Hwnd hwnd, Icon icon)
1198 // This really needs to do whatever it
1199 // takes to remove the window manager
1200 // menu, not just delete the ICON
1201 // property. This will cause metacity
1202 // to use the "no icon set" icon, and
1203 // we'll still have an icon.
1204 XDeleteProperty (DisplayHandle, hwnd.whole_window, _NET_WM_ICON);
1212 bitmap = icon.ToBitmap();
1214 size = bitmap.Width * bitmap.Height + 2;
1215 data = new IntPtr[size];
1217 data[index++] = (IntPtr)bitmap.Width;
1218 data[index++] = (IntPtr)bitmap.Height;
1220 for (int y = 0; y < bitmap.Height; y++) {
1221 for (int x = 0; x < bitmap.Width; x++) {
1222 data[index++] = (IntPtr)bitmap.GetPixel (x, y).ToArgb ();
1226 XChangeProperty (DisplayHandle, hwnd.whole_window,
1227 _NET_WM_ICON, (IntPtr)Atom.XA_CARDINAL, 32,
1228 PropertyMode.Replace, data, size);
1232 void WakeupMain () {
1233 wake.Send (new byte [] { 0xFF });
1236 XEventQueue ThreadQueue(Thread thread) {
1239 queue = (XEventQueue)MessageQueues[thread];
1240 if (queue == null) {
1241 queue = new XEventQueue(thread);
1242 MessageQueues[thread] = queue;
1248 void TranslatePropertyToClipboard(IntPtr property) {
1253 IntPtr prop = IntPtr.Zero;
1255 Clipboard.Item = null;
1257 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);
1259 if ((long)nitems > 0) {
1260 if (property == (IntPtr)Atom.XA_STRING) {
1261 // Some X managers/apps pass unicode chars as escaped strings, so
1262 // we may need to unescape them.
1263 Clipboard.Item = UnescapeUnicodeFromAnsi (Marshal.PtrToStringAnsi(prop));
1264 } else if (property == (IntPtr)Atom.XA_BITMAP) {
1265 // FIXME - convert bitmap to image
1266 } else if (property == (IntPtr)Atom.XA_PIXMAP) {
1267 // FIXME - convert pixmap to image
1268 } else if (property == OEMTEXT) {
1269 Clipboard.Item = UnescapeUnicodeFromAnsi (Marshal.PtrToStringAnsi(prop));
1270 } else if (property == UTF8_STRING) {
1271 byte [] buffer = new byte [(int)nitems];
1272 for (int i = 0; i < (int)nitems; i++)
1273 buffer [i] = Marshal.ReadByte (prop, i);
1274 Clipboard.Item = Encoding.UTF8.GetString (buffer);
1275 } else if (property == UTF16_STRING) {
1276 Clipboard.Item = Marshal.PtrToStringUni (prop, Encoding.Unicode.GetMaxCharCount ((int)nitems));
1277 } else if (property == RICHTEXTFORMAT)
1278 Clipboard.Item = Marshal.PtrToStringAnsi(prop);
1279 else if (DataFormats.ContainsFormat (property.ToInt32 ())) {
1280 if (DataFormats.GetFormat (property.ToInt32 ()).is_serializable) {
1281 MemoryStream memory_stream = new MemoryStream ((int)nitems);
1282 for (int i = 0; i < (int)nitems; i++)
1283 memory_stream.WriteByte (Marshal.ReadByte (prop, i));
1285 memory_stream.Position = 0;
1286 BinaryFormatter formatter = new BinaryFormatter ();
1287 Clipboard.Item = formatter.Deserialize (memory_stream);
1288 memory_stream.Close ();
1296 string UnescapeUnicodeFromAnsi (string value)
1298 if (value == null || value.IndexOf ("\\u") == -1)
1301 StringBuilder sb = new StringBuilder (value.Length);
1305 while (start < value.Length) {
1306 pos = value.IndexOf ("\\u", start);
1310 sb.Append (value, start, pos - start);
1315 while (pos < value.Length) {
1316 if (!Char.IsLetterOrDigit (value [pos]))
1323 if (!Int32.TryParse (value.Substring (start, length), System.Globalization.NumberStyles.HexNumber,
1325 return value; // Error, return the unescaped original value.
1327 sb.Append ((char)res);
1331 // Append any remaining data.
1332 if (start < value.Length)
1333 sb.Append (value, start, value.Length - start);
1335 return sb.ToString ();
1338 void AddExpose (Hwnd hwnd, bool client, int x, int y, int width, int height) {
1340 if ((hwnd == null) || (x > hwnd.Width) || (y > hwnd.Height) || ((x + width) < 0) || ((y + height) < 0)) {
1344 // Keep the invalid area as small as needed
1345 if ((x + width) > hwnd.width) {
1346 width = hwnd.width - x;
1349 if ((y + height) > hwnd.height) {
1350 height = hwnd.height - y;
1354 hwnd.AddInvalidArea(x, y, width, height);
1355 if (!hwnd.expose_pending) {
1356 if (!hwnd.nc_expose_pending) {
1357 hwnd.Queue.Paint.Enqueue(hwnd);
1359 hwnd.expose_pending = true;
1362 hwnd.AddNcInvalidArea (x, y, width, height);
1364 if (!hwnd.nc_expose_pending) {
1365 if (!hwnd.expose_pending) {
1366 hwnd.Queue.Paint.Enqueue(hwnd);
1368 hwnd.nc_expose_pending = true;
1373 static Hwnd.Borders FrameExtents (IntPtr window)
1379 IntPtr prop = IntPtr.Zero;
1380 Hwnd.Borders rect = new Hwnd.Borders ();
1382 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);
1383 if (prop != IntPtr.Zero) {
1384 if (nitems.ToInt32 () == 4) {
1385 rect.left = Marshal.ReadInt32 (prop, 0);
1386 rect.right = Marshal.ReadInt32 (prop, IntPtr.Size);
1387 rect.top = Marshal.ReadInt32 (prop, 2 * IntPtr.Size);
1388 rect.bottom = Marshal.ReadInt32 (prop, 3 * IntPtr.Size);
1396 void AddConfigureNotify (XEvent xevent) {
1399 hwnd = Hwnd.GetObjectFromWindow(xevent.ConfigureEvent.window);
1402 if (hwnd == null || hwnd.zombie) {
1405 if ((xevent.ConfigureEvent.window == hwnd.whole_window)/* && (xevent.ConfigureEvent.window == xevent.ConfigureEvent.xevent)*/) {
1406 if (hwnd.parent == null) {
1407 // The location given by the event is not reliable between different wm's,
1408 // so use an alternative way of getting it.
1409 Point location = GetTopLevelWindowLocation (hwnd);
1410 hwnd.x = location.X;
1411 hwnd.y = location.Y;
1414 // XXX this sucks. this isn't thread safe
1415 Control ctrl = Control.FromHandle (hwnd.Handle);
1416 Size TranslatedSize;
1418 TranslatedSize = TranslateXWindowSizeToWindowSize (ctrl.GetCreateParams (), xevent.ConfigureEvent.width, xevent.ConfigureEvent.height);
1420 TranslatedSize = new Size (xevent.ConfigureEvent.width, xevent.ConfigureEvent.height);
1422 hwnd.width = TranslatedSize.Width;
1423 hwnd.height = TranslatedSize.Height;
1424 hwnd.ClientRect = Rectangle.Empty;
1426 DriverDebug ("AddConfigureNotify (hwnd.Handle = {1}, final hwnd.rect = {0}, reported rect={2})",
1427 new Rectangle (hwnd.x, hwnd.y, hwnd.width, hwnd.height), hwnd.Handle,
1428 new Rectangle (xevent.ConfigureEvent.x, xevent.ConfigureEvent.y, xevent.ConfigureEvent.width, xevent.ConfigureEvent.width));
1429 lock (hwnd.configure_lock) {
1430 if (!hwnd.configure_pending) {
1431 hwnd.Queue.EnqueueLocked (xevent);
1432 hwnd.configure_pending = true;
1436 // We drop configure events for Client windows
1440 if ((Caret.gc == IntPtr.Zero) || Caret.On) {
1446 XDrawLine(DisplayHandle, Caret.Window, Caret.gc, Caret.X, Caret.Y, Caret.X, Caret.Y + Caret.Height);
1451 if ((Caret.gc == IntPtr.Zero) || !Caret.On) {
1457 XDrawLine(DisplayHandle, Caret.Window, Caret.gc, Caret.X, Caret.Y, Caret.X, Caret.Y + Caret.Height);
1461 int NextTimeout (ArrayList timers, DateTime now) {
1464 foreach (Timer timer in timers) {
1465 int next = (int) (timer.Expires - now).TotalMilliseconds;
1467 return 0; // Have a timer that has already expired
1470 if (next < timeout) {
1474 if (timeout < Timer.Minimum) {
1475 timeout = Timer.Minimum;
1483 void CheckTimers (ArrayList timers, DateTime now) {
1486 count = timers.Count;
1491 for (int i = 0; i < timers.Count; i++) {
1494 timer = (Timer) timers [i];
1496 if (timer.Enabled && timer.Expires <= now && !timer.Busy) {
1498 // - Before MainForm.OnLoad if DoEvents () is called.
1499 // - After MainForm.OnLoad if not.
1502 (Application.MWFThread.Current.Context != null &&
1503 (Application.MWFThread.Current.Context.MainForm == null ||
1504 Application.MWFThread.Current.Context.MainForm.IsLoaded))) {
1514 void WaitForHwndMessage (Hwnd hwnd, Msg message) {
1515 WaitForHwndMessage (hwnd, message, false);
1519 void WaitForHwndMessage (Hwnd hwnd, Msg message, bool process) {
1520 MSG msg = new MSG ();
1523 queue = ThreadQueue(Thread.CurrentThread);
1525 queue.DispatchIdle = false;
1528 string key = hwnd.Handle + ":" + message;
1529 if (!messageHold.ContainsKey (key))
1530 messageHold.Add (key, 1);
1532 messageHold[key] = ((int)messageHold[key]) + 1;
1537 DebugHelper.WriteLine ("Waiting for message " + message + " on hwnd " + String.Format("0x{0:x}", hwnd.Handle.ToInt32 ()));
1538 DebugHelper.Indent ();
1540 if (PeekMessage(queue, ref msg, IntPtr.Zero, 0, 0, (uint)PeekMessageFlags.PM_REMOVE)) {
1541 if ((Msg)msg.message == Msg.WM_QUIT) {
1542 PostQuitMessage (0);
1547 DebugHelper.WriteLine ("PeekMessage got " + msg);
1549 if (msg.hwnd == hwnd.Handle) {
1550 if ((Msg)msg.message == message) {
1552 TranslateMessage (ref msg);
1553 DispatchMessage (ref msg);
1557 else if ((Msg)msg.message == Msg.WM_DESTROY)
1561 TranslateMessage (ref msg);
1562 DispatchMessage (ref msg);
1566 done = !messageHold.ContainsKey (key) || ((int)messageHold[key] < 1) || done;
1569 messageHold.Remove (key);
1571 DebugHelper.Unindent ();
1572 DebugHelper.WriteLine ("Finished waiting for " + key);
1574 queue.DispatchIdle = true;
1578 void MapWindow(Hwnd hwnd, WindowType windows) {
1580 Form f = Control.FromHandle(hwnd.Handle) as Form;
1582 if (f.WindowState == FormWindowState.Normal) {
1583 f.waiting_showwindow = true;
1584 SendMessage(hwnd.Handle, Msg.WM_SHOWWINDOW, (IntPtr)1, IntPtr.Zero);
1588 // it's possible that our Hwnd is no
1589 // longer valid after making that
1590 // SendMessage call, so check here.
1594 if ((windows & WindowType.Whole) != 0) {
1595 XMapWindow(DisplayHandle, hwnd.whole_window);
1597 if ((windows & WindowType.Client) != 0) {
1598 XMapWindow(DisplayHandle, hwnd.client_window);
1604 if (f.waiting_showwindow) {
1605 WaitForHwndMessage (hwnd, Msg.WM_SHOWWINDOW);
1606 CreateParams cp = f.GetCreateParams();
1607 if (!ExStyleSet (cp.ExStyle, WindowExStyles.WS_EX_MDICHILD) &&
1608 !StyleSet (cp.Style, WindowStyles.WS_CHILD)) {
1609 WaitForHwndMessage (hwnd, Msg.WM_ACTIVATE, true);
1616 void UnmapWindow(Hwnd hwnd, WindowType windows) {
1619 if (Control.FromHandle(hwnd.Handle) is Form) {
1620 f = Control.FromHandle(hwnd.Handle) as Form;
1621 if (f.WindowState == FormWindowState.Normal) {
1622 f.waiting_showwindow = true;
1623 SendMessage(hwnd.Handle, Msg.WM_SHOWWINDOW, IntPtr.Zero, IntPtr.Zero);
1627 // it's possible that our Hwnd is no
1628 // longer valid after making that
1629 // SendMessage call, so check here.
1630 // FIXME: it is likely wrong, as it has already sent WM_SHOWWINDOW
1634 if ((windows & WindowType.Client) != 0) {
1635 XUnmapWindow(DisplayHandle, hwnd.client_window);
1637 if ((windows & WindowType.Whole) != 0) {
1638 XUnmapWindow(DisplayHandle, hwnd.whole_window);
1641 hwnd.mapped = false;
1644 if (f.waiting_showwindow) {
1645 WaitForHwndMessage (hwnd, Msg.WM_SHOWWINDOW);
1646 CreateParams cp = f.GetCreateParams();
1647 if (!ExStyleSet (cp.ExStyle, WindowExStyles.WS_EX_MDICHILD) &&
1648 !StyleSet (cp.Style, WindowStyles.WS_CHILD)) {
1649 WaitForHwndMessage (hwnd, Msg.WM_ACTIVATE, true);
1656 void UpdateMessageQueue (XEventQueue queue) {
1657 UpdateMessageQueue(queue, true);
1660 void UpdateMessageQueue (XEventQueue queue, bool allowIdle) {
1665 now = DateTime.UtcNow;
1668 pending = XPending (DisplayHandle);
1671 if (pending == 0 && allowIdle) {
1672 if ((queue == null || queue.DispatchIdle) && Idle != null) {
1673 Idle (this, EventArgs.Empty);
1677 pending = XPending (DisplayHandle);
1684 if (queue != null) {
1685 if (queue.Paint.Count > 0)
1688 timeout = NextTimeout (queue.timer_list, now);
1693 int length = pollfds.Length - 1;
1694 lock (wake_waiting_lock) {
1695 if (wake_waiting == false) {
1697 wake_waiting = true;
1701 Syscall.poll (pollfds, (uint)length, timeout);
1702 // Clean out buffer, so we're not busy-looping on the same data
1703 if (length == pollfds.Length) {
1704 if (pollfds[1].revents != 0)
1705 wake_receive.Receive(network_buffer, 0, 1, SocketFlags.None);
1706 lock (wake_waiting_lock) {
1707 wake_waiting = false;
1712 pending = XPending (DisplayHandle);
1718 CheckTimers (queue.timer_list, now);
1721 XEvent xevent = new XEvent ();
1724 if (XPending (DisplayHandle) == 0)
1727 XNextEvent (DisplayHandle, ref xevent);
1729 if (xevent.AnyEvent.type == XEventName.KeyPress ||
1730 xevent.AnyEvent.type == XEventName.KeyRelease) {
1731 // PreFilter() handles "shift key state updates.
1732 Keyboard.PreFilter (xevent);
1733 if (XFilterEvent (ref xevent, Keyboard.ClientWindow)) {
1734 // probably here we could raise WM_IME_KEYDOWN and
1735 // WM_IME_KEYUP, but I'm not sure it is worthy.
1739 else if (XFilterEvent (ref xevent, IntPtr.Zero))
1743 hwnd = Hwnd.GetObjectFromWindow(xevent.AnyEvent.window);
1747 DebugHelper.WriteLine ("UpdateMessageQueue got Event: " + xevent.ToString ());
1749 switch (xevent.type) {
1750 case XEventName.Expose:
1751 AddExpose (hwnd, xevent.ExposeEvent.window == hwnd.ClientWindow, xevent.ExposeEvent.x, xevent.ExposeEvent.y, xevent.ExposeEvent.width, xevent.ExposeEvent.height);
1754 case XEventName.SelectionClear: {
1755 // Should we do something?
1759 case XEventName.SelectionRequest: {
1760 if (Dnd.HandleSelectionRequestEvent (ref xevent))
1764 sel_event = new XEvent();
1765 sel_event.SelectionEvent.type = XEventName.SelectionNotify;
1766 sel_event.SelectionEvent.send_event = true;
1767 sel_event.SelectionEvent.display = DisplayHandle;
1768 sel_event.SelectionEvent.selection = xevent.SelectionRequestEvent.selection;
1769 sel_event.SelectionEvent.target = xevent.SelectionRequestEvent.target;
1770 sel_event.SelectionEvent.requestor = xevent.SelectionRequestEvent.requestor;
1771 sel_event.SelectionEvent.time = xevent.SelectionRequestEvent.time;
1772 sel_event.SelectionEvent.property = IntPtr.Zero;
1774 IntPtr format_atom = xevent.SelectionRequestEvent.target;
1776 // Seems that some apps support asking for supported types
1777 if (format_atom == TARGETS) {
1784 if (Clipboard.IsSourceText) {
1785 atoms[atom_count++] = (int)Atom.XA_STRING;
1786 atoms[atom_count++] = (int)OEMTEXT;
1787 atoms[atom_count++] = (int)UTF8_STRING;
1788 atoms[atom_count++] = (int)UTF16_STRING;
1789 atoms[atom_count++] = (int)RICHTEXTFORMAT;
1790 } else if (Clipboard.IsSourceImage) {
1791 atoms[atom_count++] = (int)Atom.XA_PIXMAP;
1792 atoms[atom_count++] = (int)Atom.XA_BITMAP;
1794 // FIXME - handle other types
1797 XChangeProperty(DisplayHandle, xevent.SelectionRequestEvent.requestor, (IntPtr)xevent.SelectionRequestEvent.property,
1798 (IntPtr)xevent.SelectionRequestEvent.target, 32, PropertyMode.Replace, atoms, atom_count);
1799 sel_event.SelectionEvent.property = xevent.SelectionRequestEvent.property;
1800 } else if (format_atom == (IntPtr)RICHTEXTFORMAT) {
1801 string rtf_text = Clipboard.GetRtfText ();
1802 if (rtf_text != null) {
1803 // The RTF spec mentions that ascii is enough to contain it
1804 Byte [] bytes = Encoding.ASCII.GetBytes (rtf_text);
1805 int buflen = bytes.Length;
1806 IntPtr buffer = Marshal.AllocHGlobal (buflen);
1808 for (int i = 0; i < buflen; i++)
1809 Marshal.WriteByte (buffer, i, bytes[i]);
1811 XChangeProperty(DisplayHandle, xevent.SelectionRequestEvent.requestor, (IntPtr)xevent.SelectionRequestEvent.property,
1812 (IntPtr)xevent.SelectionRequestEvent.target, 8, PropertyMode.Replace, buffer, buflen);
1813 sel_event.SelectionEvent.property = xevent.SelectionRequestEvent.property;
1814 Marshal.FreeHGlobal(buffer);
1816 } else if (Clipboard.IsSourceText &&
1817 (format_atom == (IntPtr)Atom.XA_STRING
1818 || format_atom == OEMTEXT
1819 || format_atom == UTF16_STRING
1820 || format_atom == UTF8_STRING)) {
1821 IntPtr buffer = IntPtr.Zero;
1823 Encoding encoding = null;
1827 // Select an encoding depending on the target
1828 IntPtr target_atom = xevent.SelectionRequestEvent.target;
1829 if (target_atom == (IntPtr)Atom.XA_STRING || target_atom == OEMTEXT)
1830 // FIXME - EOMTEXT should encode into ISO2022
1831 encoding = Encoding.ASCII;
1832 else if (target_atom == UTF16_STRING)
1833 encoding = Encoding.Unicode;
1834 else if (target_atom == UTF8_STRING)
1835 encoding = Encoding.UTF8;
1839 bytes = encoding.GetBytes (Clipboard.GetPlainText ());
1840 buffer = Marshal.AllocHGlobal (bytes.Length);
1841 buflen = bytes.Length;
1843 for (int i = 0; i < buflen; i++)
1844 Marshal.WriteByte (buffer, i, bytes [i]);
1846 if (buffer != IntPtr.Zero) {
1847 XChangeProperty(DisplayHandle, xevent.SelectionRequestEvent.requestor, (IntPtr)xevent.SelectionRequestEvent.property, (IntPtr)xevent.SelectionRequestEvent.target, 8, PropertyMode.Replace, buffer, buflen);
1848 sel_event.SelectionEvent.property = xevent.SelectionRequestEvent.property;
1849 Marshal.FreeHGlobal(buffer);
1851 } else if (Clipboard.GetSource (format_atom.ToInt32 ()) != null) { // check if we have an available value of this format
1852 if (DataFormats.GetFormat (format_atom.ToInt32 ()).is_serializable) {
1853 object serializable = Clipboard.GetSource (format_atom.ToInt32 ());
1855 BinaryFormatter formatter = new BinaryFormatter ();
1856 MemoryStream memory_stream = new MemoryStream ();
1857 formatter.Serialize (memory_stream, serializable);
1859 int buflen = (int)memory_stream.Length;
1860 IntPtr buffer = Marshal.AllocHGlobal (buflen);
1861 memory_stream.Position = 0;
1862 for (int i = 0; i < buflen; i++)
1863 Marshal.WriteByte (buffer, i, (byte)memory_stream.ReadByte ());
1864 memory_stream.Close ();
1866 XChangeProperty (DisplayHandle, xevent.SelectionRequestEvent.requestor, (IntPtr)xevent.SelectionRequestEvent.property, (IntPtr)xevent.SelectionRequestEvent.target,
1867 8, PropertyMode.Replace, buffer, buflen);
1868 sel_event.SelectionEvent.property = xevent.SelectionRequestEvent.property;
1869 Marshal.FreeHGlobal (buffer);
1872 } else if (Clipboard.IsSourceImage) {
1873 if (xevent.SelectionEvent.target == (IntPtr)Atom.XA_PIXMAP) {
1874 // FIXME - convert image and store as property
1875 } else if (xevent.SelectionEvent.target == (IntPtr)Atom.XA_PIXMAP) {
1876 // FIXME - convert image and store as property
1880 XSendEvent(DisplayHandle, xevent.SelectionRequestEvent.requestor, false, new IntPtr ((int)EventMask.NoEventMask), ref sel_event);
1884 case XEventName.SelectionNotify: {
1885 if (Clipboard.Enumerating) {
1886 Clipboard.Enumerating = false;
1887 if (xevent.SelectionEvent.property != IntPtr.Zero) {
1888 XDeleteProperty(DisplayHandle, FosterParent, (IntPtr)xevent.SelectionEvent.property);
1889 if (!Clipboard.Formats.Contains(xevent.SelectionEvent.property)) {
1890 Clipboard.Formats.Add(xevent.SelectionEvent.property);
1891 DriverDebug("Got supported clipboard atom format: {0}", xevent.SelectionEvent.property);
1894 } else if (Clipboard.Retrieving) {
1895 Clipboard.Retrieving = false;
1896 if (xevent.SelectionEvent.property != IntPtr.Zero) {
1897 TranslatePropertyToClipboard(xevent.SelectionEvent.property);
1899 Clipboard.ClearSources ();
1900 Clipboard.Item = null;
1903 Dnd.HandleSelectionNotifyEvent (ref xevent);
1908 case XEventName.KeyRelease:
1909 if (!detectable_key_auto_repeat && XPending (DisplayHandle) != 0) {
1910 XEvent nextevent = new XEvent ();
1912 XPeekEvent (DisplayHandle, ref nextevent);
1914 if (nextevent.type == XEventName.KeyPress &&
1915 nextevent.KeyEvent.keycode == xevent.KeyEvent.keycode &&
1916 nextevent.KeyEvent.time == xevent.KeyEvent.time) {
1920 goto case XEventName.KeyPress;
1922 case XEventName.MotionNotify: {
1925 /* we can't do motion compression across threads, so just punt if we don't match up */
1926 if (Thread.CurrentThread == hwnd.Queue.Thread && hwnd.Queue.Count > 0) {
1927 peek = hwnd.Queue.Peek();
1928 if (peek.AnyEvent.type == XEventName.MotionNotify) {
1932 goto case XEventName.KeyPress;
1935 case XEventName.KeyPress:
1936 hwnd.Queue.EnqueueLocked (xevent);
1937 /* Process KeyPresses immediately. Otherwise multiple Compose messages as a result of a
1938 * single physical keypress are not processed correctly */
1940 case XEventName.ButtonPress:
1941 case XEventName.ButtonRelease:
1942 case XEventName.EnterNotify:
1943 case XEventName.LeaveNotify:
1944 case XEventName.CreateNotify:
1945 case XEventName.DestroyNotify:
1946 case XEventName.FocusIn:
1947 case XEventName.FocusOut:
1948 case XEventName.ClientMessage:
1949 case XEventName.ReparentNotify:
1950 case XEventName.MapNotify:
1951 case XEventName.UnmapNotify:
1952 hwnd.Queue.EnqueueLocked (xevent);
1955 case XEventName.ConfigureNotify:
1956 AddConfigureNotify(xevent);
1959 case XEventName.PropertyNotify:
1960 DriverDebug ("UpdateMessageQueue (), got Event: {0}", xevent.ToString ());
1961 if (xevent.PropertyEvent.atom == _NET_ACTIVE_WINDOW) {
1966 IntPtr prop = IntPtr.Zero;
1969 prev_active = ActiveWindow;
1970 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);
1971 if (((long)nitems > 0) && (prop != IntPtr.Zero)) {
1972 ActiveWindow = Hwnd.GetHandleFromWindow((IntPtr)Marshal.ReadInt32(prop));
1975 DebugHelper.WriteLine ("PropertyNotify: _NET_ACTIVE_WINDOW: previous = 0x{0:x}, new = 0x{1:x}", prev_active.ToInt32 (), ActiveWindow.ToInt32 ());
1977 if (prev_active != ActiveWindow) {
1978 if (prev_active != IntPtr.Zero) {
1979 PostMessage(prev_active, Msg.WM_ACTIVATE, (IntPtr)WindowActiveFlags.WA_INACTIVE, IntPtr.Zero);
1981 if (ActiveWindow != IntPtr.Zero) {
1982 PostMessage(ActiveWindow, Msg.WM_ACTIVATE, (IntPtr)WindowActiveFlags.WA_ACTIVE, IntPtr.Zero);
1985 if (ModalWindows.Count == 0) {
1988 // Modality Handling
1990 // If there is a modal window on the stack and the new active
1991 // window is MWF window, but not the modal one and not a non-modal
1992 // child of the modal one, switch back to the modal window.
1994 // To identify if a non-modal form is child of a modal form
1995 // we match their ApplicationContexts, which will be the same.
1996 // This is because each modal form runs the loop with a
1997 // new ApplicationContext, which is inherited by the non-modal
2000 Form activeForm = Control.FromHandle (ActiveWindow) as Form;
2001 if (activeForm != null) {
2002 Form modalForm = Control.FromHandle ((IntPtr)ModalWindows.Peek()) as Form;
2003 if (ActiveWindow != (IntPtr)ModalWindows.Peek() &&
2004 (modalForm == null || activeForm.context == modalForm.context)) {
2005 Activate((IntPtr)ModalWindows.Peek());
2012 else if (xevent.PropertyEvent.atom == _NET_WM_STATE) {
2013 // invalidate our cache - we'll query again the next time someone does GetWindowState.
2014 hwnd.cached_window_state = (FormWindowState)(-1);
2015 PostMessage (hwnd.Handle, Msg.WM_WINDOWPOSCHANGED, IntPtr.Zero, IntPtr.Zero);
2023 IntPtr GetMousewParam(int Delta) {
2026 if ((MouseState & MouseButtons.Left) != 0) {
2027 result |= (int)MsgButtons.MK_LBUTTON;
2030 if ((MouseState & MouseButtons.Middle) != 0) {
2031 result |= (int)MsgButtons.MK_MBUTTON;
2034 if ((MouseState & MouseButtons.Right) != 0) {
2035 result |= (int)MsgButtons.MK_RBUTTON;
2038 Keys mods = ModifierKeys;
2039 if ((mods & Keys.Control) != 0) {
2040 result |= (int)MsgButtons.MK_CONTROL;
2043 if ((mods & Keys.Shift) != 0) {
2044 result |= (int)MsgButtons.MK_SHIFT;
2047 result |= Delta << 16;
2049 return (IntPtr)result;
2051 IntPtr XGetParent(IntPtr handle) {
2058 XQueryTree(DisplayHandle, handle, out Root, out Parent, out Children, out ChildCount);
2061 if (Children!=IntPtr.Zero) {
2069 int HandleError (IntPtr display, ref XErrorEvent error_event)
2071 // we need to workaround a problem with the
2072 // ordering of destruction of Drawables and
2073 // Pictures that exists between cairo and
2074 // RENDER on the server.
2075 if (error_event.request_code == (XRequest)render_major_opcode
2076 && error_event.minor_code == 7 /* X_RenderFreePicture from render.h */
2077 && error_event.error_code == render_first_error + 1 /* BadPicture from render.h */) {
2081 if (ErrorExceptions) {
2082 XUngrabPointer (display, IntPtr.Zero);
2083 throw new XException (error_event.display, error_event.resourceid,
2084 error_event.serial, error_event.error_code,
2085 error_event.request_code, error_event.minor_code);
2087 Console.WriteLine("X11 Error encountered: {0}{1}\n",
2088 XException.GetMessage (error_event.display, error_event.resourceid,
2089 error_event.serial, error_event.error_code,
2090 error_event.request_code, error_event.minor_code),
2091 Environment.StackTrace);
2096 void AccumulateDestroyedHandles (Control c, ArrayList list)
2098 DebugHelper.Enter ();
2101 Control[] controls = c.Controls.GetAllControls ();
2103 DebugHelper.WriteLine ("Checking control:0x{0:x}", c.IsHandleCreated ? c.Handle.ToInt32() : 0);
2105 if (c.IsHandleCreated && !c.IsDisposed) {
2106 Hwnd hwnd = Hwnd.ObjectFromHandle(c.Handle);
2108 DriverDebug (" + adding {0} to the list of zombie windows", XplatUI.Window (hwnd.Handle));
2109 DriverDebug (" + parent X window is {0:X}", XGetParent (hwnd.whole_window).ToInt32());
2112 CleanupCachedWindows (hwnd);
2115 for (int i = 0; i < controls.Length; i ++) {
2116 AccumulateDestroyedHandles (controls[i], list);
2119 DebugHelper.Leave ();
2122 void CleanupCachedWindows (Hwnd hwnd)
2124 if (ActiveWindow == hwnd.Handle) {
2125 SendMessage(hwnd.client_window, Msg.WM_ACTIVATE, (IntPtr)WindowActiveFlags.WA_INACTIVE, IntPtr.Zero);
2126 ActiveWindow = IntPtr.Zero;
2129 if (FocusWindow == hwnd.Handle) {
2130 SendMessage(hwnd.client_window, Msg.WM_KILLFOCUS, IntPtr.Zero, IntPtr.Zero);
2131 FocusWindow = IntPtr.Zero;
2134 if (Grab.Hwnd == hwnd.Handle) {
2135 Grab.Hwnd = IntPtr.Zero;
2136 Grab.Confined = false;
2139 DestroyCaret (hwnd.Handle);
2142 void PerformNCCalc(Hwnd hwnd) {
2143 XplatUIWin32.NCCALCSIZE_PARAMS ncp;
2147 rect = new Rectangle (0, 0, hwnd.Width, hwnd.Height);
2149 ncp = new XplatUIWin32.NCCALCSIZE_PARAMS();
2150 ptr = Marshal.AllocHGlobal(Marshal.SizeOf(ncp));
2152 ncp.rgrc1.left = rect.Left;
2153 ncp.rgrc1.top = rect.Top;
2154 ncp.rgrc1.right = rect.Right;
2155 ncp.rgrc1.bottom = rect.Bottom;
2157 Marshal.StructureToPtr(ncp, ptr, true);
2158 NativeWindow.WndProc(hwnd.client_window, Msg.WM_NCCALCSIZE, (IntPtr)1, ptr);
2159 ncp = (XplatUIWin32.NCCALCSIZE_PARAMS)Marshal.PtrToStructure(ptr, typeof(XplatUIWin32.NCCALCSIZE_PARAMS));
2160 Marshal.FreeHGlobal(ptr);
2163 rect = new Rectangle(ncp.rgrc1.left, ncp.rgrc1.top, ncp.rgrc1.right - ncp.rgrc1.left, ncp.rgrc1.bottom - ncp.rgrc1.top);
2164 hwnd.ClientRect = rect;
2166 rect = TranslateClientRectangleToXClientRectangle (hwnd);
2169 MoveResizeWindow (DisplayHandle, hwnd.client_window, rect.X, rect.Y, rect.Width, rect.Height);
2172 AddExpose (hwnd, hwnd.WholeWindow == hwnd.ClientWindow, 0, 0, hwnd.Width, hwnd.Height);
2174 #endregion // Methods
2177 void MouseHover(object sender, EventArgs e) {
2181 HoverState.Timer.Enabled = false;
2183 if (HoverState.Window != IntPtr.Zero) {
2184 hwnd = Hwnd.GetObjectFromWindow(HoverState.Window);
2186 xevent = new XEvent ();
2188 xevent.type = XEventName.ClientMessage;
2189 xevent.ClientMessageEvent.display = DisplayHandle;
2190 xevent.ClientMessageEvent.window = HoverState.Window;
2191 xevent.ClientMessageEvent.message_type = HoverState.Atom;
2192 xevent.ClientMessageEvent.format = 32;
2193 xevent.ClientMessageEvent.ptr1 = (IntPtr) (HoverState.Y << 16 | HoverState.X);
2195 hwnd.Queue.EnqueueLocked (xevent);
2202 void CaretCallback(object sender, EventArgs e) {
2206 Caret.On = !Caret.On;
2208 XDrawLine(DisplayHandle, Caret.Hwnd, Caret.gc, Caret.X, Caret.Y, Caret.X, Caret.Y + Caret.Height);
2210 #endregion // Callbacks
2212 #region Public Properties
2214 internal override int CaptionHeight {
2220 internal override Size CursorSize {
2225 if (XQueryBestCursor(DisplayHandle, RootWindow, 32, 32, out x, out y) != 0) {
2226 return new Size(x, y);
2228 return new Size(16, 16);
2233 internal override bool DragFullWindows {
2239 internal override Size DragSize {
2241 return new Size(4, 4);
2245 internal override Size FrameBorderSize {
2247 return new Size (4, 4);
2251 internal override Size IconSize {
2257 if (XGetIconSizes(DisplayHandle, RootWindow, out list, out count) != 0) {
2261 current = (long)list;
2264 size = new XIconSize();
2266 for (int i = 0; i < count; i++) {
2267 size = (XIconSize)Marshal.PtrToStructure((IntPtr)current, size.GetType());
2268 current += Marshal.SizeOf(size);
2270 // Look for our preferred size
2271 if (size.min_width == 32) {
2273 return new Size(32, 32);
2276 if (size.max_width == 32) {
2278 return new Size(32, 32);
2281 if (size.min_width < 32 && size.max_width > 32) {
2284 // check if we can fit one
2286 while (x < size.max_width) {
2287 x += size.width_inc;
2290 return new Size(32, 32);
2295 if (largest < size.max_width) {
2296 largest = size.max_width;
2300 // We didn't find a match or we wouldn't be here
2301 return new Size(largest, largest);
2304 return new Size(32, 32);
2309 internal override int KeyboardSpeed {
2312 // A lot harder: need to do:
2313 // XkbQueryExtension(0x08051008, 0xbfffdf4c, 0xbfffdf50, 0xbfffdf54, 0xbfffdf58) = 1
2314 // XkbAllocKeyboard(0x08051008, 0xbfffdf4c, 0xbfffdf50, 0xbfffdf54, 0xbfffdf58) = 0x080517a8
2315 // XkbGetControls(0x08051008, 1, 0x080517a8, 0xbfffdf54, 0xbfffdf58) = 0
2317 // And from that we can tell the repetition rate
2319 // Notice, the values must map to:
2320 // [0, 31] which maps to 2.5 to 30 repetitions per second.
2326 internal override int KeyboardDelay {
2329 // Return values must range from 0 to 4, 0 meaning 250ms,
2330 // and 4 meaning 1000 ms.
2332 return 1; // ie, 500 ms
2336 internal override Size MaxWindowTrackSize {
2338 return new Size (WorkingArea.Width, WorkingArea.Height);
2342 internal override bool MenuAccessKeysUnderlined {
2348 internal override Size MinimizedWindowSpacingSize {
2350 return new Size(1, 1);
2354 internal override Size MinimumWindowSize {
2356 return new Size(110, 22);
2360 internal override Size MinimumFixedToolWindowSize {
2361 get { return new Size (27, 22); }
2364 internal override Size MinimumSizeableToolWindowSize {
2365 get { return new Size (37, 22); }
2368 internal override Size MinimumNoBorderWindowSize {
2369 get { return new Size (2, 2); }
2372 internal override Keys ModifierKeys {
2374 return Keyboard.ModifierKeys;
2378 internal override Size SmallIconSize {
2384 if (XGetIconSizes(DisplayHandle, RootWindow, out list, out count) != 0) {
2388 current = (long)list;
2391 size = new XIconSize();
2393 for (int i = 0; i < count; i++) {
2394 size = (XIconSize)Marshal.PtrToStructure((IntPtr)current, size.GetType());
2395 current += Marshal.SizeOf(size);
2397 // Look for our preferred size
2398 if (size.min_width == 16) {
2400 return new Size(16, 16);
2403 if (size.max_width == 16) {
2405 return new Size(16, 16);
2408 if (size.min_width < 16 && size.max_width > 16) {
2411 // check if we can fit one
2413 while (x < size.max_width) {
2414 x += size.width_inc;
2417 return new Size(16, 16);
2422 if (smallest == 0 || smallest > size.min_width) {
2423 smallest = size.min_width;
2427 // We didn't find a match or we wouldn't be here
2428 return new Size(smallest, smallest);
2431 return new Size(16, 16);
2436 internal override int MouseButtonCount {
2442 internal override bool MouseButtonsSwapped {
2444 return false; // FIXME - how to detect?
2448 internal override Point MousePosition {
2450 return mouse_position;
2454 internal override Size MouseHoverSize {
2456 return new Size (1, 1);
2460 internal override int MouseHoverTime {
2462 return HoverState.Interval;
2468 internal override bool MouseWheelPresent {
2470 return true; // FIXME - how to detect?
2474 internal override MouseButtons MouseButtons {
2480 internal override Rectangle VirtualScreen {
2486 IntPtr prop = IntPtr.Zero;
2490 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);
2491 if ((long)nitems < 2)
2494 width = Marshal.ReadIntPtr(prop, 0).ToInt32();
2495 height = Marshal.ReadIntPtr(prop, IntPtr.Size).ToInt32();
2499 return new Rectangle(0, 0, 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 Rectangle WorkingArea {
2518 IntPtr prop = IntPtr.Zero;
2521 int current_desktop;
2525 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);
2526 if ((long)nitems < 1) {
2530 current_desktop = Marshal.ReadIntPtr(prop, 0).ToInt32();
2533 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);
2534 if ((long)nitems < 4 * (current_desktop + 1)) {
2538 x = Marshal.ReadIntPtr(prop, IntPtr.Size * 4 * current_desktop).ToInt32();
2539 y = Marshal.ReadIntPtr(prop, IntPtr.Size * 4 * current_desktop + IntPtr.Size).ToInt32();
2540 width = Marshal.ReadIntPtr(prop, IntPtr.Size * 4 * current_desktop + IntPtr.Size * 2).ToInt32();
2541 height = Marshal.ReadIntPtr(prop, IntPtr.Size * 4 * current_desktop + IntPtr.Size * 3).ToInt32();
2544 return new Rectangle(x, y, width, height);
2547 XWindowAttributes attributes=new XWindowAttributes();
2550 XGetWindowAttributes(DisplayHandle, XRootWindow(DisplayHandle, 0), ref attributes);
2553 return new Rectangle(0, 0, attributes.width, attributes.height);
2557 internal override bool ThemesEnabled {
2559 return XplatUIX11.themes_enabled;
2564 #endregion // Public properties
2566 #region Public Static Methods
2567 internal override void RaiseIdle (EventArgs e)
2573 internal override IntPtr InitializeDriver()
2576 if (DisplayHandle==IntPtr.Zero) {
2577 SetDisplay(XOpenDisplay(IntPtr.Zero));
2583 internal override void ShutdownDriver(IntPtr token)
2586 if (DisplayHandle!=IntPtr.Zero) {
2587 XCloseDisplay(DisplayHandle);
2588 DisplayHandle=IntPtr.Zero;
2593 internal override void EnableThemes()
2595 themes_enabled = true;
2599 internal override void Activate(IntPtr handle)
2603 hwnd = Hwnd.ObjectFromHandle(handle);
2607 if (true /* the window manager supports NET_ACTIVE_WINDOW */) {
2608 SendNetWMMessage(hwnd.whole_window, _NET_ACTIVE_WINDOW, (IntPtr)1, IntPtr.Zero, IntPtr.Zero);
2609 XEventQueue q = null;
2610 lock (unattached_timer_list) {
2611 foreach (Timer t in unattached_timer_list) {
2613 q= (XEventQueue) MessageQueues [Thread.CurrentThread];
2614 t.thread = q.Thread;
2615 q.timer_list.Add (t);
2617 unattached_timer_list.Clear ();
2621 // XRaiseWindow(DisplayHandle, handle);
2627 internal override void AudibleAlert(AlertType alert)
2629 XBell(DisplayHandle, 0);
2634 internal override void CaretVisible(IntPtr handle, bool visible)
2636 if (Caret.Hwnd == handle) {
2638 if (!Caret.Visible) {
2639 Caret.Visible = true;
2641 Caret.Timer.Start();
2644 Caret.Visible = false;
2651 internal override bool CalculateWindowRect(ref Rectangle ClientRect, CreateParams cp, Menu menu, out Rectangle WindowRect)
2653 WindowRect = Hwnd.GetWindowRectangle (cp, menu, ClientRect);
2657 internal override void ClientToScreen(IntPtr handle, ref int x, ref int y)
2664 hwnd = Hwnd.ObjectFromHandle(handle);
2667 XTranslateCoordinates(DisplayHandle, hwnd.client_window, RootWindow, x, y, out dest_x_return, out dest_y_return, out child);
2674 internal override int[] ClipboardAvailableFormats(IntPtr handle)
2676 DataFormats.Format f;
2679 f = DataFormats.Format.List;
2681 if (XGetSelectionOwner(DisplayHandle, CLIPBOARD) == IntPtr.Zero) {
2685 Clipboard.Formats = new ArrayList();
2688 XConvertSelection(DisplayHandle, CLIPBOARD, (IntPtr)f.Id, (IntPtr)f.Id, FosterParent, IntPtr.Zero);
2690 Clipboard.Enumerating = true;
2691 while (Clipboard.Enumerating) {
2692 UpdateMessageQueue(null, false);
2697 result = new int[Clipboard.Formats.Count];
2699 for (int i = 0; i < Clipboard.Formats.Count; i++) {
2700 result[i] = ((IntPtr)Clipboard.Formats[i]).ToInt32 ();
2703 Clipboard.Formats = null;
2707 internal override void ClipboardClose(IntPtr handle)
2709 if (handle != ClipMagic) {
2710 throw new ArgumentException("handle is not a valid clipboard handle");
2715 internal override int ClipboardGetID(IntPtr handle, string format)
2717 if (handle != ClipMagic) {
2718 throw new ArgumentException("handle is not a valid clipboard handle");
2721 if (format == "Text" ) return (int)Atom.XA_STRING;
2722 else if (format == "Bitmap" ) return (int)Atom.XA_BITMAP;
2723 //else if (format == "MetaFilePict" ) return 3;
2724 //else if (format == "SymbolicLink" ) return 4;
2725 //else if (format == "DataInterchangeFormat" ) return 5;
2726 //else if (format == "Tiff" ) return 6;
2727 else if (format == "OEMText" ) return OEMTEXT.ToInt32();
2728 else if (format == "DeviceIndependentBitmap" ) return (int)Atom.XA_PIXMAP;
2729 else if (format == "Palette" ) return (int)Atom.XA_COLORMAP; // Useless
2730 //else if (format == "PenData" ) return 10;
2731 //else if (format == "RiffAudio" ) return 11;
2732 //else if (format == "WaveAudio" ) return 12;
2733 else if (format == "UnicodeText" ) return UTF16_STRING.ToInt32();
2734 //else if (format == "EnhancedMetafile" ) return 14;
2735 //else if (format == "FileDrop" ) return 15;
2736 //else if (format == "Locale" ) return 16;
2737 else if (format == "Rich Text Format") return RICHTEXTFORMAT.ToInt32 ();
2739 return XInternAtom(DisplayHandle, format, false).ToInt32();
2742 internal override IntPtr ClipboardOpen(bool primary_selection)
2744 if (!primary_selection)
2745 ClipMagic = CLIPBOARD;
2747 ClipMagic = PRIMARY;
2751 internal override object ClipboardRetrieve(IntPtr handle, int type, XplatUI.ClipboardToObject converter)
2753 XConvertSelection(DisplayHandle, handle, (IntPtr)type, (IntPtr)type, FosterParent, IntPtr.Zero);
2755 Clipboard.Retrieving = true;
2756 while (Clipboard.Retrieving) {
2757 UpdateMessageQueue(null, false);
2760 return Clipboard.Item;
2763 internal override void ClipboardStore(IntPtr handle, object obj, int type, XplatUI.ObjectToClipboard converter)
2765 Clipboard.Converter = converter;
2768 Clipboard.AddSource (type, obj);
2769 XSetSelectionOwner(DisplayHandle, CLIPBOARD, FosterParent, IntPtr.Zero);
2771 // Clearing the selection
2772 Clipboard.ClearSources ();
2773 XSetSelectionOwner(DisplayHandle, CLIPBOARD, IntPtr.Zero, IntPtr.Zero);
2777 internal override void CreateCaret (IntPtr handle, int width, int height)
2779 XGCValues gc_values;
2782 hwnd = Hwnd.ObjectFromHandle(handle);
2784 if (Caret.Hwnd != IntPtr.Zero) {
2785 DestroyCaret(Caret.Hwnd);
2788 Caret.Hwnd = handle;
2789 Caret.Window = hwnd.client_window;
2790 Caret.Width = width;
2791 Caret.Height = height;
2792 Caret.Visible = false;
2795 gc_values = new XGCValues();
2796 gc_values.line_width = width;
2798 Caret.gc = XCreateGC(DisplayHandle, Caret.Window, new IntPtr ((int)GCFunction.GCLineWidth), ref gc_values);
2799 if (Caret.gc == IntPtr.Zero) {
2800 Caret.Hwnd = IntPtr.Zero;
2804 XSetFunction(DisplayHandle, Caret.gc, GXFunction.GXinvert);
2807 internal override IntPtr CreateWindow (CreateParams cp)
2809 XSetWindowAttributes Attributes;
2811 Hwnd parent_hwnd = null;
2816 IntPtr ParentHandle;
2818 IntPtr ClientWindow;
2819 SetWindowValuemask ValueMask;
2824 Attributes = new XSetWindowAttributes();
2830 if (Width<1) Width=1;
2831 if (Height<1) Height=1;
2833 if (cp.Parent != IntPtr.Zero) {
2834 parent_hwnd = Hwnd.ObjectFromHandle(cp.Parent);
2835 ParentHandle = parent_hwnd.client_window;
2837 if (StyleSet (cp.Style, WindowStyles.WS_CHILD)) {
2838 // We need to use our foster parent window until this poor child gets it's parent assigned
2839 ParentHandle=FosterParent;
2841 ParentHandle=RootWindow;
2845 // Set the default location location for forms.
2847 if (cp.control is Form) {
2848 next = Hwnd.GetNextStackedFormLocation (cp, parent_hwnd);
2852 ValueMask = SetWindowValuemask.BitGravity | SetWindowValuemask.WinGravity;
2854 Attributes.bit_gravity = Gravity.NorthWestGravity;
2855 Attributes.win_gravity = Gravity.NorthWestGravity;
2857 // Save what's under the toolwindow
2858 if (ExStyleSet (cp.ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
2859 Attributes.save_under = true;
2860 ValueMask |= SetWindowValuemask.SaveUnder;
2864 // If we're a popup without caption we override the WM
2865 if (StyleSet (cp.Style, WindowStyles.WS_POPUP) && !StyleSet (cp.Style, WindowStyles.WS_CAPTION)) {
2866 Attributes.override_redirect = true;
2867 ValueMask |= SetWindowValuemask.OverrideRedirect;
2873 hwnd.height = Height;
2874 hwnd.parent = Hwnd.ObjectFromHandle(cp.Parent);
2875 hwnd.initial_style = cp.WindowStyle;
2876 hwnd.initial_ex_style = cp.WindowExStyle;
2878 if (StyleSet (cp.Style, WindowStyles.WS_DISABLED)) {
2879 hwnd.enabled = false;
2882 ClientWindow = IntPtr.Zero;
2884 Size XWindowSize = TranslateWindowSizeToXWindowSize (cp);
2885 Rectangle XClientRect = TranslateClientRectangleToXClientRectangle (hwnd, cp.control);
2888 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);
2889 if (WholeWindow != IntPtr.Zero) {
2890 ValueMask &= ~(SetWindowValuemask.OverrideRedirect | SetWindowValuemask.SaveUnder);
2892 if (CustomVisual != IntPtr.Zero && CustomColormap != IntPtr.Zero) {
2893 ValueMask = SetWindowValuemask.ColorMap;
2894 Attributes.colormap = CustomColormap;
2896 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);
2900 if ((WholeWindow == IntPtr.Zero) || (ClientWindow == IntPtr.Zero)) {
2901 throw new Exception("Could not create X11 windows");
2904 hwnd.Queue = ThreadQueue(Thread.CurrentThread);
2905 hwnd.WholeWindow = WholeWindow;
2906 hwnd.ClientWindow = ClientWindow;
2908 DriverDebug("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);
2910 if (!StyleSet (cp.Style, WindowStyles.WS_CHILD)) {
2911 if ((X != unchecked((int)0x80000000)) && (Y != unchecked((int)0x80000000))) {
2914 hints = new XSizeHints();
2917 hints.flags = (IntPtr)(XSizeHintsFlags.USPosition | XSizeHintsFlags.PPosition);
2918 XSetWMNormalHints(DisplayHandle, WholeWindow, ref hints);
2923 XSelectInput(DisplayHandle, hwnd.whole_window, new IntPtr ((int)(SelectInputMask | EventMask.StructureNotifyMask | EventMask.PropertyChangeMask | Keyboard.KeyEventMask)));
2924 if (hwnd.whole_window != hwnd.client_window)
2925 XSelectInput(DisplayHandle, hwnd.client_window, new IntPtr ((int)(SelectInputMask | EventMask.StructureNotifyMask | Keyboard.KeyEventMask)));
2928 if (ExStyleSet (cp.ExStyle, WindowExStyles.WS_EX_TOPMOST)) {
2930 atoms[0] = _NET_WM_WINDOW_TYPE_NORMAL.ToInt32();
2931 XChangeProperty(DisplayHandle, hwnd.whole_window, _NET_WM_WINDOW_TYPE, (IntPtr)Atom.XA_ATOM, 32, PropertyMode.Replace, atoms, 1);
2933 XSetTransientForHint (DisplayHandle, hwnd.whole_window, RootWindow);
2936 SetWMStyles(hwnd, cp);
2938 // set the group leader
2939 XWMHints wm_hints = new XWMHints ();
2941 wm_hints.flags = (IntPtr)(XWMHintsFlags.InputHint | XWMHintsFlags.StateHint | XWMHintsFlags.WindowGroupHint);
2942 wm_hints.input = !StyleSet (cp.Style, WindowStyles.WS_DISABLED);
2943 wm_hints.initial_state = StyleSet (cp.Style, WindowStyles.WS_MINIMIZE) ? XInitialState.IconicState : XInitialState.NormalState;
2945 if (ParentHandle != RootWindow) {
2946 wm_hints.window_group = hwnd.whole_window;
2948 wm_hints.window_group = ParentHandle;
2952 XSetWMHints(DisplayHandle, hwnd.whole_window, ref wm_hints );
2955 if (StyleSet (cp.Style, WindowStyles.WS_MINIMIZE)) {
2956 SetWindowState(hwnd.Handle, FormWindowState.Minimized);
2957 } else if (StyleSet (cp.Style, WindowStyles.WS_MAXIMIZE)) {
2958 SetWindowState(hwnd.Handle, FormWindowState.Maximized);
2961 // for now make all windows dnd enabled
2962 Dnd.SetAllowDrop (hwnd, true);
2964 // Set caption/window title
2965 Text(hwnd.Handle, cp.Caption);
2967 SendMessage (hwnd.Handle, Msg.WM_CREATE, (IntPtr)1, IntPtr.Zero /* XXX unused */);
2968 SendParentNotify (hwnd.Handle, Msg.WM_CREATE, int.MaxValue, int.MaxValue);
2970 if (StyleSet (cp.Style, WindowStyles.WS_VISIBLE)) {
2971 hwnd.visible = true;
2972 MapWindow(hwnd, WindowType.Both);
2973 if (!(Control.FromHandle(hwnd.Handle) is Form))
2974 SendMessage(hwnd.Handle, Msg.WM_SHOWWINDOW, (IntPtr)1, IntPtr.Zero);
2980 internal override IntPtr CreateWindow(IntPtr Parent, int X, int Y, int Width, int Height)
2982 CreateParams create_params = new CreateParams();
2984 create_params.Caption = "";
2985 create_params.X = X;
2986 create_params.Y = Y;
2987 create_params.Width = Width;
2988 create_params.Height = Height;
2990 create_params.ClassName=XplatUI.GetDefaultClassName (GetType ());
2991 create_params.ClassStyle = 0;
2992 create_params.ExStyle=0;
2993 create_params.Parent=IntPtr.Zero;
2994 create_params.Param=0;
2996 return CreateWindow(create_params);
2999 internal override IntPtr DefineCursor(Bitmap bitmap, Bitmap mask, Color cursor_pixel, Color mask_pixel, int xHotSpot, int yHotSpot)
3002 Bitmap cursor_bitmap;
3010 IntPtr cursor_pixmap;
3017 if (XQueryBestCursor(DisplayHandle, RootWindow, bitmap.Width, bitmap.Height, out width, out height) == 0) {
3021 // Win32 only allows creation cursors of a certain size
3022 if ((bitmap.Width != width) || (bitmap.Width != height)) {
3023 cursor_bitmap = new Bitmap(bitmap, new Size(width, height));
3024 cursor_mask = new Bitmap(mask, new Size(width, height));
3026 cursor_bitmap = bitmap;
3030 width = cursor_bitmap.Width;
3031 height = cursor_bitmap.Height;
3033 cursor_bits = new Byte[(width / 8) * height];
3034 mask_bits = new Byte[(width / 8) * height];
3036 for (int y = 0; y < height; y++) {
3037 for (int x = 0; x < width; x++) {
3038 c_pixel = cursor_bitmap.GetPixel(x, y);
3039 m_pixel = cursor_mask.GetPixel(x, y);
3041 and = c_pixel == cursor_pixel;
3042 xor = m_pixel == mask_pixel;
3046 // cursor_bits[y * width / 8 + x / 8] &= (byte)~((1 << (x % 8))); // The bit already is 0
3047 mask_bits[y * width / 8 + x / 8] |= (byte)(1 << (x % 8));
3048 } else if (and && !xor) {
3050 cursor_bits[y * width / 8 + x / 8] |= (byte)(1 << (x % 8));
3051 mask_bits[y * width / 8 + x / 8] |= (byte)(1 << (x % 8));
3053 } else if (and && !xor) {
3055 } else if (and && xor) {
3058 // X11 doesn't know the 'reverse screen' concept, so we'll treat them the same
3059 // we want both to be 0 so nothing to be done
3060 //cursor_bits[y * width / 8 + x / 8] &= (byte)~((1 << (x % 8)));
3061 //mask_bits[y * width / 8 + x / 8] |= (byte)(01 << (x % 8));
3067 cursor_pixmap = XCreatePixmapFromBitmapData(DisplayHandle, RootWindow, cursor_bits, width, height, (IntPtr)1, (IntPtr)0, 1);
3068 mask_pixmap = XCreatePixmapFromBitmapData(DisplayHandle, RootWindow, mask_bits, width, height, (IntPtr)1, (IntPtr)0, 1);
3072 fg.pixel = XWhitePixel(DisplayHandle, ScreenNo);
3073 fg.red = (ushort)65535;
3074 fg.green = (ushort)65535;
3075 fg.blue = (ushort)65535;
3077 bg.pixel = XBlackPixel(DisplayHandle, ScreenNo);
3079 cursor = XCreatePixmapCursor(DisplayHandle, cursor_pixmap, mask_pixmap, ref fg, ref bg, xHotSpot, yHotSpot);
3081 XFreePixmap(DisplayHandle, cursor_pixmap);
3082 XFreePixmap(DisplayHandle, mask_pixmap);
3087 internal override Bitmap DefineStdCursorBitmap (StdCursor id)
3089 CursorFontShape shape;
3096 shape = StdCursorToFontShape (id);
3097 name = shape.ToString ().Replace ("XC_", string.Empty);
3098 size = XcursorGetDefaultSize (DisplayHandle);
3099 theme = XcursorGetTheme (DisplayHandle);
3100 IntPtr images_ptr = XcursorLibraryLoadImages (name, theme, size);
3101 DriverDebug ("DefineStdCursorBitmap, id={0}, #id={1}, name{2}, size={3}, theme: {4}, images_ptr={5}", id, (int) id, name, size, Marshal.PtrToStringAnsi (theme), images_ptr);
3103 if (images_ptr == IntPtr.Zero) {
3107 XcursorImages images = (XcursorImages) Marshal.PtrToStructure (images_ptr, typeof (XcursorImages));
3108 DriverDebug ("DefineStdCursorBitmap, cursor has {0} images", images.nimage);
3110 if (images.nimage > 0) {
3111 // We only care about the first image.
3112 XcursorImage image = (XcursorImage)Marshal.PtrToStructure (Marshal.ReadIntPtr (images.images), typeof (XcursorImage));
3114 DriverDebug ("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);
3116 if (image.width <= short.MaxValue && image.height <= short.MaxValue) {
3117 int [] pixels = new int [image.width * image.height];
3118 Marshal.Copy (image.pixels, pixels, 0, pixels.Length);
3119 bmp = new Bitmap (image.width, image.height);
3120 for (int w = 0; w < image.width; w++) {
3121 for (int h = 0; h < image.height; h++) {
3122 bmp.SetPixel (w, h, Color.FromArgb (pixels [h * image.width + w]));
3128 XcursorImagesDestroy (images_ptr);
3130 } catch (DllNotFoundException ex) {
3131 Console.WriteLine ("Could not load libXcursor: " + ex.Message + " (" + ex.GetType ().Name + ")");
3139 internal override IntPtr DefineStdCursor(StdCursor id)
3141 CursorFontShape shape;
3144 shape = StdCursorToFontShape (id);
3147 cursor = XCreateFontCursor(DisplayHandle, shape);
3152 internal static CursorFontShape StdCursorToFontShape (StdCursor id)
3154 CursorFontShape shape;
3155 // FIXME - define missing shapes
3158 case StdCursor.AppStarting: {
3159 shape = CursorFontShape.XC_watch;
3163 case StdCursor.Arrow: {
3164 shape = CursorFontShape.XC_top_left_arrow;
3168 case StdCursor.Cross: {
3169 shape = CursorFontShape.XC_crosshair;
3173 case StdCursor.Default: {
3174 shape = CursorFontShape.XC_top_left_arrow;
3178 case StdCursor.Hand: {
3179 shape = CursorFontShape.XC_hand1;
3183 case StdCursor.Help: {
3184 shape = CursorFontShape.XC_question_arrow;
3188 case StdCursor.HSplit: {
3189 shape = CursorFontShape.XC_sb_v_double_arrow;
3193 case StdCursor.IBeam: {
3194 shape = CursorFontShape.XC_xterm;
3198 case StdCursor.No: {
3199 shape = CursorFontShape.XC_circle;
3203 case StdCursor.NoMove2D: {
3204 shape = CursorFontShape.XC_fleur;
3208 case StdCursor.NoMoveHoriz: {
3209 shape = CursorFontShape.XC_fleur;
3213 case StdCursor.NoMoveVert: {
3214 shape = CursorFontShape.XC_fleur;
3218 case StdCursor.PanEast: {
3219 shape = CursorFontShape.XC_fleur;
3223 case StdCursor.PanNE: {
3224 shape = CursorFontShape.XC_fleur;
3228 case StdCursor.PanNorth: {
3229 shape = CursorFontShape.XC_fleur;
3233 case StdCursor.PanNW: {
3234 shape = CursorFontShape.XC_fleur;
3238 case StdCursor.PanSE: {
3239 shape = CursorFontShape.XC_fleur;
3243 case StdCursor.PanSouth: {
3244 shape = CursorFontShape.XC_fleur;
3248 case StdCursor.PanSW: {
3249 shape = CursorFontShape.XC_fleur;
3253 case StdCursor.PanWest: {
3254 shape = CursorFontShape.XC_sizing;
3258 case StdCursor.SizeAll: {
3259 shape = CursorFontShape.XC_fleur;
3263 case StdCursor.SizeNESW: {
3264 shape = CursorFontShape.XC_top_right_corner;
3268 case StdCursor.SizeNS: {
3269 shape = CursorFontShape.XC_sb_v_double_arrow;
3273 case StdCursor.SizeNWSE: {
3274 shape = CursorFontShape.XC_top_left_corner;
3278 case StdCursor.SizeWE: {
3279 shape = CursorFontShape.XC_sb_h_double_arrow;
3283 case StdCursor.UpArrow: {
3284 shape = CursorFontShape.XC_center_ptr;
3288 case StdCursor.VSplit: {
3289 shape = CursorFontShape.XC_sb_h_double_arrow;
3293 case StdCursor.WaitCursor: {
3294 shape = CursorFontShape.XC_watch;
3299 shape = (CursorFontShape) 0;
3307 internal override IntPtr DefWndProc(ref Message msg)
3309 switch ((Msg)msg.Msg) {
3311 case Msg.WM_IME_COMPOSITION:
3312 string s = Keyboard.GetCompositionString ();
3313 foreach (char c in s)
3314 SendMessage (msg.HWnd, Msg.WM_IME_CHAR, (IntPtr) c, msg.LParam);
3317 case Msg.WM_IME_CHAR:
3318 // On Windows API it sends two WM_CHAR messages for each byte, but
3319 // I wonder if it is worthy to emulate it (also no idea how to
3320 // reconstruct those bytes into chars).
3321 SendMessage (msg.HWnd, Msg.WM_CHAR, msg.WParam, msg.LParam);
3324 case Msg.WM_PAINT: {
3327 hwnd = Hwnd.GetObjectFromWindow(msg.HWnd);
3329 hwnd.expose_pending = false;
3335 case Msg.WM_NCPAINT: {
3338 hwnd = Hwnd.GetObjectFromWindow(msg.HWnd);
3340 hwnd.nc_expose_pending = false;
3346 case Msg.WM_NCCALCSIZE: {
3349 if (msg.WParam == (IntPtr)1) {
3350 hwnd = Hwnd.GetObjectFromWindow (msg.HWnd);
3352 XplatUIWin32.NCCALCSIZE_PARAMS ncp;
3353 ncp = (XplatUIWin32.NCCALCSIZE_PARAMS)Marshal.PtrToStructure (msg.LParam, typeof (XplatUIWin32.NCCALCSIZE_PARAMS));
3355 // Add all the stuff X is supposed to draw.
3356 Control ctrl = Control.FromHandle (hwnd.Handle);
3359 Hwnd.Borders rect = Hwnd.GetBorders (ctrl.GetCreateParams (), null);
3361 ncp.rgrc1.top += rect.top;
3362 ncp.rgrc1.bottom -= rect.bottom;
3363 ncp.rgrc1.left += rect.left;
3364 ncp.rgrc1.right -= rect.right;
3366 Marshal.StructureToPtr (ncp, msg.LParam, true);
3373 case Msg.WM_CONTEXTMENU: {
3376 hwnd = Hwnd.GetObjectFromWindow(msg.HWnd);
3378 if ((hwnd != null) && (hwnd.parent != null)) {
3379 SendMessage(hwnd.parent.client_window, Msg.WM_CONTEXTMENU, msg.WParam, msg.LParam);
3384 case Msg.WM_MOUSEWHEEL: {
3387 hwnd = Hwnd.GetObjectFromWindow(msg.HWnd);
3389 if ((hwnd != null) && (hwnd.parent != null)) {
3390 SendMessage(hwnd.parent.client_window, Msg.WM_MOUSEWHEEL, msg.WParam, msg.LParam);
3391 if (msg.Result == IntPtr.Zero) {
3398 case Msg.WM_SETCURSOR: {
3401 hwnd = Hwnd.GetObjectFromWindow(msg.HWnd);
3403 break; // not sure how this happens, but it does
3405 // Pass to parent window first
3406 while ((hwnd.parent != null) && (msg.Result == IntPtr.Zero)) {
3408 msg.Result = NativeWindow.WndProc(hwnd.Handle, Msg.WM_SETCURSOR, msg.HWnd, msg.LParam);
3411 if (msg.Result == IntPtr.Zero) {
3414 switch((HitTest)(msg.LParam.ToInt32() & 0xffff)) {
3415 case HitTest.HTBOTTOM: handle = Cursors.SizeNS.handle; break;
3416 case HitTest.HTBORDER: handle = Cursors.SizeNS.handle; break;
3417 case HitTest.HTBOTTOMLEFT: handle = Cursors.SizeNESW.handle; break;
3418 case HitTest.HTBOTTOMRIGHT: handle = Cursors.SizeNWSE.handle; break;
3419 case HitTest.HTERROR: if ((msg.LParam.ToInt32() >> 16) == (int)Msg.WM_LBUTTONDOWN) {
3420 AudibleAlert(AlertType.Default);
3422 handle = Cursors.Default.handle;
3425 case HitTest.HTHELP: handle = Cursors.Help.handle; break;
3426 case HitTest.HTLEFT: handle = Cursors.SizeWE.handle; break;
3427 case HitTest.HTRIGHT: handle = Cursors.SizeWE.handle; break;
3428 case HitTest.HTTOP: handle = Cursors.SizeNS.handle; break;
3429 case HitTest.HTTOPLEFT: handle = Cursors.SizeNWSE.handle; break;
3430 case HitTest.HTTOPRIGHT: handle = Cursors.SizeNESW.handle; break;
3433 case HitTest.HTGROWBOX:
3434 case HitTest.HTSIZE:
3435 case HitTest.HTZOOM:
3436 case HitTest.HTVSCROLL:
3437 case HitTest.HTSYSMENU:
3438 case HitTest.HTREDUCE:
3439 case HitTest.HTNOWHERE:
3440 case HitTest.HTMAXBUTTON:
3441 case HitTest.HTMINBUTTON:
3442 case HitTest.HTMENU:
3443 case HitTest.HSCROLL:
3444 case HitTest.HTBOTTOM:
3445 case HitTest.HTCAPTION:
3446 case HitTest.HTCLIENT:
3447 case HitTest.HTCLOSE:
3449 default: handle = Cursors.Default.handle; break;
3451 SetCursor(msg.HWnd, handle);
3459 internal override void DestroyCaret(IntPtr handle)
3461 if (Caret.Hwnd == handle) {
3462 if (Caret.Visible) {
3466 if (Caret.gc != IntPtr.Zero) {
3467 XFreeGC(DisplayHandle, Caret.gc);
3468 Caret.gc = IntPtr.Zero;
3470 Caret.Hwnd = IntPtr.Zero;
3471 Caret.Visible = false;
3476 internal override void DestroyCursor(IntPtr cursor)
3479 XFreeCursor(DisplayHandle, cursor);
3483 internal override void DestroyWindow(IntPtr handle)
3486 hwnd = Hwnd.ObjectFromHandle(handle);
3488 // The window should never ever be a zombie here, since we should
3489 // wait until it's completely dead before returning from
3490 // "destroying" calls, but just in case....
3491 if (hwnd == null || hwnd.zombie) {
3492 DriverDebug ("window {0:X} already destroyed", handle.ToInt32());
3496 DriverDebug ("Destroying window {0}", XplatUI.Window(hwnd.client_window));
3498 SendParentNotify (hwnd.Handle, Msg.WM_DESTROY, int.MaxValue, int.MaxValue);
3500 CleanupCachedWindows (hwnd);
3502 ArrayList windows = new ArrayList ();
3504 AccumulateDestroyedHandles (Control.ControlNativeWindow.ControlFromHandle(hwnd.Handle), windows);
3507 foreach (Hwnd h in windows) {
3508 SendMessage (h.Handle, Msg.WM_DESTROY, IntPtr.Zero, IntPtr.Zero);
3513 if (hwnd.whole_window != IntPtr.Zero) {
3514 DriverDebug ("XDestroyWindow (whole_window = {0:X})", hwnd.whole_window.ToInt32());
3515 Keyboard.DestroyICForWindow (hwnd.whole_window);
3516 XDestroyWindow(DisplayHandle, hwnd.whole_window);
3518 else if (hwnd.client_window != IntPtr.Zero) {
3519 DriverDebug ("XDestroyWindow (client_window = {0:X})", hwnd.client_window.ToInt32());
3520 Keyboard.DestroyICForWindow (hwnd.client_window);
3521 XDestroyWindow(DisplayHandle, hwnd.client_window);
3527 internal override IntPtr DispatchMessage(ref MSG msg)
3529 return NativeWindow.WndProc(msg.hwnd, msg.message, msg.wParam, msg.lParam);
3532 IntPtr GetReversibleScreenGC (Color backColor)
3534 XGCValues gc_values;
3538 XColor xcolor = new XColor();
3539 xcolor.red = (ushort)(backColor.R * 257);
3540 xcolor.green = (ushort)(backColor.G * 257);
3541 xcolor.blue = (ushort)(backColor.B * 257);
3542 XAllocColor(DisplayHandle, DefaultColormap, ref xcolor);
3543 pixel = (uint)xcolor.pixel.ToInt32();
3546 gc_values = new XGCValues();
3548 gc_values.subwindow_mode = GCSubwindowMode.IncludeInferiors;
3549 gc_values.foreground = (IntPtr)pixel;
3551 gc = XCreateGC(DisplayHandle, RootWindow, new IntPtr ((int) (GCFunction.GCSubwindowMode | GCFunction.GCForeground)), ref gc_values);
3552 XSetForeground(DisplayHandle, gc, (UIntPtr)pixel);
3553 XSetFunction(DisplayHandle, gc, GXFunction.GXxor);
3558 IntPtr GetReversibleControlGC (Control control, int line_width)
3560 XGCValues gc_values;
3563 gc_values = new XGCValues();
3565 gc_values.subwindow_mode = GCSubwindowMode.IncludeInferiors;
3566 gc_values.line_width = line_width;
3567 gc_values.foreground = XBlackPixel(DisplayHandle, ScreenNo);
3569 // This logic will give us true rubber bands: (libsx, SANE_XOR)
3570 //mask = foreground ^ background;
3571 //XSetForeground(DisplayHandle, gc, 0xffffffff);
3572 //XSetBackground(DisplayHandle, gc, background);
3573 //XSetFunction(DisplayHandle, gc, GXxor);
3574 //XSetPlaneMask(DisplayHandle, gc, mask);
3577 gc = XCreateGC(DisplayHandle, control.Handle, new IntPtr ((int) (GCFunction.GCSubwindowMode | GCFunction.GCLineWidth | GCFunction.GCForeground)), ref gc_values);
3581 XColor xcolor = new XColor();
3583 xcolor.red = (ushort)(control.ForeColor.R * 257);
3584 xcolor.green = (ushort)(control.ForeColor.G * 257);
3585 xcolor.blue = (ushort)(control.ForeColor.B * 257);
3586 XAllocColor(DisplayHandle, DefaultColormap, ref xcolor);
3587 foreground = (uint)xcolor.pixel.ToInt32();
3589 xcolor.red = (ushort)(control.BackColor.R * 257);
3590 xcolor.green = (ushort)(control.BackColor.G * 257);
3591 xcolor.blue = (ushort)(control.BackColor.B * 257);
3592 XAllocColor(DisplayHandle, DefaultColormap, ref xcolor);
3593 background = (uint)xcolor.pixel.ToInt32();
3595 uint mask = foreground ^ background;
3597 XSetForeground(DisplayHandle, gc, (UIntPtr)0xffffffff);
3598 XSetBackground(DisplayHandle, gc, (UIntPtr)background);
3599 XSetFunction(DisplayHandle, gc, GXFunction.GXxor);
3600 XSetPlaneMask(DisplayHandle, gc, (IntPtr)mask);
3605 internal override void DrawReversibleLine(Point start, Point end, Color backColor)
3607 if (backColor.GetBrightness() < 0.5)
3608 backColor = Color.FromArgb(255 - backColor.R, 255 - backColor.G, 255 - backColor.B);
3610 IntPtr gc = GetReversibleScreenGC (backColor);
3612 XDrawLine (DisplayHandle, RootWindow, gc, start.X, start.Y, end.X, end.Y);
3614 XFreeGC(DisplayHandle, gc);
3617 internal override void DrawReversibleFrame (Rectangle rectangle, Color backColor, FrameStyle style)
3619 if (backColor.GetBrightness() < 0.5)
3620 backColor = Color.FromArgb(255 - backColor.R, 255 - backColor.G, 255 - backColor.B);
3622 IntPtr gc = GetReversibleScreenGC (backColor);
3624 if (rectangle.Width < 0) {
3625 rectangle.X += rectangle.Width;
3626 rectangle.Width = -rectangle.Width;
3628 if (rectangle.Height < 0) {
3629 rectangle.Y += rectangle.Height;
3630 rectangle.Height = -rectangle.Height;
3634 GCLineStyle line_style = GCLineStyle.LineSolid;
3635 GCCapStyle cap_style = GCCapStyle.CapButt;
3636 GCJoinStyle join_style = GCJoinStyle.JoinMiter;
3639 case FrameStyle.Dashed:
3640 line_style = GCLineStyle.LineOnOffDash;
3642 case FrameStyle.Thick:
3647 XSetLineAttributes (DisplayHandle, gc, line_width, line_style, cap_style, join_style);
3649 XDrawRectangle(DisplayHandle, RootWindow, gc, rectangle.Left, rectangle.Top, rectangle.Width, rectangle.Height);
3651 XFreeGC(DisplayHandle, gc);
3654 internal override void FillReversibleRectangle (Rectangle rectangle, Color backColor)
3656 if (backColor.GetBrightness() < 0.5)
3657 backColor = Color.FromArgb(255 - backColor.R, 255 - backColor.G, 255 - backColor.B);
3659 IntPtr gc = GetReversibleScreenGC (backColor);
3661 if (rectangle.Width < 0) {
3662 rectangle.X += rectangle.Width;
3663 rectangle.Width = -rectangle.Width;
3665 if (rectangle.Height < 0) {
3666 rectangle.Y += rectangle.Height;
3667 rectangle.Height = -rectangle.Height;
3669 XFillRectangle(DisplayHandle, RootWindow, gc, rectangle.Left, rectangle.Top, rectangle.Width, rectangle.Height);
3671 XFreeGC(DisplayHandle, gc);
3674 internal override void DrawReversibleRectangle(IntPtr handle, Rectangle rect, int line_width)
3677 Control control = Control.FromHandle(handle);
3679 gc = GetReversibleControlGC (control, line_width);
3681 if ((rect.Width > 0) && (rect.Height > 0)) {
3682 XDrawRectangle(DisplayHandle, control.Handle, gc, rect.Left, rect.Top, rect.Width, rect.Height);
3684 if (rect.Width > 0) {
3685 XDrawLine(DisplayHandle, control.Handle, gc, rect.X, rect.Y, rect.Right, rect.Y);
3687 XDrawLine(DisplayHandle, control.Handle, gc, rect.X, rect.Y, rect.X, rect.Bottom);
3690 XFreeGC(DisplayHandle, gc);
3693 internal override void DoEvents()
3695 DebugHelper.Enter ();
3697 MSG msg = new MSG ();
3700 if (OverrideCursorHandle != IntPtr.Zero) {
3701 OverrideCursorHandle = IntPtr.Zero;
3704 queue = ThreadQueue(Thread.CurrentThread);
3706 queue.DispatchIdle = false;
3709 while (PeekMessage(queue, ref msg, IntPtr.Zero, 0, 0, (uint)PeekMessageFlags.PM_REMOVE)) {
3710 Message m = Message.Create (msg.hwnd, (int)msg.message, msg.wParam, msg.lParam);
3712 if (Application.FilterMessage (ref m))
3715 TranslateMessage (ref msg);
3716 DispatchMessage (ref msg);
3718 string key = msg.hwnd + ":" + msg.message;
3719 if (messageHold[key] != null) {
3720 messageHold[key] = ((int)messageHold[key]) - 1;
3721 DebugHelper.WriteLine ("Got " + msg + " for " + key);
3725 in_doevents = false;
3726 queue.DispatchIdle = true;
3728 DebugHelper.Leave ();
3731 internal override void EnableWindow(IntPtr handle, bool Enable)
3735 hwnd = Hwnd.ObjectFromHandle(handle);
3737 hwnd.Enabled = Enable;
3741 internal override void EndLoop(Thread thread)
3743 // This is where we one day will shut down the loop for the thread
3746 internal override IntPtr GetActive()
3752 IntPtr prop = IntPtr.Zero;
3753 IntPtr active = IntPtr.Zero;
3755 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);
3756 if (((long)nitems > 0) && (prop != IntPtr.Zero)) {
3757 active = (IntPtr)Marshal.ReadInt32(prop);
3761 if (active != IntPtr.Zero) {
3764 hwnd = Hwnd.GetObjectFromWindow(active);
3766 active = hwnd.Handle;
3768 active = IntPtr.Zero;
3774 internal override Region GetClipRegion(IntPtr handle)
3778 hwnd = Hwnd.ObjectFromHandle(handle);
3780 return hwnd.UserClip;
3786 internal override void GetCursorInfo(IntPtr cursor, out int width, out int height, out int hotspot_x, out int hotspot_y)
3794 internal override void GetDisplaySize(out Size size)
3796 XWindowAttributes attributes=new XWindowAttributes();
3799 // FIXME - use _NET_WM messages instead?
3800 XGetWindowAttributes(DisplayHandle, XRootWindow(DisplayHandle, 0), ref attributes);
3803 size = new Size(attributes.width, attributes.height);
3806 internal override SizeF GetAutoScaleSize(Font font)
3810 string magic_string = "The quick brown fox jumped over the lazy dog.";
3811 double magic_number = 44.549996948242189;
3813 g = Graphics.FromHwnd(FosterParent);
3815 width = (float) (g.MeasureString (magic_string, font).Width / magic_number);
3816 return new SizeF(width, font.Height);
3819 internal override IntPtr GetParent(IntPtr handle)
3823 hwnd = Hwnd.ObjectFromHandle(handle);
3824 if (hwnd != null && hwnd.parent != null) {
3825 return hwnd.parent.Handle;
3830 // This is a nop on win32 and x11
3831 internal override IntPtr GetPreviousWindow(IntPtr handle)
3836 internal override void GetCursorPos(IntPtr handle, out int x, out int y)
3847 if (handle != IntPtr.Zero) {
3848 use_handle = Hwnd.ObjectFromHandle(handle).client_window;
3850 use_handle = RootWindow;
3854 QueryPointer (DisplayHandle, use_handle, out root, out child, out root_x, out root_y, out win_x, out win_y, out keys_buttons);
3857 if (handle != IntPtr.Zero) {
3866 internal override IntPtr GetFocus()
3872 internal override bool GetFontMetrics(Graphics g, Font font, out int ascent, out int descent)
3874 FontFamily ff = font.FontFamily;
3875 ascent = ff.GetCellAscent (font.Style);
3876 descent = ff.GetCellDescent (font.Style);
3880 internal override Point GetMenuOrigin(IntPtr handle)
3884 hwnd = Hwnd.ObjectFromHandle(handle);
3887 return hwnd.MenuOrigin;
3892 [MonoTODO("Implement filtering")]
3893 internal override bool GetMessage(Object queue_id, ref MSG msg, IntPtr handle, int wFilterMin, int wFilterMax)
3901 if (((XEventQueue)queue_id).Count > 0) {
3902 xevent = (XEvent) ((XEventQueue)queue_id).Dequeue ();
3904 UpdateMessageQueue ((XEventQueue)queue_id);
3906 if (((XEventQueue)queue_id).Count > 0) {
3907 xevent = (XEvent) ((XEventQueue)queue_id).Dequeue ();
3908 } else if (((XEventQueue)queue_id).Paint.Count > 0) {
3909 xevent = ((XEventQueue)queue_id).Paint.Dequeue();
3911 msg.hwnd= IntPtr.Zero;
3912 msg.message = Msg.WM_ENTERIDLE;
3917 hwnd = Hwnd.GetObjectFromWindow(xevent.AnyEvent.window);
3919 #if DriverDebugDestroy
3922 Console.WriteLine ( "GetMessage zombie, got Event: " + xevent.ToString () + " for 0x{0:x}", hwnd.Handle.ToInt32());
3924 Console.WriteLine ( "GetMessage, got Event: " + xevent.ToString () + " for 0x{0:x}", hwnd.Handle.ToInt32());
3926 // Handle messages for windows that are already or are about to be destroyed.
3928 // we need a special block for this because unless we remove the hwnd from the paint
3929 // queue it will always stay there (since we don't handle the expose), and we'll
3930 // effectively loop infinitely trying to repaint a non-existant window.
3931 if (hwnd != null && hwnd.zombie && xevent.type == XEventName.Expose) {
3932 hwnd.expose_pending = hwnd.nc_expose_pending = false;
3933 hwnd.Queue.Paint.Remove (hwnd);
3934 goto ProcessNextMessage;
3937 // We need to make sure we only allow DestroyNotify events through for zombie
3938 // hwnds, since much of the event handling code makes requests using the hwnd's
3939 // client_window, and that'll result in BadWindow errors if there's some lag
3940 // between the XDestroyWindow call and the DestroyNotify event.
3941 if (hwnd == null || hwnd.zombie && xevent.AnyEvent.type != XEventName.ClientMessage) {
3942 DriverDebug("GetMessage(): Got message {0} for non-existent or already destroyed window {1:X}", xevent.type, xevent.AnyEvent.window.ToInt32());
3943 goto ProcessNextMessage;
3947 // If we get here, that means the window is no more but there are Client Messages
3948 // to be processed, probably a Posted message (for instance, an WM_ACTIVATE message)
3949 // We don't want anything else to run but the ClientMessage block, so reset all hwnd
3950 // properties that might cause other processing to occur.
3952 hwnd.resizing_or_moving = false;
3955 if (hwnd.client_window == xevent.AnyEvent.window) {
3957 //Console.WriteLine("Client message {1}, sending to window {0:X}", msg.hwnd.ToInt32(), xevent.type);
3960 //Console.WriteLine("Non-Client message, sending to window {0:X}", msg.hwnd.ToInt32());
3963 msg.hwnd = hwnd.Handle;
3965 // Windows sends WM_ENTERSIZEMOVE when a form resize/move operation starts and WM_EXITSIZEMOVE
3966 // when it is done. The problem in X11 is that there is no concept of start-end of a moving/sizing.
3967 // Configure events ("this window has resized/moved") are sent for each step of the resize. We send a
3968 // WM_ENTERSIZEMOVE when we get the first Configure event. The problem is the WM_EXITSIZEMOVE.
3970 // - There is no way for us to know which is the last Configure event. We can't traverse the events
3971 // queue, because the next configure event might not be pending yet.
3972 // - We can't get ButtonPress/Release events for the window decorations, because they are not part
3973 // of the window(s) we manage.
3974 // - We can't rely on the mouse state to change to "up" before the last Configure event. It doesn't.
3976 // We are almost 100% guaranteed to get another event (e.g Expose or other), but we can't know for sure
3977 // which, so we have here to check if the mouse buttons state is "up" and send the WM_EXITSIZEMOVE
3979 if (hwnd.resizing_or_moving) {
3980 int root_x, root_y, win_x, win_y, keys_buttons;
3982 XQueryPointer (DisplayHandle, hwnd.Handle, out root, out child, out root_x, out root_y,
3983 out win_x, out win_y, out keys_buttons);
3984 if ((keys_buttons & (int)MouseKeyMasks.Button1Mask) == 0 &&
3985 (keys_buttons & (int)MouseKeyMasks.Button2Mask) == 0 &&
3986 (keys_buttons & (int)MouseKeyMasks.Button3Mask) == 0) {
3987 hwnd.resizing_or_moving = false;
3988 SendMessage (hwnd.Handle, Msg.WM_EXITSIZEMOVE, IntPtr.Zero, IntPtr.Zero);
3993 // If you add a new event to this switch make sure to add it in
3994 // UpdateMessage also unless it is not coming through the X event system.
3996 switch(xevent.type) {
3997 case XEventName.KeyPress: {
3998 Keyboard.KeyEvent (FocusWindow, xevent, ref msg);
4000 // F1 key special case - WM_HELP sending
4001 if (msg.wParam == (IntPtr)VirtualKeys.VK_F1 || msg.wParam == (IntPtr)VirtualKeys.VK_HELP) {
4002 // Send wM_HELP and then return it as a keypress message in
4003 // case it needs to be preproccessed.
4004 HELPINFO helpInfo = new HELPINFO ();
4005 GetCursorPos (IntPtr.Zero, out helpInfo.MousePos.x, out helpInfo.MousePos.y);
4006 IntPtr helpInfoPtr = Marshal.AllocHGlobal (Marshal.SizeOf (helpInfo));
4007 Marshal.StructureToPtr (helpInfo, helpInfoPtr, true);
4008 NativeWindow.WndProc (FocusWindow, Msg.WM_HELP, IntPtr.Zero, helpInfoPtr);
4009 Marshal.FreeHGlobal (helpInfoPtr);
4014 case XEventName.KeyRelease: {
4015 Keyboard.KeyEvent (FocusWindow, xevent, ref msg);
4019 case XEventName.ButtonPress: {
4020 switch(xevent.ButtonEvent.button) {
4022 MouseState |= MouseButtons.Left;
4024 msg.message = Msg.WM_LBUTTONDOWN;
4025 msg.wParam = GetMousewParam (0);
4027 msg.message = Msg.WM_NCLBUTTONDOWN;
4028 msg.wParam = (IntPtr) NCHitTest (hwnd, xevent.MotionEvent.x, xevent.MotionEvent.y);
4029 MenuToScreen (xevent.AnyEvent.window, ref xevent.ButtonEvent.x, ref xevent.ButtonEvent.y);
4035 MouseState |= MouseButtons.Middle;
4037 msg.message = Msg.WM_MBUTTONDOWN;
4038 msg.wParam = GetMousewParam (0);
4040 msg.message = Msg.WM_NCMBUTTONDOWN;
4041 msg.wParam = (IntPtr) NCHitTest (hwnd, xevent.MotionEvent.x, xevent.MotionEvent.y);
4042 MenuToScreen (xevent.AnyEvent.window, ref xevent.ButtonEvent.x, ref xevent.ButtonEvent.y);
4048 MouseState |= MouseButtons.Right;
4050 msg.message = Msg.WM_RBUTTONDOWN;
4051 msg.wParam = GetMousewParam (0);
4053 msg.message = Msg.WM_NCRBUTTONDOWN;
4054 msg.wParam = (IntPtr) NCHitTest (hwnd, xevent.MotionEvent.x, xevent.MotionEvent.y);
4055 MenuToScreen (xevent.AnyEvent.window, ref xevent.ButtonEvent.x, ref xevent.ButtonEvent.y);
4061 msg.hwnd = FocusWindow;
4062 msg.message=Msg.WM_MOUSEWHEEL;
4063 msg.wParam=GetMousewParam(120);
4068 msg.hwnd = FocusWindow;
4069 msg.message=Msg.WM_MOUSEWHEEL;
4070 msg.wParam=GetMousewParam(-120);
4076 msg.lParam=(IntPtr) (xevent.ButtonEvent.y << 16 | xevent.ButtonEvent.x);
4077 mouse_position.X = xevent.ButtonEvent.x;
4078 mouse_position.Y = xevent.ButtonEvent.y;
4080 if (!hwnd.Enabled) {
4083 msg.hwnd = hwnd.EnabledHwnd;
4084 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);
4085 msg.lParam = (IntPtr)(mouse_position.Y << 16 | mouse_position.X);
4088 if (Grab.Hwnd != IntPtr.Zero) {
4089 msg.hwnd = Grab.Hwnd;
4092 if (ClickPending.Pending && ((((long)xevent.ButtonEvent.time - ClickPending.Time) < DoubleClickInterval) && (msg.wParam == ClickPending.wParam) && (msg.lParam == ClickPending.lParam) && (msg.message == ClickPending.Message))) {
4093 // Looks like a genuine double click, clicked twice on the same spot with the same keys
4094 switch(xevent.ButtonEvent.button) {
4096 msg.message = client ? Msg.WM_LBUTTONDBLCLK : Msg.WM_NCLBUTTONDBLCLK;
4101 msg.message = client ? Msg.WM_MBUTTONDBLCLK : Msg.WM_NCMBUTTONDBLCLK;
4106 msg.message = client ? Msg.WM_RBUTTONDBLCLK : Msg.WM_NCRBUTTONDBLCLK;
4110 ClickPending.Pending = false;
4112 ClickPending.Pending = true;
4113 ClickPending.Hwnd = msg.hwnd;
4114 ClickPending.Message = msg.message;
4115 ClickPending.wParam = msg.wParam;
4116 ClickPending.lParam = msg.lParam;
4117 ClickPending.Time = (long)xevent.ButtonEvent.time;
4120 if (msg.message == Msg.WM_LBUTTONDOWN || msg.message == Msg.WM_MBUTTONDOWN || msg.message == Msg.WM_RBUTTONDOWN) {
4121 SendParentNotify(msg.hwnd, msg.message, mouse_position.X, mouse_position.Y);
4127 case XEventName.ButtonRelease: {
4128 switch(xevent.ButtonEvent.button) {
4131 msg.message = Msg.WM_LBUTTONUP;
4133 msg.message = Msg.WM_NCLBUTTONUP;
4134 msg.wParam = (IntPtr) NCHitTest (hwnd, xevent.MotionEvent.x, xevent.MotionEvent.y);
4135 MenuToScreen (xevent.AnyEvent.window, ref xevent.ButtonEvent.x, ref xevent.ButtonEvent.y);
4137 MouseState &= ~MouseButtons.Left;
4138 msg.wParam = GetMousewParam (0);
4144 msg.message = Msg.WM_MBUTTONUP;
4146 msg.message = Msg.WM_NCMBUTTONUP;
4147 msg.wParam = (IntPtr) NCHitTest (hwnd, xevent.MotionEvent.x, xevent.MotionEvent.y);
4148 MenuToScreen (xevent.AnyEvent.window, ref xevent.ButtonEvent.x, ref xevent.ButtonEvent.y);
4150 MouseState &= ~MouseButtons.Middle;
4151 msg.wParam = GetMousewParam (0);
4157 msg.message = Msg.WM_RBUTTONUP;
4159 msg.message = Msg.WM_NCRBUTTONUP;
4160 msg.wParam = (IntPtr) NCHitTest (hwnd, xevent.MotionEvent.x, xevent.MotionEvent.y);
4161 MenuToScreen (xevent.AnyEvent.window, ref xevent.ButtonEvent.x, ref xevent.ButtonEvent.y);
4163 MouseState &= ~MouseButtons.Right;
4164 msg.wParam = GetMousewParam (0);
4169 goto ProcessNextMessage;
4173 goto ProcessNextMessage;
4177 if (!hwnd.Enabled) {
4180 msg.hwnd = hwnd.EnabledHwnd;
4181 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);
4182 msg.lParam = (IntPtr)(mouse_position.Y << 16 | mouse_position.X);
4185 if (Grab.Hwnd != IntPtr.Zero) {
4186 msg.hwnd = Grab.Hwnd;
4189 msg.lParam=(IntPtr) (xevent.ButtonEvent.y << 16 | xevent.ButtonEvent.x);
4190 mouse_position.X = xevent.ButtonEvent.x;
4191 mouse_position.Y = xevent.ButtonEvent.y;
4193 // Win32 splurts MouseMove events all over the place, regardless of whether the mouse is actually moving or
4194 // not, especially after mousedown and mouseup. To support apps relying on mousemove events between and after
4195 // mouse clicks to repaint or whatever, we generate a mousemove event here. *sigh*
4196 if (msg.message == Msg.WM_LBUTTONUP || msg.message == Msg.WM_MBUTTONUP || msg.message == Msg.WM_RBUTTONUP) {
4197 XEvent motionEvent = new XEvent ();
4198 motionEvent.type = XEventName.MotionNotify;
4199 motionEvent.MotionEvent.display = DisplayHandle;
4200 motionEvent.MotionEvent.window = xevent.ButtonEvent.window;
4201 motionEvent.MotionEvent.x = xevent.ButtonEvent.x;
4202 motionEvent.MotionEvent.y = xevent.ButtonEvent.y;
4203 hwnd.Queue.EnqueueLocked (motionEvent);
4208 case XEventName.MotionNotify: {
4210 DriverDebug("GetMessage(): Window {0:X} MotionNotify x={1} y={2}",
4211 client ? hwnd.client_window.ToInt32() : hwnd.whole_window.ToInt32(),
4212 xevent.MotionEvent.x, xevent.MotionEvent.y);
4214 if (Grab.Hwnd != IntPtr.Zero) {
4215 msg.hwnd = Grab.Hwnd;
4218 NativeWindow.WndProc(msg.hwnd, Msg.WM_SETCURSOR, msg.hwnd, (IntPtr)HitTest.HTCLIENT);
4222 if (xevent.MotionEvent.is_hint != 0)
4226 XQueryPointer (DisplayHandle, xevent.AnyEvent.window,
4227 out root, out child,
4228 out xevent.MotionEvent.x_root,
4229 out xevent.MotionEvent.y_root,
4230 out xevent.MotionEvent.x,
4231 out xevent.MotionEvent.y, out mask);
4234 msg.message = Msg.WM_MOUSEMOVE;
4235 msg.wParam = GetMousewParam(0);
4236 msg.lParam = (IntPtr) (xevent.MotionEvent.y << 16 | xevent.MotionEvent.x & 0xFFFF);
4238 if (!hwnd.Enabled) {
4241 msg.hwnd = hwnd.EnabledHwnd;
4242 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);
4243 msg.lParam = (IntPtr)(mouse_position.Y << 16 | mouse_position.X);
4246 mouse_position.X = xevent.MotionEvent.x;
4247 mouse_position.Y = xevent.MotionEvent.y;
4249 if ((HoverState.Timer.Enabled) &&
4250 (((mouse_position.X + HoverState.Size.Width) < HoverState.X) ||
4251 ((mouse_position.X - HoverState.Size.Width) > HoverState.X) ||
4252 ((mouse_position.Y + HoverState.Size.Height) < HoverState.Y) ||
4253 ((mouse_position.Y - HoverState.Size.Height) > HoverState.Y))) {
4254 HoverState.Timer.Stop();
4255 HoverState.Timer.Start();
4256 HoverState.X = mouse_position.X;
4257 HoverState.Y = mouse_position.Y;
4265 DriverDebug("GetMessage(): non-client area {0:X} MotionNotify x={1} y={2}",
4266 client ? hwnd.client_window.ToInt32() : hwnd.whole_window.ToInt32(),
4267 xevent.MotionEvent.x, xevent.MotionEvent.y);
4268 msg.message = Msg.WM_NCMOUSEMOVE;
4270 if (!hwnd.Enabled) {
4271 msg.hwnd = hwnd.EnabledHwnd;
4272 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);
4273 msg.lParam = (IntPtr)(mouse_position.Y << 16 | mouse_position.X);
4276 ht = NCHitTest (hwnd, xevent.MotionEvent.x, xevent.MotionEvent.y);
4277 NativeWindow.WndProc(hwnd.client_window, Msg.WM_SETCURSOR, msg.hwnd, (IntPtr)ht);
4279 mouse_position.X = xevent.MotionEvent.x;
4280 mouse_position.Y = xevent.MotionEvent.y;
4286 case XEventName.EnterNotify: {
4287 if (!hwnd.Enabled) {
4288 goto ProcessNextMessage;
4290 if (xevent.CrossingEvent.mode == NotifyMode.NotifyGrab || xevent.AnyEvent.window != hwnd.client_window) {
4291 goto ProcessNextMessage;
4293 if (xevent.CrossingEvent.mode == NotifyMode.NotifyUngrab) { // Pseudo motion caused by grabbing
4294 if (LastPointerWindow == xevent.AnyEvent.window)
4295 goto ProcessNextMessage;
4297 if (LastPointerWindow != IntPtr.Zero) {
4298 Point enter_loc = new Point (xevent.ButtonEvent.x, xevent.ButtonEvent.y);
4300 // We need this due to EnterNotify being fired on all the parent controls
4301 // of the Control being grabbed, and obviously in that scenario we are not
4302 // actuallty entering them
4303 Control ctrl = Control.FromHandle (hwnd.client_window);
4304 foreach (Control child_control in ctrl.Controls.GetAllControls ())
4305 if (child_control.Bounds.Contains (enter_loc))
4306 goto ProcessNextMessage;
4308 // A MouseLeave/LeaveNotify event is sent to the previous window
4309 // until the mouse is ungrabbed, not when actually leaving its bounds
4310 int x = xevent.CrossingEvent.x_root;
4311 int y = xevent.CrossingEvent.y_root;
4312 ScreenToClient (LastPointerWindow, ref x, ref y);
4314 XEvent leaveEvent = new XEvent ();
4315 leaveEvent.type = XEventName.LeaveNotify;
4316 leaveEvent.CrossingEvent.display = DisplayHandle;
4317 leaveEvent.CrossingEvent.window = LastPointerWindow;
4318 leaveEvent.CrossingEvent.x = x;
4319 leaveEvent.CrossingEvent.y = y;
4320 leaveEvent.CrossingEvent.mode = NotifyMode.NotifyNormal;
4321 Hwnd last_pointer_hwnd = Hwnd.ObjectFromHandle (LastPointerWindow);
4322 last_pointer_hwnd.Queue.EnqueueLocked (leaveEvent);
4326 LastPointerWindow = xevent.AnyEvent.window;
4328 msg.message = Msg.WM_MOUSE_ENTER;
4329 HoverState.X = xevent.CrossingEvent.x;
4330 HoverState.Y = xevent.CrossingEvent.y;
4331 HoverState.Timer.Enabled = true;
4332 HoverState.Window = xevent.CrossingEvent.window;
4334 // Win32 sends a WM_MOUSEMOVE after mouse enter
4335 XEvent motionEvent = new XEvent ();
4336 motionEvent.type = XEventName.MotionNotify;
4337 motionEvent.MotionEvent.display = DisplayHandle;
4338 motionEvent.MotionEvent.window = xevent.ButtonEvent.window;
4339 motionEvent.MotionEvent.x = xevent.ButtonEvent.x;
4340 motionEvent.MotionEvent.y = xevent.ButtonEvent.y;
4341 hwnd.Queue.EnqueueLocked (motionEvent);
4345 case XEventName.LeaveNotify: {
4346 if (xevent.CrossingEvent.mode == NotifyMode.NotifyUngrab) {
4347 WindowUngrabbed (hwnd.Handle);
4348 goto ProcessNextMessage;
4350 if (!hwnd.Enabled) {
4351 goto ProcessNextMessage;
4353 if ((xevent.CrossingEvent.mode != NotifyMode.NotifyNormal) || (xevent.CrossingEvent.window != hwnd.client_window)) {
4354 goto ProcessNextMessage;
4356 // If a grab is taking place, ignore it - we handle it in EnterNotify
4357 if (Grab.Hwnd != IntPtr.Zero)
4358 goto ProcessNextMessage;
4360 // Reset the cursor explicitly on X11.
4361 // X11 remembers the last set cursor for the window and in cases where
4362 // the control won't get a WM_SETCURSOR X11 will restore the last
4363 // known cursor, which we don't want.
4365 SetCursor (hwnd.client_window, IntPtr.Zero);
4367 msg.message=Msg.WM_MOUSELEAVE;
4368 HoverState.Timer.Enabled = false;
4369 HoverState.Window = IntPtr.Zero;
4374 case XEventName.CreateNotify: {
4375 if (client && (xevent.ConfigureEvent.xevent == xevent.ConfigureEvent.window)) {
4376 msg.message = WM_CREATE;
4377 // Set up CreateStruct
4379 goto ProcessNextMessage;
4386 case XEventName.ReparentNotify: {
4387 if (hwnd.parent == null) { // Toplevel
4388 if ((xevent.ReparentEvent.parent != IntPtr.Zero) && (xevent.ReparentEvent.window == hwnd.whole_window)) {
4389 hwnd.Reparented = true;
4391 // The location given by the event is not reliable between different wm's,
4392 // so use an alternative way of getting it.
4393 Point location = GetTopLevelWindowLocation (hwnd);
4394 hwnd.X = location.X;
4395 hwnd.Y = location.Y;
4397 if (hwnd.opacity != 0xffffffff) {
4400 opacity = (IntPtr)(Int32)hwnd.opacity;
4401 XChangeProperty(DisplayHandle, XGetParent(hwnd.whole_window), _NET_WM_WINDOW_OPACITY, (IntPtr)Atom.XA_CARDINAL, 32, PropertyMode.Replace, ref opacity, 1);
4403 SendMessage(msg.hwnd, Msg.WM_WINDOWPOSCHANGED, msg.wParam, msg.lParam);
4404 goto ProcessNextMessage;
4406 hwnd.Reparented = false;
4407 goto ProcessNextMessage;
4410 goto ProcessNextMessage;
4413 case XEventName.ConfigureNotify: {
4414 if (!client && (xevent.ConfigureEvent.xevent == xevent.ConfigureEvent.window)) { // Ignore events for children (SubstructureNotify) and client areas
4415 DriverDebug("GetMessage(): Window {0:X} ConfigureNotify x={1} y={2} width={3} height={4}",
4416 hwnd.client_window.ToInt32(), xevent.ConfigureEvent.x,
4417 xevent.ConfigureEvent.y, xevent.ConfigureEvent.width, xevent.ConfigureEvent.height);
4419 lock (hwnd.configure_lock) {
4420 Form form = Control.FromHandle (hwnd.client_window) as Form;
4421 if (form != null && !hwnd.resizing_or_moving) {
4422 if (hwnd.x != form.Bounds.X || hwnd.y != form.Bounds.Y) {
4423 SendMessage (form.Handle, Msg.WM_SYSCOMMAND, (IntPtr)SystemCommands.SC_MOVE, IntPtr.Zero);
4424 hwnd.resizing_or_moving = true;
4425 } else if (hwnd.width != form.Bounds.Width || hwnd.height != form.Bounds.Height) {
4426 SendMessage (form.Handle, Msg.WM_SYSCOMMAND, (IntPtr)SystemCommands.SC_SIZE, IntPtr.Zero);
4427 hwnd.resizing_or_moving = true;
4429 if (hwnd.resizing_or_moving)
4430 SendMessage (form.Handle, Msg.WM_ENTERSIZEMOVE, IntPtr.Zero, IntPtr.Zero);
4433 SendMessage(msg.hwnd, Msg.WM_WINDOWPOSCHANGED, IntPtr.Zero, IntPtr.Zero);
4434 hwnd.configure_pending = false;
4436 // We need to adjust our client window to track the resize of whole_window
4437 if (hwnd.whole_window != hwnd.client_window)
4438 PerformNCCalc(hwnd);
4441 goto ProcessNextMessage;
4444 case XEventName.FocusIn: {
4445 // We received focus. We use X11 focus only to know if the app window does or does not have focus
4446 // We do not track the actual focussed window via it. Instead, this is done via FocusWindow internally
4447 // Receiving focus means we've gotten activated and therefore we need to let the actual FocusWindow know
4448 // about it having focus again
4449 if (xevent.FocusChangeEvent.detail != NotifyDetail.NotifyNonlinear) {
4450 goto ProcessNextMessage;
4454 if (FocusWindow == IntPtr.Zero) {
4455 Control c = Control.FromHandle (hwnd.client_window);
4458 goto ProcessNextMessage;
4459 Form form = c.FindForm ();
4461 goto ProcessNextMessage;
4463 if (ActiveWindow != form.Handle) {
4464 ActiveWindow = form.Handle;
4465 SendMessage (ActiveWindow, Msg.WM_ACTIVATE, (IntPtr) WindowActiveFlags.WA_ACTIVE, IntPtr.Zero);
4467 goto ProcessNextMessage;
4469 Keyboard.FocusIn (FocusWindow);
4470 SendMessage(FocusWindow, Msg.WM_SETFOCUS, IntPtr.Zero, IntPtr.Zero);
4471 goto ProcessNextMessage;
4474 case XEventName.FocusOut: {
4475 // Se the comment for our FocusIn handler
4476 if (xevent.FocusChangeEvent.detail != NotifyDetail.NotifyNonlinear) {
4477 goto ProcessNextMessage;
4480 while (Keyboard.ResetKeyState(FocusWindow, ref msg)) {
4481 SendMessage(FocusWindow, msg.message, msg.wParam, msg.lParam);
4484 Keyboard.FocusOut(hwnd.client_window);
4485 SendMessage(FocusWindow, Msg.WM_KILLFOCUS, IntPtr.Zero, IntPtr.Zero);
4486 goto ProcessNextMessage;
4489 // We are already firing WM_SHOWWINDOW messages in the proper places, but I'm leaving this code
4490 // in case we break a scenario not taken into account in the tests
4491 case XEventName.MapNotify: {
4492 /*if (client && (xevent.ConfigureEvent.xevent == xevent.ConfigureEvent.window)) { // Ignore events for children (SubstructureNotify) and client areas
4494 msg.message = Msg.WM_SHOWWINDOW;
4495 msg.wParam = (IntPtr) 1;
4496 // XXX we're missing the lParam..
4499 goto ProcessNextMessage;
4502 case XEventName.UnmapNotify: {
4503 /*if (client && (xevent.ConfigureEvent.xevent == xevent.ConfigureEvent.window)) { // Ignore events for children (SubstructureNotify) and client areas
4504 hwnd.mapped = false;
4505 msg.message = Msg.WM_SHOWWINDOW;
4506 msg.wParam = (IntPtr) 0;
4507 // XXX we're missing the lParam..
4510 goto ProcessNextMessage;
4513 case XEventName.Expose: {
4516 hwnd.expose_pending = false;
4518 hwnd.nc_expose_pending = false;
4520 goto ProcessNextMessage;
4524 if (!hwnd.expose_pending) {
4525 goto ProcessNextMessage;
4528 if (!hwnd.nc_expose_pending) {
4529 goto ProcessNextMessage;
4532 switch (hwnd.border_style) {
4533 case FormBorderStyle.Fixed3D: {
4536 g = Graphics.FromHwnd(hwnd.whole_window);
4537 if (hwnd.border_static)
4538 ControlPaint.DrawBorder3D(g, new Rectangle(0, 0, hwnd.Width, hwnd.Height), Border3DStyle.SunkenOuter);
4540 ControlPaint.DrawBorder3D(g, new Rectangle(0, 0, hwnd.Width, hwnd.Height), Border3DStyle.Sunken);
4545 case FormBorderStyle.FixedSingle: {
4548 g = Graphics.FromHwnd(hwnd.whole_window);
4549 ControlPaint.DrawBorder(g, new Rectangle(0, 0, hwnd.Width, hwnd.Height), Color.Black, ButtonBorderStyle.Solid);
4554 DriverDebug("GetMessage(): Window {0:X} Exposed non-client area {1},{2} {3}x{4}",
4555 hwnd.client_window.ToInt32(), xevent.ExposeEvent.x, xevent.ExposeEvent.y,
4556 xevent.ExposeEvent.width, xevent.ExposeEvent.height);
4558 Rectangle rect = new Rectangle (xevent.ExposeEvent.x, xevent.ExposeEvent.y, xevent.ExposeEvent.width, xevent.ExposeEvent.height);
4559 Region region = new Region (rect);
4560 IntPtr hrgn = region.GetHrgn (null); // Graphics object isn't needed
4561 msg.message = Msg.WM_NCPAINT;
4562 msg.wParam = hrgn == IntPtr.Zero ? (IntPtr)1 : hrgn;
4563 msg.refobject = region;
4566 DriverDebug("GetMessage(): Window {0:X} Exposed area {1},{2} {3}x{4}",
4567 hwnd.client_window.ToInt32(), xevent.ExposeEvent.x, xevent.ExposeEvent.y,
4568 xevent.ExposeEvent.width, xevent.ExposeEvent.height);
4569 if (Caret.Visible == true) {
4570 Caret.Paused = true;
4574 if (Caret.Visible == true) {
4576 Caret.Paused = false;
4578 msg.message = Msg.WM_PAINT;
4582 case XEventName.DestroyNotify: {
4584 // This is a bit tricky, we don't receive our own DestroyNotify, we only get those for our children
4585 hwnd = Hwnd.ObjectFromHandle(xevent.DestroyWindowEvent.window);
4587 // We may get multiple for the same window, act only one the first (when Hwnd still knows about it)
4588 if ((hwnd != null) && (hwnd.client_window == xevent.DestroyWindowEvent.window)) {
4589 CleanupCachedWindows (hwnd);
4591 DriverDebug("Received X11 Destroy Notification for {0}", XplatUI.Window(hwnd.client_window));
4593 msg.hwnd = hwnd.client_window;
4594 msg.message=Msg.WM_DESTROY;
4597 goto ProcessNextMessage;
4603 case XEventName.ClientMessage: {
4604 if (Dnd.HandleClientMessage (ref xevent)) {
4605 goto ProcessNextMessage;
4608 if (xevent.ClientMessageEvent.message_type == AsyncAtom) {
4609 XplatUIDriverSupport.ExecuteClientMessage((GCHandle)xevent.ClientMessageEvent.ptr1);
4610 goto ProcessNextMessage;
4613 if (xevent.ClientMessageEvent.message_type == HoverState.Atom) {
4614 msg.message = Msg.WM_MOUSEHOVER;
4615 msg.wParam = GetMousewParam(0);
4616 msg.lParam = (IntPtr) (xevent.ClientMessageEvent.ptr1);
4620 if (xevent.ClientMessageEvent.message_type == (IntPtr)PostAtom) {
4621 DebugHelper.Indent ();
4622 DebugHelper.WriteLine (String.Format ("Posted message:" + (Msg) xevent.ClientMessageEvent.ptr2.ToInt32 () + " for 0x{0:x}", xevent.ClientMessageEvent.ptr1.ToInt32 ()));
4623 DebugHelper.Unindent ();
4624 msg.hwnd = xevent.ClientMessageEvent.ptr1;
4625 msg.message = (Msg) xevent.ClientMessageEvent.ptr2.ToInt32 ();
4626 msg.wParam = xevent.ClientMessageEvent.ptr3;
4627 msg.lParam = xevent.ClientMessageEvent.ptr4;
4628 if (msg.message == (Msg)Msg.WM_QUIT)
4634 if (xevent.ClientMessageEvent.message_type == _XEMBED) {
4635 #if DriverDebugXEmbed
4636 Console.WriteLine("GOT EMBED MESSAGE {0:X}, detail {1:X}", xevent.ClientMessageEvent.ptr2.ToInt32(), xevent.ClientMessageEvent.ptr3.ToInt32());
4639 if (xevent.ClientMessageEvent.ptr2.ToInt32() == (int)XEmbedMessage.EmbeddedNotify) {
4640 XSizeHints hints = new XSizeHints();
4643 XGetWMNormalHints(DisplayHandle, hwnd.whole_window, ref hints, out dummy);
4645 hwnd.width = hints.max_width;
4646 hwnd.height = hints.max_height;
4647 hwnd.ClientRect = Rectangle.Empty;
4648 SendMessage(msg.hwnd, Msg.WM_WINDOWPOSCHANGED, IntPtr.Zero, IntPtr.Zero);
4652 if (xevent.ClientMessageEvent.message_type == WM_PROTOCOLS) {
4653 if (xevent.ClientMessageEvent.ptr1 == WM_DELETE_WINDOW) {
4654 SendMessage (msg.hwnd, Msg.WM_SYSCOMMAND, (IntPtr)SystemCommands.SC_CLOSE, IntPtr.Zero);
4655 msg.message = Msg.WM_CLOSE;
4659 // We should not get this, but I'll leave the code in case we need it in the future
4660 if (xevent.ClientMessageEvent.ptr1 == WM_TAKE_FOCUS) {
4661 goto ProcessNextMessage;
4664 goto ProcessNextMessage;
4668 goto ProcessNextMessage;
4675 HitTest NCHitTest (Hwnd hwnd, int x, int y)
4677 // The hit test is sent in screen coordinates
4679 int screen_x, screen_y;
4680 XTranslateCoordinates (DisplayHandle, hwnd.WholeWindow, RootWindow, x, y, out screen_x, out screen_y, out dummy);
4681 return (HitTest) NativeWindow.WndProc (hwnd.client_window, Msg.WM_NCHITTEST, IntPtr.Zero,
4682 (IntPtr) (screen_y << 16 | screen_x & 0xFFFF));
4685 // Our very basic implementation of MoveResize - we can extend it later
4687 internal override void BeginMoveResize (IntPtr handle)
4689 // We *need* to ungrab the pointer in the current display
4690 XplatUI.UngrabWindow (Grab.Hwnd);
4693 GetCursorPos (IntPtr.Zero, out x_root, out y_root);
4695 Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
4696 SendNetWMMessage (hwnd.whole_window, _NET_WM_MOVERESIZE, (IntPtr) x_root, (IntPtr) y_root,
4697 (IntPtr) NetWmMoveResize._NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT,
4698 (IntPtr) 1); // left button
4701 internal override bool GetText(IntPtr handle, out string text)
4709 IntPtr prop = IntPtr.Zero;
4711 XGetWindowProperty(DisplayHandle, handle,
4712 _NET_WM_NAME, IntPtr.Zero, new IntPtr (1), false,
4713 UTF8_STRING, out actual_atom, out actual_format, out nitems, out bytes_after, ref prop);
4715 if ((long)nitems > 0 && prop != IntPtr.Zero) {
4716 text = Marshal.PtrToStringUni (prop, (int)nitems);
4721 // fallback on the non-_NET property
4724 textptr = IntPtr.Zero;
4726 XFetchName(DisplayHandle, Hwnd.ObjectFromHandle(handle).whole_window, ref textptr);
4727 if (textptr != IntPtr.Zero) {
4728 text = Marshal.PtrToStringAnsi(textptr);
4739 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)
4743 hwnd = Hwnd.ObjectFromHandle(handle);
4749 height = hwnd.height;
4751 PerformNCCalc(hwnd);
4753 client_width = hwnd.ClientRect.Width;
4754 client_height = hwnd.ClientRect.Height;
4759 // Should we throw an exception or fail silently?
4760 // throw new ArgumentException("Called with an invalid window handle", "handle");
4770 internal override FormWindowState GetWindowState(IntPtr handle)
4774 hwnd = Hwnd.ObjectFromHandle(handle);
4776 if (hwnd.cached_window_state == (FormWindowState)(-1))
4777 hwnd.cached_window_state = UpdateWindowState (handle);
4779 return hwnd.cached_window_state;
4782 FormWindowState UpdateWindowState (IntPtr handle) {
4787 IntPtr prop = IntPtr.Zero;
4791 XWindowAttributes attributes;
4794 hwnd = Hwnd.ObjectFromHandle(handle);
4798 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);
4799 if (((long)nitems > 0) && (prop != IntPtr.Zero)) {
4800 for (int i = 0; i < (long)nitems; i++) {
4801 atom = (IntPtr)Marshal.ReadInt32(prop, i * 4);
4802 if ((atom == _NET_WM_STATE_MAXIMIZED_HORZ) || (atom == _NET_WM_STATE_MAXIMIZED_VERT)) {
4804 } else if (atom == _NET_WM_STATE_HIDDEN) {
4812 return FormWindowState.Minimized;
4813 } else if (maximized == 2) {
4814 return FormWindowState.Maximized;
4817 attributes = new XWindowAttributes();
4818 XGetWindowAttributes(DisplayHandle, hwnd.client_window, ref attributes);
4819 if (attributes.map_state == MapState.IsUnmapped) {
4820 return (FormWindowState)(-1);
4824 return FormWindowState.Normal;
4827 internal override void GrabInfo(out IntPtr handle, out bool GrabConfined, out Rectangle GrabArea)
4830 GrabConfined = Grab.Confined;
4831 GrabArea = Grab.Area;
4834 internal override void GrabWindow(IntPtr handle, IntPtr confine_to_handle)
4837 IntPtr confine_to_window;
4839 confine_to_window = IntPtr.Zero;
4841 if (confine_to_handle != IntPtr.Zero) {
4842 XWindowAttributes attributes = new XWindowAttributes();
4844 hwnd = Hwnd.ObjectFromHandle(confine_to_handle);
4847 XGetWindowAttributes(DisplayHandle, hwnd.client_window, ref attributes);
4849 Grab.Area.X = attributes.x;
4850 Grab.Area.Y = attributes.y;
4851 Grab.Area.Width = attributes.width;
4852 Grab.Area.Height = attributes.height;
4853 Grab.Confined = true;
4854 confine_to_window = hwnd.client_window;
4859 hwnd = Hwnd.ObjectFromHandle(handle);
4862 XGrabPointer(DisplayHandle, hwnd.client_window, false,
4863 EventMask.ButtonPressMask | EventMask.ButtonMotionMask |
4864 EventMask.ButtonReleaseMask | EventMask.PointerMotionMask |
4865 EventMask.PointerMotionHintMask | EventMask.LeaveWindowMask,
4866 GrabMode.GrabModeAsync, GrabMode.GrabModeAsync, confine_to_window, IntPtr.Zero, IntPtr.Zero);
4870 internal override void UngrabWindow(IntPtr hwnd)
4873 XUngrabPointer(DisplayHandle, IntPtr.Zero);
4874 XFlush(DisplayHandle);
4876 WindowUngrabbed (hwnd);
4879 void WindowUngrabbed (IntPtr hwnd) {
4880 bool was_grabbed = Grab.Hwnd != IntPtr.Zero;
4882 Grab.Hwnd = IntPtr.Zero;
4883 Grab.Confined = false;
4886 // lparam should be the handle to the window gaining the mouse capture,
4887 // but X doesn't seem to give us that information.
4888 // Also only generate WM_CAPTURECHANGED if the window actually was grabbed.
4889 // X will send a NotifyUngrab, but since it comes late sometimes we're
4890 // calling WindowUngrabbed directly from UngrabWindow in order to send
4891 // this WM right away.
4892 SendMessage (hwnd, Msg.WM_CAPTURECHANGED, IntPtr.Zero, IntPtr.Zero);
4896 internal override void HandleException(Exception e)
4898 StackTrace st = new StackTrace(e, true);
4899 Console.WriteLine("Exception '{0}'", e.Message+st.ToString());
4900 Console.WriteLine("{0}{1}", e.Message, st.ToString());
4903 internal override void Invalidate(IntPtr handle, Rectangle rc, bool clear)
4907 hwnd = Hwnd.ObjectFromHandle(handle);
4910 AddExpose (hwnd, true, hwnd.X, hwnd.Y, hwnd.Width, hwnd.Height);
4912 AddExpose (hwnd, true, rc.X, rc.Y, rc.Width, rc.Height);
4916 internal override void InvalidateNC (IntPtr handle)
4920 hwnd = Hwnd.ObjectFromHandle(handle);
4922 AddExpose (hwnd, hwnd.WholeWindow == hwnd.ClientWindow, 0, 0, hwnd.Width, hwnd.Height);
4925 internal override bool IsEnabled(IntPtr handle)
4927 Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
4928 return (hwnd != null && hwnd.Enabled);
4931 internal override bool IsVisible(IntPtr handle)
4933 Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
4934 return (hwnd != null && hwnd.visible);
4937 internal override void KillTimer(Timer timer)
4939 XEventQueue queue = (XEventQueue) MessageQueues [timer.thread];
4941 if (queue == null) {
4942 // This isn't really an error, MS doesn't start the timer if
4943 // it has no assosciated queue. In this case, remove the timer
4944 // from the list of unattached timers (if it was enabled).
4945 lock (unattached_timer_list) {
4946 if (unattached_timer_list.Contains (timer))
4947 unattached_timer_list.Remove (timer);
4951 queue.timer_list.Remove (timer);
4954 internal override void MenuToScreen(IntPtr handle, ref int x, ref int y)
4961 hwnd = Hwnd.ObjectFromHandle(handle);
4964 XTranslateCoordinates(DisplayHandle, hwnd.whole_window, RootWindow, x, y, out dest_x_return, out dest_y_return, out child);
4971 internal override void OverrideCursor(IntPtr cursor)
4973 if (Grab.Hwnd != IntPtr.Zero) {
4974 XChangeActivePointerGrab (DisplayHandle,
4975 EventMask.ButtonMotionMask |
4976 EventMask.PointerMotionMask |
4977 EventMask.PointerMotionHintMask |
4978 EventMask.ButtonPressMask |
4979 EventMask.ButtonReleaseMask,
4980 cursor, IntPtr.Zero);
4984 OverrideCursorHandle = cursor;
4987 internal override PaintEventArgs PaintEventStart(ref Message msg, IntPtr handle, bool client)
4989 PaintEventArgs paint_event;
4994 // handle (and paint_hwnd) refers to the window that is should be painted.
4995 // msg.HWnd (and hwnd) refers to the window that got the paint message.
4998 hwnd = Hwnd.ObjectFromHandle(msg.HWnd);
4999 if (msg.HWnd == handle) {
5002 paint_hwnd = Hwnd.ObjectFromHandle (handle);
5005 if (Caret.Visible == true) {
5006 Caret.Paused = true;
5013 dc = Graphics.FromHwnd (paint_hwnd.client_window);
5015 Region clip_region = new Region ();
5016 clip_region.MakeEmpty();
5018 foreach (Rectangle r in hwnd.ClipRectangles) {
5019 /* Expand the region slightly.
5022 Rectangle r2 = Rectangle.FromLTRB (r.Left, r.Top, r.Right, r.Bottom + 1);
5023 clip_region.Union (r2);
5026 if (hwnd.UserClip != null) {
5027 clip_region.Intersect(hwnd.UserClip);
5030 dc.Clip = clip_region;
5031 paint_event = new PaintEventArgs(dc, hwnd.Invalid);
5032 hwnd.expose_pending = false;
5034 hwnd.ClearInvalidArea();
5036 hwnd.drawing_stack.Push (paint_event);
5037 hwnd.drawing_stack.Push (dc);
5041 dc = Graphics.FromHwnd (paint_hwnd.whole_window);
5043 if (!hwnd.nc_invalid.IsEmpty) {
5044 dc.SetClip (hwnd.nc_invalid);
5045 paint_event = new PaintEventArgs(dc, hwnd.nc_invalid);
5047 paint_event = new PaintEventArgs(dc, new Rectangle(0, 0, hwnd.width, hwnd.height));
5049 hwnd.nc_expose_pending = false;
5051 hwnd.ClearNcInvalidArea ();
5053 hwnd.drawing_stack.Push (paint_event);
5054 hwnd.drawing_stack.Push (dc);
5060 internal override void PaintEventEnd(ref Message msg, IntPtr handle, bool client)
5064 hwnd = Hwnd.ObjectFromHandle (msg.HWnd);
5066 Graphics dc = (Graphics)hwnd.drawing_stack.Pop ();
5070 PaintEventArgs pe = (PaintEventArgs)hwnd.drawing_stack.Pop();
5071 pe.SetGraphics (null);
5074 if (Caret.Visible == true) {
5076 Caret.Paused = false;
5080 [MonoTODO("Implement filtering and PM_NOREMOVE")]
5081 internal override bool PeekMessage(Object queue_id, ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax, uint flags)
5083 XEventQueue queue = (XEventQueue) queue_id;
5086 if ((flags & (uint)PeekMessageFlags.PM_REMOVE) == 0) {
5087 throw new NotImplementedException("PeekMessage PM_NOREMOVE is not implemented yet"); // FIXME - Implement PM_NOREMOVE flag
5091 if (queue.Count > 0) {
5094 // Only call UpdateMessageQueue if real events are pending
5095 // otherwise we go to sleep on the socket
5096 if (XPending(DisplayHandle) != 0) {
5097 UpdateMessageQueue((XEventQueue)queue_id);
5099 } else if (((XEventQueue)queue_id).Paint.Count > 0) {
5104 CheckTimers(queue.timer_list, DateTime.UtcNow);
5109 return GetMessage(queue_id, ref msg, hWnd, wFilterMin, wFilterMax);
5112 internal override bool PostMessage (IntPtr handle, Msg message, IntPtr wparam, IntPtr lparam)
5114 XEvent xevent = new XEvent ();
5115 Hwnd hwnd = Hwnd.ObjectFromHandle(handle);
5117 xevent.type = XEventName.ClientMessage;
5118 xevent.ClientMessageEvent.display = DisplayHandle;
5121 xevent.ClientMessageEvent.window = hwnd.whole_window;
5123 xevent.ClientMessageEvent.window = IntPtr.Zero;
5126 xevent.ClientMessageEvent.message_type = (IntPtr) PostAtom;
5127 xevent.ClientMessageEvent.format = 32;
5128 xevent.ClientMessageEvent.ptr1 = handle;
5129 xevent.ClientMessageEvent.ptr2 = (IntPtr) message;
5130 xevent.ClientMessageEvent.ptr3 = wparam;
5131 xevent.ClientMessageEvent.ptr4 = lparam;
5134 hwnd.Queue.EnqueueLocked (xevent);
5136 ThreadQueue(Thread.CurrentThread).EnqueueLocked (xevent);
5141 internal override void PostQuitMessage(int exitCode)
5143 ApplicationContext ctx = Application.MWFThread.Current.Context;
5144 Form f = ctx != null ? ctx.MainForm : null;
5146 PostMessage (Application.MWFThread.Current.Context.MainForm.window.Handle, Msg.WM_QUIT, IntPtr.Zero, IntPtr.Zero);
5148 PostMessage (FosterParent, Msg.WM_QUIT, IntPtr.Zero, IntPtr.Zero);
5149 XFlush(DisplayHandle);
5152 internal override void RequestAdditionalWM_NCMessages(IntPtr hwnd, bool hover, bool leave)
5157 internal override void RequestNCRecalc(IntPtr handle)
5161 hwnd = Hwnd.ObjectFromHandle(handle);
5167 PerformNCCalc(hwnd);
5168 SendMessage(handle, Msg.WM_WINDOWPOSCHANGED, IntPtr.Zero, IntPtr.Zero);
5169 InvalidateNC(handle);
5172 internal override void ResetMouseHover(IntPtr handle)
5176 hwnd = Hwnd.ObjectFromHandle(handle);
5181 HoverState.Timer.Enabled = true;
5182 HoverState.X = mouse_position.X;
5183 HoverState.Y = mouse_position.Y;
5184 HoverState.Window = handle;
5188 internal override void ScreenToClient(IntPtr handle, ref int x, ref int y)
5195 hwnd = Hwnd.ObjectFromHandle(handle);
5198 XTranslateCoordinates (DisplayHandle, RootWindow, hwnd.client_window, x, y, out dest_x_return, out dest_y_return, out child);
5205 internal override void ScreenToMenu(IntPtr handle, ref int x, ref int y)
5212 hwnd = Hwnd.ObjectFromHandle(handle);
5215 XTranslateCoordinates (DisplayHandle, RootWindow, hwnd.whole_window, x, y, out dest_x_return, out dest_y_return, out child);
5218 Form form = Control.FromHandle (handle) as Form;
5219 if (form != null && form.window_manager != null) {
5220 dest_y_return -= form.window_manager.TitleBarHeight;
5227 bool GraphicsExposePredicate (IntPtr display, ref XEvent xevent, IntPtr arg)
5229 return (xevent.type == XEventName.GraphicsExpose || xevent.type == XEventName.NoExpose) &&
5230 arg == xevent.GraphicsExposeEvent.drawable;
5233 delegate bool EventPredicate (IntPtr display, ref XEvent xevent, IntPtr arg);
5235 void ProcessGraphicsExpose (Hwnd hwnd)
5237 XEvent xevent = new XEvent ();
5238 IntPtr handle = Hwnd.HandleFromObject (hwnd);
5239 EventPredicate predicate = GraphicsExposePredicate;
5242 XIfEvent (Display, ref xevent, predicate, handle);
5243 if (xevent.type != XEventName.GraphicsExpose)
5246 AddExpose (hwnd, xevent.ExposeEvent.window == hwnd.ClientWindow, xevent.GraphicsExposeEvent.x, xevent.GraphicsExposeEvent.y,
5247 xevent.GraphicsExposeEvent.width, xevent.GraphicsExposeEvent.height);
5249 if (xevent.GraphicsExposeEvent.count == 0)
5254 internal override void ScrollWindow(IntPtr handle, Rectangle area, int XAmount, int YAmount, bool with_children)
5258 XGCValues gc_values;
5260 hwnd = Hwnd.ObjectFromHandle(handle);
5262 Rectangle r = Rectangle.Intersect (hwnd.Invalid, area);
5264 /* We have an invalid area in the window we're scrolling.
5265 Adjust our stored invalid rectangle to to match the scrolled amount */
5280 if (area.Contains (hwnd.Invalid))
5281 hwnd.ClearInvalidArea ();
5282 hwnd.AddInvalidArea(r);
5285 gc_values = new XGCValues();
5287 if (with_children) {
5288 gc_values.subwindow_mode = GCSubwindowMode.IncludeInferiors;
5291 gc = XCreateGC(DisplayHandle, hwnd.client_window, IntPtr.Zero, ref gc_values);
5293 Rectangle visible_rect = GetTotalVisibleArea (hwnd.client_window);
5294 visible_rect.Intersect (area);
5296 Rectangle dest_rect = visible_rect;
5297 dest_rect.Y += YAmount;
5298 dest_rect.X += XAmount;
5299 dest_rect.Intersect (area);
5301 Point src = new Point (dest_rect.X - XAmount, dest_rect.Y - YAmount);
5302 XCopyArea (DisplayHandle, hwnd.client_window, hwnd.client_window, gc, src.X, src.Y,
5303 dest_rect.Width, dest_rect.Height, dest_rect.X, dest_rect.Y);
5305 Rectangle dirty_area = GetDirtyArea (area, dest_rect, XAmount, YAmount);
5306 AddExpose (hwnd, true, dirty_area.X, dirty_area.Y, dirty_area.Width, dirty_area.Height);
5308 ProcessGraphicsExpose (hwnd);
5310 XFreeGC(DisplayHandle, gc);
5313 internal override void ScrollWindow(IntPtr handle, int XAmount, int YAmount, bool with_children)
5318 hwnd = Hwnd.GetObjectFromWindow(handle);
5320 rect = hwnd.ClientRect;
5323 ScrollWindow(handle, rect, XAmount, YAmount, with_children);
5326 Rectangle GetDirtyArea (Rectangle total_area, Rectangle valid_area, int XAmount, int YAmount)
5328 Rectangle dirty_area = total_area;
5331 dirty_area.Height -= valid_area.Height;
5332 else if (YAmount < 0) {
5333 dirty_area.Height -= valid_area.Height;
5334 dirty_area.Y += valid_area.Height;
5338 dirty_area.Width -= valid_area.Width;
5339 else if (XAmount < 0) {
5340 dirty_area.Width -= valid_area.Width;
5341 dirty_area.X += valid_area.Width;
5347 Rectangle GetTotalVisibleArea (IntPtr handle)
5349 Control c = Control.FromHandle (handle);
5351 Rectangle visible_area = c.ClientRectangle;
5352 visible_area.Location = c.PointToScreen (Point.Empty);
5354 for (Control parent = c.Parent; parent != null; parent = parent.Parent) {
5355 if (!parent.IsHandleCreated || !parent.Visible)
5356 return visible_area; // Non visible, not need to finish computations
5358 Rectangle r = parent.ClientRectangle;
5359 r.Location = parent.PointToScreen (Point.Empty);
5361 visible_area.Intersect (r);
5364 visible_area.Location = c.PointToClient (visible_area.Location);
5365 return visible_area;
5368 internal override void SendAsyncMethod (AsyncMethodData method)
5371 XEvent xevent = new XEvent ();
5373 hwnd = Hwnd.ObjectFromHandle(method.Handle);
5375 xevent.type = XEventName.ClientMessage;
5376 xevent.ClientMessageEvent.display = DisplayHandle;
5377 xevent.ClientMessageEvent.window = method.Handle;
5378 xevent.ClientMessageEvent.message_type = (IntPtr)AsyncAtom;
5379 xevent.ClientMessageEvent.format = 32;
5380 xevent.ClientMessageEvent.ptr1 = (IntPtr) GCHandle.Alloc (method);
5382 hwnd.Queue.EnqueueLocked (xevent);
5387 delegate IntPtr WndProcDelegate (IntPtr hwnd, Msg message, IntPtr wParam, IntPtr lParam);
5389 internal override IntPtr SendMessage (IntPtr hwnd, Msg message, IntPtr wParam, IntPtr lParam)
5392 h = Hwnd.ObjectFromHandle(hwnd);
5394 if (h != null && h.queue != ThreadQueue (Thread.CurrentThread)) {
5395 AsyncMethodResult result;
5396 AsyncMethodData data;
5398 result = new AsyncMethodResult ();
5399 data = new AsyncMethodData ();
5402 data.Method = new WndProcDelegate (NativeWindow.WndProc);
5403 data.Args = new object[] { hwnd, message, wParam, lParam };
5404 data.Result = result;
5406 SendAsyncMethod (data);
5407 DriverDebug("Sending {0} message across.", message);
5411 string key = hwnd + ":" + message;
5412 if (messageHold[key] != null)
5413 messageHold[key] = ((int)messageHold[key]) - 1;
5414 return NativeWindow.WndProc(hwnd, message, wParam, lParam);
5417 internal override int SendInput(IntPtr handle, Queue keys)
5419 if (handle == IntPtr.Zero)
5422 int count = keys.Count;
5423 Hwnd hwnd = Hwnd.ObjectFromHandle(handle);
5425 while (keys.Count > 0) {
5427 MSG msg = (MSG)keys.Dequeue();
5429 XEvent xevent = new XEvent ();
5431 xevent.type = (msg.message == Msg.WM_KEYUP ? XEventName.KeyRelease : XEventName.KeyPress);
5432 xevent.KeyEvent.display = DisplayHandle;
5435 xevent.KeyEvent.window = hwnd.whole_window;
5437 xevent.KeyEvent.window = IntPtr.Zero;
5440 xevent.KeyEvent.keycode = Keyboard.ToKeycode((int)msg.wParam);
5442 hwnd.Queue.EnqueueLocked (xevent);
5447 internal override void SetAllowDrop (IntPtr handle, bool value)
5449 // We allow drop on all windows
5452 internal override DragDropEffects StartDrag (IntPtr handle, object data,
5453 DragDropEffects allowed_effects)
5455 Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
5458 throw new ArgumentException ("Attempt to begin drag from invalid window handle (" + handle.ToInt32 () + ").");
5460 return Dnd.StartDrag (hwnd.client_window, data, allowed_effects);
5463 internal override void SetBorderStyle(IntPtr handle, FormBorderStyle border_style)
5465 Form form = Control.FromHandle (handle) as Form;
5466 if (form != null && form.window_manager == null) {
5467 CreateParams cp = form.GetCreateParams ();
5468 if (border_style == FormBorderStyle.FixedToolWindow ||
5469 border_style == FormBorderStyle.SizableToolWindow ||
5470 cp.IsSet (WindowExStyles.WS_EX_TOOLWINDOW)) {
5471 form.window_manager = new ToolWindowManager (form);
5475 RequestNCRecalc(handle);
5478 internal override void SetCaretPos(IntPtr handle, int x, int y)
5480 if (Caret.Hwnd == handle) {
5487 Keyboard.SetCaretPos (Caret, handle, x, y);
5489 if (Caret.Visible == true) {
5491 Caret.Timer.Start();
5496 internal override void SetClipRegion(IntPtr handle, Region region)
5500 hwnd = Hwnd.ObjectFromHandle(handle);
5505 hwnd.UserClip = region;
5508 internal override void SetCursor(IntPtr handle, IntPtr cursor)
5512 if (OverrideCursorHandle == IntPtr.Zero) {
5513 if ((LastCursorWindow == handle) && (LastCursorHandle == cursor)) {
5517 LastCursorHandle = cursor;
5518 LastCursorWindow = handle;
5520 hwnd = Hwnd.ObjectFromHandle(handle);
5522 if (cursor != IntPtr.Zero) {
5523 XDefineCursor(DisplayHandle, hwnd.whole_window, cursor);
5525 XUndefineCursor(DisplayHandle, hwnd.whole_window);
5527 XFlush(DisplayHandle);
5532 hwnd = Hwnd.ObjectFromHandle(handle);
5534 XDefineCursor(DisplayHandle, hwnd.whole_window, OverrideCursorHandle);
5538 void QueryPointer (IntPtr display, IntPtr w, out IntPtr root, out IntPtr child,
5539 out int root_x, out int root_y, out int child_x, out int child_y,
5542 /* this code was written with the help of
5543 glance at gdk. I never would have realized we
5544 needed a loop in order to traverse down in the
5545 hierarchy. I would have assumed you'd get the
5546 most deeply nested child and have to do
5547 XQueryTree to move back up the hierarchy..
5548 stupid me, of course. */
5551 XGrabServer (display);
5553 XQueryPointer(display, w, out root, out c,
5554 out root_x, out root_y, out child_x, out child_y,
5560 IntPtr child_last = IntPtr.Zero;
5561 while (c != IntPtr.Zero) {
5563 XQueryPointer(display, c, out root, out c,
5564 out root_x, out root_y, out child_x, out child_y,
5567 XUngrabServer (display);
5573 internal override void SetCursorPos(IntPtr handle, int x, int y)
5575 if (handle == IntPtr.Zero) {
5578 int root_x, root_y, child_x, child_y, mask;
5581 * QueryPointer before warping
5582 * because if the warp is on
5583 * the RootWindow, the x/y are
5584 * relative to the current
5587 QueryPointer (DisplayHandle, RootWindow,
5590 out root_x, out root_y,
5591 out child_x, out child_y,
5594 XWarpPointer(DisplayHandle, IntPtr.Zero, IntPtr.Zero, 0, 0, 0, 0, x - root_x, y - root_y);
5596 XFlush (DisplayHandle);
5598 /* then we need to a
5599 * QueryPointer after warping
5600 * to manually generate a
5601 * motion event for the window
5604 QueryPointer (DisplayHandle, RootWindow,
5607 out root_x, out root_y,
5608 out child_x, out child_y,
5611 Hwnd child_hwnd = Hwnd.ObjectFromHandle(child);
5612 if (child_hwnd == null) {
5616 XEvent xevent = new XEvent ();
5618 xevent.type = XEventName.MotionNotify;
5619 xevent.MotionEvent.display = DisplayHandle;
5620 xevent.MotionEvent.window = child_hwnd.client_window;
5621 xevent.MotionEvent.root = RootWindow;
5622 xevent.MotionEvent.x = child_x;
5623 xevent.MotionEvent.y = child_y;
5624 xevent.MotionEvent.x_root = root_x;
5625 xevent.MotionEvent.y_root = root_y;
5626 xevent.MotionEvent.state = mask;
5628 child_hwnd.Queue.EnqueueLocked (xevent);
5633 hwnd = Hwnd.ObjectFromHandle(handle);
5635 XWarpPointer(DisplayHandle, IntPtr.Zero, hwnd.client_window, 0, 0, 0, 0, x, y);
5640 internal override void SetFocus(IntPtr handle)
5643 IntPtr prev_focus_window;
5645 hwnd = Hwnd.ObjectFromHandle(handle);
5647 if (hwnd.client_window == FocusWindow) {
5651 // Win32 doesn't do anything if disabled
5655 prev_focus_window = FocusWindow;
5656 FocusWindow = hwnd.client_window;
5658 if (prev_focus_window != IntPtr.Zero) {
5659 SendMessage(prev_focus_window, Msg.WM_KILLFOCUS, FocusWindow, IntPtr.Zero);
5661 Keyboard.FocusIn (FocusWindow);
5662 SendMessage(FocusWindow, Msg.WM_SETFOCUS, prev_focus_window, IntPtr.Zero);
5664 //XSetInputFocus(DisplayHandle, Hwnd.ObjectFromHandle(handle).client_window, RevertTo.None, IntPtr.Zero);
5667 internal override void SetIcon(IntPtr handle, Icon icon)
5671 hwnd = Hwnd.ObjectFromHandle(handle);
5673 SetIcon(hwnd, icon);
5677 internal override void SetMenu(IntPtr handle, Menu menu)
5681 hwnd = Hwnd.ObjectFromHandle(handle);
5684 RequestNCRecalc(handle);
5687 internal override void SetModal(IntPtr handle, bool Modal)
5690 ModalWindows.Push(handle);
5692 if (ModalWindows.Contains(handle)) {
5695 if (ModalWindows.Count > 0) {
5696 Activate((IntPtr)ModalWindows.Peek());
5700 Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
5701 Control ctrl = Control.FromHandle (handle);
5702 SetWMStyles (hwnd, ctrl.GetCreateParams ());
5705 internal override IntPtr SetParent(IntPtr handle, IntPtr parent)
5709 hwnd = Hwnd.ObjectFromHandle(handle);
5710 hwnd.parent = Hwnd.ObjectFromHandle(parent);
5713 DriverDebug("Parent for window {0} = {1}", XplatUI.Window(hwnd.Handle), XplatUI.Window(hwnd.parent != null ? hwnd.parent.Handle : IntPtr.Zero));
5714 XReparentWindow(DisplayHandle, hwnd.whole_window, hwnd.parent == null ? FosterParent : hwnd.parent.client_window, hwnd.x, hwnd.y);
5720 internal override void SetTimer (Timer timer)
5722 XEventQueue queue = (XEventQueue) MessageQueues [timer.thread];
5724 if (queue == null) {
5725 // This isn't really an error, MS doesn't start the timer if
5726 // it has no assosciated queue at this stage (it will be
5727 // enabled when a window is activated).
5728 unattached_timer_list.Add (timer);
5731 queue.timer_list.Add (timer);
5735 internal override bool SetTopmost(IntPtr handle, bool enabled)
5738 Hwnd hwnd = Hwnd.ObjectFromHandle(handle);
5743 SendNetWMMessage(hwnd.WholeWindow, _NET_WM_STATE, (IntPtr) NetWmStateRequest._NET_WM_STATE_ADD, _NET_WM_STATE_ABOVE, IntPtr.Zero);
5745 int[] atoms = new int[8];
5746 atoms[0] = _NET_WM_STATE_ABOVE.ToInt32();
5747 XChangeProperty(DisplayHandle, hwnd.whole_window, _NET_WM_STATE, (IntPtr)Atom.XA_ATOM, 32, PropertyMode.Replace, atoms, 1);
5753 SendNetWMMessage(hwnd.WholeWindow, _NET_WM_STATE, (IntPtr) NetWmStateRequest._NET_WM_STATE_REMOVE, _NET_WM_STATE_ABOVE, IntPtr.Zero);
5755 XDeleteProperty(DisplayHandle, hwnd.whole_window, _NET_WM_STATE);
5761 internal override bool SetOwner(IntPtr handle, IntPtr handle_owner)
5766 hwnd = Hwnd.ObjectFromHandle(handle);
5768 if (handle_owner != IntPtr.Zero) {
5769 hwnd_owner = Hwnd.ObjectFromHandle(handle_owner);
5775 atoms[0] = _NET_WM_WINDOW_TYPE_NORMAL.ToInt32();
5776 XChangeProperty(DisplayHandle, hwnd.whole_window, _NET_WM_WINDOW_TYPE, (IntPtr)Atom.XA_ATOM, 32, PropertyMode.Replace, atoms, 1);
5778 if (hwnd_owner != null) {
5779 XSetTransientForHint(DisplayHandle, hwnd.whole_window, hwnd_owner.whole_window);
5781 XSetTransientForHint(DisplayHandle, hwnd.whole_window, RootWindow);
5786 XDeleteProperty(DisplayHandle, hwnd.whole_window, (IntPtr)Atom.XA_WM_TRANSIENT_FOR);
5792 internal override bool SetVisible (IntPtr handle, bool visible, bool activate)
5796 hwnd = Hwnd.ObjectFromHandle(handle);
5797 hwnd.visible = visible;
5801 MapWindow(hwnd, WindowType.Both);
5803 if (Control.FromHandle(handle) is Form) {
5806 s = ((Form)Control.FromHandle(handle)).WindowState;
5809 case FormWindowState.Minimized: SetWindowState(handle, FormWindowState.Minimized); break;
5810 case FormWindowState.Maximized: SetWindowState(handle, FormWindowState.Maximized); break;
5814 SendMessage(handle, Msg.WM_WINDOWPOSCHANGED, IntPtr.Zero, IntPtr.Zero);
5817 UnmapWindow(hwnd, WindowType.Both);
5823 internal override void SetWindowMinMax(IntPtr handle, Rectangle maximized, Size min, Size max)
5825 Control ctrl = Control.FromHandle (handle);
5826 SetWindowMinMax (handle, maximized, min, max, ctrl != null ? ctrl.GetCreateParams () : null);
5829 internal void SetWindowMinMax (IntPtr handle, Rectangle maximized, Size min, Size max, CreateParams cp)
5835 hwnd = Hwnd.ObjectFromHandle(handle);
5840 min.Width = Math.Max (min.Width, SystemInformation.MinimumWindowSize.Width);
5841 min.Height = Math.Max (min.Height, SystemInformation.MinimumWindowSize.Height);
5843 hints = new XSizeHints();
5845 XGetWMNormalHints(DisplayHandle, hwnd.whole_window, ref hints, out dummy);
5846 if ((min != Size.Empty) && (min.Width > 0) && (min.Height > 0)) {
5848 min = TranslateWindowSizeToXWindowSize (cp, min);
5849 hints.flags = (IntPtr)((int)hints.flags | (int)XSizeHintsFlags.PMinSize);
5850 hints.min_width = min.Width;
5851 hints.min_height = min.Height;
5854 if ((max != Size.Empty) && (max.Width > 0) && (max.Height > 0)) {
5856 max = TranslateWindowSizeToXWindowSize (cp, max);
5857 hints.flags = (IntPtr)((int)hints.flags | (int)XSizeHintsFlags.PMaxSize);
5858 hints.max_width = max.Width;
5859 hints.max_height = max.Height;
5862 if (hints.flags != IntPtr.Zero) {
5863 // The Metacity team has decided that they won't care about this when clicking the maximize icon,
5864 // they will maximize the window to fill the screen/parent no matter what.
5865 // http://bugzilla.ximian.com/show_bug.cgi?id=80021
5866 XSetWMNormalHints(DisplayHandle, hwnd.whole_window, ref hints);
5869 if ((maximized != Rectangle.Empty) && (maximized.Width > 0) && (maximized.Height > 0)) {
5871 maximized.Size = TranslateWindowSizeToXWindowSize (cp);
5872 hints.flags = (IntPtr)XSizeHintsFlags.PPosition;
5873 hints.x = maximized.X;
5874 hints.y = maximized.Y;
5875 hints.width = maximized.Width;
5876 hints.height = maximized.Height;
5878 // Metacity does not seem to follow this constraint for maximized (zoomed) windows
5879 XSetZoomHints(DisplayHandle, hwnd.whole_window, ref hints);
5884 internal override void SetWindowPos(IntPtr handle, int x, int y, int width, int height)
5888 hwnd = Hwnd.ObjectFromHandle(handle);
5894 // Win32 automatically changes negative width/height to 0.
5900 // X requires a sanity check for width & height; otherwise it dies
5901 if (hwnd.zero_sized && width > 0 && height > 0) {
5903 MapWindow(hwnd, WindowType.Whole);
5905 hwnd.zero_sized = false;
5908 if ((width < 1) || (height < 1)) {
5909 hwnd.zero_sized = true;
5910 UnmapWindow(hwnd, WindowType.Whole);
5913 // Save a server roundtrip (and prevent a feedback loop)
5914 if ((hwnd.x == x) && (hwnd.y == y) &&
5915 (hwnd.width == width) && (hwnd.height == height)) {
5919 if (!hwnd.zero_sized) {
5924 hwnd.height = height;
5925 SendMessage(hwnd.client_window, Msg.WM_WINDOWPOSCHANGED, IntPtr.Zero, IntPtr.Zero);
5927 if (hwnd.fixed_size) {
5928 SetWindowMinMax(handle, Rectangle.Empty, new Size(width, height), new Size(width, height));
5932 Control ctrl = Control.FromHandle (handle);
5933 Size TranslatedSize = TranslateWindowSizeToXWindowSize (ctrl.GetCreateParams (), new Size (width, height));
5934 MoveResizeWindow (DisplayHandle, hwnd.whole_window, x, y, TranslatedSize.Width, TranslatedSize.Height);
5935 PerformNCCalc(hwnd);
5939 // Update our position/size immediately, so
5940 // that future calls to SetWindowPos aren't
5941 // kept from calling XMoveResizeWindow (by the
5942 // "Save a server roundtrip" block above).
5946 hwnd.height = height;
5947 hwnd.ClientRect = Rectangle.Empty;
5950 internal override void SetWindowState(IntPtr handle, FormWindowState state)
5952 FormWindowState current_state;
5955 hwnd = Hwnd.ObjectFromHandle(handle);
5957 current_state = GetWindowState(handle);
5959 if (current_state == state) {
5964 case FormWindowState.Normal: {
5966 if (current_state == FormWindowState.Minimized) {
5967 MapWindow(hwnd, WindowType.Both);
5968 } else if (current_state == FormWindowState.Maximized) {
5969 SendNetWMMessage(hwnd.whole_window, _NET_WM_STATE, (IntPtr)2 /* toggle */, _NET_WM_STATE_MAXIMIZED_HORZ, _NET_WM_STATE_MAXIMIZED_VERT);
5976 case FormWindowState.Minimized: {
5978 if (current_state == FormWindowState.Maximized) {
5979 SendNetWMMessage(hwnd.whole_window, _NET_WM_STATE, (IntPtr)2 /* toggle */, _NET_WM_STATE_MAXIMIZED_HORZ, _NET_WM_STATE_MAXIMIZED_VERT);
5981 XIconifyWindow(DisplayHandle, hwnd.whole_window, ScreenNo);
5986 case FormWindowState.Maximized: {
5988 if (current_state == FormWindowState.Minimized) {
5989 MapWindow(hwnd, WindowType.Both);
5992 SendNetWMMessage(hwnd.whole_window, _NET_WM_STATE, (IntPtr)1 /* Add */, _NET_WM_STATE_MAXIMIZED_HORZ, _NET_WM_STATE_MAXIMIZED_VERT);
6000 internal override void SetWindowStyle(IntPtr handle, CreateParams cp)
6004 hwnd = Hwnd.ObjectFromHandle(handle);
6005 SetHwndStyles(hwnd, cp);
6006 SetWMStyles(hwnd, cp);
6009 internal override double GetWindowTransparency(IntPtr handle)
6014 internal override void SetWindowTransparency(IntPtr handle, double transparency, Color key)
6019 hwnd = Hwnd.ObjectFromHandle(handle);
6025 hwnd.opacity = (uint)(0xffffffff * transparency);
6026 opacity = (IntPtr)((int)hwnd.opacity);
6028 IntPtr w = hwnd.whole_window;
6029 if (hwnd.reparented)
6030 w = XGetParent (hwnd.whole_window);
6031 XChangeProperty(DisplayHandle, w, _NET_WM_WINDOW_OPACITY, (IntPtr)Atom.XA_CARDINAL, 32, PropertyMode.Replace, ref opacity, 1);
6034 internal override bool SetZOrder(IntPtr handle, IntPtr after_handle, bool top, bool bottom)
6036 Hwnd hwnd = Hwnd.ObjectFromHandle(handle);
6044 XRaiseWindow(DisplayHandle, hwnd.whole_window);
6047 } else if (!bottom) {
6048 Hwnd after_hwnd = null;
6050 if (after_handle != IntPtr.Zero) {
6051 after_hwnd = Hwnd.ObjectFromHandle(after_handle);
6054 XWindowChanges values = new XWindowChanges();
6056 if (after_hwnd == null) {
6057 // Work around metacity 'issues'
6061 atoms[0] = unixtime();
6062 XChangeProperty(DisplayHandle, hwnd.whole_window, _NET_WM_USER_TIME, (IntPtr)Atom.XA_CARDINAL, 32, PropertyMode.Replace, atoms, 1);
6064 XRaiseWindow(DisplayHandle, hwnd.whole_window);
6065 SendNetWMMessage(hwnd.whole_window, _NET_ACTIVE_WINDOW, (IntPtr)1, IntPtr.Zero, IntPtr.Zero);
6067 //throw new ArgumentNullException("after_handle", "Need sibling to adjust z-order");
6070 values.sibling = after_hwnd.whole_window;
6071 values.stack_mode = StackMode.Below;
6074 XConfigureWindow(DisplayHandle, hwnd.whole_window, ChangeWindowFlags.CWStackMode | ChangeWindowFlags.CWSibling, ref values);
6079 XLowerWindow(DisplayHandle, hwnd.whole_window);
6086 internal override void ShowCursor(bool show)
6088 ; // FIXME - X11 doesn't 'hide' the cursor. we could create an empty cursor
6091 internal override object StartLoop(Thread thread)
6093 XEventQueue q = ThreadQueue(thread);
6097 internal override TransparencySupport SupportsTransparency()
6099 // We need to check if the x compositing manager is running
6100 return TransparencySupport.Set;
6103 internal override bool SystrayAdd(IntPtr handle, string tip, Icon icon, out ToolTip tt)
6105 GetSystrayManagerWindow();
6107 if (SystrayMgrWindow != IntPtr.Zero) {
6108 XSizeHints size_hints;
6111 hwnd = Hwnd.ObjectFromHandle(handle);
6112 DriverDebug("Adding Systray Whole:{0:X}, Client:{1:X}", hwnd.whole_window.ToInt32(), hwnd.client_window.ToInt32());
6115 if (hwnd.client_window != hwnd.whole_window) {
6116 Keyboard.DestroyICForWindow (hwnd.client_window);
6117 XDestroyWindow(DisplayHandle, hwnd.client_window);
6118 hwnd.client_window = hwnd.whole_window;
6121 /* by virtue of the way the tests are ordered when determining if it's PAINT
6122 or NCPAINT, client_window == whole_window will always be PAINT. So, if we're
6123 waiting on an nc_expose, drop it and remove the hwnd from the list (unless
6124 there's a pending expose). */
6125 if (hwnd.nc_expose_pending) {
6126 hwnd.nc_expose_pending = false;
6127 if (!hwnd.expose_pending)
6128 hwnd.Queue.Paint.Remove (hwnd);
6131 // We are going to be directly mapped by the system tray, so mark as mapped
6132 // so we can later properly unmap it.
6135 size_hints = new XSizeHints();
6137 size_hints.flags = (IntPtr)(XSizeHintsFlags.PMinSize | XSizeHintsFlags.PMaxSize | XSizeHintsFlags.PBaseSize);
6139 size_hints.min_width = 24;
6140 size_hints.min_height = 24;
6141 size_hints.max_width = 24;
6142 size_hints.max_height = 24;
6143 size_hints.base_width = 24;
6144 size_hints.base_height = 24;
6146 XSetWMNormalHints(DisplayHandle, hwnd.whole_window, ref size_hints);
6148 int[] atoms = new int[2];
6149 atoms [0] = 1; // Version 1
6150 atoms [1] = 1; // we want to be mapped
6152 // This line cost me 3 days...
6153 XChangeProperty(DisplayHandle, hwnd.whole_window, _XEMBED_INFO, _XEMBED_INFO, 32, PropertyMode.Replace, atoms, 2);
6155 // Need to pick some reasonable defaults
6157 tt.AutomaticDelay = 350;
6158 tt.InitialDelay = 250;
6159 tt.ReshowDelay = 250;
6160 tt.ShowAlways = true;
6162 if ((tip != null) && (tip != string.Empty)) {
6163 tt.SetToolTip(Control.FromHandle(handle), tip);
6169 SendNetClientMessage(SystrayMgrWindow, _NET_SYSTEM_TRAY_OPCODE, IntPtr.Zero, (IntPtr)SystrayRequest.SYSTEM_TRAY_REQUEST_DOCK, hwnd.whole_window);
6177 internal override bool SystrayChange(IntPtr handle, string tip, Icon icon, ref ToolTip tt)
6181 control = Control.FromHandle(handle);
6182 if (control != null && tt != null) {
6183 tt.SetToolTip(control, tip);
6185 SendMessage(handle, Msg.WM_PAINT, IntPtr.Zero, IntPtr.Zero);
6192 internal override void SystrayRemove(IntPtr handle, ref ToolTip tt)
6195 SetVisible (handle, false, false);
6197 // The caller can now re-dock it later...
6203 // Close any balloon window *we* fired.
6204 ThemeEngine.Current.HideBalloonWindow (handle);
6209 internal override void SystrayBalloon(IntPtr handle, int timeout, string title, string text, ToolTipIcon icon)
6211 ThemeEngine.Current.ShowBalloonWindow (handle, timeout, title, text, icon);
6212 SendMessage(handle, Msg.WM_USER, IntPtr.Zero, (IntPtr) Msg.NIN_BALLOONSHOW);
6216 internal override bool Text(IntPtr handle, string text)
6220 hwnd = Hwnd.ObjectFromHandle(handle);
6223 XChangeProperty(DisplayHandle, hwnd.whole_window, _NET_WM_NAME, UTF8_STRING, 8,
6224 PropertyMode.Replace, text, Encoding.UTF8.GetByteCount (text));
6226 // XXX this has problems with UTF8.
6227 // we need to either use the actual
6228 // text if it's latin-1, or convert it
6229 // to compound text if it's in a
6230 // different charset.
6231 XStoreName(DisplayHandle, Hwnd.ObjectFromHandle(handle).whole_window, text);
6236 internal override bool TranslateMessage(ref MSG msg)
6238 return Keyboard.TranslateMessage (ref msg);
6241 internal override void UpdateWindow(IntPtr handle)
6245 hwnd = Hwnd.ObjectFromHandle(handle);
6247 if (!hwnd.visible || !hwnd.expose_pending || !hwnd.Mapped) {
6251 SendMessage(handle, Msg.WM_PAINT, IntPtr.Zero, IntPtr.Zero);
6252 hwnd.Queue.Paint.Remove(hwnd);
6255 internal override void CreateOffscreenDrawable (IntPtr handle,
6256 int width, int height,
6257 out object offscreen_drawable)
6260 int x_out, y_out, width_out, height_out, border_width_out, depth_out;
6262 XGetGeometry (DisplayHandle, handle,
6264 out x_out, out y_out,
6265 out width_out, out height_out,
6266 out border_width_out, out depth_out);
6268 IntPtr pixmap = XCreatePixmap (DisplayHandle, handle, width, height, depth_out);
6270 offscreen_drawable = pixmap;
6274 internal override void DestroyOffscreenDrawable (object offscreen_drawable)
6276 XFreePixmap (DisplayHandle, (IntPtr)offscreen_drawable);
6279 internal override Graphics GetOffscreenGraphics (object offscreen_drawable)
6281 return Graphics.FromHwnd ((IntPtr) offscreen_drawable);
6284 internal override void BlitFromOffscreen (IntPtr dest_handle,
6286 object offscreen_drawable,
6287 Graphics offscreen_dc,
6290 XGCValues gc_values;
6293 gc_values = new XGCValues();
6295 gc = XCreateGC (DisplayHandle, dest_handle, IntPtr.Zero, ref gc_values);
6297 XCopyArea (DisplayHandle, (IntPtr)offscreen_drawable, dest_handle,
6298 gc, r.X, r.Y, r.Width, r.Height, r.X, r.Y);
6300 XFreeGC (DisplayHandle, gc);
6303 #endregion // Public Static Methods
6306 internal override event EventHandler Idle;
6307 #endregion // Events
6312 #region Xcursor imports
6313 [DllImport ("libXcursor", EntryPoint = "XcursorLibraryLoadCursor")]
6314 internal extern static IntPtr XcursorLibraryLoadCursor (IntPtr display, [MarshalAs (UnmanagedType.LPStr)] string name);
6316 [DllImport ("libXcursor", EntryPoint = "XcursorLibraryLoadImages")]
6317 internal extern static IntPtr XcursorLibraryLoadImages ([MarshalAs (UnmanagedType.LPStr)] string file, IntPtr theme, int size);
6319 [DllImport ("libXcursor", EntryPoint = "XcursorImagesDestroy")]
6320 internal extern static void XcursorImagesDestroy (IntPtr images);
6322 [DllImport ("libXcursor", EntryPoint = "XcursorGetDefaultSize")]
6323 internal extern static int XcursorGetDefaultSize (IntPtr display);
6325 [DllImport ("libXcursor", EntryPoint = "XcursorImageLoadCursor")]
6326 internal extern static IntPtr XcursorImageLoadCursor (IntPtr display, IntPtr image);
6328 [DllImport ("libXcursor", EntryPoint = "XcursorGetTheme")]
6329 internal extern static IntPtr XcursorGetTheme (IntPtr display);
6332 [DllImport ("libX11", EntryPoint="XOpenDisplay")]
6333 internal extern static IntPtr XOpenDisplay(IntPtr display);
6334 [DllImport ("libX11", EntryPoint="XCloseDisplay")]
6335 internal extern static int XCloseDisplay(IntPtr display);
6336 [DllImport ("libX11", EntryPoint="XSynchronize")]
6337 internal extern static IntPtr XSynchronize(IntPtr display, bool onoff);
6339 [DllImport ("libX11", EntryPoint="XCreateWindow")]
6340 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);
6341 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)
6343 DebugHelper.TraceWriteLine ("XCreateWindow");
6344 return _XCreateWindow(display, parent, x, y, width, height,
6345 border_width, depth, xclass, visual, valuemask, ref attributes);
6347 [DllImport ("libX11", EntryPoint="XCreateSimpleWindow")]
6348 internal extern static IntPtr _XCreateSimpleWindow(IntPtr display, IntPtr parent, int x, int y, int width, int height, int border_width, UIntPtr border, UIntPtr background);
6349 internal static IntPtr XCreateSimpleWindow(IntPtr display, IntPtr parent, int x, int y, int width, int height, int border_width, UIntPtr border, UIntPtr background)
6351 DebugHelper.TraceWriteLine ("XCreateSimpleWindow");
6352 return _XCreateSimpleWindow(display, parent, x, y, width, height, border_width, border, background);
6354 [DllImport ("libX11", EntryPoint="XMapWindow")]
6355 internal extern static int _XMapWindow(IntPtr display, IntPtr window);
6356 internal static int XMapWindow(IntPtr display, IntPtr window)
6358 DebugHelper.TraceWriteLine ("XMapWindow");
6359 return _XMapWindow(display, window);
6361 [DllImport ("libX11", EntryPoint="XUnmapWindow")]
6362 internal extern static int _XUnmapWindow(IntPtr display, IntPtr window);
6363 internal static int XUnmapWindow(IntPtr display, IntPtr window)
6365 DebugHelper.TraceWriteLine ("XUnmapWindow");
6366 return _XUnmapWindow(display, window);
6368 [DllImport ("libX11", EntryPoint="XMapSubwindows")]
6369 internal extern static int _XMapSubindows(IntPtr display, IntPtr window);
6370 internal static int XMapSubindows(IntPtr display, IntPtr window)
6372 DebugHelper.TraceWriteLine ("XMapSubindows");
6373 return _XMapSubindows(display, window);
6375 [DllImport ("libX11", EntryPoint="XUnmapSubwindows")]
6376 internal extern static int _XUnmapSubwindows(IntPtr display, IntPtr window);
6377 internal static int XUnmapSubwindows(IntPtr display, IntPtr window)
6379 DebugHelper.TraceWriteLine ("XUnmapSubwindows");
6380 return _XUnmapSubwindows(display, window);
6382 [DllImport ("libX11", EntryPoint="XRootWindow")]
6383 internal extern static IntPtr _XRootWindow(IntPtr display, int screen_number);
6384 internal static IntPtr XRootWindow(IntPtr display, int screen_number)
6386 DebugHelper.TraceWriteLine ("XRootWindow");
6387 return _XRootWindow(display, screen_number);
6389 [DllImport ("libX11", EntryPoint="XNextEvent")]
6390 internal extern static IntPtr _XNextEvent(IntPtr display, ref XEvent xevent);
6391 internal static IntPtr XNextEvent(IntPtr display, ref XEvent xevent)
6393 DebugHelper.TraceWriteLine ("XNextEvent");
6394 return _XNextEvent(display, ref xevent);
6396 [DllImport ("libX11", EntryPoint="XConnectionNumber")]
6397 internal extern static int _XConnectionNumber (IntPtr display);
6398 internal static int XConnectionNumber (IntPtr display)
6400 DebugHelper.TraceWriteLine ("XConnectionNumber");
6401 return _XConnectionNumber (display);
6403 [DllImport ("libX11", EntryPoint="XPending")]
6404 internal extern static int _XPending (IntPtr display);
6405 internal static int XPending (IntPtr display)
6407 DebugHelper.TraceWriteLine ("XPending");
6408 DebugHelper.DumpCallers (3);
6409 return _XPending (display);
6411 [DllImport ("libX11", EntryPoint="XSelectInput")]
6412 internal extern static IntPtr _XSelectInput(IntPtr display, IntPtr window, IntPtr mask);
6413 internal static IntPtr XSelectInput(IntPtr display, IntPtr window, IntPtr mask)
6415 DebugHelper.TraceWriteLine ("XSelectInput");
6416 return _XSelectInput(display, window, mask);
6419 [DllImport ("libX11", EntryPoint="XDestroyWindow")]
6420 internal extern static int _XDestroyWindow(IntPtr display, IntPtr window);
6421 internal static int XDestroyWindow(IntPtr display, IntPtr window)
6423 DebugHelper.TraceWriteLine ("XDestroyWindow 0x{0:x}", window.ToInt32());
6424 return _XDestroyWindow(display, window);
6427 [DllImport ("libX11", EntryPoint="XReparentWindow")]
6428 internal extern static int _XReparentWindow(IntPtr display, IntPtr window, IntPtr parent, int x, int y);
6429 internal static int XReparentWindow(IntPtr display, IntPtr window, IntPtr parent, int x, int y)
6431 DebugHelper.TraceWriteLine ("XReparentWindow");
6432 return _XReparentWindow(display, window, parent, x, y);
6435 [DllImport ("libX11", EntryPoint="XMoveResizeWindow")]
6436 extern static int _XMoveResizeWindow(IntPtr display, IntPtr window, int x, int y, int width, int height);
6437 static int XMoveResizeWindow(IntPtr display, IntPtr window, int x, int y, int width, int height) {
6438 DebugHelper.TraceWriteLine ("XMoveResizeWindow");
6439 return _XMoveResizeWindow(display, window, x, y, width, height);
6442 internal static int MoveResizeWindow(IntPtr display, IntPtr window, int x, int y, int width, int height)
6444 int ret = XMoveResizeWindow (display, window, x, y, width, height);
6445 Keyboard.MoveCurrentCaretPos ();
6449 [DllImport ("libX11", EntryPoint="XResizeWindow")]
6450 internal extern static int _XResizeWindow(IntPtr display, IntPtr window, int width, int height);
6451 internal static int XResizeWindow(IntPtr display, IntPtr window, int width, int height)
6453 DebugHelper.TraceWriteLine ("XResizeWindow");
6454 return _XResizeWindow(display, window, width, height);
6457 [DllImport ("libX11", EntryPoint="XGetWindowAttributes")]
6458 internal extern static int _XGetWindowAttributes(IntPtr display, IntPtr window, ref XWindowAttributes attributes);
6459 internal static int XGetWindowAttributes(IntPtr display, IntPtr window, ref XWindowAttributes attributes)
6461 DebugHelper.TraceWriteLine ("XGetWindowAttributes");
6462 return _XGetWindowAttributes(display, window, ref attributes);
6465 [DllImport ("libX11", EntryPoint="XFlush")]
6466 internal extern static int _XFlush(IntPtr display);
6467 internal static int XFlush(IntPtr display)
6469 DebugHelper.TraceWriteLine ("XFlush");
6470 return _XFlush(display);
6473 [DllImport ("libX11", EntryPoint="XSetWMName")]
6474 internal extern static int _XSetWMName(IntPtr display, IntPtr window, ref XTextProperty text_prop);
6475 internal static int XSetWMName(IntPtr display, IntPtr window, ref XTextProperty text_prop)
6477 DebugHelper.TraceWriteLine ("XSetWMName");
6478 return _XSetWMName(display, window, ref text_prop);
6481 [DllImport ("libX11", EntryPoint="XStoreName")]
6482 internal extern static int _XStoreName(IntPtr display, IntPtr window, string window_name);
6483 internal static int XStoreName(IntPtr display, IntPtr window, string window_name)
6485 DebugHelper.TraceWriteLine ("XStoreName");
6486 return _XStoreName(display, window, window_name);
6489 [DllImport ("libX11", EntryPoint="XFetchName")]
6490 internal extern static int _XFetchName(IntPtr display, IntPtr window, ref IntPtr window_name);
6491 internal static int XFetchName(IntPtr display, IntPtr window, ref IntPtr window_name)
6493 DebugHelper.TraceWriteLine ("XFetchName");
6494 return _XFetchName(display, window, ref window_name);
6497 [DllImport ("libX11", EntryPoint="XSendEvent")]
6498 internal extern static int _XSendEvent(IntPtr display, IntPtr window, bool propagate, IntPtr event_mask, ref XEvent send_event);
6499 internal static int XSendEvent(IntPtr display, IntPtr window, bool propagate, IntPtr event_mask, ref XEvent send_event)
6501 DebugHelper.TraceWriteLine ("XSendEvent");
6502 return _XSendEvent(display, window, propagate, event_mask, ref send_event);
6505 [DllImport ("libX11", EntryPoint="XQueryTree")]
6506 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);
6507 internal static int XQueryTree(IntPtr display, IntPtr window, out IntPtr root_return, out IntPtr parent_return, out IntPtr children_return, out int nchildren_return)
6509 DebugHelper.TraceWriteLine ("XQueryTree");
6510 return _XQueryTree(display, window, out root_return, out parent_return, out children_return, out nchildren_return);
6513 [DllImport ("libX11", EntryPoint="XFree")]
6514 internal extern static int _XFree(IntPtr data);
6515 internal static int XFree(IntPtr data)
6517 DebugHelper.TraceWriteLine ("XFree");
6518 return _XFree(data);
6521 [DllImport ("libX11", EntryPoint="XRaiseWindow")]
6522 internal extern static int _XRaiseWindow(IntPtr display, IntPtr window);
6523 internal static int XRaiseWindow(IntPtr display, IntPtr window)
6525 DebugHelper.TraceWriteLine ("XRaiseWindow");
6526 return _XRaiseWindow(display, window);
6529 [DllImport ("libX11", EntryPoint="XLowerWindow")]
6530 internal extern static uint _XLowerWindow(IntPtr display, IntPtr window);
6531 internal static uint XLowerWindow(IntPtr display, IntPtr window)
6533 DebugHelper.TraceWriteLine ("XLowerWindow");
6534 return _XLowerWindow(display, window);
6537 [DllImport ("libX11", EntryPoint="XConfigureWindow")]
6538 internal extern static uint _XConfigureWindow(IntPtr display, IntPtr window, ChangeWindowFlags value_mask, ref XWindowChanges values);
6539 internal static uint XConfigureWindow(IntPtr display, IntPtr window, ChangeWindowFlags value_mask, ref XWindowChanges values)
6541 DebugHelper.TraceWriteLine ("XConfigureWindow");
6542 return _XConfigureWindow(display, window, value_mask, ref values);
6545 [DllImport ("libX11", EntryPoint="XInternAtom")]
6546 internal extern static IntPtr _XInternAtom(IntPtr display, string atom_name, bool only_if_exists);
6547 internal static IntPtr XInternAtom(IntPtr display, string atom_name, bool only_if_exists)
6549 DebugHelper.TraceWriteLine ("XInternAtom");
6550 return _XInternAtom(display, atom_name, only_if_exists);
6553 [DllImport ("libX11", EntryPoint="XInternAtoms")]
6554 internal extern static int _XInternAtoms(IntPtr display, string[] atom_names, int atom_count, bool only_if_exists, IntPtr[] atoms);
6555 internal static int XInternAtoms(IntPtr display, string[] atom_names, int atom_count, bool only_if_exists, IntPtr[] atoms)
6557 DebugHelper.TraceWriteLine ("XInternAtoms");
6558 return _XInternAtoms(display, atom_names, atom_count, only_if_exists, atoms);
6561 [DllImport ("libX11", EntryPoint="XSetWMProtocols")]
6562 internal extern static int _XSetWMProtocols(IntPtr display, IntPtr window, IntPtr[] protocols, int count);
6563 internal static int XSetWMProtocols(IntPtr display, IntPtr window, IntPtr[] protocols, int count)
6565 DebugHelper.TraceWriteLine ("XSetWMProtocols");
6566 return _XSetWMProtocols(display, window, protocols, count);
6569 [DllImport ("libX11", EntryPoint="XGrabPointer")]
6570 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);
6571 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)
6573 DebugHelper.TraceWriteLine ("XGrabPointer");
6574 return _XGrabPointer(display, window, owner_events, event_mask, pointer_mode, keyboard_mode, confine_to, cursor, timestamp);
6577 [DllImport ("libX11", EntryPoint="XUngrabPointer")]
6578 internal extern static int _XUngrabPointer(IntPtr display, IntPtr timestamp);
6579 internal static int XUngrabPointer(IntPtr display, IntPtr timestamp)
6581 DebugHelper.TraceWriteLine ("XUngrabPointer");
6582 return _XUngrabPointer(display, timestamp);
6585 [DllImport ("libX11", EntryPoint="XQueryPointer")]
6586 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);
6587 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)
6589 DebugHelper.TraceWriteLine ("XQueryPointer");
6590 return _XQueryPointer(display, window, out root, out child, out root_x, out root_y, out win_x, out win_y, out keys_buttons);
6593 [DllImport ("libX11", EntryPoint="XTranslateCoordinates")]
6594 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);
6595 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)
6597 DebugHelper.TraceWriteLine ("XTranslateCoordinates");
6598 return _XTranslateCoordinates (display, src_w, dest_w, src_x, src_y, out intdest_x_return, out dest_y_return, out child_return);
6601 [DllImport ("libX11", EntryPoint="XGetGeometry")]
6602 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);
6603 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)
6605 DebugHelper.TraceWriteLine ("XGetGeometry");
6606 return _XGetGeometry(display, window, out root, out x, out y, out width, out height, out border_width, out depth);
6609 [DllImport ("libX11", EntryPoint="XGetGeometry")]
6610 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);
6611 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)
6613 DebugHelper.TraceWriteLine ("XGetGeometry");
6614 return _XGetGeometry(display, window, root, out x, out y, out width, out height, border_width, depth);
6617 [DllImport ("libX11", EntryPoint="XGetGeometry")]
6618 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);
6619 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)
6621 DebugHelper.TraceWriteLine ("XGetGeometry");
6622 return _XGetGeometry(display, window, root, out x, out y, width, height, border_width, depth);
6625 [DllImport ("libX11", EntryPoint="XGetGeometry")]
6626 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);
6627 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)
6629 DebugHelper.TraceWriteLine ("XGetGeometry");
6630 return _XGetGeometry(display, window, root, x, y, out width, out height, border_width, depth);
6633 [DllImport ("libX11", EntryPoint="XWarpPointer")]
6634 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);
6635 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)
6637 DebugHelper.TraceWriteLine ("XWarpPointer");
6638 return _XWarpPointer(display, src_w, dest_w, src_x, src_y, src_width, src_height, dest_x, dest_y);
6641 [DllImport ("libX11", EntryPoint="XClearWindow")]
6642 internal extern static int _XClearWindow(IntPtr display, IntPtr window);
6643 internal static int XClearWindow(IntPtr display, IntPtr window)
6645 DebugHelper.TraceWriteLine ("XClearWindow");
6646 return _XClearWindow(display, window);
6649 [DllImport ("libX11", EntryPoint="XClearArea")]
6650 internal extern static int _XClearArea(IntPtr display, IntPtr window, int x, int y, int width, int height, bool exposures);
6651 internal static int XClearArea(IntPtr display, IntPtr window, int x, int y, int width, int height, bool exposures)
6653 DebugHelper.TraceWriteLine ("XClearArea");
6654 return _XClearArea(display, window, x, y, width, height, exposures);
6658 [DllImport ("libX11", EntryPoint="XDefaultScreenOfDisplay")]
6659 internal extern static IntPtr _XDefaultScreenOfDisplay(IntPtr display);
6660 internal static IntPtr XDefaultScreenOfDisplay(IntPtr display)
6662 DebugHelper.TraceWriteLine ("XDefaultScreenOfDisplay");
6663 return _XDefaultScreenOfDisplay(display);
6666 [DllImport ("libX11", EntryPoint="XScreenNumberOfScreen")]
6667 internal extern static int _XScreenNumberOfScreen(IntPtr display, IntPtr Screen);
6668 internal static int XDefaultScreenOfDisplay(IntPtr display, IntPtr Screen)
6670 DebugHelper.TraceWriteLine ("XDefaultScreenOfDisplay");
6671 return _XScreenNumberOfScreen(display, Screen);
6674 [DllImport ("libX11", EntryPoint="XDefaultVisual")]
6675 internal extern static IntPtr _XDefaultVisual(IntPtr display, int screen_number);
6676 internal static IntPtr XDefaultScreenOfDisplay(IntPtr display, int screen_number)
6678 DebugHelper.TraceWriteLine ("XDefaultScreenOfDisplay");
6679 return _XDefaultVisual(display, screen_number);
6682 [DllImport ("libX11", EntryPoint="XDefaultDepth")]
6683 internal extern static uint _XDefaultDepth(IntPtr display, int screen_number);
6684 internal static uint XDefaultDepth(IntPtr display, int screen_number)
6686 DebugHelper.TraceWriteLine ("XDefaultDepth");
6687 return _XDefaultDepth(display, screen_number);
6690 [DllImport ("libX11", EntryPoint="XDefaultScreen")]
6691 internal extern static int _XDefaultScreen(IntPtr display);
6692 internal static int XDefaultScreen(IntPtr display)
6694 DebugHelper.TraceWriteLine ("XDefaultScreen");
6695 return _XDefaultScreen(display);
6698 [DllImport ("libX11", EntryPoint="XDefaultColormap")]
6699 internal extern static IntPtr _XDefaultColormap(IntPtr display, int screen_number);
6700 internal static IntPtr XDefaultColormap(IntPtr display, int screen_number)
6702 DebugHelper.TraceWriteLine ("XDefaultColormap");
6703 return _XDefaultColormap(display, screen_number);
6706 [DllImport ("libX11", EntryPoint="XLookupColor")]
6707 internal extern static int _XLookupColor(IntPtr display, IntPtr Colormap, string Coloranem, ref XColor exact_def_color, ref XColor screen_def_color);
6708 internal static int XLookupColor(IntPtr display, IntPtr Colormap, string Coloranem, ref XColor exact_def_color, ref XColor screen_def_color)
6710 DebugHelper.TraceWriteLine ("XLookupColor");
6711 return _XLookupColor(display, Colormap, Coloranem, ref exact_def_color, ref screen_def_color);
6714 [DllImport ("libX11", EntryPoint="XAllocColor")]
6715 internal extern static int _XAllocColor(IntPtr display, IntPtr Colormap, ref XColor colorcell_def);
6716 internal static int XAllocColor(IntPtr display, IntPtr Colormap, ref XColor colorcell_def)
6718 DebugHelper.TraceWriteLine ("XAllocColor");
6719 return _XAllocColor(display, Colormap, ref colorcell_def);
6722 [DllImport ("libX11", EntryPoint="XSetTransientForHint")]
6723 internal extern static int _XSetTransientForHint(IntPtr display, IntPtr window, IntPtr prop_window);
6724 internal static int XSetTransientForHint(IntPtr display, IntPtr window, IntPtr prop_window)
6726 DebugHelper.TraceWriteLine ("XSetTransientForHint");
6727 return _XSetTransientForHint(display, window, prop_window);
6730 [DllImport ("libX11", EntryPoint="XChangeProperty")]
6731 internal extern static int _XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref MotifWmHints data, int nelements);
6732 internal static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref MotifWmHints data, int nelements)
6734 DebugHelper.TraceWriteLine ("XChangeProperty");
6735 return _XChangeProperty(display, window, property, type, format, mode, ref data, nelements);
6738 [DllImport ("libX11", EntryPoint="XChangeProperty")]
6739 internal extern static int _XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref uint value, int nelements);
6740 internal static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref uint value, int nelements)
6742 DebugHelper.TraceWriteLine ("XChangeProperty");
6743 return _XChangeProperty(display, window, property, type, format, mode, ref value, nelements);
6746 [DllImport ("libX11", EntryPoint="XChangeProperty")]
6747 internal extern static int _XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref IntPtr value, int nelements);
6748 internal static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref IntPtr value, int nelements)
6750 DebugHelper.TraceWriteLine ("XChangeProperty");
6751 return _XChangeProperty(display, window, property, type, format, mode, ref value, nelements);
6754 [DllImport ("libX11", EntryPoint="XChangeProperty")]
6755 internal extern static int _XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, uint[] data, int nelements);
6756 internal static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, uint[] data, int nelements)
6758 DebugHelper.TraceWriteLine ("XChangeProperty");
6759 return _XChangeProperty(display, window, property, type, format, mode, data, nelements);
6762 [DllImport ("libX11", EntryPoint="XChangeProperty")]
6763 internal extern static int _XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, int[] data, int nelements);
6764 internal static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, int[] data, int nelements)
6766 DebugHelper.TraceWriteLine ("XChangeProperty");
6767 return _XChangeProperty(display, window, property, type, format, mode, data, nelements);
6770 [DllImport ("libX11", EntryPoint="XChangeProperty")]
6771 internal extern static int _XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, IntPtr[] data, int nelements);
6772 internal static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, IntPtr[] data, int nelements)
6774 DebugHelper.TraceWriteLine ("XChangeProperty");
6775 return _XChangeProperty(display, window, property, type, format, mode, data, nelements);
6778 [DllImport ("libX11", EntryPoint="XChangeProperty")]
6779 internal extern static int _XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, IntPtr atoms, int nelements);
6780 internal static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, IntPtr atoms, int nelements)
6782 DebugHelper.TraceWriteLine ("XChangeProperty");
6783 return _XChangeProperty(display, window, property, type, format, mode, atoms, nelements);
6786 [DllImport ("libX11", EntryPoint="XChangeProperty", CharSet=CharSet.Ansi)]
6787 internal extern static int _XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, string text, int text_length);
6788 internal static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, string text, int text_length)
6790 DebugHelper.TraceWriteLine ("XChangeProperty");
6791 return _XChangeProperty(display, window, property, type, format, mode, text, text_length);
6794 [DllImport ("libX11", EntryPoint="XDeleteProperty")]
6795 internal extern static int _XDeleteProperty(IntPtr display, IntPtr window, IntPtr property);
6796 internal static int XDeleteProperty(IntPtr display, IntPtr window, IntPtr property)
6798 DebugHelper.TraceWriteLine ("XDeleteProperty");
6799 return _XDeleteProperty(display, window, property);
6803 [DllImport ("libX11", EntryPoint="XCreateGC")]
6804 internal extern static IntPtr _XCreateGC(IntPtr display, IntPtr window, IntPtr valuemask, ref XGCValues values);
6805 internal static IntPtr XCreateGC(IntPtr display, IntPtr window, IntPtr valuemask, ref XGCValues values)
6807 DebugHelper.TraceWriteLine ("XCreateGC");
6808 return _XCreateGC(display, window, valuemask, ref values);
6811 [DllImport ("libX11", EntryPoint="XFreeGC")]
6812 internal extern static int _XFreeGC(IntPtr display, IntPtr gc);
6813 internal static int XFreeGC(IntPtr display, IntPtr gc)
6815 DebugHelper.TraceWriteLine ("XFreeGC");
6816 return _XFreeGC(display, gc);
6819 [DllImport ("libX11", EntryPoint="XSetFunction")]
6820 internal extern static int _XSetFunction(IntPtr display, IntPtr gc, GXFunction function);
6821 internal static int XSetFunction(IntPtr display, IntPtr gc, GXFunction function)
6823 DebugHelper.TraceWriteLine ("XSetFunction");
6824 return _XSetFunction(display, gc, function);
6827 [DllImport ("libX11", EntryPoint="XSetLineAttributes")]
6828 internal extern static int _XSetLineAttributes(IntPtr display, IntPtr gc, int line_width, GCLineStyle line_style, GCCapStyle cap_style, GCJoinStyle join_style);
6829 internal static int XSetLineAttributes(IntPtr display, IntPtr gc, int line_width, GCLineStyle line_style, GCCapStyle cap_style, GCJoinStyle join_style)
6831 DebugHelper.TraceWriteLine ("XSetLineAttributes");
6832 return _XSetLineAttributes(display, gc, line_width, line_style, cap_style, join_style);
6835 [DllImport ("libX11", EntryPoint="XDrawLine")]
6836 internal extern static int _XDrawLine(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int x2, int y2);
6837 internal static int XDrawLine(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int x2, int y2)
6839 DebugHelper.TraceWriteLine ("XDrawLine");
6840 return _XDrawLine(display, drawable, gc, x1, y1, x2, y2);
6843 [DllImport ("libX11", EntryPoint="XDrawRectangle")]
6844 internal extern static int _XDrawRectangle(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int width, int height);
6845 internal static int XDrawRectangle(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int width, int height)
6847 DebugHelper.TraceWriteLine ("XDrawRectangle");
6848 return _XDrawRectangle(display, drawable, gc, x1, y1, width, height);
6851 [DllImport ("libX11", EntryPoint="XFillRectangle")]
6852 internal extern static int _XFillRectangle(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int width, int height);
6853 internal static int XFillRectangle(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int width, int height)
6855 DebugHelper.TraceWriteLine ("XFillRectangle");
6856 return _XFillRectangle(display, drawable, gc, x1, y1, width, height);
6859 [DllImport ("libX11", EntryPoint="XSetWindowBackground")]
6860 internal extern static int _XSetWindowBackground(IntPtr display, IntPtr window, IntPtr background);
6861 internal static int XSetWindowBackground(IntPtr display, IntPtr window, IntPtr background)
6863 DebugHelper.TraceWriteLine ("XSetWindowBackground");
6864 return _XSetWindowBackground(display, window, background);
6867 [DllImport ("libX11", EntryPoint="XCopyArea")]
6868 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);
6869 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)
6871 DebugHelper.TraceWriteLine ("XCopyArea");
6872 return _XCopyArea(display, src, dest, gc, src_x, src_y, width, height, dest_x, dest_y);
6875 [DllImport ("libX11", EntryPoint="XGetWindowProperty")]
6876 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);
6877 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)
6879 DebugHelper.TraceWriteLine ("XGetWindowProperty");
6880 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);
6883 [DllImport ("libX11", EntryPoint="XSetInputFocus")]
6884 internal extern static int _XSetInputFocus(IntPtr display, IntPtr window, RevertTo revert_to, IntPtr time);
6885 internal static int XSetInputFocus(IntPtr display, IntPtr window, RevertTo revert_to, IntPtr time)
6887 DebugHelper.TraceWriteLine ("XSetInputFocus");
6888 return _XSetInputFocus(display, window, revert_to, time);
6891 [DllImport ("libX11", EntryPoint="XIconifyWindow")]
6892 internal extern static int _XIconifyWindow(IntPtr display, IntPtr window, int screen_number);
6893 internal static int XIconifyWindow(IntPtr display, IntPtr window, int screen_number)
6895 DebugHelper.TraceWriteLine ("XIconifyWindow");
6896 return _XIconifyWindow(display, window, screen_number);
6899 [DllImport ("libX11", EntryPoint="XDefineCursor")]
6900 internal extern static int _XDefineCursor(IntPtr display, IntPtr window, IntPtr cursor);
6901 internal static int XDefineCursor(IntPtr display, IntPtr window, IntPtr cursor)
6903 DebugHelper.TraceWriteLine ("XDefineCursor");
6904 return _XDefineCursor(display, window, cursor);
6907 [DllImport ("libX11", EntryPoint="XUndefineCursor")]
6908 internal extern static int _XUndefineCursor(IntPtr display, IntPtr window);
6909 internal static int XUndefineCursor(IntPtr display, IntPtr window)
6911 DebugHelper.TraceWriteLine ("XUndefineCursor");
6912 return _XUndefineCursor(display, window);
6915 [DllImport ("libX11", EntryPoint="XFreeCursor")]
6916 internal extern static int _XFreeCursor(IntPtr display, IntPtr cursor);
6917 internal static int XFreeCursor(IntPtr display, IntPtr cursor)
6919 DebugHelper.TraceWriteLine ("XFreeCursor");
6920 return _XFreeCursor(display, cursor);
6923 [DllImport ("libX11", EntryPoint="XCreateFontCursor")]
6924 internal extern static IntPtr _XCreateFontCursor(IntPtr display, CursorFontShape shape);
6925 internal static IntPtr XCreateFontCursor(IntPtr display, CursorFontShape shape)
6927 DebugHelper.TraceWriteLine ("XCreateFontCursor");
6928 return _XCreateFontCursor(display, shape);
6931 [DllImport ("libX11", EntryPoint="XCreatePixmapCursor")]
6932 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);
6933 internal static IntPtr XCreatePixmapCursor(IntPtr display, IntPtr source, IntPtr mask, ref XColor foreground_color, ref XColor background_color, int x_hot, int y_hot)
6935 DebugHelper.TraceWriteLine ("XCreatePixmapCursor");
6936 return _XCreatePixmapCursor(display, source, mask, ref foreground_color, ref background_color, x_hot, y_hot);
6939 [DllImport ("libX11", EntryPoint="XCreatePixmapFromBitmapData")]
6940 internal extern static IntPtr _XCreatePixmapFromBitmapData(IntPtr display, IntPtr drawable, byte[] data, int width, int height, IntPtr fg, IntPtr bg, int depth);
6941 internal static IntPtr XCreatePixmapFromBitmapData(IntPtr display, IntPtr drawable, byte[] data, int width, int height, IntPtr fg, IntPtr bg, int depth)
6943 DebugHelper.TraceWriteLine ("XCreatePixmapFromBitmapData");
6944 return _XCreatePixmapFromBitmapData(display, drawable, data, width, height, fg, bg, depth);
6947 [DllImport ("libX11", EntryPoint="XCreatePixmap")]
6948 internal extern static IntPtr _XCreatePixmap(IntPtr display, IntPtr d, int width, int height, int depth);
6949 internal static IntPtr XCreatePixmap(IntPtr display, IntPtr d, int width, int height, int depth)
6951 DebugHelper.TraceWriteLine ("XCreatePixmap");
6952 return _XCreatePixmap(display, d, width, height, depth);
6955 [DllImport ("libX11", EntryPoint="XFreePixmap")]
6956 internal extern static IntPtr _XFreePixmap(IntPtr display, IntPtr pixmap);
6957 internal static IntPtr XFreePixmap(IntPtr display, IntPtr pixmap)
6959 DebugHelper.TraceWriteLine ("XFreePixmap");
6960 return _XFreePixmap(display, pixmap);
6963 [DllImport ("libX11", EntryPoint="XQueryBestCursor")]
6964 internal extern static int _XQueryBestCursor(IntPtr display, IntPtr drawable, int width, int height, out int best_width, out int best_height);
6965 internal static int XQueryBestCursor(IntPtr display, IntPtr drawable, int width, int height, out int best_width, out int best_height)
6967 DebugHelper.TraceWriteLine ("XQueryBestCursor");
6968 return _XQueryBestCursor(display, drawable, width, height, out best_width, out best_height);
6971 [DllImport ("libX11", EntryPoint="XQueryExtension")]
6972 internal extern static int _XQueryExtension(IntPtr display, string extension_name, ref int major, ref int first_event, ref int first_error);
6973 internal static int XQueryExtension(IntPtr display, string extension_name, ref int major, ref int first_event, ref int first_error)
6975 DebugHelper.TraceWriteLine ("XQueryExtension");
6976 return _XQueryExtension(display, extension_name, ref major, ref first_event, ref first_error);
6979 [DllImport ("libX11", EntryPoint="XWhitePixel")]
6980 internal extern static IntPtr _XWhitePixel(IntPtr display, int screen_no);
6981 internal static IntPtr XWhitePixel(IntPtr display, int screen_no)
6983 DebugHelper.TraceWriteLine ("XWhitePixel");
6984 return _XWhitePixel(display, screen_no);
6987 [DllImport ("libX11", EntryPoint="XBlackPixel")]
6988 internal extern static IntPtr _XBlackPixel(IntPtr display, int screen_no);
6989 internal static IntPtr XBlackPixel(IntPtr display, int screen_no)
6991 DebugHelper.TraceWriteLine ("XBlackPixel");
6992 return _XBlackPixel(display, screen_no);
6995 [DllImport ("libX11", EntryPoint="XGrabServer")]
6996 internal extern static void _XGrabServer(IntPtr display);
6997 internal static void XGrabServer(IntPtr display)
6999 DebugHelper.TraceWriteLine ("XGrabServer");
7000 _XGrabServer(display);
7003 [DllImport ("libX11", EntryPoint="XUngrabServer")]
7004 internal extern static void _XUngrabServer(IntPtr display);
7005 internal static void XUngrabServer(IntPtr display)
7007 DebugHelper.TraceWriteLine ("XUngrabServer");
7008 _XUngrabServer(display);
7011 [DllImport ("libX11", EntryPoint="XGetWMNormalHints")]
7012 internal extern static void _XGetWMNormalHints(IntPtr display, IntPtr window, ref XSizeHints hints, out IntPtr supplied_return);
7013 internal static void XGetWMNormalHints(IntPtr display, IntPtr window, ref XSizeHints hints, out IntPtr supplied_return)
7015 DebugHelper.TraceWriteLine ("XGetWMNormalHints");
7016 _XGetWMNormalHints(display, window, ref hints, out supplied_return);
7019 [DllImport ("libX11", EntryPoint="XSetWMNormalHints")]
7020 internal extern static void _XSetWMNormalHints(IntPtr display, IntPtr window, ref XSizeHints hints);
7021 internal static void XSetWMNormalHints(IntPtr display, IntPtr window, ref XSizeHints hints)
7023 DebugHelper.TraceWriteLine ("XSetWMNormalHints");
7024 _XSetWMNormalHints(display, window, ref hints);
7027 [DllImport ("libX11", EntryPoint="XSetZoomHints")]
7028 internal extern static void _XSetZoomHints(IntPtr display, IntPtr window, ref XSizeHints hints);
7029 internal static void XSetZoomHints(IntPtr display, IntPtr window, ref XSizeHints hints)
7031 DebugHelper.TraceWriteLine ("XSetZoomHints");
7032 _XSetZoomHints(display, window, ref hints);
7035 [DllImport ("libX11", EntryPoint="XSetWMHints")]
7036 internal extern static void _XSetWMHints(IntPtr display, IntPtr window, ref XWMHints wmhints);
7037 internal static void XSetWMHints(IntPtr display, IntPtr window, ref XWMHints wmhints)
7039 DebugHelper.TraceWriteLine ("XSetWMHints");
7040 _XSetWMHints(display, window, ref wmhints);
7043 [DllImport ("libX11", EntryPoint="XGetIconSizes")]
7044 internal extern static int _XGetIconSizes(IntPtr display, IntPtr window, out IntPtr size_list, out int count);
7045 internal static int XGetIconSizes(IntPtr display, IntPtr window, out IntPtr size_list, out int count)
7047 DebugHelper.TraceWriteLine ("XGetIconSizes");
7048 return _XGetIconSizes(display, window, out size_list, out count);
7051 [DllImport ("libX11", EntryPoint="XSetErrorHandler")]
7052 internal extern static IntPtr _XSetErrorHandler(XErrorHandler error_handler);
7053 internal static IntPtr XSetErrorHandler(XErrorHandler error_handler)
7055 DebugHelper.TraceWriteLine ("XSetErrorHandler");
7056 return _XSetErrorHandler(error_handler);
7059 [DllImport ("libX11", EntryPoint="XGetErrorText")]
7060 internal extern static IntPtr _XGetErrorText(IntPtr display, byte code, StringBuilder buffer, int length);
7061 internal static IntPtr XGetErrorText(IntPtr display, byte code, StringBuilder buffer, int length)
7063 DebugHelper.TraceWriteLine ("XGetErrorText");
7064 return _XGetErrorText(display, code, buffer, length);
7067 [DllImport ("libX11", EntryPoint="XInitThreads")]
7068 internal extern static int _XInitThreads();
7069 internal static int XInitThreads()
7071 DebugHelper.TraceWriteLine ("XInitThreads");
7072 return _XInitThreads();
7075 [DllImport ("libX11", EntryPoint="XConvertSelection")]
7076 internal extern static int _XConvertSelection(IntPtr display, IntPtr selection, IntPtr target, IntPtr property, IntPtr requestor, IntPtr time);
7077 internal static int XConvertSelection(IntPtr display, IntPtr selection, IntPtr target, IntPtr property, IntPtr requestor, IntPtr time)
7079 DebugHelper.TraceWriteLine ("XConvertSelection");
7080 return _XConvertSelection(display, selection, target, property, requestor, time);
7083 [DllImport ("libX11", EntryPoint="XGetSelectionOwner")]
7084 internal extern static IntPtr _XGetSelectionOwner(IntPtr display, IntPtr selection);
7085 internal static IntPtr XGetSelectionOwner(IntPtr display, IntPtr selection)
7087 DebugHelper.TraceWriteLine ("XGetSelectionOwner");
7088 return _XGetSelectionOwner(display, selection);
7091 [DllImport ("libX11", EntryPoint="XSetSelectionOwner")]
7092 internal extern static int _XSetSelectionOwner(IntPtr display, IntPtr selection, IntPtr owner, IntPtr time);
7093 internal static int XSetSelectionOwner(IntPtr display, IntPtr selection, IntPtr owner, IntPtr time)
7095 DebugHelper.TraceWriteLine ("XSetSelectionOwner");
7096 return _XSetSelectionOwner(display, selection, owner, time);
7099 [DllImport ("libX11", EntryPoint="XSetPlaneMask")]
7100 internal extern static int _XSetPlaneMask(IntPtr display, IntPtr gc, IntPtr mask);
7101 internal static int XSetPlaneMask(IntPtr display, IntPtr gc, IntPtr mask)
7103 DebugHelper.TraceWriteLine ("XSetPlaneMask");
7104 return _XSetPlaneMask(display, gc, mask);
7107 [DllImport ("libX11", EntryPoint="XSetForeground")]
7108 internal extern static int _XSetForeground(IntPtr display, IntPtr gc, UIntPtr foreground);
7109 internal static int XSetForeground(IntPtr display, IntPtr gc, UIntPtr foreground)
7111 DebugHelper.TraceWriteLine ("XSetForeground");
7112 return _XSetForeground(display, gc, foreground);
7115 [DllImport ("libX11", EntryPoint="XSetBackground")]
7116 internal extern static int _XSetBackground(IntPtr display, IntPtr gc, UIntPtr background);
7117 internal static int XSetBackground(IntPtr display, IntPtr gc, UIntPtr background)
7119 DebugHelper.TraceWriteLine ("XSetBackground");
7120 return _XSetBackground(display, gc, background);
7123 [DllImport ("libX11", EntryPoint="XBell")]
7124 internal extern static int _XBell(IntPtr display, int percent);
7125 internal static int XBell(IntPtr display, int percent)
7127 DebugHelper.TraceWriteLine ("XBell");
7128 return _XBell(display, percent);
7131 [DllImport ("libX11", EntryPoint="XChangeActivePointerGrab")]
7132 internal extern static int _XChangeActivePointerGrab (IntPtr display, EventMask event_mask, IntPtr cursor, IntPtr time);
7133 internal static int XChangeActivePointerGrab (IntPtr display, EventMask event_mask, IntPtr cursor, IntPtr time)
7135 DebugHelper.TraceWriteLine ("XChangeActivePointerGrab");
7136 return _XChangeActivePointerGrab (display, event_mask, cursor, time);
7139 [DllImport ("libX11", EntryPoint="XFilterEvent")]
7140 internal extern static bool _XFilterEvent(ref XEvent xevent, IntPtr window);
7141 internal static bool XFilterEvent(ref XEvent xevent, IntPtr window)
7143 DebugHelper.TraceWriteLine ("XFilterEvent");
7144 return _XFilterEvent(ref xevent, window);
7147 [DllImport ("libX11", EntryPoint="XkbSetDetectableAutoRepeat")]
7148 internal extern static void _XkbSetDetectableAutoRepeat (IntPtr display, bool detectable, IntPtr supported);
7149 internal static void XkbSetDetectableAutoRepeat (IntPtr display, bool detectable, IntPtr supported)
7151 DebugHelper.TraceWriteLine ("XkbSetDetectableAutoRepeat");
7152 _XkbSetDetectableAutoRepeat (display, detectable, supported);
7155 [DllImport ("libX11", EntryPoint="XPeekEvent")]
7156 internal extern static void _XPeekEvent (IntPtr display, ref XEvent xevent);
7157 internal static void XPeekEvent (IntPtr display, ref XEvent xevent)
7159 DebugHelper.TraceWriteLine ("XPeekEvent");
7160 _XPeekEvent (display, ref xevent);
7163 [DllImport ("libX11", EntryPoint="XIfEvent")]
7164 internal extern static void _XIfEvent (IntPtr display, ref XEvent xevent, Delegate event_predicate, IntPtr arg);
7165 internal static void XIfEvent (IntPtr display, ref XEvent xevent, Delegate event_predicate, IntPtr arg)
7167 DebugHelper.TraceWriteLine ("XIfEvent");
7168 _XIfEvent (display, ref xevent, event_predicate, arg);
7173 #else //no TRACE defined
7175 #region Xcursor imports
7176 [DllImport ("libXcursor", EntryPoint = "XcursorLibraryLoadCursor")]
7177 internal extern static IntPtr XcursorLibraryLoadCursor (IntPtr display, [MarshalAs (UnmanagedType.LPStr)] string name);
7179 [DllImport ("libXcursor", EntryPoint = "XcursorLibraryLoadImages")]
7180 internal extern static IntPtr XcursorLibraryLoadImages ([MarshalAs (UnmanagedType.LPStr)] string file, IntPtr theme, int size);
7182 [DllImport ("libXcursor", EntryPoint = "XcursorImagesDestroy")]
7183 internal extern static void XcursorImagesDestroy (IntPtr images);
7185 [DllImport ("libXcursor", EntryPoint = "XcursorGetDefaultSize")]
7186 internal extern static int XcursorGetDefaultSize (IntPtr display);
7188 [DllImport ("libXcursor", EntryPoint = "XcursorImageLoadCursor")]
7189 internal extern static IntPtr XcursorImageLoadCursor (IntPtr display, IntPtr image);
7191 [DllImport ("libXcursor", EntryPoint = "XcursorGetTheme")]
7192 internal extern static IntPtr XcursorGetTheme (IntPtr display);
7195 [DllImport ("libX11", EntryPoint="XOpenDisplay")]
7196 internal extern static IntPtr XOpenDisplay(IntPtr display);
7197 [DllImport ("libX11", EntryPoint="XCloseDisplay")]
7198 internal extern static int XCloseDisplay(IntPtr display);
7199 [DllImport ("libX11", EntryPoint="XSynchronize")]
7200 internal extern static IntPtr XSynchronize(IntPtr display, bool onoff);
7202 [DllImport ("libX11", EntryPoint="XCreateWindow")]
7203 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);
7205 [DllImport ("libX11", EntryPoint="XCreateSimpleWindow")]
7206 internal extern static IntPtr XCreateSimpleWindow(IntPtr display, IntPtr parent, int x, int y, int width, int height, int border_width, UIntPtr border, UIntPtr background);
7208 [DllImport ("libX11", EntryPoint="XMapWindow")]
7209 internal extern static int XMapWindow(IntPtr display, IntPtr window);
7211 [DllImport ("libX11", EntryPoint="XUnmapWindow")]
7212 internal extern static int XUnmapWindow(IntPtr display, IntPtr window);
7214 [DllImport ("libX11", EntryPoint="XMapSubwindows")]
7215 internal extern static int XMapSubindows(IntPtr display, IntPtr window);
7217 [DllImport ("libX11", EntryPoint="XUnmapSubwindows")]
7218 internal extern static int XUnmapSubwindows(IntPtr display, IntPtr window);
7220 [DllImport ("libX11", EntryPoint="XRootWindow")]
7221 internal extern static IntPtr XRootWindow(IntPtr display, int screen_number);
7223 [DllImport ("libX11", EntryPoint="XNextEvent")]
7224 internal extern static IntPtr XNextEvent(IntPtr display, ref XEvent xevent);
7226 [DllImport ("libX11", EntryPoint="XConnectionNumber")]
7227 internal extern static int XConnectionNumber (IntPtr display);
7229 [DllImport ("libX11", EntryPoint="XPending")]
7230 internal extern static int XPending (IntPtr display);
7232 [DllImport ("libX11", EntryPoint="XSelectInput")]
7233 internal extern static IntPtr XSelectInput(IntPtr display, IntPtr window, IntPtr mask);
7235 [DllImport ("libX11", EntryPoint="XDestroyWindow")]
7236 internal extern static int XDestroyWindow(IntPtr display, IntPtr window);
7238 [DllImport ("libX11", EntryPoint="XReparentWindow")]
7239 internal extern static int XReparentWindow(IntPtr display, IntPtr window, IntPtr parent, int x, int y);
7241 [DllImport ("libX11", EntryPoint="XMoveResizeWindow")]
7242 extern static int XMoveResizeWindow(IntPtr display, IntPtr window, int x, int y, int width, int height);
7243 internal static int MoveResizeWindow(IntPtr display, IntPtr window, int x, int y, int width, int height)
7245 int ret = XMoveResizeWindow (display, window, x, y, width, height);
7246 Keyboard.MoveCurrentCaretPos ();
7250 [DllImport ("libX11", EntryPoint="XResizeWindow")]
7251 internal extern static int XResizeWindow(IntPtr display, IntPtr window, int width, int height);
7253 [DllImport ("libX11", EntryPoint="XGetWindowAttributes")]
7254 internal extern static int XGetWindowAttributes(IntPtr display, IntPtr window, ref XWindowAttributes attributes);
7256 [DllImport ("libX11", EntryPoint="XFlush")]
7257 internal extern static int XFlush(IntPtr display);
7259 [DllImport ("libX11", EntryPoint="XSetWMName")]
7260 internal extern static int XSetWMName(IntPtr display, IntPtr window, ref XTextProperty text_prop);
7262 [DllImport ("libX11", EntryPoint="XStoreName")]
7263 internal extern static int XStoreName(IntPtr display, IntPtr window, string window_name);
7265 [DllImport ("libX11", EntryPoint="XFetchName")]
7266 internal extern static int XFetchName(IntPtr display, IntPtr window, ref IntPtr window_name);
7268 [DllImport ("libX11", EntryPoint="XSendEvent")]
7269 internal extern static int XSendEvent(IntPtr display, IntPtr window, bool propagate, IntPtr event_mask, ref XEvent send_event);
7271 [DllImport ("libX11", EntryPoint="XQueryTree")]
7272 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);
7274 [DllImport ("libX11", EntryPoint="XFree")]
7275 internal extern static int XFree(IntPtr data);
7277 [DllImport ("libX11", EntryPoint="XRaiseWindow")]
7278 internal extern static int XRaiseWindow(IntPtr display, IntPtr window);
7280 [DllImport ("libX11", EntryPoint="XLowerWindow")]
7281 internal extern static uint XLowerWindow(IntPtr display, IntPtr window);
7283 [DllImport ("libX11", EntryPoint="XConfigureWindow")]
7284 internal extern static uint XConfigureWindow(IntPtr display, IntPtr window, ChangeWindowFlags value_mask, ref XWindowChanges values);
7286 [DllImport ("libX11", EntryPoint="XInternAtom")]
7287 internal extern static IntPtr XInternAtom(IntPtr display, string atom_name, bool only_if_exists);
7289 [DllImport ("libX11", EntryPoint="XInternAtoms")]
7290 internal extern static int XInternAtoms(IntPtr display, string[] atom_names, int atom_count, bool only_if_exists, IntPtr[] atoms);
7292 [DllImport ("libX11", EntryPoint="XSetWMProtocols")]
7293 internal extern static int XSetWMProtocols(IntPtr display, IntPtr window, IntPtr[] protocols, int count);
7295 [DllImport ("libX11", EntryPoint="XGrabPointer")]
7296 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);
7298 [DllImport ("libX11", EntryPoint="XUngrabPointer")]
7299 internal extern static int XUngrabPointer(IntPtr display, IntPtr timestamp);
7301 [DllImport ("libX11", EntryPoint="XQueryPointer")]
7302 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);
7304 [DllImport ("libX11", EntryPoint="XTranslateCoordinates")]
7305 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);
7307 [DllImport ("libX11", EntryPoint="XGetGeometry")]
7308 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);
7310 [DllImport ("libX11", EntryPoint="XGetGeometry")]
7311 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);
7313 [DllImport ("libX11", EntryPoint="XGetGeometry")]
7314 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);
7316 [DllImport ("libX11", EntryPoint="XGetGeometry")]
7317 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);
7319 [DllImport ("libX11", EntryPoint="XWarpPointer")]
7320 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);
7322 [DllImport ("libX11", EntryPoint="XClearWindow")]
7323 internal extern static int XClearWindow(IntPtr display, IntPtr window);
7325 [DllImport ("libX11", EntryPoint="XClearArea")]
7326 internal extern static int XClearArea(IntPtr display, IntPtr window, int x, int y, int width, int height, bool exposures);
7329 [DllImport ("libX11", EntryPoint="XDefaultScreenOfDisplay")]
7330 internal extern static IntPtr XDefaultScreenOfDisplay(IntPtr display);
7332 [DllImport ("libX11", EntryPoint="XScreenNumberOfScreen")]
7333 internal extern static int XScreenNumberOfScreen(IntPtr display, IntPtr Screen);
7335 [DllImport ("libX11", EntryPoint="XDefaultVisual")]
7336 internal extern static IntPtr XDefaultVisual(IntPtr display, int screen_number);
7338 [DllImport ("libX11", EntryPoint="XDefaultDepth")]
7339 internal extern static uint XDefaultDepth(IntPtr display, int screen_number);
7341 [DllImport ("libX11", EntryPoint="XDefaultScreen")]
7342 internal extern static int XDefaultScreen(IntPtr display);
7344 [DllImport ("libX11", EntryPoint="XDefaultColormap")]
7345 internal extern static IntPtr XDefaultColormap(IntPtr display, int screen_number);
7347 [DllImport ("libX11", EntryPoint="XLookupColor")]
7348 internal extern static int XLookupColor(IntPtr display, IntPtr Colormap, string Coloranem, ref XColor exact_def_color, ref XColor screen_def_color);
7350 [DllImport ("libX11", EntryPoint="XAllocColor")]
7351 internal extern static int XAllocColor(IntPtr display, IntPtr Colormap, ref XColor colorcell_def);
7353 [DllImport ("libX11", EntryPoint="XSetTransientForHint")]
7354 internal extern static int XSetTransientForHint(IntPtr display, IntPtr window, IntPtr prop_window);
7356 [DllImport ("libX11", EntryPoint="XChangeProperty")]
7357 internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref MotifWmHints data, int nelements);
7359 [DllImport ("libX11", EntryPoint="XChangeProperty")]
7360 internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref uint value, int nelements);
7362 [DllImport ("libX11", EntryPoint="XChangeProperty")]
7363 internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref IntPtr value, int nelements);
7365 [DllImport ("libX11", EntryPoint="XChangeProperty")]
7366 internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, uint[] data, int nelements);
7368 [DllImport ("libX11", EntryPoint="XChangeProperty")]
7369 internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, int[] data, int nelements);
7371 [DllImport ("libX11", EntryPoint="XChangeProperty")]
7372 internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, IntPtr[] data, int nelements);
7374 [DllImport ("libX11", EntryPoint="XChangeProperty")]
7375 internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, IntPtr atoms, int nelements);
7377 [DllImport ("libX11", EntryPoint="XChangeProperty", CharSet=CharSet.Ansi)]
7378 internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, string text, int text_length);
7380 [DllImport ("libX11", EntryPoint="XDeleteProperty")]
7381 internal extern static int XDeleteProperty(IntPtr display, IntPtr window, IntPtr property);
7384 [DllImport ("libX11", EntryPoint="XCreateGC")]
7385 internal extern static IntPtr XCreateGC(IntPtr display, IntPtr window, IntPtr valuemask, ref XGCValues values);
7387 [DllImport ("libX11", EntryPoint="XFreeGC")]
7388 internal extern static int XFreeGC(IntPtr display, IntPtr gc);
7390 [DllImport ("libX11", EntryPoint="XSetFunction")]
7391 internal extern static int XSetFunction(IntPtr display, IntPtr gc, GXFunction function);
7393 [DllImport ("libX11", EntryPoint="XSetLineAttributes")]
7394 internal extern static int XSetLineAttributes(IntPtr display, IntPtr gc, int line_width, GCLineStyle line_style, GCCapStyle cap_style, GCJoinStyle join_style);
7396 [DllImport ("libX11", EntryPoint="XDrawLine")]
7397 internal extern static int XDrawLine(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int x2, int y2);
7399 [DllImport ("libX11", EntryPoint="XDrawRectangle")]
7400 internal extern static int XDrawRectangle(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int width, int height);
7402 [DllImport ("libX11", EntryPoint="XFillRectangle")]
7403 internal extern static int XFillRectangle(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int width, int height);
7405 [DllImport ("libX11", EntryPoint="XSetWindowBackground")]
7406 internal extern static int XSetWindowBackground(IntPtr display, IntPtr window, IntPtr background);
7408 [DllImport ("libX11", EntryPoint="XCopyArea")]
7409 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);
7411 [DllImport ("libX11", EntryPoint="XGetWindowProperty")]
7412 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);
7414 [DllImport ("libX11", EntryPoint="XSetInputFocus")]
7415 internal extern static int XSetInputFocus(IntPtr display, IntPtr window, RevertTo revert_to, IntPtr time);
7417 [DllImport ("libX11", EntryPoint="XIconifyWindow")]
7418 internal extern static int XIconifyWindow(IntPtr display, IntPtr window, int screen_number);
7420 [DllImport ("libX11", EntryPoint="XDefineCursor")]
7421 internal extern static int XDefineCursor(IntPtr display, IntPtr window, IntPtr cursor);
7423 [DllImport ("libX11", EntryPoint="XUndefineCursor")]
7424 internal extern static int XUndefineCursor(IntPtr display, IntPtr window);
7426 [DllImport ("libX11", EntryPoint="XFreeCursor")]
7427 internal extern static int XFreeCursor(IntPtr display, IntPtr cursor);
7429 [DllImport ("libX11", EntryPoint="XCreateFontCursor")]
7430 internal extern static IntPtr XCreateFontCursor(IntPtr display, CursorFontShape shape);
7432 [DllImport ("libX11", EntryPoint="XCreatePixmapCursor")]
7433 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);
7435 [DllImport ("libX11", EntryPoint="XCreatePixmapFromBitmapData")]
7436 internal extern static IntPtr XCreatePixmapFromBitmapData(IntPtr display, IntPtr drawable, byte[] data, int width, int height, IntPtr fg, IntPtr bg, int depth);
7438 [DllImport ("libX11", EntryPoint="XCreatePixmap")]
7439 internal extern static IntPtr XCreatePixmap(IntPtr display, IntPtr d, int width, int height, int depth);
7441 [DllImport ("libX11", EntryPoint="XFreePixmap")]
7442 internal extern static IntPtr XFreePixmap(IntPtr display, IntPtr pixmap);
7444 [DllImport ("libX11", EntryPoint="XQueryBestCursor")]
7445 internal extern static int XQueryBestCursor(IntPtr display, IntPtr drawable, int width, int height, out int best_width, out int best_height);
7447 [DllImport ("libX11", EntryPoint="XQueryExtension")]
7448 internal extern static int XQueryExtension(IntPtr display, string extension_name, ref int major, ref int first_event, ref int first_error);
7450 [DllImport ("libX11", EntryPoint="XWhitePixel")]
7451 internal extern static IntPtr XWhitePixel(IntPtr display, int screen_no);
7453 [DllImport ("libX11", EntryPoint="XBlackPixel")]
7454 internal extern static IntPtr XBlackPixel(IntPtr display, int screen_no);
7456 [DllImport ("libX11", EntryPoint="XGrabServer")]
7457 internal extern static void XGrabServer(IntPtr display);
7459 [DllImport ("libX11", EntryPoint="XUngrabServer")]
7460 internal extern static void XUngrabServer(IntPtr display);
7462 [DllImport ("libX11", EntryPoint="XGetWMNormalHints")]
7463 internal extern static void XGetWMNormalHints(IntPtr display, IntPtr window, ref XSizeHints hints, out IntPtr supplied_return);
7465 [DllImport ("libX11", EntryPoint="XSetWMNormalHints")]
7466 internal extern static void XSetWMNormalHints(IntPtr display, IntPtr window, ref XSizeHints hints);
7468 [DllImport ("libX11", EntryPoint="XSetZoomHints")]
7469 internal extern static void XSetZoomHints(IntPtr display, IntPtr window, ref XSizeHints hints);
7471 [DllImport ("libX11", EntryPoint="XSetWMHints")]
7472 internal extern static void XSetWMHints(IntPtr display, IntPtr window, ref XWMHints wmhints);
7474 [DllImport ("libX11", EntryPoint="XGetIconSizes")]
7475 internal extern static int XGetIconSizes(IntPtr display, IntPtr window, out IntPtr size_list, out int count);
7477 [DllImport ("libX11", EntryPoint="XSetErrorHandler")]
7478 internal extern static IntPtr XSetErrorHandler(XErrorHandler error_handler);
7480 [DllImport ("libX11", EntryPoint="XGetErrorText")]
7481 internal extern static IntPtr XGetErrorText(IntPtr display, byte code, StringBuilder buffer, int length);
7483 [DllImport ("libX11", EntryPoint="XInitThreads")]
7484 internal extern static int XInitThreads();
7486 [DllImport ("libX11", EntryPoint="XConvertSelection")]
7487 internal extern static int XConvertSelection(IntPtr display, IntPtr selection, IntPtr target, IntPtr property, IntPtr requestor, IntPtr time);
7489 [DllImport ("libX11", EntryPoint="XGetSelectionOwner")]
7490 internal extern static IntPtr XGetSelectionOwner(IntPtr display, IntPtr selection);
7492 [DllImport ("libX11", EntryPoint="XSetSelectionOwner")]
7493 internal extern static int XSetSelectionOwner(IntPtr display, IntPtr selection, IntPtr owner, IntPtr time);
7495 [DllImport ("libX11", EntryPoint="XSetPlaneMask")]
7496 internal extern static int XSetPlaneMask(IntPtr display, IntPtr gc, IntPtr mask);
7498 [DllImport ("libX11", EntryPoint="XSetForeground")]
7499 internal extern static int XSetForeground(IntPtr display, IntPtr gc, UIntPtr foreground);
7501 [DllImport ("libX11", EntryPoint="XSetBackground")]
7502 internal extern static int XSetBackground(IntPtr display, IntPtr gc, UIntPtr background);
7504 [DllImport ("libX11", EntryPoint="XBell")]
7505 internal extern static int XBell(IntPtr display, int percent);
7507 [DllImport ("libX11", EntryPoint="XChangeActivePointerGrab")]
7508 internal extern static int XChangeActivePointerGrab (IntPtr display, EventMask event_mask, IntPtr cursor, IntPtr time);
7510 [DllImport ("libX11", EntryPoint="XFilterEvent")]
7511 internal extern static bool XFilterEvent(ref XEvent xevent, IntPtr window);
7513 [DllImport ("libX11", EntryPoint="XkbSetDetectableAutoRepeat")]
7514 internal extern static void XkbSetDetectableAutoRepeat (IntPtr display, bool detectable, IntPtr supported);
7516 [DllImport ("libX11", EntryPoint="XPeekEvent")]
7517 internal extern static void XPeekEvent (IntPtr display, ref XEvent xevent);
7519 [DllImport ("libX11", EntryPoint="XIfEvent")]
7520 internal extern static void XIfEvent (IntPtr display, ref XEvent xevent, Delegate event_predicate, IntPtr arg);