summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2022-12-22 13:31:07 +0000
committerMatthias Clasen <mclasen@redhat.com>2022-12-22 13:31:07 +0000
commit99320f99c3c61fa6b2acbac0694476928e338f49 (patch)
tree43f69efd5b88288d2af5f211f08f13d104a16268
parent123eebb93d746322c5c93481e71bca10da6b32d7 (diff)
parent8ecb62493477c7722d8d2bebc39ccb3bcd4d480f (diff)
downloadgtk+-99320f99c3c61fa6b2acbac0694476928e338f49.tar.gz
Merge branch 'wip/ignazp/clipboard_eol' into 'main'
clipboard: improve EOL conversion of plain text See merge request GNOME/gtk!5367
-rw-r--r--gdk/win32/gdkclipdrop-win32.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/gdk/win32/gdkclipdrop-win32.c b/gdk/win32/gdkclipdrop-win32.c
index 57ade2180d..aeadad56c8 100644
--- a/gdk/win32/gdkclipdrop-win32.c
+++ b/gdk/win32/gdkclipdrop-win32.c
@@ -2081,23 +2081,30 @@ transmute_cf_unicodetext_to_utf8_string (const guchar *data,
gsize *set_data_length,
GDestroyNotify *set_data_destroy)
{
- wchar_t *ptr, *p, *q;
+ wchar_t *ptr, *p, *q, *endp;
char *result;
glong wclen, u8_len;
- /* Strip out \r */
+ /* Replace CR and CR+LF with LF */
ptr = (wchar_t *) data;
p = ptr;
q = ptr;
+ endp = ptr + length / 2;
wclen = 0;
- while (p < ptr + length / 2)
+ while (p < endp)
{
if (*p != L'\r')
{
*q++ = *p;
wclen++;
}
+ else if (p + 1 >= endp || *(p + 1) != L'\n')
+ {
+ *q++ = L'\n';
+ wclen++;
+ }
+
p++;
}
@@ -2282,7 +2289,7 @@ transmute_cf_text_to_utf8_string (const guchar *data,
gsize *set_data_length,
GDestroyNotify *set_data_destroy)
{
- char *ptr, *p, *q;
+ char *ptr, *p, *q, *endp;
char *result;
glong wclen, u8_len;
wchar_t *wstr;
@@ -2291,15 +2298,22 @@ transmute_cf_text_to_utf8_string (const guchar *data,
ptr = (char *) data;
p = ptr;
q = ptr;
+ endp = ptr + length / 2;
wclen = 0;
- while (p < ptr + length / 2)
+ while (p < endp)
{
if (*p != '\r')
{
*q++ = *p;
wclen++;
}
+ else if (p + 1 > endp || *(p + 1) != '\n')
+ {
+ *q++ = '\n';
+ wclen++;
+ }
+
p++;
}