From c434224d23d1ff8f45c692b329c7101a8c2c04ee Mon Sep 17 00:00:00 2001 From: Wendi Gan Date: Wed, 30 Apr 2025 17:03:47 +0800 Subject: [PATCH] Add UTF-8 clipboard support Changes: - Use rfbSendServerCutTextUTF8() to send clipboard text in UTF-8, falling back to Latin1 if UTF-8 is not supported. - Implement setXCutTextUTF8() to handle received UTF-8 clipboard content. CCBUG: 430339 --- krfb/rfbserver.cpp | 19 +++++++++++++++---- krfb/rfbserver.h | 1 + 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/krfb/rfbserver.cpp b/krfb/rfbserver.cpp index 9527b6c7..e5a00bed 100644 --- a/krfb/rfbserver.cpp +++ b/krfb/rfbserver.cpp @@ -92,6 +92,7 @@ bool RfbServer::start() d->screen->ptrAddEvent = pointerHook; d->screen->passwordCheck = passwordCheck; d->screen->setXCutText = clipboardHook; + d->screen->setXCutTextUTF8 = clipboardHookUtf8; } else { //if we already have a screen, stop listening first rfbShutdownServer(d->screen, false); @@ -218,10 +219,12 @@ void RfbServer::updateCursorPosition(const QPoint & position) void RfbServer::krfbSendServerCutText() { - if(d->screen) { + if (d->screen) { QString text = QApplication::clipboard()->text(); - rfbSendServerCutText(d->screen, - text.toLocal8Bit().data(),text.length()); + QByteArray utf8Bytes = text.toUtf8(); + QByteArray latin1Bytes = text.toLatin1(); + // Try to send the clipboard text to the client in UTF-8. Use Latin1 if UTF-8 is not supported. + rfbSendServerCutTextUTF8(d->screen, utf8Bytes.data(), utf8Bytes.length(), latin1Bytes.data(), latin1Bytes.length()); } } @@ -287,5 +290,13 @@ void RfbServer::pointerHook(int bm, int x, int y, rfbClientPtr cl) //static void RfbServer::clipboardHook(char *str, int len, rfbClientPtr /*cl*/) { - QApplication::clipboard()->setText(QString::fromLocal8Bit(str,len)); + QString text = QString::fromLatin1(str, len); + QApplication::clipboard()->setText(text); +} + +void RfbServer::clipboardHookUtf8(char *str, int len, rfbClientPtr /*cl*/) +{ + // The last byte is a null terminator + QString text = QString::fromUtf8(str, len - 1); + QApplication::clipboard()->setText(text); } diff --git a/krfb/rfbserver.h b/krfb/rfbserver.h index 68c43678..3c1b2092 100644 --- a/krfb/rfbserver.h +++ b/krfb/rfbserver.h @@ -52,6 +52,7 @@ private: static void keyboardHook(rfbBool down, rfbKeySym keySym, rfbClientPtr cl); static void pointerHook(int bm, int x, int y, rfbClientPtr cl); static void clipboardHook(char *str, int len, rfbClientPtr cl); + static void clipboardHookUtf8(char *str, int len, rfbClientPtr cl); Q_DISABLE_COPY(RfbServer)