Skip to content

Commit 47276fd

Browse files
committed
Improving mouse propagation in 3D3
1 parent 65cf46e commit 47276fd

2 files changed

Lines changed: 37 additions & 13 deletions

File tree

GuiAutomation/AggInputMethods.cs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,21 @@ private GuiWidget FindRootSystemWindow()
363363

364364
private static readonly uint ModifierKeyMask = ModifierKeyList.Aggregate(0u, (acc, v) => acc | (uint)v);
365365

366+
private static void TrySetModifierKeys(IPlatformWindow platformWindow, Keys mods)
367+
{
368+
var type = platformWindow.GetType();
369+
while (type != null)
370+
{
371+
var method = type.GetMethod("SetModifierKeys", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
372+
if (method != null)
373+
{
374+
method.Invoke(platformWindow, new object[] { mods });
375+
return;
376+
}
377+
type = type.BaseType;
378+
}
379+
}
380+
366381
public void PressModifierKeys(Keys modifierKeys)
367382
{
368383
var mods = (uint)modifierKeys & ModifierKeyMask;
@@ -402,12 +417,7 @@ void setModifiers(uint m, Keys key)
402417
setModifiers(mods, Keys.Control);
403418
setModifiers(mods, Keys.Alt);
404419

405-
var platformWindowType = systemWindow.PlatformWindow.GetType();
406-
if (platformWindowType.Name == "OpenGLSystemWindow")
407-
{
408-
var methodInfo = platformWindowType.GetMethod("SetModifierKeys", BindingFlags.Instance | BindingFlags.NonPublic);
409-
methodInfo.Invoke(systemWindow.PlatformWindow, new object[] { (Keys)mods });
410-
}
420+
TrySetModifierKeys(systemWindow.PlatformWindow, (Keys)mods);
411421

412422
systemWindow.OnKeyDown(keyDownEvent);
413423
}
@@ -451,12 +461,7 @@ void unsetModifier(uint m, Keys key)
451461
unsetModifier(mods, Keys.Control);
452462
unsetModifier(mods, Keys.Alt);
453463

454-
var platformWindowType = systemWindow.PlatformWindow.GetType();
455-
if (platformWindowType.Name == "OpenGLSystemWindow")
456-
{
457-
var methodInfo = platformWindowType.GetMethod("SetModifierKeys", BindingFlags.Instance | BindingFlags.NonPublic);
458-
methodInfo.Invoke(systemWindow.PlatformWindow, new object[] { (Keys)mods });
459-
}
464+
TrySetModifierKeys(systemWindow.PlatformWindow, (Keys)mods);
460465

461466
systemWindow.OnKeyUp(keyUpEvent);
462467
}

PlatformWin32/win32/WinformsSystemWindow.cs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,26 @@ protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
334334

335335
public ISystemWindowProvider WindowProvider { get; set; }
336336

337-
public new virtual Keys ModifierKeys => (Keys)Control.ModifierKeys;
337+
private Keys overrideModifierKeys = Keys.None;
338+
private bool modifiersOverridden = false;
339+
340+
internal void SetModifierKeys(Keys modifiers)
341+
{
342+
overrideModifierKeys = modifiers;
343+
modifiersOverridden = true;
344+
}
345+
346+
public new virtual Keys ModifierKeys
347+
{
348+
get
349+
{
350+
if (modifiersOverridden)
351+
{
352+
return overrideModifierKeys;
353+
}
354+
return (Keys)Control.ModifierKeys;
355+
}
356+
}
338357

339358
// TODO: Why is this member named Caption instead of Title?
340359
public string Caption

0 commit comments

Comments
 (0)