Commit 514383a2 authored by Julie Jeongeun Kim's avatar Julie Jeongeun Kim Committed by Commit Bot

[ozone/wayland] Add a helper function to WaylandDataDevice to read the data from FD

It moves the code to read the data from FD to 'ReadDataFromFD' in
WaylandDataDevice to reuse it for drag-and-drop, as WaylandDataDevice
is the class to handle not only copy-and-paste but drag-and-drop and
drag-and-drop needs to read the data from FD as well.

It doesn't bring behavioral changes.

Bug: 578890, 875164
Change-Id: I460ab9df2b4d32bbdb0e71c753cb19c572df12ab
Reviewed-on: https://chromium-review.googlesource.com/1179505Reviewed-by: default avatarMaksim Sisov <msisov@igalia.com>
Reviewed-by: default avatarAntonio Gomes <tonikitoo@igalia.com>
Commit-Queue: Julie Jeongeun Kim <jkim@igalia.com>
Cr-Commit-Position: refs/heads/master@{#584047}
parent eae4f3c3
...@@ -41,20 +41,30 @@ void WaylandDataDevice::RequestSelectionData(const std::string& mime_type) { ...@@ -41,20 +41,30 @@ void WaylandDataDevice::RequestSelectionData(const std::string& mime_type) {
read_from_fd_closure_ = read_from_fd_closure_ =
base::BindOnce(&WaylandDataDevice::ReadClipboardDataFromFD, base::BindOnce(&WaylandDataDevice::ReadClipboardDataFromFD,
base::Unretained(this), std::move(fd), mime_type); base::Unretained(this), std::move(fd), mime_type);
sync_callback_.reset(wl_display_sync(connection_->display())); RegisterSyncCallback();
wl_callback_add_listener(sync_callback_.get(), &callback_listener_, this);
wl_display_flush(connection_->display());
} }
void WaylandDataDevice::ReadClipboardDataFromFD(base::ScopedFD fd, void WaylandDataDevice::ReadClipboardDataFromFD(base::ScopedFD fd,
const std::string& mime_type) { const std::string& mime_type) {
std::string contents; std::string contents;
ReadDataFromFD(std::move(fd), &contents);
connection_->SetClipboardData(contents, mime_type);
}
void WaylandDataDevice::RegisterSyncCallback() {
DCHECK(!sync_callback_);
sync_callback_.reset(wl_display_sync(connection_->display()));
wl_callback_add_listener(sync_callback_.get(), &callback_listener_, this);
wl_display_flush(connection_->display());
}
void WaylandDataDevice::ReadDataFromFD(base::ScopedFD fd,
std::string* contents) {
DCHECK(contents);
char buffer[1 << 10]; // 1 kB in bytes. char buffer[1 << 10]; // 1 kB in bytes.
ssize_t length; ssize_t length;
while ((length = read(fd.get(), buffer, sizeof(buffer))) > 0) while ((length = read(fd.get(), buffer, sizeof(buffer))) > 0)
contents.append(buffer, length); contents->append(buffer, length);
connection_->SetClipboardData(contents, mime_type);
} }
std::vector<std::string> WaylandDataDevice::GetAvailableMimeTypes() { std::vector<std::string> WaylandDataDevice::GetAvailableMimeTypes() {
......
...@@ -37,6 +37,12 @@ class WaylandDataDevice { ...@@ -37,6 +37,12 @@ class WaylandDataDevice {
private: private:
void ReadClipboardDataFromFD(base::ScopedFD fd, const std::string& mime_type); void ReadClipboardDataFromFD(base::ScopedFD fd, const std::string& mime_type);
// Registers display sync callback. Once it's called, it's reset.
void RegisterSyncCallback();
// Helper function to read data from fd.
void ReadDataFromFD(base::ScopedFD fd, std::string* contents);
// wl_data_device_listener callbacks // wl_data_device_listener callbacks
static void OnDataOffer(void* data, static void OnDataOffer(void* data,
wl_data_device* data_device, wl_data_device* data_device,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment