Add region capture option

This commit is contained in:
dec05eba
2025-03-15 00:39:37 +01:00
parent 6c7158c06d
commit 63b2b6cbc3
15 changed files with 843 additions and 192 deletions

View File

@@ -47,6 +47,7 @@ namespace gsr {
struct SupportedCaptureOptions {
bool window = false;
bool region = false;
bool focused = false;
bool portal = false;
std::vector<GsrMonitor> monitors;

View File

@@ -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;
};
}

View File

@@ -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;
};
}

View File

@@ -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);
}