aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvo Wetzel <ivo.wetzel@googlemail.com>2016-03-06 20:47:10 +0100
committerIvo Wetzel <ivo.wetzel@googlemail.com>2016-03-06 20:52:46 +0100
commit7473d99c2f4038a36cb7848e0c08f89b47b219b3 (patch)
treed96df4e2e6d7efe3a55dbe98a8117c1c5f0ab173
parente843206c1303475678482f623477408468b8a74b (diff)
downloadglutin-7473d99c2f4038a36cb7848e0c08f89b47b219b3.zip
glutin-7473d99c2f4038a36cb7848e0c08f89b47b219b3.tar.gz
Implement `min/max_dimensions` for x11 windows.
Size hints are only being set for non-fullscreen windows, if `max_dimensions` are set they'll override the normal `dimensions` since X11 will not automatically resize the window after setting the size hints. `PSize` hint is currently set along with the `min/max` hints for good measure.
-rw-r--r--src/api/x11/window.rs34
1 files changed, 28 insertions, 6 deletions
diff --git a/src/api/x11/window.rs b/src/api/x11/window.rs
index 8cae2be..86d6c92 100644
--- a/src/api/x11/window.rs
+++ b/src/api/x11/window.rs
@@ -310,11 +310,7 @@ impl Window {
pf_reqs: &PixelFormatRequirements, opengl: &GlAttributes<&Window>)
-> Result<Window, CreationError>
{
- let dimensions = window_attrs.dimensions.unwrap_or((800, 600));
-
- // not implemented
- assert!(window_attrs.min_dimensions.is_none());
- assert!(window_attrs.max_dimensions.is_none());
+ let dimensions = window_attrs.max_dimensions.unwrap_or(window_attrs.dimensions.unwrap_or((800, 600)));
let screen_id = match window_attrs.monitor {
Some(PlatformMonitorId::X(MonitorId(_, monitor))) => monitor as i32,
@@ -339,7 +335,7 @@ impl Window {
let m = (0 .. mode_num).map(|i| {
let m: ffi::XF86VidModeModeInfo = ptr::read(*modes.offset(i as isize) as *const _); m
}).find(|m| m.hdisplay >= dimensions.0 as u16 && m.vdisplay >= dimensions.1 as u16);
-
+
match m {
Some(m) => Some(m),
None => return Err(OsError(format!("Could not find a suitable graphics mode")))
@@ -589,6 +585,32 @@ impl Window {
(display.xf86vmode.XF86VidModeSetViewPort)(display.display, screen_id, 0, 0);
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