git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commitd6800df3f28b0688aa2109d6cd935560516dc39a
parent549720173f
authorIsaac Freund <[email protected]>
date2024-01-01 09:31
TextInput: fix consecutive enable requests

The wording of the text-input-v3 protocol is quite confusing here
but I'm pretty sure this is now correct.

 river/TextInput.zig | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/river/TextInput.zig b/river/TextInput.zig
index 56661b2..2b6af49 100644
--- a/river/TextInput.zig
+++ b/river/TextInput.zig
@@ -66,9 +66,14 @@ fn handleEnable(listener: *wl.Listener(*wlr.TextInputV3), _: *wlr.TextInputV3) v
     const text_input = @fieldParentPtr(TextInput, "enable", listener);
     const seat: *Seat = @ptrFromInt(text_input.wlr_text_input.seat.data);
 
-    if (seat.relay.text_input != null) {
-        log.err("client requested to enable more than one text input on a single seat, ignoring request", .{});
-        return;
+    // The same text_input object may be enabled multiple times consecutively
+    // without first disabling it. Enabling a different text input object without
+    // first disabling the current one is disallowed by the protocol however.
+    if (seat.relay.text_input) |currently_enabled| {
+        if (text_input != currently_enabled) {
+            log.err("client requested to enable more than one text input on a single seat, ignoring request", .{});
+            return;
+        }
     }
 
     seat.relay.text_input = text_input;