PistonDevelopers/piston_window

PistonWindow.set_size() does not always apply size

nashimus opened this issue · 5 comments

Example to reproduce

Compiler

rustc --version
rustc 1.47.0 (18bf6b4f0 2020-10-07)

Cargo.toml

[dependencies]
piston_window = "0.113.0"

main.rs

extern crate piston_window;

use piston_window::*;

fn main() {
    let mut window: PistonWindow = WindowSettings::new("Test Window", [480.0, 480.0])
        .exit_on_esc(true)
        .build()
        .unwrap();

    while let Some(e) = window.next() {
        if let Some(_) = e.render_args() {
            render(&mut window, &e);
        }

        if let Some(r) = e.resize_args() {
            resize(r, &mut window);
        }
    }
}

fn render(window: &mut PistonWindow, e: &Event) {
    let win_size = window.size();
    window.draw_2d(e, |c, g, _device| {
        clear([1.0; 4], g);
        rectangle(
            [1.0, 1.0, 0.0, 1.0],
            [
                0.0,
                0.0,
                win_size.width,
                win_size.height,
            ],
            c.transform,
            g,
        );
    });
}

fn resize(r: ResizeArgs, window: &mut PistonWindow) {
    println!("window resized to {} {}", r.window_size[0], r.window_size[1]);

    if r.window_size[0] != r.window_size[1] {
        // try to maintain aspect ratio 1:1
        let xy = (r.window_size[0] + r.window_size[1]) / 2.0;
        let size = Size { width: xy, height: xy };
        window.set_size(size);
        println!("square set to {:?}", size);
        println!("actual window size = {:?}", window.size());
    }
}

Example of output when it does not apply:

window resized to 480 480
window resized to 480 478.7692307692308
square set to Size { width: 479.38461538461536, height: 479.38461538461536 }
actual window size = Size { width: 480.0, height: 478.7692307692308 }
window resized to 490.46153846153845 470.7692307692308
square set to Size { width: 480.61538461538464, height: 480.61538461538464 }
actual window size = Size { width: 490.46153846153845, height: 470.7692307692308 }
window resized to 518.7692307692307 446.7692307692308
square set to Size { width: 482.7692307692307, height: 482.7692307692307 }
actual window size = Size { width: 518.7692307692307, height: 446.7692307692308 }

Example of output when it does apply:

window resized to 617.2307692307693 361.84615384615387
square set to Size { width: 489.53846153846155, height: 489.53846153846155 }
actual window size = Size { width: 617.2307692307693, height: 361.84615384615387 }
window resized to 489.84615384615387 489.84615384615387

Have you checked other window backends?

Try PistonWindow<Sdl2Window> and add pistoncore-sdl2_window.

This will tell us whether the bug is in Piston or in the backend.

I'll give that a shot.

window.set_size() does work when using PistonWindow<Sdl2Window>.

Do you believe there can be a bug here? It seems pretty straight forward to me: https://github.com/PistonDevelopers/glutin_window/blob/master/src/lib.rs#L519

If the bug isn't in glutin_window, then it is probably in winit: https://crates.io/crates/winit