Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Krüger <mkrueger@xamarin.com>2016-05-04 17:35:10 +0300
committerMike Krüger <mkrueger@xamarin.com>2016-05-04 17:35:10 +0300
commitaf6328164bae3cd32aee36f95ce2f4e27e4c041c (patch)
tree1bf8d40247ffd3e675e86b8aa5b691fc78b69f63 /main/src/core/Mono.Texteditor
parentad27a71644d13c64be097d73cedc3bea0b3a487b (diff)
[TextEditor] No longer wait on the ui thread on fold update.
Diffstat (limited to 'main/src/core/Mono.Texteditor')
-rw-r--r--main/src/core/Mono.Texteditor/Mono.TextEditor/Document/TextDocument.cs74
1 files changed, 46 insertions, 28 deletions
diff --git a/main/src/core/Mono.Texteditor/Mono.TextEditor/Document/TextDocument.cs b/main/src/core/Mono.Texteditor/Mono.TextEditor/Document/TextDocument.cs
index 82a5c81650..800b83561c 100644
--- a/main/src/core/Mono.Texteditor/Mono.TextEditor/Document/TextDocument.cs
+++ b/main/src/core/Mono.Texteditor/Mono.TextEditor/Document/TextDocument.cs
@@ -35,6 +35,7 @@ using System.ComponentModel;
using ICSharpCode.NRefactory.Editor;
using System.Threading.Tasks;
using System.Threading;
+using Gtk;
namespace Mono.TextEditor
{
@@ -1060,6 +1061,7 @@ namespace Mono.TextEditor
readonly object syncObject = new object();
CancellationTokenSource foldSegmentSrc;
+ object foldSegmentTaskLock = new object ();
Task foldSegmentTask;
public void UpdateFoldSegments (List<FoldSegment> newSegments, bool startTask = false, bool useApplicationInvoke = false, CancellationToken masterToken = default(CancellationToken))
@@ -1067,37 +1069,39 @@ namespace Mono.TextEditor
if (newSegments == null) {
return;
}
- InterruptFoldWorker ();
- bool update;
- if (!startTask) {
- var newFoldedSegments = UpdateFoldSegmentWorker (newSegments, out update);
- if (useApplicationInvoke) {
- Gtk.Application.Invoke (delegate {
+ lock (foldSegmentTaskLock) {
+ InterruptFoldWorker ();
+ bool update;
+ if (!startTask) {
+ var newFoldedSegments = UpdateFoldSegmentWorker (newSegments, out update);
+ if (useApplicationInvoke) {
+ Gtk.Application.Invoke (delegate {
+ foldedSegments = newFoldedSegments;
+ InformFoldTreeUpdated ();
+ });
+ } else {
foldedSegments = newFoldedSegments;
InformFoldTreeUpdated ();
- });
- } else {
- foldedSegments = newFoldedSegments;
- InformFoldTreeUpdated ();
- }
- return;
- }
- foldSegmentSrc = new CancellationTokenSource ();
- masterToken.Register (InterruptFoldWorker);
- var token = foldSegmentSrc.Token;
- foldSegmentTask = Task.Factory.StartNew (delegate {
- var segments = UpdateFoldSegmentWorker (newSegments, out update, token);
- if (token.IsCancellationRequested)
+ }
return;
- foldedSegments = segments;
- Gtk.Application.Invoke (delegate {
+ }
+ foldSegmentSrc = new CancellationTokenSource ();
+ masterToken.Register (InterruptFoldWorker);
+ var token = foldSegmentSrc.Token;
+ foldSegmentTask = Task.Factory.StartNew (delegate {
+ var segments = UpdateFoldSegmentWorker (newSegments, out update, token);
if (token.IsCancellationRequested)
return;
- InformFoldTreeUpdated ();
- if (update)
- CommitUpdateAll ();
- });
- }, token);
+ foldedSegments = segments;
+ Gtk.Application.Invoke (delegate {
+ if (token.IsCancellationRequested)
+ return;
+ InformFoldTreeUpdated ();
+ if (update)
+ CommitUpdateAll ();
+ });
+ }, token);
+ }
}
void RemoveFolding (FoldSegment folding)
@@ -1304,7 +1308,21 @@ namespace Mono.TextEditor
internal void InformFoldChanged (FoldSegmentEventArgs args)
{
- foldSegmentTask?.Wait ();
+ lock (foldSegmentTaskLock) {
+ if (foldSegmentTask != null) {
+ foldSegmentTask.ContinueWith (delegate {
+ Application.Invoke (delegate {
+ InternalInformFoldChanged (args);
+ });
+ });
+ } else {
+ InternalInformFoldChanged (args);
+ }
+ }
+ }
+
+ void InternalInformFoldChanged (FoldSegmentEventArgs args)
+ {
if (args.FoldSegment.IsFolded) {
foldedSegments.Add (args.FoldSegment);
} else {
@@ -1314,7 +1332,7 @@ namespace Mono.TextEditor
if (handler != null)
handler (this, args);
}
-
+
public event EventHandler<FoldSegmentEventArgs> Folded;
#endregion