From eb44a5c44aa43a383ef671c8b82759c14a92900e Mon Sep 17 00:00:00 2001
From: Susko3 <16479013+Susko3@users.noreply.github.com>
Date: Fri, 17 Dec 2021 13:02:42 +0100
Subject: [PATCH] Add code path for handling window messages
Some IME messages didn't get sent trough `SDL_SetWindowsMessageHook`, so this alternative is required.
---
osu.Framework/Platform/SDL2/SDL2Extensions.cs | 31 +++++++++++++++++++
osu.Framework/Platform/SDL2DesktopWindow.cs | 17 ++++++++++
2 files changed, 48 insertions(+)
diff --git a/osu.Framework/Platform/SDL2/SDL2Extensions.cs b/osu.Framework/Platform/SDL2/SDL2Extensions.cs
index d7aef492b5..e40ec4bdf1 100644
--- a/osu.Framework/Platform/SDL2/SDL2Extensions.cs
+++ b/osu.Framework/Platform/SDL2/SDL2Extensions.cs
@@ -1011,5 +1011,36 @@ public static unsafe bool TryGetStringFromBytePointer(byte* bytePointer, out str
str = Marshal.PtrToStringUTF8(ptr) ?? string.Empty;
return true;
}
+
+ // ReSharper disable InconsistentNaming (mimics SDL and SDL2-CS naming)
+ // ReSharper disable IdentifierTypo
+
+ [StructLayout(LayoutKind.Sequential)]
+ internal struct INTERNAL_windows_wmmsg
+ {
+ public IntPtr hwnd;
+ public uint msg;
+ public ulong wParam;
+ public long lParam;
+ }
+
+ [StructLayout(LayoutKind.Explicit)]
+ internal struct INTERNAL_SysWMmsgUnion
+ {
+ [FieldOffset(0)]
+ public INTERNAL_windows_wmmsg win;
+ // could add more native events here if required
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ internal struct SDL_SysWMmsg
+ {
+ public SDL.SDL_version version;
+ public SDL.SDL_SYSWM_TYPE subsystem;
+ public INTERNAL_SysWMmsgUnion msg;
+ }
+
+ // ReSharper restore InconsistentNaming
+ // ReSharper restore IdentifierTypo
}
}
diff --git a/osu.Framework/Platform/SDL2DesktopWindow.cs b/osu.Framework/Platform/SDL2DesktopWindow.cs
index cb2cd73585..c9d9857889 100644
--- a/osu.Framework/Platform/SDL2DesktopWindow.cs
+++ b/osu.Framework/Platform/SDL2DesktopWindow.cs
@@ -718,6 +718,10 @@ private void handleSDLEvent(SDL.SDL_Event e)
case SDL.SDL_EventType.SDL_DROPCOMPLETE:
handleDropEvent(e.drop);
break;
+
+ case SDL.SDL_EventType.SDL_SYSWMEVENT:
+ HandleSysWMEvent(e.syswm);
+ break;
}
}
@@ -986,6 +990,19 @@ private void handleWindowEvent(SDL.SDL_WindowEvent evtWindow)
}
}
+ ///
+ /// Override if platform requires special handling of native events.
+ ///
+ ///
+ /// Make sure to enable the events with
+ ///
+ /// SDL.SDL_EventState(SDL.SDL_EventType.SDL_SYSWMEVENT, SDL.SDL_ENABLE);
+ ///
+ ///
+ protected virtual void HandleSysWMEvent(SDL.SDL_SysWMEvent sysWM)
+ {
+ }
+
///
/// Should be run on a regular basis to check for external window state changes.
///