On Windows, implement 'Window::set_ime_position' with IMM API

This commit is contained in:
moko256 2020-12-10 05:16:59 +09:00 committed by GitHub
parent c5620efc9c
commit db038d943c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 78 additions and 4 deletions

View file

@ -18,7 +18,9 @@ use winapi::{
windef::{HWND, POINT, RECT},
},
um::{
combaseapi, dwmapi, libloaderapi,
combaseapi, dwmapi,
imm::{CFS_POINT, COMPOSITIONFORM},
libloaderapi,
objbase::COINIT_APARTMENTTHREADED,
ole2,
oleidl::LPDROPTARGET,
@ -616,9 +618,25 @@ impl Window {
self.window_state.lock().taskbar_icon = taskbar_icon;
}
pub(crate) fn set_ime_position_physical(&self, x: i32, y: i32) {
if unsafe { winuser::GetSystemMetrics(winuser::SM_IMMENABLED) } != 0 {
let mut composition_form = COMPOSITIONFORM {
dwStyle: CFS_POINT,
ptCurrentPos: POINT { x, y },
rcArea: unsafe { mem::zeroed() },
};
unsafe {
let himc = winapi::um::imm::ImmGetContext(self.window.0);
winapi::um::imm::ImmSetCompositionWindow(himc, &mut composition_form);
winapi::um::imm::ImmReleaseContext(self.window.0, himc);
}
}
}
#[inline]
pub fn set_ime_position(&self, _position: Position) {
warn!("`Window::set_ime_position` is ignored on Windows")
pub fn set_ime_position(&self, spot: Position) {
let (x, y) = spot.to_physical::<i32>(self.scale_factor()).into();
self.set_ime_position_physical(x, y);
}
#[inline]