From 37775538c4c343a3de86b114953cd4c3363e18fa Mon Sep 17 00:00:00 2001 From: ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> Date: Sat, 14 Jan 2023 09:56:09 +0100 Subject: 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. --- src/Fl_Screen_Driver.H | 1 + src/Fl_Screen_Driver.cxx | 27 +++++++++++++++++++++ src/Fl_cocoa.mm | 21 ++--------------- src/drivers/Wayland/fl_wayland_clipboard_dnd.cxx | 30 ++---------------------- 4 files changed, 32 insertions(+), 47 deletions(-) diff --git a/src/Fl_Screen_Driver.H b/src/Fl_Screen_Driver.H index 38070df5a..1b6e057ed 100644 --- a/src/Fl_Screen_Driver.H +++ b/src/Fl_Screen_Driver.H @@ -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); diff --git a/src/Fl_Screen_Driver.cxx b/src/Fl_Screen_Driver.cxx index 42185d97f..30481ba8e 100644 --- a/src/Fl_Screen_Driver.cxx +++ b/src/Fl_Screen_Driver.cxx @@ -30,6 +30,7 @@ #include #include #include +#include // 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 diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index 415554388..9f195892a 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -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; } } diff --git a/src/drivers/Wayland/fl_wayland_clipboard_dnd.cxx b/src/drivers/Wayland/fl_wayland_clipboard_dnd.cxx index 89fcb2867..0a0d10cf2 100644 --- a/src/drivers/Wayland/fl_wayland_clipboard_dnd.cxx +++ b/src/drivers/Wayland/fl_wayland_clipboard_dnd.cxx @@ -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];; -- cgit v1.2.3