FLTK logo

[master] 05a95e1 - Fix Fl_Terminal::handle_unknown_char() for plot_char() (#948)

FLTK matrix user chat room
(using Element browser app)   FLTK gitter user chat room   GitHub FLTK Project   FLTK News RSS Feed  
  FLTK Apps      FLTK Library      Forums      Links     Login 
 All Forums  |  Back to fltk.commit  ]
 
Previous Message ]Next Message ]

[master] 05a95e1 - Fix Fl_Terminal::handle_unknown_char() for plot_char() (#948) "Albrecht Schlosser" 04:02 Apr 09  
 
commit 05a95e146b2429154b360030d098f0dae5555706
Author:     Albrecht Schlosser <albrechts.fltk@online.de>
AuthorDate: Sun Apr 7 15:35:45 2024 +0200
Commit:     Albrecht Schlosser <fltk@aljus.de>
CommitDate: Tue Apr 9 12:53:12 2024 +0200

    Fix Fl_Terminal::handle_unknown_char() for plot_char() (#948)
    
    - Add 'int Fl_Terminal::handle_unknown_char(int drow, int dcol)'
      to write the "unknown" character to the intended display position.
    
    - Define Fl_Terminal::unknown_char as a static variable to avoid
      redundancy. In the future this might be overridden by users.

 FL/Fl_Terminal.H    |  4 ++++
 src/Fl_Terminal.cxx | 50 ++++++++++++++++++++++++++++++++++++++++----------
 2 files changed, 44 insertions(+), 10 deletions(-)

diff --git FL/Fl_Terminal.H FL/Fl_Terminal.H
index 3b9b39a..d6580a1 100644
--- FL/Fl_Terminal.H
+++ FL/Fl_Terminal.H
@@ -1027,6 +1027,7 @@ public:
   void append(const char *s, int len=-1);
 protected:
   int handle_unknown_char(void);
+  int handle_unknown_char(int drow, int dcol);
   // Drawing
   void draw_row_bg(int grow, int X, int Y) const;
   void draw_row(int grow, int Y) const;
@@ -1170,6 +1171,9 @@ public:
   // API: Show unknown/unprintable chars
   bool  show_unknown(void) const;
   void  show_unknown(bool val);
+protected:
+  static const char *unknown_char; ///< "unknown" replacement character
+public:
   // API: ANSI sequences
   bool  ansi(void) const;
   void  ansi(bool val);
diff --git src/Fl_Terminal.cxx src/Fl_Terminal.cxx
index ad41f31..29cac10 100644
--- src/Fl_Terminal.cxx
+++ src/Fl_Terminal.cxx
@@ -38,6 +38,12 @@
 #include "Fl_String.H"
 
 /////////////////////////////////
+////// Static Class Data ////////
+/////////////////////////////////
+
+const char *Fl_Terminal::unknown_char = "¿";
+
+/////////////////////////////////
 ////// Static Functions /////////
 /////////////////////////////////
 
@@ -2995,8 +3001,10 @@ const Fl_Terminal::Utf8Char* Fl_Terminal::utf8_char_at_glob(int grow, int gcol)
 void Fl_Terminal::plot_char(const char *text, int len, int drow, int dcol) {
   Utf8Char *u8c = u8c_disp_row(drow) + dcol;
   // text_utf8() warns we must do invalid checks first
-  if (!text || len<1 || len>u8c->max_utf8() || len!=fl_utf8len(*text))
-    { handle_unknown_char(); return; }
+  if (!text || len<1 || len>u8c->max_utf8() || len!=fl_utf8len(*text)) {
+    handle_unknown_char(drow, dcol);
+    return;
+  }
   u8c->text_utf8(text, len, *current_style_);
 }
 
@@ -3019,7 +3027,10 @@ void Fl_Terminal::plot_char(const char *text, int len, int drow, int dcol) {
   \see show_unknown(bool), handle_unknown_char(), is_printable()
 */
 void Fl_Terminal::plot_char(char c, int drow, int dcol) {
-  if (!is_printable(c)) { handle_unknown_char(); return; }
+  if (!is_printable(c)) {
+    handle_unknown_char(drow, dcol);
+    return;
+  }
   Utf8Char *u8c = u8c_disp_row(drow) + dcol;
   u8c->text_ascii(c, *current_style_);
 }
@@ -3233,17 +3244,36 @@ void Fl_Terminal::append(const char *s, int len/*=-1*/) {
 /**
   Handle an unknown char by either emitting an error symbol to the tty, or do nothing,
   depending on the user configurable value of show_unknown().
+
+  This writes the "unknown" character to the output stream
+  if show_unknown() is true.
+
   Returns 1 if tty modified, 0 if not.
   \see show_unknown()
 */
 int Fl_Terminal::handle_unknown_char(void) {
-  const char *unknown = "¿";
-  if (show_unknown_) {
-    escseq.reset();              // disable any pending esc seq to prevent eating unknown char
-    print_char(unknown);
-    return 1;
-  }
-  return 0;
+  if (!show_unknown_) return 0;
+  escseq.reset();               // disable any pending esc seq to prevent eating unknown char
+  print_char(unknown_char);
+  return 1;
+}
+
+/**
+  Handle an unknown char by either emitting an error symbol to the tty, or do nothing,
+  depending on the user configurable value of show_unknown().
+
+  This writes the "unknown" character to the display position \p (drow,dcol)
+  if show_unknown() is true.
+
+  Returns 1 if tty modified, 0 if not.
+  \see show_unknown()
+*/
+int Fl_Terminal::handle_unknown_char(int drow, int dcol) {
+  if (!show_unknown_) return 0;
+  int len = (int)strlen(unknown_char);
+  Utf8Char *u8c = u8c_disp_row(drow) + dcol;
+  u8c->text_utf8(unknown_char, len, *current_style_);
+  return 1;
 }
 
 // Handle user interactive scrolling
Direct Link to Message ]
 
     
Previous Message ]Next Message ]
 
 

Comments are owned by the poster. All other content is copyright 1998-2024 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to 'erco@seriss.com'.