aboutsummaryrefslogtreecommitdiff
path: root/include/RegionSelector.hpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2025-03-15 00:39:37 +0100
committerdec05eba <dec05eba@protonmail.com>2025-03-15 00:56:38 +0100
commit63b2b6cbc34b9e34208f3bff96686b9bd3f54521 (patch)
treeb20334166fd064c6b35d29daea7350841a219897 /include/RegionSelector.hpp
parent6c7158c06d41fd7c77a8a8b9d186440904950f8c (diff)
Add region capture option
Diffstat (limited to 'include/RegionSelector.hpp')
-rw-r--r--include/RegionSelector.hpp52
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