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:
8 //
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
11 //
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.
19 //
20 // Copyright (c) 2004-2007 Novell, Inc.
21 //
22 // Authors:
23 //	Geoff Norton  <gnorton@novell.com>
24 //
25 //
26 
27 using System;
28 using System.Threading;
29 using System.Drawing;
30 using System.ComponentModel;
31 using System.Collections;
32 using System.Diagnostics;
33 using System.Runtime.InteropServices;
34 
35 using Carbon = System.Windows.Forms.CarbonInternal;
36 
37 /// Carbon Version
38 namespace System.Windows.Forms {
HwndDelegate(IntPtr handle)39 	internal delegate Rectangle [] HwndDelegate (IntPtr handle);
40 
41 	internal class XplatUICarbon : XplatUIDriver {
42 		#region Local Variables
43 		// General driver variables
44 		private static XplatUICarbon Instance;
45 		private static int RefCount;
46 		private static bool themes_enabled;
47 
48 		// Internal members available to the event handler sub-system
49 		internal static IntPtr FocusWindow;
50 		internal static IntPtr ActiveWindow;
51 		internal static IntPtr UnactiveWindow;
52 		internal static IntPtr ReverseWindow;
53 		internal static IntPtr CaretWindow;
54 
55 		internal static Hwnd MouseHwnd;
56 
57 		internal static MouseButtons MouseState;
58 		internal static Carbon.Hover Hover;
59 
60 		internal static HwndDelegate HwndDelegate = new HwndDelegate (GetClippingRectangles);
61 		// Instance members
62 		internal Point mouse_position;
63 
64 		// Event handlers
65 		internal Carbon.ApplicationHandler ApplicationHandler;
66 		internal Carbon.ControlHandler ControlHandler;
67 		internal Carbon.HIObjectHandler HIObjectHandler;
68 		internal Carbon.KeyboardHandler KeyboardHandler;
69 		internal Carbon.MouseHandler MouseHandler;
70 		internal Carbon.WindowHandler WindowHandler;
71 
72 		// Carbon Specific
73 		internal static GrabStruct Grab;
74 		internal static Carbon.Caret Caret;
75 		private static Carbon.Dnd Dnd;
76 		private static Hashtable WindowMapping;
77 		private static Hashtable HandleMapping;
78 		private static IntPtr FosterParent;
79 		private static IntPtr Subclass;
80 		private static int MenuBarHeight;
81 		internal static ArrayList UtilityWindows;
82 
83 		// Message loop
84 		private static Queue MessageQueue;
85 		private static bool GetMessageResult;
86 
87 		private static bool ReverseWindowMapped;
88 
89 		// Timers
90 		private ArrayList TimerList;
91 		private static bool in_doevents;
92 
93 		static readonly object instancelock = new object ();
94 		static readonly object queuelock = new object ();
95 
96 		// Event Handlers
97 		internal override event EventHandler Idle;
98 		#endregion
99 
100 		#region Constructors
XplatUICarbon()101 		private XplatUICarbon() {
102 
103 			RefCount = 0;
104 			TimerList = new ArrayList ();
105 			in_doevents = false;
106 			MessageQueue = new Queue ();
107 
108 			Initialize ();
109 		}
110 
~XplatUICarbon()111 		~XplatUICarbon() {
112 			// FIXME: Clean up the FosterParent here.
113 		}
114 		#endregion
115 
116 		#region Singleton specific code
GetInstance()117 		public static XplatUICarbon GetInstance() {
118 			lock (instancelock) {
119 				if (Instance == null) {
120 					Instance = new XplatUICarbon ();
121 				}
122 				RefCount++;
123 			}
124 			return Instance;
125 		}
126 
127 		public int Reference {
128 			get {
129 				return RefCount;
130 			}
131 		}
132 		#endregion
133 
134 		#region Internal methods
AddExpose(Hwnd hwnd, bool client, Carbon.HIRect rect)135 		internal void AddExpose (Hwnd hwnd, bool client, Carbon.HIRect rect) {
136 			AddExpose (hwnd, client, (int) rect.origin.x, (int) rect.origin.y, (int) rect.size.width, (int) rect.size.height);
137 		}
138 
AddExpose(Hwnd hwnd, bool client, Rectangle rect)139 		internal void AddExpose (Hwnd hwnd, bool client, Rectangle rect) {
140 			AddExpose (hwnd, client, (int) rect.X, (int) rect.Y, (int) rect.Width, (int) rect.Height);
141 		}
142 
FlushQueue()143 		internal void FlushQueue () {
144 			CheckTimers (DateTime.UtcNow);
145 			lock (queuelock) {
146 				while (MessageQueue.Count > 0) {
147 					object queueobj = MessageQueue.Dequeue ();
148 					if (queueobj is GCHandle) {
149 						XplatUIDriverSupport.ExecuteClientMessage((GCHandle)queueobj);
150 					} else {
151 						MSG msg = (MSG)queueobj;
152 						NativeWindow.WndProc (msg.hwnd, msg.message, msg.wParam, msg.lParam);
153 					}
154 				}
155 			}
156 		}
157 
GetClippingRectangles(IntPtr handle)158 		internal static Rectangle [] GetClippingRectangles (IntPtr handle) {
159 			Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
160 
161 			if (hwnd == null)
162 				return null;
163  			if (hwnd.Handle != handle)
164 				return new Rectangle [] {hwnd.ClientRect};
165 
166 			return (Rectangle []) hwnd.GetClippingRectangles ().ToArray (typeof (Rectangle));
167 		}
168 
GetMousewParam(int Delta)169 		internal IntPtr GetMousewParam(int Delta) {
170 			int	 result = 0;
171 
172 			if ((MouseState & MouseButtons.Left) != 0) {
173 				result |= (int)MsgButtons.MK_LBUTTON;
174 			}
175 
176 			if ((MouseState & MouseButtons.Middle) != 0) {
177 				result |= (int)MsgButtons.MK_MBUTTON;
178 			}
179 
180 			if ((MouseState & MouseButtons.Right) != 0) {
181 				result |= (int)MsgButtons.MK_RBUTTON;
182 			}
183 
184 			Keys mods = ModifierKeys;
185 			if ((mods & Keys.Control) != 0) {
186 				result |= (int)MsgButtons.MK_CONTROL;
187 			}
188 
189 			if ((mods & Keys.Shift) != 0) {
190 				result |= (int)MsgButtons.MK_SHIFT;
191 			}
192 
193 			result |= Delta << 16;
194 
195 			return (IntPtr)result;
196 		}
197 
HandleToWindow(IntPtr handle)198 		internal IntPtr HandleToWindow (IntPtr handle) {
199 			if (HandleMapping [handle] != null)
200 				return (IntPtr) HandleMapping [handle];
201 			return IntPtr.Zero;
202 		}
203 
Initialize()204 		internal void Initialize () {
205 			if (Marshal.SizeOf<IntPtr> () == 8){
206 				Console.Error.WriteLine ("WARNING: The Carbon driver has not been ported to 64bits, and very few parts of Windows.Forms will work properly, or at all");
207 			}
208 			// Initialize the event handlers
209 			Carbon.EventHandler.Driver = this;
210 			ApplicationHandler = new Carbon.ApplicationHandler (this);
211 			ControlHandler = new Carbon.ControlHandler (this);
212 			HIObjectHandler = new Carbon.HIObjectHandler (this);
213 			KeyboardHandler = new Carbon.KeyboardHandler (this);
214 			MouseHandler = new Carbon.MouseHandler (this);
215 			WindowHandler = new Carbon.WindowHandler (this);
216 
217 			// Initilize the mouse controls
218 			Hover.Interval = 500;
219 			Hover.Timer = new Timer ();
220 			Hover.Timer.Enabled = false;
221 			Hover.Timer.Interval = Hover.Interval;
222 			Hover.Timer.Tick += new EventHandler (HoverCallback);
223 			Hover.X = -1;
224 			Hover.Y = -1;
225 			MouseState = MouseButtons.None;
226 			mouse_position = Point.Empty;
227 
228 			// Initialize the Caret
229 			Caret.Timer = new Timer ();
230 			Caret.Timer.Interval = 500;
231 			Caret.Timer.Tick += new EventHandler (CaretCallback);
232 
233 			// Initialize the D&D
234 			Dnd = new Carbon.Dnd ();
235 
236 			// Initialize the Carbon Specific stuff
237 			WindowMapping = new Hashtable ();
238 			HandleMapping = new Hashtable ();
239 			UtilityWindows = new ArrayList ();
240 
241 			// Initialize the FosterParent
242 			Carbon.Rect rect = new Carbon.Rect ();
243 			SetRect (ref rect, (short)0, (short)0, (short)0, (short)0);
244 			Carbon.ProcessSerialNumber psn = new Carbon.ProcessSerialNumber();
245 
246 			GetCurrentProcess( ref psn );
247 			TransformProcessType (ref psn, 1);
248 			SetFrontProcess (ref psn);
249 
250 			HIObjectRegisterSubclass (__CFStringMakeConstantString ("com.novell.mwfview"), __CFStringMakeConstantString ("com.apple.hiview"), 0, Carbon.EventHandler.EventHandlerDelegate, (uint)Carbon.EventHandler.HIObjectEvents.Length, Carbon.EventHandler.HIObjectEvents, IntPtr.Zero, ref Subclass);
251 
252 			Carbon.EventHandler.InstallApplicationHandler ();
253 
254 			CreateNewWindow (Carbon.WindowClass.kDocumentWindowClass, Carbon.WindowAttributes.kWindowStandardHandlerAttribute | Carbon.WindowAttributes.kWindowCloseBoxAttribute | Carbon.WindowAttributes.kWindowFullZoomAttribute | Carbon.WindowAttributes.kWindowCollapseBoxAttribute | Carbon.WindowAttributes.kWindowResizableAttribute | Carbon.WindowAttributes.kWindowCompositingAttribute, ref rect, ref FosterParent);
255 
256 			CreateNewWindow (Carbon.WindowClass.kOverlayWindowClass, Carbon.WindowAttributes.kWindowNoUpdatesAttribute | Carbon.WindowAttributes.kWindowNoActivatesAttribute, ref rect, ref ReverseWindow);
257 			CreateNewWindow (Carbon.WindowClass.kOverlayWindowClass, Carbon.WindowAttributes.kWindowNoUpdatesAttribute | Carbon.WindowAttributes.kWindowNoActivatesAttribute, ref rect, ref CaretWindow);
258 
259 			// Get some values about bar heights
260 			Carbon.Rect structRect = new Carbon.Rect ();
261 			Carbon.Rect contentRect = new Carbon.Rect ();
262 			GetWindowBounds (FosterParent, 32, ref structRect);
263 			GetWindowBounds (FosterParent, 33, ref contentRect);
264 
265 			MenuBarHeight = GetMBarHeight ();
266 
267 			// Focus
268 			FocusWindow = IntPtr.Zero;
269 
270 			// Message loop
271 			GetMessageResult = true;
272 
273 			ReverseWindowMapped = false;
274 		}
275 
PerformNCCalc(Hwnd hwnd)276 		internal void PerformNCCalc(Hwnd hwnd) {
277 			XplatUIWin32.NCCALCSIZE_PARAMS  ncp;
278 			IntPtr ptr;
279 			Rectangle rect;
280 
281 			rect = new Rectangle (0, 0, hwnd.Width, hwnd.Height);
282 
283 			ncp = new XplatUIWin32.NCCALCSIZE_PARAMS();
284 			ptr = Marshal.AllocHGlobal(Marshal.SizeOf(ncp));
285 
286 			ncp.rgrc1.left = rect.Left;
287 			ncp.rgrc1.top = rect.Top;
288 			ncp.rgrc1.right = rect.Right;
289 			ncp.rgrc1.bottom = rect.Bottom;
290 
291 			Marshal.StructureToPtr(ncp, ptr, true);
292 			NativeWindow.WndProc(hwnd.client_window, Msg.WM_NCCALCSIZE, (IntPtr)1, ptr);
293 			ncp = (XplatUIWin32.NCCALCSIZE_PARAMS)Marshal.PtrToStructure(ptr, typeof(XplatUIWin32.NCCALCSIZE_PARAMS));
294 			Marshal.FreeHGlobal(ptr);
295 
296 
297 			rect = new Rectangle(ncp.rgrc1.left, ncp.rgrc1.top, ncp.rgrc1.right - ncp.rgrc1.left, ncp.rgrc1.bottom - ncp.rgrc1.top);
298 			hwnd.ClientRect = rect;
299 
300 			rect = TranslateClientRectangleToQuartzClientRectangle (hwnd);
301 
302 			if (hwnd.visible) {
303 				Carbon.HIRect r = new Carbon.HIRect (rect.X, rect.Y, rect.Width, rect.Height);
304 				HIViewSetFrame (hwnd.client_window, ref r);
305 			}
306 
307 			AddExpose (hwnd, false, 0, 0, hwnd.Width, hwnd.Height);
308 		}
309 
ScreenToClient(IntPtr handle, ref Carbon.QDPoint point)310 		internal void ScreenToClient(IntPtr handle, ref Carbon.QDPoint point) {
311 			int x = (int) point.x;
312 			int y = (int) point.y;
313 
314 			ScreenToClient (handle, ref x, ref y);
315 
316 			point.x = (short) x;
317 			point.y = (short) y;
318 		}
319 
TranslateClientRectangleToQuartzClientRectangle(Hwnd hwnd)320 		internal static Rectangle TranslateClientRectangleToQuartzClientRectangle (Hwnd hwnd) {
321 			return TranslateClientRectangleToQuartzClientRectangle (hwnd, Control.FromHandle (hwnd.Handle));
322 		}
323 
TranslateClientRectangleToQuartzClientRectangle(Hwnd hwnd, Control ctrl)324 		internal static Rectangle TranslateClientRectangleToQuartzClientRectangle (Hwnd hwnd, Control ctrl) {
325 			/* From XplatUIX11
326 			 * If this is a form with no window manager, X is handling all the border and caption painting
327 			 * so remove that from the area (since the area we set of the window here is the part of the window
328 			 * we're painting in only)
329 			 */
330 			Rectangle rect = hwnd.ClientRect;
331 			Form form = ctrl as Form;
332 			CreateParams cp = null;
333 
334 			if (form != null)
335 				cp = form.GetCreateParams ();
336 
337 			if (form != null && (form.window_manager == null || cp.IsSet (WindowExStyles.WS_EX_TOOLWINDOW))) {
338 				Hwnd.Borders borders = Hwnd.GetBorders (cp, null);
339 				Rectangle qrect = rect;
340 
341 				qrect.Y -= borders.top;
342 				qrect.X -= borders.left;
343 				qrect.Width += borders.left + borders.right;
344 				qrect.Height += borders.top + borders.bottom;
345 
346 				rect = qrect;
347 			}
348 
349 			if (rect.Width < 1 || rect.Height < 1) {
350 				rect.Width = 1;
351 				rect.Height = 1;
352 				rect.X = -5;
353 				rect.Y = -5;
354 			}
355 
356 			return rect;
357 		}
358 
TranslateWindowSizeToQuartzWindowSize(CreateParams cp)359 		internal static Size TranslateWindowSizeToQuartzWindowSize (CreateParams cp) {
360 			return TranslateWindowSizeToQuartzWindowSize (cp, new Size (cp.Width, cp.Height));
361 		}
362 
TranslateWindowSizeToQuartzWindowSize(CreateParams cp, Size size)363 		internal static Size TranslateWindowSizeToQuartzWindowSize (CreateParams cp, Size size) {
364 			/* From XplatUIX11
365 			 * If this is a form with no window manager, X is handling all the border and caption painting
366 			 * so remove that from the area (since the area we set of the window here is the part of the window
367 			 * we're painting in only)
368 			 */
369 			Form form = cp.control as Form;
370 			if (form != null && (form.window_manager == null || cp.IsSet (WindowExStyles.WS_EX_TOOLWINDOW))) {
371 				Hwnd.Borders borders = Hwnd.GetBorders (cp, null);
372 				Size qsize = size;
373 
374 				qsize.Width -= borders.left + borders.right;
375 				qsize.Height -= borders.top + borders.bottom;
376 
377 				size = qsize;
378 			}
379 
380 			if (size.Height == 0)
381 				size.Height = 1;
382 			if (size.Width == 0)
383 				size.Width = 1;
384 			return size;
385 		}
386 
TranslateQuartzWindowSizeToWindowSize(CreateParams cp, int width, int height)387 		internal static Size TranslateQuartzWindowSizeToWindowSize (CreateParams cp, int width, int height) {
388 			/* From XplatUIX11
389 			 * If this is a form with no window manager, X is handling all the border and caption painting
390 			 * so remove that from the area (since the area we set of the window here is the part of the window
391 			 * we're painting in only)
392 			 */
393 			Size size = new Size (width, height);
394 			Form form = cp.control as Form;
395 			if (form != null && (form.window_manager == null || cp.IsSet (WindowExStyles.WS_EX_TOOLWINDOW))) {
396 				Hwnd.Borders borders = Hwnd.GetBorders (cp, null);
397 				Size qsize = size;
398 
399 				qsize.Width += borders.left + borders.right;
400 				qsize.Height += borders.top + borders.bottom;
401 
402 				size = qsize;
403 			}
404 
405 			return size;
406 		}
407 		#endregion
408 
409 		#region Callbacks
CaretCallback(object sender, EventArgs e)410 		private void CaretCallback (object sender, EventArgs e) {
411 			if (Caret.Paused) {
412 				return;
413 			}
414 
415 			if (!Caret.On) {
416 				ShowCaret ();
417 			} else {
418 				HideCaret ();
419 			}
420 		}
421 
HoverCallback(object sender, EventArgs e)422 		private void HoverCallback (object sender, EventArgs e) {
423 			if ((Hover.X == mouse_position.X) && (Hover.Y == mouse_position.Y)) {
424 				MSG msg = new MSG ();
425 				msg.hwnd = Hover.Hwnd;
426 				msg.message = Msg.WM_MOUSEHOVER;
427 				msg.wParam = GetMousewParam (0);
428 				msg.lParam = (IntPtr)((ushort)Hover.X << 16 | (ushort)Hover.X);
429 				EnqueueMessage (msg);
430 			}
431 		}
432 		#endregion
433 
434 		#region Private Methods
ConvertScreenPointToClient(IntPtr handle, Point point)435 		private Point ConvertScreenPointToClient (IntPtr handle, Point point) {
436 			Point converted_point = new Point ();
437 			Carbon.Rect window_bounds = new Carbon.Rect ();
438 			Carbon.CGPoint native_point = new Carbon.CGPoint ();
439 
440 			GetWindowBounds (HIViewGetWindow (handle), 32, ref window_bounds);
441 
442 			native_point.x = (point.X - window_bounds.left);
443 			native_point.y = (point.Y - window_bounds.top);
444 
445 			HIViewConvertPoint (ref native_point, IntPtr.Zero, handle);
446 
447 			converted_point.X = (int)native_point.x;
448 			converted_point.Y = (int)native_point.y;
449 
450 			return converted_point;
451 		}
452 
ConvertClientPointToScreen(IntPtr handle, Point point)453 		private Point ConvertClientPointToScreen (IntPtr handle, Point point) {
454 			Point converted_point = new Point ();
455 			Carbon.Rect window_bounds = new Carbon.Rect ();
456 			Carbon.CGPoint native_point = new Carbon.CGPoint ();
457 
458 			GetWindowBounds (HIViewGetWindow (handle), 32, ref window_bounds);
459 
460 			native_point.x = point.X;
461 			native_point.y = point.Y;
462 
463 			HIViewConvertPoint (ref native_point, handle, IntPtr.Zero);
464 
465 			converted_point.X = (int)(native_point.x + window_bounds.left);
466 			converted_point.Y = (int)(native_point.y + window_bounds.top);
467 
468 			return converted_point;
469 		}
470 
NextTimeout()471 		private double NextTimeout () {
472 			DateTime now = DateTime.UtcNow;
473 			int timeout = 0x7FFFFFF;
474 			lock (TimerList) {
475 				foreach (Timer timer in TimerList) {
476 					int next = (int) (timer.Expires - now).TotalMilliseconds;
477 					if (next < 0)
478 						return 0;
479 					if (next < timeout)
480 						timeout = next;
481 				}
482 			}
483 			if (timeout < Timer.Minimum)
484 				timeout = Timer.Minimum;
485 
486 			return (double)((double)timeout/1000);
487 		}
488 
CheckTimers(DateTime now)489 		private void CheckTimers (DateTime now) {
490 			lock (TimerList) {
491 				int count = TimerList.Count;
492 				if (count == 0)
493 					return;
494 				for (int i = 0; i < TimerList.Count; i++) {
495 					Timer timer = (Timer) TimerList [i];
496 					if (timer.Enabled && timer.Expires <= now) {
497 						// Timer ticks:
498 						//  - Before MainForm.OnLoad if DoEvents () is called.
499 						//  - After MainForm.OnLoad if not.
500 						//
501 						if (in_doevents ||
502 						    (Application.MWFThread.Current.Context != null &&
503 						     Application.MWFThread.Current.Context.MainForm != null &&
504 						     Application.MWFThread.Current.Context.MainForm.IsLoaded)) {
505 							timer.FireTick ();
506 							timer.Update (now);
507 						}
508 					}
509 				}
510 			}
511 		}
512 
WaitForHwndMessage(Hwnd hwnd, Msg message)513 		private void WaitForHwndMessage (Hwnd hwnd, Msg message) {
514 			MSG msg = new MSG ();
515 
516 			bool done = false;
517 			do {
518 				if (GetMessage(null, ref msg, IntPtr.Zero, 0, 0)) {
519 					if ((Msg)msg.message == Msg.WM_QUIT) {
520 						PostQuitMessage (0);
521 						done = true;
522 					}
523 					else {
524 						if (msg.hwnd == hwnd.Handle) {
525 							if ((Msg)msg.message == message)
526 								break;
527 							else if ((Msg)msg.message == Msg.WM_DESTROY)
528 								done = true;
529 						}
530 
531 						TranslateMessage (ref msg);
532 						DispatchMessage (ref msg);
533 					}
534 				}
535 			} while (!done);
536 		}
537 
SendParentNotify(IntPtr child, Msg cause, int x, int y)538 		private void SendParentNotify(IntPtr child, Msg cause, int x, int y) {
539 			Hwnd hwnd;
540 
541 			if (child == IntPtr.Zero) {
542 				return;
543 			}
544 
545 			hwnd = Hwnd.GetObjectFromWindow (child);
546 
547 			if (hwnd == null) {
548 				return;
549 			}
550 
551 			if (hwnd.Handle == IntPtr.Zero) {
552 				return;
553 			}
554 
555 			if (ExStyleSet ((int) hwnd.initial_ex_style, WindowExStyles.WS_EX_NOPARENTNOTIFY)) {
556 				return;
557 			}
558 
559 			if (hwnd.Parent == null) {
560 				return;
561 			}
562 
563 			if (hwnd.Parent.Handle == IntPtr.Zero) {
564 				return;
565 			}
566 
567 			if (cause == Msg.WM_CREATE || cause == Msg.WM_DESTROY) {
568 				SendMessage(hwnd.Parent.Handle, Msg.WM_PARENTNOTIFY, Control.MakeParam((int)cause, 0), child);
569 			} else {
570 				SendMessage(hwnd.Parent.Handle, Msg.WM_PARENTNOTIFY, Control.MakeParam((int)cause, 0), Control.MakeParam(x, y));
571 			}
572 
573 			SendParentNotify (hwnd.Parent.Handle, cause, x, y);
574 		}
575 
StyleSet(int s, WindowStyles ws)576 		private bool StyleSet (int s, WindowStyles ws) {
577 			return (s & (int)ws) == (int)ws;
578 		}
579 
ExStyleSet(int ex, WindowExStyles exws)580 		private bool ExStyleSet (int ex, WindowExStyles exws) {
581 			return (ex & (int)exws) == (int)exws;
582 		}
583 
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)584 		private void DeriveStyles(int Style, int ExStyle, out FormBorderStyle border_style, out bool border_static, out TitleStyle title_style, out int caption_height, out int tool_caption_height) {
585 
586 			caption_height = 0;
587 			tool_caption_height = 0;
588 			border_static = false;
589 
590 			if (StyleSet (Style, WindowStyles.WS_CHILD)) {
591 				if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_CLIENTEDGE)) {
592 					border_style = FormBorderStyle.Fixed3D;
593 				} else if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_STATICEDGE)) {
594 					border_style = FormBorderStyle.Fixed3D;
595 					border_static = true;
596 				} else if (!StyleSet (Style, WindowStyles.WS_BORDER)) {
597 					border_style = FormBorderStyle.None;
598 				} else {
599 					border_style = FormBorderStyle.FixedSingle;
600 				}
601 				title_style = TitleStyle.None;
602 
603 				if (StyleSet (Style, WindowStyles.WS_CAPTION)) {
604 					caption_height = 0;
605 					if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
606 						title_style = TitleStyle.Tool;
607 					} else {
608 						title_style = TitleStyle.Normal;
609 					}
610 				}
611 
612 				if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_MDICHILD)) {
613 					caption_height = 0;
614 
615 					if (StyleSet (Style, WindowStyles.WS_OVERLAPPEDWINDOW) ||
616 						ExStyleSet (ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
617 						border_style = (FormBorderStyle) 0xFFFF;
618 					} else {
619 						border_style = FormBorderStyle.None;
620 					}
621 				}
622 
623 			} else {
624 				title_style = TitleStyle.None;
625 				if (StyleSet (Style, WindowStyles.WS_CAPTION)) {
626 					if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
627 						title_style = TitleStyle.Tool;
628 					} else {
629 						title_style = TitleStyle.Normal;
630 					}
631 				}
632 
633 				border_style = FormBorderStyle.None;
634 
635 				if (StyleSet (Style, WindowStyles.WS_THICKFRAME)) {
636 					if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
637 						border_style = FormBorderStyle.SizableToolWindow;
638 					} else {
639 						border_style = FormBorderStyle.Sizable;
640 					}
641 				} else {
642 					if (StyleSet (Style, WindowStyles.WS_CAPTION)) {
643 						if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_CLIENTEDGE)) {
644 							border_style = FormBorderStyle.Fixed3D;
645 						} else if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_STATICEDGE)) {
646 							border_style = FormBorderStyle.Fixed3D;
647 							border_static = true;
648 						} else if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_DLGMODALFRAME)) {
649 							border_style = FormBorderStyle.FixedDialog;
650 						} else if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
651 							border_style = FormBorderStyle.FixedToolWindow;
652 						} else if (StyleSet (Style, WindowStyles.WS_BORDER)) {
653 							border_style = FormBorderStyle.FixedSingle;
654 						}
655 					} else {
656 						if (StyleSet (Style, WindowStyles.WS_BORDER)) {
657 							border_style = FormBorderStyle.FixedSingle;
658 						}
659 					}
660 				}
661 			}
662 		}
663 
SetHwndStyles(Hwnd hwnd, CreateParams cp)664 		private void SetHwndStyles(Hwnd hwnd, CreateParams cp) {
665 			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);
666 		}
667 
ShowCaret()668 		private void ShowCaret () {
669 			if (Caret.On)
670 				return;
671 			Caret.On = true;
672 			ShowWindow (CaretWindow);
673 			Graphics g = Graphics.FromHwnd (HIViewGetRoot (CaretWindow));
674 
675 			g.FillRectangle (new SolidBrush (Color.Black), new Rectangle (0, 0, Caret.Width, Caret.Height));
676 
677 			g.Dispose ();
678 		}
679 
HideCaret()680 		private void HideCaret () {
681 			if (!Caret.On)
682 				return;
683 			Caret.On = false;
684 			HideWindow (CaretWindow);
685 		}
686 
AccumulateDestroyedHandles(Control c, ArrayList list)687 		private void AccumulateDestroyedHandles (Control c, ArrayList list) {
688 			if (c != null) {
689 				Control[] controls = c.Controls.GetAllControls ();
690 
691 				if (c.IsHandleCreated && !c.IsDisposed) {
692 					Hwnd hwnd = Hwnd.ObjectFromHandle(c.Handle);
693 
694 					list.Add (hwnd);
695 					CleanupCachedWindows (hwnd);
696 				}
697 
698 				for (int  i = 0; i < controls.Length; i ++) {
699 					AccumulateDestroyedHandles (controls[i], list);
700 				}
701 			}
702 
703 		}
704 
CleanupCachedWindows(Hwnd hwnd)705 		private void CleanupCachedWindows (Hwnd hwnd) {
706 			if (ActiveWindow == hwnd.Handle) {
707 				SendMessage(hwnd.client_window, Msg.WM_ACTIVATE, (IntPtr)WindowActiveFlags.WA_INACTIVE, IntPtr.Zero);
708 				ActiveWindow = IntPtr.Zero;
709 			}
710 
711 			if (FocusWindow == hwnd.Handle) {
712 				SendMessage(hwnd.client_window, Msg.WM_KILLFOCUS, IntPtr.Zero, IntPtr.Zero);
713 				FocusWindow = IntPtr.Zero;
714 			}
715 
716 			if (Grab.Hwnd == hwnd.Handle) {
717 				Grab.Hwnd = IntPtr.Zero;
718 				Grab.Confined = false;
719 			}
720 
721 			DestroyCaret (hwnd.Handle);
722 		}
723 
AddExpose(Hwnd hwnd, bool client, int x, int y, int width, int height)724 		private void AddExpose (Hwnd hwnd, bool client, int x, int y, int width, int height) {
725 			// Don't waste time
726 			if ((hwnd == null) || (x > hwnd.Width) || (y > hwnd.Height) || ((x + width) < 0) || ((y + height) < 0)) {
727 				return;
728 			}
729 
730 			// Keep the invalid area as small as needed
731 			if ((x + width) > hwnd.width) {
732 				width = hwnd.width - x;
733 			}
734 
735 			if ((y + height) > hwnd.height) {
736 				height = hwnd.height - y;
737 			}
738 
739 			if (client) {
740 				hwnd.AddInvalidArea(x, y, width, height);
741 				if (!hwnd.expose_pending && hwnd.visible) {
742 					MSG msg = new MSG ();
743 					msg.message = Msg.WM_PAINT;
744 					msg.hwnd = hwnd.Handle;
745 					EnqueueMessage (msg);
746 					hwnd.expose_pending = true;
747 				}
748 			} else {
749 				hwnd.AddNcInvalidArea (x, y, width, height);
750 				if (!hwnd.nc_expose_pending && hwnd.visible) {
751 					MSG msg = new MSG ();
752 					Region rgn = new Region (hwnd.Invalid);
753 					IntPtr hrgn = rgn.GetHrgn (null); // Graphics object isn't needed
754 					msg.message = Msg.WM_NCPAINT;
755 					msg.wParam = hrgn == IntPtr.Zero ? (IntPtr)1 : hrgn;
756 					msg.refobject = rgn;
757 					msg.hwnd = hwnd.Handle;
758 					EnqueueMessage (msg);
759 					hwnd.nc_expose_pending = true;
760 
761 				}
762 			}
763 		}
764 		#endregion
765 
766 		#region Public Methods
EnqueueMessage(MSG msg)767 		internal void EnqueueMessage (MSG msg) {
768 			lock (queuelock) {
769 				MessageQueue.Enqueue (msg);
770 			}
771 		}
772 
RaiseIdle(EventArgs e)773 		internal override void RaiseIdle (EventArgs e)
774 		{
775 			if (Idle != null)
776 				Idle (this, e);
777 		}
778 
InitializeDriver()779 		internal override IntPtr InitializeDriver() {
780 			return IntPtr.Zero;
781 		}
782 
ShutdownDriver(IntPtr token)783 		internal override void ShutdownDriver(IntPtr token) {
784 		}
785 
EnableThemes()786 		internal override void EnableThemes() {
787 			themes_enabled = true;
788 		}
789 
Activate(IntPtr handle)790 		internal override void Activate(IntPtr handle) {
791 			if (ActiveWindow != IntPtr.Zero) {
792 				UnactiveWindow = ActiveWindow;
793 				ActivateWindow (HIViewGetWindow (ActiveWindow), false);
794 			}
795 			ActivateWindow (HIViewGetWindow (handle), true);
796 			ActiveWindow = handle;
797 		}
798 
AudibleAlert(AlertType alert)799 		internal override void AudibleAlert(AlertType alert) {
800 			AlertSoundPlay ();
801 		}
802 
BeginMoveResize(IntPtr handle)803 		internal override void BeginMoveResize (IntPtr handle) {
804 		}
805 
CaretVisible(IntPtr hwnd, bool visible)806 		internal override void CaretVisible (IntPtr hwnd, bool visible) {
807 			if (Caret.Hwnd == hwnd) {
808 				if (visible) {
809 					if (Caret.Visible < 1) {
810 						Caret.Visible++;
811 						Caret.On = false;
812 						if (Caret.Visible == 1) {
813 							ShowCaret ();
814 							Caret.Timer.Start ();
815 						}
816 					}
817 				} else {
818 					Caret.Visible--;
819 					if (Caret.Visible == 0) {
820 						Caret.Timer.Stop ();
821 						HideCaret ();
822 					}
823 				}
824 			}
825 		}
826 
CalculateWindowRect(ref Rectangle ClientRect, CreateParams cp, Menu menu, out Rectangle WindowRect)827 		internal override bool CalculateWindowRect(ref Rectangle ClientRect, CreateParams cp, Menu menu, out Rectangle WindowRect) {
828 			WindowRect = Hwnd.GetWindowRectangle (cp, menu, ClientRect);
829 			return true;
830 		}
831 
ClientToScreen(IntPtr handle, ref int x, ref int y)832 		internal override void ClientToScreen(IntPtr handle, ref int x, ref int y) {
833 			Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
834 
835 			Point point = ConvertClientPointToScreen (hwnd.ClientWindow, new Point (x, y));
836 
837 			x = point.X;
838 			y = point.Y;
839 		}
840 
MenuToScreen(IntPtr handle, ref int x, ref int y)841 		internal override void MenuToScreen(IntPtr handle, ref int x, ref int y) {
842 			Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
843 
844 			Point point = ConvertClientPointToScreen (hwnd.ClientWindow, new Point (x, y));
845 
846 			x = point.X;
847 			y = point.Y;
848 		}
849 
ClipboardAvailableFormats(IntPtr handle)850 		internal override int[] ClipboardAvailableFormats(IntPtr handle) {
851 			ArrayList list = new ArrayList ();
852 			DataFormats.Format f = DataFormats.Format.List;
853 
854 			while (f != null) {
855 				list.Add (f.Id);
856 				f = f.Next;
857 			}
858 
859 			return (int [])list.ToArray (typeof (int));
860 		}
861 
ClipboardClose(IntPtr handle)862 		internal override void ClipboardClose(IntPtr handle) {
863 		}
864 
865 		//TODO: Map our internal formats to the right os code where we can
ClipboardGetID(IntPtr handle, string format)866 		internal override int ClipboardGetID(IntPtr handle, string format) {
867 			return (int)__CFStringMakeConstantString (format);
868 		}
869 
ClipboardOpen(bool primary_selection)870 		internal override IntPtr ClipboardOpen(bool primary_selection) {
871 			if (primary_selection)
872 				return Carbon.Pasteboard.Primary;
873 			return Carbon.Pasteboard.Application;
874 		}
875 
ClipboardRetrieve(IntPtr handle, int type, XplatUI.ClipboardToObject converter)876 		internal override object ClipboardRetrieve(IntPtr handle, int type, XplatUI.ClipboardToObject converter) {
877 			return Carbon.Pasteboard.Retrieve (handle, type);
878 		}
879 
ClipboardStore(IntPtr handle, object obj, int type, XplatUI.ObjectToClipboard converter, bool copy)880 		internal override void ClipboardStore(IntPtr handle, object obj, int type, XplatUI.ObjectToClipboard converter, bool copy) {
881 			Carbon.Pasteboard.Store (handle, obj, type);
882 		}
883 
CreateCaret(IntPtr hwnd, int width, int height)884 		internal override void CreateCaret (IntPtr hwnd, int width, int height) {
885 			if (Caret.Hwnd != IntPtr.Zero)
886 				DestroyCaret (Caret.Hwnd);
887 
888 			Caret.Hwnd = hwnd;
889 			Caret.Width = width;
890 			Caret.Height = height;
891 			Caret.Visible = 0;
892 			Caret.On = false;
893 		}
894 
CreateWindow(CreateParams cp)895 		internal override IntPtr CreateWindow(CreateParams cp) {
896 			Hwnd hwnd;
897 			Hwnd parent_hwnd = null;
898 			int X;
899 			int Y;
900 			int Width;
901 			int Height;
902 			IntPtr ParentHandle;
903 			IntPtr WindowHandle;
904 			IntPtr WholeWindow;
905 			IntPtr ClientWindow;
906 			IntPtr WholeWindowTracking;
907 			IntPtr ClientWindowTracking;
908 
909 			hwnd = new Hwnd ();
910 
911 			X = cp.X;
912 			Y = cp.Y;
913 			Width = cp.Width;
914 			Height = cp.Height;
915 			ParentHandle = IntPtr.Zero;
916 			WindowHandle = IntPtr.Zero;
917 			WholeWindow = IntPtr.Zero;
918 			ClientWindow = IntPtr.Zero;
919 			WholeWindowTracking = IntPtr.Zero;
920 			ClientWindowTracking = IntPtr.Zero;
921 
922 			if (Width < 1) Width = 1;
923 			if (Height < 1) Height = 1;
924 
925 			if (cp.Parent != IntPtr.Zero) {
926 				parent_hwnd = Hwnd.ObjectFromHandle (cp.Parent);
927 				ParentHandle = parent_hwnd.client_window;
928 			} else {
929 				if (StyleSet (cp.Style, WindowStyles.WS_CHILD)) {
930 					HIViewFindByID (HIViewGetRoot (FosterParent), new Carbon.HIViewID (Carbon.EventHandler.kEventClassWindow, 1), ref ParentHandle);
931 				}
932 			}
933 
934 			Point next;
935 			if (cp.control is Form) {
936 				next = Hwnd.GetNextStackedFormLocation (cp, parent_hwnd);
937 				X = next.X;
938 				Y = next.Y;
939 			}
940 
941 			hwnd.x = X;
942 			hwnd.y = Y;
943 			hwnd.width = Width;
944 			hwnd.height = Height;
945 			hwnd.Parent = Hwnd.ObjectFromHandle (cp.Parent);
946 			hwnd.initial_style = cp.WindowStyle;
947 			hwnd.initial_ex_style = cp.WindowExStyle;
948 			hwnd.visible = false;
949 
950 			if (StyleSet (cp.Style, WindowStyles.WS_DISABLED)) {
951 				hwnd.enabled = false;
952 			}
953 
954 			ClientWindow = IntPtr.Zero;
955 
956 			Size QWindowSize = TranslateWindowSizeToQuartzWindowSize (cp);
957 			Rectangle QClientRect = TranslateClientRectangleToQuartzClientRectangle (hwnd, cp.control);
958 
959 			SetHwndStyles(hwnd, cp);
960 /* FIXME */
961 			if (ParentHandle == IntPtr.Zero) {
962 				IntPtr WindowView = IntPtr.Zero;
963 				IntPtr GrowBox = IntPtr.Zero;
964 				Carbon.WindowClass windowklass = Carbon.WindowClass.kOverlayWindowClass;
965 				Carbon.WindowAttributes attributes = Carbon.WindowAttributes.kWindowCompositingAttribute | Carbon.WindowAttributes.kWindowStandardHandlerAttribute;
966 				if (StyleSet (cp.Style, WindowStyles.WS_MINIMIZEBOX)) {
967 					attributes |= Carbon.WindowAttributes.kWindowCollapseBoxAttribute;
968 				}
969 				if (StyleSet (cp.Style, WindowStyles.WS_MAXIMIZEBOX)) {
970 					attributes |= Carbon.WindowAttributes.kWindowResizableAttribute | Carbon.WindowAttributes.kWindowHorizontalZoomAttribute | Carbon.WindowAttributes.kWindowVerticalZoomAttribute;
971 				}
972 				if (StyleSet (cp.Style, WindowStyles.WS_SYSMENU)) {
973 					attributes |= Carbon.WindowAttributes.kWindowCloseBoxAttribute;
974 				}
975 				if (StyleSet (cp.Style, WindowStyles.WS_CAPTION)) {
976 					windowklass = Carbon.WindowClass.kDocumentWindowClass;
977 				}
978 				if (hwnd.border_style == FormBorderStyle.FixedToolWindow) {
979 					windowklass = Carbon.WindowClass.kUtilityWindowClass;
980 				} else if (hwnd.border_style == FormBorderStyle.SizableToolWindow) {
981 					attributes |= Carbon.WindowAttributes.kWindowResizableAttribute;
982 					windowklass = Carbon.WindowClass.kUtilityWindowClass;
983 				}
984 				if (windowklass == Carbon.WindowClass.kOverlayWindowClass) {
985 					attributes = Carbon.WindowAttributes.kWindowCompositingAttribute | Carbon.WindowAttributes.kWindowStandardHandlerAttribute;
986 				}
987 				attributes |= Carbon.WindowAttributes.kWindowLiveResizeAttribute;
988 
989 				Carbon.Rect rect = new Carbon.Rect ();
990 				if (StyleSet (cp.Style, WindowStyles.WS_POPUP)) {
991 					SetRect (ref rect, (short)X, (short)(Y), (short)(X + QWindowSize.Width), (short)(Y + QWindowSize.Height));
992 				} else {
993 					SetRect (ref rect, (short)X, (short)(Y + MenuBarHeight), (short)(X + QWindowSize.Width), (short)(Y + MenuBarHeight + QWindowSize.Height));
994 				}
995 
996 				CreateNewWindow (windowklass, attributes, ref rect, ref WindowHandle);
997 
998 				Carbon.EventHandler.InstallWindowHandler (WindowHandle);
999 				HIViewFindByID (HIViewGetRoot (WindowHandle), new Carbon.HIViewID (Carbon.EventHandler.kEventClassWindow, 1), ref WindowView);
1000 				HIViewFindByID (HIViewGetRoot (WindowHandle), new Carbon.HIViewID (Carbon.EventHandler.kEventClassWindow, 7), ref GrowBox);
1001 				HIGrowBoxViewSetTransparent (GrowBox, true);
1002 				SetAutomaticControlDragTrackingEnabledForWindow (WindowHandle, true);
1003 				ParentHandle = WindowView;
1004 			}
1005 
1006 			HIObjectCreate (__CFStringMakeConstantString ("com.novell.mwfview"), 0, ref WholeWindow);
1007 			HIObjectCreate (__CFStringMakeConstantString ("com.novell.mwfview"), 0, ref ClientWindow);
1008 
1009 			Carbon.EventHandler.InstallControlHandler (WholeWindow);
1010 			Carbon.EventHandler.InstallControlHandler (ClientWindow);
1011 
1012 			// Enable embedding on controls
1013 			HIViewChangeFeatures (WholeWindow, 1<<1, 0);
1014 			HIViewChangeFeatures (ClientWindow, 1<<1, 0);
1015 
1016 			HIViewNewTrackingArea (WholeWindow, IntPtr.Zero, (UInt64)WholeWindow, ref WholeWindowTracking);
1017 			HIViewNewTrackingArea (ClientWindow, IntPtr.Zero, (UInt64)ClientWindow, ref ClientWindowTracking);
1018 			Carbon.HIRect WholeRect;
1019 			if (WindowHandle != IntPtr.Zero) {
1020 				WholeRect = new Carbon.HIRect (0, 0, QWindowSize.Width, QWindowSize.Height);
1021 			} else {
1022 				WholeRect = new Carbon.HIRect (X, Y, QWindowSize.Width, QWindowSize.Height);
1023 			}
1024 			Carbon.HIRect ClientRect = new Carbon.HIRect (QClientRect.X, QClientRect.Y, QClientRect.Width, QClientRect.Height);
1025 			HIViewSetFrame (WholeWindow, ref WholeRect);
1026 			HIViewSetFrame (ClientWindow, ref ClientRect);
1027 
1028 			HIViewAddSubview (ParentHandle, WholeWindow);
1029 			HIViewAddSubview (WholeWindow, ClientWindow);
1030 
1031 			hwnd.WholeWindow = WholeWindow;
1032 			hwnd.ClientWindow = ClientWindow;
1033 
1034 			if (WindowHandle != IntPtr.Zero) {
1035 				WindowMapping [hwnd.Handle] = WindowHandle;
1036 				HandleMapping [WindowHandle] = hwnd.Handle;
1037 				if (hwnd.border_style == FormBorderStyle.FixedToolWindow || hwnd.border_style == FormBorderStyle.SizableToolWindow) {
1038 					UtilityWindows.Add (WindowHandle);
1039 				}
1040 			}
1041 
1042 			// Allow dnd on controls
1043 			Dnd.SetAllowDrop (hwnd, true);
1044 
1045 			Text (hwnd.Handle, cp.Caption);
1046 
1047 			SendMessage (hwnd.Handle, Msg.WM_CREATE, (IntPtr)1, IntPtr.Zero /* XXX unused */);
1048 			SendParentNotify (hwnd.Handle, Msg.WM_CREATE, int.MaxValue, int.MaxValue);
1049 
1050 			if (StyleSet (cp.Style, WindowStyles.WS_VISIBLE)) {
1051 				if (WindowHandle != IntPtr.Zero) {
1052 					if (Control.FromHandle(hwnd.Handle) is Form) {
1053 						Form f = Control.FromHandle(hwnd.Handle) as Form;
1054 						if (f.WindowState == FormWindowState.Normal) {
1055 							SendMessage(hwnd.Handle, Msg.WM_SHOWWINDOW, (IntPtr)1, IntPtr.Zero);
1056 						}
1057 					}
1058 					ShowWindow (WindowHandle);
1059 					WaitForHwndMessage (hwnd, Msg.WM_SHOWWINDOW);
1060 				}
1061 				HIViewSetVisible (WholeWindow, true);
1062 				HIViewSetVisible (ClientWindow, true);
1063 				hwnd.visible = true;
1064 				if (!(Control.FromHandle(hwnd.Handle) is Form)) {
1065 					SendMessage(hwnd.Handle, Msg.WM_SHOWWINDOW, (IntPtr)1, IntPtr.Zero);
1066 				}
1067 			}
1068 
1069 			if (StyleSet (cp.Style, WindowStyles.WS_MINIMIZE)) {
1070 				SetWindowState(hwnd.Handle, FormWindowState.Minimized);
1071 			} else if (StyleSet (cp.Style, WindowStyles.WS_MAXIMIZE)) {
1072 				SetWindowState(hwnd.Handle, FormWindowState.Maximized);
1073 			}
1074 
1075 			return hwnd.Handle;
1076 		}
1077 
CreateWindow(IntPtr Parent, int X, int Y, int Width, int Height)1078 		internal override IntPtr CreateWindow(IntPtr Parent, int X, int Y, int Width, int Height) {
1079 			CreateParams create_params = new CreateParams();
1080 
1081 			create_params.Caption = "";
1082 			create_params.X = X;
1083 			create_params.Y = Y;
1084 			create_params.Width = Width;
1085 			create_params.Height = Height;
1086 
1087 			create_params.ClassName=XplatUI.GetDefaultClassName (GetType ());
1088 			create_params.ClassStyle = 0;
1089 			create_params.ExStyle=0;
1090 			create_params.Parent=IntPtr.Zero;
1091 			create_params.Param=0;
1092 
1093 			return CreateWindow(create_params);
1094 		}
1095 
DefineStdCursorBitmap(StdCursor id)1096 		internal override Bitmap DefineStdCursorBitmap (StdCursor id) {
1097 			return Carbon.Cursor.DefineStdCursorBitmap (id);
1098 		}
1099 
DefineCursor(Bitmap bitmap, Bitmap mask, Color cursor_pixel, Color mask_pixel, int xHotSpot, int yHotSpot)1100 		internal override IntPtr DefineCursor (Bitmap bitmap, Bitmap mask, Color cursor_pixel, Color mask_pixel, int xHotSpot, int yHotSpot) {
1101 			return Carbon.Cursor.DefineCursor (bitmap, mask, cursor_pixel, mask_pixel, xHotSpot, yHotSpot);
1102 		}
1103 
DefineStdCursor(StdCursor id)1104 		internal override IntPtr DefineStdCursor (StdCursor id) {
1105 			return Carbon.Cursor.DefineStdCursor (id);
1106 		}
1107 
DefWndProc(ref Message msg)1108 		internal override IntPtr DefWndProc(ref Message msg) {
1109 			Hwnd hwnd = Hwnd.ObjectFromHandle (msg.HWnd);
1110 			switch ((Msg)msg.Msg) {
1111 				case Msg.WM_IME_COMPOSITION:
1112 					string s = KeyboardHandler.ComposedString;
1113 					foreach (char c in s)
1114 						SendMessage (msg.HWnd, Msg.WM_IME_CHAR, (IntPtr) c, msg.LParam);
1115 					break;
1116 				case Msg.WM_IME_CHAR:
1117 					// On Windows API it sends two WM_CHAR messages for each byte, but
1118 					// I wonder if it is worthy to emulate it (also no idea how to
1119 					// reconstruct those bytes into chars).
1120 					SendMessage (msg.HWnd, Msg.WM_CHAR, msg.WParam, msg.LParam);
1121 					return IntPtr.Zero;
1122 				case Msg.WM_QUIT: {
1123 					if (WindowMapping [hwnd.Handle] != null)
1124 
1125 						Exit ();
1126 					break;
1127 				}
1128 				case Msg.WM_PAINT: {
1129 					hwnd.expose_pending = false;
1130 					break;
1131 				}
1132 				case Msg.WM_NCPAINT: {
1133 					hwnd.nc_expose_pending = false;
1134 					break;
1135 				}
1136 				case Msg.WM_NCCALCSIZE: {
1137 					if (msg.WParam == (IntPtr)1) {
1138 						XplatUIWin32.NCCALCSIZE_PARAMS ncp;
1139 						ncp = (XplatUIWin32.NCCALCSIZE_PARAMS)Marshal.PtrToStructure (msg.LParam, typeof (XplatUIWin32.NCCALCSIZE_PARAMS));
1140 
1141 						// Add all the stuff X is supposed to draw.
1142 						Control ctrl = Control.FromHandle (hwnd.Handle);
1143 						if (ctrl != null) {
1144 							Hwnd.Borders rect = Hwnd.GetBorders (ctrl.GetCreateParams (), null);
1145 
1146 							ncp.rgrc1.top += rect.top;
1147 							ncp.rgrc1.bottom -= rect.bottom;
1148 							ncp.rgrc1.left += rect.left;
1149 							ncp.rgrc1.right -= rect.right;
1150 
1151 							Marshal.StructureToPtr (ncp, msg.LParam, true);
1152 						}
1153 					}
1154 					break;
1155 				}
1156 				case Msg.WM_SETCURSOR: {
1157 					// Pass to parent window first
1158 					while ((hwnd.parent != null) && (msg.Result == IntPtr.Zero)) {
1159 						hwnd = hwnd.parent;
1160 						msg.Result = NativeWindow.WndProc(hwnd.Handle, Msg.WM_SETCURSOR, msg.HWnd, msg.LParam);
1161 					}
1162 
1163 					if (msg.Result == IntPtr.Zero) {
1164 						IntPtr handle;
1165 
1166 						switch((HitTest)(msg.LParam.ToInt32() & 0xffff)) {
1167 							case HitTest.HTBOTTOM:		handle = Cursors.SizeNS.handle; break;
1168 							case HitTest.HTBORDER:		handle = Cursors.SizeNS.handle; break;
1169 							case HitTest.HTBOTTOMLEFT:	handle = Cursors.SizeNESW.handle; break;
1170 							case HitTest.HTBOTTOMRIGHT:	handle = Cursors.SizeNWSE.handle; break;
1171 							case HitTest.HTERROR:		if ((msg.LParam.ToInt32() >> 16) == (int)Msg.WM_LBUTTONDOWN) {
1172 												//FIXME: AudibleAlert();
1173 											}
1174 											handle = Cursors.Default.handle;
1175 											break;
1176 
1177 							case HitTest.HTHELP:		handle = Cursors.Help.handle; break;
1178 							case HitTest.HTLEFT:		handle = Cursors.SizeWE.handle; break;
1179 							case HitTest.HTRIGHT:		handle = Cursors.SizeWE.handle; break;
1180 							case HitTest.HTTOP:		handle = Cursors.SizeNS.handle; break;
1181 							case HitTest.HTTOPLEFT:		handle = Cursors.SizeNWSE.handle; break;
1182 							case HitTest.HTTOPRIGHT:	handle = Cursors.SizeNESW.handle; break;
1183 
1184 							#if SameAsDefault
1185 							case HitTest.HTGROWBOX:
1186 							case HitTest.HTSIZE:
1187 							case HitTest.HTZOOM:
1188 							case HitTest.HTVSCROLL:
1189 							case HitTest.HTSYSMENU:
1190 							case HitTest.HTREDUCE:
1191 							case HitTest.HTNOWHERE:
1192 							case HitTest.HTMAXBUTTON:
1193 							case HitTest.HTMINBUTTON:
1194 							case HitTest.HTMENU:
1195 							case HitTest.HSCROLL:
1196 							case HitTest.HTBOTTOM:
1197 							case HitTest.HTCAPTION:
1198 							case HitTest.HTCLIENT:
1199 							case HitTest.HTCLOSE:
1200 							#endif
1201 							default: handle = Cursors.Default.handle; break;
1202 						}
1203 						SetCursor(msg.HWnd, handle);
1204 					}
1205 					return (IntPtr)1;
1206 				}
1207 			}
1208 			return IntPtr.Zero;
1209 		}
1210 
DestroyCaret(IntPtr hwnd)1211 		internal override void DestroyCaret (IntPtr hwnd) {
1212 			if (Caret.Hwnd == hwnd) {
1213 				if (Caret.Visible == 1) {
1214 					Caret.Timer.Stop ();
1215 					HideCaret ();
1216 				}
1217 				Caret.Hwnd = IntPtr.Zero;
1218 				Caret.Visible = 0;
1219 				Caret.On = false;
1220 			}
1221 		}
1222 
1223 		[MonoTODO]
DestroyCursor(IntPtr cursor)1224 		internal override void DestroyCursor(IntPtr cursor) {
1225 			throw new NotImplementedException ();
1226 		}
1227 
DestroyWindow(IntPtr handle)1228 		internal override void DestroyWindow(IntPtr handle) {
1229 			Hwnd	hwnd;
1230 
1231 			hwnd = Hwnd.ObjectFromHandle(handle);
1232 
1233 			if (hwnd == null) {
1234 				return;
1235 			}
1236 
1237 			SendParentNotify (hwnd.Handle, Msg.WM_DESTROY, int.MaxValue, int.MaxValue);
1238 
1239 			CleanupCachedWindows (hwnd);
1240 
1241 			ArrayList windows = new ArrayList ();
1242 
1243 			AccumulateDestroyedHandles (Control.ControlNativeWindow.ControlFromHandle(hwnd.Handle), windows);
1244 
1245 
1246 			foreach (Hwnd h in windows) {
1247 				SendMessage (h.Handle, Msg.WM_DESTROY, IntPtr.Zero, IntPtr.Zero);
1248 				h.zombie = true;
1249 			}
1250 
1251 			// TODO: This is crashing swf-messageboxes
1252 			/*
1253 			if (false && hwnd.whole_window != IntPtr.Zero)
1254 				CFRelease (hwnd.whole_window);
1255 			if (false && hwnd.client_window != IntPtr.Zero)
1256 				CFRelease (hwnd.client_window);
1257 			*/
1258 
1259 			if (WindowMapping [hwnd.Handle] != null) {
1260 				DisposeWindow ((IntPtr)(WindowMapping [hwnd.Handle]));
1261 				WindowMapping.Remove (hwnd.Handle);
1262 			}
1263 		}
1264 
DispatchMessage(ref MSG msg)1265 		internal override IntPtr DispatchMessage(ref MSG msg) {
1266 			return NativeWindow.WndProc(msg.hwnd, msg.message, msg.wParam, msg.lParam);
1267 		}
1268 
DoEvents()1269 		internal override void DoEvents() {
1270                         MSG     msg = new MSG ();
1271 
1272 			in_doevents = true;
1273 			while (PeekMessage (null, ref msg, IntPtr.Zero, 0, 0, (uint)PeekMessageFlags.PM_REMOVE)) {
1274                                 TranslateMessage (ref msg);
1275                                 DispatchMessage (ref msg);
1276                         }
1277 			in_doevents = false;
1278 
1279 		}
1280 
EnableWindow(IntPtr handle, bool Enable)1281 		internal override void EnableWindow(IntPtr handle, bool Enable) {
1282 			//Like X11 we need not do anything here
1283 		}
1284 
EndLoop(Thread thread)1285 		internal override void EndLoop(Thread thread) {
1286 		}
1287 
Exit()1288 		internal void Exit () {
1289 			GetMessageResult = false;
1290 		}
1291 
GetActive()1292 		internal override IntPtr GetActive() {
1293 			return ActiveWindow;
1294 		}
1295 
GetClipRegion(IntPtr hwnd)1296 		internal override Region GetClipRegion(IntPtr hwnd) {
1297 			return null;
1298 		}
1299 
1300 		[MonoTODO]
GetCursorInfo(IntPtr cursor, out int width, out int height, out int hotspot_x, out int hotspot_y)1301 		internal override void GetCursorInfo(IntPtr cursor, out int width, out int height, out int hotspot_x, out int hotspot_y) {
1302 			width = 12;
1303 			height = 12;
1304 			hotspot_x = 0;
1305 			hotspot_y = 0;
1306 		}
1307 
GetDisplaySize(out Size size)1308 		internal override void GetDisplaySize(out Size size) {
1309 			Carbon.HIRect bounds = CGDisplayBounds (CGMainDisplayID ());
1310 			size = new Size ((int)bounds.size.width, (int)bounds.size.height);
1311 		}
1312 
GetParent(IntPtr handle)1313 		internal override IntPtr GetParent(IntPtr handle) {
1314 			Hwnd	hwnd;
1315 
1316 			hwnd = Hwnd.ObjectFromHandle(handle);
1317 			if (hwnd != null && hwnd.Parent != null) {
1318 				return hwnd.Parent.Handle;
1319 			}
1320 			return IntPtr.Zero;
1321 		}
1322 
GetPreviousWindow(IntPtr handle)1323 		internal override IntPtr GetPreviousWindow(IntPtr handle) {
1324 			return HIViewGetPreviousView(handle);
1325 		}
1326 
GetCursorPos(IntPtr handle, out int x, out int y)1327 		internal override void GetCursorPos(IntPtr handle, out int x, out int y) {
1328 			Carbon.QDPoint pt = new Carbon.QDPoint ();
1329 			GetGlobalMouse (ref pt);
1330 			x = pt.x;
1331 			y = pt.y;
1332 		}
1333 
GetFocus()1334 		internal override IntPtr GetFocus() {
1335 			return FocusWindow;
1336 		}
1337 
1338 
GetFontMetrics(Graphics g, Font font, out int ascent, out int descent)1339 		internal override bool GetFontMetrics(Graphics g, Font font, out int ascent, out int descent) {
1340 			FontFamily ff = font.FontFamily;
1341 			ascent = ff.GetCellAscent (font.Style);
1342 			descent = ff.GetCellDescent (font.Style);
1343 			return true;
1344 		}
1345 
GetMenuOrigin(IntPtr handle)1346 		internal override Point GetMenuOrigin(IntPtr handle) {
1347 			Hwnd hwnd;
1348 
1349 			hwnd = Hwnd.ObjectFromHandle(handle);
1350 
1351 			if (hwnd != null) {
1352 				return hwnd.MenuOrigin;
1353 			}
1354 			return Point.Empty;
1355 		}
1356 
GetMessage(object queue_id, ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax)1357 		internal override bool GetMessage(object queue_id, ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax) {
1358 			IntPtr evtRef = IntPtr.Zero;
1359 			IntPtr target = GetEventDispatcherTarget();
1360 			CheckTimers (DateTime.UtcNow);
1361 			ReceiveNextEvent (0, IntPtr.Zero, 0, true, ref evtRef);
1362 			if (evtRef != IntPtr.Zero && target != IntPtr.Zero) {
1363 				SendEventToEventTarget (evtRef, target);
1364 				ReleaseEvent (evtRef);
1365 			}
1366 
1367 			object queueobj;
1368 			loop:
1369 			lock (queuelock) {
1370 
1371 				if (MessageQueue.Count <= 0) {
1372 					if (Idle != null)
1373 						Idle (this, EventArgs.Empty);
1374 					else if (TimerList.Count == 0) {
1375 						ReceiveNextEvent (0, IntPtr.Zero, 0.15, true, ref evtRef);
1376 						if (evtRef != IntPtr.Zero && target != IntPtr.Zero) {
1377 							SendEventToEventTarget (evtRef, target);
1378 							ReleaseEvent (evtRef);
1379 						}
1380 					} else {
1381 						ReceiveNextEvent (0, IntPtr.Zero, NextTimeout (), true, ref evtRef);
1382 						if (evtRef != IntPtr.Zero && target != IntPtr.Zero) {
1383 							SendEventToEventTarget (evtRef, target);
1384 							ReleaseEvent (evtRef);
1385 						}
1386 					}
1387 					msg.hwnd = IntPtr.Zero;
1388 					msg.message = Msg.WM_ENTERIDLE;
1389 					return GetMessageResult;
1390 				}
1391 				queueobj = MessageQueue.Dequeue ();
1392 			}
1393 			if (queueobj is GCHandle) {
1394 				XplatUIDriverSupport.ExecuteClientMessage((GCHandle)queueobj);
1395 				goto loop;
1396 			} else {
1397 				msg = (MSG)queueobj;
1398 			}
1399 			return GetMessageResult;
1400 		}
1401 
1402 		[MonoTODO]
GetText(IntPtr handle, out string text)1403 		internal override bool GetText(IntPtr handle, out string text) {
1404 			throw new NotImplementedException ();
1405 		}
1406 
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)1407 		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) {
1408 			Hwnd		hwnd;
1409 
1410 			hwnd = Hwnd.ObjectFromHandle(handle);
1411 
1412 			if (hwnd != null) {
1413 				x = hwnd.x;
1414 				y = hwnd.y;
1415 				width = hwnd.width;
1416 				height = hwnd.height;
1417 
1418 				PerformNCCalc(hwnd);
1419 
1420 				client_width = hwnd.ClientRect.Width;
1421 				client_height = hwnd.ClientRect.Height;
1422 
1423 				return;
1424 			}
1425 
1426 			// Should we throw an exception or fail silently?
1427 			// throw new ArgumentException("Called with an invalid window handle", "handle");
1428 
1429 			x = 0;
1430 			y = 0;
1431 			width = 0;
1432 			height = 0;
1433 			client_width = 0;
1434 			client_height = 0;
1435 		}
1436 
GetWindowState(IntPtr hwnd)1437 		internal override FormWindowState GetWindowState(IntPtr hwnd) {
1438 			IntPtr window = HIViewGetWindow (hwnd);
1439 
1440 			if (IsWindowCollapsed (window))
1441 				return FormWindowState.Minimized;
1442 			if (IsWindowInStandardState (window, IntPtr.Zero, IntPtr.Zero))
1443 				return FormWindowState.Maximized;
1444 
1445 			return FormWindowState.Normal;
1446 		}
1447 
GrabInfo(out IntPtr handle, out bool GrabConfined, out Rectangle GrabArea)1448 		internal override void GrabInfo(out IntPtr handle, out bool GrabConfined, out Rectangle GrabArea) {
1449 			handle = Grab.Hwnd;
1450 			GrabConfined = Grab.Confined;
1451 			GrabArea = Grab.Area;
1452 		}
1453 
GrabWindow(IntPtr handle, IntPtr confine_to_handle)1454 		internal override void GrabWindow(IntPtr handle, IntPtr confine_to_handle) {
1455 			Grab.Hwnd = handle;
1456 			Grab.Confined = confine_to_handle != IntPtr.Zero;
1457 			/* FIXME: Set the Grab.Area */
1458 		}
1459 
UngrabWindow(IntPtr hwnd)1460 		internal override void UngrabWindow(IntPtr hwnd) {
1461                         bool was_grabbed = Grab.Hwnd != IntPtr.Zero;
1462 
1463                         Grab.Hwnd = IntPtr.Zero;
1464                         Grab.Confined = false;
1465 
1466                         if (was_grabbed) {
1467                                 // lparam should be the handle to the window gaining the mouse capture,
1468                                 // but we dont have that information like X11.
1469                                 // Also only generate WM_CAPTURECHANGED if the window actually was grabbed.
1470                                 SendMessage (hwnd, Msg.WM_CAPTURECHANGED, IntPtr.Zero, IntPtr.Zero);
1471                         }
1472 		}
1473 
HandleException(Exception e)1474 		internal override void HandleException(Exception e) {
1475 			StackTrace st = new StackTrace(e);
1476 			Console.WriteLine("Exception '{0}'", e.Message+st.ToString());
1477 			Console.WriteLine("{0}{1}", e.Message, st.ToString());
1478 		}
1479 
Invalidate(IntPtr handle, Rectangle rc, bool clear)1480 		internal override void Invalidate (IntPtr handle, Rectangle rc, bool clear) {
1481 			Hwnd hwnd;
1482 
1483 			hwnd = Hwnd.ObjectFromHandle(handle);
1484 
1485 			if (clear) {
1486 				AddExpose (hwnd, true, hwnd.X, hwnd.Y, hwnd.Width, hwnd.Height);
1487 			} else {
1488 				AddExpose (hwnd, true, rc.X, rc.Y, rc.Width, rc.Height);
1489 			}
1490 		}
1491 
InvalidateNC(IntPtr handle)1492 		internal override void InvalidateNC (IntPtr handle)
1493 		{
1494 			Hwnd hwnd;
1495 
1496 			hwnd = Hwnd.ObjectFromHandle(handle);
1497 
1498 			AddExpose (hwnd, false, 0, 0, hwnd.Width, hwnd.Height);
1499 		}
1500 
IsEnabled(IntPtr handle)1501 		internal override bool IsEnabled(IntPtr handle) {
1502 			return Hwnd.ObjectFromHandle(handle).Enabled;
1503 		}
1504 
IsVisible(IntPtr handle)1505 		internal override bool IsVisible(IntPtr handle) {
1506 			return Hwnd.ObjectFromHandle(handle).visible;
1507 		}
1508 
KillTimer(Timer timer)1509 		internal override void KillTimer(Timer timer) {
1510 			lock (TimerList) {
1511 				TimerList.Remove(timer);
1512 			}
1513 		}
1514 
1515 
OverrideCursor(IntPtr cursor)1516 		internal override void OverrideCursor(IntPtr cursor) {
1517 		}
1518 
PaintEventStart(ref Message msg, IntPtr handle, bool client)1519 		internal override PaintEventArgs PaintEventStart(ref Message msg, IntPtr handle, bool client) {
1520 			PaintEventArgs	paint_event;
1521 			Hwnd		hwnd;
1522 			Hwnd		paint_hwnd;
1523 
1524 			hwnd = Hwnd.ObjectFromHandle(msg.HWnd);
1525 			if (msg.HWnd == handle) {
1526 				paint_hwnd = hwnd;
1527 			} else {
1528 				paint_hwnd = Hwnd.ObjectFromHandle (handle);
1529 			}
1530 
1531 			if (Caret.Visible == 1) {
1532 				Caret.Paused = true;
1533 				HideCaret();
1534 			}
1535 
1536 			Graphics dc;
1537 
1538 			if (client) {
1539 				dc = Graphics.FromHwnd (paint_hwnd.client_window);
1540 
1541 				Region clip_region = new Region ();
1542 				clip_region.MakeEmpty();
1543 
1544 				foreach (Rectangle r in hwnd.ClipRectangles) {
1545 					/* Expand the region slightly.
1546 					 * See bug 464464.
1547 					 */
1548 					Rectangle r2 = Rectangle.FromLTRB (r.Left, r.Top, r.Right, r.Bottom + 1);
1549 					clip_region.Union (r2);
1550 				}
1551 
1552 				if (hwnd.UserClip != null) {
1553 					clip_region.Intersect(hwnd.UserClip);
1554 				}
1555 
1556 				// FIXME: Clip region is hosed
1557 				dc.Clip = clip_region;
1558 				paint_event = new PaintEventArgs(dc, hwnd.Invalid);
1559 				hwnd.expose_pending = false;
1560 				hwnd.ClearInvalidArea();
1561 
1562 				hwnd.drawing_stack.Push (paint_event);
1563 				hwnd.drawing_stack.Push (dc);
1564 			} else {
1565 				dc = Graphics.FromHwnd (paint_hwnd.whole_window);
1566 
1567 				if (!hwnd.nc_invalid.IsEmpty) {
1568 					// FIXME: Clip region is hosed
1569 					dc.SetClip (hwnd.nc_invalid);
1570 					paint_event = new PaintEventArgs(dc, hwnd.nc_invalid);
1571 				} else {
1572 					paint_event = new PaintEventArgs(dc, new Rectangle(0, 0, hwnd.width, hwnd.height));
1573 				}
1574 				hwnd.nc_expose_pending = false;
1575 				hwnd.ClearNcInvalidArea ();
1576 
1577 				hwnd.drawing_stack.Push (paint_event);
1578 				hwnd.drawing_stack.Push (dc);
1579 			}
1580 
1581 			return paint_event;
1582 		}
1583 
PaintEventEnd(ref Message msg, IntPtr handle, bool client)1584 		internal override void PaintEventEnd(ref Message msg, IntPtr handle, bool client) {
1585 			Hwnd	hwnd;
1586 
1587 			hwnd = Hwnd.ObjectFromHandle(handle);
1588 
1589 			// FIXME: Pop is causing invalid stack ops sometimes; race condition?
1590 			try {
1591 				Graphics dc = (Graphics)hwnd.drawing_stack.Pop();
1592 				dc.Flush ();
1593 				dc.Dispose ();
1594 
1595 				PaintEventArgs pe = (PaintEventArgs)hwnd.drawing_stack.Pop();
1596 				pe.SetGraphics (null);
1597 				pe.Dispose ();
1598 			} catch {}
1599 
1600 			if (Caret.Visible == 1) {
1601 				ShowCaret();
1602 				Caret.Paused = false;
1603 			}
1604 		}
1605 
PeekMessage(Object queue_id, ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax, uint flags)1606 		internal override bool PeekMessage(Object queue_id, ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax, uint flags) {
1607 			IntPtr evtRef = IntPtr.Zero;
1608 			IntPtr target = GetEventDispatcherTarget();
1609 			CheckTimers (DateTime.UtcNow);
1610 			ReceiveNextEvent (0, IntPtr.Zero, 0, true, ref evtRef);
1611 			if (evtRef != IntPtr.Zero && target != IntPtr.Zero) {
1612 				SendEventToEventTarget (evtRef, target);
1613 				ReleaseEvent (evtRef);
1614 			}
1615 
1616 			lock (queuelock) {
1617 				if (MessageQueue.Count <= 0) {
1618 					return false;
1619 				} else {
1620 					object queueobj;
1621 					if (flags == (uint)PeekMessageFlags.PM_REMOVE)
1622 						queueobj = MessageQueue.Dequeue ();
1623 					else
1624 						queueobj = MessageQueue.Peek ();
1625 
1626 					if (queueobj is GCHandle) {
1627 						XplatUIDriverSupport.ExecuteClientMessage((GCHandle)queueobj);
1628 						return false;
1629 					}
1630 					msg = (MSG)queueobj;
1631 					return true;
1632 				}
1633 			}
1634 		}
1635 
PostMessage(IntPtr hwnd, Msg message, IntPtr wParam, IntPtr lParam)1636 		internal override bool PostMessage (IntPtr hwnd, Msg message, IntPtr wParam, IntPtr lParam) {
1637 			MSG msg = new MSG();
1638 			msg.hwnd = hwnd;
1639 			msg.message = message;
1640 			msg.wParam = wParam;
1641 			msg.lParam = lParam;
1642 			EnqueueMessage (msg);
1643 			return true;
1644 		}
1645 
PostQuitMessage(int exitCode)1646 		internal override void PostQuitMessage(int exitCode) {
1647 			PostMessage (FosterParent, Msg.WM_QUIT, IntPtr.Zero, IntPtr.Zero);
1648 		}
1649 
RequestAdditionalWM_NCMessages(IntPtr hwnd, bool hover, bool leave)1650 		internal override void RequestAdditionalWM_NCMessages(IntPtr hwnd, bool hover, bool leave) {
1651 		}
1652 
RequestNCRecalc(IntPtr handle)1653 		internal override void RequestNCRecalc(IntPtr handle) {
1654 			Hwnd hwnd;
1655 
1656 			hwnd = Hwnd.ObjectFromHandle(handle);
1657 
1658 			if (hwnd == null) {
1659 				return;
1660 			}
1661 
1662 			PerformNCCalc(hwnd);
1663 			SendMessage(handle, Msg.WM_WINDOWPOSCHANGED, IntPtr.Zero, IntPtr.Zero);
1664 			InvalidateNC(handle);
1665 		}
1666 
1667 		[MonoTODO]
ResetMouseHover(IntPtr handle)1668 		internal override void ResetMouseHover(IntPtr handle) {
1669 			throw new NotImplementedException();
1670 		}
1671 
ScreenToClient(IntPtr handle, ref int x, ref int y)1672 		internal override void ScreenToClient(IntPtr handle, ref int x, ref int y) {
1673 			Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
1674 
1675 			Point point = ConvertScreenPointToClient (hwnd.ClientWindow, new Point (x, y));
1676 
1677 			x = point.X;
1678 			y = point.Y;
1679 		}
1680 
ScreenToMenu(IntPtr handle, ref int x, ref int y)1681 		internal override void ScreenToMenu(IntPtr handle, ref int x, ref int y) {
1682 			Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
1683 
1684 			Point point = ConvertScreenPointToClient (hwnd.WholeWindow, new Point (x, y));
1685 
1686 			x = point.X;
1687 			y = point.Y;
1688 		}
1689 
ScrollWindow(IntPtr handle, Rectangle area, int XAmount, int YAmount, bool clear)1690 		internal override void ScrollWindow(IntPtr handle, Rectangle area, int XAmount, int YAmount, bool clear) {
1691 			/*
1692 			 * This used to use a HIViewScrollRect but this causes issues with the fact that we dont coalesce
1693 			 * updates properly with our short-circuiting of the window manager.  For now we'll do a less
1694 			 * efficient invalidation of the entire handle which appears to fix the problem
1695 			 * see bug #381084
1696 			 */
1697 			Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
1698 			Invalidate (handle, new Rectangle (0, 0, hwnd.Width, hwnd.Height), false);
1699 		}
1700 
1701 
ScrollWindow(IntPtr handle, int XAmount, int YAmount, bool clear)1702 		internal override void ScrollWindow(IntPtr handle, int XAmount, int YAmount, bool clear) {
1703 			Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
1704 			Invalidate (handle, new Rectangle (0, 0, hwnd.Width, hwnd.Height), false);
1705 		}
1706 
1707 		[MonoTODO]
SendAsyncMethod(AsyncMethodData method)1708 		internal override void SendAsyncMethod (AsyncMethodData method) {
1709 			// Fake async
1710 			lock (queuelock) {
1711 				MessageQueue.Enqueue (GCHandle.Alloc (method));
1712 			}
1713 		}
1714 
1715 		[MonoTODO]
SendMessage(IntPtr hwnd, Msg message, IntPtr wParam, IntPtr lParam)1716 		internal override IntPtr SendMessage (IntPtr hwnd, Msg message, IntPtr wParam, IntPtr lParam) {
1717 			return NativeWindow.WndProc(hwnd, message, wParam, lParam);
1718 		}
1719 
SendInput(IntPtr hwnd, Queue keys)1720 		internal override int SendInput(IntPtr hwnd, Queue keys) {
1721 			return 0;
1722 		}
1723 
1724 
SetCaretPos(IntPtr hwnd, int x, int y)1725 		internal override void SetCaretPos (IntPtr hwnd, int x, int y) {
1726 			if (hwnd != IntPtr.Zero && hwnd == Caret.Hwnd) {
1727 				Caret.X = x;
1728 				Caret.Y = y;
1729 				ClientToScreen (hwnd, ref x, ref y);
1730 				SizeWindow (new Rectangle (x, y, Caret.Width, Caret.Height), CaretWindow);
1731 				Caret.Timer.Stop ();
1732 				HideCaret ();
1733 				if (Caret.Visible == 1) {
1734 					ShowCaret ();
1735 					Caret.Timer.Start ();
1736 				}
1737 			}
1738 		}
1739 
SetClipRegion(IntPtr hwnd, Region region)1740 		internal override void SetClipRegion(IntPtr hwnd, Region region) {
1741 			throw new NotImplementedException();
1742 		}
1743 
SetCursor(IntPtr window, IntPtr cursor)1744 		internal override void SetCursor(IntPtr window, IntPtr cursor) {
1745 			Hwnd hwnd = Hwnd.ObjectFromHandle (window);
1746 
1747 			hwnd.Cursor = cursor;
1748 		}
1749 
SetCursorPos(IntPtr handle, int x, int y)1750 		internal override void SetCursorPos(IntPtr handle, int x, int y) {
1751 			CGDisplayMoveCursorToPoint (CGMainDisplayID (), new Carbon.CGPoint (x, y));
1752 		}
1753 
SetFocus(IntPtr handle)1754 		internal override void SetFocus(IntPtr handle) {
1755 			if (FocusWindow != IntPtr.Zero) {
1756 				PostMessage(FocusWindow, Msg.WM_KILLFOCUS, handle, IntPtr.Zero);
1757 			}
1758 			PostMessage(handle, Msg.WM_SETFOCUS, FocusWindow, IntPtr.Zero);
1759 			FocusWindow = handle;
1760 		}
1761 
SetIcon(IntPtr handle, Icon icon)1762 		internal override void SetIcon(IntPtr handle, Icon icon) {
1763 			Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
1764 
1765 			// FIXME: we need to map the icon for active window switches
1766 			if (WindowMapping [hwnd.Handle] != null) {
1767 				if (icon == null) {
1768 					RestoreApplicationDockTileImage ();
1769 				} else {
1770 					Bitmap		bitmap;
1771 					int		size;
1772 					IntPtr[]	data;
1773 					int		index;
1774 
1775 					bitmap = new Bitmap (128, 128);
1776 					using (Graphics g = Graphics.FromImage (bitmap)) {
1777 						g.DrawImage (icon.ToBitmap (), 0, 0, 128, 128);
1778 					}
1779 					index = 0;
1780 					size = bitmap.Width * bitmap.Height;
1781 					data = new IntPtr[size];
1782 
1783 					for (int y = 0; y < bitmap.Height; y++) {
1784 						for (int x = 0; x < bitmap.Width; x++) {
1785 							int pixel = bitmap.GetPixel (x, y).ToArgb ();
1786 							if (BitConverter.IsLittleEndian) {
1787 								byte a = (byte) ((pixel >> 24) & 0xFF);
1788 								byte r = (byte) ((pixel >> 16) & 0xFF);
1789 								byte g = (byte) ((pixel >> 8) & 0xFF);
1790 								byte b = (byte) (pixel & 0xFF);
1791 								data[index++] = (IntPtr)(a + (r << 8) + (g << 16) + (b << 24));
1792 							} else {
1793 								data[index++] = (IntPtr)pixel;
1794 							}
1795 						}
1796 					}
1797 
1798 					IntPtr provider = CGDataProviderCreateWithData (IntPtr.Zero, data, size*4, IntPtr.Zero);
1799 					IntPtr image = CGImageCreate (128, 128, 8, 32, 4*128, CGColorSpaceCreateDeviceRGB (), 4, provider, IntPtr.Zero, 0, 0);
1800 					SetApplicationDockTileImage (image);
1801 				}
1802 			}
1803 		}
1804 
1805 
SetModal(IntPtr handle, bool Modal)1806 		internal override void SetModal(IntPtr handle, bool Modal) {
1807 			IntPtr hWnd = HIViewGetWindow (Hwnd.ObjectFromHandle (handle).WholeWindow);
1808 			if (Modal)
1809 				BeginAppModalStateForWindow (hWnd);
1810 			else
1811 				EndAppModalStateForWindow (hWnd);
1812 			return;
1813 		}
1814 
SetParent(IntPtr handle, IntPtr parent)1815 		internal override IntPtr SetParent(IntPtr handle, IntPtr parent) {
1816 			IntPtr ParentHandle = IntPtr.Zero;
1817 			Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
1818 
1819 			hwnd.Parent = Hwnd.ObjectFromHandle (parent);
1820 			if (HIViewGetSuperview (hwnd.whole_window) != IntPtr.Zero) {
1821 				HIViewRemoveFromSuperview (hwnd.whole_window);
1822 			}
1823 			if (hwnd.parent == null)
1824 				HIViewFindByID (HIViewGetRoot (FosterParent), new Carbon.HIViewID (Carbon.EventHandler.kEventClassWindow, 1), ref ParentHandle);
1825 			HIViewAddSubview (hwnd.parent == null ? ParentHandle : hwnd.Parent.client_window, hwnd.whole_window);
1826 			HIViewPlaceInSuperviewAt (hwnd.whole_window, hwnd.X, hwnd.Y);
1827 			HIViewAddSubview (hwnd.whole_window, hwnd.client_window);
1828 			HIViewPlaceInSuperviewAt (hwnd.client_window, hwnd.ClientRect.X, hwnd.ClientRect.Y);
1829 
1830 			return IntPtr.Zero;
1831 		}
1832 
SetTimer(Timer timer)1833 		internal override void SetTimer (Timer timer) {
1834 			lock (TimerList) {
1835 				TimerList.Add (timer);
1836 			}
1837 		}
1838 
SetTopmost(IntPtr hWnd, bool Enabled)1839 		internal override bool SetTopmost(IntPtr hWnd, bool Enabled) {
1840 			HIViewSetZOrder (hWnd, 1, IntPtr.Zero);
1841 			return true;
1842 		}
1843 
SetOwner(IntPtr hWnd, IntPtr hWndOwner)1844 		internal override bool SetOwner(IntPtr hWnd, IntPtr hWndOwner) {
1845 			// TODO: Set window owner.
1846 			return true;
1847 		}
1848 
SetVisible(IntPtr handle, bool visible, bool activate)1849 		internal override bool SetVisible(IntPtr handle, bool visible, bool activate) {
1850 			Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
1851 			object window = WindowMapping [hwnd.Handle];
1852 			if (window != null)
1853 				if (visible)
1854 					ShowWindow ((IntPtr)window);
1855 				else
1856 					HideWindow ((IntPtr)window);
1857 
1858 			if (visible)
1859 				SendMessage(handle, Msg.WM_WINDOWPOSCHANGED, IntPtr.Zero, IntPtr.Zero);
1860 
1861 			HIViewSetVisible (hwnd.whole_window, visible);
1862 			HIViewSetVisible (hwnd.client_window, visible);
1863 
1864 			hwnd.visible = visible;
1865 			hwnd.Mapped = true;
1866 			return true;
1867 		}
1868 
SetAllowDrop(IntPtr handle, bool value)1869 		internal override void SetAllowDrop (IntPtr handle, bool value) {
1870 			// Like X11 we allow drop on al windows and filter in our handler
1871 		}
1872 
StartDrag(IntPtr handle, object data, DragDropEffects allowed_effects)1873 		internal override DragDropEffects StartDrag (IntPtr handle, object data, DragDropEffects allowed_effects) {
1874 			Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
1875 
1876 			if (hwnd == null)
1877 				throw new ArgumentException ("Attempt to begin drag from invalid window handle (" + handle.ToInt32 () + ").");
1878 
1879 			return Dnd.StartDrag (hwnd.client_window, data, allowed_effects);
1880 		}
1881 
SetBorderStyle(IntPtr handle, FormBorderStyle border_style)1882 		internal override void SetBorderStyle(IntPtr handle, FormBorderStyle border_style) {
1883 			Form form = Control.FromHandle (handle) as Form;
1884 			if (form != null && form.window_manager == null && (border_style == FormBorderStyle.FixedToolWindow ||
1885 				border_style == FormBorderStyle.SizableToolWindow)) {
1886 				form.window_manager = new ToolWindowManager (form);
1887 			}
1888 
1889 			RequestNCRecalc(handle);
1890 		}
1891 
SetMenu(IntPtr handle, Menu menu)1892 		internal override void SetMenu(IntPtr handle, Menu menu) {
1893 			Hwnd	hwnd;
1894 
1895 			hwnd = Hwnd.ObjectFromHandle(handle);
1896 			hwnd.menu = menu;
1897 
1898 			RequestNCRecalc(handle);
1899 		}
1900 
SetWindowMinMax(IntPtr handle, Rectangle maximized, Size min, Size max)1901 		internal override void SetWindowMinMax(IntPtr handle, Rectangle maximized, Size min, Size max) {
1902 		}
1903 
SetWindowPos(IntPtr handle, int x, int y, int width, int height)1904 		internal override void SetWindowPos(IntPtr handle, int x, int y, int width, int height) {
1905 			Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
1906 
1907 			if (hwnd == null) {
1908 				return;
1909 			}
1910 
1911 			// Win32 automatically changes negative width/height to 0.
1912 			if (width < 0)
1913 				width = 0;
1914 			if (height < 0)
1915 				height = 0;
1916 
1917 			// X requires a sanity check for width & height; otherwise it dies
1918 			if (hwnd.zero_sized && width > 0 && height > 0) {
1919 				if (hwnd.visible) {
1920 					HIViewSetVisible(hwnd.WholeWindow, true);
1921 				}
1922 				hwnd.zero_sized = false;
1923 			}
1924 
1925 			if ((width < 1) || (height < 1)) {
1926 				hwnd.zero_sized = true;
1927 				HIViewSetVisible(hwnd.WholeWindow, false);
1928 			}
1929 
1930 			// Save a server roundtrip (and prevent a feedback loop)
1931 			if ((hwnd.x == x) && (hwnd.y == y) && (hwnd.width == width) && (hwnd.height == height)) {
1932 				return;
1933 			}
1934 
1935 			if (!hwnd.zero_sized) {
1936 				hwnd.x = x;
1937 				hwnd.y = y;
1938 				hwnd.width = width;
1939 				hwnd.height = height;
1940 				SendMessage(hwnd.client_window, Msg.WM_WINDOWPOSCHANGED, IntPtr.Zero, IntPtr.Zero);
1941 
1942 				Control ctrl = Control.FromHandle (handle);
1943 				CreateParams cp = ctrl.GetCreateParams ();
1944 				Size TranslatedSize = TranslateWindowSizeToQuartzWindowSize (cp, new Size (width, height));
1945 				Carbon.Rect rect = new Carbon.Rect ();
1946 
1947 				if (WindowMapping [hwnd.Handle] != null) {
1948 					if (StyleSet (cp.Style, WindowStyles.WS_POPUP)) {
1949 						SetRect (ref rect, (short)x, (short)y, (short)(x+TranslatedSize.Width), (short)(y+TranslatedSize.Height));
1950 					} else {
1951 						SetRect (ref rect, (short)x, (short)(y+MenuBarHeight), (short)(x+TranslatedSize.Width), (short)(y+MenuBarHeight+TranslatedSize.Height));
1952 					}
1953 					SetWindowBounds ((IntPtr) WindowMapping [hwnd.Handle], 33, ref rect);
1954 					Carbon.HIRect frame_rect = new Carbon.HIRect (0, 0, TranslatedSize.Width, TranslatedSize.Height);
1955 					HIViewSetFrame (hwnd.whole_window, ref frame_rect);
1956 					SetCaretPos (Caret.Hwnd, Caret.X, Caret.Y);
1957 				} else {
1958 					Carbon.HIRect frame_rect = new Carbon.HIRect (x, y, TranslatedSize.Width, TranslatedSize.Height);
1959 					HIViewSetFrame (hwnd.whole_window, ref frame_rect);
1960 				}
1961 				PerformNCCalc(hwnd);
1962 			}
1963 
1964 			hwnd.x = x;
1965 			hwnd.y = y;
1966 			hwnd.width = width;
1967 			hwnd.height = height;
1968 		}
1969 
SetWindowState(IntPtr handle, FormWindowState state)1970 		internal override void SetWindowState(IntPtr handle, FormWindowState state) {
1971 			Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
1972 			IntPtr window = HIViewGetWindow (handle);
1973 
1974 			switch (state) {
1975 				case FormWindowState.Minimized: {
1976 					CollapseWindow (window, true);
1977 					break;
1978 				}
1979 				case FormWindowState.Normal: {
1980 					ZoomWindow (window, 7, false);
1981 					break;
1982 				}
1983 				case FormWindowState.Maximized: {
1984 					Form form = Control.FromHandle (hwnd.Handle) as Form;
1985 					if (form != null && form.FormBorderStyle == FormBorderStyle.None) {
1986 						Carbon.Rect rect = new Carbon.Rect ();
1987 						Carbon.HIRect bounds = CGDisplayBounds (CGMainDisplayID ());
1988 						SetRect (ref rect, (short)0, (short)0, (short)bounds.size.width, (short)bounds.size.height);
1989 						SetWindowBounds ((IntPtr) WindowMapping [hwnd.Handle], 33, ref rect);
1990 						HIViewSetFrame (hwnd.whole_window, ref bounds);
1991 					} else {
1992 						ZoomWindow (window, 8, false);
1993 					}
1994 					break;
1995 				}
1996 			}
1997 		}
1998 
SetWindowStyle(IntPtr handle, CreateParams cp)1999 		internal override void SetWindowStyle(IntPtr handle, CreateParams cp) {
2000 			Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
2001 			SetHwndStyles(hwnd, cp);
2002 
2003 			if (WindowMapping [hwnd.Handle] != null) {
2004 				Carbon.WindowAttributes attributes = Carbon.WindowAttributes.kWindowCompositingAttribute | Carbon.WindowAttributes.kWindowStandardHandlerAttribute;
2005 				if ((cp.Style & ((int)WindowStyles.WS_MINIMIZEBOX)) != 0) {
2006 					attributes |= Carbon.WindowAttributes.kWindowCollapseBoxAttribute;
2007 				}
2008 				if ((cp.Style & ((int)WindowStyles.WS_MAXIMIZEBOX)) != 0) {
2009 					attributes |= Carbon.WindowAttributes.kWindowResizableAttribute | Carbon.WindowAttributes.kWindowHorizontalZoomAttribute | Carbon.WindowAttributes.kWindowVerticalZoomAttribute;
2010 				}
2011 				if ((cp.Style & ((int)WindowStyles.WS_SYSMENU)) != 0) {
2012 					attributes |= Carbon.WindowAttributes.kWindowCloseBoxAttribute;
2013 				}
2014 				if ((cp.ExStyle & ((int)WindowExStyles.WS_EX_TOOLWINDOW)) != 0) {
2015 					attributes = Carbon.WindowAttributes.kWindowStandardHandlerAttribute | Carbon.WindowAttributes.kWindowCompositingAttribute;
2016 				}
2017 				attributes |= Carbon.WindowAttributes.kWindowLiveResizeAttribute;
2018 
2019 				Carbon.WindowAttributes outAttributes = Carbon.WindowAttributes.kWindowNoAttributes;
2020 				GetWindowAttributes ((IntPtr)WindowMapping [hwnd.Handle], ref outAttributes);
2021 				ChangeWindowAttributes ((IntPtr)WindowMapping [hwnd.Handle], attributes, outAttributes);
2022 			}
2023 		}
2024 
SetWindowTransparency(IntPtr handle, double transparency, Color key)2025 		internal override void SetWindowTransparency(IntPtr handle, double transparency, Color key) {
2026 		}
2027 
GetWindowTransparency(IntPtr handle)2028 		internal override double GetWindowTransparency(IntPtr handle)
2029 		{
2030 			return 1.0;
2031 		}
2032 
SupportsTransparency()2033 		internal override TransparencySupport SupportsTransparency() {
2034 			return TransparencySupport.None;
2035 		}
2036 
SetZOrder(IntPtr handle, IntPtr after_handle, bool Top, bool Bottom)2037 		internal override bool SetZOrder(IntPtr handle, IntPtr after_handle, bool Top, bool Bottom) {
2038 			Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
2039 
2040 			if (Top) {
2041 				HIViewSetZOrder (hwnd.whole_window, 2, IntPtr.Zero);
2042 				return true;
2043 			} else if (!Bottom) {
2044 				Hwnd after_hwnd = Hwnd.ObjectFromHandle (after_handle);
2045 				HIViewSetZOrder (hwnd.whole_window, 2, (after_handle == IntPtr.Zero ? IntPtr.Zero : after_hwnd.whole_window));
2046 			} else {
2047 				HIViewSetZOrder (hwnd.whole_window, 1, IntPtr.Zero);
2048 				return true;
2049 			}
2050 			return false;
2051 		}
2052 
ShowCursor(bool show)2053 		internal override void ShowCursor(bool show) {
2054 			if (show)
2055 				CGDisplayShowCursor (CGMainDisplayID ());
2056 			else
2057 				CGDisplayHideCursor (CGMainDisplayID ());
2058 		}
2059 
StartLoop(Thread thread)2060 		internal override object StartLoop(Thread thread) {
2061 			return new object ();
2062 		}
2063 
2064 		[MonoTODO]
SystrayAdd(IntPtr hwnd, string tip, Icon icon, out ToolTip tt)2065 		internal override bool SystrayAdd(IntPtr hwnd, string tip, Icon icon, out ToolTip tt) {
2066 			throw new NotImplementedException();
2067 		}
2068 
2069 		[MonoTODO]
SystrayChange(IntPtr hwnd, string tip, Icon icon, ref ToolTip tt)2070 		internal override bool SystrayChange(IntPtr hwnd, string tip, Icon icon, ref ToolTip tt) {
2071 			throw new NotImplementedException();
2072 		}
2073 
2074 		[MonoTODO]
SystrayRemove(IntPtr hwnd, ref ToolTip tt)2075 		internal override void SystrayRemove(IntPtr hwnd, ref ToolTip tt) {
2076 			throw new NotImplementedException();
2077 		}
2078 
2079 		[MonoTODO]
SystrayBalloon(IntPtr hwnd, int timeout, string title, string text, ToolTipIcon icon)2080 		internal override void SystrayBalloon(IntPtr hwnd, int timeout, string title, string text, ToolTipIcon icon)
2081 		{
2082 			throw new NotImplementedException ();
2083 		}
2084 
Text(IntPtr handle, string text)2085 		internal override bool Text(IntPtr handle, string text) {
2086 			Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
2087 			if (WindowMapping [hwnd.Handle] != null) {
2088 				SetWindowTitleWithCFString ((IntPtr)(WindowMapping [hwnd.Handle]), __CFStringMakeConstantString (text));
2089 			}
2090 			SetControlTitleWithCFString (hwnd.whole_window, __CFStringMakeConstantString (text));
2091 			SetControlTitleWithCFString (hwnd.client_window, __CFStringMakeConstantString (text));
2092 			return true;
2093 		}
2094 
UpdateWindow(IntPtr handle)2095 		internal override void UpdateWindow(IntPtr handle) {
2096 			Hwnd	hwnd;
2097 
2098 			hwnd = Hwnd.ObjectFromHandle(handle);
2099 
2100 			if (!hwnd.visible || !HIViewIsVisible (handle)) {
2101 				return;
2102 			}
2103 
2104 			SendMessage(handle, Msg.WM_PAINT, IntPtr.Zero, IntPtr.Zero);
2105 		}
2106 
TranslateMessage(ref MSG msg)2107 		internal override bool TranslateMessage(ref MSG msg) {
2108 			return Carbon.EventHandler.TranslateMessage (ref msg);
2109 		}
2110 
2111 		#region Reversible regions
2112 		/*
2113 		 * Quartz has no concept of XOR drawing due to its compositing nature
2114 		 * We fake this by mapping a overlay window on the first draw and mapping it on the second.
2115 		 * This has some issues with it because its POSSIBLE for ControlPaint.DrawReversible* to actually
2116 		 * reverse two regions at once.  We dont do this in MWF, but this behaviour woudn't work.
2117 		 * We could in theory cache the Rectangle/Color combination to handle this behaviour.
2118 		 *
2119 		 * PROBLEMS: This has some flicker / banding
2120 		 */
SizeWindow(Rectangle rect, IntPtr window)2121 		internal void SizeWindow (Rectangle rect, IntPtr window) {
2122 			Carbon.Rect qrect = new Carbon.Rect ();
2123 
2124 			SetRect (ref qrect, (short)rect.X, (short)rect.Y, (short)(rect.X+rect.Width), (short)(rect.Y+rect.Height));
2125 
2126 			SetWindowBounds (window, 33, ref qrect);
2127 		}
2128 
DrawReversibleLine(Point start, Point end, Color backColor)2129 		internal override void DrawReversibleLine(Point start, Point end, Color backColor) {
2130 //			throw new NotImplementedException();
2131 		}
2132 
FillReversibleRectangle(Rectangle rectangle, Color backColor)2133 		internal override void FillReversibleRectangle (Rectangle rectangle, Color backColor) {
2134 //			throw new NotImplementedException();
2135 		}
2136 
DrawReversibleFrame(Rectangle rectangle, Color backColor, FrameStyle style)2137 		internal override void DrawReversibleFrame (Rectangle rectangle, Color backColor, FrameStyle style) {
2138 //			throw new NotImplementedException();
2139 		}
2140 
DrawReversibleRectangle(IntPtr handle, Rectangle rect, int line_width)2141 		internal override void DrawReversibleRectangle(IntPtr handle, Rectangle rect, int line_width) {
2142 			Rectangle size_rect = rect;
2143 			int new_x = 0;
2144 			int new_y = 0;
2145 
2146 			if (ReverseWindowMapped) {
2147 				HideWindow (ReverseWindow);
2148 				ReverseWindowMapped = false;
2149 			} else {
2150 				ClientToScreen(handle, ref new_x, ref new_y);
2151 
2152 				size_rect.X += new_x;
2153 				size_rect.Y += new_y;
2154 
2155 				SizeWindow (size_rect, ReverseWindow);
2156 				ShowWindow (ReverseWindow);
2157 
2158 				rect.X = 0;
2159 				rect.Y = 0;
2160 				rect.Width -= 1;
2161 				rect.Height -= 1;
2162 
2163 				Graphics g = Graphics.FromHwnd (HIViewGetRoot (ReverseWindow));
2164 
2165 				for (int i = 0; i < line_width; i++) {
2166 					g.DrawRectangle (ThemeEngine.Current.ResPool.GetPen (Color.Black), rect);
2167 					rect.X += 1;
2168 					rect.Y += 1;
2169 					rect.Width -= 1;
2170 					rect.Height -= 1;
2171 				}
2172 
2173 				g.Flush ();
2174 				g.Dispose ();
2175 
2176 				ReverseWindowMapped = true;
2177 			}
2178 		}
2179 		#endregion
2180 
GetAutoScaleSize(Font font)2181 		internal override SizeF GetAutoScaleSize(Font font) {
2182 			Graphics        g;
2183 			float           width;
2184 			string          magic_string = "The quick brown fox jumped over the lazy dog.";
2185 			double          magic_number = 44.549996948242189;
2186 
2187 			g = Graphics.FromImage (new Bitmap (1, 1));
2188 
2189 			width = (float) (g.MeasureString (magic_string, font).Width / magic_number);
2190 			return new SizeF(width, font.Height);
2191 		}
2192 
2193 		internal override Point MousePosition {
2194 			get {
2195 				return mouse_position;
2196 			}
2197 		}
2198 		#endregion
2199 
2200 		#region System information
2201 		internal override int KeyboardSpeed { get{ throw new NotImplementedException(); } }
2202 		internal override int KeyboardDelay { get{ throw new NotImplementedException(); } }
2203 
2204 		internal override int CaptionHeight {
2205 			get {
2206 				return 19;
2207 			}
2208 		}
2209 
2210 		internal override  Size CursorSize { get{ throw new NotImplementedException(); } }
2211 		internal override  bool DragFullWindows { get{ throw new NotImplementedException(); } }
2212 		internal override  Size DragSize {
2213 			get {
2214 				return new Size(4, 4);
2215 			}
2216 		}
2217 
2218 		internal override  Size FrameBorderSize {
2219 			get {
2220 				return new Size (2, 2);
2221 			}
2222 		}
2223 
2224 		internal override  Size IconSize { get{ throw new NotImplementedException(); } }
2225 		internal override  Size MaxWindowTrackSize { get{ throw new NotImplementedException(); } }
2226 		internal override bool MenuAccessKeysUnderlined {
2227 			get {
2228 				return false;
2229 			}
2230 		}
2231 		internal override Size MinimizedWindowSpacingSize { get{ throw new NotImplementedException(); } }
2232 
2233 		internal override Size MinimumWindowSize {
2234 			get {
2235 				return new Size(110, 22);
2236 			}
2237 		}
2238 
2239 		internal override Keys ModifierKeys {
2240 			get {
2241 				return KeyboardHandler.ModifierKeys;
2242 			}
2243 		}
2244 		internal override Size SmallIconSize { get{ throw new NotImplementedException(); } }
2245 		internal override int MouseButtonCount { get{ throw new NotImplementedException(); } }
2246 		internal override bool MouseButtonsSwapped { get{ throw new NotImplementedException(); } }
2247 		internal override bool MouseWheelPresent { get{ throw new NotImplementedException(); } }
2248 
2249 		internal override MouseButtons MouseButtons {
2250 			get {
2251 				return MouseState;
2252 			}
2253 		}
2254 
2255 		internal override Rectangle VirtualScreen {
2256 			get {
2257 				return WorkingArea;
2258 			}
2259 		}
2260 
2261 		internal override Rectangle WorkingArea {
2262 			get {
2263 				Carbon.HIRect bounds = CGDisplayBounds (CGMainDisplayID ());
2264 				return new Rectangle ((int)bounds.origin.x, (int)bounds.origin.y, (int)bounds.size.width, (int)bounds.size.height);
2265 			}
2266 		}
2267 
2268 		[MonoTODO]
2269 		internal override Screen[] AllScreens {
2270 			get {
2271 				return null;
2272 			}
2273 		}
2274 
2275 		internal override bool ThemesEnabled {
2276 			get {
2277 				return XplatUICarbon.themes_enabled;
2278 			}
2279 		}
2280 
2281 
2282 		#endregion
2283 
2284 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIViewConvertPoint(ref Carbon.CGPoint point, IntPtr pView, IntPtr cView)2285 		extern static int HIViewConvertPoint (ref Carbon.CGPoint point, IntPtr pView, IntPtr cView);
2286 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIViewChangeFeatures(IntPtr aView, ulong bitsin, ulong bitsout)2287 		extern static int HIViewChangeFeatures (IntPtr aView, ulong bitsin, ulong bitsout);
2288 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIViewFindByID(IntPtr rootWnd, Carbon.HIViewID id, ref IntPtr outPtr)2289 		extern static int HIViewFindByID (IntPtr rootWnd, Carbon.HIViewID id, ref IntPtr outPtr);
2290 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIGrowBoxViewSetTransparent(IntPtr GrowBox, bool transparency)2291 		extern static int HIGrowBoxViewSetTransparent (IntPtr GrowBox, bool transparency);
2292 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIViewGetRoot(IntPtr hWnd)2293 		extern static IntPtr HIViewGetRoot (IntPtr hWnd);
2294 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIObjectCreate(IntPtr cfStr, uint what, ref IntPtr hwnd)2295 		extern static int HIObjectCreate (IntPtr cfStr, uint what, ref IntPtr hwnd);
2296 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIObjectRegisterSubclass(IntPtr classid, IntPtr superclassid, uint options, Carbon.EventDelegate upp, uint count, Carbon.EventTypeSpec [] list, IntPtr state, ref IntPtr cls)2297 		extern static int HIObjectRegisterSubclass (IntPtr classid, IntPtr superclassid, uint options, Carbon.EventDelegate upp, uint count, Carbon.EventTypeSpec [] list, IntPtr state, ref IntPtr cls);
2298 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIViewPlaceInSuperviewAt(IntPtr view, float x, float y)2299 		extern static int HIViewPlaceInSuperviewAt (IntPtr view, float x, float y);
2300 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIViewAddSubview(IntPtr parentHnd, IntPtr childHnd)2301 		extern static int HIViewAddSubview (IntPtr parentHnd, IntPtr childHnd);
2302 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIViewGetPreviousView(IntPtr aView)2303 		extern static IntPtr HIViewGetPreviousView (IntPtr aView);
2304 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIViewGetSuperview(IntPtr aView)2305 		extern static IntPtr HIViewGetSuperview (IntPtr aView);
2306 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIViewRemoveFromSuperview(IntPtr aView)2307 		extern static int HIViewRemoveFromSuperview (IntPtr aView);
2308 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIViewSetVisible(IntPtr vHnd, bool visible)2309 		extern static int HIViewSetVisible (IntPtr vHnd, bool visible);
2310 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIViewIsVisible(IntPtr vHnd)2311 		extern static bool HIViewIsVisible (IntPtr vHnd);
2312 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIViewGetBounds(IntPtr vHnd, ref Carbon.HIRect r)2313 		extern static int HIViewGetBounds (IntPtr vHnd, ref Carbon.HIRect r);
2314 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIViewScrollRect(IntPtr vHnd, ref Carbon.HIRect rect, float x, float y)2315 		extern static int HIViewScrollRect (IntPtr vHnd, ref Carbon.HIRect rect, float x, float y);
2316 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIViewSetZOrder(IntPtr hWnd, int cmd, IntPtr oHnd)2317 		extern static int HIViewSetZOrder (IntPtr hWnd, int cmd, IntPtr oHnd);
2318 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIViewNewTrackingArea(IntPtr inView, IntPtr inShape, UInt64 inID, ref IntPtr outRef)2319 		extern static int HIViewNewTrackingArea (IntPtr inView, IntPtr inShape, UInt64 inID, ref IntPtr outRef);
2320 		[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIViewGetWindow(IntPtr aView)2321 		extern static IntPtr HIViewGetWindow (IntPtr aView);
2322 		[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIViewSetFrame(IntPtr view_handle, ref Carbon.HIRect bounds)2323 		extern static int HIViewSetFrame (IntPtr view_handle, ref Carbon.HIRect bounds);
2324 		[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HIViewSetNeedsDisplayInRect(IntPtr view_handle, ref Carbon.HIRect rect, bool needs_display)2325 		internal extern static int HIViewSetNeedsDisplayInRect (IntPtr view_handle, ref Carbon.HIRect rect, bool needs_display);
2326 
2327 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
SetRect(ref Carbon.Rect r, short left, short top, short right, short bottom)2328 		extern static void SetRect (ref Carbon.Rect r, short left, short top, short right, short bottom);
2329 		[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
ActivateWindow(IntPtr windowHnd, bool inActivate)2330 		static extern int ActivateWindow (IntPtr windowHnd, bool inActivate);
2331 		[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
IsWindowActive(IntPtr windowHnd)2332 		static extern bool IsWindowActive (IntPtr windowHnd);
2333 		[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
SetAutomaticControlDragTrackingEnabledForWindow(IntPtr window, bool enabled)2334 		static extern int SetAutomaticControlDragTrackingEnabledForWindow (IntPtr window, bool enabled);
2335 
2336 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
GetEventDispatcherTarget()2337 		extern static IntPtr GetEventDispatcherTarget ();
2338 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
SendEventToEventTarget(IntPtr evt, IntPtr target)2339 		extern static int SendEventToEventTarget (IntPtr evt, IntPtr target);
2340 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
ReleaseEvent(IntPtr evt)2341 		extern static int ReleaseEvent (IntPtr evt);
2342 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
ReceiveNextEvent(uint evtCount, IntPtr evtTypes, double timeout, bool processEvt, ref IntPtr evt)2343 		extern static int ReceiveNextEvent (uint evtCount, IntPtr evtTypes, double timeout, bool processEvt, ref IntPtr evt);
2344 
2345 		[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
IsWindowCollapsed(IntPtr hWnd)2346 		extern static bool IsWindowCollapsed (IntPtr hWnd);
2347 		[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
IsWindowInStandardState(IntPtr hWnd, IntPtr a, IntPtr b)2348 		extern static bool IsWindowInStandardState (IntPtr hWnd, IntPtr a, IntPtr b);
2349 		[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
CollapseWindow(IntPtr hWnd, bool collapse)2350 		extern static void CollapseWindow (IntPtr hWnd, bool collapse);
2351 		[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
ZoomWindow(IntPtr hWnd, short partCode, bool front)2352 		extern static void ZoomWindow (IntPtr hWnd, short partCode, bool front);
2353 		[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
GetWindowAttributes(IntPtr hWnd, ref Carbon.WindowAttributes outAttributes)2354 		extern static int GetWindowAttributes (IntPtr hWnd, ref Carbon.WindowAttributes outAttributes);
2355 		[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
ChangeWindowAttributes(IntPtr hWnd, Carbon.WindowAttributes inAttributes, Carbon.WindowAttributes outAttributes)2356 		extern static int ChangeWindowAttributes (IntPtr hWnd, Carbon.WindowAttributes inAttributes, Carbon.WindowAttributes outAttributes);
2357 		[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
GetGlobalMouse(ref Carbon.QDPoint outData)2358 		internal extern static int GetGlobalMouse (ref Carbon.QDPoint outData);
2359 
2360 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
BeginAppModalStateForWindow(IntPtr window)2361 		extern static int BeginAppModalStateForWindow (IntPtr window);
2362 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
EndAppModalStateForWindow(IntPtr window)2363 		extern static int EndAppModalStateForWindow (IntPtr window);
2364 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
CreateNewWindow(Carbon.WindowClass klass, Carbon.WindowAttributes attributes, ref Carbon.Rect r, ref IntPtr window)2365 		extern static int CreateNewWindow (Carbon.WindowClass klass, Carbon.WindowAttributes attributes, ref Carbon.Rect r, ref IntPtr window);
2366 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
DisposeWindow(IntPtr wHnd)2367 		extern static int DisposeWindow (IntPtr wHnd);
2368 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
ShowWindow(IntPtr wHnd)2369 		internal extern static int ShowWindow (IntPtr wHnd);
2370 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
HideWindow(IntPtr wHnd)2371 		internal extern static int HideWindow (IntPtr wHnd);
2372 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
IsWindowVisible(IntPtr wHnd)2373 		internal extern static bool IsWindowVisible (IntPtr wHnd);
2374 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
SetWindowBounds(IntPtr wHnd, uint reg, ref Carbon.Rect rect)2375 		extern static int SetWindowBounds (IntPtr wHnd, uint reg, ref Carbon.Rect rect);
2376 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
GetWindowBounds(IntPtr wHnd, uint reg, ref Carbon.Rect rect)2377 		extern static int GetWindowBounds (IntPtr wHnd, uint reg, ref Carbon.Rect rect);
2378 
2379 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
SetControlTitleWithCFString(IntPtr hWnd, IntPtr titleCFStr)2380 		extern static int SetControlTitleWithCFString (IntPtr hWnd, IntPtr titleCFStr);
2381 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
SetWindowTitleWithCFString(IntPtr hWnd, IntPtr titleCFStr)2382 		extern static int SetWindowTitleWithCFString (IntPtr hWnd, IntPtr titleCFStr);
2383 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
__CFStringMakeConstantString(string cString)2384 		internal extern static IntPtr __CFStringMakeConstantString (string cString);
2385 
2386 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
CFRelease(IntPtr wHnd)2387 		internal extern static int CFRelease (IntPtr wHnd);
2388 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
GetMBarHeight()2389 		extern static short GetMBarHeight ();
2390 
2391 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
AlertSoundPlay()2392 		extern static void AlertSoundPlay ();
2393 
2394 		#region Cursor imports
2395 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
CGDisplayBounds(IntPtr displayID)2396 		extern static Carbon.HIRect CGDisplayBounds (IntPtr displayID);
2397 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
CGMainDisplayID()2398 		extern static IntPtr CGMainDisplayID ();
2399 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
CGDisplayShowCursor(IntPtr display)2400 		extern static void CGDisplayShowCursor (IntPtr display);
2401 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
CGDisplayHideCursor(IntPtr display)2402 		extern static void CGDisplayHideCursor (IntPtr display);
2403 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
CGDisplayMoveCursorToPoint(IntPtr display, Carbon.CGPoint point)2404 		extern static void CGDisplayMoveCursorToPoint (IntPtr display, Carbon.CGPoint point);
2405 		#endregion
2406 
2407 		#region Process imports
2408 		[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
GetCurrentProcess(ref Carbon.ProcessSerialNumber psn)2409 		extern static int GetCurrentProcess (ref Carbon.ProcessSerialNumber psn);
2410 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
TransformProcessType(ref Carbon.ProcessSerialNumber psn, uint type)2411 		extern static int TransformProcessType (ref Carbon.ProcessSerialNumber psn, uint type);
2412 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
SetFrontProcess(ref Carbon.ProcessSerialNumber psn)2413 		extern static int SetFrontProcess (ref Carbon.ProcessSerialNumber psn);
2414 		#endregion
2415 
2416 		#region Dock tile imports
2417 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
CGColorSpaceCreateDeviceRGB()2418 		extern static IntPtr CGColorSpaceCreateDeviceRGB();
2419 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
CGDataProviderCreateWithData(IntPtr info, IntPtr [] data, int size, IntPtr releasefunc)2420 		extern static IntPtr CGDataProviderCreateWithData (IntPtr info, IntPtr [] data, int size, IntPtr releasefunc);
2421 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
CGImageCreate(int width, int height, int bitsPerComponent, int bitsPerPixel, int bytesPerRow, IntPtr colorspace, uint bitmapInfo, IntPtr provider, IntPtr decode, int shouldInterpolate, int intent)2422 		extern static IntPtr CGImageCreate (int width, int height, int bitsPerComponent, int bitsPerPixel, int bytesPerRow, IntPtr colorspace, uint bitmapInfo, IntPtr provider, IntPtr decode, int shouldInterpolate, int intent);
2423 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
SetApplicationDockTileImage(IntPtr imageRef)2424 		extern static void SetApplicationDockTileImage(IntPtr imageRef);
2425 		[DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
RestoreApplicationDockTileImage()2426 		extern static void RestoreApplicationDockTileImage();
2427 		#endregion
2428 	}
2429 }
2430