aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/GsrInfo.hpp1
-rw-r--r--include/Overlay.hpp14
-rw-r--r--include/RegionSelector.hpp52
-rw-r--r--include/WindowUtils.hpp10
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