summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Melcher <fltk@matthiasm.com>2009-09-23 21:32:23 +0000
committerMatthias Melcher <fltk@matthiasm.com>2009-09-23 21:32:23 +0000
commitb12b5134a30acc779fc1aaad0a27859180c5fe9c (patch)
tree27443939ef6c6fd44feb2d32597ea555c14e30b8
parentc153300e7f1c019294dd142fd545ede09f9a77f9 (diff)
File Chooser now also recognizes utf8 encoded text files. STR 2218.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@6899 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
-rw-r--r--CHANGES2
-rw-r--r--src/Fl_File_Chooser2.cxx31
2 files changed, 31 insertions, 2 deletions
diff --git a/CHANGES b/CHANGES
index 9f211d7cf..2c02e9565 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,7 @@
CHANGES IN FLTK 1.3.0
+ - File chooser preview now recognizes utf8 encoded
+ text files (STR #2218)
- Empty functions in Fluid no longer create an
implementation (STR #2259)
- Fixed Fluid dependency on X11 (STR #2261)
diff --git a/src/Fl_File_Chooser2.cxx b/src/Fl_File_Chooser2.cxx
index 76314f4f5..5e5f1e3cf 100644
--- a/src/Fl_File_Chooser2.cxx
+++ b/src/Fl_File_Chooser2.cxx
@@ -1332,10 +1332,37 @@ Fl_File_Chooser::update_preview()
window->cursor(FL_CURSOR_DEFAULT);
Fl::check();
- // Scan the buffer for printable chars...
- for (ptr = preview_text_;
+ // Scan the buffer for printable UTF8 chars...
+ for (ptr = preview_text_; *ptr; ptr++) {
+ uchar c = uchar(*ptr);
+ if ( (c&0x80)==0 ) {
+ if (!isprint(c&255) && !isspace(c&255)) break;
+ } else if ( (c&0xe0)==0xc0 ) {
+ if (ptr[1] && (ptr[1]&0xc0)!=0x80) break;
+ ptr++;
+ } else if ( (c&0xf0)==0xe0 ) {
+ if (ptr[1] && (ptr[1]&0xc0)!=0x80) break;
+ ptr++;
+ if (ptr[1] && (ptr[1]&0xc0)!=0x80) break;
+ ptr++;
+ } else if ( (c&0xf8)==0xf0 ) {
+ if (ptr[1] && (ptr[1]&0xc0)!=0x80) break;
+ ptr++;
+ if (ptr[1] && (ptr[1]&0xc0)!=0x80) break;
+ ptr++;
+ if (ptr[1] && (ptr[1]&0xc0)!=0x80) break;
+ ptr++;
+ }
+ }
+// *ptr && (isprint(*ptr & 255) || isspace(*ptr & 255));
+// ptr ++);
+
+ // Scan the buffer for printable characters in 8 bit
+ if (*ptr || ptr == preview_text_) {
+ for (ptr = preview_text_;
*ptr && (isprint(*ptr & 255) || isspace(*ptr & 255));
ptr ++);
+ }
if (*ptr || ptr == preview_text_) {
// Non-printable file, just show a big ?...