diff --git a/lib/libimhex/include/hex/ui/view.hpp b/lib/libimhex/include/hex/ui/view.hpp index d373c60a4..f413b6458 100644 --- a/lib/libimhex/include/hex/ui/view.hpp +++ b/lib/libimhex/include/hex/ui/view.hpp @@ -145,7 +145,6 @@ namespace hex { * @brief A view that draws a regular window. This should be the default for most views */ class View::Window : public View { - ImGuiWindow *m_focusedSubWindow; public: explicit Window(UnlocalizedString unlocalizedName, const char *icon) : View(std::move(unlocalizedName), icon), m_focusedSubWindow(nullptr) {} @@ -159,6 +158,12 @@ namespace hex { virtual bool allowScroll() const { return false; } + + private: + void handleFocusRestoration(); + + private: + ImGuiWindow *m_focusedSubWindow; }; /** diff --git a/lib/libimhex/source/ui/view.cpp b/lib/libimhex/source/ui/view.cpp index 325bb0b31..4144caa3f 100644 --- a/lib/libimhex/source/ui/view.cpp +++ b/lib/libimhex/source/ui/view.cpp @@ -10,6 +10,7 @@ #include #include +#include namespace hex { @@ -117,44 +118,43 @@ namespace hex { return s_lastFocusedView; } + void View::Window::handleFocusRestoration() { + const auto title = fmt::format("{} {}", this->getIcon(), View::toWindowName(this->getUnlocalizedName())); - void View::Window::draw(ImGuiWindowFlags extraFlags) { - if (this->shouldDraw()) { - const auto title = fmt::format("{} {}", this->getIcon(), View::toWindowName(this->getUnlocalizedName())); + const ImGuiContext& g = *ImGui::GetCurrentContext(); + bool foundTopFocused = false; + ImGuiWindow *imguiFocusedWindow = nullptr; + ImGuiWindow *focusedSubWindow = nullptr; - const ImGuiContext& g = *ImGui::GetCurrentContext(); - bool foundTopFocused = false; - ImGuiWindow *imguiFocusedWindow = nullptr; - ImGuiWindow *focusedSubWindow = nullptr; - - if (g.NavWindow != nullptr) { - imguiFocusedWindow = g.NavWindow; + if (g.NavWindow != nullptr) { + imguiFocusedWindow = g.NavWindow; + foundTopFocused = true; + } + for (auto focusedWindow: g.WindowsFocusOrder | std::views::reverse) { + if (focusedWindow == nullptr || !focusedWindow->WasActive) + continue; + std::string focusedWindowName = focusedWindow->Name; + if (!foundTopFocused) { + imguiFocusedWindow = focusedWindow; foundTopFocused = true; } - for (auto focusedWindow: g.WindowsFocusOrder | std::views::reverse) { - if (focusedWindow == nullptr || !focusedWindow->WasActive) - continue; - std::string focusedWindowName = focusedWindow->Name; - if (!foundTopFocused) { - imguiFocusedWindow = focusedWindow; - foundTopFocused = true; - } - if (imguiFocusedWindow == nullptr || !focusedWindowName.contains("###hex.builtin.view.")) - continue; - if (auto focusedChild = focusedWindow->NavLastChildNavWindow; focusedChild != nullptr) - focusedSubWindow = focusedChild; - else if (focusedWindow == focusedWindow->RootWindow) - focusedSubWindow = focusedWindow; + if (imguiFocusedWindow == nullptr || !focusedWindowName.contains("###hex.builtin.view.")) + continue; + if (auto focusedChild = focusedWindow->NavLastChildNavWindow; focusedChild != nullptr) + focusedSubWindow = focusedChild; + else if (focusedWindow == focusedWindow->RootWindow) + focusedSubWindow = focusedWindow; - break; - } + break; + } - std::string imguiFocusedWindowName = "NULL"; - if (imguiFocusedWindow != nullptr) - imguiFocusedWindowName.assign(imguiFocusedWindow->Name); + std::string imguiFocusedWindowName = "NULL"; + if (imguiFocusedWindow != nullptr) + imguiFocusedWindowName.assign(imguiFocusedWindow->Name); - std::string focusedSubWindowName; - if (focusedSubWindow != nullptr || m_focusedSubWindow != nullptr) { + std::string focusedSubWindowName; + if (focusedSubWindow != nullptr || m_focusedSubWindow != nullptr) { + if (glfwGetWindowAttrib(ImHexApi::System::getMainWindowHandle(), GLFW_FOCUSED)) { focusedSubWindowName = focusedSubWindow != nullptr ? focusedSubWindow->Name : m_focusedSubWindow->Name; if (focusedSubWindow != nullptr && m_focusedSubWindow != nullptr) { std::string_view windowName = m_focusedSubWindow->Name; @@ -182,6 +182,15 @@ namespace hex { } } } + } + } + + + void View::Window::draw(ImGuiWindowFlags extraFlags) { + if (this->shouldDraw()) { + const auto title = fmt::format("{} {}", this->getIcon(), View::toWindowName(this->getUnlocalizedName())); + + handleFocusRestoration(); if (!allowScroll()) extraFlags |= ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse; @@ -239,4 +248,4 @@ namespace hex { } -} \ No newline at end of file +} diff --git a/main/gui/source/window/window.cpp b/main/gui/source/window/window.cpp index 0d3e9655e..70ae15383 100644 --- a/main/gui/source/window/window.cpp +++ b/main/gui/source/window/window.cpp @@ -420,7 +420,7 @@ namespace hex { ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0F); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); - ImGuiWindowFlags windowFlags = ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoNavFocus | ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse; + ImGuiWindowFlags windowFlags = ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse; if (!m_emergencyPopupOpen) windowFlags |= ImGuiWindowFlags_MenuBar; diff --git a/plugins/builtin/source/content/window_decoration.cpp b/plugins/builtin/source/content/window_decoration.cpp index 682a680ef..fedf114b2 100644 --- a/plugins/builtin/source/content/window_decoration.cpp +++ b/plugins/builtin/source/content/window_decoration.cpp @@ -495,15 +495,10 @@ namespace hex::plugin::builtin { ON_SCOPE_EXIT { ImGui::PopStyleVar(); }; #endif - if (ImGui::BeginMainMenuBar()) { - drawTitleBarBackDrop(); - ImGui::Dummy({}); - ImGui::EndMainMenuBar(); - } - auto window = ImHexApi::System::getMainWindowHandle(); menu::enableNativeMenuBar(s_useNativeMenuBar); if (menu::beginMainMenuBar()) { + drawTitleBarBackDrop(); if (ImHexApi::System::isBorderlessWindowModeEnabled()) { #if defined(OS_WINDOWS) ImGui::SetCursorPosX(5_scaled); @@ -637,7 +632,7 @@ namespace hex::plugin::builtin { s_logoTexture = ImGuiExt::Texture::fromImage(romfs::get("assets/common/icon.png").span(), ImGuiExt::Texture::Filter::Linear); }; - constexpr static ImGuiWindowFlags windowFlags = ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoNavFocus | ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse; + constexpr static ImGuiWindowFlags windowFlags = ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse; ImGuiViewport *viewport = ImGui::GetMainViewport(); ImGui::SetNextWindowPos(viewport->WorkPos);