Added mouse capture/release to windows backend (#81)
* Added mouse capture/release to windows backend * Mouse capture now automatic only Removed manual ability to trigger mouse capture and release. * Added refcount for mouse button event Added refcount to prevent the mouse capture from releasing before all mouse buttons have been released. * Removed unnecessary function from window
This commit is contained in:
parent
c64b2257f5
commit
9fdb75155d
|
@ -13,6 +13,7 @@ use winapi::um::winuser::{
|
||||||
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,
|
||||||
WM_RBUTTONDOWN, WM_RBUTTONUP, WM_XBUTTONDOWN, WM_XBUTTONUP, XBUTTON1, XBUTTON2,
|
WM_RBUTTONDOWN, WM_RBUTTONUP, WM_XBUTTONDOWN, WM_XBUTTONUP, XBUTTON1, XBUTTON2,
|
||||||
|
SetCapture, GetCapture, ReleaseCapture, IsWindow
|
||||||
};
|
};
|
||||||
|
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
|
@ -68,6 +69,8 @@ unsafe extern "system" fn wnd_proc(
|
||||||
let mut window = Window { hwnd };
|
let mut window = Window { hwnd };
|
||||||
let mut window = crate::Window(&mut window);
|
let mut window = crate::Window(&mut window);
|
||||||
|
|
||||||
|
let mut mouse_button_counter = window_state.borrow().mouse_button_counter;
|
||||||
|
|
||||||
match msg {
|
match msg {
|
||||||
WM_MOUSEMOVE => {
|
WM_MOUSEMOVE => {
|
||||||
let x = (lparam & 0xFFFF) as i32;
|
let x = (lparam & 0xFFFF) as i32;
|
||||||
|
@ -104,9 +107,18 @@ unsafe extern "system" fn wnd_proc(
|
||||||
if let Some(button) = button {
|
if let Some(button) = button {
|
||||||
let event = match msg {
|
let event = match msg {
|
||||||
WM_LBUTTONDOWN | WM_MBUTTONDOWN | WM_RBUTTONDOWN | WM_XBUTTONDOWN => {
|
WM_LBUTTONDOWN | WM_MBUTTONDOWN | WM_RBUTTONDOWN | WM_XBUTTONDOWN => {
|
||||||
|
// Capture the mouse cursor on button down
|
||||||
|
mouse_button_counter = mouse_button_counter.saturating_add(1);
|
||||||
|
SetCapture(hwnd);
|
||||||
MouseEvent::ButtonPressed(button)
|
MouseEvent::ButtonPressed(button)
|
||||||
}
|
}
|
||||||
WM_LBUTTONUP | WM_MBUTTONUP | WM_RBUTTONUP | WM_XBUTTONUP => {
|
WM_LBUTTONUP | WM_MBUTTONUP | WM_RBUTTONUP | WM_XBUTTONUP => {
|
||||||
|
// Release the mouse cursor capture when all buttons are released
|
||||||
|
mouse_button_counter = mouse_button_counter.saturating_sub(1);
|
||||||
|
if mouse_button_counter == 0 {
|
||||||
|
ReleaseCapture();
|
||||||
|
}
|
||||||
|
|
||||||
MouseEvent::ButtonReleased(button)
|
MouseEvent::ButtonReleased(button)
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
|
@ -156,6 +168,8 @@ unsafe extern "system" fn wnd_proc(
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
window_state.borrow_mut().mouse_button_counter = mouse_button_counter;
|
||||||
}
|
}
|
||||||
|
|
||||||
return DefWindowProcW(hwnd, msg, wparam, lparam);
|
return DefWindowProcW(hwnd, msg, wparam, lparam);
|
||||||
|
@ -193,6 +207,7 @@ struct WindowState {
|
||||||
window_class: ATOM,
|
window_class: ATOM,
|
||||||
window_info: WindowInfo,
|
window_info: WindowInfo,
|
||||||
keyboard_state: KeyboardState,
|
keyboard_state: KeyboardState,
|
||||||
|
mouse_button_counter: usize,
|
||||||
handler: Box<dyn WindowHandler>,
|
handler: Box<dyn WindowHandler>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -301,6 +316,7 @@ impl Window {
|
||||||
window_class,
|
window_class,
|
||||||
window_info,
|
window_info,
|
||||||
keyboard_state: KeyboardState::new(),
|
keyboard_state: KeyboardState::new(),
|
||||||
|
mouse_button_counter: 0,
|
||||||
handler,
|
handler,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue