From 0f1da1ba2ac3f54a1f9f5ba297b2aeb676354b19 Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Fri, 19 Feb 2021 22:10:03 +0100 Subject: [PATCH] Add window focused callback to Clyde (#1573) --- .../Graphics/Clyde/Clyde.Windowing.cs | 18 ++++++++++++++++++ Robust.Client/Graphics/Clyde/Clyde.cs | 4 +++- Robust.Client/Graphics/Clyde/ClydeHeadless.cs | 7 +++++++ Robust.Client/Graphics/ClydeBase.cs | 4 ++++ Robust.Client/Graphics/IClyde.cs | 4 ++++ .../Graphics/WindowFocusedEventArgs.cs | 14 ++++++++++++++ 6 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 Robust.Client/Graphics/WindowFocusedEventArgs.cs diff --git a/Robust.Client/Graphics/Clyde/Clyde.Windowing.cs b/Robust.Client/Graphics/Clyde/Clyde.Windowing.cs index ea7acd8dfc..eecc3b32de 100644 --- a/Robust.Client/Graphics/Clyde/Clyde.Windowing.cs +++ b/Robust.Client/Graphics/Clyde/Clyde.Windowing.cs @@ -55,6 +55,7 @@ namespace Robust.Client.Graphics.Clyde private GLFWCallbacks.WindowSizeCallback _windowSizeCallback = default!; private GLFWCallbacks.WindowContentScaleCallback _windowContentScaleCallback = default!; private GLFWCallbacks.WindowIconifyCallback _windowIconifyCallback = default!; + private GLFWCallbacks.WindowFocusCallback _windowFocusCallback = default!; private bool _glfwInitialized; @@ -62,6 +63,7 @@ namespace Robust.Client.Graphics.Clyde private Window* _glfwWindow; private Vector2i _framebufferSize; + private bool _isFocused; private Vector2i _windowSize; private Vector2i _prevWindowSize; private Vector2i _prevWindowPos; @@ -74,6 +76,7 @@ namespace Robust.Client.Graphics.Clyde // NOTE: in engine we pretend the framebuffer size is the screen size.. // For practical reasons like UI rendering. public override Vector2i ScreenSize => _framebufferSize; + public override bool IsFocused => _isFocused; public Vector2 DefaultWindowScale => _windowScale; public Vector2 MouseScreenPosition => _lastMousePos; @@ -231,6 +234,7 @@ namespace Robust.Client.Graphics.Clyde GLFW.SetMouseButtonCallback(_glfwWindow, _mouseButtonCallback); GLFW.SetWindowContentScaleCallback(_glfwWindow, _windowContentScaleCallback); GLFW.SetWindowIconifyCallback(_glfwWindow, _windowIconifyCallback); + GLFW.SetWindowFocusCallback(_glfwWindow, _windowFocusCallback); GLFW.MakeContextCurrent(_glfwWindow); @@ -548,6 +552,19 @@ namespace Robust.Client.Graphics.Clyde } } + private void OnGlfwWindowFocus(Window* window, bool focused) + { + try + { + _isFocused = focused; + OnWindowFocused?.Invoke(new WindowFocusedEventArgs(focused)); + } + catch (Exception e) + { + CatchCallbackException(e); + } + } + private void StoreCallbacks() { _errorCallback = OnGlfwError; @@ -560,6 +577,7 @@ namespace Robust.Client.Graphics.Clyde _windowSizeCallback = OnGlfwWindowSize; _windowContentScaleCallback = OnGlfwWindownContentScale; _windowIconifyCallback = OnGlfwWindowIconify; + _windowFocusCallback = OnGlfwWindowFocus; } public override void SetWindowTitle(string title) diff --git a/Robust.Client/Graphics/Clyde/Clyde.cs b/Robust.Client/Graphics/Clyde/Clyde.cs index fccbd05bd3..8f011cd3f0 100644 --- a/Robust.Client/Graphics/Clyde/Clyde.cs +++ b/Robust.Client/Graphics/Clyde/Clyde.cs @@ -88,7 +88,7 @@ namespace Robust.Client.Graphics.Clyde public override bool Initialize() { base.Initialize(); - + _configurationManager.OnValueChanged(CVars.DisplayOGLCheckErrors, b => _checkGLErrors = b, true); if (!InitWindowing()) @@ -152,6 +152,8 @@ namespace Robust.Client.Graphics.Clyde public override event Action? OnWindowResized; + public override event Action? OnWindowFocused; + public void Screenshot(ScreenshotType type, Action> callback) { _queuedScreenshots.Add((type, callback)); diff --git a/Robust.Client/Graphics/Clyde/ClydeHeadless.cs b/Robust.Client/Graphics/Clyde/ClydeHeadless.cs index d0ac322884..14a7cefd8a 100644 --- a/Robust.Client/Graphics/Clyde/ClydeHeadless.cs +++ b/Robust.Client/Graphics/Clyde/ClydeHeadless.cs @@ -21,6 +21,7 @@ namespace Robust.Client.Graphics.Clyde public IRenderWindow MainWindowRenderTarget { get; } public override Vector2i ScreenSize { get; } = (1280, 720); public Vector2 DefaultWindowScale => (1, 1); + public override bool IsFocused => true; public ShaderInstance InstanceShader(ClydeHandle handle) { @@ -79,6 +80,12 @@ namespace Robust.Client.Graphics.Clyde remove { } } + public override event Action OnWindowFocused + { + add { } + remove { } + } + public void Render() { // Nada. diff --git a/Robust.Client/Graphics/ClydeBase.cs b/Robust.Client/Graphics/ClydeBase.cs index a8ddb0e2e7..849f524f4d 100644 --- a/Robust.Client/Graphics/ClydeBase.cs +++ b/Robust.Client/Graphics/ClydeBase.cs @@ -25,6 +25,8 @@ namespace Robust.Client.Graphics protected bool VSync { get; private set; } = true; public abstract Vector2i ScreenSize { get; } + public abstract bool IsFocused { get; } + public abstract void SetWindowTitle(string title); public virtual bool Initialize() @@ -45,6 +47,8 @@ namespace Robust.Client.Graphics public abstract event Action OnWindowResized; + public abstract event Action OnWindowFocused; + protected virtual void ReadConfig() { WindowMode = (WindowMode) _configurationManager.GetCVar(CVars.DisplayWindowMode); diff --git a/Robust.Client/Graphics/IClyde.cs b/Robust.Client/Graphics/IClyde.cs index 389bb15255..e2afdcd2db 100644 --- a/Robust.Client/Graphics/IClyde.cs +++ b/Robust.Client/Graphics/IClyde.cs @@ -13,6 +13,8 @@ namespace Robust.Client.Graphics Vector2i ScreenSize { get; } + bool IsFocused { get; } + /// /// The default scale ratio for window contents, given to us by the OS. /// @@ -27,6 +29,8 @@ namespace Robust.Client.Graphics event Action OnWindowResized; + event Action OnWindowFocused; + Texture LoadTextureFromPNGStream(Stream stream, string? name = null, TextureLoadParameters? loadParams = null); diff --git a/Robust.Client/Graphics/WindowFocusedEventArgs.cs b/Robust.Client/Graphics/WindowFocusedEventArgs.cs new file mode 100644 index 0000000000..506f308e09 --- /dev/null +++ b/Robust.Client/Graphics/WindowFocusedEventArgs.cs @@ -0,0 +1,14 @@ +using System; + +namespace Robust.Client.Graphics +{ + public class WindowFocusedEventArgs : EventArgs + { + public WindowFocusedEventArgs(bool focused) + { + Focused = focused; + } + + public bool Focused { get; } + } +}