Skip to content

Commit 9c54ee4

Browse files
authored
Fixes 4088 mouse released flag cannot be combined safely with report position (#4091)
1 parent d82553b commit 9c54ee4

File tree

4 files changed

+26
-13
lines changed

4 files changed

+26
-13
lines changed

Examples/UICatalog/Properties/launchSettings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
},
1414
"UICatalog --driver v2win": {
1515
"commandName": "Project",
16-
"commandLineArgs": "--driver v2win"
16+
"commandLineArgs": "--driver v2win -dl Trace"
1717
},
1818
"UICatalog --driver v2net": {
1919
"commandName": "Project",

Terminal.Gui/ConsoleDrivers/V2/ConsoleDriverFacade.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Runtime.InteropServices;
2+
using Microsoft.Extensions.Logging;
23

34
namespace Terminal.Gui;
45

@@ -29,7 +30,11 @@ IWindowSizeMonitor windowSizeMonitor
2930

3031
InputProcessor.KeyDown += (s, e) => KeyDown?.Invoke (s, e);
3132
InputProcessor.KeyUp += (s, e) => KeyUp?.Invoke (s, e);
32-
InputProcessor.MouseEvent += (s, e) => MouseEvent?.Invoke (s, e);
33+
InputProcessor.MouseEvent += (s, e) =>
34+
{
35+
//Logging.Logger.LogTrace ($"Mouse {e.Flags} at x={e.ScreenPosition.X} y={e.ScreenPosition.Y}");
36+
MouseEvent?.Invoke (s, e);
37+
};
3338

3439
windowSizeMonitor.SizeChanging += (_, e) => SizeChanged?.Invoke (this, e);
3540

Terminal.Gui/ConsoleDrivers/V2/WindowsInputProcessor.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ public MouseEventArgs ToDriverMouse (MouseEventRecord e)
8787
mouseFlags = UpdateMouseFlags (mouseFlags, e.ButtonState, ButtonState.Button2Pressed, MouseFlags.Button2Pressed, MouseFlags.Button2Released, 1);
8888
mouseFlags = UpdateMouseFlags (mouseFlags, e.ButtonState, ButtonState.Button4Pressed, MouseFlags.Button4Pressed, MouseFlags.Button4Released, 3);
8989

90+
9091
// Deal with button 3 separately because it is considered same as 'rightmost button'
9192
if (e.ButtonState.HasFlag (ButtonState.Button3Pressed) || e.ButtonState.HasFlag (ButtonState.RightmostButtonPressed))
9293
{
@@ -98,6 +99,10 @@ public MouseEventArgs ToDriverMouse (MouseEventRecord e)
9899
if (_lastWasPressed [2])
99100
{
100101
mouseFlags |= MouseFlags.Button3Released;
102+
103+
// Removes the moved flag when raising released flags (see https://github.com/gui-cs/Terminal.Gui/issues/4088)
104+
mouseFlags &= ~MouseFlags.ReportMousePosition;
105+
101106
_lastWasPressed [2] = false;
102107
}
103108
}
@@ -148,6 +153,9 @@ int buttonIndex
148153
if (_lastWasPressed [buttonIndex])
149154
{
150155
current |= releasedFlag;
156+
157+
// Removes the moved flag when raising released flags (see https://github.com/gui-cs/Terminal.Gui/issues/4088)
158+
current &= ~MouseFlags.ReportMousePosition;
151159
_lastWasPressed [buttonIndex] = false;
152160
}
153161
}

Tests/UnitTests/ConsoleDrivers/V2/WindowsInputProcessorTests.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ public static IEnumerable<object []> MouseFlagTestData ()
200200
new []
201201
{
202202
Tuple.Create (ButtonState.Button1Pressed, MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition),
203-
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.Button1Released | MouseFlags.ReportMousePosition),
203+
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.Button1Released),
204204
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.ReportMousePosition | MouseFlags.ReportMousePosition)
205205
}
206206
};
@@ -210,7 +210,7 @@ public static IEnumerable<object []> MouseFlagTestData ()
210210
new []
211211
{
212212
Tuple.Create (ButtonState.Button2Pressed, MouseFlags.Button2Pressed | MouseFlags.ReportMousePosition),
213-
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.Button2Released | MouseFlags.ReportMousePosition),
213+
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.Button2Released),
214214
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.ReportMousePosition | MouseFlags.ReportMousePosition)
215215
}
216216
};
@@ -220,7 +220,7 @@ public static IEnumerable<object []> MouseFlagTestData ()
220220
new []
221221
{
222222
Tuple.Create (ButtonState.Button3Pressed, MouseFlags.Button3Pressed | MouseFlags.ReportMousePosition),
223-
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.Button3Released | MouseFlags.ReportMousePosition),
223+
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.Button3Released),
224224
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.ReportMousePosition | MouseFlags.ReportMousePosition)
225225
}
226226
};
@@ -230,7 +230,7 @@ public static IEnumerable<object []> MouseFlagTestData ()
230230
new []
231231
{
232232
Tuple.Create (ButtonState.Button4Pressed, MouseFlags.Button4Pressed | MouseFlags.ReportMousePosition),
233-
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.Button4Released | MouseFlags.ReportMousePosition),
233+
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.Button4Released),
234234
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.ReportMousePosition | MouseFlags.ReportMousePosition)
235235
}
236236
};
@@ -240,7 +240,7 @@ public static IEnumerable<object []> MouseFlagTestData ()
240240
new []
241241
{
242242
Tuple.Create (ButtonState.RightmostButtonPressed, MouseFlags.Button3Pressed | MouseFlags.ReportMousePosition),
243-
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.Button3Released | MouseFlags.ReportMousePosition),
243+
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.Button3Released),
244244
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.ReportMousePosition | MouseFlags.ReportMousePosition)
245245
}
246246
};
@@ -253,8 +253,8 @@ public static IEnumerable<object []> MouseFlagTestData ()
253253
Tuple.Create (
254254
ButtonState.Button1Pressed | ButtonState.Button2Pressed,
255255
MouseFlags.Button1Pressed | MouseFlags.Button2Pressed | MouseFlags.ReportMousePosition),
256-
Tuple.Create (ButtonState.Button1Pressed, MouseFlags.Button1Pressed | MouseFlags.Button2Released | MouseFlags.ReportMousePosition),
257-
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.Button1Released | MouseFlags.ReportMousePosition),
256+
Tuple.Create (ButtonState.Button1Pressed, MouseFlags.Button1Pressed | MouseFlags.Button2Released),
257+
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.Button1Released),
258258
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.ReportMousePosition)
259259
}
260260
};
@@ -266,8 +266,8 @@ public static IEnumerable<object []> MouseFlagTestData ()
266266
Tuple.Create (
267267
ButtonState.Button3Pressed | ButtonState.Button4Pressed,
268268
MouseFlags.Button3Pressed | MouseFlags.Button4Pressed | MouseFlags.ReportMousePosition),
269-
Tuple.Create (ButtonState.Button3Pressed, MouseFlags.Button3Pressed | MouseFlags.Button4Released | MouseFlags.ReportMousePosition),
270-
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.Button3Released | MouseFlags.ReportMousePosition),
269+
Tuple.Create (ButtonState.Button3Pressed, MouseFlags.Button3Pressed | MouseFlags.Button4Released),
270+
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.Button3Released),
271271
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.ReportMousePosition)
272272
}
273273
};
@@ -280,7 +280,7 @@ public static IEnumerable<object []> MouseFlagTestData ()
280280
Tuple.Create (
281281
ButtonState.Button1Pressed | ButtonState.Button2Pressed,
282282
MouseFlags.Button1Pressed | MouseFlags.Button2Pressed | MouseFlags.ReportMousePosition),
283-
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.Button1Released | MouseFlags.Button2Released | MouseFlags.ReportMousePosition),
283+
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.Button1Released | MouseFlags.Button2Released),
284284
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.ReportMousePosition)
285285
}
286286
};
@@ -297,7 +297,7 @@ public static IEnumerable<object []> MouseFlagTestData ()
297297
Tuple.Create (ButtonState.RightmostButtonPressed, MouseFlags.Button3Pressed | MouseFlags.ReportMousePosition),
298298

299299
// Now with neither we get released
300-
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.Button3Released | MouseFlags.ReportMousePosition),
300+
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.Button3Released),
301301
Tuple.Create (ButtonState.NoButtonPressed, MouseFlags.ReportMousePosition)
302302
}
303303
};

0 commit comments

Comments
 (0)