De-duplicate resize events.

This tracks resizes separately, and synthesizes them for the event iterators as needed, so that OS X apps don't generate a whole set of resize events after each resize.
This commit is contained in:
Owen Jacobson 2017-01-24 12:39:35 -05:00
parent 7d6b4c3fe5
commit 6f82ccfba9
No known key found for this signature in database
GPG key ID: 50232991F10DFFD0

View file

@ -43,6 +43,7 @@ struct DelegateState {
view: IdRef, view: IdRef,
window: IdRef, window: IdRef,
resize_handler: Option<fn(u32, u32)>, resize_handler: Option<fn(u32, u32)>,
pending_resize: Mutex<Option<(u32, u32)>>,
/// Events that have been retreived with XLib but not dispatched with iterators yet /// Events that have been retreived with XLib but not dispatched with iterators yet
pending_events: Mutex<VecDeque<Event>>, pending_events: Mutex<VecDeque<Event>>,
@ -83,7 +84,7 @@ impl WindowDelegate {
if let Some(handler) = state.resize_handler { if let Some(handler) = state.resize_handler {
(handler)(width, height); (handler)(width, height);
} }
(*state).pending_events.lock().unwrap().push_back(Event::Resized(width, height)); *state.pending_resize.lock().unwrap() = Some((width, height));
} }
} }
@ -211,6 +212,10 @@ impl<'a> Iterator for PollEventsIterator<'a> {
type Item = Event; type Item = Event;
fn next(&mut self) -> Option<Event> { fn next(&mut self) -> Option<Event> {
if let Some((width, height)) = self.window.delegate.state.pending_resize.lock().unwrap().take() {
return Some(Event::Resized(width, height));
}
if let Some(ev) = self.window.delegate.state.pending_events.lock().unwrap().pop_front() { if let Some(ev) = self.window.delegate.state.pending_events.lock().unwrap().pop_front() {
return Some(ev); return Some(ev);
} }
@ -240,6 +245,10 @@ impl<'a> Iterator for WaitEventsIterator<'a> {
type Item = Event; type Item = Event;
fn next(&mut self) -> Option<Event> { fn next(&mut self) -> Option<Event> {
if let Some((width, height)) = self.window.delegate.state.pending_resize.lock().unwrap().take() {
return Some(Event::Resized(width, height));
}
if let Some(ev) = self.window.delegate.state.pending_events.lock().unwrap().pop_front() { if let Some(ev) = self.window.delegate.state.pending_events.lock().unwrap().pop_front() {
return Some(ev); return Some(ev);
} }
@ -313,6 +322,7 @@ impl Window {
view: view.clone(), view: view.clone(),
window: window.clone(), window: window.clone(),
resize_handler: None, resize_handler: None,
pending_resize: Mutex::new(None),
pending_events: Mutex::new(VecDeque::new()), pending_events: Mutex::new(VecDeque::new()),
}; };