Merge pull request #750 from BonsaiDen/x11_window_size_constraints

Add support for X11 window size constraints
This commit is contained in:
tomaka 2016-03-30 09:15:13 +02:00
commit 9a129aa862

View file

@ -3,7 +3,7 @@ use CreationError;
use CreationError::OsError; use CreationError::OsError;
use libc; use libc;
use std::borrow::Borrow; use std::borrow::Borrow;
use std::{mem, ptr}; use std::{mem, ptr, cmp};
use std::cell::Cell; use std::cell::Cell;
use std::sync::atomic::AtomicBool; use std::sync::atomic::AtomicBool;
use std::collections::VecDeque; use std::collections::VecDeque;
@ -310,11 +310,23 @@ impl Window {
pf_reqs: &PixelFormatRequirements, opengl: &GlAttributes<&Window>) pf_reqs: &PixelFormatRequirements, opengl: &GlAttributes<&Window>)
-> Result<Window, CreationError> -> Result<Window, CreationError>
{ {
let dimensions = window_attrs.dimensions.unwrap_or((800, 600)); let dimensions = {
// not implemented // x11 only applies constraints when the window is actively resized
assert!(window_attrs.min_dimensions.is_none()); // by the user, so we have to manually apply the initial constraints
assert!(window_attrs.max_dimensions.is_none()); let mut dimensions = window_attrs.dimensions.unwrap_or((800, 600));
if let Some(max) = window_attrs.max_dimensions {
dimensions.0 = cmp::min(dimensions.0, max.0);
dimensions.1 = cmp::min(dimensions.1, max.1);
}
if let Some(min) = window_attrs.min_dimensions {
dimensions.0 = cmp::max(dimensions.0, min.0);
dimensions.1 = cmp::max(dimensions.1, min.1);
}
dimensions
};
let screen_id = match window_attrs.monitor { let screen_id = match window_attrs.monitor {
Some(PlatformMonitorId::X(MonitorId(_, monitor))) => monitor as i32, Some(PlatformMonitorId::X(MonitorId(_, monitor))) => monitor as i32,
@ -589,6 +601,32 @@ impl Window {
(display.xf86vmode.XF86VidModeSetViewPort)(display.display, screen_id, 0, 0); (display.xf86vmode.XF86VidModeSetViewPort)(display.display, screen_id, 0, 0);
display.check_errors().expect("Failed to call XF86VidModeSetViewPort"); display.check_errors().expect("Failed to call XF86VidModeSetViewPort");
} }
} else {
// set size hints
let mut size_hints: ffi::XSizeHints = unsafe { mem::zeroed() };
size_hints.flags = ffi::PSize;
size_hints.width = dimensions.0 as i32;
size_hints.height = dimensions.1 as i32;
if let Some(dimensions) = window_attrs.min_dimensions {
size_hints.flags |= ffi::PMinSize;
size_hints.min_width = dimensions.0 as i32;
size_hints.min_height = dimensions.1 as i32;
}
if let Some(dimensions) = window_attrs.max_dimensions {
size_hints.flags |= ffi::PMaxSize;
size_hints.max_width = dimensions.0 as i32;
size_hints.max_height = dimensions.1 as i32;
}
unsafe {
(display.xlib.XSetNormalHints)(display.display, window, &mut size_hints);
display.check_errors().expect("Failed to call XSetNormalHints");
}
} }
// finish creating the OpenGL context // finish creating the OpenGL context