Browse Source

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.
pull/954/head
Albrecht Schlosser 1 year ago committed by Albrecht Schlosser
parent
commit
05a95e146b
  1. 4
      FL/Fl_Terminal.H
  2. 50
      src/Fl_Terminal.cxx

4
FL/Fl_Terminal.H

@ -1027,6 +1027,7 @@ public:
void append(const char *s, int len=-1); void append(const char *s, int len=-1);
protected: protected:
int handle_unknown_char(void); int handle_unknown_char(void);
int handle_unknown_char(int drow, int dcol);
// Drawing // Drawing
void draw_row_bg(int grow, int X, int Y) const; void draw_row_bg(int grow, int X, int Y) const;
void draw_row(int grow, int Y) const; void draw_row(int grow, int Y) const;
@ -1170,6 +1171,9 @@ public:
// API: Show unknown/unprintable chars // API: Show unknown/unprintable chars
bool show_unknown(void) const; bool show_unknown(void) const;
void show_unknown(bool val); void show_unknown(bool val);
protected:
static const char *unknown_char; ///< "unknown" replacement character
public:
// API: ANSI sequences // API: ANSI sequences
bool ansi(void) const; bool ansi(void) const;
void ansi(bool val); void ansi(bool val);

50
src/Fl_Terminal.cxx

@ -37,6 +37,12 @@
#include <FL/fl_string_functions.h> #include <FL/fl_string_functions.h>
#include "Fl_String.H" #include "Fl_String.H"
/////////////////////////////////
////// Static Class Data ////////
/////////////////////////////////
const char *Fl_Terminal::unknown_char = "¿";
///////////////////////////////// /////////////////////////////////
////// Static Functions ///////// ////// 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) { void Fl_Terminal::plot_char(const char *text, int len, int drow, int dcol) {
Utf8Char *u8c = u8c_disp_row(drow) + dcol; Utf8Char *u8c = u8c_disp_row(drow) + dcol;
// text_utf8() warns we must do invalid checks first // text_utf8() warns we must do invalid checks first
if (!text || len<1 || len>u8c->max_utf8() || len!=fl_utf8len(*text)) if (!text || len<1 || len>u8c->max_utf8() || len!=fl_utf8len(*text)) {
{ handle_unknown_char(); return; } handle_unknown_char(drow, dcol);
return;
}
u8c->text_utf8(text, len, *current_style_); 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() \see show_unknown(bool), handle_unknown_char(), is_printable()
*/ */
void Fl_Terminal::plot_char(char c, int drow, int dcol) { 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; Utf8Char *u8c = u8c_disp_row(drow) + dcol;
u8c->text_ascii(c, *current_style_); 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, 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(). 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. Returns 1 if tty modified, 0 if not.
\see show_unknown() \see show_unknown()
*/ */
int Fl_Terminal::handle_unknown_char(void) { int Fl_Terminal::handle_unknown_char(void) {
const char *unknown = "¿"; if (!show_unknown_) return 0;
if (show_unknown_) { escseq.reset(); // disable any pending esc seq to prevent eating unknown char
escseq.reset(); // disable any pending esc seq to prevent eating unknown char print_char(unknown_char);
print_char(unknown); return 1;
return 1; }
}
return 0; /**
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 // Handle user interactive scrolling

Loading…
Cancel
Save