diff options
author | dec05eba <dec05eba@protonmail.com> | 2025-03-15 00:39:37 +0100 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2025-03-15 00:56:38 +0100 |
commit | 63b2b6cbc34b9e34208f3bff96686b9bd3f54521 (patch) | |
tree | b20334166fd064c6b35d29daea7350841a219897 /include | |
parent | 6c7158c06d41fd7c77a8a8b9d186440904950f8c (diff) |
Add region capture option
Diffstat (limited to 'include')
-rw-r--r-- | include/GsrInfo.hpp | 1 | ||||
-rw-r--r-- | include/Overlay.hpp | 14 | ||||
-rw-r--r-- | include/RegionSelector.hpp | 52 | ||||
-rw-r--r-- | include/WindowUtils.hpp | 10 |
4 files changed, 71 insertions, 6 deletions
diff --git a/include/GsrInfo.hpp b/include/GsrInfo.hpp index b027cc5..b8f478c 100644 --- a/include/GsrInfo.hpp +++ b/include/GsrInfo.hpp @@ -47,6 +47,7 @@ namespace gsr { struct SupportedCaptureOptions { bool window = false; + bool region = false; bool focused = false; bool portal = false; std::vector<GsrMonitor> monitors; diff --git a/include/Overlay.hpp b/include/Overlay.hpp index 89747cd..5ed7f51 100644 --- a/include/Overlay.hpp +++ b/include/Overlay.hpp @@ -6,9 +6,9 @@ #include "Config.hpp" #include "window_texture.h" #include "WindowUtils.hpp" -#include "GlobalHotkeysLinux.hpp" #include "GlobalHotkeysJoystick.hpp" #include "AudioPlayer.hpp" +#include "RegionSelector.hpp" #include <mglpp/window/Window.hpp> #include <mglpp/window/Event.hpp> @@ -78,7 +78,6 @@ namespace gsr { void process_key_bindings(mgl::Event &event); void grab_mouse_and_keyboard(); void xi_setup_fake_cursor(); - void xi_grab_all_mouse_devices(); void close_gpu_screen_recorder_output(); @@ -109,10 +108,10 @@ namespace gsr { void update_ui_replay_stopped(); void on_press_save_replay(); - bool on_press_start_replay(bool disable_notification); - void on_press_start_record(); - void on_press_start_stream(); - void on_press_take_screenshot(); + bool on_press_start_replay(bool disable_notification, bool finished_region_selection); + void on_press_start_record(bool finished_region_selection); + void on_press_start_stream(bool finished_region_selection); + void on_press_take_screenshot(bool finished_region_selection); bool update_compositor_texture(const Monitor &monitor); void force_window_on_top(); @@ -202,5 +201,8 @@ namespace gsr { bool try_replay_startup = true; AudioPlayer audio_player; + RegionSelector region_selector; + bool start_region_capture = false; + std::function<void()> on_region_selected; }; }
\ No newline at end of file diff --git a/include/RegionSelector.hpp b/include/RegionSelector.hpp new file mode 100644 index 0000000..7f3041a --- /dev/null +++ b/include/RegionSelector.hpp @@ -0,0 +1,52 @@ +#pragma once + +#include "WindowUtils.hpp" +#include <mglpp/system/vec.hpp> +#include <mglpp/graphics/Color.hpp> +#include <vector> + +#include <X11/Xlib.h> + +namespace gsr { + struct Region { + mgl::vec2i pos; + mgl::vec2i size; + }; + + class RegionSelector { + public: + RegionSelector(); + RegionSelector(const RegionSelector&) = delete; + RegionSelector& operator=(const RegionSelector&) = delete; + ~RegionSelector(); + + bool start(mgl::Color border_color); + void stop(); + bool is_started() const; + + bool failed() const; + bool poll_events(); + bool is_selected() const; + bool take_selection(); + Region get_selection() const; + private: + void on_button_press(const void *de); + void on_button_release(const void *de); + void on_mouse_motion(const void *de); + private: + Display *dpy = nullptr; + unsigned long region_window = 0; + unsigned long cursor_window = 0; + unsigned long region_window_colormap = 0; + int xi_opcode = 0; + GC region_gc = nullptr; + GC cursor_gc = nullptr; + + Region region; + bool selecting_region = false; + bool selected = false; + bool is_wayland = false; + std::vector<Monitor> monitors; + mgl::vec2i cursor_pos; + }; +}
\ No newline at end of file diff --git a/include/WindowUtils.hpp b/include/WindowUtils.hpp index 99b45e9..e31eeb2 100644 --- a/include/WindowUtils.hpp +++ b/include/WindowUtils.hpp @@ -22,9 +22,19 @@ namespace gsr { std::string get_focused_window_name(Display *dpy, WindowCaptureType window_capture_type); std::string get_window_name_at_position(Display *dpy, mgl::vec2i position, Window ignore_window); std::string get_window_name_at_cursor_position(Display *dpy, Window ignore_window); + void set_window_size_not_resizable(Display *dpy, Window window, int width, int height); mgl::vec2i get_cursor_position(Display *dpy, Window *window); mgl::vec2i create_window_get_center_position(Display *display); std::string get_window_manager_name(Display *display); bool is_compositor_running(Display *dpy, int screen); std::vector<Monitor> get_monitors(Display *dpy); + void xi_grab_all_mouse_devices(Display *dpy); + void xi_ungrab_all_mouse_devices(Display *dpy); + void xi_warp_all_mouse_devices(Display *dpy, mgl::vec2i position); + void window_set_fullscreen(Display *dpy, Window window, bool fullscreen); + bool window_is_fullscreen(Display *display, Window window); + bool set_window_wm_state(Display *dpy, Window window, Atom atom); + void make_window_click_through(Display *display, Window window); + bool make_window_sticky(Display *dpy, Window window); + bool hide_window_from_taskbar(Display *dpy, Window window); }
\ No newline at end of file |