aboutsummaryrefslogtreecommitdiff
path: root/source/ShiftUI/Internal/WindowHandler.cs
diff options
context:
space:
mode:
Diffstat (limited to 'source/ShiftUI/Internal/WindowHandler.cs')
-rw-r--r--source/ShiftUI/Internal/WindowHandler.cs235
1 files changed, 235 insertions, 0 deletions
diff --git a/source/ShiftUI/Internal/WindowHandler.cs b/source/ShiftUI/Internal/WindowHandler.cs
new file mode 100644
index 0000000..cb59ca4
--- /dev/null
+++ b/source/ShiftUI/Internal/WindowHandler.cs
@@ -0,0 +1,235 @@
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// Copyright (c) 2007 Novell, Inc.
+//
+// Authors:
+// Geoff Norton <[email protected]>
+//
+//
+
+using System;
+using System.Drawing;
+using ShiftUI;
+using System.Runtime.InteropServices;
+
+namespace ShiftUI.CarbonInternal {
+ internal class WindowHandler : EventHandlerBase, IEventHandler {
+ internal const uint kEventWindowUpdate = 1;
+ internal const uint kEventWindowDrawContent = 2;
+ internal const uint kEventWindowActivated = 5;
+ internal const uint kEventWindowDeactivated = 6;
+ internal const uint kEventWindowGetClickActivation = 7;
+ internal const uint kEventWindowShowing = 22;
+ internal const uint kEventWindowHiding = 23;
+ internal const uint kEventWindowShown = 24;
+ internal const uint kEventWindowHidden = 25;
+ internal const uint kEventWindowCollapsing = 86;
+ internal const uint kEventWindowExpanding = 87;
+ internal const uint kEventWindowZoomed = 76;
+ internal const uint kEventWindowBoundsChanging = 26;
+ internal const uint kEventWindowBoundsChanged = 27;
+ internal const uint kEventWindowResizeStarted = 28;
+ internal const uint kEventWindowResizeCompleted = 29;
+ internal const uint kEventWindowDragStarted = 30;
+ internal const uint kEventWindowDragCompleted = 31;
+ internal const uint kEventWindowTransitionStarted = 88;
+ internal const uint kEventWindowTransitionCompleted = 89;
+ internal const uint kEventWindowClickDragRgn = 32;
+ internal const uint kEventWindowClickResizeRgn = 33;
+ internal const uint kEventWindowClickCollapseRgn = 34;
+ internal const uint kEventWindowClickCloseRgn = 35;
+ internal const uint kEventWindowClickZoomRgn = 36;
+ internal const uint kEventWindowClickContentRgn = 37;
+ internal const uint kEventWindowClickProxyIconRgn = 38;
+ internal const uint kEventWindowClickToolbarButtonRgn = 41;
+ internal const uint kEventWindowClickStructureRgn = 42;
+ internal const uint kEventWindowCursorChange = 40;
+ internal const uint kEventWindowCollapse = 66;
+ internal const uint kEventWindowCollapsed = 67;
+ internal const uint kEventWindowCollapseAll = 68;
+ internal const uint kEventWindowExpand = 69;
+ internal const uint kEventWindowExpanded = 70;
+ internal const uint kEventWindowExpandAll = 71;
+ internal const uint kEventWindowClose = 72;
+ internal const uint kEventWindowClosed = 73;
+ internal const uint kEventWindowCloseAll = 74;
+ internal const uint kEventWindowZoom = 75;
+ internal const uint kEventWindowZoomAll = 77;
+ internal const uint kEventWindowContextualMenuSelect = 78;
+ internal const uint kEventWindowPathSelect = 79;
+ internal const uint kEventWindowGetIdealSize = 80;
+ internal const uint kEventWindowGetMinimumSize = 81;
+ internal const uint kEventWindowGetMaximumSize = 82;
+ internal const uint kEventWindowConstrain = 83;
+ internal const uint kEventWindowHandleContentClick = 85;
+ internal const uint kEventWindowGetDockTileMenu = 90;
+ internal const uint kEventWindowHandleActivate = 91;
+ internal const uint kEventWindowHandleDeactivate = 92;
+ internal const uint kEventWindowProxyBeginDrag = 128;
+ internal const uint kEventWindowProxyEndDrag = 129;
+ internal const uint kEventWindowToolbarSwitchMode = 150;
+ internal const uint kEventWindowFocusAcquired = 200;
+ internal const uint kEventWindowFocusRelinquish = 201;
+ internal const uint kEventWindowFocusContent = 202;
+ internal const uint kEventWindowFocusToolbar = 203;
+ internal const uint kEventWindowDrawerOpening = 220;
+ internal const uint kEventWindowDrawerOpened = 221;
+ internal const uint kEventWindowDrawerClosing = 222;
+ internal const uint kEventWindowDrawerClosed = 223;
+ internal const uint kEventWindowDrawFrame = 1000;
+ internal const uint kEventWindowDrawPart = 1001;
+ internal const uint kEventWindowGetRegion = 1002;
+ internal const uint kEventWindowHitTest = 1003;
+ internal const uint kEventWindowInit = 1004;
+ internal const uint kEventWindowDispose = 1005;
+ internal const uint kEventWindowDragHilite = 1006;
+ internal const uint kEventWindowModified = 1007;
+ internal const uint kEventWindowSetupProxyDragImage = 1008;
+ internal const uint kEventWindowStateChanged = 1009;
+ internal const uint kEventWindowMeasureTitle = 1010;
+ internal const uint kEventWindowDrawGrowBox = 1011;
+ internal const uint kEventWindowGetGrowImageRegion = 1012;
+ internal const uint kEventWindowPaint = 1013;
+
+ internal WindowHandler (XplatUICarbon driver) : base (driver) {}
+
+ public bool ProcessEvent (IntPtr callref, IntPtr eventref, IntPtr handle, uint kind, ref MSG msg) {
+ IntPtr window = Driver.HandleToWindow (handle);
+ Hwnd hwnd = Hwnd.ObjectFromHandle (window);
+ if (window != IntPtr.Zero) {
+ switch (kind) {
+ case kEventWindowActivated: {
+ Widget c = Widget.FromHandle (hwnd.client_window);
+ if (c != null) {
+ Form form = c.FindForm ();
+ if (form != null && !form.IsDisposed) {
+ Driver.SendMessage (form.Handle, Msg.WM_ACTIVATE, (IntPtr) WindowActiveFlags.WA_ACTIVE, IntPtr.Zero);
+ XplatUICarbon.ActiveWindow = hwnd.client_window;
+ }
+ }
+
+ foreach (IntPtr utility_window in XplatUICarbon.UtilityWindows) {
+ if (utility_window != handle && !XplatUICarbon.IsWindowVisible (utility_window))
+ XplatUICarbon.ShowWindow (utility_window);
+ }
+ break;
+ }
+ case kEventWindowExpanding:
+ foreach (IntPtr utility_window in XplatUICarbon.UtilityWindows) {
+ if (utility_window != handle && !XplatUICarbon.IsWindowVisible (utility_window))
+ XplatUICarbon.ShowWindow (utility_window);
+ }
+ msg.hwnd = hwnd.Handle;
+ msg.message = Msg.WM_ENTERSIZEMOVE;
+ return true;
+ case kEventWindowExpanded:
+ NativeWindow.WndProc (hwnd.Handle, Msg.WM_WINDOWPOSCHANGED, IntPtr.Zero, IntPtr.Zero);
+ msg.hwnd = hwnd.Handle;
+ msg.message = Msg.WM_EXITSIZEMOVE;
+ return true;
+ case kEventWindowDeactivated: {
+ Widget c = Widget.FromHandle (hwnd.client_window);
+ if (c != null) {
+ Form form = c.FindForm ();
+ if (form != null && XplatUICarbon.UnactiveWindow != form.Handle) {
+ Driver.SendMessage (form.Handle, Msg.WM_ACTIVATE, (IntPtr) WindowActiveFlags.WA_INACTIVE, IntPtr.Zero);
+ XplatUICarbon.ActiveWindow = IntPtr.Zero;
+ }
+ }
+ foreach (IntPtr utility_window in XplatUICarbon.UtilityWindows) {
+ if (utility_window != handle && XplatUICarbon.IsWindowVisible (utility_window))
+ XplatUICarbon.HideWindow (utility_window);
+ }
+ break;
+ }
+ case kEventWindowCollapsing:
+ foreach (IntPtr utility_window in XplatUICarbon.UtilityWindows) {
+ if (utility_window != handle && XplatUICarbon.IsWindowVisible (utility_window))
+ XplatUICarbon.HideWindow (utility_window);
+ }
+ msg.hwnd = hwnd.Handle;
+ msg.message = Msg.WM_ENTERSIZEMOVE;
+ return true;
+ case kEventWindowCollapsed:
+ NativeWindow.WndProc (hwnd.Handle, Msg.WM_WINDOWPOSCHANGED, IntPtr.Zero, IntPtr.Zero);
+ msg.hwnd = hwnd.Handle;
+ msg.message = Msg.WM_EXITSIZEMOVE;
+ return true;
+ case kEventWindowClose:
+ NativeWindow.WndProc (hwnd.Handle, Msg.WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
+ return false;
+ case kEventWindowShown: {
+ msg.message = Msg.WM_SHOWWINDOW;
+ msg.lParam = (IntPtr) 1;
+ msg.wParam = (IntPtr) 0;
+ msg.hwnd = hwnd.Handle;
+
+ return true;
+ }
+ case kEventWindowResizeStarted: {
+ msg.message = Msg.WM_ENTERSIZEMOVE;
+ msg.hwnd = hwnd.Handle;
+ return true;
+ }
+ case kEventWindowResizeCompleted: {
+ msg.message = Msg.WM_EXITSIZEMOVE;
+ msg.hwnd = hwnd.Handle;
+
+ return true;
+ }
+ case kEventWindowBoundsChanged: {
+ Rect window_bounds = new Rect ();
+ HIRect view_bounds = new HIRect ();
+ Size size;
+
+ GetWindowBounds (handle, 33, ref window_bounds);
+
+ view_bounds.size.width = window_bounds.right - window_bounds.left;
+ view_bounds.size.height = window_bounds.bottom - window_bounds.top;
+
+ HIViewSetFrame (hwnd.WholeWindow, ref view_bounds);
+
+ size = XplatUICarbon.TranslateQuartzWindowSizeToWindowSize (Widget.FromHandle (hwnd.Handle).GetCreateParams (), (int)view_bounds.size.width, (int)view_bounds.size.height);
+
+ hwnd.X = (int) window_bounds.left;
+ hwnd.Y = (int) window_bounds.top;
+ hwnd.Width = (int) size.Width;
+ hwnd.Height = (int) size.Height;
+
+ Driver.PerformNCCalc (hwnd);
+
+ msg.hwnd = hwnd.Handle;
+ msg.message = Msg.WM_WINDOWPOSCHANGED;
+ Driver.SetCaretPos (XplatUICarbon.Caret.Hwnd, XplatUICarbon.Caret.X, XplatUICarbon.Caret.Y);
+
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
+ static extern int GetWindowBounds (IntPtr handle, uint region, ref Rect bounds);
+
+ [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
+ static extern int HIViewSetFrame (IntPtr handle, ref HIRect bounds);
+ }
+}