mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2024-12-24 06:11:30 +11:00
macOS: Implement Moved (#478)
* macOS: Implement Moved Fixes #67 * Also emit Moved after resizes that change position
This commit is contained in:
parent
8f47fdbe67
commit
7aeb2c083b
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
- Corrected `get_position` on Windows to be relative to the screen rather than to the taskbar.
|
- Corrected `get_position` on Windows to be relative to the screen rather than to the taskbar.
|
||||||
- Corrected `Moved` event on Windows to use position values equivalent to those returned by `get_position`. It previously supplied client area positions instead of window positions, and would additionally interpret negative values as being very large (around `u16::MAX`).
|
- Corrected `Moved` event on Windows to use position values equivalent to those returned by `get_position`. It previously supplied client area positions instead of window positions, and would additionally interpret negative values as being very large (around `u16::MAX`).
|
||||||
|
- Implemented `Moved` event on macOS.
|
||||||
|
|
||||||
# Version 0.13.1 (2018-04-26)
|
# Version 0.13.1 (2018-04-26)
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ use std;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
use std::os::raw::c_void;
|
use std::os::raw::c_void;
|
||||||
use std::sync::Weak;
|
use std::sync::Weak;
|
||||||
use std::cell::{Cell,RefCell};
|
use std::cell::{Cell, RefCell};
|
||||||
|
|
||||||
use super::events_loop::{EventsLoop, Shared};
|
use super::events_loop::{EventsLoop, Shared};
|
||||||
|
|
||||||
|
@ -43,6 +43,9 @@ struct DelegateState {
|
||||||
// This is set when WindowBuilder::with_fullscreen was set,
|
// This is set when WindowBuilder::with_fullscreen was set,
|
||||||
// see comments of `window_did_fail_to_enter_fullscreen`
|
// see comments of `window_did_fail_to_enter_fullscreen`
|
||||||
handle_with_fullscreen: bool,
|
handle_with_fullscreen: bool,
|
||||||
|
|
||||||
|
// During windowDidResize, we use this to only send Moved if the position changed.
|
||||||
|
previous_position: Option<(i32, i32)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DelegateState {
|
impl DelegateState {
|
||||||
|
@ -161,6 +164,17 @@ impl WindowDelegate {
|
||||||
emit_event(state, WindowEvent::Resized(width, height));
|
emit_event(state, WindowEvent::Resized(width, height));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe fn emit_move_event(state: &mut DelegateState) {
|
||||||
|
let frame_rect = NSWindow::frame(*state.window);
|
||||||
|
let x = frame_rect.origin.x as _;
|
||||||
|
let y = Window2::bottom_left_to_top_left(frame_rect);
|
||||||
|
let moved = state.previous_position != Some((x, y));
|
||||||
|
if moved {
|
||||||
|
state.previous_position = Some((x, y));
|
||||||
|
emit_event(state, WindowEvent::Moved(x, y));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
extern fn window_should_close(this: &Object, _: Sel, _: id) -> BOOL {
|
extern fn window_should_close(this: &Object, _: Sel, _: id) -> BOOL {
|
||||||
unsafe {
|
unsafe {
|
||||||
let state: *mut c_void = *this.get_ivar("winitState");
|
let state: *mut c_void = *this.get_ivar("winitState");
|
||||||
|
@ -190,6 +204,16 @@ impl WindowDelegate {
|
||||||
let state: *mut c_void = *this.get_ivar("winitState");
|
let state: *mut c_void = *this.get_ivar("winitState");
|
||||||
let state = &mut *(state as *mut DelegateState);
|
let state = &mut *(state as *mut DelegateState);
|
||||||
emit_resize_event(state);
|
emit_resize_event(state);
|
||||||
|
emit_move_event(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This won't be triggered if the move was part of a resize.
|
||||||
|
extern fn window_did_move(this: &Object, _: Sel, _: id) {
|
||||||
|
unsafe {
|
||||||
|
let state: *mut c_void = *this.get_ivar("winitState");
|
||||||
|
let state = &mut *(state as *mut DelegateState);
|
||||||
|
emit_move_event(state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -377,6 +401,8 @@ impl WindowDelegate {
|
||||||
window_will_close as extern fn(&Object, Sel, id));
|
window_will_close as extern fn(&Object, Sel, id));
|
||||||
decl.add_method(sel!(windowDidResize:),
|
decl.add_method(sel!(windowDidResize:),
|
||||||
window_did_resize as extern fn(&Object, Sel, id));
|
window_did_resize as extern fn(&Object, Sel, id));
|
||||||
|
decl.add_method(sel!(windowDidMove:),
|
||||||
|
window_did_move as extern fn(&Object, Sel, id));
|
||||||
decl.add_method(sel!(windowDidChangeScreen:),
|
decl.add_method(sel!(windowDidChangeScreen:),
|
||||||
window_did_change_screen as extern fn(&Object, Sel, id));
|
window_did_change_screen as extern fn(&Object, Sel, id));
|
||||||
decl.add_method(sel!(windowDidChangeBackingProperties:),
|
decl.add_method(sel!(windowDidChangeBackingProperties:),
|
||||||
|
@ -553,11 +579,12 @@ impl Window2 {
|
||||||
let ds = DelegateState {
|
let ds = DelegateState {
|
||||||
view: view.clone(),
|
view: view.clone(),
|
||||||
window: window.clone(),
|
window: window.clone(),
|
||||||
|
shared,
|
||||||
win_attribs: RefCell::new(win_attribs.clone()),
|
win_attribs: RefCell::new(win_attribs.clone()),
|
||||||
standard_frame: Cell::new(None),
|
standard_frame: Cell::new(None),
|
||||||
save_style_mask: Cell::new(None),
|
save_style_mask: Cell::new(None),
|
||||||
handle_with_fullscreen: win_attribs.fullscreen.is_some(),
|
handle_with_fullscreen: win_attribs.fullscreen.is_some(),
|
||||||
shared: shared,
|
previous_position: None,
|
||||||
};
|
};
|
||||||
ds.win_attribs.borrow_mut().fullscreen = None;
|
ds.win_attribs.borrow_mut().fullscreen = None;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue