aboutsummaryrefslogtreecommitdiff
path: root/src/QuickMedia.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/QuickMedia.cpp')
-rw-r--r--src/QuickMedia.cpp44
1 files changed, 42 insertions, 2 deletions
diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp
index 9cacfdd..1a67509 100644
--- a/src/QuickMedia.cpp
+++ b/src/QuickMedia.cpp
@@ -6654,7 +6654,7 @@ namespace QuickMedia {
matrix_chat_page->rooms_page->body->select_previous_item(true);
move_room = true;
goto chat_page_end;
- } else if(event.key.code == mgl::Keyboard::Down || event.key.code == mgl::Keyboard::J)) {
+ } else if(event.key.code == mgl::Keyboard::Down || event.key.code == mgl::Keyboard::J) {
matrix_chat_page->rooms_page->body->select_next_item(true);
move_room = true;
goto chat_page_end;
@@ -6758,7 +6758,47 @@ namespace QuickMedia {
if(event.key.control && event.key.code == mgl::Keyboard::V) {
frame_skip_text_entry = true;
// TODO: Upload multiple files.
- upload_file(window.get_clipboard());
+
+ bool first_part = true;
+ std::string clipboard_text;
+ char tmp_filename[] = "/tmp/quickmedia_clipboard_XXXXXX";
+ int tmp_file = -1;
+
+ const bool clipboard_success = window.get_clipboard([&first_part, &clipboard_text, &tmp_filename, &tmp_file](const unsigned char *data, size_t size, mgl_clipboard_type clipboard_type) {
+ if(first_part) {
+ first_part = false;
+ if(clipboard_type != MGL_CLIPBOARD_TYPE_STRING) {
+ tmp_file = mkstemp(tmp_filename);
+ if(tmp_file == -1) {
+ show_notification("QuickMedia", "Failed to create temporary file " + std::string(tmp_filename) + " from clipboard (failed to create file)", Urgency::CRITICAL);
+ return false;
+ }
+ }
+ }
+
+ if(tmp_file == -1) {
+ clipboard_text.append((char*)data, size);
+ } else {
+ const ssize_t bytes_written = write(tmp_file, data, size);
+ if(bytes_written != (ssize_t)size) {
+ show_notification("QuickMedia", "Failed to create temporary file " + std::string(tmp_filename) + " from clipboard (failed to write data to file)", Urgency::CRITICAL);
+ return false;
+ }
+ }
+
+ return true;
+ });
+
+ if(tmp_file != -1)
+ clipboard_text = tmp_filename;
+
+ if(clipboard_success)
+ upload_file(clipboard_text);
+
+ if(tmp_file != -1) {
+ close(tmp_file);
+ remove(tmp_filename);
+ }
}
if(event.key.code == mgl::Keyboard::R && tabs[selected_tab].body->get_selected_shared()) {