summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Fl_Screen_Driver.H1
-rw-r--r--src/Fl_Screen_Driver.cxx27
-rw-r--r--src/Fl_cocoa.mm21
-rw-r--r--src/drivers/Wayland/fl_wayland_clipboard_dnd.cxx30
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 <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
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];;