Fix some local->remote clipboard merge misses
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user