macOS: remove runtime timer, use frame timer instead
This commit is contained in:
parent
1ea32123ed
commit
99fdbff4e2
|
@ -21,8 +21,7 @@ use crate::{
|
||||||
use crate::MouseEvent::{ButtonPressed, ButtonReleased};
|
use crate::MouseEvent::{ButtonPressed, ButtonReleased};
|
||||||
|
|
||||||
use super::window::{
|
use super::window::{
|
||||||
WindowState, WINDOW_STATE_IVAR_NAME, FRAME_TIMER_IVAR_NAME,
|
WindowState, WINDOW_STATE_IVAR_NAME, FRAME_TIMER_IVAR_NAME
|
||||||
RUNTIME_TIMER_IVAR_NAME
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -70,10 +69,6 @@ unsafe fn create_view_class<H: WindowHandler>() -> &'static Class {
|
||||||
accepts_first_mouse::<H> as extern "C" fn(&Object, Sel, id) -> BOOL
|
accepts_first_mouse::<H> as extern "C" fn(&Object, Sel, id) -> BOOL
|
||||||
);
|
);
|
||||||
|
|
||||||
class.add_method(
|
|
||||||
sel!(runtimeTick:),
|
|
||||||
runtime_tick::<H> as extern "C" fn(&Object, Sel, id)
|
|
||||||
);
|
|
||||||
class.add_method(
|
class.add_method(
|
||||||
sel!(triggerOnFrame:),
|
sel!(triggerOnFrame:),
|
||||||
trigger_on_frame::<H> as extern "C" fn(&Object, Sel, id)
|
trigger_on_frame::<H> as extern "C" fn(&Object, Sel, id)
|
||||||
|
@ -157,7 +152,6 @@ unsafe fn create_view_class<H: WindowHandler>() -> &'static Class {
|
||||||
|
|
||||||
class.add_ivar::<*mut c_void>(WINDOW_STATE_IVAR_NAME);
|
class.add_ivar::<*mut c_void>(WINDOW_STATE_IVAR_NAME);
|
||||||
class.add_ivar::<*mut c_void>(FRAME_TIMER_IVAR_NAME);
|
class.add_ivar::<*mut c_void>(FRAME_TIMER_IVAR_NAME);
|
||||||
class.add_ivar::<*mut c_void>(RUNTIME_TIMER_IVAR_NAME);
|
|
||||||
|
|
||||||
class.register()
|
class.register()
|
||||||
}
|
}
|
||||||
|
@ -197,20 +191,8 @@ extern "C" fn trigger_on_frame<H: WindowHandler>(
|
||||||
WindowState::from_field(this)
|
WindowState::from_field(this)
|
||||||
};
|
};
|
||||||
|
|
||||||
state.trigger_frame();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" fn runtime_tick<H: WindowHandler>(
|
|
||||||
this: &Object,
|
|
||||||
_sel: Sel,
|
|
||||||
_event: id
|
|
||||||
){
|
|
||||||
let state: &mut WindowState<H> = unsafe {
|
|
||||||
WindowState::from_field(this)
|
|
||||||
};
|
|
||||||
|
|
||||||
state.handle_messages();
|
state.handle_messages();
|
||||||
|
state.trigger_frame();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -231,12 +213,6 @@ extern "C" fn release<H: WindowHandler>(this: &Object, _sel: Sel) {
|
||||||
);
|
);
|
||||||
let _: () = msg_send![frame_timer_ptr as id, invalidate];
|
let _: () = msg_send![frame_timer_ptr as id, invalidate];
|
||||||
|
|
||||||
// Invalidate runtime timer
|
|
||||||
let frame_timer_ptr: *mut c_void = *this.get_ivar(
|
|
||||||
RUNTIME_TIMER_IVAR_NAME
|
|
||||||
);
|
|
||||||
let _: () = msg_send![frame_timer_ptr as id, invalidate];
|
|
||||||
|
|
||||||
// Drop WindowState
|
// Drop WindowState
|
||||||
let state_ptr: *mut c_void = *this.get_ivar(
|
let state_ptr: *mut c_void = *this.get_ivar(
|
||||||
WINDOW_STATE_IVAR_NAME
|
WINDOW_STATE_IVAR_NAME
|
||||||
|
|
|
@ -31,7 +31,6 @@ use super::keyboard::KeyboardState;
|
||||||
pub(super) const WINDOW_STATE_IVAR_NAME: &str = "WINDOW_STATE_IVAR_NAME";
|
pub(super) const WINDOW_STATE_IVAR_NAME: &str = "WINDOW_STATE_IVAR_NAME";
|
||||||
|
|
||||||
pub(super) const FRAME_TIMER_IVAR_NAME: &str = "FRAME_TIMER";
|
pub(super) const FRAME_TIMER_IVAR_NAME: &str = "FRAME_TIMER";
|
||||||
pub(super) const RUNTIME_TIMER_IVAR_NAME: &str = "RUNTIME_TIMER";
|
|
||||||
|
|
||||||
|
|
||||||
pub struct Window {
|
pub struct Window {
|
||||||
|
@ -222,27 +221,6 @@ impl Window {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup runtime timer once window state is stored
|
|
||||||
unsafe {
|
|
||||||
let timer_interval = 0.01;
|
|
||||||
let selector = sel!(runtimeTick:);
|
|
||||||
|
|
||||||
let timer: id = msg_send![
|
|
||||||
::objc::class!(NSTimer),
|
|
||||||
scheduledTimerWithTimeInterval:timer_interval
|
|
||||||
target:window_state_arc.window.ns_view
|
|
||||||
selector:selector
|
|
||||||
userInfo:nil
|
|
||||||
repeats:YES
|
|
||||||
];
|
|
||||||
|
|
||||||
// Store pointer to timer for invalidation when view is released
|
|
||||||
(*window_state_arc.window.ns_view).set_ivar(
|
|
||||||
RUNTIME_TIMER_IVAR_NAME,
|
|
||||||
timer as *mut c_void,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
crate::WindowHandle(WindowHandle {
|
crate::WindowHandle(WindowHandle {
|
||||||
message_tx
|
message_tx
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in a new issue