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/RegionSelector.hpp | |
parent | 6c7158c06d41fd7c77a8a8b9d186440904950f8c (diff) |
Add region capture option
Diffstat (limited to 'include/RegionSelector.hpp')
-rw-r--r-- | include/RegionSelector.hpp | 52 |
1 files changed, 52 insertions, 0 deletions
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 |