@@ -13,7 +13,6 @@ public sealed class Message
13
13
readonly string processName ;
14
14
readonly ImageSource processIcon ;
15
15
readonly string shortcutName ;
16
- readonly bool canBeMerged ;
17
16
readonly bool isShortcut ;
18
17
readonly bool isDeleting ;
19
18
readonly DateTime lastMessage ;
@@ -29,7 +28,6 @@ public Message(KeyPress key)
29
28
{
30
29
processName = key . Process . ProcessName ;
31
30
processIcon = key . Process . ProcessIcon ;
32
- canBeMerged = ! key . HasModifierPressed ;
33
31
34
32
keys = new ReadOnlyCollection < KeyPress > ( new [ ] { key } ) ;
35
33
textCollection = new ReadOnlyCollection < string > ( CreateTextSequence ( key ) . ToArray ( ) ) ;
@@ -49,7 +47,6 @@ public Message(IEnumerable<KeyPress> keys, KeyShortcut shortcut)
49
47
processIcon = allKeys . First ( ) . Process . ProcessIcon ;
50
48
shortcutName = shortcut . Name ;
51
49
isShortcut = true ;
52
- canBeMerged = false ;
53
50
54
51
this . keys = new ReadOnlyCollection < KeyPress > ( allKeys ) ;
55
52
@@ -63,7 +60,6 @@ private Message(Message initial, Message appended)
63
60
: this ( initial . keys . Concat ( appended . keys ) , new KeyShortcut ( initial . ShortcutName ) )
64
61
{
65
62
previous = initial ;
66
- canBeMerged = true ;
67
63
}
68
64
69
65
private Message ( Message initial , bool isDeleting )
@@ -74,14 +70,18 @@ private Message(Message initial, bool isDeleting)
74
70
lastMessage = initial . lastMessage ;
75
71
}
76
72
73
+ private Message ( Message initial , Message replacer , bool replace )
74
+ : this ( replacer . keys , new KeyShortcut ( replacer . ShortcutName ) )
75
+ {
76
+ previous = initial ;
77
+ }
78
+
77
79
public string ProcessName { get { return processName ; } }
78
80
79
81
public ImageSource ProcessIcon { get { return processIcon ; } }
80
82
81
83
public string ShortcutName { get { return shortcutName ; } }
82
84
83
- public bool CanBeMerged { get { return canBeMerged ; } }
84
-
85
85
public bool IsShortcut { get { return isShortcut ; } }
86
86
87
87
public Message Previous { get { return previous ; } }
@@ -97,21 +97,35 @@ public Message Merge(Message other)
97
97
return new Message ( this , other ) ;
98
98
}
99
99
100
- static readonly TimeSpan OneSecond = TimeSpan . FromSeconds ( 1 ) ;
100
+ public Message Replace ( Message newMessage )
101
+ {
102
+ return new Message ( this , newMessage , true ) ;
103
+ }
104
+
105
+ static readonly TimeSpan OneSecond = TimeSpan . FromSeconds ( 1 ) ;
101
106
102
107
public static Message MergeIfNeeded ( Message previousMessage , Message newMessage )
103
108
{
104
- return ShouldCreateNewMessage ( previousMessage , newMessage )
105
- ? newMessage
106
- : previousMessage . Merge ( newMessage ) ;
109
+ // replace key was after standalone modifier keypress, replace by new Message
110
+ if ( previousMessage . keys != null && KeyProvider . IsModifierKeyPress ( previousMessage . keys [ 0 ] . InterceptKeyEventArgs ) )
111
+ {
112
+ return previousMessage . Replace ( newMessage ) ;
113
+ }
114
+
115
+ if ( ShouldCreateNewMessage ( previousMessage , newMessage ) )
116
+ {
117
+ return newMessage ;
118
+ }
119
+ return previousMessage . Merge ( newMessage ) ;
107
120
}
108
121
109
122
static bool ShouldCreateNewMessage ( Message previous , Message current )
110
123
{
111
124
return previous . ProcessName != current . ProcessName ||
112
125
current . LastMessage . Subtract ( previous . LastMessage ) > OneSecond ||
113
- ! previous . CanBeMerged ||
114
- ! current . CanBeMerged ;
126
+ KeyProvider . IsModifierKeyPress ( current . keys [ 0 ] . InterceptKeyEventArgs ) ||
127
+ // accumulate also same modifier shortcuts
128
+ ( previous . keys [ 0 ] . HasModifierPressed && ! previous . keys [ 0 ] . Input . SequenceEqual ( current . keys [ 0 ] . Input ) ) ;
115
129
}
116
130
117
131
public Message FadeOut ( )
@@ -204,7 +218,6 @@ bool Equals(Message other)
204
218
&& string . Equals ( processName , other . processName )
205
219
&& Equals ( processIcon , other . processIcon )
206
220
&& string . Equals ( shortcutName , other . shortcutName )
207
- && canBeMerged . Equals ( other . canBeMerged )
208
221
&& isShortcut . Equals ( other . isShortcut )
209
222
&& isDeleting . Equals ( other . isDeleting )
210
223
&& lastMessage . Equals ( other . lastMessage ) ;
@@ -227,7 +240,6 @@ public override int GetHashCode()
227
240
hashCode = ( hashCode * 397 ) ^ ( processName != null ? processName . GetHashCode ( ) : 0 ) ;
228
241
hashCode = ( hashCode * 397 ) ^ ( processIcon != null ? processIcon . GetHashCode ( ) : 0 ) ;
229
242
hashCode = ( hashCode * 397 ) ^ ( shortcutName != null ? shortcutName . GetHashCode ( ) : 0 ) ;
230
- hashCode = ( hashCode * 397 ) ^ canBeMerged . GetHashCode ( ) ;
231
243
hashCode = ( hashCode * 397 ) ^ isShortcut . GetHashCode ( ) ;
232
244
hashCode = ( hashCode * 397 ) ^ isDeleting . GetHashCode ( ) ;
233
245
hashCode = ( hashCode * 397 ) ^ lastMessage . GetHashCode ( ) ;
0 commit comments