Skip to content

Commit 8520e1e

Browse files
committed
Handle text editor line changed event to detect user is not idling
1 parent 8568c81 commit 8520e1e

3 files changed

Lines changed: 26 additions & 3 deletions

File tree

VisualStudioDiscordRPC.Shared/DiscordRpcController.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66
using VisualStudioDiscordRPC.Shared.Plugs;
77
using VisualStudioDiscordRPC.Shared.Nests;
88
using VisualStudioDiscordRPC.Shared.Nests.Base;
9-
using System.Windows;
10-
using VisualStudioDiscordRPC.Shared.Plugs.TimerPlugs;
9+
using VisualStudioDiscordRPC.Shared.Observers;
1110

1211
namespace VisualStudioDiscordRPC.Shared
1312
{
@@ -25,6 +24,7 @@ public class DiscordRpcController
2524
private readonly DiscordRpcClient _discordRpcClient;
2625
private readonly LocalizationService _localizationService;
2726
private readonly SettingsService _settingsService;
27+
private readonly VsObserver _vsObserver;
2828

2929
private readonly RichPresence _sharedRichPresence;
3030
private readonly object _richPresenceSync = new object();
@@ -102,6 +102,7 @@ static DiscordRpcController()
102102
public DiscordRpcController(int updateMillisecondsTimeout)
103103
{
104104
_settingsService = ServiceRepository.Default.GetService<SettingsService>();
105+
_vsObserver = ServiceRepository.Default.GetService<VsObserver>();
105106

106107
var applicationId = _settingsService.Read<string>(SettingsKeys.ApplicationID);
107108

@@ -152,6 +153,8 @@ public void Initialize()
152153
{
153154
nest.Changed += OnNestChanged;
154155
}
156+
157+
_vsObserver.TextEditorLineChanged += OnTextEditorLineChanged;
155158
}
156159

157160
public void Dispose()
@@ -168,6 +171,8 @@ public void Dispose()
168171
_sendingThreadCancellation = true;
169172
_discordRpcClient.Dispose();
170173
}
174+
175+
_vsObserver.TextEditorLineChanged -= OnTextEditorLineChanged;
171176
}
172177

173178
public void SetPlug<TNest>(BasePlug plug) where TNest : BaseNest
@@ -214,6 +219,12 @@ private void OnNestChanged()
214219
SetDirty();
215220
}
216221

222+
private void OnTextEditorLineChanged(EnvDTE.TextPoint startPoint, EnvDTE.TextPoint endPoint, int hint)
223+
{
224+
if (_enabled && _isIdling)
225+
SetDirty();
226+
}
227+
217228
public void RefreshAll()
218229
{
219230
foreach (BaseNest nest in Nests)

VisualStudioDiscordRPC.Shared/Observers/ObserverDelegates.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ namespace VisualStudioDiscordRPC.Shared.Observers
66
public delegate void DocumentChangedHandler(Document document);
77
public delegate void ProjectChangedHandler(Project project);
88
public delegate void SolutionChangedHandler(Solution solution);
9+
public delegate void TextEditorLineChangedHandler(TextPoint startPoint, TextPoint endPoint, int hint);
910
}

VisualStudioDiscordRPC.Shared/Observers/VsObserver.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using EnvDTE;
22
using EnvDTE80;
33
using Microsoft.VisualStudio.Shell;
4-
using System;
54

65
namespace VisualStudioDiscordRPC.Shared.Observers
76
{
@@ -11,13 +10,16 @@ public class VsObserver : IObserver
1110
public event DocumentChangedHandler DocumentChanged;
1211
public event ProjectChangedHandler ProjectChanged;
1312
public event SolutionChangedHandler SolutionChanged;
13+
public event TextEditorLineChangedHandler TextEditorLineChanged;
1414

1515
private readonly DTE2 _dte;
1616
public DTE2 DTE => _dte;
1717

1818
private string _lastSolutionName;
1919
private Project _lastProject;
2020

21+
private TextEditorEvents _textEditorEvents;
22+
2123
public VsObserver(DTE2 dte)
2224
{
2325
_dte = dte;
@@ -28,13 +30,17 @@ public void Observe()
2830
ThreadHelper.ThrowIfNotOnUIThread();
2931

3032
_dte.Events.WindowEvents.WindowActivated += OnWindowActivated;
33+
34+
_textEditorEvents = _dte.Events.TextEditorEvents;
35+
_textEditorEvents.LineChanged += OnTextEditorLineChanged;
3136
}
3237

3338
public void Unobserve()
3439
{
3540
ThreadHelper.ThrowIfNotOnUIThread();
3641

3742
_dte.Events.WindowEvents.WindowActivated -= OnWindowActivated;
43+
_textEditorEvents.LineChanged -= OnTextEditorLineChanged;
3844
}
3945

4046
private void OnWindowActivated(Window gotFocus, Window lostFocus)
@@ -78,5 +84,10 @@ private void OnWindowActivated(Window gotFocus, Window lostFocus)
7884
}
7985
}
8086
}
87+
88+
private void OnTextEditorLineChanged(TextPoint startPoint, TextPoint endPoint, int hint)
89+
{
90+
TextEditorLineChanged?.Invoke(startPoint, endPoint, hint);
91+
}
8192
}
8293
}

0 commit comments

Comments
 (0)