glutin/
lib.rs

1//! The purpose of this library is to provide an OpenGL [`context`] for as many
2//! platforms as possible, abstracting away the underlying differences without
3//! losing access to platform specific extensions.
4//!
5//! However Glutin doesn't force users into using the cross platform
6//! abstractions. When only a particular [`api`] is desired, it can
7//! be used directly.
8//!
9//! The initialization starts by loading and connecting to the platform's
10//! graphics Api when creating a [`display`]. This object is used to create all
11//! the OpenGL objects, such as [`config`], [`context`], and [`surface`].
12//!
13//! ## Environment variables
14//!
15//! `GLUTIN_WGL_OPENGL_DLL` - change the name of the OpenGL DLL to load.
16
17#![deny(rust_2018_idioms)]
18#![deny(rustdoc::broken_intra_doc_links)]
19#![deny(unsafe_op_in_unsafe_fn)]
20#![deny(improper_ctypes, improper_ctypes_definitions)]
21#![deny(clippy::all)]
22#![deny(missing_debug_implementations)]
23#![deny(missing_docs)]
24#![cfg_attr(clippy, deny(warnings))]
25#![cfg_attr(docsrs, feature(doc_auto_cfg))]
26
27#[cfg(all(not(egl_backend), not(glx_backend), not(wgl_backend), not(cgl_backend)))]
28compile_error!("Please select at least one api backend");
29
30pub mod api;
31pub mod config;
32pub mod context;
33pub mod display;
34pub mod error;
35pub mod platform;
36pub mod prelude;
37pub mod surface;
38
39#[cfg(any(egl_backend, glx_backend))]
40mod lib_loading;
41
42pub(crate) mod private {
43    /// Prevent traits from being implemented downstream, since those are used
44    /// purely for documentation organization and simplify platform api
45    /// implementation maintenance.
46    pub trait Sealed {}
47
48    /// `gl_api_dispatch!(match expr; Enum(foo) => foo.something())`
49    /// expands to the equivalent of
50    /// ```ignore
51    /// match self {
52    ///    Enum::Egl(foo) => foo.something(),
53    ///    Enum::Glx(foo) => foo.something(),
54    ///    Enum::Wgl(foo) => foo.something(),
55    ///    Enum::Cgl(foo) => foo.something(),
56    /// }
57    /// ```
58    /// The result can be converted to another enum by adding `; as AnotherEnum`
59    macro_rules! gl_api_dispatch {
60        ($what:ident; $enum:ident ( $($c1:tt)* ) => $x:expr; as $enum2:ident ) => {
61            match $what {
62                #[cfg(egl_backend)]
63                $enum::Egl($($c1)*) => $enum2::Egl($x),
64                #[cfg(glx_backend)]
65                $enum::Glx($($c1)*) => $enum2::Glx($x),
66                #[cfg(wgl_backend)]
67                $enum::Wgl($($c1)*) => $enum2::Wgl($x),
68                #[cfg(cgl_backend)]
69                $enum::Cgl($($c1)*) => $enum2::Cgl($x),
70            }
71        };
72        ($what:ident; $enum:ident ( $($c1:tt)* ) => $x:expr) => {
73            match $what {
74                #[cfg(egl_backend)]
75                $enum::Egl($($c1)*) => $x,
76                #[cfg(glx_backend)]
77                $enum::Glx($($c1)*) => $x,
78                #[cfg(wgl_backend)]
79                $enum::Wgl($($c1)*) => $x,
80                #[cfg(cgl_backend)]
81                $enum::Cgl($($c1)*) => $x,
82            }
83        };
84    }
85
86    pub(crate) use gl_api_dispatch;
87}