private void CreateNativeWindow(WindowOptions options) { var rect = new CGRect(0, 0, options.ClientSize.X, options.ClientSize.Y); View = new NSGameView(Input, rect, Platform.GraphicsMode.Default); NSWindowStyle style; if (options.Style == WindowStyle.Borderless) { style = NSWindowStyle.Borderless; } else if (options.Style == WindowStyle.Dialog) { style = NSWindowStyle.Titled; } else { style = NSWindowStyle.Titled | NSWindowStyle.Closable | NSWindowStyle.Miniaturizable; } if (!options.FixedSize) { style |= NSWindowStyle.Resizable; } window = new NSWindow(rect, style, NSBackingStore.Buffered, false); var contentRect = window.ContentRectFor(rect); titleBarHeight = ((RectangleF)rect).Height - (float)contentRect.Height; if (options.MinimumDecoratedSize != Vector2.Zero) { MinimumDecoratedSize = options.MinimumDecoratedSize; } if (options.MaximumDecoratedSize != Vector2.Zero) { MaximumDecoratedSize = options.MaximumDecoratedSize; } window.Title = options.Title; window.WindowShouldClose += OnShouldClose; window.WillClose += OnWillClose; window.DidResize += (s, e) => { View.UpdateGLContext(); HandleResize(s, e); }; window.WillEnterFullScreen += (sender, e) => { shouldFixFullscreen = !window.StyleMask.HasFlag(NSWindowStyle.Resizable); if (shouldFixFullscreen) { window.StyleMask |= NSWindowStyle.Resizable; } windowedClientSize = ClientSize; }; window.WillExitFullScreen += (sender, e) => { ClientSize = windowedClientSize; }; window.DidExitFullScreen += (sender, e) => { if (shouldFixFullscreen) { window.StyleMask &= ~NSWindowStyle.Resizable; } }; window.DidBecomeKey += (sender, e) => { RaiseActivated(); }; window.DidResignKey += (sender, e) => { Input.ClearKeyState(); RaiseDeactivated(); }; #if MAC window.DidMove += HandleMove; #else window.DidMoved += HandleMove; #endif window.CollectionBehavior = NSWindowCollectionBehavior.FullScreenPrimary; window.ContentView = View; window.ReleasedWhenClosed = true; View.Update += Update; View.RenderFrame += HandleRenderFrame; View.FilesDropped += RaiseFilesDropped; }
private void CreateNativeWindow(WindowOptions options) { var rect = new CGRect(0, 0, options.ClientSize.X, options.ClientSize.Y); View = new NSGameView(Application.Input, rect, Platform.GraphicsMode.Default); NSWindowStyle style; if (options.Style == WindowStyle.Borderless) { style = NSWindowStyle.Borderless; } else if (options.Style == WindowStyle.Dialog) { style = NSWindowStyle.Titled | NSWindowStyle.Closable; } else { style = NSWindowStyle.Titled | NSWindowStyle.Closable | NSWindowStyle.Miniaturizable; } if (!options.FixedSize) { style |= NSWindowStyle.Resizable; } window = new NSWindow(rect, style, NSBackingStore.Buffered, false); window.TabbingMode = (NSWindowTabbingMode)options.MacWindowTabbingMode; if (options.Style == WindowStyle.Dialog) { window.StandardWindowButton(NSWindowButton.MiniaturizeButton).Hidden = true; window.StandardWindowButton(NSWindowButton.ZoomButton).Hidden = true; } var contentRect = window.ContentRectFor(rect); titleBarHeight = ((RectangleF)rect).Height - (float)contentRect.Height; if (options.MinimumDecoratedSize != Vector2.Zero) { MinimumDecoratedSize = options.MinimumDecoratedSize; } if (options.MaximumDecoratedSize != Vector2.Zero) { MaximumDecoratedSize = options.MaximumDecoratedSize; } window.Title = options.Title; window.WindowShouldClose += OnShouldClose; window.WillClose += OnWillClose; window.DidResize += (s, e) => { needUpdateGLContext = true; HandleResize(s, e); }; window.WillEnterFullScreen += (sender, e) => { shouldFixFullscreen = !window.StyleMask.HasFlag(NSWindowStyle.Resizable); if (shouldFixFullscreen) { window.StyleMask |= NSWindowStyle.Resizable; } windowedClientSize = ClientSize; }; window.WillExitFullScreen += (sender, e) => { ClientSize = windowedClientSize; }; window.DidExitFullScreen += (sender, e) => { if (shouldFixFullscreen) { window.StyleMask &= ~NSWindowStyle.Resizable; } }; window.DidBecomeKey += (sender, e) => { RaiseActivated(); }; window.DidResignKey += (sender, e) => { // Clearing key state on deactivate is required so no keys will get stuck. // If, for some reason, you need to transfer key state between windows use InputSimulator to hack it. See docking implementation in Tangerine. Input.ClearKeyState(); RaiseDeactivated(); }; window.DidMove += HandleMove; NSNotificationCenter.DefaultCenter.AddObserver(NSWindow.WillStartLiveResizeNotification, OnWillStartLiveResize); NSNotificationCenter.DefaultCenter.AddObserver(NSWindow.DidEndLiveResizeNotification, OnDidEndLiveResize); window.CollectionBehavior = NSWindowCollectionBehavior.FullScreenPrimary; window.ContentView = View; View.Update += Update; View.RenderFrame += HandleRenderFrame; View.FilesDropped += RaiseFilesDropped; View.DidMouseEnter += () => { Application.WindowUnderMouse = this; }; View.DidMouseExit += () => { if (Application.WindowUnderMouse == this) { Application.WindowUnderMouse = null; } }; }