From a14b5d74b30b877f425b7353c155d519d1613949 Mon Sep 17 00:00:00 2001 From: hayandev Date: Thu, 23 Jan 2025 00:15:06 +0900 Subject: [PATCH] text-input: Ensure only one enabled text-input resource at a time --- src/wayland/text_input/text_input_handle.rs | 26 +++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/wayland/text_input/text_input_handle.rs b/src/wayland/text_input/text_input_handle.rs index b042f451f8e8..f2bd50805126 100644 --- a/src/wayland/text_input/text_input_handle.rs +++ b/src/wayland/text_input/text_input_handle.rs @@ -2,7 +2,7 @@ use std::sync::{Arc, Mutex}; use tracing::debug; use wayland_protocols::wp::text_input::zv3::server::zwp_text_input_v3::{self, ZwpTextInputV3}; -use wayland_server::backend::ClientId; +use wayland_server::backend::{ClientId, ObjectId}; use wayland_server::{protocol::wl_surface::WlSurface, Dispatch, Resource}; use crate::input::SeatHandler; @@ -21,6 +21,7 @@ struct Instance { pub(crate) struct TextInput { instances: Vec, focus: Option, + enabled_resource_id: Option, } impl TextInput { @@ -28,13 +29,16 @@ impl TextInput { where F: FnMut(&ZwpTextInputV3, &WlSurface, u32), { - if let Some(ref surface) = self.focus { + if let (Some(surface), Some(enabled_resource_id)) = (&self.focus, &self.enabled_resource_id) { if !surface.alive() { return; } + for ti in self.instances.iter_mut() { - if ti.instance.id().same_client_as(&surface.id()) { + let instance_id = ti.instance.id(); + if instance_id.same_client_as(&surface.id()) && instance_id.eq(enabled_resource_id) { f(&ti.instance, surface, ti.serial); + break; } } } @@ -77,6 +81,18 @@ impl TextInputHandle { self.inner.lock().unwrap().focus = surface; } + fn set_enabled_resource_id(&self, resource_id: Option) { + let mut inner = self.inner.lock().unwrap(); + + match (&inner.enabled_resource_id, &resource_id) { + (Some(_), Some(_)) => {} + (None, None) => {} + (_, _) => { + inner.enabled_resource_id = resource_id; + } + } + } + /// Send `leave` on the text-input instance for the currently focused /// surface. pub fn leave(&self) { @@ -182,9 +198,11 @@ where match request { zwp_text_input_v3::Request::Enable => { - data.input_method_handle.activate_input_method(state, &focus) + data.handle.set_enabled_resource_id(Some(resource.id())); + data.input_method_handle.activate_input_method(state, &focus); } zwp_text_input_v3::Request::Disable => { + data.handle.set_enabled_resource_id(None); data.input_method_handle.deactivate_input_method(state, false); } zwp_text_input_v3::Request::SetSurroundingText { text, cursor, anchor } => {