Skip to content

Commit ec1cd25

Browse files
committed
Support showing ctrl, alt, win keys pressed down without any other key
- Removed filtering of modifierkey to allow to handle them in ToInputs. - Filtered triggering of modifier display for modifierkeys themselves in ToInputs. - Exposed IsModifierKeyPress as static to be used in KeyPress and Messages. - KeyPress.HasModifierPress returns false if key is a modifierkey itself (allow the merging in Message). - Message disable repeat counting incrementing for modifierkeys themself, but still handling their repeat, in order for them to keep showing while keydown.
1 parent 6f2ae82 commit ec1cd25

File tree

3 files changed

+20
-6
lines changed

3 files changed

+20
-6
lines changed

src/Carnac.Logic/KeyProvider.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class KeyProvider : IKeyProvider
2020
readonly IPasswordModeService passwordModeService;
2121
readonly IDesktopLockEventService desktopLockEventService;
2222

23-
private readonly IList<Keys> modifierKeys =
23+
private static readonly IList<Keys> modifierKeys =
2424
new List<Keys>
2525
{
2626
Keys.LControlKey,
@@ -68,7 +68,7 @@ public IObservable<KeyPress> GetKeyStream()
6868

6969
var keyStreamSubsription = interceptKeysSource.GetKeyStream()
7070
.Select(DetectWindowsKey)
71-
.Where(k => !IsModifierKeyPress(k) && k.KeyDirection == KeyDirection.Down)
71+
.Where(k => k.KeyDirection == KeyDirection.Down)
7272
.Select(ToCarnacKeyPress)
7373
.Where(keypress => keypress != null)
7474
.Where(k => !passwordModeService.CheckPasswordMode(k.InterceptKeyEventArgs))
@@ -91,7 +91,7 @@ InterceptKeyEventArgs DetectWindowsKey(InterceptKeyEventArgs interceptKeyEventAr
9191
return interceptKeyEventArgs;
9292
}
9393

94-
bool IsModifierKeyPress(InterceptKeyEventArgs interceptKeyEventArgs)
94+
public static bool IsModifierKeyPress(InterceptKeyEventArgs interceptKeyEventArgs)
9595
{
9696
return modifierKeys.Contains(interceptKeyEventArgs.Key);
9797
}
@@ -123,6 +123,15 @@ static IEnumerable<string> ToInputs(bool isLetter, bool isWinKeyPressed, Interce
123123
var controlPressed = interceptKeyEventArgs.ControlPressed;
124124
var altPressed = interceptKeyEventArgs.AltPressed;
125125
var shiftPressed = interceptKeyEventArgs.ShiftPressed;
126+
127+
if (IsModifierKeyPress(interceptKeyEventArgs))
128+
{
129+
controlPressed = false;
130+
altPressed = false;
131+
shiftPressed = false;
132+
isWinKeyPressed = false;
133+
}
134+
126135
if (controlPressed)
127136
yield return "Ctrl";
128137
if (altPressed)

src/Carnac.Logic/Models/KeyPress.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ public bool HasModifierPressed
2424
{
2525
get
2626
{
27-
return InterceptKeyEventArgs.AltPressed
27+
return !KeyProvider.IsModifierKeyPress(InterceptKeyEventArgs) && (InterceptKeyEventArgs.AltPressed
2828
|| InterceptKeyEventArgs.ControlPressed
29-
|| WinkeyPressed;
29+
|| WinkeyPressed);
3030
}
3131
}
3232

src/Carnac.Logic/Models/Message.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ private sealed class RepeatedKeyPress
160160
readonly bool requiresPrefix;
161161
readonly bool nextRequiresSeperator;
162162
readonly string[] textParts;
163+
readonly bool isRepeatable;
163164
int repeatCount;
164165

165166
public RepeatedKeyPress(KeyPress keyPress, bool requiresPrefix = false)
@@ -168,13 +169,17 @@ public RepeatedKeyPress(KeyPress keyPress, bool requiresPrefix = false)
168169
textParts = keyPress.GetTextParts().ToArray();
169170
this.requiresPrefix = requiresPrefix;
170171
repeatCount = 1;
172+
isRepeatable = !KeyProvider.IsModifierKeyPress(keyPress.InterceptKeyEventArgs);
171173
}
172174

173175
public bool NextRequiresSeperator { get { return nextRequiresSeperator; } }
174176

175177
public void IncrementRepeat()
176178
{
177-
repeatCount++;
179+
if (isRepeatable)
180+
{
181+
repeatCount++;
182+
}
178183
}
179184

180185
public bool IsRepeatedBy(KeyPress nextKeyPress)

0 commit comments

Comments
 (0)