Skip to content
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

SDL2 backend multi-viewport window dragging doesn't track fast mouse movements #5012

Closed
seanmiddleditch opened this issue Feb 12, 2022 · 28 comments

Comments

@seanmiddleditch
Copy link
Contributor

Version/Branch of Dear ImGui:

Docking branch commit 1e14cc5 (very latest at time of writing), no local code changes

Version: 1.87 (18701)
Branch: docking

Back-end/Renderer/Compiler/OS

Back-ends: imgui_impl_sdl.cpp
Compiler: cl 19.31.31103 (VS 2022, 17.1.0 Preview 3.0)
Operating System: Windows 11

My Issue:

Using the sdl2 backend on the docking branch (e.g. with either example_sdl_directx11 or example_sdl_opengl3 projects):

Grab a window titlebar and start dragging/moving it.

Move the mouse fast enough so that it leaves the bounds of the window. This is easiest to do by quickly snapping the mouse upward if you're dragging by the titlebar.

The window ceases being dragging/moved after the mouse leaves the window bounds.

This appears to repro for only the sdl examples, not the win32 examples; i.e. I don't see this issue with example_win32_directx11.

Screenshots/Video

imgui-sdl-bug

Standalone, minimal, complete and verifiable example:

Build and run the example_sdl_directx11 example, the issue repros out of the box.

@seanmiddleditch
Copy link
Contributor Author

seanmiddleditch commented Feb 12, 2022

Ignore the below - I'm seeing it repro even on 0647ba3, it just seems... more difficult to repro? Might be entirely subjective.

Testing my project (requires docking branch), the issue appears to have begun sometime between these two merges from master:

8567a4cc <-- broken

0647ba3 <-- correct

Looks like the "meat" of the input queue and mouse events landed in the docking branch from that commit range, so that's probably not terribly surprising. :)

seanmiddleditch added a commit to potatoengine/potato that referenced this issue Feb 12, 2022
We don't update all the way to 1.87 due to a bug with mouse input, the SDL backend, and the docking branch:

ocornut/imgui#5012
seanmiddleditch added a commit to potatoengine/potato that referenced this issue Feb 12, 2022
We don't update all the way to 1.87 due to a bug with mouse input, the SDL backend, and the docking branch:

ocornut/imgui#5012
seanmiddleditch added a commit to potatoengine/potato that referenced this issue Feb 13, 2022
* Update imgui to 1.87-WIP

We don't update all the way to 1.87 due to a bug with mouse input, the SDL backend, and the docking branch:

ocornut/imgui#5012

* Silence a (hopefull) false warning in GCC for imgui sdl backend
@ocornut
Copy link
Owner

ocornut commented Feb 15, 2022

I could not repro. I am on a source distrib of SDL ~2.0.17 for Windows.
Which SDL version are you on?
Might be worth updating if you are on a old version, just in case.

Otherwise I guess we would need to find what's interfering for you :/
To investigate further:

  • Open Demo>Inputs>Mouse State and try to find out what's wrong from dear imgui's point of view: it is the mouse position that is clamped? mouse buttons that are released?
  • In Metrics->Internal State how does the MouseViewport values behave when that happen?

@seanmiddleditch
Copy link
Contributor Author

I'm using the prebuilt 2.0.16 package from libsdl.org. I'll try an upgrade and get the extra diag info posted here soon(-ish).

@JustQu
Copy link

JustQu commented Feb 16, 2022

I have the same problem. Also resizing on top of another viewport causes twitching
animation
.

@ocornut
Copy link
Owner

ocornut commented Feb 16, 2022

@JustQu Does it also happens for you on the stock unmodified example?

@JustQu
Copy link

JustQu commented Feb 16, 2022

@ocornut yes, just builded sdl_opengl3 example and still the behavior is the same.

@ocornut
Copy link
Owner

ocornut commented Feb 16, 2022

Does 1.86 give you same result ?

@JustQu
Copy link

JustQu commented Feb 16, 2022

1.86 works fine, window moving and resizing

@seanmiddleditch
Copy link
Contributor Author

seanmiddleditch commented Feb 17, 2022

(see comment below: maybe not actually fixed by upgrading after all)

I verified that updating to SDL 2.0.20 (using the prebuilt VC downloads at http://libsdl.org/download-2.0.php) resolves the issue for me, both in my app and in the imgui example binaries.

Happy to just call this an SDL bug and close this issue on my end (assuming @JustQu's issue is also resolved by updating).

@ocornut
Copy link
Owner

ocornut commented Feb 17, 2022

Thanks, that's good to know.

This is not ideal/great I'll still probably want to investigate a little bit with SDL 2.0.16 if we can find a workaround to minimize the issue, and at minimum we'll add commentas about it.

@seanmiddleditch
Copy link
Contributor Author

Yeah, also, maybe hold up on that confirmation. I can't get it to repro in the example app, and the repro steps in my app are different but I can still get it to happen. Trying to figure out exactly what the repro steps are, then seeing if I can reproduce in the example app. Either way I'll try to get that diagnostic information you asked for.

@seanmiddleditch
Copy link
Contributor Author

Short version of what I'm seeing now is that dragging docked windows out of the "main window" does not exhibit the behavior.

However, if I grab an undocked windows (with its own viewport) it does exhibit the behavior. Same if I grab a docked window out of a non-main viewport: the issue manifests. For example, with the demo window (which does not begin docked) I always exhibit the behavior, in my app.

Those repro steps are being very consistent for me in my app. Haven't been able to reproduce in example app yet, though. I'm using the stock imgui SDL and directx backends without any (intentional) trickery, but I am setting some non-default flags and window classes, so it may be influenced by one of those. I'll try to narrow it down or find the right steps to repro in example app.

@ocornut
Copy link
Owner

ocornut commented Feb 18, 2022

There are various factors involved:

The SDL backend now enable io.BackendFlags |= ImGuiBackendFlags_HasMouseHoveredViewport
As I displayed the value of io.MouseHoveredViewport:

ImGui::Text("MouseHoveredViewport: 0x%08X", io.MouseHoveredViewport);`) 

it became clear that SDL Backend reports a "flickering" value when moving near the edge of a window. I am pretty sure that commenting the line setting ImGuiBackendFlags_HasMouseHoveredViewport in the backend would essentially "fix" the issue by reverting to the old behavior of letting dear imgui guess the hovered viewport based on its knowledge of where viewports area. So we can probably revert to it.

When dragging a viewport it is temporarily set to _NoInputs for the purpose of retrieving the window "under" (for e.g. docking).
Since the SDL backend doesn't honor this flag, when that viewport is reported Dear ImGui automaticaly also reverts to guessing the hovered viewport.

Almost certainly, on the setup where this is broken, if you click and drag from near the edge of a viewport you are more likely to hit the bug as on a given moving frame you will more often stray outside the last viewport boundaries).

@ocornut
Copy link
Owner

ocornut commented Feb 18, 2022

@rokups seems to repro it too:

so far i could only notice extra AddMouseViewportEvent(0) event in cases where window fails to continue moving after detachment on a rapid mouse flick. it seems like mouse cursor may end up outside of viewport window for a brief moment and that stops drag operation.

I can't get AddMouseViewportEvent(0) here.

Logs would be useful to tell if that zero comes from a _LEAVE event or else.
In addition I don't understand what "stops" the dragging because once moving the MouseViewport gets locked to MovingWindow->Viewport. Can you put a break-point on the three occurrences of g.MovingWindow = NULL (other than constructor) to tell. Most likely it happens in UpdateMouseMovingWindowNewFrame(), it is because MouseDown[0] == false or because io.MousePos is invalid?

Here are a few debug lines to add in imgui_impl_sdl.cpp:

#include "imgui_internal.h"
            if (window_event == SDL_WINDOWEVENT_ENTER)
            {
                if (io.KeyCtrl)
                {
                    ImGuiViewportP* viewport = (ImGuiViewportP*)ImGui::FindViewportByPlatformHandle((void*)SDL_GetWindowFromID(event->window.windowID));
                    IMGUI_DEBUG_LOG("SDL_WINDOWEVENT_ENTER windowID=0x%08X viewport=0x%08X (%s)\n",
                        event->window.windowID, viewport ? viewport->ID : 0, viewport && viewport->Window ? viewport->Window->Name : "");
                }
                bd->MouseWindowID = event->window.windowID;
            }
            if (window_event == SDL_WINDOWEVENT_LEAVE)
            {
                if (io.KeyCtrl)
                {
                    ImGuiViewportP* viewport = (ImGuiViewportP*)ImGui::FindViewportByPlatformHandle((void*)SDL_GetWindowFromID(event->window.windowID));
                    IMGUI_DEBUG_LOG("SDL_WINDOWEVENT_LEAVE windowID=0x%08X viewport=0x%08X (%s)\n",
                        event->window.windowID, viewport ? viewport->ID : 0, viewport && viewport->Window ? viewport->Window->Name : "");
                }
                bd->MouseWindowID = 0;
                io.AddMousePosEvent(-FLT_MAX, -FLT_MAX);
            }
        if (io.KeyCtrl)
        {
            IMGUI_DEBUG_LOG("AddMouseViewportEvent viewport=0x%08X\n", mouse_viewport_id);
        }
        io.AddMouseViewportEvent(mouse_viewport_id);

@ocornut
Copy link
Owner

ocornut commented Feb 18, 2022

I think this may be the same as GLFW #4984 and same workaround 732bc20 could work.

I guess you are getting a SDL_WINDOWEVENT>SDL_WINDOWEVENT_LEAVE event without a SDL_MOUSEMOTION leaving MousePos invalid for one-frame which drops the moving.

If you can confirm that I think we can come up with a workaround.

@rokups
Copy link
Contributor

rokups commented Feb 19, 2022

732bc20 does indeed fix this issue 👍🏻

@ocornut
Copy link
Owner

ocornut commented Feb 19, 2022 via email

@rokups
Copy link
Contributor

rokups commented Feb 19, 2022

Here: docking...rokups:rk/fix-5012
Fix is a little bit more involved. That jumpy window when dragged issue i mentioned... I had to use a global mouse coordinates in SDL_MOUSEMOTION to fix jumpyness. And only with that change i can no longer reproduce current issue.

@seanmiddleditch
Copy link
Contributor Author

Verified that @rokups fix-5012 branch resolves all the cases I can think of to test locally. Dragging undocked windows, docking/undocking, dragging windows after undocking, etc. all are behaving correctly for me now.

@seanmiddleditch
Copy link
Contributor Author

Also saw that he has a newer rk/fix-5012-again -- tested that, it also solves this locally for me.

@ocornut
Copy link
Owner

ocornut commented Feb 25, 2022

@seanmiddleditch
Does it works for you with this?
75d9296

This should be a rewording on Rokas's top-most commit (same logic but more explicit)
(Without the earlier commits which are related to another issue seemingly pertaining to X11)

@seanmiddleditch
Copy link
Contributor Author

@ocornut - it does indeed

@ocornut
Copy link
Owner

ocornut commented Feb 28, 2022

Merged f337378
Thanks everyone for your help!
The other (unrelated) fix for stuttering cursor on SDL+X11 will be pushed separately.

@ocornut ocornut closed this as completed Feb 28, 2022
@ocornut ocornut added the bug label Mar 22, 2022
ocornut added a commit that referenced this issue Mar 22, 2022
…ially broken. (#5012, #5082)

master got c5f6721 which is combining f337378 and this commit.
ocornut pushed a commit that referenced this issue Mar 22, 2022
…tems. (v2 for master, using bd->MouseButtonsDown == 0) (#5012, #5082)

# Conflicts:
#	backends/imgui_impl_sdl.cpp
#	docs/CHANGELOG.txt
@ocornut
Copy link
Owner

ocornut commented Mar 22, 2022

Note how #5082 revealed another issue.
Pushed 9b0c26b to fix in docking, also pushed c5f6721 in master which is == f337378 + 9b0c26b

@RT2Code
Copy link

RT2Code commented Jun 22, 2022

Hello, does this bug still happens for you with the latest SDL2 version? I can't reproduce it on my end with SDL 2.0.22.

I pushed a fix some months ago about a related issue (libsdl-org/SDL#4832), and many more mouse related fixes were added to the SDL since then. I'd like to know if the SDL_CaptureMouse function is finally working as intended or if it still need to be fixed.

DnA-IntRicate added a commit to DnA-IntRicate/imgui that referenced this issue Oct 7, 2022
* Docking: added comments. added experimental TabItemFlagsOverrideSet to ImGuiWindowClass.

(Could probably do something similar with TabBarFlagsOverrideSet+Clear for ocornut#2700 later.)

* Docking: docked window honor tab and text colors by storing them. (ocornut#2771)

Later to lead into ocornut#2700 and ocornut#2539
Move tab submission block above in DockNodeUpdateTabBar(), not strictly necessary for this change as is, but useful if needing to apply override for TitleBg* as we'd need a value for node->VisibleWindow earlier than currently set.

* Fixed some compile warnings with Clang on Windows (ocornut#3754)

* Viewports, Backends: Vulkan: handle VK_ERROR_OUT_OF_DATE_KHR when resizing secondary viewport (ocornut#3766, ocornut#3758)

Cannot repro here but appears to a user on Linux. Fix may be not super solid.

* Docking: on node split, update memorized DockId for currently closed windows (ocornut#3716)

Amended by @ocornut with same fix in DockBuilderRemoveNodeChildNodes().

* Docking: fix gap in hit test hold when using ImGuiDockNodeFlags_PassthruCentralNode touching the edge of a viewport. (ocornut#3733)

* Viewports: (breaking) removed ImGuiPlatformIO::MainViewport which is now pretty much unused and duplicate (and misleading as we will evolve the concept)

Use GetMainViewport() if stuck.

* Viewports: Moved in own section of imgui.h ahead of merging a small part of viewport interface to master.

* Viewports: trying to treat GetMainViewport() as const. Reducing unnecessary casts of ImGuiViewportP*

Metrics: readded root Drawlists node in metrics to match master.
The (void*) casts are implying const-casst but currently left GetMainViewport() as returning non-const.

* Viewports: (Breaking) turned GetWorkPos(), GetWorkSize() into straight fields -> WorkPos, WorkSize before exposing in master branch.

* Fix for compiling imgui_internal.h without operators + made GetWorkRect() consistent with clamped WorkSize.

* Misc tweaks - mostly toward minimizing diff in upcoming backport merge of a few viewport structures in master

* Viewports: Fix issue inferring viewport z-order when new popups gets created. (ocornut#3734) + Metrics updates.

Revert 6bc5266
Showing inferred order and missing flags in metrics.

* Viewports: Setting the new (currently dummy) flags on viewports. (ocornut#3789, ocornut#1542, ocornut#3680, ocornut#3350, ocornut#3012, ocornut#2471)

Amend the merging of f14042c (merge ee59d7a)

* Remove redundant GetMainViewport decl in imgui.h (ocornut#3801, ocornut#3800)

* Docking: Made close button enable logic consistent on dockspace. When no docked window have a close button or it is disabled on the node, the space is given to tabs.

Clarified close_button_is_visible vs close_button_is_enabled behavior in DockNodeUpdateTabBar().. (ocornut#3633, ocornut#3521)
Reduced alpha of disabled close button a little bit further.
Removed 'EnableCloseButton' which was actually unused (can't be infered early, need ->VisibleWindow anyway, which is not == ->ActiveWindow)

* Examples: DX9-DX11: Removed half-assed DPI awareness enable. Updated Docking/Viewports part of Changelog (e.g. removed bits that are now already in master, clarified some added bits)

* Viewports: Fix setting of ImGuiViewportFlags_NoRendererClear. (ocornut#3213)

* Internals: Add a way to request window to not process any interactions for specified number of frames.

* Added missing IMGUI_API to internal docking-related structs. (ocornut#3850)

* Internals: Docking: some renaming.

* Internals: rename RootWindow->RootWindowDockTree, RootWindowDockStop->RootWindow.

Why?  So by default RootWindow matches user expectation on both branches, and RootWindowDockTree is more intentful.
(Actually should reduce diff between master<>docking)

* Viewports, Backend: SDL: Fix missing ImGuiBackendFlags_HasSetMousePos flag in docking branch (ok in master), GLFW: Fix application of WantSetMousePos. (ocornut#1542, ocornut#787)

Shows how little this feature is used with nav (was designed for small devices and frankly may be dropped) - but the backend support itself we will make use of for other features.

* Viewports, Internals: added GetViewportPlatformMonitor() will a safety net to keep code portable + simplified handling of disconnected monitor in Begin().

* ImDrawFlags: rework/revert c2d6d26 + 39432bf in a way that is closer to old version and back to opt-in but with default 0 = all corners.

* Removed deprecated flag stopping compilation (ocornut#3902)

* Docking: Dockspace() never draws a background. (ocornut#3924)

* Docking: undocking nodes/windows covering most of the monitor max their size down to 90% to ease further manipulations.

Kind of a welcome hack.

* Docking: Add support for split_outer in DockContextCalcDropPosForDocking().
Misc: Add FIXME regarding behavior of some window fields.

* Viewports, Backends: Vulkan: Rebuild swapchain on VK_SUBOPTIMAL_KHR. (ocornut#3881)

* BeginMainMenuBar(): remove expectation that we don't know menu bar height ahead, allowing up to generalize placement in any direction (will be done in master)

Amend 75de34e

* Viewports: Hotfix for crash in monitor array access, caused by 4b9bc49. (ocornut#3967)

* TabBar: Use mouse position instead of hardcoded +1/-1 offset when reordering tabs.

Fixes tab reordering in test engine when using fast mode.

# Conflicts:
#	imgui_widgets.cpp

* TabBar: Amend previous commit. Fix tab reordering when tab bar has scrolling.

Some tidying up with helpers + honor 16-bit offsets as with other tab bar features (unlikely single reorder can reach that but consistent)

* Backends, Viewports: GLFW: Add a workaround for stuck keys after closing a GLFW window (ocornut#3837).

* Docking: DockSpace() returns its node ID + adding branch changelog.

* Docking: fix undocking from tab-bar by moving mouse horizontally, broken by d705192.

* Docking: removed io.ConfigDockingWithShift option. (ocornut#2109)

* Docking: fix undocking from tab-bar by moving mouse horizontally, amend 3ed07a8 + d705192.

Automation system may drag e.g. right-most tab far left (and vice-versa) and one frame and our current logic would fail at it.

* Fix popup positioning, broken by 84e6fe4. (ocornut#3991, ocornut#3982)

* Docking: Fixed restoring of tab order within a dockspace or a split node.

(tests in "docking_tab_order")

* Docking: Fixed multiple simultaneously reappearing window from appearing undocked in their initial frame.

* Docking: Fixed reappearing docked windows with no close button showing a tab with extraneous space for one frame.

* Docking: move NavWindow to SelectedTabId application lower to leave a chance for in-between code to alter focus. + store per-node window menu button id to simplify usage.

* Docking: Fix window menu button. Broken by 3f16a52 (ocornut#4043)

Worked on single-frame click.

* Changelog: added docking+entries from 1.72 to 1.82 to increase their visibility.

* Backends: Vulkan: Fix for using IMGUI_IMPL_VULKAN_NO_PROTOTYPES (ocornut#4151, ocornut#3759, ocornut#3227)

* Docking: Docking node tab bar honors ItemInnerSpacing.x before first tab. Tweak rendering and alignment of dock node menu marker. (ocornut#4130)

+ Fix ~0 in EndFrameDrawDimmedBackgrounds() which is obsolete way of signifying "all round corners".

* Docking: Fix IsWindowAppearing() and ImGuiCond_Appearing on docked windows. (ocornut#4177, ocornut#3982, ocornut#1497, ocornut#1061)

* Docking: Amend 91704b7, window->DockXXX booleans not properly cleared when window not docked. (ocornut#4177, ocornut#3982, ocornut#1497, ocornut#1061)

Fix issue with freshly split windows/nodes incorrectly returning true to IsWindowAppearing().

* Docking: Fix IsWindowAppearing() unnecessarily returning true twice in a row. (ocornut#4177, ocornut#3982, ocornut#1497, ocornut#1061) + added a zealous assert.

* Docking: Clicking on the right-most close button of a docking node closes all windows. (ocornut#4186)

* Docking: comments (ocornut#4189)

* Added PushDisabled(), PopDisabled() currently only exposed in imgui_internal.h (ocornut#211)

* ImVector: added clear_delete(), clear_destruct() helpers.

# Conflicts:
#	imgui.cpp

* Nav, Drag and Drop, Docking: fixed two issues leading nav result to conflict with moving a window. (ocornut#4211, ocornut#3025)

* Backends, Viewports: Vulkan: Fix the use of the incorrect fence in wait for fence. (ocornut#4208)

The fence being waited upon was not the one associated with the current frame.
This results in validation error detecting a reset of command buffers still in use and resetting fences while still in use.
Read more details in ocornut#4208

* Metrics: Tentative fix for bad printf format.

Ref b53b8f5, a7a1b3b

* Viewport: extracted code out of Begin() into WindowSyncOwnedViewport() - no other change

* Viewports: Fix popup/tooltip created without a parent window from being given a ParentViewportId value of the implicit/fallback window. (ocornut#4236, ocornut#2409)

Amend 3ead982

* Backends: amends to 1db1066 + merge minor bits from docking incl SetActiveIdUsingNavAndKeys().

No need to clear fields before deletion. DX12: renamed to match docking branch.

* Backends: Viewports: renamed viewport storage structures ImGuiViewportDataXXXX -> ImGui_ImplXXXX_ViewportData and locals (matching naming convention in 70c6038)

* Docking: removed DockNodeFlagsOverrideClear flags from ImGuiWindowClass. (ocornut#2999, ocornut#3521, ocornut#3633)

+ extraded bits of metrics into DebugNodeDockNodeFlags()

* Docking: Reworked node flags saving/inheritance... (ocornut#4292, ocornut#3834, ocornut#3633, ocornut#3521, ocornut#3492, ocornut#3335, ocornut#2999, ocornut#2648)

..so that flags enforced by docked windows via the DockNodeFlagsOverrideSet mechanism are are not left in empty dockspace nodes once the windows gets undocked.

* Docking: Added ImGuiDockNodeFlags_NoDockingOverEmpty. Breaking definition of ImGuiDockNodeFlags_NoDockingOverOther which now means "non empty node". (ocornut#3492, ocornut#2648, ocornut#4292)

* Docking: Fixed crash issues using DockBuilderRemoveNode() in some situations. (ocornut#3111, ocornut#3179, ocornut#3203, ocornut#4295)

If the deleted root node isn't part of a dockspace with a central node, it won't be "protected" but removed when last window gets removed.

* Docking: Fix crash when a dock node gets re-qualified as dockspace>floating>dockspace.. (ocornut#3203, ocornut#4295)

Which tends to happen when incorrectly calling DockBuilderAddNode() without ImGuiDockNodeFlags_Dockspace and using it as a Dockspace on the next frame after the floating window hosting the node has been automatically created.

* Added missing IMGUI_API to GetViewportPlatformMonitor. (ocornut#4309)

* Backends: Win32, SDL, GLFW: only honor io.WantSetMousePos when focused + fix GLFW uninstalling handler + tweaks to reduce branch drift with docking. (ocornut#787, ocornut#2445, ocornut#2696, ocornut#3751, ocornut#4377)

# Conflicts:
#	backends/imgui_impl_glfw.cpp
#	backends/imgui_impl_sdl.cpp
#	backends/imgui_impl_win32.cpp

* IO: modify io.AddFocusEvent() to tolerate in/out for multi-viewports. Amend 2f40be6. (ocornut#3532)

* Fix BeginDisabled(false), (ocornut#211, ocornut#4452)

* Fix BeginDisabled(false), again, (ocornut#211, ocornut#4452, ocornut#4453) Version 1.84.1

(forced pushed since our earlier versioning didn't sort correctly in github web)

# Conflicts:
#	docs/CHANGELOG.txt

* Backends: GLFW: Fixed unused variable warning for empty assert macro. (ocornut#4459)

* Docking: fixed settings load issue when mouse wheeling. (ocornut#4310)

* Docking: fix 58f5092 (ocornut#4310)

If we clear _ChildWindow flag we must remove it from here otherwise render loop will fail.

* Docking: warning fix for when IM_ASSERT() is empty

* Fixed bad merge of Changelog in docking branch

* Internals: refactored IsWindowHovered()/IsWindowFocused() to make their logic more similar + change underlying value of ImGuiHoveredFlags_AllowWhenBlockedByPopup + comment out docking only flags.

* Fixed _ChildWindows from leaking docking hierarchy. Added ImGuiFocusedFlags_DockHierarchy and ImGuiHoveredFlags_DockHierarchy.

* Viewports: fixed unnecessary creation of temporary viewports when multiple docked windows got reassigned to a new node (created mid-frame) which already has a HostWindow

* Viewports: Fixed a crash while a window owning its viewport disappear while being dragged.

t would manifest when e.g. reconfiguring dock nodes while dragging.

* Viewports: fix window with viewport ini data immediately merged into a host viewport from leaving a temporary viewport alive for a frame (would leak into backend).

* Fixed IsWindowFocused/IsWindowHovered with _ChildWindows for not following through popup parents (amend 6b1e094, fix ocornut#4527)

* Viewports: extracted DestroyViewport() out of UpdateViewportsNewFrame() function.

* Docking: bits.

* Docking: floating node with a central node hides properly when nothing is docked + rename.

* Docking: Improved resizing system so that non-central zone are better at keeping their fixed size.

* Nav: Fixed an issue with losing focus on docked windows when pressing Alt while keyboard navigation is disabled. (ocornut#4547, ocornut#4439)

* Docking: Fixed IsItemHovered() and functions depending on it (e.g. BeginPopupContextItem()) when called after Begin() on a docked window (ocornut#3851)

Fix ee643b2

* Added ImGuiFocusedFlags_NoPopupHierarchy and ImGuiHoveredFlags_NoPopupHierarchy (followup ocornut#4527)

IsWindowFocused: fix flag usage (amend 6b1e094) was technically harmless because of light typing.

* Docking: reinstate io.ConfigDockingWithShift option. (ocornut#4643)

This more or less reverts commit 3ed07a8.

* Fixed nested BeginDisabled()/EndDisabled() bug in Docking branch due to bad merge. (ocornut#4655, ocornut#4452, ocornut#4453, ocornut#4462)

* Backends: Made it possible to shutdown default Platform Backends before the Renderer backends. (ocornut#4656)

* Viewports: Made it possible to explicitly assign ImGuiWindowClass::ParentViewportId to 0. (ocornut#3152, ocornut#2871)

* Fixed tooltip in own viewport over modal from being incorrectly dimmed. (ocornut#4729)

Normally we would aim to ensure that g.Windows[] gets maintained to reflect display layer but it is presently non trivial.

* Fixed crash on right-click without modal, introduced by previous commit a3667f4,  (ocornut#4729)

* Viewports: fix missing default per-window value for ParentViewportId due to zero-cleared in-window instance (ocornut#4756)

Broken by 2080d12

* Docking: Fixed a bug undocking windows docked into a non-visible or _KeepAliveOnly dockspace. (ocornut#4757)

* Docking: Fix typo (had no side effect) (ocornut#4778)

Co-authored-by: Mikko Sivulainen <[email protected]>

* Viewports: Fixed CTRL+TAB highlight outline on docked windows not always fitting in host viewport + moved EndFrameDrawDimmedBackgrounds() call + removed duplicate code in Begin() already in EndFrameDrawDimmedBackgrounds()

* Docking: Fixed incorrectly rounded tab bars for dock node that are not at the top of their dock tree.

* Docking: Fixed single-frame node pos/size inconsistencies when window stop or start being submitted.

Fix 718e15c while preserving its intended property. Tested by "docking_window_appearing_layout". (ocornut#2109)

* Docking: internals: extracted rounding corner calculation into reusable CalcRoundingFlagsForRectInRect() function.

* Docking: docked windows honor ImGuiCol_WindowBg. Host window in charge of rendering seams. (ocornut#2700, ocornut#2539 + Docked windows honor display their border properly. (ocornut#2522)

Plus: better support for transparent one in nodes
Side effects: DockContextBindNodeToWindow doesn't alter node->IsVisible.
Side effects: ImDrawList:: _ResetForNewFrame() needs to merge, sane (in case of
(Amended, force-pushed)

* Docking: Amend b16f738 fixed dimming of docked window + removed thin highlight around windows (never worked on docked window, not viewports friendly, hard to move to EndFrame) (ocornut#2700, ocornut#2539, ocornut#2522)

* Nav, Docking: reworked modal/ctrl+tab dimming system to be entirely processed at end of the frame, which will simplify things for an upcoming commit.

(Will backport some of this back to master now.)

* Nav, Docking: Fix dimming on docked windows.

* Nav, Docking: Fix crash on dimming docked window and DockSpaceOverViewport() with PassthruCentralNode.

(amend 1dc3af3, 23ef6c1, 657073a)

* Added an assertion for the common user mistake of using "" as an identifier at the root level of a window. (ocornut#1414, ocornut#2562, ocornut#2807, ocornut#4008, ocornut#4158, ocornut#4375, ocornut#4548, ocornut#4657, ocornut#4796)

  ocornut#4158, ocornut#4375, ocornut#4548, ocornut#4657, ocornut#4796)

* Docking: prevent docking any window created above a popup/modal. (ocornut#4317)

* Internals: UpdateWindowInFocusOrderList: amend a528398 to fix docking. (ocornut#3496, ocornut#4797)

* Internals: reduced side-effects of setting window->HiddenFramesForRenderOnly > 0

* Viewports: Fixed a CTRL+TAB crash with viewports enabled (ocornut#4023, ocornut#787) (amend 1dc3af3, 23ef6c1, 657073a)

+ Expose FindHoveredViewportFromPlatformWindowStack() in imgui_internal.h

* Update .gitignore

* Backends: OSX: Fixed typo.

* Rename io.AddKeyModEvent() -> io.AddKeyModsEvent() and updated backends accordingly. (ocornut#2625, ocornut#4858)

Amend 790132a (breaking)

# Conflicts:
#	backends/imgui_impl_glfw.cpp
#	backends/imgui_impl_sdl.cpp
#	backends/imgui_impl_win32.cpp

* IO: fix SetKeyEventNativeData() not handling ImGuiKey_None the same way as AddKeyEvent(). (ocornut#4905, ocornut#4858)

* Merge "Backends: SDL: Fix for Emscriptem. Amend 98ce013." + Fix bad merge from master of "is_app_focused" property (Amend 0647ba3)

* Viewports: Fixed active InputText() from preventing viewports to merge. (ocornut#4212)

* Viewports: Relaxed specs for backend supporting ImGuiBackendFlags_HasMouseHoveredViewport. Backends: SDL: Added support for simplified HasMouseHoveredViewport. (ocornut#1542, ocornut#4665)

* IO: added AddMouseViewportEvent() + used in backends.

* Docking: Fixed a CTRL+TAB crash when aiming at an empty docked window. (ocornut#4792)

* Revert moving ImGuiKeyModFlags to internal.h (amendc906c65)

# Conflicts:
#	imgui.cpp

* Backends: SDL: no support for ImGuiBackendFlags_HasMouseHoveredViewport under OSX/LInux (ocornut#4960)

* Docking: Fixed size constraints not working on single window holding on a dock id (still doesn't work on docked windows).

* Docking: Tabs use their own identifier (in order to make window->ID refer to whole window in test engine).  Also prevents Tab ID from clashing with "" which was common.

* Docking: Fixed CTRL+TAB back into a docked window not selecting menu layer when no item are on main layer.

Could merge on master.

* Backends: SDL: Amend 08350e5, multi-viewports mouse tracking works under Linux. (ocornut#4960) + Reword tests to help static analysis.

* Docking: fixed potential crash if a passthrough dock node is submitted without a child intermediate (currently not possible via API)

* Internals: rework RenderMouseCursor() signature so we can use it in docking branch more naturally. (Merged from master+ rework for docking)

# Conflicts:
#	imgui.cpp
#	imgui_draw.cpp

* Viewports: Fixed main viewport size not matching ImDrawData::DisplaySize for one frame during resize when multi-viewports are disabled. (ocornut#4900)

* Docking: Fixed floating docked nodes not being clamped into viewport workrect to stay reachable when g.ConfigWindowsMoveFromTitleBarOnly is set and multi-viewports are disabled. (ocornut#5044)

* Viewports: Fixed translating a host viewport from briefly altering the size of AlwaysAutoResize windows. (ocornut#5057)

* Backends: SDL: Fix multi-viewport dragging issue with SDL on some systems. (ocornut#5012)

* Backends: SDL: Fix more dragging issues. SDL_CaptureMouse() is essentially broken. (ocornut#5012, ocornut#5082)

master got c5f6721 which is combining f337378 and this commit.

* Windows: Fixed first-time windows appearing in negative coordinates. (ocornut#5215, ocornut#3414)

Regression added in 6af92b0

* Backends: OSX, Metal: Added multi-viewports support. (ocornut#4821, ocornut#2778)

* Backends: OSX, Metal: Amend d111133, tidying up, remove unused, misc tweaks. . (ocornut#4821, ocornut#2778)

* Backends: OSX: Implement ImGui_ImplOSX_ShowWindow(). (ocornut#5299)

* Examples: Apple+OpenGL: Fix build.

* Docking: Fixed moving window being interrupted when undocing a window with "io.ConfigDockingAlwaysTabBar = true". (ocornut#5324)

Regression introduced in 6b77668

* Docking: Fix unhiding tab bar regression. (ocornut#5325, ocornut#5181)

Broken by 9038678

* Misc: Fix custom assertion macro failing to compile imgui.cpp (ocornut#5378)

* Docking: Fixed incorrect focus highlight on docking node when focusing empty central node or a child window which was manually injected into a dockspace window.

* Backends: SDL+GLFW, Examples: SDL+Metal, GLFW+Metal: Fix viewport support with Metal backend.

Fixes ocornut#5392 + alignment fixes and removed static_cast<> + Amended with fix.

* Docking, Modal: Fixed a crash when opening popup from a parent which is being docked on the same frame. (ocornut#5401)

Ideally we should untangle the purpose of parent_window_in_stack / ParentWindowInBeginStack better.

* Docking: Amend 24dfebf. Fixed incorrect focus highlight on docking node with nested hierarchies.

* Backends: GLFW: Fixed leftover static variable preventing from changing or reinitializing backend while application is running. (ocornut#4616, ocornut#5434)

* Backends, Viewport: Metal: Pull format from shared context. (ocornut#5403, ocornut#5437)

* Docking, Nav: Fixed using gamepad/keyboard navigation not being able enter menu layer  (ocornut#5463, ocornut#4792)

Fix 37958ca

* Docking: Fix docked window contents not rendering when switching with CTRL+Tab.

(regression from 8eb8689).

* Internals: Docking: make DockContextFindNodeByID() more visible (instead of DockBuilderGetNode)

+ using defines for channel changes.

* Docking: Fixed splitting/docking into a node that has buttons amended into tab bar. Windows were not moved correctly. (ocornut#5515)

* Docking: Fixed amending into an existing tab bar from rendering invisible items. (ocornut#5515, amend b16f738 ocornut#2700, ocornut#2539)

Commit b16f738 left us with a "current" channel 0 which seems inadequate. Undoing that, assuming default is always 1, code filling bg color does a switch. Only DockContextEndFrame() leave it at 0 and it's not particularly necessary.

* Docking+Viewports: Fix undocking window node causing parent viewport to become unresponsive. (ocornut#5503)

Amend 67be485, Somehow ties to 58f5092 + 0eb45a0 (ocornut#4310)
Unsure of exact chain of event but this caused a parent link msimatch between the time of the MouseMoving test in AddUpdateViewport() setting _NoInputs on the wrong parent., and the release clearing _NoInputs on the rght one.

* Docking: Simplify logic of moving tabs between nodes. Amends 0abe7d. (ocornut#5515)

The idea is that in the absence of a tab bar, as new one gets created new tabs will be sorted based on window->DockOrder so this may work but we're not 100% sure.

* Docking: Add source dock node parameter DockContextCalcDropPosForDocking() to facilitate test engine (un)docking nodes before they are split out to their own window.
Metrics: Display dock_node->Windows in node metrics.

* Internals: Docking: rename HoveredDockNode to DebugHoveredDockNode to clarify that it isn't usable for much other than debugging.

* Nav: Fixed regression in e99c4fc preventing CTR+Tab to work without NavEnableKeyboard (ocornut#5504, ocornut#4023);

* Obsoleted using SetCursorPos()/SetCursorScreenPos() to extend parent window/cell boundaries. (ocornut#5548)

This incorrect pattern has been mentioned or suggested in: ocornut#4510, ocornut#3355, ocornut#1760, ocornut#1490, ocornut#4152, ocornut#150

# Conflicts:
#	imgui.cpp

* Backends: SDL: Fixed building backend under non-OSX Apple targets (e.g. iPhone). (ocornut#5665)

* Docking: Fixed incorrect focus highlight on docking node when focusing a menu. (ocornut#5702)

* Backends: OpenGL: Add ability to #define IMGUI_IMPL_OPENGL_DEBUG. (ocornut#4468, ocornut#4825, ocornut#4832, ocornut#5127, ocornut#5655, ocornut#5709)

# Conflicts:
#	backends/imgui_impl_opengl3.cpp

* Update imgui_impl_vulkan.h to match martty/imgui

https://github.com/martty/imgui/blob/master/examples/imgui_impl_vulkan.h

* Update imgui_impl_vulkan.cpp to match martty/imgui

https://github.com/martty/imgui/blob/master/examples/imgui_impl_vulkan.cpp

* Viewports: Fix AddMouseViewportEvent() to honor AppAcceptingEvents, filter duplicate, add to debug log.

* Docking: Fixed missing highlight when using dock node host window borders. (ocornut#5702)

Amend 8f43487, 9764adc, 24dfebf

* Fixed ImGuiWindowFlags_UnsavedDocument clipping label in docked windows with no close button. [changes for docking] (ocornut#5745)

+ TabBar: starts displaying the unsaved document marker with a frame delay to match how close button is processed, otherwise the transition would be noticeable.

* Fix for Vulkan validation layer warnings

Fix from: TheCherno@add065f
ocornut#3957

Co-authored-by: ocornut <[email protected]>
Co-authored-by: Sammy Fatnassi <[email protected]>
Co-authored-by: GamingMinds-DanielC <[email protected]>
Co-authored-by: Adam Kewley <[email protected]>
Co-authored-by: Rokas Kupstys <[email protected]>
Co-authored-by: David Maas <[email protected]>
Co-authored-by: CheckmateAt7 <[email protected]>
Co-authored-by: warriormaster12 <[email protected]>
Co-authored-by: Michel Lesoinne <[email protected]>
Co-authored-by: Mikko Sivulainen <[email protected]>
Co-authored-by: Mikko Sivulainen <[email protected]>
Co-authored-by: Dima Koltun <[email protected]>
Co-authored-by: stuartcarnie <[email protected]>
Co-authored-by: omar <[email protected]>
Co-authored-by: Andrej Redeky <[email protected]>
Co-authored-by: Runik <[email protected]>
Co-authored-by: Stephen H. Gerstacker <[email protected]>
@Awuwunya
Copy link

Awuwunya commented Oct 9, 2022

This has been broken in a recent imgui docking commit again. After updating from 64b88da the bug happens again. I am using opengl2 SDL (2.0.22) as the backend. I suspect 51bbc70 broke this once again, but I can't confirm at the moment.

@ocornut ocornut reopened this Oct 9, 2022
@Jonathan-L-Davis
Copy link

I'm using SDL version 2.0.22 prebuilt, opengl3, windows 11, mingw-64 gcc version 12.1.0 (Rev2, Built by MSYS2 project), and last pulled the imgui docking branch from Nov. 4, 2022. I've been using both my engine code, as well as the example_sdl_opengl3 main file, which appear to behave identically. I'm not sure if this is actually the same bug as previously, especially since it only happens when docking is enabled.

In my testing with this bug, I've found it only occurs when ImGuiConfigFlags_DockingEnable is set. I can only get the window to glitch if I am dragging by the title bar, which enables it to be a dock source. Additionally, when I comment out the "BeginDockableDragDropSource" function call in the "Begin" function, that also stops the bug, but disables docking. This does not happen when I comment out the function "BeginDockableDragDropTarget" a little later in the "Begin" function, both around line 7350.

Lastly when the mouse is dragging the window but the window is not following it (when the bug is active), the window local position does not change, but the global ones do, using the functions 'SDL_GetMouseState' and 'SDL_GetGlobalMouseState' respectively. Viewport local coordinates stay at their last values before mouse left the viewport. Anyone have any thoughts for where to look in the code? I'm running out of ideas.

@ocornut
Copy link
Owner

ocornut commented Nov 10, 2022

Thank you both. I can confirm the issue and can confirm that 51bbc70 (#5710) broke it when we changed:

SDL_CaptureMouse(bd->MouseButtonsDown != 0 ? SDL_TRUE : SDL_FALSE);

to

SDL_CaptureMouse((bd->MouseButtonsDown != 0 && ImGui::GetDragDropPayload() == nullptr) ? SDL_TRUE : SDL_FALSE);

Removing this unfortunately means that we cannot rely on io.AddMouseViewportEvent() calls while drag and dropping as SDL doesn't gives us the correct information when capturing.

Instead of completely disabling ImGuiBackendFlags_HasMouseHoveredViewport in SDL backend I am trying a more dynamic approach with fix d7aca16

@ocornut ocornut closed this as completed Nov 10, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

7 participants