Skip to main content

siglus_scene_vm/
ime.rs

1//! Shared IME requests for native and Web windows.
2
3use winit::dpi::{Position, Size};
4use winit::window::{
5    ImeCapabilities, ImeEnableRequest, ImeHint, ImePurpose, ImeRequest, ImeRequestData, Window,
6};
7
8/// Enable text input or update the candidate window area without restarting composition.
9pub fn enable_ime(window: &dyn Window, position: Position, size: Size) {
10    let data = ImeRequestData::default().with_cursor_area(position, size);
11    let request = if window.ime_capabilities().is_some() {
12        ImeRequest::Update(data)
13    } else {
14        let capabilities = ImeCapabilities::new()
15            .with_cursor_area()
16            .with_hint_and_purpose();
17        let data = data.with_hint_and_purpose(ImeHint::NONE, ImePurpose::Normal);
18        ImeRequest::Enable(
19            ImeEnableRequest::new(capabilities, data)
20                .expect("IME capabilities match the initial cursor area, hint and purpose"),
21        )
22    };
23    // Some backends do not support IME; keep text input best-effort as before.
24    let _ = window.request_ime_update(request);
25}
26
27/// Disable text input when no editable field is focused.
28pub fn disable_ime(window: &dyn Window) {
29    let _ = window.request_ime_update(ImeRequest::Disable);
30}