use windows::Win32::{
Foundation::{HWND, POINT, RECT},
UI::Input::Ime::{
CANDIDATEFORM, CFS_EXCLUDE, CFS_POINT, COMPOSITIONFORM, ImmGetContext, ImmReleaseContext,
ImmSetCandidateWindow, ImmSetCompositionWindow,
},
};
pub(crate) fn set_position(hwnd: HWND, caret: [i32; 4]) {
let [left, top, right, bottom] = caret;
unsafe {
let himc = ImmGetContext(hwnd);
if himc.is_invalid() {
return;
}
let composition = COMPOSITIONFORM {
dwStyle: CFS_POINT,
ptCurrentPos: POINT { x: left, y: top },
rcArea: RECT::default(),
};
let _ = ImmSetCompositionWindow(himc, &composition);
let candidates = CANDIDATEFORM {
dwIndex: 0,
dwStyle: CFS_EXCLUDE,
ptCurrentPos: POINT { x: left, y: bottom },
rcArea: RECT {
left,
top,
right,
bottom,
},
};
let _ = ImmSetCandidateWindow(himc, &candidates);
let _ = ImmReleaseContext(hwnd, himc);
}
}