Skip to content

Commit 243eb05

Browse files
authored
Merge pull request #2766 from comintern/next
Fix extreme UI sluggishness, avoid throws in SubclassingWindow.
2 parents 427ef60 + 0e8690b commit 243eb05

File tree

2 files changed

+13
-10
lines changed

2 files changed

+13
-10
lines changed

RetailCoder.VBE/UI/SelectionChangeService.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Linq;
3+
using System.Threading.Tasks;
34
using Rubberduck.Parsing;
45
using Rubberduck.Parsing.Symbols;
56
using Rubberduck.VBEditor.Events;
@@ -39,8 +40,11 @@ private void OnVbeSelectionChanged(object sender, SelectionChangedEventArgs e)
3940
return;
4041
}
4142

42-
var eventArgs = new DeclarationChangedEventArgs(e.CodePane, _parser.State.FindSelectedDeclaration(e.CodePane));
43-
DispatchSelectedDeclaration(eventArgs);
43+
new Task(() =>
44+
{
45+
var eventArgs = new DeclarationChangedEventArgs(e.CodePane, _parser.State.FindSelectedDeclaration(e.CodePane));
46+
DispatchSelectedDeclaration(eventArgs);
47+
}).Start();
4448
}
4549

4650
private void OnVbeFocusChanged(object sender, WindowChangedEventArgs e)
@@ -55,21 +59,21 @@ private void OnVbeFocusChanged(object sender, WindowChangedEventArgs e)
5559
{
5660
return;
5761
}
58-
DispatchSelectedDesignerDeclaration(_vbe.SelectedVBComponent);
62+
new Task(() => DispatchSelectedDesignerDeclaration(_vbe.SelectedVBComponent)).Start();
5963
break;
6064
case WindowKind.CodeWindow:
6165
//Caret changed in a code pane.
6266
if (e.CodePane != null && !e.CodePane.IsWrappingNullReference)
6367
{
64-
DispatchSelectedDeclaration(new DeclarationChangedEventArgs(e.CodePane, _parser.State.FindSelectedDeclaration(e.CodePane)));
68+
new Task(() => DispatchSelectedDeclaration(new DeclarationChangedEventArgs(e.CodePane, _parser.State.FindSelectedDeclaration(e.CodePane)))).Start();
6569
}
6670
break;
6771
}
6872
}
6973
else if (e.EventType == FocusType.ChildFocus)
7074
{
7175
//Treeview selection changed in project window.
72-
DispatchSelectedProjectNodeDeclaration(_vbe.SelectedVBComponent);
76+
new Task(() => DispatchSelectedProjectNodeDeclaration(_vbe.SelectedVBComponent)).Start();
7377
}
7478
}
7579

Rubberduck.VBEEditor/WindowsApi/SubclassingWindow.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ protected SubclassingWindow(IntPtr subclassId, IntPtr hWnd)
4343
public void Dispose()
4444
{
4545
ReleaseHandle();
46-
//GC.SuppressFinalize(this);
46+
_thisHandle.Free();
4747
}
4848

4949
private void AssignHandle()
@@ -86,14 +86,13 @@ public virtual int SubClassProc(IntPtr hWnd, IntPtr msg, IntPtr wParam, IntPtr l
8686
{
8787
if (!_listening)
8888
{
89-
throw new Exception("State corrupted. Received window message while not listening.");
89+
Debug.WriteLine("State corrupted. Received window message while not listening.");
90+
return DefSubclassProc(hWnd, msg, wParam, lParam);
9091
}
9192

92-
Debug.Assert(IsWindow(_hwnd));
9393
if ((uint)msg == (uint)WM.RUBBERDUCK_SINKING || (uint)msg == (uint)WM.DESTROY)
9494
{
95-
ReleaseHandle();
96-
_thisHandle.Free();
95+
ReleaseHandle();
9796
}
9897
return DefSubclassProc(hWnd, msg, wParam, lParam);
9998
}

0 commit comments

Comments
 (0)