From 6a7bea1fa47988a5ebbf72f8217772c9a0340fb4 Mon Sep 17 00:00:00 2001 From: Micah Johnston Date: Sat, 5 Sep 2020 20:12:05 -0500 Subject: [PATCH 1/5] get windows building again --- src/win/event.rs | 8 ++-- src/win/window.rs | 115 +++++++++++++++++++++++++--------------------- 2 files changed, 66 insertions(+), 57 deletions(-) diff --git a/src/win/event.rs b/src/win/event.rs index 15fc44a..1929afc 100644 --- a/src/win/event.rs +++ b/src/win/event.rs @@ -2,12 +2,12 @@ use std::sync::{Arc, Mutex}; use winapi::shared::minwindef::{LPARAM, LRESULT, UINT, WPARAM}; -use crate::Window; +use crate::{AppWindow, Window}; use winapi::um::winuser::{DefWindowProcA, WM_MOUSEMOVE, WM_PAINT, WM_TIMER}; const WIN_FRAME_TIMER: usize = 4242; -unsafe fn handle_timer(win: Arc>, timer_id: usize) { +unsafe fn handle_timer(win: Arc>>, timer_id: usize) { match timer_id { WIN_FRAME_TIMER => { win.lock().unwrap().draw_frame(); @@ -16,8 +16,8 @@ unsafe fn handle_timer(win: Arc>, timer_id: usize) { } } -pub(crate) unsafe fn handle_message( - win: Arc>, +pub(crate) unsafe fn handle_message( + win: Arc>>, message: UINT, wparam: WPARAM, lparam: LPARAM, diff --git a/src/win/window.rs b/src/win/window.rs index 11c26d6..2c3b22b 100644 --- a/src/win/window.rs +++ b/src/win/window.rs @@ -15,24 +15,24 @@ use self::winapi::um::wingdi::{ PFD_TYPE_RGBA, PIXELFORMATDESCRIPTOR, }; use self::winapi::um::winuser::{ - AdjustWindowRectEx, CreateWindowExA, DefWindowProcA, DestroyWindow, DispatchEventA, EventBoxA, - GetDC, GetEventA, GetWindowLongPtrA, PeekEventA, PostEventA, RegisterClassA, ReleaseDC, - SetTimer, SetWindowLongPtrA, TranslateEvent, UnregisterClassA, CS_OWNDC, GWLP_USERDATA, - MB_ICONERROR, MB_OK, MB_TOPMOST, MSG, PM_REMOVE, WM_CREATE, WM_QUIT, WM_SHOWWINDOW, WM_TIMER, - WNDCLASSA, WS_CAPTION, WS_CHILD, WS_CLIPSIBLINGS, WS_MAXIMIZEBOX, WS_MINIMIZEBOX, - WS_POPUPWINDOW, WS_SIZEBOX, WS_VISIBLE, + AdjustWindowRectEx, CreateWindowExA, DefWindowProcA, DestroyWindow, DispatchMessageA, GetDC, + GetMessageA, GetWindowLongPtrA, MessageBoxA, PeekMessageA, PostMessageA, RegisterClassA, + ReleaseDC, SetTimer, SetWindowLongPtrA, TranslateMessage, UnregisterClassA, CS_OWNDC, + GWLP_USERDATA, MB_ICONERROR, MB_OK, MB_TOPMOST, MSG, PM_REMOVE, WM_CREATE, WM_QUIT, + WM_SHOWWINDOW, WM_TIMER, WNDCLASSA, WS_CAPTION, WS_CHILD, WS_CLIPSIBLINGS, WS_MAXIMIZEBOX, + WS_MINIMIZEBOX, WS_POPUPWINDOW, WS_SIZEBOX, WS_VISIBLE, }; use self::winapi::ctypes::c_void; use crate::Parent::WithParent; use crate::{handle_message, WindowOpenOptions}; -use crate::{AppWindow, Event, MouseButtonID, MouseScroll}; +use crate::{AppWindow, Event, MouseButtonID, MouseScroll, RawWindow, WindowInfo}; use std::sync::{Arc, Mutex}; unsafe fn message_box(title: &str, msg: &str) { let title = (title.to_owned() + "\0").as_ptr() as *const i8; let msg = (msg.to_owned() + "\0").as_ptr() as *const i8; - EventBoxA(null_mut(), msg, title, MB_ICONERROR | MB_OK | MB_TOPMOST); + MessageBoxA(null_mut(), msg, title, MB_ICONERROR | MB_OK | MB_TOPMOST); } unsafe fn generate_guid() -> String { @@ -54,7 +54,7 @@ unsafe fn generate_guid() -> String { ) } -unsafe extern "system" fn wnd_proc( +unsafe extern "system" fn wnd_proc( hwnd: HWND, msg: UINT, wparam: WPARAM, @@ -63,12 +63,13 @@ unsafe extern "system" fn wnd_proc( let win_ptr = GetWindowLongPtrA(hwnd, GWLP_USERDATA) as *const c_void; match msg { WM_CREATE => { - PostEventA(hwnd, WM_SHOWWINDOW, 0, 0); + PostMessageA(hwnd, WM_SHOWWINDOW, 0, 0); 0 } _ => { if !win_ptr.is_null() { - let win_ref: Arc> = Arc::from_raw(win_ptr as *mut Mutex); + let win_ref: Arc>> = + Arc::from_raw(win_ptr as *mut Mutex>); let win = Arc::clone(&win_ref); let ret = handle_message(win, msg, wparam, lparam); @@ -87,13 +88,13 @@ unsafe extern "system" fn wnd_proc( } } -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 let class_name = format!("Baseview-{}", generate_guid()).as_ptr() as *const i8; let wnd_class = WNDCLASSA { style: CS_OWNDC, - lpfnWndProc: Some(wnd_proc), + lpfnWndProc: Some(wnd_proc::), hInstance: null_mut(), lpszClassName: class_name, cbClsExtra: 0, @@ -127,28 +128,11 @@ pub struct Window { } impl Window { - pub fn open( - options: WindowOpenOptions, - app_window: A, - app_message_rx: mpsc::Receiver, - ) { + pub fn open(options: WindowOpenOptions, app_message_rx: mpsc::Receiver) { unsafe { - let mut window = Window { - hwnd: null_mut(), - hdc: null_mut(), - gl_context: null_mut(), - window_class: 0, - app_window, - app_message_rx, - scaling: None, - r: 0.3, - g: 0.8, - b: 0.3, - }; - let title = (options.title.to_owned() + "\0").as_ptr() as *const i8; - window.window_class = register_wnd_class(); + let window_class = register_wnd_class::(); // todo: manage error ^ let mut flags = WS_POPUPWINDOW @@ -176,9 +160,9 @@ impl Window { AdjustWindowRectEx(&mut rect, flags, FALSE, 0); } - window.hwnd = CreateWindowExA( + let hwnd = CreateWindowExA( 0, - window.window_class as _, + window_class as _, title, flags, 0, @@ -192,7 +176,7 @@ impl Window { ); // todo: manage error ^ - window.hdc = GetDC(window.hwnd); + let hdc = GetDC(hwnd); let mut pfd: PIXELFORMATDESCRIPTOR = std::mem::zeroed(); pfd.nSize = std::mem::size_of::() as u16; @@ -205,41 +189,66 @@ impl Window { pfd.cStencilBits = 8; pfd.iLayerType = PFD_MAIN_PLANE; - let pf_id: i32 = ChoosePixelFormat(window.hdc, &pfd); + let pf_id: i32 = ChoosePixelFormat(hdc, &pfd); if pf_id == 0 { // todo: use a more useful return like an Option // todo: also launch error message boxes //return Arc::new(Mutex::new(window)); } - if SetPixelFormat(window.hdc, pf_id, &pfd) == 0 { + if SetPixelFormat(hdc, pf_id, &pfd) == 0 { // todo: use a more useful return like an Option // todo: also launch error message boxes //return Arc::new(Mutex::new(window)); } - window.gl_context = wglCreateContext(window.hdc); - if window.gl_context == 0 as HGLRC { + let gl_context = wglCreateContext(hdc); + if gl_context == 0 as HGLRC { // todo: use a more useful return like an Option // todo: also launch error message boxes //return Arc::new(Mutex::new(window)); } - if wglMakeCurrent(window.hdc, window.gl_context) == 0 { + if wglMakeCurrent(hdc, gl_context) == 0 { // todo: use a more useful return like an Option // todo: also launch error message boxes //return Arc::new(Mutex::new(window)); } let h = LoadLibraryA("opengl32.dll\0".as_ptr() as *const i8); - gl::load_with(|symbol| { - let symbol = CString::new(symbol.as_bytes()).unwrap(); - let symbol = symbol.as_ptr(); - GetProcAddress(h, symbol) as *const _ - }); + // gl::load_with(|symbol| { + // let symbol = CString::new(symbol.as_bytes()).unwrap(); + // let symbol = symbol.as_ptr(); + // GetProcAddress(h, symbol) as *const _ + // }); - let hwnd = window.hwnd; - let hdc = window.hdc; + let mut windows_handle = raw_window_handle::windows::WindowsHandle::empty(); + windows_handle.hwnd = hwnd as *mut std::ffi::c_void; + + let raw_window = RawWindow { + raw_window_handle: raw_window_handle::RawWindowHandle::Windows(windows_handle), + }; + + let window_info = WindowInfo { + width: options.width as u32, + height: options.height as u32, + scale: 1.0, + }; + + let app_window = A::build(raw_window, &window_info); + + let mut window = Window { + hwnd, + hdc, + gl_context, + window_class, + app_window, + app_message_rx, + scaling: None, + r: 0.3, + g: 0.8, + b: 0.3, + }; let win = Arc::new(Mutex::new(window)); let win_p = Arc::clone(&win); @@ -252,18 +261,18 @@ impl Window { if parent.is_null() { let mut msg: MSG = std::mem::zeroed(); loop { - let status = GetEventA(&mut msg, hwnd, 0, 0); + let status = GetMessageA(&mut msg, hwnd, 0, 0); if status == -1 { break; } - TranslateEvent(&mut msg); + TranslateMessage(&mut msg); handle_message(Arc::clone(&win_p), msg.message, msg.wParam, msg.lParam); } } } } - pub fn close(&self) { + pub fn close(&mut self) { self.app_window.on_event(Event::WillClose); // todo: see https://github.com/wrl/rutabaga/blob/f30ff67e157375cafdbafe5fb549f1790443a3a8/src/platform/win/window.c#L402 @@ -278,8 +287,8 @@ impl Window { pub(crate) unsafe fn draw_frame(&mut self) { // todo: pass callback rendering function instead? - gl::ClearColor(self.r, self.g, self.b, 1.0); - gl::Clear(gl::COLOR_BUFFER_BIT); + // gl::ClearColor(self.r, self.g, self.b, 1.0); + // gl::Clear(gl::COLOR_BUFFER_BIT); SwapBuffers(self.hdc); } @@ -289,6 +298,6 @@ impl Window { self.r = r; self.g = g; - self.app_window.on_message(Event::CursorMotion(x, y)); + self.app_window.on_event(Event::CursorMotion(x, y)); } } From 6e7038d26e7c1023d269cf3d91dc6d14599389d0 Mon Sep 17 00:00:00 2001 From: Micah Johnston Date: Sat, 5 Sep 2020 20:14:37 -0500 Subject: [PATCH 2/5] remove gl context creation code from windows --- src/win/event.rs | 5 +-- src/win/window.rs | 84 ++--------------------------------------------- 2 files changed, 3 insertions(+), 86 deletions(-) diff --git a/src/win/event.rs b/src/win/event.rs index 1929afc..5520c4c 100644 --- a/src/win/event.rs +++ b/src/win/event.rs @@ -9,9 +9,7 @@ const WIN_FRAME_TIMER: usize = 4242; unsafe fn handle_timer(win: Arc>>, timer_id: usize) { match timer_id { - WIN_FRAME_TIMER => { - win.lock().unwrap().draw_frame(); - } + WIN_FRAME_TIMER => {} _ => (), } } @@ -38,7 +36,6 @@ pub(crate) unsafe fn handle_message( 0 } WM_PAINT => { - win.lock().unwrap().draw_frame(); 0 } _ => DefWindowProcA(hwnd, message, wparam, lparam), diff --git a/src/win/window.rs b/src/win/window.rs index 2c3b22b..326ce19 100644 --- a/src/win/window.rs +++ b/src/win/window.rs @@ -1,19 +1,12 @@ extern crate winapi; -use std::ffi::CString; use std::ptr::null_mut; use std::sync::mpsc; use self::winapi::shared::guiddef::GUID; use self::winapi::shared::minwindef::{ATOM, FALSE, LPARAM, LRESULT, UINT, WPARAM}; -use self::winapi::shared::windef::{HDC, HGLRC, HWND, RECT}; +use self::winapi::shared::windef::{HWND, RECT}; use self::winapi::um::combaseapi::CoCreateGuid; -use self::winapi::um::libloaderapi::{GetProcAddress, LoadLibraryA}; -use self::winapi::um::wingdi::{ - wglCreateContext, wglDeleteContext, wglMakeCurrent, ChoosePixelFormat, SetPixelFormat, - SwapBuffers, PFD_DOUBLEBUFFER, PFD_DRAW_TO_WINDOW, PFD_MAIN_PLANE, PFD_SUPPORT_OPENGL, - PFD_TYPE_RGBA, PIXELFORMATDESCRIPTOR, -}; use self::winapi::um::winuser::{ AdjustWindowRectEx, CreateWindowExA, DefWindowProcA, DestroyWindow, DispatchMessageA, GetDC, GetMessageA, GetWindowLongPtrA, MessageBoxA, PeekMessageA, PostMessageA, RegisterClassA, @@ -26,7 +19,7 @@ use self::winapi::um::winuser::{ use self::winapi::ctypes::c_void; use crate::Parent::WithParent; use crate::{handle_message, WindowOpenOptions}; -use crate::{AppWindow, Event, MouseButtonID, MouseScroll, RawWindow, WindowInfo}; +use crate::{AppWindow, Event, RawWindow, WindowInfo}; use std::sync::{Arc, Mutex}; unsafe fn message_box(title: &str, msg: &str) { @@ -112,19 +105,12 @@ unsafe fn unregister_wnd_class(wnd_class: ATOM) { UnregisterClassA(wnd_class as _, null_mut()); } -unsafe fn init_gl_context() {} - pub struct Window { pub(crate) hwnd: HWND, - hdc: HDC, - gl_context: HGLRC, window_class: ATOM, app_window: A, app_message_rx: mpsc::Receiver, scaling: Option, // DPI scale, 96.0 is "default". - r: f32, - g: f32, - b: f32, } impl Window { @@ -176,52 +162,6 @@ impl Window { ); // todo: manage error ^ - let hdc = GetDC(hwnd); - - let mut pfd: PIXELFORMATDESCRIPTOR = std::mem::zeroed(); - pfd.nSize = std::mem::size_of::() as u16; - pfd.nVersion = 1; - pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; - pfd.iPixelType = PFD_TYPE_RGBA; - pfd.cColorBits = 32; - // todo: ask wrl why 24 instead of 32? - pfd.cDepthBits = 24; - pfd.cStencilBits = 8; - pfd.iLayerType = PFD_MAIN_PLANE; - - let pf_id: i32 = ChoosePixelFormat(hdc, &pfd); - if pf_id == 0 { - // todo: use a more useful return like an Option - // todo: also launch error message boxes - //return Arc::new(Mutex::new(window)); - } - - if SetPixelFormat(hdc, pf_id, &pfd) == 0 { - // todo: use a more useful return like an Option - // todo: also launch error message boxes - //return Arc::new(Mutex::new(window)); - } - - let gl_context = wglCreateContext(hdc); - if gl_context == 0 as HGLRC { - // todo: use a more useful return like an Option - // todo: also launch error message boxes - //return Arc::new(Mutex::new(window)); - } - - if wglMakeCurrent(hdc, gl_context) == 0 { - // todo: use a more useful return like an Option - // todo: also launch error message boxes - //return Arc::new(Mutex::new(window)); - } - - let h = LoadLibraryA("opengl32.dll\0".as_ptr() as *const i8); - // gl::load_with(|symbol| { - // let symbol = CString::new(symbol.as_bytes()).unwrap(); - // let symbol = symbol.as_ptr(); - // GetProcAddress(h, symbol) as *const _ - // }); - let mut windows_handle = raw_window_handle::windows::WindowsHandle::empty(); windows_handle.hwnd = hwnd as *mut std::ffi::c_void; @@ -239,15 +179,10 @@ impl Window { let mut window = Window { hwnd, - hdc, - gl_context, window_class, app_window, app_message_rx, scaling: None, - r: 0.3, - g: 0.8, - b: 0.3, }; let win = Arc::new(Mutex::new(window)); @@ -277,27 +212,12 @@ impl Window { // todo: see https://github.com/wrl/rutabaga/blob/f30ff67e157375cafdbafe5fb549f1790443a3a8/src/platform/win/window.c#L402 unsafe { - wglMakeCurrent(null_mut(), null_mut()); - wglDeleteContext(self.gl_context); - ReleaseDC(self.hwnd, self.hdc); DestroyWindow(self.hwnd); unregister_wnd_class(self.window_class); } } - pub(crate) unsafe fn draw_frame(&mut self) { - // todo: pass callback rendering function instead? - // gl::ClearColor(self.r, self.g, self.b, 1.0); - // gl::Clear(gl::COLOR_BUFFER_BIT); - SwapBuffers(self.hdc); - } - pub(crate) fn handle_mouse_motion(&mut self, x: i32, y: i32) { - let r = (x as f32) / 1000.0; - let g = (y as f32) / 1000.0; - self.r = r; - self.g = g; - self.app_window.on_event(Event::CursorMotion(x, y)); } } From 9d39ba9117ee9cdeb47635f854408bd9a13a4fdd Mon Sep 17 00:00:00 2001 From: Micah Johnston Date: Sat, 5 Sep 2020 20:40:39 -0500 Subject: [PATCH 3/5] don't need to reset userdata, just leak the Arc with into_raw so it stays alive --- src/win/event.rs | 4 +--- src/win/window.rs | 6 ++---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/win/event.rs b/src/win/event.rs index 5520c4c..9fe3c36 100644 --- a/src/win/event.rs +++ b/src/win/event.rs @@ -35,9 +35,7 @@ pub(crate) unsafe fn handle_message( handle_timer(win, wparam); 0 } - WM_PAINT => { - 0 - } + WM_PAINT => 0, _ => DefWindowProcA(hwnd, message, wparam, lparam), } } diff --git a/src/win/window.rs b/src/win/window.rs index 326ce19..e8318c4 100644 --- a/src/win/window.rs +++ b/src/win/window.rs @@ -68,10 +68,8 @@ unsafe extern "system" fn wnd_proc( // todo: need_reconfigure thing? - // Needed otherwise it crashes because it drops the userdata - // We basically need to keep the GWLP_USERDATA fresh between calls of the proc - // DO NOT REMOVE - SetWindowLongPtrA(hwnd, GWLP_USERDATA, Arc::into_raw(win_ref) as *const _ as _); + // If we don't do this, the Arc will be dropped and we'll get a crash. + let _ = Arc::into_raw(win_ref); return ret; } From 10d3870644466c5ce379cad70c5ed503c50c9eac Mon Sep 17 00:00:00 2001 From: Micah Johnston Date: Sat, 5 Sep 2020 21:19:37 -0500 Subject: [PATCH 4/5] clean up some warnings and cargo fmt --- src/win/mod.rs | 1 - src/win/window.rs | 18 ++++++++---------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/win/mod.rs b/src/win/mod.rs index d8b3e40..6409d1c 100644 --- a/src/win/mod.rs +++ b/src/win/mod.rs @@ -1,5 +1,4 @@ mod event; mod window; -pub use event::*; pub use window::*; diff --git a/src/win/window.rs b/src/win/window.rs index e8318c4..5354443 100644 --- a/src/win/window.rs +++ b/src/win/window.rs @@ -8,18 +8,16 @@ use self::winapi::shared::minwindef::{ATOM, FALSE, LPARAM, LRESULT, UINT, WPARAM use self::winapi::shared::windef::{HWND, RECT}; use self::winapi::um::combaseapi::CoCreateGuid; use self::winapi::um::winuser::{ - AdjustWindowRectEx, CreateWindowExA, DefWindowProcA, DestroyWindow, DispatchMessageA, GetDC, - GetMessageA, GetWindowLongPtrA, MessageBoxA, PeekMessageA, PostMessageA, RegisterClassA, - ReleaseDC, SetTimer, SetWindowLongPtrA, TranslateMessage, UnregisterClassA, CS_OWNDC, - GWLP_USERDATA, MB_ICONERROR, MB_OK, MB_TOPMOST, MSG, PM_REMOVE, WM_CREATE, WM_QUIT, - WM_SHOWWINDOW, WM_TIMER, WNDCLASSA, WS_CAPTION, WS_CHILD, WS_CLIPSIBLINGS, WS_MAXIMIZEBOX, - WS_MINIMIZEBOX, WS_POPUPWINDOW, WS_SIZEBOX, WS_VISIBLE, + AdjustWindowRectEx, CreateWindowExA, DefWindowProcA, DestroyWindow, GetMessageA, + GetWindowLongPtrA, MessageBoxA, PostMessageA, RegisterClassA, SetTimer, SetWindowLongPtrA, + TranslateMessage, UnregisterClassA, CS_OWNDC, GWLP_USERDATA, MB_ICONERROR, MB_OK, MB_TOPMOST, + MSG, WM_CREATE, WM_SHOWWINDOW, WNDCLASSA, WS_CAPTION, WS_CHILD, WS_CLIPSIBLINGS, + WS_MAXIMIZEBOX, WS_MINIMIZEBOX, WS_POPUPWINDOW, WS_SIZEBOX, WS_VISIBLE, }; use self::winapi::ctypes::c_void; -use crate::Parent::WithParent; -use crate::{handle_message, WindowOpenOptions}; -use crate::{AppWindow, Event, RawWindow, WindowInfo}; +use super::event::handle_message; +use crate::{AppWindow, Event, Parent::WithParent, RawWindow, WindowInfo, WindowOpenOptions}; use std::sync::{Arc, Mutex}; unsafe fn message_box(title: &str, msg: &str) { @@ -175,7 +173,7 @@ impl Window { let app_window = A::build(raw_window, &window_info); - let mut window = Window { + let window = Window { hwnd, window_class, app_window, From 0da82a4bddaa28c157599ec42044ef38313a4050 Mon Sep 17 00:00:00 2001 From: Micah Johnston Date: Sat, 5 Sep 2020 21:37:35 -0500 Subject: [PATCH 5/5] pass Arc by reference instead of cloning --- src/win/event.rs | 4 ++-- src/win/window.rs | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/win/event.rs b/src/win/event.rs index 9fe3c36..fc11ed9 100644 --- a/src/win/event.rs +++ b/src/win/event.rs @@ -7,7 +7,7 @@ use winapi::um::winuser::{DefWindowProcA, WM_MOUSEMOVE, WM_PAINT, WM_TIMER}; const WIN_FRAME_TIMER: usize = 4242; -unsafe fn handle_timer(win: Arc>>, timer_id: usize) { +unsafe fn handle_timer(win: &Arc>>, timer_id: usize) { match timer_id { WIN_FRAME_TIMER => {} _ => (), @@ -15,7 +15,7 @@ unsafe fn handle_timer(win: Arc>>, timer_id: usize } pub(crate) unsafe fn handle_message( - win: Arc>>, + win: &Arc>>, message: UINT, wparam: WPARAM, lparam: LPARAM, diff --git a/src/win/window.rs b/src/win/window.rs index 5354443..70a371c 100644 --- a/src/win/window.rs +++ b/src/win/window.rs @@ -59,15 +59,15 @@ unsafe extern "system" fn wnd_proc( } _ => { if !win_ptr.is_null() { - let win_ref: Arc>> = + let win: Arc>> = Arc::from_raw(win_ptr as *mut Mutex>); - let win = Arc::clone(&win_ref); - let ret = handle_message(win, msg, wparam, lparam); + + let ret = handle_message(&win, msg, wparam, lparam); // todo: need_reconfigure thing? // If we don't do this, the Arc will be dropped and we'll get a crash. - let _ = Arc::into_raw(win_ref); + let _ = Arc::into_raw(win); return ret; } @@ -197,7 +197,7 @@ impl Window { break; } TranslateMessage(&mut msg); - handle_message(Arc::clone(&win_p), msg.message, msg.wParam, msg.lParam); + handle_message(&win_p, msg.message, msg.wParam, msg.lParam); } } }