1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 // Copyright (c) 2004-2006 Novell, Inc.
23 // Geoff Norton <gnorton@customerdna.com>
27 // This really doesn't work at all; please dont file bugs on it yet.
30 // Fix clipping of children
34 using System
.Threading
;
36 using System
.ComponentModel
;
37 using System
.Collections
;
38 using System
.Diagnostics
;
39 using System
.Runtime
.InteropServices
;
42 namespace System
.Windows
.Forms
{
44 // The Carbon Event callback delegate
45 delegate int CarbonEventDelegate (IntPtr inCallRef
, IntPtr inEvent
, IntPtr userData
);
47 internal class XplatUIOSX
: XplatUIDriver
{
49 #region Local Variables
51 // General driver variables
52 private static XplatUIOSX Instance
;
53 private static int RefCount
;
54 private static bool themes_enabled
;
55 private static IntPtr FocusWindow
;
58 private static MouseButtons MouseState
;
60 private static Hwnd MouseWindow
;
63 private static GrabStruct Grab
;
64 private static OSXCaret Caret
;
65 private static OSXHover Hover
;
66 private CarbonEventDelegate CarbonEventHandler
;
67 private static Hashtable WindowMapping
;
68 private static Hashtable WindowBackgrounds
;
69 private static Hwnd GrabWindowHwnd
;
70 private static IntPtr FosterParent
;
71 private static int TitleBarHeight
;
72 private static int MenuBarHeight
;
73 private static EventTypeSpec
[] viewEvents
= new EventTypeSpec
[] {
74 new EventTypeSpec (OSXConstants
.kEventClassControl
, OSXConstants
.kEventControlSetFocusPart
),
75 new EventTypeSpec (OSXConstants
.kEventClassControl
, OSXConstants
.kEventControlClick
),
76 new EventTypeSpec (OSXConstants
.kEventClassControl
, OSXConstants
.kEventControlContextualMenuClick
),
77 new EventTypeSpec (OSXConstants
.kEventClassControl
, OSXConstants
.kEventControlTrack
),
78 new EventTypeSpec (OSXConstants
.kEventClassControl
, OSXConstants
.kEventControlSimulateHit
),
79 new EventTypeSpec (OSXConstants
.kEventClassControl
, OSXConstants
.kEventControlBoundsChanged
),
80 new EventTypeSpec (OSXConstants
.kEventClassControl
, OSXConstants
.kEventControlDraw
)
82 private static EventTypeSpec
[] windowEvents
= new EventTypeSpec
[] {
83 //new EventTypeSpec (OSXConstants.kEventClassMouse, OSXConstants.kEventMouseEntered),
84 //new EventTypeSpec (OSXConstants.kEventClassMouse, OSXConstants.kEventMouseExited),
85 new EventTypeSpec (OSXConstants
.kEventClassMouse
, OSXConstants
.kEventMouseMoved
),
86 //new EventTypeSpec (OSXConstants.kEventClassMouse, OSXConstants.kEventMouseDragged),
87 //new EventTypeSpec (OSXConstants.kEventClassMouse, OSXConstants.kEventMouseWheelMoved),
88 new EventTypeSpec (OSXConstants
.kEventClassWindow
, OSXConstants
.kEventWindowBoundsChanged
),
89 new EventTypeSpec (OSXConstants
.kEventClassWindow
, OSXConstants
.kEventWindowClose
),
90 new EventTypeSpec (OSXConstants
.kEventClassKeyboard
, OSXConstants
.kEventRawKeyDown
),
91 new EventTypeSpec (OSXConstants
.kEventClassKeyboard
, OSXConstants
.kEventRawKeyRepeat
),
92 new EventTypeSpec (OSXConstants
.kEventClassKeyboard
, OSXConstants
.kEventRawKeyUp
)
97 private static Queue MessageQueue
;
98 private static bool GetMessageResult
;
101 private ArrayList TimerList
;
103 static readonly object lockobj
= new object ();
106 internal override event EventHandler Idle
;
111 private XplatUIOSX() {
114 TimerList
= new ArrayList ();
115 MessageQueue
= new Queue ();
121 // FIXME: Clean up the FosterParent here.
126 #region Singleton specific code
128 public static XplatUIOSX
GetInstance() {
130 if (Instance
== null) {
131 Instance
= new XplatUIOSX ();
138 public int Reference
{
146 #region Internal methods
148 internal void Initialize () {
150 // Initialize the Event Handler delegate
151 CarbonEventHandler
= new CarbonEventDelegate (EventCallback
);
153 // Initilize the mouse controls
154 Hover
.Interval
= 500;
155 Hover
.Timer
= new Timer ();
156 Hover
.Timer
.Enabled
= false;
157 Hover
.Timer
.Interval
= Hover
.Interval
;
158 Hover
.Timer
.Tick
+= new EventHandler (HoverCallback
);
161 MouseState
= MouseButtons
.None
;
162 mouse_position
= Point
.Empty
;
164 // Initialize the Caret
165 Caret
.Timer
= new Timer ();
166 Caret
.Timer
.Interval
= 500;
167 Caret
.Timer
.Tick
+= new EventHandler (CaretCallback
);
169 // Initialize the OSX Specific stuff
170 WindowMapping
= new Hashtable ();
171 WindowBackgrounds
= new Hashtable ();
173 // Initialize the FosterParent
174 IntPtr rect
= IntPtr
.Zero
;
175 SetRect (ref rect
, (short)0, (short)0, (short)0, (short)0);
176 CheckError (CreateNewWindow (WindowClass
.kDocumentWindowClass
, WindowAttributes
.kWindowStandardHandlerAttribute
| WindowAttributes
.kWindowCloseBoxAttribute
| WindowAttributes
.kWindowFullZoomAttribute
| WindowAttributes
.kWindowCollapseBoxAttribute
| WindowAttributes
.kWindowResizableAttribute
| WindowAttributes
.kWindowCompositingAttribute
, ref rect
, ref FosterParent
), "CreateFosterParent ()");
178 // Get some values about bar heights
179 Rect structRect
= new Rect ();
180 Rect contentRect
= new Rect ();
181 CheckError (GetWindowBounds (FosterParent
, 32, ref structRect
), "GetWindowBounds ()");
182 CheckError (GetWindowBounds (FosterParent
, 33, ref contentRect
), "GetWindowBounds ()");
184 TitleBarHeight
= Math
.Abs(structRect
.top
- contentRect
.top
);
185 MenuBarHeight
= GetMBarHeight ();
188 FocusWindow
= IntPtr
.Zero
;
191 GetMessageResult
= true;
196 #region Private methods
201 private void CaretCallback (object sender
, EventArgs e
) {
213 private void HoverCallback (object sender
, EventArgs e
) {
214 if ((Hover
.X
== mouse_position
.X
) && (Hover
.Y
== mouse_position
.Y
)) {
215 MSG msg
= new MSG ();
216 msg
.hwnd
= Hover
.Hwnd
;
217 msg
.message
= Msg
.WM_MOUSEHOVER
;
218 msg
.wParam
= GetMousewParam (0);
219 msg
.lParam
= (IntPtr
)((ushort)Hover
.X
<< 16 | (ushort)Hover
.X
);
220 MessageQueue
.Enqueue (msg
);
224 internal int EventCallback (IntPtr inCallRef
, IntPtr inEvent
, IntPtr handle
) {
225 uint eventClass
= GetEventClass (inEvent
);
226 uint eventKind
= GetEventKind (inEvent
);
228 lock (MessageQueue
) {
229 switch (eventClass
) {
231 case OSXConstants
.kEventClassKeyboard
: {
232 retVal
= ProcessKeyboardEvent (inEvent
, eventKind
, handle
);
236 case OSXConstants
.kEventClassWindow
: {
237 retVal
= ProcessWindowEvent (inEvent
, eventKind
, handle
);
241 case OSXConstants
.kEventClassMouse
: {
242 retVal
= ProcessMouseEvent (inEvent
, eventKind
, handle
);
246 case OSXConstants
.kEventClassControl
: {
247 retVal
= ProcessControlEvent (inEvent
, eventKind
, handle
);
251 Console
.WriteLine ("WARNING: Unhandled eventClass {0}", eventClass
);
262 #region Private Methods
264 // This sucks write a real driver
265 private int ProcessKeyboardEvent (IntPtr inEvent
, uint eventKind
, IntPtr handle
) {
266 MSG msg
= new MSG ();
267 byte charCode
= 0x00;
268 GetEventParameter (inEvent
, OSXConstants
.EventParamName
.kEventParamKeyMacCharCodes
, OSXConstants
.EventParamType
.typeChar
, IntPtr
.Zero
, (uint)Marshal
.SizeOf (typeof (byte)), IntPtr
.Zero
, ref charCode
);
269 IntPtr cntrl
= IntPtr
.Zero
;
270 CheckError (GetKeyboardFocus (handle
, ref cntrl
), "GetKeyboardFocus()");
272 msg
.lParam
= IntPtr
.Zero
;
287 msg
.wParam
= (IntPtr
)charCode
;
290 case OSXConstants
.kEventRawKeyDown
: {
291 msg
.message
= Msg
.WM_KEYDOWN
;
295 case OSXConstants
.kEventRawKeyRepeat
: {
296 msg
.message
= Msg
.WM_KEYDOWN
;
300 case OSXConstants
.kEventRawKeyUp
: {
301 msg
.message
= Msg
.WM_KEYUP
;
305 MessageQueue
.Enqueue (msg
);
309 private int ProcessWindowEvent (IntPtr inEvent
, uint eventKind
, IntPtr handle
) {
310 MSG msg
= new MSG ();
312 // Someone closed a window
313 case OSXConstants
.kEventWindowClose
: {
314 // This is our real window; so we have to post to the corresponding view
315 // FIXME: Should we doublehash the table to get the real window handle without this loop?
316 IDictionaryEnumerator e
= WindowMapping
.GetEnumerator ();
317 while (e
.MoveNext ()) {
318 if ((IntPtr
)e
.Value
== handle
) {
319 NativeWindow
.WndProc((IntPtr
)e
.Key
, Msg
.WM_DESTROY
, IntPtr
.Zero
, IntPtr
.Zero
);
324 case OSXConstants
.kEventWindowBoundsChanged
: {
325 // This is our real window; so we have to resize the corresponding view as well
326 // FIXME: Should we doublehash the table to get the real window handle without this loop?
328 IDictionaryEnumerator e
= WindowMapping
.GetEnumerator ();
329 while (e
.MoveNext ()) {
330 if ((IntPtr
)e
.Value
== handle
) {
331 Hwnd hwnd
= Hwnd
.ObjectFromHandle ((IntPtr
) e
.Key
);
332 // Get the bounds of the window
333 Rect bounds
= new Rect ();
334 CheckError (GetWindowBounds (handle
, 33, ref bounds
), "GetWindowBounds ()");
335 HIRect r
= new HIRect ();
337 // Get our frame for the Handle
338 CheckError (HIViewGetFrame (hwnd
.Handle
, ref r
), "HIViewGetFrame ()");
339 r
.size
.width
= bounds
.right
-bounds
.left
;
340 r
.size
.height
= bounds
.bottom
-bounds
.top
;
341 // Set the view to the new size
342 CheckError (HIViewSetFrame (hwnd
.WholeWindow
, ref r
), "HIViewSetFrame ()");
344 // Update the hwnd internal size representation
345 hwnd
.x
= (int)r
.origin
.x
;
346 hwnd
.y
= (int)r
.origin
.y
;
347 hwnd
.width
= (int)r
.size
.width
;
348 hwnd
.height
= (int)r
.size
.height
;
349 Rectangle client_rect
= hwnd
.ClientRect
;
351 r
.size
.width
= client_rect
.Width
;
352 r
.size
.height
= client_rect
.Height
;
353 r
.origin
.x
= client_rect
.X
;
354 r
.origin
.y
= client_rect
.Y
;
356 // Update the client area too
357 CheckError (HIViewSetFrame (hwnd
.ClientWindow
, ref r
));
359 // Add the message to the queue
360 msg
.message
= Msg
.WM_WINDOWPOSCHANGED
;
361 msg
.hwnd
= hwnd
.Handle
;
362 msg
.wParam
= IntPtr
.Zero
;
363 msg
.lParam
= IntPtr
.Zero
;
364 MessageQueue
.Enqueue (msg
);
375 private int ProcessMouseEvent (IntPtr inEvent
, uint eventKind
, IntPtr handle
) {
376 MSG msg
= new MSG ();
379 case OSXConstants
.kEventMouseMoved
: {
380 // Where is the mouse in global coordinates
381 QDPoint pt
= new QDPoint ();
382 GetEventParameter (inEvent
, OSXConstants
.EventParamName
.kEventParamMouseLocation
, OSXConstants
.EventParamType
.typeQDPoint
, IntPtr
.Zero
, (uint)Marshal
.SizeOf (typeof (QDPoint
)), IntPtr
.Zero
, ref pt
);
384 // Where is the mouse in the window
385 Rect window_bounds
= new Rect ();
386 GetWindowBounds (handle
, 33, ref window_bounds
);
387 CGPoint window_pt
= new CGPoint ((short) (pt
.x
- window_bounds
.left
), (short) (pt
.y
- window_bounds
.top
));
389 IntPtr window_handle
= IntPtr
.Zero
;
390 HIViewFindByID (HIViewGetRoot (handle
), new HIViewID (OSXConstants
.kEventClassWindow
, 1), ref window_handle
);
392 // Determine which control was hit
393 IntPtr view_handle
= IntPtr
.Zero
;
394 HIViewGetSubviewHit (window_handle
, ref window_pt
, true, ref view_handle
);
396 // Convert the point to view local coordinates
397 HIViewConvertPoint (ref window_pt
, window_handle
, view_handle
);
399 Hwnd hwnd
= Hwnd
.ObjectFromHandle (view_handle
);
404 // Generate the message
405 msg
.hwnd
= hwnd
.Handle
;
406 msg
.message
= Msg
.WM_MOUSEMOVE
;
407 msg
.lParam
= (IntPtr
) ((ushort)window_pt
.y
<< 16 | (ushort)window_pt
.x
);
408 msg
.wParam
= GetMousewParam (0);
409 mouse_position
.X
= (int)window_pt
.x
;
410 mouse_position
.Y
= (int)window_pt
.y
;
412 Hover
.Hwnd
= msg
.hwnd
;
413 Hover
.Timer
.Enabled
= true;
414 MessageQueue
.Enqueue (msg
);
421 private int ProcessControlEvent (IntPtr inEvent
, uint eventKind
, IntPtr handle
) {
422 GetEventParameter (inEvent
, OSXConstants
.EventParamName
.kEventParamDirectObject
, OSXConstants
.EventParamType
.typeControlRef
, IntPtr
.Zero
, (uint)Marshal
.SizeOf (typeof (IntPtr
)), IntPtr
.Zero
, ref handle
);
423 Hwnd hwnd
= Hwnd
.ObjectFromHandle (handle
);
424 MSG msg
= new MSG ();
427 case OSXConstants
.kEventControlDraw
: {
429 if(!hwnd
.visible
|| !HIViewIsVisible (handle
))
433 IntPtr rgnhandle = IntPtr.Zero;
434 GetEventParameter (inEvent, OSXConstants.EventParamName.kEventParamRgnHandle, OSXConstants.EventParamType.typeQDRgnHandle, IntPtr.Zero, (uint)Marshal.SizeOf (typeof (IntPtr)), IntPtr.Zero, ref rgnhandle);
435 IntPtr duprgn = NewRgn ();
436 CopyRgn (rgnhandle, duprgn);
437 ClipRegions [hwnd.Handle] = duprgn;
440 // Get the dirty area
441 HIRect bounds
= new HIRect ();
442 HIViewGetBounds (handle
, ref bounds
);
444 bool client
= (hwnd
.ClientWindow
== handle
? true : false);
446 if (!client
&& bounds
.origin
.x
>= hwnd
.ClientRect
.X
&& bounds
.origin
.y
>= hwnd
.ClientRect
.Y
) {
447 // This is a paint on WholeWindow inside the clientRect; we can safely discard this
451 hwnd
.AddInvalidArea ((int)bounds
.origin
.x
, (int)bounds
.origin
.y
, (int)bounds
.size
.width
, (int)bounds
.size
.height
);
452 if (WindowBackgrounds
[hwnd
] != null) {
453 Color c
= (Color
)WindowBackgrounds
[hwnd
];
454 IntPtr contextref
= IntPtr
.Zero
;
455 GetEventParameter (inEvent
, OSXConstants
.EventParamName
.kEventParamCGContextRef
, OSXConstants
.EventParamType
.typeCGContextRef
, IntPtr
.Zero
, (uint)Marshal
.SizeOf (typeof (IntPtr
)), IntPtr
.Zero
, ref contextref
);
456 CGContextSetRGBFillColor (contextref
, (float)c
.R
/255, (float)c
.G
/255, (float)c
.B
/255, (float)c
.A
/255);
457 CGContextFillRect (contextref
, bounds
);
460 // Add a paint to the queue
461 msg
.hwnd
= hwnd
.Handle
;
462 msg
.message
= Msg
.WM_PAINT
;
463 msg
.wParam
= IntPtr
.Zero
;
464 msg
.lParam
= IntPtr
.Zero
;
465 MessageQueue
.Enqueue (msg
);
469 case OSXConstants
.kEventControlBoundsChanged
: {
470 // This can happen before our HWND is created so we need to check to make sure its not null
473 HIRect bounds
= new HIRect ();
474 HIViewGetFrame (handle
, ref bounds
);
475 // Update the hwnd size
476 hwnd
.x
= (int)bounds
.origin
.x
;
477 hwnd
.y
= (int)bounds
.origin
.y
;
478 hwnd
.width
= (int)bounds
.size
.width
;
479 hwnd
.height
= (int)bounds
.size
.height
;
481 // TODO: Do we need to send a paint here or does BoundsChanged make a ControlDraw for the exposed area?
485 case OSXConstants
.kEventControlTrack
: {
486 // get the point that was hit
487 QDPoint point
= new QDPoint ();
488 CheckError (GetEventParameter (inEvent
, OSXConstants
.EventParamName
.kEventParamMouseLocation
, OSXConstants
.EventParamType
.typeQDPoint
, IntPtr
.Zero
, (uint)Marshal
.SizeOf (typeof (QDPoint
)), IntPtr
.Zero
, ref point
), "GetEventParameter() MouseLocation");
489 MouseTrackingResult mousestatus
= MouseTrackingResult
.kMouseTrackingMouseDown
;
490 IntPtr modifiers
= IntPtr
.Zero
;
492 while (mousestatus
!= MouseTrackingResult
.kMouseTrackingMouseUp
) {
493 CheckTimers (DateTime
.Now
);
494 if (mousestatus
== MouseTrackingResult
.kMouseTrackingMouseDragged
) {
495 QDPoint realpoint
= point
;
498 ScreenToClient (hwnd
.Handle
, ref x
, ref y
);
499 realpoint
.x
= (short)x
;
500 realpoint
.y
= (short)y
;
501 NativeWindow
.WndProc (hwnd
.Handle
, Msg
.WM_MOUSEMOVE
, GetMousewParam (0), (IntPtr
) ((ushort)realpoint
.y
<< 16 | (ushort)realpoint
.x
));
503 // Process the rest of the event queue
504 while (MessageQueue
.Count
> 0) {
505 msg
= (MSG
)MessageQueue
.Dequeue ();
506 NativeWindow
.WndProc (msg
.hwnd
, msg
.message
, msg
.wParam
, msg
.lParam
);
508 TrackMouseLocationWithOptions ((IntPtr
)(-1), 0, 0.01, ref point
, ref modifiers
, ref mousestatus
);
511 msg
.hwnd
= hwnd
.Handle
;
513 bool client
= (hwnd
.ClientWindow
== handle
? true : false);
515 int wparam
= (int)GetMousewParam (0);
516 switch (MouseState
) {
517 case MouseButtons
.Left
:
518 MouseState
&= ~MouseButtons
.Left
;
519 msg
.message
= (client
? Msg
.WM_LBUTTONUP
: Msg
.WM_NCLBUTTONUP
);
520 wparam
&= (int)MsgButtons
.MK_LBUTTON
;
522 case MouseButtons
.Middle
:
523 MouseState
&= ~MouseButtons
.Middle
;
524 msg
.message
= (client
? Msg
.WM_MBUTTONUP
: Msg
.WM_NCMBUTTONUP
);
525 wparam
&= (int)MsgButtons
.MK_MBUTTON
;
527 case MouseButtons
.Right
:
528 MouseState
&= ~MouseButtons
.Right
;
529 msg
.message
= (client
? Msg
.WM_RBUTTONUP
: Msg
.WM_NCRBUTTONUP
);
530 wparam
&= (int)MsgButtons
.MK_RBUTTON
;
535 ScreenToClient (hwnd
.Handle
, ref x2
, ref y2
);
539 msg
.wParam
= (IntPtr
)wparam
;
541 msg
.lParam
= (IntPtr
) ((ushort)point
.y
<< 16 | (ushort)point
.x
);
542 mouse_position
.X
= (int)point
.x
;
543 mouse_position
.Y
= (int)point
.y
;
544 //NativeWindow.WndProc (msg.hwnd, msg.message, msg.lParam, msg.wParam);
545 MessageQueue
.Enqueue (msg
);
547 IntPtr window
= GetControlOwner (hwnd
.Handle
);
548 SetKeyboardFocus (window
, hwnd
.Handle
, 1);
552 case OSXConstants
.kEventControlContextualMenuClick
:
553 case OSXConstants
.kEventControlClick
: {
554 // get the point that was hit
555 QDPoint point
= new QDPoint ();
556 CheckError (GetEventParameter (inEvent
, OSXConstants
.EventParamName
.kEventParamMouseLocation
, OSXConstants
.EventParamType
.typeQDPoint
, IntPtr
.Zero
, (uint)Marshal
.SizeOf (typeof (QDPoint
)), IntPtr
.Zero
, ref point
), "GetEventParameter() MouseLocation");
557 QDPoint trackpoint
= point
;
560 ScreenToClient (hwnd
.Handle
, ref x
, ref y
);
564 // which button was pressed?
566 GetEventParameter (inEvent
, OSXConstants
.EventParamName
.kEventParamMouseButton
, OSXConstants
.EventParamType
.typeMouseButton
, IntPtr
.Zero
, (uint)Marshal
.SizeOf (typeof (ushort)), IntPtr
.Zero
, ref button
);
568 point
.x
= (short)mouse_position
.X
;
569 point
.y
= (short)mouse_position
.Y
;
572 msg
.hwnd
= hwnd
.Handle
;
574 bool client
= (hwnd
.ClientWindow
== handle
? true : false);
576 int wparam
= (int)GetMousewParam (0);
579 MouseState
|= MouseButtons
.Left
;
580 msg
.message
= (client
? Msg
.WM_LBUTTONDOWN
: Msg
.WM_NCLBUTTONDOWN
);
581 wparam
|= (int)MsgButtons
.MK_LBUTTON
;
584 MouseState
|= MouseButtons
.Right
;
585 msg
.message
= (client
? Msg
.WM_RBUTTONDOWN
: Msg
.WM_NCRBUTTONDOWN
);
586 wparam
|= (int)MsgButtons
.MK_RBUTTON
;
589 MouseState
|= MouseButtons
.Middle
;
590 msg
.message
= (client
? Msg
.WM_MBUTTONDOWN
: Msg
.WM_NCMBUTTONDOWN
);
591 wparam
|= (int)MsgButtons
.MK_MBUTTON
;
594 msg
.wParam
= (IntPtr
)wparam
;
596 msg
.lParam
= (IntPtr
) ((ushort)point
.y
<< 16 | (ushort)point
.x
);
597 mouse_position
.X
= (int)point
.x
;
598 mouse_position
.Y
= (int)point
.y
;
599 NativeWindow
.WndProc (msg
.hwnd
, msg
.message
, msg
.wParam
, msg
.lParam
);
601 TrackControl (handle
, trackpoint
, IntPtr
.Zero
);
604 case OSXConstants
.kEventControlSetFocusPart
: {
605 // This handles setting focus
607 GetEventParameter (inEvent
, OSXConstants
.EventParamName
.kEventParamControlPart
, OSXConstants
.EventParamType
.typeControlPartCode
, IntPtr
.Zero
, (uint)Marshal
.SizeOf (typeof (short)), IntPtr
.Zero
, ref pcode
);
615 SetEventParameter (inEvent
, OSXConstants
.EventParamName
.kEventParamControlPart
, OSXConstants
.EventParamType
.typeControlPartCode
, (uint)Marshal
.SizeOf (typeof (short)), ref pcode
);
621 private IntPtr
GetMousewParam(int Delta
) {
624 if ((MouseState
& MouseButtons
.Left
) != 0) {
625 result
|= (int)MsgButtons
.MK_LBUTTON
;
628 if ((MouseState
& MouseButtons
.Middle
) != 0) {
629 result
|= (int)MsgButtons
.MK_MBUTTON
;
632 if ((MouseState
& MouseButtons
.Right
) != 0) {
633 result
|= (int)MsgButtons
.MK_RBUTTON
;
636 return (IntPtr
)result
;
639 private double NextTimeout ()
641 DateTime now
= DateTime
.Now
;
642 int timeout
= 0x7FFFFFF;
644 foreach (Timer timer
in TimerList
) {
645 int next
= (int) (timer
.Expires
- now
).TotalMilliseconds
;
652 if (timeout
< Timer
.Minimum
)
653 timeout
= Timer
.Minimum
;
655 return (double)((double)timeout
/1000);
658 private void CheckTimers (DateTime now
)
661 int count
= TimerList
.Count
;
664 for (int i
= 0; i
< TimerList
.Count
; i
++) {
665 Timer timer
= (Timer
) TimerList
[i
];
666 if (timer
.Enabled
&& timer
.Expires
<= now
) {
674 internal void InvertCaret () {
675 IntPtr window
= GetControlOwner (Caret
.Hwnd
);
676 SetPortWindowPort (window
);
677 Rect r
= new Rect ();
678 GetWindowPortBounds (window
, ref r
);
679 r
.top
+= (short)Caret
.Y
;
680 r
.left
+= (short)Caret
.X
;
681 r
.bottom
= (short)(r
.top
+ Caret
.Height
);
682 r
.right
= (short)(r
.left
+ Caret
.Width
);
686 private void SetHwndStyles(Hwnd hwnd
, CreateParams cp
) {
687 throw new NotImplementedException();
690 internal void ShowCaret () {
697 internal void HideCaret () {
704 internal void InstallTracking (Hwnd hwnd
) {
705 // This is currently not used
708 if (hwnd.client_region_ptr != IntPtr.Zero) {
709 ReleaseMouseTrackingRegion (hwnd.client_region_ptr);
710 hwnd.client_region_ptr = IntPtr.Zero;
712 if (hwnd.whole_region_ptr != IntPtr.Zero) {
713 ReleaseMouseTrackingRegion (hwnd.whole_region_ptr);
714 hwnd.whole_region_ptr = IntPtr.Zero;
716 // Setup the new track region
718 HIRect client_bounds = new HIRect ();
719 HIViewGetBounds (hwnd.client_window, ref client_bounds);
720 HIViewConvertRect (ref client_bounds, hwnd.client_window, IntPtr.Zero);
722 IntPtr rgn = NewRgn ();
723 SetRectRgn (rgn, (short)client_bounds.origin.x, (short)client_bounds.origin.y, (short)(client_bounds.origin.x+hwnd.ClientRect.Width), (short)(client_bounds.origin.y+hwnd.ClientRect.Height));
724 CreateMouseTrackingRegion (GetControlOwner (hwnd.client_window), rgn, IntPtr.Zero, 0, hwnd.client_region_id, hwnd.client_window, IntPtr.Zero, ref hwnd.client_region_ptr);
725 Console.WriteLine (hwnd.ClientRect);
726 Console.WriteLine ("Created a mouse trcaking region on the client window @ {0}x{1} {2}x{3}", (short)client_bounds.origin.x, (short)client_bounds.origin.y, (short)(client_bounds.origin.x+hwnd.ClientRect.Width), (short)(client_bounds.origin.y+hwnd.ClientRect.Height));
727 if (hwnd.ClientRect.X > 0 && hwnd.ClientRect.Y > 0) {
728 HIRect window_bounds = new HIRect ();
729 HIViewGetBounds (hwnd.whole_window, ref window_bounds);
730 HIViewConvertRect (ref window_bounds, hwnd.whole_window, IntPtr.Zero);
732 SetRectRgn (rgn, (short)window_bounds.origin.x, (short)window_bounds.origin.y, (short)(window_bounds.origin.x+hwnd.ClientRect.X), (short)(window_bounds.origin.y+hwnd.ClientRect.Y));
733 CreateMouseTrackingRegion (GetControlOwner (hwnd.whole_window), rgn, IntPtr.Zero, 0, hwnd.whole_region_id, hwnd.whole_window, IntPtr.Zero, ref hwnd.whole_region_ptr);
734 Console.WriteLine ("Created a mouse trcaking region on the whole window @ {0}x{1} {2}x{3}", (short)window_bounds.origin.x, (short)window_bounds.origin.y, (short)(window_bounds.origin.x+hwnd.ClientRect.X), (short)(window_bounds.origin.y+hwnd.ClientRect.Y));
740 internal void CheckError (int result
, string error
) {
742 throw new Exception ("XplatUIOSX.cs::" + error
+ "() Carbon subsystem threw an error: " + result
);
745 internal void CheckError (int result
) {
747 throw new Exception ("XplatUIOSX.cs::Carbon subsystem threw an error: " + result
);
752 #region Public Methods
754 internal override IntPtr
InitializeDriver() {
758 internal override void ShutdownDriver(IntPtr token
) {
761 internal override void EnableThemes() {
762 themes_enabled
= true;
765 internal override void Activate(IntPtr handle
) {
766 ActivateWindow (GetControlOwner (handle
), true);
769 internal override void AudibleAlert() {
770 throw new NotImplementedException();
773 internal override void CaretVisible (IntPtr hwnd
, bool visible
) {
774 if (Caret
.Hwnd
== hwnd
) {
776 if (Caret
.Visible
< 1) {
779 if (Caret
.Visible
== 1) {
781 Caret
.Timer
.Start ();
786 if (Caret
.Visible
== 0) {
794 internal override bool CalculateWindowRect(ref Rectangle ClientRect
, int Style
, int ExStyle
, Menu menu
, out Rectangle WindowRect
) {
795 FormBorderStyle border_style
;
796 TitleStyle title_style
;
797 bool border_static
= false;
799 title_style
= TitleStyle
.None
;
800 if ((Style
& (int)WindowStyles
.WS_CAPTION
) != 0) {
801 if ((ExStyle
& (int)WindowExStyles
.WS_EX_TOOLWINDOW
) != 0) {
802 title_style
= TitleStyle
.Tool
;
804 title_style
= TitleStyle
.Normal
;
808 border_style
= FormBorderStyle
.None
;
809 if ((ExStyle
& (int)WindowExStyles
.WS_EX_WINDOWEDGE
) != 0) {
810 if ((ExStyle
& (int)WindowExStyles
.WS_EX_TOOLWINDOW
) != 0) {
811 if ((Style
& (int)WindowStyles
.WS_THICKFRAME
) != 0) {
812 border_style
= FormBorderStyle
.SizableToolWindow
;
814 border_style
= FormBorderStyle
.FixedToolWindow
;
816 } else if ((ExStyle
& (int)WindowExStyles
.WS_EX_DLGMODALFRAME
) != 0) {
817 border_style
= FormBorderStyle
.FixedDialog
;
818 } else if ((ExStyle
& (int)WindowStyles
.WS_THICKFRAME
) != 0) {
819 border_style
= FormBorderStyle
.Sizable
;
821 border_style
= FormBorderStyle
.FixedSingle
;
824 border_style
= FormBorderStyle
.Fixed3D
;
827 WindowRect
= Hwnd
.GetWindowRectangle(border_style
, border_static
, menu
, title_style
,
828 SystemInformation
.CaptionHeight
,
829 SystemInformation
.ToolWindowCaptionHeight
, ClientRect
);
834 internal override void ClientToScreen(IntPtr handle
, ref int x
, ref int y
) {
835 CGPoint pt
= new CGPoint ();
836 Rect wBounds
= new Rect ();
839 hwnd
= Hwnd
.ObjectFromHandle(handle
);
844 GetWindowBounds (GetControlOwner (hwnd
.client_window
), 32, ref wBounds
);
845 HIViewConvertPoint (ref pt
, handle
, IntPtr
.Zero
);
847 x
= (int)(pt
.x
+wBounds
.left
);
848 y
= (int)(pt
.y
+wBounds
.top
);
851 internal override int[] ClipboardAvailableFormats(IntPtr handle
) {
855 internal override void ClipboardClose(IntPtr handle
) {
856 throw new NotImplementedException();
859 internal override int ClipboardGetID(IntPtr handle
, string format
) {
863 internal override IntPtr
ClipboardOpen(bool primary_selection
) {
864 throw new NotImplementedException();
867 internal override object ClipboardRetrieve(IntPtr handle
, int id
, XplatUI
.ClipboardToObject converter
) {
868 throw new NotImplementedException();
871 internal override void ClipboardStore(IntPtr handle
, object obj
, int type
, XplatUI
.ObjectToClipboard converter
) {
872 throw new NotImplementedException();
875 internal override void CreateCaret (IntPtr hwnd
, int width
, int height
) {
876 if (Caret
.Hwnd
!= IntPtr
.Zero
)
877 DestroyCaret (Caret
.Hwnd
);
881 Caret
.Height
= height
;
886 internal override IntPtr
CreateWindow(CreateParams cp
) {
887 IntPtr windowHnd
= IntPtr
.Zero
;
888 IntPtr parentHnd
= cp
.Parent
;
889 bool realWindow
= false;
890 Rectangle clientRect
;
891 Hwnd hwnd
= new Hwnd ();
893 SetHwndStyles (hwnd
, cp
);
895 if (parentHnd
== IntPtr
.Zero
) {
896 if ((cp
.Style
& (int)(WindowStyles
.WS_CHILD
))!=0) {
897 // This is a child view that is going to be parentless;
899 CheckError (HIViewFindByID (HIViewGetRoot (FosterParent
), new HIViewID (OSXConstants
.kEventClassWindow
, 1), ref parentHnd
), "HIViewFindByID ()");
900 } else if ((cp
.Style
& (int)(WindowStyles
.WS_POPUP
))!=0) {
901 // This is a popup window that will be real.
902 if (cp
.X
< 1) cp
.X
= 0;
903 if (cp
.Y
< 1) cp
.Y
= 0;
906 // This is a real root window too
907 if (cp
.X
< 1) cp
.X
= 0;
908 if (cp
.Y
< 1) cp
.Y
= 0;
916 WindowClass windowklass
= WindowClass
.kOverlayWindowClass
;
917 WindowAttributes attributes
= WindowAttributes
.kWindowCompositingAttribute
| WindowAttributes
.kWindowStandardHandlerAttribute
;
918 if ((cp
.Style
& ((int)WindowStyles
.WS_MINIMIZEBOX
)) != 0) {
919 attributes
|= WindowAttributes
.kWindowCollapseBoxAttribute
;
921 if ((cp
.Style
& ((int)WindowStyles
.WS_MAXIMIZEBOX
)) != 0) {
922 attributes
|= WindowAttributes
.kWindowResizableAttribute
| WindowAttributes
.kWindowHorizontalZoomAttribute
| WindowAttributes
.kWindowVerticalZoomAttribute
;
924 if ((cp
.Style
& ((int)WindowStyles
.WS_SYSMENU
)) != 0) {
925 attributes
|= WindowAttributes
.kWindowCloseBoxAttribute
;
927 if ((cp
.ExStyle
& ((int)WindowExStyles
.WS_EX_TOOLWINDOW
)) != 0) {
928 attributes
= WindowAttributes
.kWindowStandardHandlerAttribute
| WindowAttributes
.kWindowCompositingAttribute
;
930 if ((cp
.Style
& ((int)WindowStyles
.WS_CAPTION
)) != 0) {
931 windowklass
= WindowClass
.kDocumentWindowClass
;
934 IntPtr rect
= IntPtr
.Zero
;
935 IntPtr viewHnd
= IntPtr
.Zero
;
936 SetRect (ref rect
, (short)cp
.X
, (short)(cp
.Y
+ MenuBarHeight
+ TitleBarHeight
), (short)(cp
.Width
+cp
.X
), (short)(cp
.Height
+cp
.Y
+MenuBarHeight
+TitleBarHeight
));
937 CheckError (CreateNewWindow (windowklass
, attributes
, ref rect
, ref windowHnd
), "CreateNewWindow ()");
939 CheckError (InstallEventHandler (GetWindowEventTarget (windowHnd
), CarbonEventHandler
, (uint)windowEvents
.Length
, windowEvents
, windowHnd
, IntPtr
.Zero
), "InstallEventHandler ()");
940 CheckError (HIViewFindByID (HIViewGetRoot (windowHnd
), new HIViewID (OSXConstants
.kEventClassWindow
, 1), ref viewHnd
), "HIViewFindByID ()");
945 hwnd
.Width
= cp
.Width
;
946 hwnd
.Height
= cp
.Height
;
947 hwnd
.Parent
= Hwnd
.ObjectFromHandle (cp
.Parent
);
948 hwnd
.visible
= false;
949 clientRect
= hwnd
.ClientRect
;
951 HIRect r
= new HIRect (0, 0, cp
.Width
, cp
.Height
);
952 CheckError (HIObjectCreate (__CFStringMakeConstantString ("com.apple.hiview"), 0, ref hwnd
.whole_window
), "HIObjectCreate ()");
953 CheckError (InstallEventHandler (GetControlEventTarget (hwnd
.whole_window
), CarbonEventHandler
, (uint)viewEvents
.Length
, viewEvents
, hwnd
.whole_window
, IntPtr
.Zero
), "InstallEventHandler ()");
954 CheckError (HIViewChangeFeatures (hwnd
.whole_window
, 1 << 1, 0), "HIViewChangeFeatures ()");
955 CheckError (HIViewSetFrame (hwnd
.whole_window
, ref r
), "HIViewSetFrame ()");
956 hwnd
.WholeWindow
= hwnd
.whole_window
;
958 r
= new HIRect (0, 0, clientRect
.Width
, clientRect
.Height
);
959 CheckError (HIObjectCreate (__CFStringMakeConstantString ("com.apple.hiview"), 0, ref hwnd
.client_window
), "HIObjectCreate ()");
960 CheckError (InstallEventHandler (GetControlEventTarget (hwnd
.client_window
), CarbonEventHandler
, (uint)viewEvents
.Length
, viewEvents
, hwnd
.client_window
, IntPtr
.Zero
), "InstallEventHandler ()");
961 CheckError (HIViewChangeFeatures (hwnd
.client_window
, 1 << 1, 0), "HIViewChangeFeatures ()");
962 CheckError (HIViewSetFrame (hwnd
.client_window
, ref r
), "HIViewSetFrame ()");
963 hwnd
.ClientWindow
= hwnd
.client_window
;
965 CheckError (HIViewAddSubview (hwnd
.whole_window
, hwnd
.client_window
));
966 CheckError (HIViewPlaceInSuperviewAt (hwnd
.client_window
, clientRect
.X
, clientRect
.Y
));
968 if (parentHnd
!= IntPtr
.Zero
&& parentHnd
!= hwnd
.WholeWindow
) {
969 CheckError (HIViewAddSubview (parentHnd
, hwnd
.whole_window
), "HIViewAddSubview ()");
970 CheckError (HIViewPlaceInSuperviewAt (hwnd
.whole_window
, cp
.X
, cp
.Y
), "HIPlaceInSuperviewAt ()");
971 if ((cp
.Style
& (int)(WindowStyles
.WS_VISIBLE
))!=0) {
972 CheckError (HIViewSetVisible (hwnd
.whole_window
, true), "HIViewSetVisible ()");
973 CheckError (HIViewSetVisible (hwnd
.client_window
, true), "HIViewSetVisible ()");
976 CheckError (HIViewSetVisible (hwnd
.whole_window
, false), "HIViewSetVisible ()");
977 CheckError (HIViewSetVisible (hwnd
.client_window
, false), "HIViewSetVisible ()");
978 hwnd
.visible
= false;
982 WindowMapping
[hwnd
.Handle
] = windowHnd
;
983 if ((cp
.Style
& (int)(WindowStyles
.WS_VISIBLE
))!=0) {
984 CheckError (ShowWindow (windowHnd
));
985 CheckError (HIViewSetVisible (hwnd
.whole_window
, true), "HIViewSetVisible ()");
986 CheckError (HIViewSetVisible (hwnd
.client_window
, true), "HIViewSetVisible ()");
989 if ((cp
.Style
& (int)(WindowStyles
.WS_POPUP
))!=0) {
990 CheckError (HIViewSetVisible (hwnd
.whole_window
, true), "HIViewSetVisible ()");
991 CheckError (HIViewSetVisible (hwnd
.client_window
, true), "HIViewSetVisible ()");
999 internal override IntPtr
CreateWindow(IntPtr Parent
, int X
, int Y
, int Width
, int Height
) {
1000 CreateParams create_params
= new CreateParams();
1002 create_params
.Caption
= "";
1003 create_params
.X
= X
;
1004 create_params
.Y
= Y
;
1005 create_params
.Width
= Width
;
1006 create_params
.Height
= Height
;
1008 create_params
.ClassName
=XplatUI
.DefaultClassName
;
1009 create_params
.ClassStyle
= 0;
1010 create_params
.ExStyle
=0;
1011 create_params
.Parent
=IntPtr
.Zero
;
1012 create_params
.Param
=0;
1014 return CreateWindow(create_params
);
1018 internal override IntPtr
DefineCursor(Bitmap bitmap
, Bitmap mask
, Color cursor_pixel
, Color mask_pixel
, int xHotSpot
, int yHotSpot
) {
1019 throw new NotImplementedException ();
1023 internal override IntPtr
DefineStdCursor(StdCursor id
) {
1025 case StdCursor
.AppStarting
:
1026 return (IntPtr
)ThemeCursor
.kThemeSpinningCursor
;
1027 case StdCursor
.Arrow
:
1028 return (IntPtr
)ThemeCursor
.kThemeArrowCursor
;
1029 case StdCursor
.Cross
:
1030 return (IntPtr
)ThemeCursor
.kThemeCrossCursor
;
1031 case StdCursor
.Default
:
1032 return (IntPtr
)ThemeCursor
.kThemeArrowCursor
;
1033 case StdCursor
.Hand
:
1034 return (IntPtr
)ThemeCursor
.kThemeOpenHandCursor
;
1035 case StdCursor
.Help
:
1036 return (IntPtr
)ThemeCursor
.kThemeArrowCursor
;
1037 case StdCursor
.HSplit
:
1038 return (IntPtr
)ThemeCursor
.kThemeResizeLeftRightCursor
;
1039 case StdCursor
.IBeam
:
1040 return (IntPtr
)ThemeCursor
.kThemeIBeamCursor
;
1042 return (IntPtr
)ThemeCursor
.kThemeNotAllowedCursor
;
1043 case StdCursor
.NoMove2D
:
1044 return (IntPtr
)ThemeCursor
.kThemeNotAllowedCursor
;
1045 case StdCursor
.NoMoveHoriz
:
1046 return (IntPtr
)ThemeCursor
.kThemeNotAllowedCursor
;
1047 case StdCursor
.NoMoveVert
:
1048 return (IntPtr
)ThemeCursor
.kThemeNotAllowedCursor
;
1049 case StdCursor
.PanEast
:
1050 return (IntPtr
)ThemeCursor
.kThemeResizeRightCursor
;
1051 case StdCursor
.PanNE
:
1052 return (IntPtr
)ThemeCursor
.kThemeArrowCursor
;
1053 case StdCursor
.PanNorth
:
1054 return (IntPtr
)ThemeCursor
.kThemeArrowCursor
;
1055 case StdCursor
.PanNW
:
1056 return (IntPtr
)ThemeCursor
.kThemeArrowCursor
;
1057 case StdCursor
.PanSE
:
1058 return (IntPtr
)ThemeCursor
.kThemeArrowCursor
;
1059 case StdCursor
.PanSouth
:
1060 return (IntPtr
)ThemeCursor
.kThemeArrowCursor
;
1061 case StdCursor
.PanSW
:
1062 return (IntPtr
)ThemeCursor
.kThemeArrowCursor
;
1063 case StdCursor
.PanWest
:
1064 return (IntPtr
)ThemeCursor
.kThemeResizeLeftCursor
;
1065 case StdCursor
.SizeAll
:
1066 return (IntPtr
)ThemeCursor
.kThemeResizeLeftRightCursor
;
1067 case StdCursor
.SizeNESW
:
1068 return (IntPtr
)ThemeCursor
.kThemeArrowCursor
;
1069 case StdCursor
.SizeNS
:
1070 return (IntPtr
)ThemeCursor
.kThemeArrowCursor
;
1071 case StdCursor
.SizeNWSE
:
1072 return (IntPtr
)ThemeCursor
.kThemeArrowCursor
;
1073 case StdCursor
.SizeWE
:
1074 return (IntPtr
)ThemeCursor
.kThemeArrowCursor
;
1075 case StdCursor
.UpArrow
:
1076 return (IntPtr
)ThemeCursor
.kThemeArrowCursor
;
1077 case StdCursor
.VSplit
:
1078 return (IntPtr
)ThemeCursor
.kThemeArrowCursor
;
1079 case StdCursor
.WaitCursor
:
1080 return (IntPtr
)ThemeCursor
.kThemeSpinningCursor
;
1082 return (IntPtr
)ThemeCursor
.kThemeArrowCursor
;
1086 internal override IntPtr
DefWndProc(ref Message msg
) {
1087 Hwnd hwnd
= Hwnd
.ObjectFromHandle (msg
.HWnd
);
1088 switch ((Msg
)msg
.Msg
) {
1089 case Msg
.WM_DESTROY
: {
1090 if (WindowMapping
[hwnd
.Handle
] != null)
1099 internal override void DestroyCaret (IntPtr hwnd
) {
1100 if (Caret
.Hwnd
== hwnd
) {
1101 if (Caret
.Visible
== 1) {
1102 Caret
.Timer
.Stop ();
1105 Caret
.Hwnd
= IntPtr
.Zero
;
1112 internal override void DestroyCursor(IntPtr cursor
) {
1113 throw new NotImplementedException ();
1116 internal override void DestroyWindow(IntPtr handle
) {
1119 hwnd
= Hwnd
.ObjectFromHandle(handle
);
1121 if ((hwnd
.whole_window
!= IntPtr
.Zero
) && HIViewGetSuperview (hwnd
.whole_window
) != IntPtr
.Zero
)
1122 CheckError (HIViewRemoveFromSuperview (handle
), "HIViewRemoveFromSuperview ()");
1124 if (WindowMapping
[hwnd
.Handle
] != null) {
1125 DisposeWindow ((IntPtr
)(WindowMapping
[hwnd
.Handle
]));
1127 CFRelease (hwnd
.ClientWindow
);
1128 CFRelease (hwnd
.WholeWindow
);
1131 internal override IntPtr
DispatchMessage(ref MSG msg
) {
1132 return NativeWindow
.WndProc(msg
.hwnd
, msg
.message
, msg
.wParam
, msg
.lParam
);
1135 internal override void DoEvents() {
1138 internal override void EnableWindow(IntPtr handle
, bool Enable
) {
1139 //Like X11 we need not do anything here
1142 internal override void EndLoop(Thread thread
) {
1143 throw new NotImplementedException();
1146 internal void Exit() {
1147 GetMessageResult
= false;
1151 internal override IntPtr
GetActive() {
1152 foreach (DictionaryEntry entry
in WindowMapping
)
1153 if (IsWindowActive ((IntPtr
)(entry
.Value
)))
1154 return (IntPtr
)(entry
.Key
);
1159 internal override Region
GetClipRegion(IntPtr hwnd
) {
1164 internal override void GetCursorInfo(IntPtr cursor
, out int width
, out int height
, out int hotspot_x
, out int hotspot_y
) {
1165 throw new NotImplementedException ();
1168 internal override void GetDisplaySize(out Size size
) {
1169 HIRect bounds
= CGDisplayBounds (CGMainDisplayID ());
1170 size
= new Size ((int)bounds
.size
.width
, (int)bounds
.size
.height
);
1173 internal override IntPtr
GetParent(IntPtr handle
) {
1176 hwnd
= Hwnd
.ObjectFromHandle(handle
);
1177 if (hwnd
!= null && hwnd
.parent
!= null) {
1178 return hwnd
.parent
.Handle
;
1183 internal override void GetCursorPos(IntPtr handle
, out int x
, out int y
) {
1184 QDPoint pt
= new QDPoint ();
1185 GetGlobalMouse (ref pt
);
1190 internal override IntPtr
GetFocus() {
1195 internal override bool GetFontMetrics(Graphics g
, Font font
, out int ascent
, out int descent
) {
1196 return GetFontMetrics(g
.GetHdc(), font
.ToHfont(), out ascent
, out descent
);
1200 internal override Point
GetMenuOrigin(IntPtr hwnd
) {
1201 throw new NotImplementedException();
1204 internal override bool GetMessage(object queue_id
, ref MSG msg
, IntPtr hWnd
, int wFilterMin
, int wFilterMax
) {
1205 IntPtr evtRef
= IntPtr
.Zero
;
1206 IntPtr target
= GetEventDispatcherTarget();
1207 CheckTimers (DateTime
.Now
);
1208 ReceiveNextEvent (0, IntPtr
.Zero
, 0, true, ref evtRef
);
1209 if (evtRef
!= IntPtr
.Zero
&& target
!= IntPtr
.Zero
) {
1210 SendEventToEventTarget (evtRef
, target
);
1211 ReleaseEvent (evtRef
);
1214 lock (MessageQueue
) {
1215 if (MessageQueue
.Count
<= 0) {
1217 Idle (this, EventArgs
.Empty
);
1218 else if (TimerList
.Count
== 0) {
1219 ReceiveNextEvent (0, IntPtr
.Zero
, Convert
.ToDouble ("0." + Timer
.Minimum
), true, ref evtRef
);
1220 if (evtRef
!= IntPtr
.Zero
&& target
!= IntPtr
.Zero
) {
1221 SendEventToEventTarget (evtRef
, target
);
1222 ReleaseEvent (evtRef
);
1225 ReceiveNextEvent (0, IntPtr
.Zero
, NextTimeout (), true, ref evtRef
);
1226 if (evtRef
!= IntPtr
.Zero
&& target
!= IntPtr
.Zero
) {
1227 SendEventToEventTarget (evtRef
, target
);
1228 ReleaseEvent (evtRef
);
1231 msg
.hwnd
= IntPtr
.Zero
;
1232 msg
.message
= Msg
.WM_ENTERIDLE
;
1233 return GetMessageResult
;
1235 msg
= (MSG
) MessageQueue
.Dequeue ();
1237 return GetMessageResult
;
1241 internal override bool GetText(IntPtr handle
, out string text
) {
1242 throw new NotImplementedException ();
1245 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
) {
1246 Hwnd hwnd
= Hwnd
.ObjectFromHandle (handle
);
1247 Rectangle rect
= hwnd
.ClientRect
;
1252 height
= hwnd
.height
;
1254 client_width
= rect
.Width
;
1255 client_height
= rect
.Height
;
1258 internal override FormWindowState
GetWindowState(IntPtr hwnd
) {
1259 IntPtr window
= GetControlOwner (hwnd
);
1261 if (IsWindowCollapsed (window
))
1262 return FormWindowState
.Minimized
;
1263 if (IsWindowInStandardState (window
, IntPtr
.Zero
, IntPtr
.Zero
))
1264 return FormWindowState
.Maximized
;
1266 return FormWindowState
.Normal
;
1269 internal override void GrabInfo(out IntPtr handle
, out bool GrabConfined
, out Rectangle GrabArea
) {
1271 GrabConfined
= Grab
.Confined
;
1272 GrabArea
= Grab
.Area
;
1275 internal override void GrabWindow(IntPtr handle
, IntPtr confine_to_handle
) {
1276 GrabWindowHwnd
= Hwnd
.ObjectFromHandle (handle
);
1279 internal override void UngrabWindow(IntPtr hwnd
) {
1280 GrabWindowHwnd
= null;
1281 Grab
.Hwnd
= IntPtr
.Zero
;
1282 Grab
.Confined
= false;
1285 internal override void HandleException(Exception e
) {
1286 StackTrace st
= new StackTrace(e
);
1287 Console
.WriteLine("Exception '{0}'", e
.Message
+st
.ToString());
1288 Console
.WriteLine("{0}{1}", e
.Message
, st
.ToString());
1291 internal override void Invalidate (IntPtr handle
, Rectangle rc
, bool clear
) {
1292 Hwnd hwnd
= Hwnd
.ObjectFromHandle (handle
);
1294 if (hwnd
.visible
&& HIViewIsVisible (handle
)) {
1295 MSG msg
= new MSG ();
1296 msg
.hwnd
= hwnd
.Handle
;
1297 msg
.wParam
= IntPtr
.Zero
;
1298 msg
.lParam
= IntPtr
.Zero
;
1299 msg
.message
= Msg
.WM_PAINT
;
1300 MessageQueue
.Enqueue (msg
);
1301 // This is currently causing some graphics corruption
1302 //hwnd.AddInvalidArea (rc.X, rc.Y, rc.Width, rc.Height);
1303 hwnd
.AddInvalidArea (0, 0, hwnd
.ClientRect
.Width
, hwnd
.ClientRect
.Height
);
1304 hwnd
.expose_pending
= true;
1308 internal override void InvalidateNC (IntPtr handle
)
1313 internal override bool IsEnabled(IntPtr handle
) {
1314 return Hwnd
.ObjectFromHandle(handle
).Enabled
;
1317 internal override bool IsVisible(IntPtr handle
) {
1318 return Hwnd
.ObjectFromHandle(handle
).visible
;
1321 internal override void KillTimer(Timer timer
) {
1323 TimerList
.Remove(timer
);
1327 internal override void MenuToScreen(IntPtr handle
, ref int x
, ref int y
) {
1328 CGPoint pt
= new CGPoint ();
1329 Rect wBounds
= new Rect ();
1332 hwnd
= Hwnd
.ObjectFromHandle(handle
);
1337 GetWindowBounds (GetControlOwner (hwnd
.whole_window
), 32, ref wBounds
);
1338 HIViewConvertPoint (ref pt
, handle
, IntPtr
.Zero
);
1340 x
= (int)(pt
.x
+wBounds
.left
);
1341 y
= (int)(pt
.y
+wBounds
.top
);
1345 internal override void OverrideCursor(IntPtr cursor
) {
1346 throw new NotImplementedException ();
1349 internal override PaintEventArgs
PaintEventStart(IntPtr handle
, bool client
) {
1350 PaintEventArgs paint_event
;
1353 hwnd
= Hwnd
.ObjectFromHandle(handle
);
1355 if (Caret
.Visible
== 1) {
1356 Caret
.Paused
= true;
1360 Graphics dc
= Graphics
.FromHwnd (hwnd
.client_window
);
1361 paint_event
= new PaintEventArgs(dc
, hwnd
.Invalid
);
1363 hwnd
.expose_pending
= false;
1364 hwnd
.ClearInvalidArea();
1366 hwnd
.drawing_stack
.Push (dc
);
1371 internal override void PaintEventEnd(IntPtr handle
, bool client
) {
1374 hwnd
= Hwnd
.ObjectFromHandle(handle
);
1376 Graphics dc
= (Graphics
)hwnd
.drawing_stack
.Pop();
1380 if (Caret
.Visible
== 1) {
1382 Caret
.Paused
= false;
1386 internal override bool PeekMessage(Object queue_id
, ref MSG msg
, IntPtr hWnd
, int wFilterMin
, int wFilterMax
, uint flags
) {
1387 Console
.WriteLine("XplatUIOSX.PeekMessage");
1391 internal override bool PostMessage (IntPtr hwnd
, Msg message
, IntPtr wParam
, IntPtr lParam
) {
1392 MSG msg
= new MSG();
1394 msg
.message
= message
;
1395 msg
.wParam
= wParam
;
1396 msg
.lParam
= lParam
;
1397 MessageQueue
.Enqueue (msg
);
1402 internal override void PostQuitMessage(int exitCode
) {
1403 throw new NotImplementedException();
1407 internal override void RequestAdditionalWM_NCMessages(IntPtr hwnd
, bool hover
, bool leave
) {
1408 throw new NotImplementedException();
1412 internal override void RequestNCRecalc(IntPtr handle
) {
1413 throw new NotImplementedException();
1417 internal override void ResetMouseHover(IntPtr handle
) {
1418 throw new NotImplementedException();
1421 internal override void ScreenToClient(IntPtr handle
, ref int x
, ref int y
) {
1422 CGPoint pt
= new CGPoint ();
1423 Rect wBounds
= new Rect ();
1425 GetWindowBounds (GetControlOwner (handle
), 32, ref wBounds
);
1426 pt
.x
= (x
-wBounds
.left
);
1427 pt
.y
= (y
-wBounds
.top
);
1428 HIViewConvertPoint (ref pt
, IntPtr
.Zero
, handle
);
1435 internal override void ScreenToMenu(IntPtr handle
, ref int x
, ref int y
) {
1436 CGPoint pt
= new CGPoint ();
1437 Rect wBounds
= new Rect ();
1439 GetWindowBounds (GetControlOwner (handle
), 32, ref wBounds
);
1440 pt
.x
= (x
-wBounds
.left
);
1441 pt
.y
= (y
-wBounds
.top
);
1442 HIViewConvertPoint (ref pt
, IntPtr
.Zero
, handle
);
1448 internal override void ScrollWindow(IntPtr handle
, Rectangle area
, int XAmount
, int YAmount
, bool clear
) {
1449 //IntPtr rect = IntPtr.Zero;
1450 //HIRect vBounds = new HIRect ();
1452 Hwnd hwnd
= Hwnd
.ObjectFromHandle(handle
);
1455 if (hwnd.invalid != Rectangle.Empty) {
1456 // BIG FAT WARNING. This only works with how we use this function right now
1457 // where we basically still scroll the whole window, but work around areas
1458 // that are covered by our children
1460 hwnd.invalid.X += XAmount;
1461 hwnd.invalid.Y += YAmount;
1463 if (hwnd.invalid.X < 0) {
1464 hwnd.invalid.Width += hwnd.invalid.X;
1468 if (hwnd.invalid.Y < 0) {
1469 hwnd.invalid.Height += hwnd.invalid.Y;
1474 HIRect scrollrect
= new HIRect ();
1475 scrollrect
.origin
.x
= area
.X
;
1476 scrollrect
.origin
.y
= area
.Y
;
1477 scrollrect
.size
.width
= area
.Width
;
1478 scrollrect
.size
.height
= area
.Height
;
1479 HIViewScrollRect (hwnd
.Handle
, ref scrollrect
, (float)XAmount
, (float)-YAmount
);
1481 HIViewGetBounds (hwnd.client_window, ref vBounds);
1482 HIViewConvertRect (ref vBounds, hwnd.client_window, IntPtr.Zero);
1483 SetRect (ref rect, (short)(vBounds.origin.x+area.X), (short)(vBounds.origin.y-TitleBarHeight+area.Y), (short)(vBounds.origin.x+area.Width), (short)(vBounds.origin.y+area.Height-TitleBarHeight));
1484 ScrollRect (ref rect, (short)XAmount, (short)-YAmount, IntPtr.Zero);
1486 // Generate an expose for the area exposed by the horizontal scroll
1489 hwnd.AddInvalidArea (area.X, area.Y, XAmount, area.Height);
1490 } else if (XAmount < 0) {
1491 hwnd.AddInvalidArea (XAmount + area.X + area.Width, area.Y, -XAmount, area.Height);
1494 // Generate an expose for the area exposed by the vertical scroll
1496 hwnd.AddInvalidArea (area.X, area.Y, area.Width, YAmount);
1497 } else if (YAmount < 0) {
1498 hwnd.AddInvalidArea (area.X, YAmount + area.Y + area.Height, area.Width, -YAmount);
1501 UpdateWindow (handle);
1506 internal override void ScrollWindow(IntPtr hwnd
, int XAmount
, int YAmount
, bool clear
) {
1507 throw new NotImplementedException("");
1511 internal override void SendAsyncMethod (AsyncMethodData method
) {
1512 throw new NotImplementedException ();
1516 internal override IntPtr
SendMessage (IntPtr hwnd
, Msg message
, IntPtr wParam
, IntPtr lParam
) {
1517 throw new NotImplementedException ();
1520 internal override int SendInput(IntPtr hwnd
, Queue keys
) {
1525 internal override void SetCaretPos (IntPtr hwnd
, int x
, int y
) {
1526 if (Caret
.Hwnd
== hwnd
) {
1527 CGPoint cpt
= new CGPoint ();
1530 HIViewConvertPoint (ref cpt
, hwnd
, IntPtr
.Zero
);
1531 Caret
.Timer
.Stop ();
1533 Caret
.X
= (int)cpt
.x
;
1534 Caret
.Y
= (int)cpt
.y
-23;
1535 if (Caret
.Visible
== 1) {
1537 Caret
.Timer
.Start ();
1542 internal override void SetClipRegion(IntPtr hwnd
, Region region
) {
1543 throw new NotImplementedException();
1546 internal override void SetCursor(IntPtr window
, IntPtr cursor
) {
1547 SetThemeCursor ((uint) cursor
);
1550 internal override void SetCursorPos(IntPtr handle
, int x
, int y
) {
1551 CGDisplayMoveCursorToPoint (CGMainDisplayID (), new CGPoint (x
, y
));
1554 internal override void SetFocus(IntPtr handle
) {
1555 if (FocusWindow
!= IntPtr
.Zero
) {
1556 PostMessage(FocusWindow
, Msg
.WM_KILLFOCUS
, handle
, IntPtr
.Zero
);
1558 PostMessage(handle
, Msg
.WM_SETFOCUS
, FocusWindow
, IntPtr
.Zero
);
1559 FocusWindow
= handle
;
1563 internal override void SetIcon(IntPtr handle
, Icon icon
) {
1564 throw new NotImplementedException();
1568 internal override void SetModal(IntPtr handle
, bool Modal
) {
1569 IntPtr hWnd
= GetControlOwner (Hwnd
.ObjectFromHandle (handle
).WholeWindow
);
1571 BeginAppModalStateForWindow (hWnd
);
1573 EndAppModalStateForWindow (hWnd
);
1577 internal override IntPtr
SetParent(IntPtr handle
, IntPtr parent
) {
1578 Hwnd hwnd
= Hwnd
.ObjectFromHandle (handle
);
1580 hwnd
.parent
= Hwnd
.ObjectFromHandle (parent
);
1581 if (HIViewGetSuperview (hwnd
.whole_window
) != IntPtr
.Zero
) {
1582 CheckError (HIViewRemoveFromSuperview (hwnd
.whole_window
), "HIViewRemoveFromSuperview ()");
1584 CheckError (HIViewAddSubview (hwnd
.parent
.client_window
, hwnd
.whole_window
));
1585 CheckError (HIViewAddSubview (hwnd
.whole_window
, hwnd
.client_window
));
1586 HIViewPlaceInSuperviewAt (hwnd
.client_window
, hwnd
.ClientRect
.X
, hwnd
.ClientRect
.Y
);
1591 internal override void SetTimer (Timer timer
) {
1593 TimerList
.Add (timer
);
1597 internal override bool SetTopmost(IntPtr hWnd
, IntPtr hWndOwner
, bool Enabled
) {
1598 HIViewSetZOrder (hWnd
, 1, IntPtr
.Zero
);
1603 internal override bool SetVisible(IntPtr handle
, bool visible
, bool activate
) {
1604 Hwnd hwnd
= Hwnd
.ObjectFromHandle (handle
);
1605 object window
= WindowMapping
[hwnd
.Handle
];
1608 ShowWindow ((IntPtr
)window
);
1610 HideWindow ((IntPtr
)window
);
1612 HIViewSetVisible (hwnd
.whole_window
, visible
);
1613 HIViewSetVisible (hwnd
.client_window
, visible
);
1614 hwnd
.visible
= visible
;
1618 internal override void SetBorderStyle(IntPtr handle
, FormBorderStyle border_style
) {
1621 hwnd
= Hwnd
.ObjectFromHandle(handle
);
1622 hwnd
.border_style
= border_style
;
1624 // FIXME - do we need to trigger some resize?
1627 internal override void SetMenu(IntPtr handle
, Menu menu
) {
1630 hwnd
= Hwnd
.ObjectFromHandle(handle
);
1633 // FIXME - do we need to trigger some resize?
1636 internal override void SetWindowMinMax(IntPtr handle
, Rectangle maximized
, Size min
, Size max
) {
1637 throw new NotImplementedException();
1640 internal override void SetWindowPos(IntPtr handle
, int x
, int y
, int width
, int height
) {
1641 Hwnd hwnd
= Hwnd
.ObjectFromHandle (handle
);
1642 Rectangle client_rect
= Hwnd
.GetClientRectangle(hwnd
.border_style
, hwnd
.border_static
, hwnd
.menu
,
1643 hwnd
.title_style
, SystemInformation
.CaptionHeight
,
1644 SystemInformation
.ToolWindowCaptionHeight
, width
, height
);
1646 // Save a server roundtrip (and prevent a feedback loop)
1647 if ((hwnd
.x
== x
) && (hwnd
.y
== y
) && (hwnd
.width
== width
) && (hwnd
.height
== height
)) {
1652 if (WindowMapping
[hwnd
.Handle
] != null) {
1653 if (y
<= MenuBarHeight
+TitleBarHeight
) {
1654 y
+=MenuBarHeight
+TitleBarHeight
;
1656 IntPtr rect
= IntPtr
.Zero
;
1657 SetRect (ref rect
, (short)x
, (short)y
, (short)(x
+width
), (short)(y
+height
));
1658 CheckError (SetWindowBounds ((IntPtr
) WindowMapping
[hwnd
.Handle
], 33, ref rect
), "SetWindowBounds ()");
1659 HIRect r
= new HIRect (0, 0, width
, height
);
1660 CheckError (HIViewSetFrame (hwnd
.whole_window
, ref r
), "HIViewSetFrame ()");
1661 r
= new HIRect (client_rect
.X
, client_rect
.Y
, client_rect
.X
+client_rect
.Width
, client_rect
.Y
+client_rect
.Height
);
1662 CheckError (HIViewSetFrame (hwnd
.client_window
, ref r
), "HIViewSetFrame ()");
1664 HIRect r
= new HIRect (x
, y
, width
, height
);
1665 CheckError (HIViewSetFrame (hwnd
.whole_window
, ref r
), "HIViewSetFrame ()");
1666 r
= new HIRect (client_rect
.X
, client_rect
.Y
, client_rect
.X
+client_rect
.Width
, client_rect
.Y
+client_rect
.Height
);
1667 CheckError (HIViewSetFrame (hwnd
.client_window
, ref r
), "HIViewSetFrame ()");
1671 internal override void SetWindowState(IntPtr hwnd
, FormWindowState state
) {
1672 IntPtr window
= GetControlOwner (hwnd
);
1675 case FormWindowState
.Minimized
: {
1676 CollapseWindow (window
, true);
1679 case FormWindowState
.Normal
: {
1680 ZoomWindow (window
, 7, false);
1683 case FormWindowState
.Maximized
: {
1684 ZoomWindow (window
, 8, false);
1690 internal override void SetWindowStyle(IntPtr handle
, CreateParams cp
) {
1691 Hwnd hwnd
= Hwnd
.ObjectFromHandle (handle
);
1692 SetHwndStyles(hwnd
, cp
);
1694 if (WindowMapping
[hwnd
.Handle
] != null) {
1695 WindowAttributes attributes
= WindowAttributes
.kWindowCompositingAttribute
| WindowAttributes
.kWindowStandardHandlerAttribute
;
1696 if ((cp
.Style
& ((int)WindowStyles
.WS_MINIMIZEBOX
)) != 0) {
1697 attributes
|= WindowAttributes
.kWindowCollapseBoxAttribute
;
1699 if ((cp
.Style
& ((int)WindowStyles
.WS_MAXIMIZEBOX
)) != 0) {
1700 attributes
|= WindowAttributes
.kWindowResizableAttribute
| WindowAttributes
.kWindowHorizontalZoomAttribute
| WindowAttributes
.kWindowVerticalZoomAttribute
;
1702 if ((cp
.Style
& ((int)WindowStyles
.WS_SYSMENU
)) != 0) {
1703 attributes
|= WindowAttributes
.kWindowCloseBoxAttribute
;
1705 if ((cp
.ExStyle
& ((int)WindowExStyles
.WS_EX_TOOLWINDOW
)) != 0) {
1706 attributes
= WindowAttributes
.kWindowStandardHandlerAttribute
| WindowAttributes
.kWindowCompositingAttribute
;
1709 WindowAttributes outAttributes
= WindowAttributes
.kWindowNoAttributes
;
1710 GetWindowAttributes ((IntPtr
)WindowMapping
[hwnd
.Handle
], ref outAttributes
);
1711 ChangeWindowAttributes ((IntPtr
)WindowMapping
[hwnd
.Handle
], attributes
, outAttributes
);
1715 internal override void SetWindowTransparency(IntPtr handle
, double transparency
, Color key
) {
1718 internal override double GetWindowTransparency(IntPtr handle
)
1723 internal override TransparencySupport
SupportsTransparency() {
1724 return TransparencySupport
.None
;
1727 internal override bool SetZOrder(IntPtr handle
, IntPtr after_handle
, bool Top
, bool Bottom
) {
1728 Hwnd hwnd
= Hwnd
.ObjectFromHandle (handle
);
1731 HIViewSetZOrder (hwnd
.whole_window
, 2, IntPtr
.Zero
);
1733 } else if (!Bottom
) {
1734 Hwnd after_hwnd
= Hwnd
.ObjectFromHandle (after_handle
);
1735 HIViewSetZOrder (hwnd
.whole_window
, 2, after_hwnd
.whole_window
);
1737 HIViewSetZOrder (hwnd
.whole_window
, 1, IntPtr
.Zero
);
1743 internal override void ShowCursor(bool show
) {
1745 CGDisplayShowCursor (CGMainDisplayID ());
1747 CGDisplayHideCursor (CGMainDisplayID ());
1750 internal override object StartLoop(Thread thread
) {
1751 throw new NotImplementedException();
1755 internal override bool SystrayAdd(IntPtr hwnd
, string tip
, Icon icon
, out ToolTip tt
) {
1756 throw new NotImplementedException();
1760 internal override bool SystrayChange(IntPtr hwnd
, string tip
, Icon icon
, ref ToolTip tt
) {
1761 throw new NotImplementedException();
1765 internal override void SystrayRemove(IntPtr hwnd
, ref ToolTip tt
) {
1766 throw new NotImplementedException();
1769 internal override bool Text(IntPtr handle
, string text
) {
1770 Hwnd hwnd
= Hwnd
.ObjectFromHandle (handle
);
1771 if (WindowMapping
[hwnd
.Handle
] != null) {
1772 CheckError (SetWindowTitleWithCFString ((IntPtr
)(WindowMapping
[hwnd
.Handle
]), __CFStringMakeConstantString (text
)));
1774 CheckError (SetControlTitleWithCFString (hwnd
.whole_window
, __CFStringMakeConstantString (text
)));
1775 CheckError (SetControlTitleWithCFString (hwnd
.client_window
, __CFStringMakeConstantString (text
)));
1779 internal override void UpdateWindow(IntPtr handle
) {
1780 Hwnd hwnd
= Hwnd
.ObjectFromHandle (handle
);
1782 if (hwnd
.visible
&& HIViewIsVisible (handle
) && !hwnd
.expose_pending
) {
1783 MSG msg
= new MSG ();
1784 msg
.message
= Msg
.WM_PAINT
;
1785 msg
.hwnd
= hwnd
.Handle
;
1786 msg
.lParam
= IntPtr
.Zero
;
1787 msg
.wParam
= IntPtr
.Zero
;
1788 MessageQueue
.Enqueue (msg
);
1792 internal override bool TranslateMessage(ref MSG msg
) {
1794 Hwnd hwnd
= Hwnd
.ObjectFromHandle (msg
.hwnd
);
1796 switch (msg
.message
) {
1797 case Msg
.WM_MOUSEMOVE
: {
1799 if (GrabWindowHwnd
!= null) {
1800 if (GrabWindowHwnd
.Handle
!= hwnd
.Handle
) {
1804 if (MouseWindow
!= null) {
1805 if (MouseWindow
.Handle
!= hwnd
.Handle
) {
1806 PostMessage (MouseWindow
.Handle
, Msg
.WM_MOUSELEAVE
, IntPtr
.Zero
, IntPtr
.Zero
);
1807 PostMessage (hwnd
.Handle
, Msg
.WM_MOUSE_ENTER
, IntPtr
.Zero
, IntPtr
.Zero
);
1816 case Msg
.WM_SETFOCUS
: {
1822 // This is a hideous temporary keyboard hack to bind some keys
1823 if (msg
.message
>= Msg
.WM_KEYFIRST
&& msg
.message
<= Msg
.WM_KEYLAST
)
1826 if (msg
.message
!= Msg
.WM_KEYDOWN
&& msg
.message
!= Msg
.WM_SYSKEYDOWN
)
1829 if ((int)msg
.wParam
>= (int)'0' && (int)msg
.wParam
<= (int)'z') {
1831 message
= Msg
.WM_CHAR
;
1832 PostMessage (msg
.hwnd
, message
, msg
.wParam
, msg
.lParam
);
1837 internal override void DrawReversibleLine(Point start
, Point end
, Color backColor
) {
1838 throw new NotImplementedException();
1841 internal override void FillReversibleRectangle (Rectangle rectangle
, Color backColor
) {
1842 throw new NotImplementedException();
1845 internal override void DrawReversibleFrame (Rectangle rectangle
, Color backColor
, FrameStyle style
) {
1846 throw new NotImplementedException();
1849 internal override void DrawReversibleRectangle(IntPtr handle
, Rectangle rect
, int line_width
) {
1850 throw new NotImplementedException();
1854 internal override SizeF
GetAutoScaleSize(Font font
) {
1855 throw new NotImplementedException();
1858 internal override Point MousePosition
{
1860 return mouse_position
;
1865 #region System information
1866 internal override int KeyboardSpeed { get{ throw new NotImplementedException(); }
}
1867 internal override int KeyboardDelay { get{ throw new NotImplementedException(); }
}
1869 internal override int Caption { get{ throw new NotImplementedException(); }
}
1870 internal override Size CursorSize { get{ throw new NotImplementedException(); }
}
1871 internal override bool DragFullWindows { get{ throw new NotImplementedException(); }
}
1872 internal override Size DragSize { get{ throw new NotImplementedException(); }
}
1873 internal override Size FrameBorderSize { get{ throw new NotImplementedException(); }
}
1874 internal override Size IconSize { get{ throw new NotImplementedException(); }
}
1875 internal override Size MaxWindowTrackSize { get{ throw new NotImplementedException(); }
}
1876 internal override Size MinimizedWindowSize { get{ throw new NotImplementedException(); }
}
1877 internal override Size MinimizedWindowSpacingSize { get{ throw new NotImplementedException(); }
}
1878 internal override Size MinimumWindowSize { get{ throw new NotImplementedException(); }
}
1879 internal override Size MinWindowTrackSize { get{ throw new NotImplementedException(); }
}
1880 internal override Size SmallIconSize { get{ throw new NotImplementedException(); }
}
1881 internal override int MouseButtonCount { get{ throw new NotImplementedException(); }
}
1882 internal override bool MouseButtonsSwapped { get{ throw new NotImplementedException(); }
}
1883 internal override bool MouseWheelPresent { get{ throw new NotImplementedException(); }
}
1884 internal override Rectangle VirtualScreen { get{ throw new NotImplementedException(); }
}
1885 internal override Rectangle WorkingArea
{
1887 HIRect bounds
= CGDisplayBounds (CGMainDisplayID ());
1888 return new Rectangle ((int)bounds
.origin
.x
, (int)bounds
.origin
.y
, (int)bounds
.size
.width
, (int)bounds
.size
.height
);
1891 internal override bool ThemesEnabled
{
1893 return XplatUIOSX
.themes_enabled
;
1900 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1901 internal static extern int HIViewSetNeedsDisplayInRegion (IntPtr view
, IntPtr rgn
, bool needsDisplay
);
1902 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1903 internal static extern int HIViewGetSubviewHit (IntPtr contentView
, ref CGPoint point
, bool tval
, ref IntPtr outPtr
);
1904 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1905 internal static extern int HIViewGetViewForMouseEvent (IntPtr inView
, IntPtr inEvent
, ref IntPtr outView
);
1906 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1907 internal static extern int HIViewConvertPoint (ref CGPoint point
, IntPtr pView
, IntPtr cView
);
1908 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1909 internal static extern int HIViewChangeFeatures (IntPtr aView
, ulong bitsin
, ulong bitsout
);
1910 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1911 internal static extern int HIViewFindByID (IntPtr rootWnd
, HIViewID id
, ref IntPtr outPtr
);
1912 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1913 internal static extern IntPtr
HIViewGetRoot (IntPtr hWnd
);
1914 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1915 internal static extern int HIObjectCreate (IntPtr cfStr
, uint what
, ref IntPtr hwnd
);
1916 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1917 internal static extern int HIViewSetNeedsDisplay (IntPtr viewHnd
, bool update
);
1918 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1919 internal static extern int HIViewGetFrame (IntPtr viewHnd
, ref HIRect rect
);
1920 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1921 internal static extern int HIViewSetFrame (IntPtr viewHnd
, ref HIRect rect
);
1922 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1923 internal static extern int HIViewPlaceInSuperviewAt (IntPtr view
, float x
, float y
);
1924 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1925 internal static extern int HIViewAddSubview (IntPtr parentHnd
, IntPtr childHnd
);
1926 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1927 internal static extern IntPtr
HIViewGetNextView (IntPtr aView
);
1928 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1929 internal static extern IntPtr
HIViewGetPreviousView (IntPtr aView
);
1930 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1931 internal static extern IntPtr
HIViewGetFirstSubview (IntPtr aView
);
1932 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1933 internal static extern IntPtr
HIViewGetSuperview (IntPtr aView
);
1934 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1935 internal static extern int HIViewRemoveFromSuperview (IntPtr aView
);
1936 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1937 internal static extern int HIViewSetVisible (IntPtr vHnd
, bool visible
);
1938 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1939 internal static extern bool HIViewIsVisible (IntPtr vHnd
);
1940 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1941 internal static extern int HIViewGetBounds (IntPtr vHnd
, ref HIRect r
);
1942 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1943 internal static extern int HIViewScrollRect (IntPtr vHnd
, ref HIRect rect
, float x
, float y
);
1944 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1945 internal static extern int HIViewScrollRect (IntPtr vHnd
, IntPtr rect
, float x
, float y
);
1946 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1947 internal static extern int HIViewSetZOrder (IntPtr hWnd
, int cmd
, IntPtr oHnd
);
1948 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1949 internal static extern int HIViewSetBoundsOrigin (IntPtr vHnd
, float x
, float y
);
1950 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1951 internal static extern int HIViewConvertRect (ref HIRect r
, IntPtr a
, IntPtr b
);
1953 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1954 internal static extern void ScrollRect (ref IntPtr r
, short dh
, short dv
, IntPtr rgnHandle
);
1955 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1956 internal static extern void SetRect (ref IntPtr r
, short left
, short top
, short right
, short bottom
);
1958 //[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1959 //static extern int CreateEvent (IntPtr allocator, uint classid, uint kind, double when, uint attributes, ref IntPtr outEvent);
1960 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1961 static extern int InstallEventHandler (IntPtr window
, CarbonEventDelegate handlerProc
, uint numtypes
, EventTypeSpec
[] typeList
, IntPtr userData
, IntPtr handlerRef
);
1962 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1963 internal static extern IntPtr
GetControlOwner (IntPtr aView
);
1964 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1965 static extern int ActivateWindow (IntPtr windowHnd
, bool inActivate
);
1966 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1967 static extern bool IsWindowActive (IntPtr windowHnd
);
1968 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1969 static extern int SetKeyboardFocus (IntPtr windowHdn
, IntPtr cntrlHnd
, short partcode
);
1970 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1971 static extern int GetKeyboardFocus (IntPtr handle
, ref IntPtr cntrl
);
1973 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1974 internal static extern IntPtr
GetWindowEventTarget (IntPtr window
);
1975 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1976 internal static extern IntPtr
GetControlEventTarget (IntPtr aControl
);
1977 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1978 internal static extern IntPtr
GetEventDispatcherTarget ();
1979 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1980 internal static extern int SendEventToEventTarget (IntPtr evt
, IntPtr target
);
1981 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1982 internal static extern int ReleaseEvent (IntPtr evt
);
1983 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1984 internal static extern int ReceiveNextEvent (uint evtCount
, IntPtr evtTypes
, double timeout
, bool processEvt
, ref IntPtr evt
);
1985 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1986 static extern uint GetEventClass (IntPtr eventRef
);
1987 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1988 static extern uint GetEventKind (IntPtr eventRef
);
1989 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1990 static extern int GetEventParameter (IntPtr evt
, OSXConstants
.EventParamName inName
, OSXConstants
.EventParamType inType
, IntPtr outActualType
, uint bufSize
, IntPtr outActualSize
, ref byte outData
);
1991 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1992 static extern int GetEventParameter (IntPtr evt
, OSXConstants
.EventParamName inName
, OSXConstants
.EventParamType inType
, IntPtr outActualType
, uint bufSize
, IntPtr outActualSize
, ref IntPtr outData
);
1993 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1994 static extern int GetEventParameter (IntPtr evt
, OSXConstants
.EventParamName inName
, OSXConstants
.EventParamType inType
, IntPtr outActualType
, uint bufSize
, IntPtr outActualSize
, ref ushort outData
);
1995 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1996 static extern int GetEventParameter (IntPtr evt
, OSXConstants
.EventParamName inName
, OSXConstants
.EventParamType inType
, IntPtr outActualType
, uint bufSize
, IntPtr outActualSize
, ref short outData
);
1997 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
1998 static extern int GetEventParameter (IntPtr evt
, OSXConstants
.EventParamName inName
, OSXConstants
.EventParamType inType
, IntPtr outActualType
, uint bufSize
, IntPtr outActualSize
, ref QDPoint outData
);
1999 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2000 static extern int SetEventParameter (IntPtr evt
, OSXConstants
.EventParamName inName
, OSXConstants
.EventParamType inType
, uint bufSize
, ref short outData
);
2001 //[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2002 //static extern int SetEventParameter (IntPtr evt, OSXConstants.EventParamName inName, OSXConstants.EventParamType inType, uint bufSize, ref IntPtr outData);
2004 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2005 internal static extern void CGContextFlush (IntPtr cgc
);
2006 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2007 internal static extern int CGContextFillRect (IntPtr cgc
, HIRect r
);
2008 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2009 internal static extern CGAffineTransform
CGContextGetTextMatrix (IntPtr cgContext
);
2010 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2011 internal static extern int CGContextSetTextMatrix (IntPtr cgContext
, CGAffineTransform ctm
);
2012 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2013 internal static extern int CGContextSetRGBFillColor (IntPtr cgContext
, float r
, float g
, float b
, float alpha
);
2014 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2015 internal static extern int CGContextSetRGBStrokeColor (IntPtr cgContext
, float r
, float g
, float b
, float alpha
);
2016 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2017 internal static extern int CGContextSetTextDrawingMode (IntPtr cgContext
, int drawingMode
);
2018 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2019 internal static extern int CGContextSelectFont (IntPtr cgContext
, string fontName
, float size
, int textEncoding
);
2020 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2021 internal static extern int CGContextShowTextAtPoint (IntPtr cgContext
, float x
, float y
, string text
, int length
);
2022 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2023 internal static extern int CGContextClipToRect (IntPtr cgContext
, HIRect clip
);
2024 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2025 internal static extern void CreateCGContextForPort (IntPtr port
, ref IntPtr cgc
);
2026 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2027 internal static extern bool IsWindowCollapsed (IntPtr hWnd
);
2028 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2029 internal static extern bool IsWindowInStandardState (IntPtr hWnd
, IntPtr a
, IntPtr b
);
2030 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2031 internal static extern void CollapseWindow (IntPtr hWnd
, bool collapse
);
2032 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2033 internal static extern void ZoomWindow (IntPtr hWnd
, short partCode
, bool front
);
2034 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2035 internal static extern int GetWindowAttributes (IntPtr hWnd
, ref WindowAttributes outAttributes
);
2036 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2037 internal static extern int ChangeWindowAttributes (IntPtr hWnd
, WindowAttributes inAttributes
, WindowAttributes outAttributes
);
2038 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2039 internal static extern IntPtr
GetWindowPort (IntPtr hWnd
);
2040 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2041 static extern int SetPortWindowPort (IntPtr hWnd
);
2042 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2043 static extern int GetGlobalMouse (ref QDPoint outData
);
2044 //[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2045 //static extern int GlobalToLocal (ref QDPoint outData);
2046 //[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2047 //static extern int LocalToGlobal (ref QDPoint outData);
2048 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2049 static extern int TrackControl (IntPtr handle
, QDPoint point
, IntPtr data
);
2051 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2052 internal static extern int BeginAppModalStateForWindow (IntPtr window
);
2053 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2054 internal static extern int EndAppModalStateForWindow (IntPtr window
);
2055 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2056 internal static extern int CreateNewWindow (WindowClass klass
, WindowAttributes attributes
, ref IntPtr r
, ref IntPtr window
);
2057 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2058 internal static extern int DisposeWindow (IntPtr wHnd
);
2059 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2060 internal static extern int ShowWindow (IntPtr wHnd
);
2061 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2062 internal static extern int HideWindow (IntPtr wHnd
);
2063 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2064 internal static extern int SetWindowBounds (IntPtr wHnd
, uint reg
, ref IntPtr rect
);
2065 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2066 internal static extern int GetWindowPortBounds (IntPtr wHnd
, ref Rect rect
);
2067 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2068 internal static extern int GetWindowBounds (IntPtr wHnd
, uint reg
, ref Rect rect
);
2069 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2070 internal static extern int InvertRect (ref Rect r
);
2072 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2073 internal static extern int SetControlTitleWithCFString (IntPtr hWnd
, IntPtr titleCFStr
);
2074 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2075 internal static extern int SetWindowTitleWithCFString (IntPtr hWnd
, IntPtr titleCFStr
);
2076 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2077 internal static extern IntPtr
__CFStringMakeConstantString (string cString
);
2079 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2080 internal static extern void CGContextRestoreGState (IntPtr ctx
);
2081 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2082 internal static extern void CGContextSaveGState (IntPtr ctx
);
2083 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2084 internal static extern void CGContextTranslateCTM (IntPtr ctx
, double tx
, double ty
);
2085 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2086 internal static extern void CGContextScaleCTM (IntPtr ctx
, double tx
, double ty
);
2088 //[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2089 //static extern int SetWindowContentColor (IntPtr hWnd, ref RGBColor backColor);
2090 [DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2091 static extern int TrackMouseLocationWithOptions (IntPtr port
, int options
, double eventtimeout
, ref QDPoint point
, ref IntPtr modifier
, ref MouseTrackingResult status
);
2092 //[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2093 //static extern int CreateMouseTrackingRegion (IntPtr windowref, IntPtr rgn, IntPtr clip, int options, MouseTrackingRegionID rid, IntPtr refcon, IntPtr evttargetref, ref IntPtr mousetrackref);
2094 //[DllImport ("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2095 //static extern int ReleaseMouseTrackingRegion (IntPtr region_handle);
2097 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2098 internal static extern int CFRelease (IntPtr wHnd
);
2100 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2101 internal extern static IntPtr
NewRgn ();
2102 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2103 internal extern static void CopyRgn (IntPtr srcrgn
, IntPtr destrgn
);
2104 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2105 internal extern static void SetRectRgn (IntPtr rgn
, short left
, short top
, short right
, short bottom
);
2106 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2107 internal extern static void DisposeRgn (IntPtr rgn
);
2108 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2109 internal extern static void ExitToShell ();
2110 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2111 internal extern static short GetMBarHeight ();
2113 #region Cursor imports
2114 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2115 internal extern static HIRect
CGDisplayBounds (IntPtr displayID
);
2116 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2117 internal extern static IntPtr
CGMainDisplayID ();
2118 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2119 internal extern static void CGDisplayShowCursor (IntPtr display
);
2120 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2121 internal extern static void CGDisplayHideCursor (IntPtr display
);
2122 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2123 internal extern static void CGDisplayMoveCursorToPoint (IntPtr display
, CGPoint point
);
2124 [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
2125 internal extern static void SetThemeCursor (uint inCursor
);
2128 [DllImport ("gdiplus", EntryPoint
="GetFontMetrics")]
2129 internal extern static bool GetFontMetrics(IntPtr graphicsObject
, IntPtr nativeObject
, out int ascent
, out int descent
);