1
0
Fork 0

switch from Arc<Mutex<>> to Rc<RefCell<>> since the wndproc is only called on one thread

This commit is contained in:
Micah Johnston 2020-09-07 02:16:45 -05:00
parent aafd54b76c
commit 08c9aec50c

View file

@ -14,7 +14,8 @@ use winapi::um::winuser::{
use std::ffi::c_void;
use std::ptr::null_mut;
use std::sync::mpsc;
use std::sync::{Arc, Mutex};
use std::rc::Rc;
use std::cell::RefCell;
use crate::{AppWindow, Event, Parent::WithParent, RawWindow, WindowInfo, WindowOpenOptions};
@ -45,7 +46,7 @@ unsafe fn generate_guid() -> String {
const WIN_FRAME_TIMER: usize = 4242;
unsafe fn handle_timer<A: AppWindow>(win: &Mutex<Window<A>>, timer_id: usize) {
unsafe fn handle_timer<A: AppWindow>(win: &RefCell<Window<A>>, timer_id: usize) {
match timer_id {
WIN_FRAME_TIMER => {}
_ => (),
@ -65,13 +66,13 @@ unsafe extern "system" fn wnd_proc<A: AppWindow>(
let win_ptr = GetWindowLongPtrA(hwnd, GWLP_USERDATA) as *const c_void;
if !win_ptr.is_null() {
let win: &Mutex<Window<A>> = &*(win_ptr as *const Mutex<Window<A>>);
let win = &*(win_ptr as *const RefCell<Window<A>>);
match msg {
WM_MOUSEMOVE => {
let x = (lparam & 0xFFFF) as i32;
let y = ((lparam >> 16) & 0xFFFF) as i32;
win.lock().unwrap().handle_mouse_motion(x, y);
win.borrow_mut().handle_mouse_motion(x, y);
return 0;
}
WM_TIMER => {
@ -192,9 +193,9 @@ impl<A: AppWindow> Window<A> {
scaling: None,
};
let win = Arc::new(Mutex::new(window));
let win = Rc::new(RefCell::new(window));
SetWindowLongPtrA(hwnd, GWLP_USERDATA, Arc::into_raw(win) as *const _ as _);
SetWindowLongPtrA(hwnd, GWLP_USERDATA, Rc::into_raw(win) as *const _ as _);
SetTimer(hwnd, 4242, 13, None);