Skip to content

Commit

Permalink
Run Initialize() from UI thread
Browse files Browse the repository at this point in the history
  • Loading branch information
Tomasz Gołębiowski committed Jan 31, 2025
1 parent 24ed977 commit 2e3fc4e
Showing 1 changed file with 25 additions and 26 deletions.
51 changes: 25 additions & 26 deletions src/Cody.VisualStudio/Services/DocumentsSyncService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,28 +41,29 @@ public DocumentsSyncService(IVsUIShell vsUIShell, IDocumentSyncActions documentA

public void Initialize()
{
try
ThreadHelper.JoinableTaskFactory.Run(async delegate
{
foreach (var frame in GetOpenDocuments())
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

try
{
frame.GetProperty((int)__VSFPROPID.VSFPROPID_DocCookie, out object cookie);
var docCookie = (uint)(int)cookie;
var path = rdt.GetDocumentInfo(docCookie).Moniker;
if (path == null) continue;
var content = rdt.GetRunningDocumentContents(docCookie);

documentActions.OnOpened(path, content, null, null);
openNotificationSend.Add(docCookie);
foreach (var frame in GetOpenDocuments())
{
if (frame.GetProperty((int)__VSFPROPID.VSFPROPID_DocCookie, out object cookie) != VSConstants.S_OK) continue;
var docCookie = (uint)(int)cookie;
var path = rdt.GetDocumentInfo(docCookie).Moniker;
if (path == null) continue;
var content = rdt.GetRunningDocumentContents(docCookie);

documentActions.OnOpened(path, content, null, null);
openNotificationSend.Add(docCookie);
}
}
}
catch (Exception ex)
{
log.Error("Document sync initialization error", ex);
}
finally
{
rdtCookie = rdt.Advise(this);
}
finally
{
rdtCookie = rdt.Advise(this);
}
});
}

private IVsTextView GetVsTextView(IVsWindowFrame windowFrame)
Expand Down Expand Up @@ -99,16 +100,14 @@ public void Deinitialize()
private IEnumerable<IVsWindowFrame> GetOpenDocuments()
{
var results = new List<IVsWindowFrame>();
uint fetched = 0;
var winFrameArray = new IVsWindowFrame[1];

vsUIShell.GetDocumentWindowEnum(out IEnumWindowFrames docEnum);
var winFrameArray = new IVsWindowFrame[50];
if (vsUIShell.GetDocumentWindowEnum(out IEnumWindowFrames docEnum) != VSConstants.S_OK) return results;

while (true)
while (docEnum.Next(1, winFrameArray, out fetched) == VSConstants.S_OK && fetched == 1)
{
docEnum.Next((uint)winFrameArray.Length, winFrameArray, out uint fetched);
if (fetched == 0) break;

results.AddRange(winFrameArray.Take((int)fetched));
results.Add(winFrameArray[0]);
}

return results;
Expand Down

0 comments on commit 2e3fc4e

Please sign in to comment.