Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion Terminal.Gui/Core/Application.cs
Original file line number Diff line number Diff line change
Expand Up @@ -638,6 +638,11 @@ static void ProcessMouseEvent (MouseEvent me)
}
RootMouseEvent?.Invoke (me);
if (mouseGrabView != null) {
if (view == null) {
UngrabMouse ();
return;
}

var newxy = mouseGrabView.ScreenToView (me.X, me.Y);
var nme = new MouseEvent () {
X = newxy.X,
Expand All @@ -653,7 +658,9 @@ static void ProcessMouseEvent (MouseEvent me)
// System.Diagnostics.Debug.WriteLine ($"{nme.Flags};{nme.X};{nme.Y};{mouseGrabView}");
if (mouseGrabView != null) {
mouseGrabView.OnMouseEvent (nme);
return;
if (mouseGrabView != null) {
return;
}
}
}

Expand Down
1 change: 0 additions & 1 deletion Terminal.Gui/Views/ScrollView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -517,7 +517,6 @@ public override bool MouseEvent (MouseEvent me)
horizontal.MouseEvent (me);
} else if (IsOverridden (me.View)) {
Application.UngrabMouse ();
return false;
}
return true;
}
Expand Down
82 changes: 82 additions & 0 deletions UnitTests/ApplicationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1408,5 +1408,87 @@ public void SynchronizationContext_CreateCopy ()

Application.Shutdown ();
}

[Fact, AutoInitShutdown]
public void MouseGrabView_WithNullMouseEventView ()
{
var tf = new TextField () { Width = 10 };
var sv = new ScrollView () {
Width = Dim.Fill (),
Height = Dim.Fill (),
ContentSize = new Size (100, 100)
};

sv.Add (tf);
Application.Top.Add (sv);

var iterations = -1;

Application.Iteration = () => {
iterations++;
if (iterations == 0) {
Assert.True (tf.HasFocus);
Assert.Null (Application.mouseGrabView);

ReflectionTools.InvokePrivate (
typeof (Application),
"ProcessMouseEvent",
new MouseEvent () {
X = 5,
Y = 5,
Flags = MouseFlags.ReportMousePosition
});

Assert.Equal (sv, Application.mouseGrabView);

MessageBox.Query ("Title", "Test", "Ok");

Assert.Null (Application.mouseGrabView);
} else if (iterations == 1) {
Assert.Equal (sv, Application.mouseGrabView);

ReflectionTools.InvokePrivate (
typeof (Application),
"ProcessMouseEvent",
new MouseEvent () {
X = 5,
Y = 5,
Flags = MouseFlags.ReportMousePosition
});

Assert.Null (Application.mouseGrabView);

ReflectionTools.InvokePrivate (
typeof (Application),
"ProcessMouseEvent",
new MouseEvent () {
X = 40,
Y = 12,
Flags = MouseFlags.ReportMousePosition
});

Assert.Null (Application.mouseGrabView);

ReflectionTools.InvokePrivate (
typeof (Application),
"ProcessMouseEvent",
new MouseEvent () {
X = 0,
Y = 0,
Flags = MouseFlags.Button1Pressed
});

Assert.Null (Application.mouseGrabView);

Application.RequestStop ();
} else if (iterations == 2) {
Assert.Null (Application.mouseGrabView);

Application.RequestStop ();
}
};

Application.Run ();
}
}
}
35 changes: 35 additions & 0 deletions UnitTests/ReflectionTools.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using System;
using System.Reflection;

public static class ReflectionTools {
// If the class is non-static
public static Object InvokePrivate (Object objectUnderTest, string method, params object [] args)
{
Type t = objectUnderTest.GetType ();
return t.InvokeMember (method,
BindingFlags.InvokeMethod |
BindingFlags.NonPublic |
BindingFlags.Instance |
BindingFlags.Static,
null,
objectUnderTest,
args);
}
// if the class is static
public static Object InvokePrivate (Type typeOfObjectUnderTest, string method, params object [] args)
{
MemberInfo [] members = typeOfObjectUnderTest.GetMembers (BindingFlags.NonPublic | BindingFlags.Static);
foreach (var member in members) {
if (member.Name == method) {
return typeOfObjectUnderTest.InvokeMember (method,
BindingFlags.NonPublic |
BindingFlags.Static |
BindingFlags.InvokeMethod,
null,
typeOfObjectUnderTest,
args);
}
}
return null;
}
}