1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 00:17:46 +00:00

Clipboard: Add a key-value map alongside the clipboard storage

A clipping now consists of three things:

- The raw clip data
- A MIME type
- A key-value map (String, String) for anything you like
This commit is contained in:
Andreas Kling 2020-09-05 16:26:22 +02:00
parent 51146e3075
commit 2e6d59b7b2
7 changed files with 34 additions and 11 deletions

View file

@ -68,7 +68,7 @@ OwnPtr<Messages::ClipboardServer::SetClipboardDataResponse> ClientConnection::ha
did_misbehave("SetClipboardData: Bad shared buffer ID");
return nullptr;
}
Storage::the().set_data(*shared_buffer, message.data_size(), message.mime_type());
Storage::the().set_data(*shared_buffer, message.data_size(), message.mime_type(), message.metadata().entries());
return make<Messages::ClipboardServer::SetClipboardDataResponse>();
}
@ -92,7 +92,7 @@ OwnPtr<Messages::ClipboardServer::GetClipboardDataResponse> ClientConnection::ha
// After we respond to GetClipboardData, we have to wait for the client to ref the buffer on his side.
m_last_sent_buffer = move(shared_buffer);
}
return make<Messages::ClipboardServer::GetClipboardDataResponse>(shbuf_id, storage.data_size(), storage.mime_type());
return make<Messages::ClipboardServer::GetClipboardDataResponse>(shbuf_id, storage.data_size(), storage.mime_type(), storage.metadata());
}
void ClientConnection::notify_about_clipboard_change()

View file

@ -2,6 +2,6 @@ endpoint ClipboardServer = 802
{
Greet() => (i32 client_id)
GetClipboardData() => (i32 shbuf_id, i32 data_size, [UTF8] String mime_type)
SetClipboardData(i32 shbuf_id, i32 data_size, [UTF8] String mime_type) => ()
GetClipboardData() => (i32 shbuf_id, i32 data_size, [UTF8] String mime_type, IPC::Dictionary metadata)
SetClipboardData(i32 shbuf_id, i32 data_size, [UTF8] String mime_type, IPC::Dictionary metadata) => ()
}

View file

@ -44,12 +44,16 @@ Storage::~Storage()
{
}
void Storage::set_data(NonnullRefPtr<SharedBuffer> data, size_t data_size, const String& mime_type)
void Storage::set_data(NonnullRefPtr<SharedBuffer> data, size_t data_size, const String& mime_type, const HashMap<String, String>& metadata)
{
dbg() << "Storage::set_data <- [" << mime_type << "] " << data->data() << " (" << data_size << " bytes)";
for (auto& it : metadata) {
dbg() << " " << it.key << ": " << it.value;
}
m_shared_buffer = move(data);
m_data_size = data_size;
m_mime_type = mime_type;
m_metadata = metadata;
if (on_content_change)
on_content_change();

View file

@ -27,6 +27,7 @@
#pragma once
#include <AK/Function.h>
#include <AK/HashMap.h>
#include <AK/SharedBuffer.h>
#include <AK/String.h>
@ -40,6 +41,7 @@ public:
bool has_data() const { return m_shared_buffer; }
const String& mime_type() const { return m_mime_type; }
const HashMap<String, String>& metadata() const { return m_metadata; }
const u8* data() const
{
@ -55,7 +57,7 @@ public:
return 0;
}
void set_data(NonnullRefPtr<SharedBuffer>, size_t data_size, const String& mime_type);
void set_data(NonnullRefPtr<SharedBuffer>, size_t data_size, const String& mime_type, const HashMap<String, String>& metadata);
Function<void()> on_content_change;
@ -65,6 +67,7 @@ private:
String m_mime_type;
RefPtr<SharedBuffer> m_shared_buffer;
size_t m_data_size { 0 };
HashMap<String, String> m_metadata;
};
}