tge 0.0.4

A lightweight cross-platform 2D game framework written in pure Rust and based on OpenGL 3.3+.
Documentation
use crate::error::{GameError, GameResult};
use winit::window::Fullscreen;
use winit::monitor::{VideoMode, MonitorHandle};

#[derive(Debug, Copy, Clone, Hash, Eq, PartialEq)]
pub enum FullscreenMode {
    Exclusive,
    Borderless,
}

impl FullscreenMode {
    pub(crate) fn from_raw(fullscreen: Fullscreen) -> Self {
        match fullscreen {
            Fullscreen::Exclusive(_) => Self::Exclusive,
            Fullscreen::Borderless(_) => Self::Borderless,
        }
    }

    pub(crate) fn into_raw(self, monitor: Option<MonitorHandle>) -> GameResult<Fullscreen> {
        match self {
            Self::Exclusive => get_preferred_video_mode(monitor)
                .map(|video_mode| Fullscreen::Exclusive(video_mode)),
            Self::Borderless => Ok(Fullscreen::Borderless(monitor)),
        }
    }
}

fn get_preferred_video_mode(monitor: Option<MonitorHandle>) -> GameResult<VideoMode> {
    let mut preferred_video_mode: Option<VideoMode> = None;
    if let Some(monitor) = monitor {
        for (_, video_mode) in monitor.video_modes().enumerate() {
            if let Some(current_video_mode) = &preferred_video_mode {
                let current_size = current_video_mode.size();
                let size = video_mode.size();
                if current_size.width * current_size.height < size.width * size.height {
                    preferred_video_mode = Some(video_mode);
                }
            } else {
                preferred_video_mode = Some(video_mode);
            }
        }
    }
    preferred_video_mode.ok_or_else(|| GameError::NotSupportedError("no available video mode".into()))
}