From 8b72ea81c0848de8d2c263a5066865f2632b080d Mon Sep 17 00:00:00 2001 From: WerWolv Date: Sat, 16 Aug 2025 16:47:23 +0200 Subject: [PATCH] fix: More window focus event issues --- main/gui/source/window/window.cpp | 26 +++++++++++++++++------ plugins/builtin/source/content/events.cpp | 18 ---------------- 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/main/gui/source/window/window.cpp b/main/gui/source/window/window.cpp index d02bac8d3..6c0578bc6 100644 --- a/main/gui/source/window/window.cpp +++ b/main/gui/source/window/window.cpp @@ -380,6 +380,26 @@ namespace hex { ImHexApi::Fonts::getDefaultFont().push(); io.FontDefault = ImHexApi::Fonts::getDefaultFont(); + { + static bool lastAnyWindowFocused = false; + bool anyWindowFocused = glfwGetWindowAttrib(m_window, GLFW_FOCUSED); + + if (!anyWindowFocused) { + const auto platformIo = ImGui::GetPlatformIO(); + for (auto *viewport : platformIo.Viewports) { + if (platformIo.Platform_GetWindowFocus(viewport)) { + anyWindowFocused = true; + break; + } + } + } + + if (lastAnyWindowFocused != anyWindowFocused) + EventWindowFocused::post(anyWindowFocused); + + lastAnyWindowFocused = anyWindowFocused; + } + // Start new ImGui Frame ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplGlfw_NewFrame(); @@ -397,12 +417,6 @@ namespace hex { EventFrameBegin::post(); - static bool lastFocusLost = io.AppFocusLost; - if (io.AppFocusLost != lastFocusLost) { - EventWindowFocused::post(!io.AppFocusLost); - } - lastFocusLost = io.AppFocusLost; - // Handle all undocked floating windows ImGuiViewport *viewport = ImGui::GetMainViewport(); ImGui::SetNextWindowPos(viewport->WorkPos); diff --git a/plugins/builtin/source/content/events.cpp b/plugins/builtin/source/content/events.cpp index 2f4f75c16..7f068bdcf 100644 --- a/plugins/builtin/source/content/events.cpp +++ b/plugins/builtin/source/content/events.cpp @@ -357,24 +357,6 @@ namespace hex::plugin::builtin { if (ctx == nullptr) return; - // Close any open non-modal popups when ImHex loses focus - // Disable this in debug mode though to allow for easier debugging - #if !defined(DEBUG) - if (ImGui::IsPopupOpen("", ImGuiPopupFlags_AnyPopup)) { - for (const auto& popup : ctx->OpenPopupStack) { - if (popup.Window == nullptr) - continue; - - if (!(popup.Window->Flags & ImGuiWindowFlags_Modal)) { - ctx->OpenPopupStack.erase_unsorted(&popup); - log::debug("Closing popup '{}' because the main window lost focus", popup.Window->Name ? popup.Window->Name : "Unknown Popup"); - break; - } - } - return; - } - #endif - if (ImGui::IsAnyItemHovered()) return;