Fix some local->remote clipboard merge misses

pull/36/head
Lauri Kasanen 4 years ago
parent a1cf454f06
commit 95d34f7e58

@ -296,8 +296,10 @@ void SConnection::setEncodings(int nEncodings, const rdr::S32* encodings)
} }
} }
void SConnection::clientCutText(const char* str) void SConnection::clientCutText(const char* str, int len)
{ {
hasLocalClipboard = false;
strFree(clientClipboard); strFree(clientClipboard);
clientClipboard = NULL; clientClipboard = NULL;
@ -328,11 +330,13 @@ void SConnection::handleClipboardNotify(rdr::U32 flags)
strFree(clientClipboard); strFree(clientClipboard);
clientClipboard = NULL; clientClipboard = NULL;
if (flags & rfb::clipboardUTF8) if (flags & rfb::clipboardUTF8) {
handleClipboardAnnounce(true); handleClipboardAnnounce(true);
else hasLocalClipboard = false;
} else {
handleClipboardAnnounce(false); handleClipboardAnnounce(false);
} }
}
void SConnection::handleClipboardProvide(rdr::U32 flags, void SConnection::handleClipboardProvide(rdr::U32 flags,
const size_t* lengths, const size_t* lengths,

@ -73,7 +73,7 @@ namespace rfb {
virtual void setEncodings(int nEncodings, const rdr::S32* encodings); virtual void setEncodings(int nEncodings, const rdr::S32* encodings);
virtual void clientCutText(const char* str); virtual void clientCutText(const char* str, int len);
virtual void handleClipboardRequest(rdr::U32 flags); virtual void handleClipboardRequest(rdr::U32 flags);
virtual void handleClipboardPeek(rdr::U32 flags); virtual void handleClipboardPeek(rdr::U32 flags);

@ -1016,7 +1016,7 @@ void VNCSConnectionST::handleClipboardAnnounce(bool available)
server->handleClipboardAnnounce(this, available); server->handleClipboardAnnounce(this, available);
} }
void VNCSConnectionST::handleClipboardData(const char* data) void VNCSConnectionST::handleClipboardData(const char* data, int len)
{ {
if (!(accessRights & AccessCutText)) return; if (!(accessRights & AccessCutText)) return;
if (!rfb::Server::acceptCutText) return; if (!rfb::Server::acceptCutText) return;
@ -1025,7 +1025,6 @@ void VNCSConnectionST::handleClipboardData(const char* data)
sock->getPeerAddress()); sock->getPeerAddress());
return; return;
} }
int len = strlen(data);
const int origlen = len; const int origlen = len;
if (rfb::Server::DLP_ClipAcceptMax && len > rfb::Server::DLP_ClipAcceptMax) if (rfb::Server::DLP_ClipAcceptMax && len > rfb::Server::DLP_ClipAcceptMax)
len = rfb::Server::DLP_ClipAcceptMax; len = rfb::Server::DLP_ClipAcceptMax;

@ -185,7 +185,7 @@ namespace rfb {
int x, int y, int w, int h); int x, int y, int w, int h);
virtual void handleClipboardRequest(); virtual void handleClipboardRequest();
virtual void handleClipboardAnnounce(bool available); virtual void handleClipboardAnnounce(bool available);
virtual void handleClipboardData(const char* data); virtual void handleClipboardData(const char* data, int len);
virtual void supportsLocalCursor(); virtual void supportsLocalCursor();
virtual void supportsFence(); virtual void supportsFence();
virtual void supportsContinuousUpdates(); virtual void supportsContinuousUpdates();

@ -535,7 +535,7 @@ void VNCServerST::sendClipboardData(const char* data)
for (ci = clipboardRequestors.begin(); for (ci = clipboardRequestors.begin();
ci != clipboardRequestors.end(); ci = ci_next) { ci != clipboardRequestors.end(); ci = ci_next) {
ci_next = ci; ci_next++; ci_next = ci; ci_next++;
(*ci)->sendClipboardData(data, strlen(data)); (*ci)->sendClipboardDataOrClose(data);
} }
clipboardRequestors.clear(); clipboardRequestors.clear();

@ -476,9 +476,9 @@ void XserverDesktop::handleClipboardAnnounce(bool available)
vncHandleClipboardAnnounce(available); vncHandleClipboardAnnounce(available);
} }
void XserverDesktop::handleClipboardData(const char* data_) void XserverDesktop::handleClipboardData(const char* data_, int len)
{ {
vncHandleClipboardData(data_); vncHandleClipboardData(data_, len);
} }
void XserverDesktop::grabRegion(const rfb::Region& region) void XserverDesktop::grabRegion(const rfb::Region& region)

@ -96,7 +96,7 @@ public:
const rfb::ScreenSet& layout); const rfb::ScreenSet& layout);
virtual void handleClipboardRequest(); virtual void handleClipboardRequest();
virtual void handleClipboardAnnounce(bool available); virtual void handleClipboardAnnounce(bool available);
virtual void handleClipboardData(const char* data); virtual void handleClipboardData(const char* data, int len);
// rfb::PixelBuffer callbacks // rfb::PixelBuffer callbacks
virtual void grabRegion(const rfb::Region& r); virtual void grabRegion(const rfb::Region& r);

@ -67,7 +67,7 @@ static int vncOwnSelection(Atom selection);
static int vncConvertSelection(ClientPtr client, Atom selection, static int vncConvertSelection(ClientPtr client, Atom selection,
Atom target, Atom property, Atom target, Atom property,
Window requestor, CARD32 time, Window requestor, CARD32 time,
const char* data); const char* data, int len);
static int vncProcConvertSelection(ClientPtr client); static int vncProcConvertSelection(ClientPtr client);
static void vncSelectionRequest(Atom selection, Atom target); static void vncSelectionRequest(Atom selection, Atom target);
static int vncProcSendEvent(ClientPtr client); static int vncProcSendEvent(ClientPtr client);
@ -161,7 +161,7 @@ void vncHandleClipboardAnnounce(int available)
} }
} }
void vncHandleClipboardData(const char* data) void vncHandleClipboardData(const char* data, int len)
{ {
struct VncDataTarget* next; struct VncDataTarget* next;
@ -177,7 +177,7 @@ void vncHandleClipboardData(const char* data)
vncDataTargetHead->property, vncDataTargetHead->property,
vncDataTargetHead->requestor, vncDataTargetHead->requestor,
vncDataTargetHead->time, vncDataTargetHead->time,
data); data, len);
if (rc != Success) { if (rc != Success) {
event.u.u.type = SelectionNotify; event.u.u.type = SelectionNotify;
event.u.selectionNotify.time = vncDataTargetHead->time; event.u.selectionNotify.time = vncDataTargetHead->time;
@ -280,7 +280,7 @@ static int vncOwnSelection(Atom selection)
static int vncConvertSelection(ClientPtr client, Atom selection, static int vncConvertSelection(ClientPtr client, Atom selection,
Atom target, Atom property, Atom target, Atom property,
Window requestor, CARD32 time, Window requestor, CARD32 time,
const char* data) const char* data, int len)
{ {
Selection *pSel; Selection *pSel;
WindowPtr pWin; WindowPtr pWin;
@ -370,7 +370,7 @@ static int vncConvertSelection(ClientPtr client, Atom selection,
rc = dixChangeWindowProperty(serverClient, pWin, realProperty, rc = dixChangeWindowProperty(serverClient, pWin, realProperty,
XA_STRING, 8, PropModeReplace, XA_STRING, 8, PropModeReplace,
strlen(latin1), latin1, TRUE); len, latin1, TRUE);
vncStrFree(latin1); vncStrFree(latin1);
@ -379,7 +379,7 @@ static int vncConvertSelection(ClientPtr client, Atom selection,
} else if (target == xaUTF8_STRING) { } else if (target == xaUTF8_STRING) {
rc = dixChangeWindowProperty(serverClient, pWin, realProperty, rc = dixChangeWindowProperty(serverClient, pWin, realProperty,
xaUTF8_STRING, 8, PropModeReplace, xaUTF8_STRING, 8, PropModeReplace,
strlen(data), data, TRUE); len, data, TRUE);
if (rc != Success) if (rc != Success)
return rc; return rc;
} else { } else {
@ -424,7 +424,7 @@ static int vncProcConvertSelection(ClientPtr client)
pSel->window == wid) { pSel->window == wid) {
rc = vncConvertSelection(client, stuff->selection, rc = vncConvertSelection(client, stuff->selection,
stuff->target, stuff->property, stuff->target, stuff->property,
stuff->requestor, stuff->time, NULL); stuff->requestor, stuff->time, NULL, 0);
if (rc != Success) { if (rc != Success) {
xEvent event; xEvent event;

@ -26,7 +26,7 @@ void vncSelectionInit(void);
void vncHandleClipboardRequest(void); void vncHandleClipboardRequest(void);
void vncHandleClipboardAnnounce(int available); void vncHandleClipboardAnnounce(int available);
void vncHandleClipboardData(const char* data); void vncHandleClipboardData(const char* data, int len);
#ifdef __cplusplus #ifdef __cplusplus
} }

Loading…
Cancel
Save