mirror of
https://repo.dec05eba.com/gpu-screen-recorder-ui
synced 2026-03-31 09:17:04 +09:00
Screenshot: add option to save screenshot to clipboard
This commit is contained in:
60
include/ClipboardFile.hpp
Normal file
60
include/ClipboardFile.hpp
Normal file
@@ -0,0 +1,60 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <thread>
|
||||
#include <mutex>
|
||||
#include <vector>
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
namespace gsr {
|
||||
struct ClipboardCopy {
|
||||
Window requestor = None;
|
||||
uint64_t file_offset = 0;
|
||||
Atom property = None;
|
||||
Atom requestor_target = None;
|
||||
};
|
||||
|
||||
class ClipboardFile {
|
||||
public:
|
||||
enum class FileType {
|
||||
JPG,
|
||||
PNG
|
||||
};
|
||||
|
||||
ClipboardFile();
|
||||
~ClipboardFile();
|
||||
ClipboardFile(const ClipboardFile&) = delete;
|
||||
ClipboardFile& operator=(const ClipboardFile&) = delete;
|
||||
|
||||
// Set this to an empty string to unset clipboard
|
||||
void set_current_file(const std::string &filepath, FileType file_type);
|
||||
private:
|
||||
bool file_type_matches_request_atom(FileType file_type, Atom request_atom);
|
||||
const char* file_type_clipboard_get_name(Atom request_atom);
|
||||
const char* file_type_get_name(FileType file_type);
|
||||
void send_clipboard_start(XSelectionRequestEvent *xselectionrequest);
|
||||
void transfer_clipboard_data(XSelectionRequestEvent *xselectionrequest, ClipboardCopy *clipboard_copy);
|
||||
ClipboardCopy* get_clipboard_copy_by_requestor(Window requestor);
|
||||
void remove_clipboard_copy(Window requestor);
|
||||
private:
|
||||
Display *dpy = nullptr;
|
||||
Window clipboard_window = None;
|
||||
int file_fd = -1;
|
||||
uint64_t file_size = 0;
|
||||
FileType file_type = FileType::JPG;
|
||||
|
||||
Atom incr_atom = None;
|
||||
Atom targets_atom = None;
|
||||
Atom clipboard_atom = None;
|
||||
Atom image_jpg_atom = None;
|
||||
Atom image_jpeg_atom = None;
|
||||
Atom image_png_atom = None;
|
||||
|
||||
std::thread event_thread;
|
||||
std::mutex mutex;
|
||||
bool running = true;
|
||||
|
||||
std::vector<ClipboardCopy> clipboard_copies;
|
||||
bool should_clear_selection = false;
|
||||
};
|
||||
}
|
||||
@@ -143,6 +143,7 @@ namespace gsr {
|
||||
bool restore_portal_session = true;
|
||||
|
||||
bool save_screenshot_in_game_folder = false;
|
||||
bool save_screenshot_to_clipboard = false;
|
||||
bool show_screenshot_saved_notifications = true;
|
||||
std::string save_directory;
|
||||
ConfigHotkey take_screenshot_hotkey;
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "AudioPlayer.hpp"
|
||||
#include "RegionSelector.hpp"
|
||||
#include "WindowSelector.hpp"
|
||||
#include "ClipboardFile.hpp"
|
||||
#include "CursorTracker/CursorTracker.hpp"
|
||||
|
||||
#include <mglpp/window/Window.hpp>
|
||||
@@ -253,5 +254,6 @@ namespace gsr {
|
||||
|
||||
bool hide_ui = false;
|
||||
double notification_duration_multiplier = 1.0;
|
||||
ClipboardFile clipboard_file;
|
||||
};
|
||||
}
|
||||
@@ -42,6 +42,7 @@ namespace gsr {
|
||||
std::unique_ptr<List> create_image_format_section();
|
||||
std::unique_ptr<Widget> create_file_info_section();
|
||||
std::unique_ptr<CheckBox> create_save_screenshot_in_game_folder();
|
||||
std::unique_ptr<CheckBox> create_save_screenshot_to_clipboard();
|
||||
std::unique_ptr<Widget> create_general_section();
|
||||
std::unique_ptr<Widget> create_notifications_section();
|
||||
std::unique_ptr<Widget> create_settings();
|
||||
@@ -69,6 +70,7 @@ namespace gsr {
|
||||
ComboBox *image_format_box_ptr = nullptr;
|
||||
Button *save_directory_button_ptr = nullptr;
|
||||
CheckBox *save_screenshot_in_game_folder_checkbox_ptr = nullptr;
|
||||
CheckBox *save_screenshot_to_clipboard_checkbox_ptr = nullptr;
|
||||
CheckBox *show_screenshot_saved_notification_checkbox_ptr = nullptr;
|
||||
|
||||
PageStack *page_stack = nullptr;
|
||||
|
||||
Reference in New Issue
Block a user