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. ///