bracket_terminal/hal/native/
mod.rs

1mod init;
2pub mod shader_strings;
3use glow::NativeVertexArray;
4pub use init::*;
5mod mainloop;
6use crate::hal::scaler::{default_gutter_size, ScreenScaler};
7use crate::hal::ConsoleBacking;
8pub use mainloop::*;
9use parking_lot::Mutex;
10use std::any::Any;
11
12pub type GlCallback = fn(&mut dyn Any, &glow::Context);
13
14lazy_static! {
15    pub static ref BACKEND: Mutex<PlatformGL> = Mutex::new(PlatformGL {
16        gl: None,
17        quad_vao: None,
18        context_wrapper: None,
19        backing_buffer: None,
20        frame_sleep_time: None,
21        gl_callback: None,
22        resize_scaling: false,
23        resize_request: None,
24        request_screenshot: None,
25        screen_scaler: ScreenScaler::default(),
26    });
27}
28
29lazy_static! {
30    pub(crate) static ref CONSOLE_BACKING: Mutex<Vec<ConsoleBacking>> = Mutex::new(Vec::new());
31}
32
33pub struct PlatformGL {
34    pub gl: Option<glow::Context>,
35    pub quad_vao: Option<NativeVertexArray>,
36    pub context_wrapper: Option<WrappedContext>,
37    pub backing_buffer: Option<super::Framebuffer>,
38    pub frame_sleep_time: Option<u64>,
39    pub gl_callback: Option<GlCallback>,
40    pub resize_scaling: bool,
41    pub resize_request: Option<(u32, u32)>,
42    pub request_screenshot: Option<String>,
43    pub screen_scaler: ScreenScaler,
44}
45
46unsafe impl Send for PlatformGL {}
47unsafe impl Sync for PlatformGL {}
48
49pub struct WrappedContext {
50    pub el: glutin::event_loop::EventLoop<()>,
51    pub wc: glutin::WindowedContext<glutin::PossiblyCurrent>,
52}
53
54pub struct InitHints {
55    pub vsync: bool,
56    pub fullscreen: bool,
57    pub gl_version: glutin::GlRequest,
58    pub gl_profile: glutin::GlProfile,
59    pub hardware_acceleration: bool,
60    pub srgb: bool,
61    pub frame_sleep_time: Option<f32>,
62    pub resize_scaling: bool,
63    pub desired_gutter: u32,
64    pub fitscreen: bool,
65}
66
67impl InitHints {
68    pub fn new() -> Self {
69        Self {
70            vsync: false,
71            fullscreen: false,
72            gl_version: glutin::GlRequest::Specific(glutin::Api::OpenGl, (3, 2)),
73            gl_profile: glutin::GlProfile::Core,
74            hardware_acceleration: false,
75            srgb: true,
76            frame_sleep_time: None,
77            resize_scaling: false,
78            desired_gutter: default_gutter_size(),
79            fitscreen: false,
80        }
81    }
82}
83
84impl Default for InitHints {
85    fn default() -> Self {
86        Self {
87            vsync: false,
88            fullscreen: false,
89            gl_version: glutin::GlRequest::Specific(glutin::Api::OpenGl, (3, 2)),
90            gl_profile: glutin::GlProfile::Core,
91            hardware_acceleration: false,
92            srgb: true,
93            frame_sleep_time: None,
94            resize_scaling: false,
95            desired_gutter: default_gutter_size(),
96            fitscreen: false,
97        }
98    }
99}
100
101pub fn log(s: &str) {
102    println!("{}", s);
103}