#pragma once #include "gui/PageStack.hpp" #include "gui/CustomRendererWidget.hpp" #include "GsrInfo.hpp" #include "Config.hpp" #include "window_texture.h" #include #include #include #include #include #include namespace gsr { class DropdownButton; enum class RecordingStatus { NONE, REPLAY, RECORD, STREAM }; enum class NotificationType { NONE, RECORD, REPLAY, STREAM }; class Overlay { public: Overlay(mgl::Window &window, std::string resources_path, GsrInfo gsr_info, egl_functions egl_funcs, mgl::Color bg_color); Overlay(const Overlay&) = delete; Overlay& operator=(const Overlay&) = delete; ~Overlay(); void on_event(mgl::Event &event, mgl::Window &window); void draw(mgl::Window &window); void show(); void hide(); void toggle_show(); void toggle_record(); void toggle_pause(); void show_notification(const char *str, double timeout_seconds, mgl::Color icon_color, mgl::Color bg_color, NotificationType notification_type); bool is_open() const; private: void process_key_bindings(mgl::Event &event); void update_gsr_process_status(); void update_ui_recording_paused(); void update_ui_recording_unpaused(); void update_ui_recording_started(); void update_ui_recording_stopped(); void on_press_start_replay(const std::string &id); void on_press_start_record(const std::string &id); void on_press_start_stream(const std::string &id); bool update_compositor_texture(const mgl_monitor *monitor); private: using KeyBindingCallback = std::function; struct KeyBinding { mgl::Event::KeyEvent key_event; KeyBindingCallback callback; }; mgl::Window &window; std::string resources_path; GsrInfo gsr_info; egl_functions egl_funcs; mgl::Color bg_color; std::vector audio_devices; mgl::Texture window_texture_texture; mgl::Sprite window_texture_sprite; mgl::Texture screenshot_texture; mgl::Sprite screenshot_sprite; mgl::Rectangle bg_screenshot_overlay; WindowTexture window_texture; gsr::PageStack page_stack; mgl::Rectangle top_bar_background; mgl::Text top_bar_text; mgl::Sprite logo_sprite; CustomRendererWidget close_button_widget; bool close_button_pressed_inside = false; bool visible = false; uint64_t default_cursor = 0; pid_t gpu_screen_recorder_process = -1; std::optional config; DropdownButton *replay_dropdown_button_ptr = nullptr; DropdownButton *record_dropdown_button_ptr = nullptr; DropdownButton *stream_dropdown_button_ptr = nullptr; RecordingStatus recording_status = RecordingStatus::NONE; bool paused = false; std::array key_bindings; }; }