x11: Poll the window until it is really visible

Fixes #697

It seems that `XSync` doesn't really makes the window viewable.

This feels hacky, other option to do it could be using `XIfEvent` or
similar to listen to `MapNotify` events, but we'll have a loop still.

In practice, this lasts between two and thre iterations on my machine,
which is something not noticeable.
This commit is contained in:
Emilio Cobos Álvarez 2016-01-16 18:11:06 +01:00
parent 9ba16e31a9
commit 4d729164c7

View file

@ -9,6 +9,8 @@ use std::sync::atomic::AtomicBool;
use std::collections::VecDeque; use std::collections::VecDeque;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use std::os::raw::c_long; use std::os::raw::c_long;
use std::thread;
use std::time::Duration;
use Api; use Api;
use ContextError; use ContextError;
@ -642,15 +644,26 @@ impl Window {
let ref x_window: &XWindow = window.x.borrow(); let ref x_window: &XWindow = window.x.borrow();
// XSetInputFocus generates an error if the window is not visible, // XSetInputFocus generates an error if the window is not visible,
// therefore we call XSync before to make sure it's the case // therefore we wait until it's the case.
(display.xlib.XSync)(display.display, 0); loop {
(display.xlib.XSetInputFocus)( let mut window_attributes = mem::uninitialized();
display.display, (display.xlib.XGetWindowAttributes)(display.display, x_window.window, &mut window_attributes);
x_window.window, display.check_errors().expect("Failed to call XGetWindowAttributes");
ffi::RevertToParent,
ffi::CurrentTime if window_attributes.map_state == ffi::IsViewable {
); (display.xlib.XSetInputFocus)(
display.check_errors().expect("Failed to call XSetInputFocus"); display.display,
x_window.window,
ffi::RevertToParent,
ffi::CurrentTime
);
display.check_errors().expect("Failed to call XSetInputFocus");
break;
}
// Wait about a frame to avoid too-busy waiting
thread::sleep(Duration::from_millis(16));
}
} }
} }