Skip to content

Fix crush on popup close during selection#538

Merged
maxkatz6 merged 2 commits intoAvaloniaUI:masterfrom
jl0pd:fix-crash-on-tooltip-close
Mar 20, 2026
Merged

Fix crush on popup close during selection#538
maxkatz6 merged 2 commits intoAvaloniaUI:masterfrom
jl0pd:fix-crash-on-tooltip-close

Conversation

@jl0pd
Copy link
Copy Markdown
Contributor

@jl0pd jl0pd commented Sep 24, 2025

Our application have several popups, one of which is shown when mouse is over member. Lifetime of all popups in controlled manually and CompletionWindowBase.Hide() is called when selection is changed. Hiding popup results in following exception:

AvaloniaEdit.Rendering.VisualLinesInvalidException: Exception of type 'AvaloniaEdit.Rendering.VisualLinesInvalidException' was thrown.
   at AvaloniaEdit.Rendering.TextView.get_VisualLines()
   at AvaloniaEdit.Rendering.BackgroundGeometryBuilder.GetRectsForSegmentImpl(TextView textView, ISegment segment, Boolean extendToFullWidthAtLineEnd)+MoveNext()
   at AvaloniaEdit.Rendering.BackgroundGeometryBuilder.AddSegment(TextView textView, ISegment segment)
   at AvaloniaEdit.Editing.SelectionLayer.Render(DrawingContext drawingContext)
   at Avalonia.Rendering.Composition.CompositingRenderer.UpdateCore()
   at Avalonia.Rendering.Composition.CompositingRenderer.Update()
   at Avalonia.Rendering.Composition.Compositor.CommitCore()
   at Avalonia.Rendering.Composition.Compositor.Commit()
   at Avalonia.Media.MediaContext.CommitCompositor(Compositor compositor)
   at Avalonia.Media.MediaContext.SyncCommit(Compositor compositor, Boolean waitFullRender, Boolean catchExceptions)
   at Avalonia.Media.MediaContext.SyncDisposeCompositionTarget(CompositionTarget compositionTarget)
   at Avalonia.Rendering.Composition.CompositingRenderer.Dispose()
   at Avalonia.Controls.TopLevel.HandleClosed()
   at Avalonia.Controls.WindowBase.HandleClosed()
   at Avalonia.Win32.WindowImpl.AppWndProc(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam)
   at Avalonia.Win32.PopupImpl.WndProc(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam)
   at Avalonia.Win32.WindowImpl.WndProcMessageHandler(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam)
   at Avalonia.Win32.Interop.UnmanagedMethods.DestroyWindow(IntPtr hwnd)
   at Avalonia.Win32.Interop.UnmanagedMethods.DestroyWindow(IntPtr hwnd)
   at Avalonia.Win32.WindowImpl.Dispose()
   at Avalonia.Controls.Primitives.PopupRoot.Dispose()
   at Avalonia.Controls.Primitives.Popup.<>c.<Open>b__101_8(ValueTuple`2 state)
   at Avalonia.Reactive.Disposable.AnonymousDisposable`1.Dispose()
   at Avalonia.Controls.Primitives.Popup.PopupOpenState.Dispose()
   at Avalonia.Controls.Primitives.Popup.CloseCore()
   at Avalonia.Controls.Primitives.Popup.Close()
   at OurApp.EditorView.CloseAllWindows()
   at OurApp.EditorView.<.ctor>b__7_0(Object _, EventArgs _)
   at AvaloniaEdit.Editing.TextArea.set_Selection(Selection value)
   at AvaloniaEdit.Editing.SelectionMouseHandler.ExtendSelectionToMouse(PointerEventArgs e)
   at AvaloniaEdit.Editing.SelectionMouseHandler.TextArea_MouseMove(Object sender, PointerEventArgs e)
   at Avalonia.Interactivity.EventRoute.RaiseEventImpl(RoutedEventArgs e)
   at Avalonia.Interactivity.Interactive.RaiseEvent(RoutedEventArgs e)
   at Avalonia.Input.MouseDevice.ProcessRawEvent(RawPointerEventArgs e)
   at Avalonia.Threading.Dispatcher.Send(SendOrPostCallback action, Object arg, Nullable`1 priority)
   at Avalonia.Controls.TopLevel.HandleInput(RawInputEventArgs e)
   at Avalonia.Win32.WindowImpl.AppWndProc(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam)
   at Avalonia.Win32.WindowImpl.WndProcMessageHandler(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam)
   at Avalonia.Win32.Interop.UnmanagedMethods.DispatchMessage(MSG& lpmsg)
   at Avalonia.Win32.Interop.UnmanagedMethods.DispatchMessage(MSG& lpmsg)
   at Avalonia.Win32.Win32DispatcherImpl.RunLoop(CancellationToken cancellationToken)
   at Avalonia.Threading.DispatcherFrame.Run(IControlledDispatcherImpl impl)
   at Avalonia.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   at Avalonia.Threading.Dispatcher.MainLoop(CancellationToken cancellationToken)
   at Avalonia.Controls.ApplicationLifetimes.ClassicDesktopStyleApplicationLifetime.StartCore(String[] args)
   at Avalonia.Controls.ApplicationLifetimes.ClassicDesktopStyleApplicationLifetime.Start(String[] args)
   at Avalonia.ClassicDesktopStyleApplicationLifetimeExtensions.StartWithClassicDesktopLifetime(AppBuilder builder, String[] args, Action`1 lifetimeBuilder)
   at OurApp.Program.Main(String[] args)

I was unable to reproduce same error on sample project

@maxkatz6
Copy link
Copy Markdown
Member

This issue was fixed on Avalonia side
AvaloniaUI/Avalonia#17784
AvaloniaUI/Avalonia#18119

Root of the problem was extra render call during window disposal.

grokys
grokys previously approved these changes Jan 16, 2026
@grokys
Copy link
Copy Markdown
Member

grokys commented Jan 16, 2026

@maxkatz6 would it still make sense to have this PR merged to support earlier Avalonia versions?

@grokys grokys self-requested a review January 16, 2026 08:03
@grokys grokys dismissed their stale review January 16, 2026 08:05

Approved too soon

@maxkatz6 maxkatz6 enabled auto-merge March 20, 2026 08:35
@maxkatz6 maxkatz6 merged commit 116ee44 into AvaloniaUI:master Mar 20, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants