diff --git a/lib/libimhex/include/hex/api/imhex_api/system.hpp b/lib/libimhex/include/hex/api/imhex_api/system.hpp index f83dcbe20..038f0dc31 100644 --- a/lib/libimhex/include/hex/api/imhex_api/system.hpp +++ b/lib/libimhex/include/hex/api/imhex_api/system.hpp @@ -62,6 +62,7 @@ EXPORT_MODULE namespace hex { void setMainWindowSize(u32 width, u32 height); void setMainDockSpaceId(ImGuiID id); void setMainWindowHandle(GLFWwindow *window); + void setMainWindowFocusState(bool focused); void setGlobalScale(float scale); void setNativeScale(float scale); @@ -161,6 +162,12 @@ EXPORT_MODULE namespace hex { */ GLFWwindow* getMainWindowHandle(); + /** + * @brief Checks if the main window is currently focused + * @return Whether the main window is focused + */ + bool isMainWindowFocused(); + /** * @brief Checks if borderless window mode is enabled currently * @return Whether borderless window mode is enabled diff --git a/lib/libimhex/source/api/imhex_api.cpp b/lib/libimhex/source/api/imhex_api.cpp index 7bdbca409..cb83c49dc 100644 --- a/lib/libimhex/source/api/imhex_api.cpp +++ b/lib/libimhex/source/api/imhex_api.cpp @@ -538,6 +538,11 @@ namespace hex { s_mainWindowHandle = window; } + static bool s_mainWindowFocused = false; + void setMainWindowFocusState(bool focused) { + s_mainWindowFocused = focused; + } + static float s_globalScale = 1.0; void setGlobalScale(float scale) { @@ -708,6 +713,10 @@ namespace hex { return impl::s_mainWindowHandle; } + bool isMainWindowFocused() { + return impl::s_mainWindowFocused; + } + bool isBorderlessWindowModeEnabled() { return impl::s_borderlessWindowMode; } diff --git a/main/gui/source/window/window.cpp b/main/gui/source/window/window.cpp index 86f78b058..2946069cd 100644 --- a/main/gui/source/window/window.cpp +++ b/main/gui/source/window/window.cpp @@ -1166,7 +1166,10 @@ namespace hex { glfwSetCursorPosCallback(m_window, unlockFrameRate); glfwSetMouseButtonCallback(m_window, unlockFrameRate); glfwSetScrollCallback(m_window, unlockFrameRate); - glfwSetWindowFocusCallback(m_window, unlockFrameRate); + glfwSetWindowFocusCallback(m_window, [](GLFWwindow *window, int focused) { + unlockFrameRate(window); + ImHexApi::System::impl::setMainWindowFocusState(focused); + }); glfwSetWindowMaximizeCallback(m_window, [](GLFWwindow *window, int) { glfwShowWindow(window); diff --git a/plugins/builtin/source/content/events.cpp b/plugins/builtin/source/content/events.cpp index 76964fc09..61e2d9bc6 100644 --- a/plugins/builtin/source/content/events.cpp +++ b/plugins/builtin/source/content/events.cpp @@ -432,7 +432,8 @@ namespace hex::plugin::builtin { if (!taskFinishedNotificationEnabled) return; - if (!glfwGetWindowAttrib(ImHexApi::System::getMainWindowHandle(), GLFW_FOCUSED) && !task.isBackgroundTask()) + + if (!ImHexApi::System::isMainWindowFocused() && !task.isBackgroundTask()) hex::showToastMessage("ImHex", fmt::format("hex.builtin.os_toast_message.task_finished"_lang, Lang(task.getUnlocalizedName()))); });