<table><tr><td style="">graesslin created this revision.<br />Restricted Application added a project: KWin.<br />Restricted Application added subscribers: kwin, plasma-devel.
</td><a style="text-decoration: none; padding: 4px 8px; margin: 0 8px 8px; float: right; color: #464C5C; font-weight: bold; border-radius: 3px; background-color: #F7F7F9; background-image: linear-gradient(to bottom,#fff,#f1f0f1); display: inline-block; border: 1px solid rgba(71,87,120,.2);" href="https://phabricator.kde.org/D5452" rel="noreferrer">View Revision</a></tr></table><br /><div><strong>REVISION SUMMARY</strong><div><p>Consider the case that capslock gets pressed and released.<br />
In the case of Weston we have a sequence of:</p>

<ol class="remarkup-list">
<li class="remarkup-list-item">Key press event</li>
<li class="remarkup-list-item">Modifier changed event</li>
<li class="remarkup-list-item">Key release event</li>
<li class="remarkup-list-item">Modifier changed event</li>
</ol>

<p>KWin however used to send the events in the following sequence:</p>

<ol class="remarkup-list">
<li class="remarkup-list-item">Modifier changed event (on key press)</li>
<li class="remarkup-list-item">Key press event</li>
<li class="remarkup-list-item">Modifier changed event (on key release)</li>
<li class="remarkup-list-item">Key release event</li>
</ol>

<p>It looks like Xwayland is not able to properly process the sequence<br />
sent by KWin. And in fact KWin's sequence is wrong as it sends a state<br />
which does not match. We report that the caps lock is pressed in the<br />
modifiers prior to the application getting informed about the key press<br />
of caps lock.</p>

<p>This change aligns KWin's implementation to the behavior of Weston. The<br />
main difference is that when modifiers change Xkb internally caches the<br />
serialized modifier states. And KeyboardInputRedirection just forwards<br />
the modifiers to KWayland::Server::SeatInterface once the processing has<br />
finished. SeatInterface ignores the forwarding if no states changes, so<br />
it is fine to do it that way.</p>

<p>BUG: 377155</p></div></div><br /><div><strong>TEST PLAN</strong><div><p>Not yet tested with an affected Xwayland as I only have 1.18 and the<br />
problem started with 1.19. But verified the sequence of events with WAYLAND_DEBUG<br />
and caps lock stil working in QtWayland clients and Xwayland 1.18</p></div></div><br /><div><strong>REPOSITORY</strong><div><div>R108 KWin</div></div></div><br /><div><strong>BRANCH</strong><div><div>modifiers-after-key</div></div></div><br /><div><strong>REVISION DETAIL</strong><div><a href="https://phabricator.kde.org/D5452" rel="noreferrer">https://phabricator.kde.org/D5452</a></div></div><br /><div><strong>AFFECTED FILES</strong><div><div>keyboard_input.cpp<br />
xkb.cpp<br />
xkb.h</div></div></div><br /><div><strong>To: </strong>graesslin, KWin, Plasma<br /><strong>Cc: </strong>plasma-devel, kwin, spstarr, progwolff, lesliezhai, ali-mohamed, hardening, jensreuterberg, abetts, sebas, apol<br /></div>