From f3e7dc127b3d0446bbee2106df110bbfc4df2171 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 10 Sep 2022 00:11:47 +0200 Subject: Matrix: support uploading files from clipboard (direct image data, png, jpg, gif) --- src/QuickMedia.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) (limited to 'src/QuickMedia.cpp') 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()) { -- cgit v1.2.3