1
0
Fork 0
forked from wry/wry

config: allow configuring the simple IM

This commit is contained in:
Julian Orth 2025-10-16 01:48:47 +02:00
parent 58b9830aaa
commit 2f22a61710
15 changed files with 367 additions and 7 deletions

View file

@ -2281,6 +2281,26 @@ impl ConfigProxyHandler {
Ok(())
}
fn handle_seat_set_simple_im_enabled(&self, seat: Seat, enabled: bool) -> Result<(), CphError> {
let seat = self.get_seat(seat)?;
seat.set_simple_im_enabled(enabled);
Ok(())
}
fn handle_seat_get_simple_im_enabled(&self, seat: Seat) -> Result<(), CphError> {
let seat = self.get_seat(seat)?;
self.respond(Response::SeatGetSimpleImEnabled {
enabled: seat.simple_im_enabled(),
});
Ok(())
}
fn handle_seat_reload_simple_im(&self, seat: Seat) -> Result<(), CphError> {
let seat = self.get_seat(seat)?;
seat.reload_simple_im();
Ok(())
}
fn spaces_change(&self) {
struct V;
impl NodeVisitorBase for V {
@ -3216,6 +3236,15 @@ impl ConfigProxyHandler {
} => self
.handle_show_workspace(seat, workspace, Some(connector))
.wrn("show_workspace_on")?,
ClientMessage::SeatSetSimpleImEnabled { seat, enabled } => self
.handle_seat_set_simple_im_enabled(seat, enabled)
.wrn("seat_set_simple_im_enabled")?,
ClientMessage::SeatGetSimpleImEnabled { seat } => self
.handle_seat_get_simple_im_enabled(seat)
.wrn("seat_get_simple_im_enabled")?,
ClientMessage::SeatReloadSimpleIm { seat } => self
.handle_seat_reload_simple_im(seat)
.wrn("seat_reload_simple_im")?,
}
Ok(())
}

View file

@ -239,6 +239,7 @@ pub struct WlSeatGlobal {
modifiers_listener: EventListener<dyn LedsListener>,
modifiers_forward: EventSource<dyn LedsListener>,
simple_im: CloneCell<Option<Rc<SimpleIm>>>,
simple_im_enabled: Cell<bool>,
}
#[derive(Copy, Clone)]
@ -330,6 +331,7 @@ impl WlSeatGlobal {
modifiers_listener: EventListener::new(slf.clone()),
modifiers_forward: Default::default(),
simple_im: CloneCell::new(simple_im),
simple_im_enabled: Cell::new(true),
});
slf.pointer_cursor.set_owner(slf.clone());
slf.modifiers_listener

View file

@ -2,7 +2,10 @@ use {
crate::{
backend::KeyState,
ifs::{
wl_seat::{WlSeatGlobal, text_input::zwp_text_input_v3::ZwpTextInputV3},
wl_seat::{
WlSeatGlobal,
text_input::{simple_im::SimpleIm, zwp_text_input_v3::ZwpTextInputV3},
},
wl_surface::{WlSurface, zwp_input_popup_surface_v2::ZwpInputPopupSurfaceV2},
},
keyboard::KeyboardState,
@ -61,6 +64,42 @@ pub enum TextDisconnectReason {
}
impl WlSeatGlobal {
pub fn set_simple_im_enabled(self: &Rc<Self>, enabled: bool) {
if self.simple_im_enabled.replace(enabled) == enabled {
return;
}
if enabled {
if self.input_method.is_none()
&& let Some(im) = self.simple_im.get()
{
self.set_input_method(im);
}
} else {
if let Some(im) = self.input_method.get()
&& im.is_simple()
{
self.input_method.take();
im.cancel_simple(self);
}
}
}
pub fn simple_im_enabled(&self) -> bool {
self.simple_im_enabled.get()
}
pub fn reload_simple_im(self: &Rc<Self>) {
let im = SimpleIm::new(&self.state.kb_ctx.ctx);
self.simple_im.set(im.clone());
if self.simple_im_enabled.get() && self.can_set_new_im() {
if let Some(im) = im {
self.set_input_method(im);
} else if let Some(old) = self.input_method.take() {
old.cancel_simple(self);
}
}
}
fn can_set_new_im(&self) -> bool {
match self.input_method.get() {
None => true,
@ -82,7 +121,9 @@ impl WlSeatGlobal {
fn remove_input_method(self: &Rc<Self>) {
self.input_method.take();
if let Some(im) = self.simple_im.get() {
if self.simple_im_enabled.get()
&& let Some(im) = self.simple_im.get()
{
self.set_input_method(im);
}
}