From 974e760136e8b47f34f3ed75111ab46112d6cb46 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Tue, 6 Jan 2026 22:17:38 +0100 Subject: [PATCH] Fix clipboard save to disk option not working correctly --- src/ClipboardFile.cpp | 22 ++++++++++++++++++---- src/Overlay.cpp | 2 ++ src/gui/ScreenshotSettingsPage.cpp | 4 ++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/ClipboardFile.cpp b/src/ClipboardFile.cpp index e19cbf7..cb0d31b 100644 --- a/src/ClipboardFile.cpp +++ b/src/ClipboardFile.cpp @@ -48,11 +48,18 @@ namespace gsr { XNextEvent(dpy, &xev); switch(xev.type) { case SelectionClear: { - should_clear_selection = true; - if(clipboard_copies.empty()) { - should_clear_selection = false; - set_current_file("", file_type); + bool clear_current_file = false; + { + std::lock_guard lock(mutex); + should_clear_selection = true; + if(clipboard_copies.empty()) { + should_clear_selection = false; + clear_current_file = true; + } } + + if(clear_current_file) + set_current_file("", file_type); break; } case SelectionRequest: @@ -205,6 +212,9 @@ namespace gsr { uint8_t file_buffer[1<<16]; ssize_t file_bytes_read = 0; + if(file_fd <= 0) + return; + if(lseek(file_fd, clipboard_copy->file_offset, SEEK_SET) == -1) { fprintf(stderr, "gsr ui: error: ClipboardFile::send_clipboard: failed to seek in clipboard file to offset " FORMAT_U64 " for requestor window " FORMAT_I64 ", error: %s\n", (uint64_t)clipboard_copy->file_offset, (int64_t)xselectionrequest->requestor, strerror(errno)); clipboard_copy->file_offset = 0; @@ -262,7 +272,11 @@ namespace gsr { } clipboard_copies.clear(); + if(XGetSelectionOwner(dpy, clipboard_atom) == clipboard_window) + XSetSelectionOwner(dpy, clipboard_atom, None, CurrentTime); + if(filepath.empty()) { + // TODO: Cancel transfer if(file_fd > 0) { close(file_fd); file_fd = -1; diff --git a/src/Overlay.cpp b/src/Overlay.cpp index dbf7aab..383c3ba 100644 --- a/src/Overlay.cpp +++ b/src/Overlay.cpp @@ -3408,6 +3408,8 @@ namespace gsr { args.push_back(nullptr); + clipboard_file.set_current_file("", ClipboardFile::FileType::JPG); + screenshot_filepath = output_file; gpu_screen_recorder_screenshot_process = exec_program(args.data(), nullptr); if(gpu_screen_recorder_screenshot_process == -1) { diff --git a/src/gui/ScreenshotSettingsPage.cpp b/src/gui/ScreenshotSettingsPage.cpp index b0c0471..f8a86db 100644 --- a/src/gui/ScreenshotSettingsPage.cpp +++ b/src/gui/ScreenshotSettingsPage.cpp @@ -367,8 +367,8 @@ namespace gsr { config.screenshot_config.restore_portal_session = restore_portal_session_checkbox_ptr->is_checked(); config.screenshot_config.save_directory = save_directory_button_ptr->get_text(); config.screenshot_config.save_screenshot_in_game_folder = save_screenshot_in_game_folder_checkbox_ptr->is_checked(); - config.screenshot_config.save_screenshot_to_clipboard = save_screenshot_to_disk_checkbox_ptr->is_checked(); - config.screenshot_config.save_screenshot_to_disk = save_screenshot_to_clipboard_checkbox_ptr->is_checked(); + config.screenshot_config.save_screenshot_to_clipboard = save_screenshot_to_clipboard_checkbox_ptr->is_checked(); + config.screenshot_config.save_screenshot_to_disk = save_screenshot_to_disk_checkbox_ptr->is_checked(); config.screenshot_config.show_notifications = show_notification_checkbox_ptr->is_checked(); config.screenshot_config.use_led_indicator = led_indicator_checkbox_ptr->is_checked(); config.screenshot_config.custom_script = create_custom_script_screenshot_entry_ptr->get_text();