Implement transparency for X11

This commit is contained in:
pinumbernumber 2015-06-14 22:20:32 +01:00
parent a0e29d9410
commit da4bcad6e3

View file

@ -339,7 +339,23 @@ impl Window {
if fb.is_null() { if fb.is_null() {
return Err(OsError(format!("glx::ChooseFBConfig failed"))); return Err(OsError(format!("glx::ChooseFBConfig failed")));
} }
let preferred_fb = *fb; // TODO: choose more wisely
let preferred_fb = if builder.transparent {
let mut best_fbi_for_transparent = 0isize;
for i in 0isize..num_fb as isize {
let vi = display.glx.as_ref().unwrap().GetVisualFromFBConfig(display.display as *mut _, *fb.offset(i));
if (*vi).depth == 32 {
best_fbi_for_transparent = i;
break;
}
}
*fb.offset(best_fbi_for_transparent)
} else {
*fb // TODO: choose more wisely
};
(display.xlib.XFree)(fb as *mut _); (display.xlib.XFree)(fb as *mut _);
preferred_fb preferred_fb
}; };
@ -425,11 +441,19 @@ impl Window {
ffi::KeyReleaseMask | ffi::ButtonPressMask | ffi::KeyReleaseMask | ffi::ButtonPressMask |
ffi::ButtonReleaseMask | ffi::KeymapStateMask; ffi::ButtonReleaseMask | ffi::KeymapStateMask;
swa.border_pixel = 0; swa.border_pixel = 0;
if builder.transparent {
swa.background_pixel = 0;
}
swa.override_redirect = 0; swa.override_redirect = 0;
swa swa
}; };
let mut window_attributes = ffi::CWBorderPixel | ffi::CWColormap | ffi::CWEventMask; let mut window_attributes = ffi::CWBorderPixel | ffi::CWColormap | ffi::CWEventMask;
if builder.transparent {
window_attributes |= ffi::CWBackPixel;
}
if builder.monitor.is_some() { if builder.monitor.is_some() {
window_attributes |= ffi::CWOverrideRedirect; window_attributes |= ffi::CWOverrideRedirect;
unsafe { unsafe {