1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
//! # The windowing types for luminance
//!
//! This crate provides you with a set of common types you can use when implementing windowing
//! crates. Even though the crate is used in most [luminance] windowing backends.
//!
//! [luminance]: https://crates.io/crates/luminance

#![deny(missing_docs)]

/// Dimension metrics.
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum WindowDim {
  /// Windowed mode.
  Windowed {
    /// Width of the window.
    width: u32,
    /// Height of the window.
    height: u32,
  },
  /// Fullscreen mode (using the primary monitor resolution, for instance).
  Fullscreen,
  /// Fullscreen mode with restricted viewport dimension..
  FullscreenRestricted {
    /// Width of the window.
    width: u32,
    /// Height of the window.
    height: u32,
  },
}

/// Cursor mode.
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum CursorMode {
  /// The cursor is always visible. It is up to the backend to decide what the visual representing
  /// the cursor is.
  Visible,
  /// The cursor exists yet is not shown. It is up to the programmer / user to decide what the
  /// visual representing the cursor is.
  Invisible,
  /// The cursor is disabled. It is not shown and should be considered non-active.
  Disabled,
}

/// Different window options.
///
/// Feel free to look at the different methods available to tweak the options. You may want to start
/// with `default()`, though.
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct WindowOpt {
  /// Dimension of the window.
  pub dim: WindowDim,
  /// Cursor mode.
  pub cursor_mode: CursorMode,
  /// Number of samples for multisampling.
  ///
  /// `None` means no multisampling.
  pub num_samples: Option<u32>,
}

impl Default for WindowOpt {
  /// Defaults:
  ///
  /// - `dim`: set to WindowDim::Windowed { width: 960, 540 }`.
  /// - `cursor_mode` set to `CursorMode::Visible`.
  /// - `num_samples` set to `None`.
  fn default() -> Self {
    WindowOpt {
      dim: WindowDim::Windowed {
        width: 960,
        height: 540,
      },
      cursor_mode: CursorMode::Visible,
      num_samples: None,
    }
  }
}

impl WindowOpt {
  /// Set the dimension of the window.
  #[inline]
  pub fn set_dim(self, dim: WindowDim) -> Self {
    WindowOpt { dim, ..self }
  }

  /// Get the dimension of the window.
  #[inline]
  pub fn dim(&self) -> &WindowDim {
    &self.dim
  }

  /// Hide, unhide or disable the cursor.
  #[inline]
  pub fn set_cursor_mode(self, cursor_mode: CursorMode) -> Self {
    WindowOpt {
      cursor_mode,
      ..self
    }
  }

  /// Get the cursor mode.
  #[inline]
  pub fn cursor_mode(&self) -> &CursorMode {
    &self.cursor_mode
  }

  /// Set the number of samples to use for multisampling.
  ///
  /// Pass `None` to disable multisampling.
  #[inline]
  pub fn set_num_samples<S>(self, num_samples: S) -> Self
  where
    S: Into<Option<u32>>,
  {
    WindowOpt {
      num_samples: num_samples.into(),
      ..self
    }
  }

  /// Get the number of samples to use in multisampling, if any.
  #[inline]
  pub fn num_samples(&self) -> &Option<u32> {
    &self.num_samples
  }
}