aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2024-09-08 17:07:22 +0200
committerdec05eba <dec05eba@protonmail.com>2024-09-08 17:07:22 +0200
commitb145d957e3809fd6c2d814c34c58234ade983bb0 (patch)
tree3e8842c72afe0045645ad32a0b3a9ab708c575ee /include
parent3d5e8baa5f66547f1250950b10bd4108e30af423 (diff)
More
Diffstat (limited to 'include')
-rw-r--r--include/GlobalHotkeys.hpp27
-rw-r--r--include/GlobalHotkeysX11.hpp31
-rw-r--r--include/GsrInfo.hpp4
-rw-r--r--include/Overlay.hpp56
-rw-r--r--include/Theme.hpp11
-rw-r--r--include/gui/CustomRendererWidget.hpp1
-rw-r--r--include/gui/SettingsPage.hpp12
-rw-r--r--include/gui/Subsection.hpp24
-rw-r--r--include/gui/Widget.hpp1
9 files changed, 162 insertions, 5 deletions
diff --git a/include/GlobalHotkeys.hpp b/include/GlobalHotkeys.hpp
new file mode 100644
index 0000000..020f5a5
--- /dev/null
+++ b/include/GlobalHotkeys.hpp
@@ -0,0 +1,27 @@
+#pragma once
+
+#include <stdint.h>
+#include <functional>
+#include <string>
+
+namespace gsr {
+ struct Hotkey {
+ uint64_t key = 0;
+ uint32_t modifiers = 0;
+ };
+
+ using GlobalHotkeyCallback = std::function<void(const std::string &id)>;
+
+ class GlobalHotkeys {
+ public:
+ GlobalHotkeys() = default;
+ GlobalHotkeys(const GlobalHotkeys&) = delete;
+ GlobalHotkeys& operator=(const GlobalHotkeys&) = delete;
+ virtual ~GlobalHotkeys() = default;
+
+ virtual bool bind_key_press(Hotkey hotkey, const std::string &id, GlobalHotkeyCallback callback) = 0;
+ virtual void unbind_key_press(const std::string &id) = 0;
+ virtual void unbind_all_keys() = 0;
+ virtual void poll_events() = 0;
+ };
+} \ No newline at end of file
diff --git a/include/GlobalHotkeysX11.hpp b/include/GlobalHotkeysX11.hpp
new file mode 100644
index 0000000..427e9f0
--- /dev/null
+++ b/include/GlobalHotkeysX11.hpp
@@ -0,0 +1,31 @@
+#pragma once
+
+#include "GlobalHotkeys.hpp"
+#include <unordered_map>
+#include <X11/Xlib.h>
+
+namespace gsr {
+ class GlobalHotkeysX11 : public GlobalHotkeys {
+ public:
+ GlobalHotkeysX11();
+ GlobalHotkeysX11(const GlobalHotkeysX11&) = delete;
+ GlobalHotkeysX11& operator=(const GlobalHotkeysX11&) = delete;
+ ~GlobalHotkeysX11() override;
+
+ bool bind_key_press(Hotkey hotkey, const std::string &id, GlobalHotkeyCallback callback) override;
+ void unbind_key_press(const std::string &id) override;
+ void unbind_all_keys() override;
+ void poll_events() override;
+ private:
+ void call_hotkey_callback(Hotkey hotkey) const;
+ private:
+ struct HotkeyData {
+ Hotkey hotkey;
+ GlobalHotkeyCallback callback;
+ };
+
+ Display *dpy = nullptr;
+ XEvent xev;
+ std::unordered_map<std::string, HotkeyData> bound_keys_by_id;
+ };
+} \ No newline at end of file
diff --git a/include/GsrInfo.hpp b/include/GsrInfo.hpp
index d90d72f..fb12cd4 100644
--- a/include/GsrInfo.hpp
+++ b/include/GsrInfo.hpp
@@ -10,7 +10,11 @@ namespace gsr {
bool h264 = false;
bool h264_software = false;
bool hevc = false;
+ bool hevc_hdr = false;
+ bool hevc_10bit = false;
bool av1 = false;
+ bool av1_hdr = false;
+ bool av1_10bit = false;
bool vp8 = false;
bool vp9 = false;
};
diff --git a/include/Overlay.hpp b/include/Overlay.hpp
new file mode 100644
index 0000000..de5fa79
--- /dev/null
+++ b/include/Overlay.hpp
@@ -0,0 +1,56 @@
+#pragma once
+
+#include "gui/PageStack.hpp"
+#include "gui/CustomRendererWidget.hpp"
+#include "GsrInfo.hpp"
+#include "Config.hpp"
+#include "window_texture.h"
+
+#include <mglpp/window/Window.hpp>
+#include <mglpp/graphics/Texture.hpp>
+#include <mglpp/graphics/Sprite.hpp>
+#include <mglpp/graphics/Rectangle.hpp>
+#include <mglpp/graphics/Text.hpp>
+
+namespace gsr {
+ 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();
+ bool is_open() const;
+ private:
+ bool update_compositor_texture(const mgl_monitor *monitor);
+ private:
+ mgl::Window &window;
+ std::string resources_path;
+ GsrInfo gsr_info;
+ egl_functions egl_funcs;
+ mgl::Color bg_color;
+ std::vector<gsr::AudioDevice> 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> config;
+ };
+} \ No newline at end of file
diff --git a/include/Theme.hpp b/include/Theme.hpp
index c70167b..df25268 100644
--- a/include/Theme.hpp
+++ b/include/Theme.hpp
@@ -32,11 +32,20 @@ namespace gsr {
mgl::Texture settings_texture;
mgl::Texture folder_texture;
mgl::Texture up_arrow_texture;
+ mgl::Texture replay_button_texture;
+ mgl::Texture record_button_texture;
+ mgl::Texture stream_button_texture;
+ mgl::Texture close_texture;
+ mgl::Texture logo_texture;
double double_click_timeout_seconds = 0.4;
+
+ // Reloads fonts
+ bool set_window_size(mgl::vec2i window_size);
};
- bool init_theme(const GsrInfo &gsr_info, mgl::vec2i window_size, const std::string &resources_path);
+ bool init_theme(const GsrInfo &gsr_info, const std::string &resources_path);
void deinit_theme();
+
Theme& get_theme();
} \ No newline at end of file
diff --git a/include/gui/CustomRendererWidget.hpp b/include/gui/CustomRendererWidget.hpp
index e16e532..20bfec8 100644
--- a/include/gui/CustomRendererWidget.hpp
+++ b/include/gui/CustomRendererWidget.hpp
@@ -15,6 +15,7 @@ namespace gsr {
void draw(mgl::Window &window, mgl::vec2f offset) override;
mgl::vec2f get_size() override;
+ void set_size(mgl::vec2f size);
std::function<void(mgl::Window &window, mgl::vec2f pos, mgl::vec2f size)> draw_handler;
// Return true to allow other widgets to handle events
diff --git a/include/gui/SettingsPage.hpp b/include/gui/SettingsPage.hpp
index 1ad4c67..b22506e 100644
--- a/include/gui/SettingsPage.hpp
+++ b/include/gui/SettingsPage.hpp
@@ -13,6 +13,7 @@
namespace gsr {
class GsrPage;
class PageStack;
+ class ScrollablePage;
class SettingsPage : public StaticPage {
public:
@@ -31,7 +32,7 @@ namespace gsr {
private:
std::unique_ptr<RadioButton> create_view_radio_button();
std::unique_ptr<ComboBox> create_record_area_box(const GsrInfo &gsr_info);
- std::unique_ptr<List> create_record_area(const GsrInfo &gsr_info);
+ std::unique_ptr<Widget> create_record_area(const GsrInfo &gsr_info);
std::unique_ptr<List> create_select_window();
std::unique_ptr<Entry> create_area_width_entry();
std::unique_ptr<Entry> create_area_height_entry();
@@ -39,14 +40,14 @@ namespace gsr {
std::unique_ptr<List> create_area_size_section();
std::unique_ptr<CheckBox> create_restore_portal_session_checkbox();
std::unique_ptr<List> create_restore_portal_session_section();
- std::unique_ptr<List> create_capture_target(const GsrInfo &gsr_info);
+ std::unique_ptr<Widget> create_capture_target(const GsrInfo &gsr_info);
std::unique_ptr<ComboBox> create_audio_track_selection_checkbox(const std::vector<AudioDevice> &audio_devices);
std::unique_ptr<Button> create_remove_audio_track_button(List *audio_device_list_ptr);
std::unique_ptr<List> create_audio_track(const std::vector<AudioDevice> &audio_devices);
std::unique_ptr<Button> create_add_audio_track_button(const std::vector<AudioDevice> &audio_devices);
std::unique_ptr<List> create_audio_track_section(const std::vector<AudioDevice> &audio_devices);
std::unique_ptr<CheckBox> create_merge_audio_tracks_checkbox();
- std::unique_ptr<List> create_audio_device_section(const std::vector<AudioDevice> &audio_devices);
+ std::unique_ptr<Widget> create_audio_device_section(const std::vector<AudioDevice> &audio_devices);
std::unique_ptr<ComboBox> create_video_quality_box();
std::unique_ptr<List> create_video_quality();
std::unique_ptr<ComboBox> create_color_range_box();
@@ -62,7 +63,9 @@ namespace gsr {
std::unique_ptr<ComboBox> create_framerate_mode_box();
std::unique_ptr<List> create_framerate_mode();
std::unique_ptr<List> create_framerate_section();
- std::unique_ptr<List> create_settings(const GsrInfo &gsr_info, const std::vector<AudioDevice> &audio_devices);
+ std::unique_ptr<Widget> create_record_cursor_section();
+ std::unique_ptr<Widget> create_video_section(const GsrInfo &gsr_info);
+ std::unique_ptr<Widget> create_settings(const GsrInfo &gsr_info, const std::vector<AudioDevice> &audio_devices);
void add_widgets(const GsrInfo &gsr_info, const std::vector<AudioDevice> &audio_devices);
void add_page_specific_widgets();
@@ -92,6 +95,7 @@ namespace gsr {
std::optional<Config> &config;
GsrPage *content_page_ptr = nullptr;
+ ScrollablePage *settings_scrollable_page_ptr = nullptr;
List *settings_list_ptr = nullptr;
List *select_window_list_ptr = nullptr;
List *area_size_list_ptr = nullptr;
diff --git a/include/gui/Subsection.hpp b/include/gui/Subsection.hpp
new file mode 100644
index 0000000..90cb798
--- /dev/null
+++ b/include/gui/Subsection.hpp
@@ -0,0 +1,24 @@
+#pragma once
+
+#include "Widget.hpp"
+#include "Label.hpp"
+#include <memory>
+
+namespace gsr {
+ class Subsection : public Widget {
+ public:
+ // If size width or height is 0 then the size in that direction is the size of the widgets
+ Subsection(const char *title, std::unique_ptr<Widget> inner_widget, mgl::vec2f size);
+ Subsection(const Subsection&) = delete;
+ Subsection& operator=(const Subsection&) = delete;
+
+ bool on_event(mgl::Event &event, mgl::Window &window, mgl::vec2f offset) override;
+ void draw(mgl::Window &window, mgl::vec2f offset) override;
+
+ mgl::vec2f get_size() override;
+ private:
+ Label label;
+ std::unique_ptr<Widget> inner_widget;
+ mgl::vec2f size;
+ };
+} \ No newline at end of file
diff --git a/include/gui/Widget.hpp b/include/gui/Widget.hpp
index 498ca05..9a18722 100644
--- a/include/gui/Widget.hpp
+++ b/include/gui/Widget.hpp
@@ -13,6 +13,7 @@ namespace gsr {
friend class ScrollablePage;
friend class List;
friend class Page;
+ friend class Subsection;
public:
enum class Alignment {
START,