use bitflags::bitflags;
use windows_sys::Win32::{
Foundation::HWND,
UI::Input::{
Ime::{
ImmGetContext, ImmGetConversionStatus, ImmGetOpenStatus, ImmReleaseContext,
ImmSetConversionStatus, ImmSetOpenStatus,
},
KeyboardAndMouse::GetFocus,
},
};
pub type ImeState = bool;
pub fn get_window_ime_state(hwnd: HWND) -> ImeState {
let himc = unsafe { ImmGetContext(hwnd) };
if himc.is_null() {
return false;
}
let f_open = unsafe { ImmGetOpenStatus(himc) } != 0;
unsafe { ImmReleaseContext(hwnd, himc) };
f_open
}
pub fn get_ime_state() -> ImeState {
let hwnd = unsafe { GetFocus() };
get_window_ime_state(hwnd)
}
pub fn set_window_ime_state(hwnd: HWND, state: ImeState) {
let himc = unsafe { ImmGetContext(hwnd) };
if himc.is_null() {
return;
}
let fopen = unsafe { ImmGetOpenStatus(himc) } != 0;
if fopen != state {
unsafe { ImmSetOpenStatus(himc, state as _) };
}
unsafe { ImmReleaseContext(hwnd, himc) };
}
pub fn set_ime_state(state: ImeState) {
let hwnd = unsafe { GetFocus() };
set_window_ime_state(hwnd, state);
}
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub struct ImeConversionMode(u32);
bitflags! {
impl ImeConversionMode: u32 {
const ALPHANUMERIC = 0x0000;
const CHARCODE = 0x0001;
const EUDC = 0x0002;
const FIXED = 0x0004;
const FULLSHAPE = 0x0008;
const HANJACONVERT = 0x0010;
const KATAKANA = 0x0020;
const NATIVE = 0x0040;
const NOCONVERSION = 0x0080;
const ROMAN = 0x0100;
const SOFTKBD = 0x0200;
const SYMBOL = 0x0400;
}
}
pub fn get_window_ime_conversion_mode(hwnd: HWND) -> ImeConversionMode {
let himc = unsafe { ImmGetContext(hwnd) };
if himc.is_null() {
return ImeConversionMode::empty();
}
let mut convmode = 0u32;
let mut sentence = 0u32;
unsafe { ImmGetConversionStatus(himc, &mut convmode, &mut sentence) };
unsafe { ImmReleaseContext(hwnd, himc) };
ImeConversionMode::from_bits_retain(convmode)
}
pub fn get_ime_conversion_mode() -> ImeConversionMode {
let hwnd = unsafe { GetFocus() };
get_window_ime_conversion_mode(hwnd)
}
pub fn set_window_ime_conversion_mode(hwnd: HWND, convmode: ImeConversionMode) {
let himc = unsafe { ImmGetContext(hwnd) };
if himc.is_null() {
return;
}
unsafe { ImmSetConversionStatus(himc, convmode.bits(), 0) };
unsafe { ImmReleaseContext(hwnd, himc) };
}
pub fn set_ime_conversion_mode(convmode: ImeConversionMode) {
let hwnd = unsafe { GetFocus() };
set_window_ime_conversion_mode(hwnd, convmode);
}