in native/desktop-linux/src/linux/text_input.rs [29:136]
fn event(
this: &mut Self,
text_input: &ZwpTextInputV3,
event: <ZwpTextInputV3 as Proxy>::Event,
_: &i32,
_: &Connection,
_: &QueueHandle<Self>,
) {
match &event {
zwp_text_input_v3::Event::Enter { surface } => {
debug!("zwp_text_input_v3::Event::Enter: {}", surface.id());
this.active_text_input = Some(text_input.clone());
let Some(window_id) = this.get_window_id(surface) else {
warn!("Couldn't find window for: {event:?}");
return;
};
this.send_event(TextInputAvailabilityEvent {
window_id,
available: true,
});
}
zwp_text_input_v3::Event::Leave { surface } => {
debug!("zwp_text_input_v3::Event::Leave: {}", surface.id());
let Some(window_id) = this.get_window_id(surface) else {
warn!("Couldn't find window for: {event:?}");
return;
};
this.send_event(TextInputAvailabilityEvent {
window_id,
available: false,
});
this.active_text_input = None;
}
zwp_text_input_v3::Event::PreeditString {
text,
cursor_begin,
cursor_end,
} => {
debug!("zwp_text_input_v3::Event::PreeditString: cursor_begin={cursor_begin}, cursor_end={cursor_end}, text={text:?}");
this.pending_text_input_event.preedit_string = Some(event);
}
zwp_text_input_v3::Event::CommitString { text } => {
debug!("zwp_text_input_v3::Event::CommitString: {text:?}");
this.pending_text_input_event.commit_string = Some(event);
}
zwp_text_input_v3::Event::DeleteSurroundingText {
before_length,
after_length,
} => {
debug!("zwp_text_input_v3::Event::DeleteSurroundingText: before_length={before_length}, after_length={after_length}");
this.pending_text_input_event.delete_surrounding_text = Some(event);
}
zwp_text_input_v3::Event::Done { serial } => {
debug!("zwp_text_input_v3::Event::Done: serial={serial}");
if this.pending_text_input_event.commit_string.is_none()
&& this.pending_text_input_event.delete_surrounding_text.is_none()
&& this.pending_text_input_event.preedit_string.is_none()
{
return;
}
let v = std::mem::take(&mut this.pending_text_input_event);
let (has_commit_string, commit_string) = match v.commit_string {
Some(zwp_text_input_v3::Event::CommitString { text }) => (true, text.map(|t| CString::new(t).unwrap())),
_ => (false, None),
};
let delete_surrounding_text = match v.delete_surrounding_text {
Some(zwp_text_input_v3::Event::DeleteSurroundingText {
before_length,
after_length,
}) => Some(TextInputDeleteSurroundingTextData {
before_length_in_bytes: before_length,
after_length_in_bytes: after_length,
}),
_ => None,
};
let preedit_data = match v.preedit_string {
Some(zwp_text_input_v3::Event::PreeditString {
text,
cursor_begin,
cursor_end,
}) => Some((text.map(|t| CString::new(t).unwrap()), cursor_begin, cursor_end)),
_ => None,
};
let e = TextInputEvent {
has_preedit_string: preedit_data.is_some(),
preedit_string: if let Some((preedit_text, preedit_begin, preedit_end)) = &preedit_data {
TextInputPreeditStringData {
text: BorrowedStrPtr::new_optional(preedit_text.as_ref()),
cursor_begin_byte_pos: *preedit_begin,
cursor_end_byte_pos: *preedit_end,
}
} else {
TextInputPreeditStringData::default()
},
has_commit_string,
commit_string: BorrowedStrPtr::new_optional(commit_string.as_ref()),
has_delete_surrounding_text: delete_surrounding_text.is_some(),
delete_surrounding_text: delete_surrounding_text.unwrap_or_default(),
};
this.send_event(e);
}
_ => {
warn!("Unknown event: {event:?}");
}
}
}