fix: various keybind fixes (modifiers and linkshells)
- Avoids overriding modifiers after leaving a vanilla text box. This would prevent you from holding e.g. Ctrl between multiple vanilla text boxes. - Reworks linkshell rotation code to fix issues with LS number gaps causing linkshell rotation to not function.
This commit is contained in:
@@ -354,6 +354,55 @@ internal sealed unsafe class Chat : IDisposable
|
||||
return InfoProxyCrossWorldLinkshell.Instance()->CrossWorldLinkshells[(int) idx].Name.Length > 0;
|
||||
}
|
||||
|
||||
private static uint? RotateLinkshell(uint currentIndex, RotateMode rotate, Func<uint, bool> validFn)
|
||||
{
|
||||
if (rotate == RotateMode.None)
|
||||
return null;
|
||||
var delta = rotate switch
|
||||
{
|
||||
RotateMode.Forward => 1,
|
||||
RotateMode.Reverse => -1,
|
||||
};
|
||||
|
||||
// Iterate up to 8 times to find a valid linkshell.
|
||||
for (var i = 0; i < 8; i++)
|
||||
{
|
||||
currentIndex = (uint) ((8 + currentIndex + delta) % 8);
|
||||
if (validFn(currentIndex))
|
||||
return currentIndex;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
internal static InputChannel? ResolveTempInputChannel(InputChannel? currentTempChannel, InputChannel channel, RotateMode rotate)
|
||||
{
|
||||
switch (channel)
|
||||
{
|
||||
case InputChannel.Linkshell1 or InputChannel.CrossLinkshell1 when rotate != RotateMode.None:
|
||||
{
|
||||
// If we're activating for the first time, start at the beginning
|
||||
// or end of the linkshell list depending on the rotate mode.
|
||||
var currentIndex = rotate == RotateMode.Forward ? 7u : 0u;
|
||||
if (currentTempChannel != null)
|
||||
{
|
||||
switch (channel)
|
||||
{
|
||||
case InputChannel.Linkshell1 when currentTempChannel.Value.IsLinkshell():
|
||||
case InputChannel.CrossLinkshell1 when currentTempChannel.Value.IsCrossLinkshell():
|
||||
currentIndex = currentTempChannel.Value.LinkshellIndex();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var idx = RotateLinkshell(currentIndex, rotate, channel == InputChannel.Linkshell1 ? ValidLinkshell : ValidCrossLinkshell);
|
||||
return channel + idx;
|
||||
}
|
||||
default:
|
||||
return channel;
|
||||
}
|
||||
}
|
||||
|
||||
internal static void SetChannel(InputChannel channel, string? tellTarget = null)
|
||||
{
|
||||
// ExtraChat linkshells aren't supported in game so we never want to
|
||||
|
||||
@@ -396,11 +396,13 @@ internal unsafe class KeybindManager : IDisposable {
|
||||
return;
|
||||
}
|
||||
|
||||
// If the vanilla text input has just lost focus, clear all keys so we
|
||||
// don't try to process them immediately.
|
||||
// If the vanilla text input has just lost focus, clear all non-modifier
|
||||
// keys so we don't try to process them immediately on the next frame.
|
||||
if (VanillaTextInputHasFocus)
|
||||
{
|
||||
Plugin.KeyState.ClearAll();
|
||||
foreach (var key in Plugin.KeyState.GetValidVirtualKeys())
|
||||
if (key is not VirtualKey.CONTROL and not VirtualKey.SHIFT and not VirtualKey.MENU)
|
||||
Plugin.KeyState[key] = false;
|
||||
VanillaTextInputHasFocus = false;
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user