mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-22 15:05:59 +01:00
datasource: move to CFileDescriptor
use CFileDescriptor in data/selection sources and its related usage.
This commit is contained in:
parent
97f1bd7c3e
commit
31a3e1038b
11 changed files with 31 additions and 40 deletions
|
@ -25,7 +25,7 @@ CWLRDataOffer::CWLRDataOffer(SP<CZwlrDataControlOfferV1> resource_, SP<IDataSour
|
|||
|
||||
LOGM(LOG, "Offer {:x} asks to send data from source {:x}", (uintptr_t)this, (uintptr_t)source.get());
|
||||
|
||||
source->send(mime, fd);
|
||||
source->send(mime, CFileDescriptor(fd));
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -77,15 +77,13 @@ std::vector<std::string> CWLRDataSource::mimes() {
|
|||
return mimeTypes;
|
||||
}
|
||||
|
||||
void CWLRDataSource::send(const std::string& mime, uint32_t fd) {
|
||||
void CWLRDataSource::send(const std::string& mime, CFileDescriptor fd) {
|
||||
if (std::find(mimeTypes.begin(), mimeTypes.end(), mime) == mimeTypes.end()) {
|
||||
LOGM(ERR, "Compositor/App bug: CWLRDataSource::sendAskSend with non-existent mime");
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
|
||||
resource->sendSend(mime.c_str(), fd);
|
||||
close(fd);
|
||||
resource->sendSend(mime.c_str(), fd.get());
|
||||
}
|
||||
|
||||
void CWLRDataSource::accepted(const std::string& mime) {
|
||||
|
|
|
@ -39,7 +39,7 @@ class CWLRDataSource : public IDataSource {
|
|||
bool good();
|
||||
|
||||
virtual std::vector<std::string> mimes();
|
||||
virtual void send(const std::string& mime, uint32_t fd);
|
||||
virtual void send(const std::string& mime, CFileDescriptor fd);
|
||||
virtual void accepted(const std::string& mime);
|
||||
virtual void cancelled();
|
||||
virtual void error(uint32_t code, const std::string& msg);
|
||||
|
|
|
@ -26,7 +26,7 @@ CPrimarySelectionOffer::CPrimarySelectionOffer(SP<CZwpPrimarySelectionOfferV1> r
|
|||
|
||||
LOGM(LOG, "Offer {:x} asks to send data from source {:x}", (uintptr_t)this, (uintptr_t)source.get());
|
||||
|
||||
source->send(mime, fd);
|
||||
source->send(mime, CFileDescriptor(fd));
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -78,15 +78,13 @@ std::vector<std::string> CPrimarySelectionSource::mimes() {
|
|||
return mimeTypes;
|
||||
}
|
||||
|
||||
void CPrimarySelectionSource::send(const std::string& mime, uint32_t fd) {
|
||||
void CPrimarySelectionSource::send(const std::string& mime, CFileDescriptor fd) {
|
||||
if (std::find(mimeTypes.begin(), mimeTypes.end(), mime) == mimeTypes.end()) {
|
||||
LOGM(ERR, "Compositor/App bug: CPrimarySelectionSource::sendAskSend with non-existent mime");
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
|
||||
resource->sendSend(mime.c_str(), fd);
|
||||
close(fd);
|
||||
resource->sendSend(mime.c_str(), fd.get());
|
||||
}
|
||||
|
||||
void CPrimarySelectionSource::accepted(const std::string& mime) {
|
||||
|
|
|
@ -39,7 +39,7 @@ class CPrimarySelectionSource : public IDataSource {
|
|||
bool good();
|
||||
|
||||
virtual std::vector<std::string> mimes();
|
||||
virtual void send(const std::string& mime, uint32_t fd);
|
||||
virtual void send(const std::string& mime, CFileDescriptor fd);
|
||||
virtual void accepted(const std::string& mime);
|
||||
virtual void cancelled();
|
||||
virtual void error(uint32_t code, const std::string& msg);
|
||||
|
|
|
@ -50,7 +50,7 @@ CWLDataOfferResource::CWLDataOfferResource(SP<CWlDataOffer> resource_, SP<IDataS
|
|||
source->accepted(mime ? mime : "");
|
||||
}
|
||||
|
||||
source->send(mime ? mime : "", fd);
|
||||
source->send(mime ? mime : "", CFileDescriptor(fd));
|
||||
|
||||
recvd = true;
|
||||
|
||||
|
@ -158,15 +158,13 @@ std::vector<std::string> CWLDataSourceResource::mimes() {
|
|||
return mimeTypes;
|
||||
}
|
||||
|
||||
void CWLDataSourceResource::send(const std::string& mime, uint32_t fd) {
|
||||
void CWLDataSourceResource::send(const std::string& mime, CFileDescriptor fd) {
|
||||
if (std::find(mimeTypes.begin(), mimeTypes.end(), mime) == mimeTypes.end()) {
|
||||
LOGM(ERR, "Compositor/App bug: CWLDataSourceResource::sendAskSend with non-existent mime");
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
|
||||
resource->sendSend(mime.c_str(), fd);
|
||||
close(fd);
|
||||
resource->sendSend(mime.c_str(), fd.get());
|
||||
}
|
||||
|
||||
void CWLDataSourceResource::cancelled() {
|
||||
|
|
|
@ -58,7 +58,7 @@ class CWLDataSourceResource : public IDataSource {
|
|||
bool good();
|
||||
|
||||
virtual std::vector<std::string> mimes();
|
||||
virtual void send(const std::string& mime, uint32_t fd);
|
||||
virtual void send(const std::string& mime, CFileDescriptor fd);
|
||||
virtual void accepted(const std::string& mime);
|
||||
virtual void cancelled();
|
||||
virtual bool hasDnd();
|
||||
|
|
|
@ -15,10 +15,10 @@ class IDataSource {
|
|||
IDataSource() {}
|
||||
virtual ~IDataSource() {}
|
||||
|
||||
virtual std::vector<std::string> mimes() = 0;
|
||||
virtual void send(const std::string& mime, uint32_t fd) = 0;
|
||||
virtual void accepted(const std::string& mime) = 0;
|
||||
virtual void cancelled() = 0;
|
||||
virtual std::vector<std::string> mimes() = 0;
|
||||
virtual void send(const std::string& mime, CFileDescriptor fd) = 0;
|
||||
virtual void accepted(const std::string& mime) = 0;
|
||||
virtual void cancelled() = 0;
|
||||
virtual bool hasDnd();
|
||||
virtual bool dndDone();
|
||||
virtual void sendDndFinished();
|
||||
|
|
|
@ -46,7 +46,7 @@ std::vector<std::string> CXDataSource::mimes() {
|
|||
return mimeTypes;
|
||||
}
|
||||
|
||||
void CXDataSource::send(const std::string& mime, uint32_t fd) {
|
||||
void CXDataSource::send(const std::string& mime, CFileDescriptor fd) {
|
||||
xcb_atom_t mimeAtom = 0;
|
||||
|
||||
if (mime == "text/plain")
|
||||
|
@ -64,11 +64,10 @@ void CXDataSource::send(const std::string& mime, uint32_t fd) {
|
|||
|
||||
if (!mimeAtom) {
|
||||
Debug::log(ERR, "[XDataSource] mime atom not found");
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
|
||||
Debug::log(LOG, "[XDataSource] send with mime {} to fd {}", mime, fd);
|
||||
Debug::log(LOG, "[XDataSource] send with mime {} to fd {}", mime, fd.get());
|
||||
|
||||
selection.transfer = std::make_unique<SXTransfer>(selection);
|
||||
selection.transfer->incomingWindow = xcb_generate_id(g_pXWayland->pWM->connection);
|
||||
|
@ -80,8 +79,8 @@ void CXDataSource::send(const std::string& mime, uint32_t fd) {
|
|||
|
||||
xcb_flush(g_pXWayland->pWM->connection);
|
||||
|
||||
fcntl(fd, F_SETFL, O_WRONLY | O_NONBLOCK);
|
||||
selection.transfer->wlFD = fd;
|
||||
fcntl(fd.get(), F_SETFL, O_WRONLY | O_NONBLOCK);
|
||||
selection.transfer->wlFD = std::move(fd);
|
||||
}
|
||||
|
||||
void CXDataSource::accepted(const std::string& mime) {
|
||||
|
|
|
@ -9,7 +9,7 @@ class CXDataSource : public IDataSource {
|
|||
CXDataSource(SXSelection&);
|
||||
|
||||
virtual std::vector<std::string> mimes();
|
||||
virtual void send(const std::string& mime, uint32_t fd);
|
||||
virtual void send(const std::string& mime, CFileDescriptor fd);
|
||||
virtual void accepted(const std::string& mime);
|
||||
virtual void cancelled();
|
||||
virtual void error(uint32_t code, const std::string& msg);
|
||||
|
|
|
@ -1112,17 +1112,17 @@ void CXWM::getTransferData(SXSelection& sel) {
|
|||
|
||||
if (sel.transfer->propertyReply->type == HYPRATOMS["INCR"]) {
|
||||
Debug::log(ERR, "[xwm] Transfer is INCR, which we don't support :(");
|
||||
close(sel.transfer->wlFD);
|
||||
sel.transfer->wlFD.reset();
|
||||
sel.transfer.reset();
|
||||
return;
|
||||
} else {
|
||||
char* property = (char*)xcb_get_property_value(sel.transfer->propertyReply);
|
||||
int remainder = xcb_get_property_value_length(sel.transfer->propertyReply) - sel.transfer->propertyStart;
|
||||
|
||||
ssize_t len = write(sel.transfer->wlFD, property + sel.transfer->propertyStart, remainder);
|
||||
ssize_t len = write(sel.transfer->wlFD.get(), property + sel.transfer->propertyStart, remainder);
|
||||
if (len == -1) {
|
||||
Debug::log(ERR, "[xwm] write died in transfer get");
|
||||
close(sel.transfer->wlFD);
|
||||
sel.transfer->wlFD.reset();
|
||||
sel.transfer.reset();
|
||||
return;
|
||||
}
|
||||
|
@ -1133,7 +1133,7 @@ void CXWM::getTransferData(SXSelection& sel) {
|
|||
return;
|
||||
} else {
|
||||
Debug::log(LOG, "[xwm] cb transfer to wl client complete, read {} bytes", len);
|
||||
close(sel.transfer->wlFD);
|
||||
sel.transfer->wlFD.reset();
|
||||
sel.transfer.reset();
|
||||
}
|
||||
}
|
||||
|
@ -1249,20 +1249,18 @@ bool SXSelection::sendData(xcb_selection_request_event_t* e, std::string mime) {
|
|||
fcntl(p[1], F_SETFD, FD_CLOEXEC);
|
||||
fcntl(p[1], F_SETFL, O_NONBLOCK);
|
||||
|
||||
transfer->wlFD = p[0];
|
||||
transfer->wlFD = CFileDescriptor(p[0]);
|
||||
|
||||
Debug::log(LOG, "[xwm] sending wayland selection to xwayland with mime {}, target {}, fds {} {}", mime, e->target, p[0], p[1]);
|
||||
|
||||
selection->send(mime, p[1]);
|
||||
selection->send(mime, CFileDescriptor(p[1]));
|
||||
|
||||
transfer->eventSource = wl_event_loop_add_fd(g_pCompositor->m_sWLEventLoop, transfer->wlFD, WL_EVENT_READABLE, ::readDataSource, this);
|
||||
transfer->eventSource = wl_event_loop_add_fd(g_pCompositor->m_sWLEventLoop, transfer->wlFD.get(), WL_EVENT_READABLE, ::readDataSource, this);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
SXTransfer::~SXTransfer() {
|
||||
if (wlFD)
|
||||
close(wlFD);
|
||||
if (eventSource)
|
||||
wl_event_source_remove(eventSource);
|
||||
if (incomingWindow)
|
||||
|
|
|
@ -25,7 +25,7 @@ struct SXTransfer {
|
|||
bool flushOnDelete = false;
|
||||
bool propertySet = false;
|
||||
|
||||
int wlFD = -1;
|
||||
CFileDescriptor wlFD;
|
||||
wl_event_source* eventSource = nullptr;
|
||||
|
||||
std::vector<uint8_t> data;
|
||||
|
|
Loading…
Reference in a new issue