From d40fed5ce2bc806a91245adb18039634eac13ed0 Mon Sep 17 00:00:00 2001 From: MichaelTheShifter Date: Wed, 20 Jul 2016 09:40:36 -0400 Subject: Move ShiftUI source code to ShiftOS This'll be a lot easier to work on. --- source/ShiftUI/Internal/WindowHandler.cs | 235 +++++++++++++++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 source/ShiftUI/Internal/WindowHandler.cs (limited to 'source/ShiftUI/Internal/WindowHandler.cs') 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 +// +// + +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); + } +} -- cgit v1.2.3