use W variants of winapi functions
This commit is contained in:
parent
043fe41d05
commit
c64b2257f5
|
@ -3,12 +3,12 @@ use winapi::shared::minwindef::{ATOM, FALSE, LPARAM, LRESULT, UINT, WPARAM};
|
||||||
use winapi::shared::windef::{HWND, RECT};
|
use winapi::shared::windef::{HWND, RECT};
|
||||||
use winapi::um::combaseapi::CoCreateGuid;
|
use winapi::um::combaseapi::CoCreateGuid;
|
||||||
use winapi::um::winuser::{
|
use winapi::um::winuser::{
|
||||||
AdjustWindowRectEx, CreateWindowExA, DefWindowProcA, DispatchMessageA,
|
AdjustWindowRectEx, CreateWindowExW, DefWindowProcW, DispatchMessageW,
|
||||||
GetMessageA, GetWindowLongPtrA, PostMessageA, RegisterClassA, SetTimer,
|
GetMessageW, GetWindowLongPtrW, PostMessageW, RegisterClassW, SetTimer,
|
||||||
SetWindowLongPtrA, TranslateMessage, UnregisterClassA, LoadCursorW,
|
SetWindowLongPtrW, TranslateMessage, UnregisterClassW, LoadCursorW,
|
||||||
CS_OWNDC, GWLP_USERDATA, IDC_ARROW,
|
CS_OWNDC, GWLP_USERDATA, IDC_ARROW,
|
||||||
MSG, WM_CLOSE, WM_CREATE, WM_MOUSEMOVE, WM_SHOWWINDOW, WM_TIMER,
|
MSG, WM_CLOSE, WM_CREATE, WM_MOUSEMOVE, WM_SHOWWINDOW, WM_TIMER,
|
||||||
WNDCLASSA, WS_CAPTION, WS_CHILD, WS_CLIPSIBLINGS, WS_MAXIMIZEBOX, WS_MINIMIZEBOX,
|
WNDCLASSW, WS_CAPTION, WS_CHILD, WS_CLIPSIBLINGS, WS_MAXIMIZEBOX, WS_MINIMIZEBOX,
|
||||||
WS_POPUPWINDOW, WS_SIZEBOX, WS_VISIBLE, WM_DPICHANGED, WM_CHAR, WM_SYSCHAR, WM_KEYDOWN,
|
WS_POPUPWINDOW, WS_SIZEBOX, WS_VISIBLE, WM_DPICHANGED, WM_CHAR, WM_SYSCHAR, WM_KEYDOWN,
|
||||||
WM_SYSKEYDOWN, WM_KEYUP, WM_SYSKEYUP, WM_INPUTLANGCHANGE,
|
WM_SYSKEYDOWN, WM_KEYUP, WM_SYSKEYUP, WM_INPUTLANGCHANGE,
|
||||||
GET_XBUTTON_WPARAM, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MBUTTONDOWN, WM_MBUTTONUP,
|
GET_XBUTTON_WPARAM, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MBUTTONDOWN, WM_MBUTTONUP,
|
||||||
|
@ -16,7 +16,8 @@ use winapi::um::winuser::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::ffi::{CString, c_void};
|
use std::ffi::{OsStr, c_void};
|
||||||
|
use std::os::windows::ffi::OsStrExt;
|
||||||
use std::ptr::null_mut;
|
use std::ptr::null_mut;
|
||||||
|
|
||||||
use raw_window_handle::{
|
use raw_window_handle::{
|
||||||
|
@ -57,11 +58,11 @@ unsafe extern "system" fn wnd_proc(
|
||||||
hwnd: HWND, msg: UINT, wparam: WPARAM, lparam: LPARAM,
|
hwnd: HWND, msg: UINT, wparam: WPARAM, lparam: LPARAM,
|
||||||
) -> LRESULT {
|
) -> LRESULT {
|
||||||
if msg == WM_CREATE {
|
if msg == WM_CREATE {
|
||||||
PostMessageA(hwnd, WM_SHOWWINDOW, 0, 0);
|
PostMessageW(hwnd, WM_SHOWWINDOW, 0, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
let win_ptr = GetWindowLongPtrA(hwnd, GWLP_USERDATA) as *const c_void;
|
let win_ptr = GetWindowLongPtrW(hwnd, GWLP_USERDATA) as *const c_void;
|
||||||
if !win_ptr.is_null() {
|
if !win_ptr.is_null() {
|
||||||
let window_state = &*(win_ptr as *const RefCell<WindowState>);
|
let window_state = &*(win_ptr as *const RefCell<WindowState>);
|
||||||
let mut window = Window { hwnd };
|
let mut window = Window { hwnd };
|
||||||
|
@ -132,7 +133,7 @@ unsafe extern "system" fn wnd_proc(
|
||||||
.borrow_mut()
|
.borrow_mut()
|
||||||
.handler
|
.handler
|
||||||
.on_event(&mut window, Event::Window(WindowEvent::WillClose));
|
.on_event(&mut window, Event::Window(WindowEvent::WillClose));
|
||||||
return DefWindowProcA(hwnd, msg, wparam, lparam);
|
return DefWindowProcW(hwnd, msg, wparam, lparam);
|
||||||
}
|
}
|
||||||
WM_DPICHANGED => {
|
WM_DPICHANGED => {
|
||||||
// TODO: Notify app of DPI change
|
// TODO: Notify app of DPI change
|
||||||
|
@ -157,18 +158,22 @@ unsafe extern "system" fn wnd_proc(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return DefWindowProcA(hwnd, msg, wparam, lparam);
|
return DefWindowProcW(hwnd, msg, wparam, lparam);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn register_wnd_class() -> ATOM {
|
unsafe fn register_wnd_class() -> ATOM {
|
||||||
// We generate a unique name for the new window class to prevent name collisions
|
// We generate a unique name for the new window class to prevent name collisions
|
||||||
let class_name = format!("Baseview-{}", generate_guid()).as_ptr() as *const i8;
|
let class_name_str = format!("Baseview-{}", generate_guid());
|
||||||
|
let mut class_name: Vec<u16> = OsStr::new(&class_name_str)
|
||||||
|
.encode_wide()
|
||||||
|
.collect();
|
||||||
|
class_name.push(0);
|
||||||
|
|
||||||
let wnd_class = WNDCLASSA {
|
let wnd_class = WNDCLASSW {
|
||||||
style: CS_OWNDC,
|
style: CS_OWNDC,
|
||||||
lpfnWndProc: Some(wnd_proc),
|
lpfnWndProc: Some(wnd_proc),
|
||||||
hInstance: null_mut(),
|
hInstance: null_mut(),
|
||||||
lpszClassName: class_name,
|
lpszClassName: class_name.as_ptr(),
|
||||||
cbClsExtra: 0,
|
cbClsExtra: 0,
|
||||||
cbWndExtra: 0,
|
cbWndExtra: 0,
|
||||||
hIcon: null_mut(),
|
hIcon: null_mut(),
|
||||||
|
@ -177,11 +182,11 @@ unsafe fn register_wnd_class() -> ATOM {
|
||||||
lpszMenuName: null_mut(),
|
lpszMenuName: null_mut(),
|
||||||
};
|
};
|
||||||
|
|
||||||
RegisterClassA(&wnd_class)
|
RegisterClassW(&wnd_class)
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn unregister_wnd_class(wnd_class: ATOM) {
|
unsafe fn unregister_wnd_class(wnd_class: ATOM) {
|
||||||
UnregisterClassA(wnd_class as _, null_mut());
|
UnregisterClassW(wnd_class as _, null_mut());
|
||||||
}
|
}
|
||||||
|
|
||||||
struct WindowState {
|
struct WindowState {
|
||||||
|
@ -205,14 +210,14 @@ impl AppRunner {
|
||||||
let mut msg: MSG = std::mem::zeroed();
|
let mut msg: MSG = std::mem::zeroed();
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let status = GetMessageA(&mut msg, self.hwnd, 0, 0);
|
let status = GetMessageW(&mut msg, self.hwnd, 0, 0);
|
||||||
|
|
||||||
if status == -1 {
|
if status == -1 {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
TranslateMessage(&mut msg);
|
TranslateMessage(&mut msg);
|
||||||
DispatchMessageA(&mut msg);
|
DispatchMessageW(&mut msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -228,7 +233,10 @@ impl Window {
|
||||||
B: Send + 'static
|
B: Send + 'static
|
||||||
{
|
{
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut title = CString::new(&options.title[..]).unwrap();
|
let mut title: Vec<u16> = OsStr::new(&options.title[..])
|
||||||
|
.encode_wide()
|
||||||
|
.collect();
|
||||||
|
title.push(0);
|
||||||
|
|
||||||
let window_class = register_wnd_class();
|
let window_class = register_wnd_class();
|
||||||
// todo: manage error ^
|
// todo: manage error ^
|
||||||
|
@ -271,7 +279,7 @@ impl Window {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let hwnd = CreateWindowExA(
|
let hwnd = CreateWindowExW(
|
||||||
0,
|
0,
|
||||||
window_class as _,
|
window_class as _,
|
||||||
title.as_ptr(),
|
title.as_ptr(),
|
||||||
|
@ -296,7 +304,7 @@ impl Window {
|
||||||
handler,
|
handler,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
SetWindowLongPtrA(hwnd, GWLP_USERDATA, Box::into_raw(window_state) as *const _ as _);
|
SetWindowLongPtrW(hwnd, GWLP_USERDATA, Box::into_raw(window_state) as *const _ as _);
|
||||||
SetTimer(hwnd, WIN_FRAME_TIMER, 15, None);
|
SetTimer(hwnd, WIN_FRAME_TIMER, 15, None);
|
||||||
|
|
||||||
if let crate::Parent::None = options.parent {
|
if let crate::Parent::None = options.parent {
|
||||||
|
|
Loading…
Reference in a new issue