You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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 prevents ImGui::IsItemDeactivated() from working. I use ImGui::IsItemDeactivatedAfterEdit() for the undo stack, but this one breaks because it uses IsItemDeactivated().
Standalone, minimal, complete and verifiable example:
staticbool g_DeactivationTestRequestStealFocus = false;
// call before ImGui::NewFrame() or after ImGui::Render()voidDeactivationTestUpdate()
{
if ( g_DeactivationTestRequestStealFocus )
{
ImGui::SetWindowFocus( nullptr );
g_DeactivationTestRequestStealFocus = false;
}
}
// call between ImGui::NewFrame() and ImGui::Render()voidDeactivationTestGui()
{
if ( ImGui::Begin( "Deactivation Test" ) )
{
staticfloat value = 0.0f;
staticint countDeactivated = 0;
staticint countDeactivatedAfterEdit = 0;
ImGui::DragFloat( "Value", &value );
// these ones don't work if the focus has been stolenif ( ImGui::IsItemDeactivated() )
countDeactivated++;
if ( ImGui::IsItemDeactivatedAfterEdit() )
countDeactivatedAfterEdit++;
// displaying countersif ( ImGui::BeginTable( "counters", 2 ) )
{
ImGui::TableNextRow();
ImGui::TableSetColumnIndex( 0 ); ImGui::TextUnformatted( "Deactivated:" );
ImGui::TableSetColumnIndex( 1 ); ImGui::Text( "%d", countDeactivated );
ImGui::TableNextRow();
ImGui::TableSetColumnIndex( 0 ); ImGui::TextUnformatted( "Deactivated after Edit:" );
ImGui::TableSetColumnIndex( 1 ); ImGui::Text( "%d", countDeactivatedAfterEdit );
ImGui::EndTable();
}
ImGui::Separator();
// interactive text to facilitate focus-stealingImGui::Text(
"Ctrl-click or double-click the \"Value\" item above,\n""then edit it and right-click this text to remove focus.\n""The counters will not be increased as desired." );
if ( ImGui::IsItemHovered() && ImGui::IsKeyPressed( ImGuiKey_MouseRight ) )
g_DeactivationTestRequestStealFocus = true;
}
ImGui::End();
}
The text was updated successfully, but these errors were encountered:
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:
item is being edited
right click into the viewport steals focus, sets active id to 0
new frame gets started, copies current active id (now 0) into last frames active id
ImGui::IsItemDeactivated() fails because the item (or rather the context) forgot it was active during the last frame
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 ImGui::NewFrame(). Than the last active id is still valid and deactivation queries work as expected.
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.
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: