-
-
Notifications
You must be signed in to change notification settings - Fork 10.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
IsItemDeactivated() doesn't trigger if the item gets deactivated by stealing the window focus #5904
Comments
Thank you for the useful repro. |
I stumbled upon this issue again (still happens in 1.89.8 WIP) and did a little more digging. Doesn't look like a simple bug anymore, more like an unfortunate side effect of the implementation. What happened for me was:
I found a workaround that fixes the problem for me. I just set a flag to defer focus stealing until right after the next call to This workaround will not work for #5184 though. For that, a proper solution would most likely have to memorize all items that were active during a frame, not just the last one active at the end of it. And then on the new frame mark all of them as having been deactivated if they are no longer active. |
Here's code to showcase how they are all the same thing: {
ImGui::Begin("Deactivate Test Bed");
ImGui::ButtonEx("Right click (1)", ImVec2(0, 0), ImGuiButtonFlags_MouseButtonRight);
ImGui::Text("F1 to ClearActiveID()");
ImGui::Text("F2 to SetWindowFocus(NULL)");
ImGui::Text("F3 to Open Modal");
if (ImGui::Shortcut(ImGuiKey_F1, ImGuiInputFlags_RouteGlobal))
ImGui::ClearActiveID();
if (ImGui::Shortcut(ImGuiKey_F2, ImGuiInputFlags_RouteGlobal))
ImGui::SetWindowFocus(NULL);
if (ImGui::Shortcut(ImGuiKey_F3, ImGuiInputFlags_RouteGlobal))
ImGui::OpenPopup("Modal 1");
if (ImGui::BeginPopupModal("Modal 1"))
{
ImGui::Text("Interrupted!");
if (ImGui::Shortcut(ImGuiKey_Escape))
ImGui::CloseCurrentPopup();
ImGui::EndPopup();
}
static char buf[128];
ImGui::InputText("Input", buf, 128);
bool is_item_activated = ImGui::IsItemActivated();
bool is_item_deactivated = ImGui::IsItemDeactivated();
bool is_item_deactivated_after_edit = ImGui::IsItemDeactivatedAfterEdit();
if (is_item_deactivated)
IMGUI_DEBUG_LOG("IsItemDeactivated()\n");
if (is_item_deactivated_after_edit)
IMGUI_DEBUG_LOG("IsItemDeactivatedAfterEdit()\n");
ImGui::ButtonEx("Right click (2)", ImVec2(0, 0), ImGuiButtonFlags_MouseButtonRight);
ImGui::Text("F5 to ClearActiveID()");
ImGui::Text("F6 to SetWindowFocus(NULL)");
ImGui::Text("F7 to Open Modal");
if (ImGui::Shortcut(ImGuiKey_F5, ImGuiInputFlags_RouteGlobal))
ImGui::ClearActiveID();
if (ImGui::Shortcut(ImGuiKey_F6, ImGuiInputFlags_RouteGlobal))
ImGui::SetWindowFocus(NULL);
if (ImGui::Shortcut(ImGuiKey_F7, ImGuiInputFlags_RouteGlobal))
ImGui::OpenPopup("Modal 2");
if (ImGui::BeginPopupModal("Modal 2"))
{
ImGui::Text("Interrupted!");
if (ImGui::Shortcut(ImGuiKey_Escape))
ImGui::CloseCurrentPopup();
ImGui::EndPopup();
}
ImGui::End();
} |
I have a possible solution for everything but will need to be testing further, and it doesn't seem wise to push it before the week-end, but I hope to maybe push it on Monday. There are also some issues with groups (even in existing code). |
This should now be fixed by a604d4f |
Version/Branch of Dear ImGui:
Version: 1.89.1 WIP
Branch: docking (tested in docking, but issue should be in master branch)
Back-end/Renderer/Compiler/OS
Back-ends: imgui_impl_dx11.cpp + imgui_impl_win32.cpp
Compiler: Visual Studio 2019
Operating System: Windows 10 Pro
Those probably have nothing to do with the issue.
My Issue/Question:
In an asset viewer and editor, I need to take away focus from ImGui when I right-click into the viewport (I need keys for camera controls). When I do that by calling
ImGui::SetWindowFocus( nullptr )
, the currently active item gets deactivated (as expected), but in a way that preventsImGui::IsItemDeactivated()
from working. I useImGui::IsItemDeactivatedAfterEdit()
for the undo stack, but this one breaks because it usesIsItemDeactivated()
.Standalone, minimal, complete and verifiable example:
The text was updated successfully, but these errors were encountered: