You've already forked linux-packaging-mono
							
							
		
			
				
	
	
		
			236 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			236 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| // 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  <gnorton@novell.com>
 | |
| //
 | |
| //
 | |
| 
 | |
| using System;
 | |
| using System.Drawing;
 | |
| using System.Windows.Forms;
 | |
| using System.Runtime.InteropServices;
 | |
| 
 | |
| namespace System.Windows.Forms.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: {
 | |
| 						Control c = Control.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: {
 | |
| 						Control c = Control.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 (Control.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);
 | |
| 	}
 | |
| }
 |