Skip to content

Commit 868bd05

Browse files
committed
cleanup on window destroyed (free WindowHandler, unregister wndclass)
1 parent d138cfa commit 868bd05

1 file changed

Lines changed: 20 additions & 13 deletions

File tree

src/win/window.rs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

1920
use 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

Comments
 (0)