コード例 #1
0
        public override bool Initialize(GameHost host)
        {
            if (!base.Initialize(host))
            {
                return(false);
            }

            if (!(host.Window is SDL2DesktopWindow desktopWindow))
            {
                return(false);
            }

            window = desktopWindow;

            isActive = window.IsActive.GetBoundCopy();
            isActive.BindValueChanged(_ => updateRelativeMode());

            cursorInWindow = host.Window.CursorInWindow.GetBoundCopy();
            cursorInWindow.BindValueChanged(_ => updateRelativeMode());

            cursorState = desktopWindow.CursorStateBindable.GetBoundCopy();
            cursorState.BindValueChanged(_ => updateRelativeMode());

            UseRelativeMode.BindValueChanged(_ =>
            {
                if (window != null)
                {
                    updateRelativeMode();
                }
            });

            Enabled.BindValueChanged(enabled =>
            {
                updateRelativeMode();

                if (enabled.NewValue)
                {
                    window.MouseMove         += HandleMouseMove;
                    window.MouseMoveRelative += HandleMouseMoveRelative;
                    window.MouseDown         += handleMouseDown;
                    window.MouseUp           += handleMouseUp;
                    window.MouseWheel        += handleMouseWheel;
                }
                else
                {
                    window.MouseMove         -= HandleMouseMove;
                    window.MouseMoveRelative -= HandleMouseMoveRelative;
                    window.MouseDown         -= handleMouseDown;
                    window.MouseUp           -= handleMouseUp;
                    window.MouseWheel        -= handleMouseWheel;
                }
            }, true);

            return(true);
        }
コード例 #2
0
        public override bool Initialize(GameHost host)
        {
            if (!base.Initialize(host))
            {
                return(false);
            }

            if (!(host.Window is AndroidGameWindow androidWindow))
            {
                return(false);
            }

            window = androidWindow;

            window.CursorStateChanged += updatePointerCapture;

            // it's possible that Android forcefully released capture if we were unfocused.
            // so we update here when we get focus again.
            View.FocusChange += (sender, args) =>
            {
                if (args.HasFocus)
                {
                    updatePointerCapture();
                }
            };

            UseRelativeMode.BindValueChanged(_ => updatePointerCapture());

            Enabled.BindValueChanged(enabled =>
            {
                if (enabled.NewValue)
                {
                    View.CapturedPointer += HandleCapturedPointer;
                    View.GenericMotion   += HandleGenericMotion;
                    View.Hover           += HandleHover;
                    View.KeyDown         += HandleKeyDown;
                    View.KeyUp           += HandleKeyUp;
                    View.Touch           += HandleTouch;
                }
                else
                {
                    View.CapturedPointer -= HandleCapturedPointer;
                    View.GenericMotion   -= HandleGenericMotion;
                    View.Hover           -= HandleHover;
                    View.KeyDown         -= HandleKeyDown;
                    View.KeyUp           -= HandleKeyUp;
                    View.Touch           -= HandleTouch;
                }

                updatePointerCapture();
            }, true);

            return(true);
        }
コード例 #3
0
        public override bool Initialize(GameHost host)
        {
            if (!base.Initialize(host))
            {
                return(false);
            }

            if (!(host.Window is SDL2DesktopWindow desktopWindow))
            {
                return(false);
            }

            window = desktopWindow;

            isActive = window.IsActive.GetBoundCopy();
            isActive.BindValueChanged(_ => updateRelativeMode());

            cursorInWindow = host.Window.CursorInWindow.GetBoundCopy();
            cursorInWindow.BindValueChanged(e =>
            {
                if (e.NewValue)
                {
                    // don't immediately update if the cursor has just entered the window
                    pendingUpdateRelativeMode = true;
                }
                else
                {
                    updateRelativeMode();
                }
            });

            cursorState = desktopWindow.CursorStateBindable.GetBoundCopy();
            cursorState.BindValueChanged(_ => updateRelativeMode());

            UseRelativeMode.BindValueChanged(_ =>
            {
                if (window != null)
                {
                    updateRelativeMode();
                }
            });

            Enabled.BindValueChanged(enabled =>
            {
                updateRelativeMode();

                if (enabled.NewValue)
                {
                    window.MouseMove         += HandleMouseMove;
                    window.MouseMoveRelative += HandleMouseMoveRelative;
                    window.MouseDown         += handleMouseDown;
                    window.MouseUp           += handleMouseUp;
                    window.MouseWheel        += handleMouseWheel;
                }
                else
                {
                    window.MouseMove         -= HandleMouseMove;
                    window.MouseMoveRelative -= HandleMouseMoveRelative;
                    window.MouseDown         -= handleMouseDown;
                    window.MouseUp           -= handleMouseUp;
                    window.MouseWheel        -= handleMouseWheel;
                }
            }, true);

            window.Exited += () =>
            {
                if (window.RelativeMouseMode && cursorCaptured)
                {
                    window.RelativeMouseMode = false;
                    transferLastPositionToHostCursor();
                }
            };

            return(true);
        }