Pasting text copied from Linux results in doubled lines (#7144)

text/plain;charset=utf-8 clipboard format.

This results in double lines when pasting text copied from Linux to
Windows because the Windows client converts line endings and expects
only LF.

Co-authored-by: Pedro Navarro <pnavarro@netflix.com>
This commit is contained in:
Pedro Navarro 2022-04-28 07:59:58 -07:00 committed by GitHub
parent 35d7d2754d
commit 3784e42245
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 32 additions and 5 deletions

View file

@ -83,9 +83,9 @@ XWindowsClipboard::XWindowsClipboard(Display* display,
"application/x-moz-nativehtml")); "application/x-moz-nativehtml"));
m_converters.push_back(new XWindowsClipboardBMPConverter(m_display)); m_converters.push_back(new XWindowsClipboardBMPConverter(m_display));
m_converters.push_back(new XWindowsClipboardUTF8Converter(m_display, m_converters.push_back(new XWindowsClipboardUTF8Converter(m_display,
"text/plain;charset=UTF-8")); "text/plain;charset=UTF-8", true));
m_converters.push_back(new XWindowsClipboardUTF8Converter(m_display, m_converters.push_back(new XWindowsClipboardUTF8Converter(m_display,
"text/plain;charset=utf-8")); "text/plain;charset=utf-8", true));
m_converters.push_back(new XWindowsClipboardUTF8Converter(m_display, m_converters.push_back(new XWindowsClipboardUTF8Converter(m_display,
"UTF8_STRING")); "UTF8_STRING"));
m_converters.push_back(new XWindowsClipboardUCS2Converter(m_display, m_converters.push_back(new XWindowsClipboardUCS2Converter(m_display,

View file

@ -18,13 +18,15 @@
#include "platform/XWindowsClipboardUTF8Converter.h" #include "platform/XWindowsClipboardUTF8Converter.h"
#include <algorithm>
// //
// XWindowsClipboardUTF8Converter // XWindowsClipboardUTF8Converter
// //
XWindowsClipboardUTF8Converter::XWindowsClipboardUTF8Converter( XWindowsClipboardUTF8Converter::XWindowsClipboardUTF8Converter(
Display* display, const char* name) : Display* display, const char* name, bool normalize) :
m_atom(XInternAtom(display, name, False)) m_atom(XInternAtom(display, name, False)), m_normalize(normalize)
{ {
// do nothing // do nothing
} }
@ -52,6 +54,13 @@ XWindowsClipboardUTF8Converter::getDataSize() const
return 8; return 8;
} }
static
bool
isCR(char ch)
{
return (ch == '\r');
}
String String
XWindowsClipboardUTF8Converter::fromIClipboard(const String& data) const XWindowsClipboardUTF8Converter::fromIClipboard(const String& data) const
{ {
@ -61,5 +70,22 @@ XWindowsClipboardUTF8Converter::fromIClipboard(const String& data) const
String String
XWindowsClipboardUTF8Converter::toIClipboard(const String& data) const XWindowsClipboardUTF8Converter::toIClipboard(const String& data) const
{ {
// https://bugzilla.mozilla.org/show_bug.cgi?id=1547595
// GTK normalizes the clipboard's line endings to CRLF (\r\n) internally.
// When sending the raw data to other systems, like Windows, where \n is
// converted to \r\n we end up with \r\r\n, resulting in double lines when
// pasting.
//
// This seems to happen only when the clipboard format is
// text/plain;charset=utf8 and not when it's UTF8_STRING.
// When normalize clipboard is set, any \r present in the string is removed
if (m_normalize) {
String copy = data;
copy.erase(std::remove_if(copy.begin(), copy.end(), isCR), copy.end());
return copy;
}
return data; return data;
} }

View file

@ -26,7 +26,7 @@ public:
/*! /*!
\c name is converted to an atom and that is reported by getAtom(). \c name is converted to an atom and that is reported by getAtom().
*/ */
XWindowsClipboardUTF8Converter(Display* display, const char* name); XWindowsClipboardUTF8Converter(Display* display, const char* name, bool normalize = false);
virtual ~XWindowsClipboardUTF8Converter(); virtual ~XWindowsClipboardUTF8Converter();
// IXWindowsClipboardConverter overrides // IXWindowsClipboardConverter overrides
@ -39,4 +39,5 @@ public:
private: private:
Atom m_atom; Atom m_atom;
bool m_normalize;
}; };