1
0
Fork 0

x11: coalesce CONFIGURE_NOTIFY events

This commit is contained in:
William Light 2020-09-12 19:31:13 +02:00
parent ac0e1215f7
commit 9cad2d1b5a

View file

@ -22,6 +22,8 @@ pub struct Window {
frame_interval: Duration, frame_interval: Duration,
event_loop_running: bool, event_loop_running: bool,
new_size: Option<(u32, u32)>
} }
// FIXME: move to outer crate context // FIXME: move to outer crate context
@ -156,6 +158,8 @@ impl Window {
frame_interval: Duration::from_millis(15), frame_interval: Duration::from_millis(15),
event_loop_running: false, event_loop_running: false,
new_size: None
}; };
let mut handler = H::build(&mut window); let mut handler = H::build(&mut window);
@ -172,9 +176,23 @@ impl Window {
#[inline] #[inline]
fn drain_xcb_events<H: WindowHandler>(&mut self, handler: &mut H) { fn drain_xcb_events<H: WindowHandler>(&mut self, handler: &mut H) {
// the X server has a tendency to send spurious/extraneous configure notify events when a
// window is resized, and we need to batch those together and just send one resize event
// when they've all been coalesced.
self.new_size = None;
while let Some(event) = self.xcb_connection.conn.poll_for_event() { while let Some(event) = self.xcb_connection.conn.poll_for_event() {
self.handle_xcb_event(handler, event); self.handle_xcb_event(handler, event);
} }
if let Some((width, height)) = self.new_size.take() {
self.window_info.width = width;
self.window_info.height = height;
handler.on_event(self, Event::Window(
WindowEvent::Resized(self.window_info)
))
}
} }
// Event loop // Event loop
@ -272,14 +290,7 @@ impl Window {
xcb::CONFIGURE_NOTIFY => { xcb::CONFIGURE_NOTIFY => {
let event = unsafe { xcb::cast_event::<xcb::ConfigureNotifyEvent>(&event) }; let event = unsafe { xcb::cast_event::<xcb::ConfigureNotifyEvent>(&event) };
if self.window_info.width != event.width() as u32 self.new_size = Some((event.width() as u32, event.height() as u32));
|| self.window_info.height != event.height() as u32
{
self.window_info.width = event.width() as u32;
self.window_info.height = event.height() as u32;
handler.on_event(self, Event::Window(WindowEvent::Resized(self.window_info)))
}
} }
//// ////