diff --git a/Dalamud/Interface/Internal/DalamudIme.cs b/Dalamud/Interface/Internal/DalamudIme.cs
index 6535228a7..718ec53e6 100644
--- a/Dalamud/Interface/Internal/DalamudIme.cs
+++ b/Dalamud/Interface/Internal/DalamudIme.cs
@@ -55,12 +55,12 @@ internal sealed unsafe class DalamudIme : IDisposable, IServiceType
return textState.CursorAnim % 1.2f <= 0.8f;
}
}
-
+
///
/// Gets the cursor position, in screen coordinates.
///
internal Vector2 CursorPos { get; private set; }
-
+
///
/// Gets the associated viewport.
///
@@ -101,7 +101,7 @@ internal sealed unsafe class DalamudIme : IDisposable, IServiceType
///
internal bool ShowPartialConversion => this.PartialConversionFrom != 0 ||
this.PartialConversionTo != this.ImmComp.Length;
-
+
///
/// Gets the input mode icon from .
///
@@ -139,15 +139,17 @@ internal sealed unsafe class DalamudIme : IDisposable, IServiceType
switch (args.Message)
{
- case WM.WM_IME_NOTIFY when (nint)args.WParam is IMN.IMN_OPENCANDIDATE or IMN.IMN_CLOSECANDIDATE or IMN.IMN_CHANGECANDIDATE:
+ case WM.WM_IME_NOTIFY
+ when (nint)args.WParam is IMN.IMN_OPENCANDIDATE or IMN.IMN_CLOSECANDIDATE
+ or IMN.IMN_CHANGECANDIDATE:
this.UpdateImeWindowStatus(hImc);
args.SuppressAndReturn(0);
break;
-
+
case WM.WM_IME_STARTCOMPOSITION:
args.SuppressAndReturn(0);
break;
-
+
case WM.WM_IME_COMPOSITION:
if (invalidTarget)
ImmNotifyIME(hImc, NI.NI_COMPOSITIONSTR, CPS_CANCEL, 0);
@@ -162,12 +164,12 @@ internal sealed unsafe class DalamudIme : IDisposable, IServiceType
// Log.Verbose($"{nameof(WM.WM_IME_ENDCOMPOSITION)}({(nint)args.WParam:X}, {(nint)args.LParam:X}): {this.ImmComp}");
args.SuppressAndReturn(0);
break;
-
+
case WM.WM_IME_CONTROL:
// Log.Verbose($"{nameof(WM.WM_IME_CONTROL)}({(nint)args.WParam:X}, {(nint)args.LParam:X}): {this.ImmComp}");
args.SuppressAndReturn(0);
break;
-
+
case WM.WM_IME_REQUEST:
// Log.Verbose($"{nameof(WM.WM_IME_REQUEST)}({(nint)args.WParam:X}, {(nint)args.LParam:X}): {this.ImmComp}");
args.SuppressAndReturn(0);
@@ -180,11 +182,31 @@ internal sealed unsafe class DalamudIme : IDisposable, IServiceType
// Log.Verbose($"{nameof(WM.WM_IME_SETCONTEXT)}({(nint)args.WParam:X}, {(nint)args.LParam:X}): {this.ImmComp}");
args.SuppressWithDefault();
break;
-
+
case WM.WM_IME_NOTIFY:
// Log.Verbose($"{nameof(WM.WM_IME_NOTIFY)}({(nint)args.WParam:X}): {this.ImmComp}");
break;
+ case WM.WM_KEYDOWN when (int)args.WParam is
+ VK.VK_TAB
+ or VK.VK_PRIOR
+ or VK.VK_NEXT
+ or VK.VK_END
+ or VK.VK_HOME
+ or VK.VK_LEFT
+ or VK.VK_UP
+ or VK.VK_RIGHT
+ or VK.VK_DOWN
+ or VK.VK_RETURN:
+ if (this.ImmCand.Count != 0)
+ {
+ TextState.Stb.SelectStart = TextState.Stb.Cursor = TextState.Stb.SelectEnd;
+ ImmNotifyIME(hImc, NI.NI_COMPOSITIONSTR, CPS_CANCEL, 0);
+ args.WParam = VK.VK_PROCESSKEY;
+ }
+
+ break;
+
case WM.WM_LBUTTONDOWN:
case WM.WM_RBUTTONDOWN:
case WM.WM_MBUTTONDOWN:
@@ -192,7 +214,7 @@ internal sealed unsafe class DalamudIme : IDisposable, IServiceType
ImmNotifyIME(hImc, NI.NI_COMPOSITIONSTR, CPS_COMPLETE, 0);
break;
}
-
+
this.UpdateInputLanguage(hImc);
}
finally
@@ -220,7 +242,7 @@ internal sealed unsafe class DalamudIme : IDisposable, IServiceType
ImmGetConversionStatus(hImc, &conv, &sent);
var lang = GetKeyboardLayout(0);
var open = ImmGetOpenStatus(hImc) != false;
-
+
// Log.Verbose($"{nameof(this.UpdateInputLanguage)}: conv={conv:X} sent={sent:X} open={open} lang={lang:X}");
var native = (conv & 1) != 0;
@@ -285,8 +307,8 @@ internal sealed unsafe class DalamudIme : IDisposable, IServiceType
(s, e) = (e, s);
var newString = finalCommit
- ? ImmGetCompositionString(hImc, GCS.GCS_RESULTSTR)
- : ImmGetCompositionString(hImc, GCS.GCS_COMPSTR);
+ ? ImmGetCompositionString(hImc, GCS.GCS_RESULTSTR)
+ : ImmGetCompositionString(hImc, GCS.GCS_COMPSTR);
if (s != e)
textState.DeleteChars(s, e - s);
@@ -303,13 +325,13 @@ internal sealed unsafe class DalamudIme : IDisposable, IServiceType
finalCommit
? 0
: ImmGetCompositionStringW(hImc, GCS.GCS_CURSORPOS, null, 0);
-
+
if (finalCommit)
{
this.ClearState(hImc);
return;
}
-
+
if ((comp & GCS.GCS_COMPATTR) != 0)
{
var attrLength = ImmGetCompositionStringW(hImc, GCS.GCS_COMPATTR, null, 0);
@@ -349,7 +371,7 @@ internal sealed unsafe class DalamudIme : IDisposable, IServiceType
ref var textState = ref TextState;
textState.Stb.Cursor = textState.Stb.SelectStart = textState.Stb.SelectEnd;
-
+
Log.Information($"{nameof(this.ClearState)}");
}