summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorManolo Gouy <Manolo>2016-12-17 07:42:54 +0000
committerManolo Gouy <Manolo>2016-12-17 07:42:54 +0000
commit936486cb1ccaba88add3b7caa984cdf841e019f1 (patch)
tree7011e04a877a24e8d1c6120b58762ca9b506075d /src
parentd0f6ef5d3207d39b5209a608117d3078e40acb39 (diff)
Handle non-ASCII characters when selecting a word or moving the cursor by one word.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12149 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src')
-rw-r--r--src/Fl_Text_Buffer.cxx28
-rw-r--r--src/Fl_Text_Display.cxx17
2 files changed, 24 insertions, 21 deletions
diff --git a/src/Fl_Text_Buffer.cxx b/src/Fl_Text_Buffer.cxx
index 9efcd6609..1b42234f3 100644
--- a/src/Fl_Text_Buffer.cxx
+++ b/src/Fl_Text_Buffer.cxx
@@ -825,17 +825,29 @@ int Fl_Text_Buffer::line_end(int pos) const {
}
+/** Returns whether character at position \p pos is a word separator.
+ Pos must be at a character boundary.
+ */
+bool Fl_Text_Buffer::is_word_separator(int pos) const {
+ int c = char_at(pos);
+ if (c < 128) {
+ return !(isalnum(c) || c == '_'); // non alphanumeric ASCII
+ }
+ return (c == 0xA0 || // NO-BREAK SPACE
+ (c >= 0x3000 && c <= 0x301F) // IDEOGRAPHIC punctuation
+ );
+}
+
+
/*
Find the beginning of a word.
- NOT UNICODE SAFE.
*/
int Fl_Text_Buffer::word_start(int pos) const {
- // FIXME: character is ucs-4
- while (pos>0 && (isalnum(char_at(pos)) || char_at(pos) == '_')) {
+ while (pos > 0 && !is_word_separator(pos))
+ {
pos = prev_char(pos);
- }
- // FIXME: character is ucs-4
- if (!(isalnum(char_at(pos)) || char_at(pos) == '_'))
+ }
+ if (is_word_separator(pos))
pos = next_char(pos);
return pos;
}
@@ -843,11 +855,9 @@ int Fl_Text_Buffer::word_start(int pos) const {
/*
Find the end of a word.
- NOT UNICODE SAFE.
*/
int Fl_Text_Buffer::word_end(int pos) const {
- // FIXME: character is ucs-4
- while (pos < length() && (isalnum(char_at(pos)) || char_at(pos) == '_'))
+ while (pos < length() && !is_word_separator(pos))
{
pos = next_char(pos);
}
diff --git a/src/Fl_Text_Display.cxx b/src/Fl_Text_Display.cxx
index 52c506715..aacee88e6 100644
--- a/src/Fl_Text_Display.cxx
+++ b/src/Fl_Text_Display.cxx
@@ -1537,24 +1537,17 @@ int Fl_Text_Display::rewind_lines(int startPos, int nLines) {
-static inline int fl_isseparator(unsigned int c) {
- // FIXME: this does not take UCS-4 encoding into account
- return c != '$' && c != '_' && (isspace(c) || ispunct(c));
-}
-
-
-
/**
\brief Moves the current insert position right one word.
*/
void Fl_Text_Display::next_word() {
int pos = insert_position();
- while (pos < buffer()->length() && !fl_isseparator(buffer()->char_at(pos))) {
+ while (pos < buffer()->length() && !buffer()->is_word_separator(pos)) {
pos = buffer()->next_char(pos);
}
- while (pos < buffer()->length() && fl_isseparator(buffer()->char_at(pos))) {
+ while (pos < buffer()->length() && buffer()->is_word_separator(pos)) {
pos = buffer()->next_char(pos);
}
@@ -1571,15 +1564,15 @@ void Fl_Text_Display::previous_word() {
if (pos==0) return;
pos = buffer()->prev_char(pos);
- while (pos && fl_isseparator(buffer()->char_at(pos))) {
+ while (pos && buffer()->is_word_separator(pos)) {
pos = buffer()->prev_char(pos);
}
- while (pos && !fl_isseparator(buffer()->char_at(pos))) {
+ while (pos && !buffer()->is_word_separator(pos)) {
pos = buffer()->prev_char(pos);
}
- if (fl_isseparator(buffer()->char_at(pos))) {
+ if (buffer()->is_word_separator(pos)) {
pos = buffer()->next_char(pos);
}