Extend commit a4b33f8 to other uses of function convert_crlf()

Helper function convert_crlf() from file fl_wayland_clipboard_dnd.cxx has been
repaired by commit a4b33f8 (13 jan 2023). But the same function was also in
file Fl_cocoa.mm. This commit moves the repaired code to class Fl_Screen_Driver
and has both fl_wayland_clipboard_dnd.cxx and Fl_cocoa.mm use it.
This commit is contained in:
ManoloFLTK 2023-01-14 09:56:09 +01:00
parent 82ac84a7c8
commit 37775538c4
4 changed files with 32 additions and 47 deletions

View File

@ -197,6 +197,7 @@ public:
static void write_image_inside(Fl_RGB_Image *to, Fl_RGB_Image *from, int to_x, int to_y);
static Fl_RGB_Image *traverse_to_gl_subwindows(Fl_Group *g, int x, int y, int w, int h,
Fl_RGB_Image *full_img);
static size_t convert_crlf(char *s, size_t len);
// optional platform-specific key handling for Fl_Input widget
// the default implementation may be enough
virtual int input_widget_handle_key(int key, unsigned mods, unsigned shift, Fl_Input *input);

View File

@ -30,6 +30,7 @@
#include <FL/Fl_Image_Surface.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Tooltip.H>
#include <string.h> // for memchr
char Fl_Screen_Driver::bg_set = 0;
char Fl_Screen_Driver::bg2_set = 0;
@ -709,6 +710,32 @@ int Fl_Screen_Driver::XParseGeometry(const char* string, int* x, int* y,
return (mask);
}
// turn '\r' characters into '\n' and "\r\n" sequences into '\n'
// returns new length
size_t Fl_Screen_Driver::convert_crlf(char *s, size_t len) {
char *src = (char *)memchr(s, '\r', len); // find first `\r` in buffer
if (src) {
char *dst = src;
char *end = s + len;
while (src < end) {
if (*src == '\r') {
if (src + 1 < end && *(src + 1) == '\n') {
src++; // skip '\r'
continue;
} else {
*dst++ = '\n'; // replace single '\r' with '\n'
}
} else {
*dst++ = *src;
}
src++;
}
return (dst - s);
}
return len;
}
/**
\}
\endcond

View File

@ -67,7 +67,6 @@ extern int fl_send_system_handlers(void *e);
// forward definition of functions in this file
// converting cr lf converter function
static size_t convert_crlf(char * string, size_t len);
static void createAppleMenu(void);
static void cocoaMouseHandler(NSEvent *theEvent);
static void clipboard_check(void);
@ -2547,7 +2546,7 @@ static FLTextInputContext* fltextinputcontext_instance = nil;
DragData = (char *)malloc([data length] + 1);
[data getBytes:DragData];
DragData[[data length]] = 0;
convert_crlf(DragData, strlen(DragData));
Fl_Screen_Driver::convert_crlf(DragData, strlen(DragData));
}
else {
Fl_Cocoa_Screen_Driver::breakMacEventLoop();
@ -3451,22 +3450,6 @@ Fl_Quartz_Copy_Surface_Driver::~Fl_Quartz_Copy_Surface_Driver()
// Copy & Paste fltk implementation.
////////////////////////////////////////////////////////////////
static size_t convert_crlf(char * s, size_t len)
{
// turn \r characters into \n and "\r\n" sequences into \n:
char *p;
size_t l = len;
while ((p = strchr(s, '\r'))) {
if (*(p+1) == '\n') {
memmove(p, p+1, l-(p-s));
len--; l--;
} else *p = '\n';
l -= p-s;
s = p + 1;
}
return len;
}
// clipboard variables definitions :
char *fl_selection_buffer[2] = {NULL, NULL};
int fl_selection_length[2] = {0, 0};
@ -3547,7 +3530,7 @@ static int get_plain_text_from_clipboard(int clipboard)
[data getBytes:fl_selection_buffer[clipboard]];
}
fl_selection_buffer[clipboard][len - 1] = 0;
length = convert_crlf(fl_selection_buffer[clipboard], len - 1); // turn all \r characters into \n:
length = Fl_Screen_Driver::convert_crlf(fl_selection_buffer[clipboard], len - 1); // turn all \r characters into \n:
Fl::e_clipboard_type = Fl::clipboard_plain_text;
}
}

View File

@ -320,32 +320,6 @@ static void data_device_handle_selection(void *data, struct wl_data_device *data
}
// turn '\r' characters into '\n' and "\r\n" sequences into '\n'
// returns new length
static size_t convert_crlf(char *s, size_t len) {
char *src = (char *)memchr(s, '\r', len); // find first `\r` in buffer
if (src) {
char *dst = src;
char *end = s + len;
while (src < end) {
if (*src == '\r') {
if (src + 1 < end && *(src + 1) == '\n') {
src++; // skip '\r'
continue;
} else {
*dst++ = '\n'; // replace single '\r' with '\n'
}
} else {
*dst++ = *src;
}
src++;
}
return (dst - s);
}
return len;
}
// Gets from the system the clipboard or dnd text and puts it in fl_selection_buffer[1]
// which is enlarged if necessary.
static void get_clipboard_or_dragged_text(struct wl_data_offer *offer) {
@ -365,7 +339,7 @@ static void get_clipboard_or_dragged_text(struct wl_data_offer *offer) {
fl_selection_buffer[1][ fl_selection_length[1] ] = 0;
return;
}
n = convert_crlf(to, n);
n = Fl_Screen_Driver::convert_crlf(to, n);
to += n;
rest -= n;
}
@ -398,7 +372,7 @@ static void get_clipboard_or_dragged_text(struct wl_data_offer *offer) {
close(fds[0]);
break;
}
n = convert_crlf(from, n);
n = Fl_Screen_Driver::convert_crlf(from, n);
from += n;
}
fl_selection_length[1] = from - fl_selection_buffer[1];;