aboutsummaryrefslogtreecommitdiff
path: root/include/RegionSelector.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/RegionSelector.hpp')
-rw-r--r--include/RegionSelector.hpp54
1 files changed, 54 insertions, 0 deletions
diff --git a/include/RegionSelector.hpp b/include/RegionSelector.hpp
new file mode 100644
index 0000000..0465302
--- /dev/null
+++ b/include/RegionSelector.hpp
@@ -0,0 +1,54 @@
+#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();
+ bool take_canceled();
+ 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 canceled = false;
+ bool is_wayland = false;
+ std::vector<Monitor> monitors;
+ mgl::vec2i cursor_pos;
+ };
+} \ No newline at end of file