コード例 #1
0
        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;
        }
コード例 #2
0
ファイル: Window.Mac.cs プロジェクト: kutselabskii/Citrus
        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;
                }
            };
        }