@@ -6,14 +6,15 @@ use winapi::um::winuser::{
66 AdjustWindowRectEx , CreateWindowExW , DefWindowProcW , DispatchMessageW ,
77 GetMessageW , GetWindowLongPtrW , PostMessageW , RegisterClassW , SetTimer ,
88 SetWindowLongPtrW , TranslateMessage , UnregisterClassW , LoadCursorW ,
9+ DestroyWindow ,
910 CS_OWNDC , GWLP_USERDATA , IDC_ARROW ,
10- MSG , WM_CLOSE , WM_CREATE , WM_MOUSEMOVE , WM_SHOWWINDOW , WM_TIMER ,
11+ MSG , WM_CLOSE , WM_CREATE , WM_MOUSEMOVE , WM_SHOWWINDOW , WM_TIMER , WM_NCDESTROY ,
1112 WNDCLASSW , WS_CAPTION , WS_CHILD , WS_CLIPSIBLINGS , WS_MAXIMIZEBOX , WS_MINIMIZEBOX ,
1213 WS_POPUPWINDOW , WS_SIZEBOX , WS_VISIBLE , WM_DPICHANGED , WM_CHAR , WM_SYSCHAR , WM_KEYDOWN ,
1314 WM_SYSKEYDOWN , WM_KEYUP , WM_SYSKEYUP , WM_INPUTLANGCHANGE ,
1415 GET_XBUTTON_WPARAM , WM_LBUTTONDOWN , WM_LBUTTONUP , WM_MBUTTONDOWN , WM_MBUTTONUP ,
1516 WM_RBUTTONDOWN , WM_RBUTTONUP , WM_XBUTTONDOWN , WM_XBUTTONUP , XBUTTON1 , XBUTTON2 ,
16- SetCapture , GetCapture , ReleaseCapture , IsWindow
17+ SetCapture , GetCapture , ReleaseCapture , IsWindow ,
1718} ;
1819
1920use std:: cell:: RefCell ;
@@ -63,9 +64,8 @@ unsafe extern "system" fn wnd_proc(
6364 return 0 ;
6465 }
6566
66- let win_ptr = GetWindowLongPtrW ( hwnd, GWLP_USERDATA ) as * const c_void ;
67- if !win_ptr. is_null ( ) {
68- let window_state = & * ( win_ptr as * const RefCell < WindowState > ) ;
67+ let window_state_ptr = GetWindowLongPtrW ( hwnd, GWLP_USERDATA ) as * mut RefCell < WindowState > ;
68+ if !window_state_ptr. is_null ( ) {
6969 let mut window = Window { hwnd } ;
7070 let mut window = crate :: Window ( & mut window) ;
7171
@@ -76,7 +76,7 @@ unsafe extern "system" fn wnd_proc(
7676
7777 let physical_pos = PhyPoint { x, y } ;
7878
79- let mut window_state = window_state . borrow_mut ( ) ;
79+ let mut window_state = ( & * window_state_ptr ) . borrow_mut ( ) ;
8080
8181 let logical_pos = physical_pos. to_logical ( & window_state. window_info ) ;
8282
@@ -91,7 +91,7 @@ unsafe extern "system" fn wnd_proc(
9191 WM_LBUTTONDOWN | WM_LBUTTONUP | WM_MBUTTONDOWN | WM_MBUTTONUP |
9292 WM_RBUTTONDOWN | WM_RBUTTONUP | WM_XBUTTONDOWN | WM_XBUTTONUP => {
9393
94- let mut mouse_button_counter = window_state . borrow ( ) . mouse_button_counter ;
94+ let mut mouse_button_counter = ( & * window_state_ptr ) . borrow ( ) . mouse_button_counter ;
9595
9696 let button = match msg {
9797 WM_LBUTTONDOWN | WM_LBUTTONUP => Some ( MouseButton :: Left ) ,
@@ -127,40 +127,42 @@ unsafe extern "system" fn wnd_proc(
127127 }
128128 } ;
129129
130- window_state . borrow_mut ( ) . mouse_button_counter = mouse_button_counter;
130+ ( & * window_state_ptr ) . borrow_mut ( ) . mouse_button_counter = mouse_button_counter;
131131
132- window_state . borrow_mut ( )
132+ ( & * window_state_ptr ) . borrow_mut ( )
133133 . handler
134134 . on_event ( & mut window, Event :: Mouse ( event) ) ;
135135 }
136136 }
137137 WM_TIMER => {
138138 match wparam {
139139 WIN_FRAME_TIMER => {
140- window_state . borrow_mut ( ) . handler . on_frame ( ) ;
140+ ( & * window_state_ptr ) . borrow_mut ( ) . handler . on_frame ( ) ;
141141 }
142142 _ => ( ) ,
143143 }
144144 return 0 ;
145145 }
146146 WM_CLOSE => {
147- window_state
147+ ( & * window_state_ptr )
148148 . borrow_mut ( )
149149 . handler
150150 . on_event ( & mut window, Event :: Window ( WindowEvent :: WillClose ) ) ;
151+ // DestroyWindow(hwnd);
152+ // return 0;
151153 return DefWindowProcW ( hwnd, msg, wparam, lparam) ;
152154 }
153155 WM_DPICHANGED => {
154156 // TODO: Notify app of DPI change
155157 } ,
156158 WM_CHAR | WM_SYSCHAR | WM_KEYDOWN | WM_SYSKEYDOWN | WM_KEYUP
157159 | WM_SYSKEYUP | WM_INPUTLANGCHANGE => {
158- let opt_event = window_state . borrow_mut ( )
160+ let opt_event = ( & * window_state_ptr ) . borrow_mut ( )
159161 . keyboard_state
160162 . process_message ( hwnd, msg, wparam, lparam) ;
161163
162164 if let Some ( event) = opt_event {
163- window_state . borrow_mut ( )
165+ ( & * window_state_ptr ) . borrow_mut ( )
164166 . handler
165167 . on_event ( & mut window, Event :: Keyboard ( event) ) ;
166168 }
@@ -169,6 +171,11 @@ unsafe extern "system" fn wnd_proc(
169171 return 0 ;
170172 }
171173 }
174+ WM_NCDESTROY => {
175+ let window_state = Box :: from_raw ( window_state_ptr) ;
176+ unregister_wnd_class ( window_state. borrow ( ) . window_class ) ;
177+ SetWindowLongPtrW ( hwnd, GWLP_USERDATA , 0 ) ;
178+ }
172179 _ => { }
173180 }
174181
0 commit comments