#pragma once #include "WindowUtils.hpp" #include #include #include #include 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 monitors; mgl::vec2i cursor_pos; }; }