mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2024-12-25 06:41:31 +11:00
Touch events emit screen coordinates instead of client coordinates on Windows (#1042)
* Touch events emit screen coordinates instead of client coordinates on Windows Fixes #1002 * Don't lose precision of WM_TOUCH events when converting from screen space to client space * Updated CHANGELOG.md to reflect changes from issue: #1042
This commit is contained in:
parent
e8e4d4ce66
commit
8567758156
|
@ -18,6 +18,7 @@ and `WindowEvent::HoveredFile`.
|
||||||
- On Windows, fix the trail effect happening on transparent decorated windows. Borderless (or un-decorated) windows were not affected.
|
- On Windows, fix the trail effect happening on transparent decorated windows. Borderless (or un-decorated) windows were not affected.
|
||||||
- On Windows, fix `with_maximized` not properly setting window size to entire window.
|
- On Windows, fix `with_maximized` not properly setting window size to entire window.
|
||||||
- On macOS, change `WindowExtMacOS::request_user_attention()` to take an `enum` instead of a `bool`.
|
- On macOS, change `WindowExtMacOS::request_user_attention()` to take an `enum` instead of a `bool`.
|
||||||
|
- On Windows, location of `WindowEvent::Touch` are window client coordinates instead of screen coordinates.
|
||||||
|
|
||||||
# 0.20.0 Alpha 1 (2019-06-21)
|
# 0.20.0 Alpha 1 (2019-06-21)
|
||||||
|
|
||||||
|
|
|
@ -1448,8 +1448,17 @@ unsafe extern "system" fn public_window_callback<T>(
|
||||||
{
|
{
|
||||||
let dpi_factor = hwnd_scale_factor(window);
|
let dpi_factor = hwnd_scale_factor(window);
|
||||||
for input in &inputs {
|
for input in &inputs {
|
||||||
let x = (input.x as f64) / 100f64;
|
let mut location = POINT {
|
||||||
let y = (input.y as f64) / 100f64;
|
x: input.x / 100,
|
||||||
|
y: input.y / 100,
|
||||||
|
};
|
||||||
|
|
||||||
|
if winuser::ScreenToClient(window, &mut location as *mut _) == 0 {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let x = location.x as f64 + (input.x % 100) as f64 / 100f64;
|
||||||
|
let y = location.y as f64 + (input.y % 100) as f64 / 100f64;
|
||||||
let location = LogicalPosition::from_physical((x, y), dpi_factor);
|
let location = LogicalPosition::from_physical((x, y), dpi_factor);
|
||||||
subclass_input.send_event(Event::WindowEvent {
|
subclass_input.send_event(Event::WindowEvent {
|
||||||
window_id: RootWindowId(WindowId(window)),
|
window_id: RootWindowId(WindowId(window)),
|
||||||
|
@ -1510,8 +1519,17 @@ unsafe extern "system" fn public_window_callback<T>(
|
||||||
// The information retrieved appears in reverse chronological order, with the most recent entry in the first
|
// The information retrieved appears in reverse chronological order, with the most recent entry in the first
|
||||||
// row of the returned array
|
// row of the returned array
|
||||||
for pointer_info in pointer_infos.iter().rev() {
|
for pointer_info in pointer_infos.iter().rev() {
|
||||||
let x = pointer_info.ptPixelLocation.x as f64;
|
let mut location = POINT {
|
||||||
let y = pointer_info.ptPixelLocation.y as f64;
|
x: pointer_info.ptPixelLocation.x,
|
||||||
|
y: pointer_info.ptPixelLocation.y,
|
||||||
|
};
|
||||||
|
|
||||||
|
if winuser::ScreenToClient(window, &mut location as *mut _) == 0 {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let x = location.x as f64;
|
||||||
|
let y = location.y as f64;
|
||||||
let location = LogicalPosition::from_physical((x, y), dpi_factor);
|
let location = LogicalPosition::from_physical((x, y), dpi_factor);
|
||||||
subclass_input.send_event(Event::WindowEvent {
|
subclass_input.send_event(Event::WindowEvent {
|
||||||
window_id: RootWindowId(WindowId(window)),
|
window_id: RootWindowId(WindowId(window)),
|
||||||
|
|
Loading…
Reference in a new issue