2017-11-04 07:03:53 +01:00
|
|
|
/***********************************************************************
|
|
|
|
* foptiattr.h - Sets video attributes in optimized order *
|
|
|
|
* *
|
|
|
|
* This file is part of the Final Cut widget toolkit *
|
|
|
|
* *
|
2018-01-03 20:06:22 +01:00
|
|
|
* Copyright 2016-2018 Markus Gans *
|
2017-11-04 07:03:53 +01:00
|
|
|
* *
|
|
|
|
* The Final Cut is free software; you can redistribute it and/or *
|
|
|
|
* modify it under the terms of the GNU Lesser General Public License *
|
|
|
|
* as published by the Free Software Foundation; either version 3 of *
|
|
|
|
* the License, or (at your option) any later version. *
|
|
|
|
* *
|
|
|
|
* The Final Cut is distributed in the hope that it will be useful, *
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
|
|
* GNU Lesser General Public License for more details. *
|
|
|
|
* *
|
|
|
|
* You should have received a copy of the GNU Lesser General Public *
|
|
|
|
* License along with this program. If not, see *
|
|
|
|
* <http://www.gnu.org/licenses/>. *
|
|
|
|
***********************************************************************/
|
2017-10-02 07:32:33 +02:00
|
|
|
|
|
|
|
/* Standalone class
|
|
|
|
* ════════════════
|
|
|
|
*
|
|
|
|
* ▕▔▔▔▔▔▔▔▔▔▔▔▏
|
|
|
|
* ▕ FOptiAttr ▏
|
|
|
|
* ▕▁▁▁▁▁▁▁▁▁▁▁▏
|
|
|
|
*/
|
2016-01-08 01:00:05 +01:00
|
|
|
|
2017-04-09 20:08:53 +02:00
|
|
|
#ifndef FOPTIATTR_H
|
|
|
|
#define FOPTIATTR_H
|
2016-01-08 01:00:05 +01:00
|
|
|
|
2017-10-31 00:41:59 +01:00
|
|
|
#if !defined (USE_FINAL_H) && !defined (COMPILE_FINAL_CUT)
|
|
|
|
#error "Only <final/final.h> can be included directly."
|
|
|
|
#endif
|
|
|
|
|
2017-12-17 01:06:53 +01:00
|
|
|
// Typecast to c-string
|
|
|
|
#define C_STR const_cast<char*>
|
|
|
|
|
2016-01-08 01:00:05 +01:00
|
|
|
#include <assert.h>
|
2017-12-17 01:06:53 +01:00
|
|
|
|
|
|
|
#if defined(__sun) && defined(__SVR4)
|
|
|
|
#include <termio.h>
|
|
|
|
typedef struct termio SGTTY;
|
|
|
|
typedef struct termios SGTTYS;
|
|
|
|
|
|
|
|
#ifdef _LP64
|
|
|
|
typedef unsigned int chtype;
|
|
|
|
#else
|
|
|
|
typedef unsigned long chtype;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <term.h> // need for tparm
|
|
|
|
#else
|
|
|
|
#include <term.h> // need for tparm
|
|
|
|
#endif
|
2016-01-08 01:00:05 +01:00
|
|
|
|
2017-09-11 03:06:02 +02:00
|
|
|
#include <algorithm> // need for std::swap
|
|
|
|
|
2017-09-17 21:32:46 +02:00
|
|
|
#include "final/fc.h"
|
2017-12-17 01:06:53 +01:00
|
|
|
#include "final/ftypes.h"
|
2016-11-02 00:37:58 +01:00
|
|
|
|
2016-01-08 01:00:05 +01:00
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
// class FOptiAttr
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
#pragma pack(push)
|
|
|
|
#pragma pack(1)
|
|
|
|
|
|
|
|
class FOptiAttr
|
|
|
|
{
|
2017-09-11 03:06:02 +02:00
|
|
|
public:
|
|
|
|
// Typedef
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
int code; // character code
|
|
|
|
short fg_color; // foreground color
|
|
|
|
short bg_color; // background color
|
|
|
|
|
|
|
|
union attribute
|
|
|
|
{
|
|
|
|
struct
|
|
|
|
{
|
2017-09-15 01:31:02 +02:00
|
|
|
// Attribute byte #0
|
|
|
|
uInt8 bold : 1; // bold
|
|
|
|
uInt8 dim : 1; // dim
|
|
|
|
uInt8 italic : 1; // italic
|
|
|
|
uInt8 underline : 1; // underline
|
|
|
|
uInt8 blink : 1; // blink
|
|
|
|
uInt8 reverse : 1; // reverse
|
|
|
|
uInt8 standout : 1; // standout
|
|
|
|
uInt8 invisible : 1; // invisible
|
2017-09-11 03:06:02 +02:00
|
|
|
// Attribute byte #1
|
2017-09-15 01:31:02 +02:00
|
|
|
uInt8 protect : 1; // protect mode
|
|
|
|
uInt8 crossed_out : 1; // crossed out
|
|
|
|
uInt8 dbl_underline : 1; // double underline
|
|
|
|
uInt8 alt_charset : 1; // alternate character set (vt100)
|
|
|
|
uInt8 pc_charset : 1; // pc character set (CP437)
|
|
|
|
uInt8 transparent : 1; // transparent
|
|
|
|
uInt8 trans_shadow : 1; // transparent shadow
|
|
|
|
uInt8 inherit_bg : 1; // inherit background
|
2017-09-11 03:06:02 +02:00
|
|
|
// Attribute byte #2
|
2017-09-15 01:31:02 +02:00
|
|
|
uInt8 no_changes : 1; // no changes required
|
|
|
|
uInt8 printed : 1; // is printed to VTerm
|
|
|
|
uInt8 : 6; // padding bits
|
2017-09-11 03:06:02 +02:00
|
|
|
} bit;
|
|
|
|
|
2017-09-15 01:31:02 +02:00
|
|
|
uInt8 byte[3];
|
2017-09-11 03:06:02 +02:00
|
|
|
} attr;
|
|
|
|
} char_data;
|
|
|
|
|
|
|
|
// Constructor
|
|
|
|
explicit FOptiAttr();
|
|
|
|
|
|
|
|
// Destructor
|
|
|
|
~FOptiAttr();
|
|
|
|
|
|
|
|
// Friend operator functions
|
|
|
|
friend bool operator == (const char_data&, const char_data&);
|
|
|
|
friend bool operator != (const char_data&, const char_data&);
|
|
|
|
|
2018-03-28 00:03:57 +02:00
|
|
|
// Accessors
|
|
|
|
const char* getClassName() const;
|
|
|
|
|
2017-09-11 03:06:02 +02:00
|
|
|
// Mutators
|
|
|
|
void setMaxColor (const int&);
|
|
|
|
void setNoColorVideo (int);
|
|
|
|
void setDefaultColorSupport();
|
|
|
|
void setCygwinTerminal();
|
2017-12-19 02:06:27 +01:00
|
|
|
void set_enter_bold_mode (char[]);
|
|
|
|
void set_exit_bold_mode (char[]);
|
|
|
|
void set_enter_dim_mode (char[]);
|
|
|
|
void set_exit_dim_mode (char[]);
|
|
|
|
void set_enter_italics_mode (char[]);
|
|
|
|
void set_exit_italics_mode (char[]);
|
|
|
|
void set_enter_underline_mode (char[]);
|
|
|
|
void set_exit_underline_mode (char[]);
|
|
|
|
void set_enter_blink_mode (char[]);
|
|
|
|
void set_exit_blink_mode (char[]);
|
|
|
|
void set_enter_reverse_mode (char[]);
|
|
|
|
void set_exit_reverse_mode (char[]);
|
|
|
|
void set_enter_secure_mode (char[]);
|
|
|
|
void set_exit_secure_mode (char[]);
|
|
|
|
void set_enter_protected_mode (char[]);
|
|
|
|
void set_exit_protected_mode (char[]);
|
|
|
|
void set_enter_crossed_out_mode (char[]);
|
|
|
|
void set_exit_crossed_out_mode (char[]);
|
|
|
|
void set_enter_dbl_underline_mode (char[]);
|
|
|
|
void set_exit_dbl_underline_mode (char[]);
|
|
|
|
void set_enter_standout_mode (char[]);
|
|
|
|
void set_exit_standout_mode (char[]);
|
|
|
|
void set_set_attributes (char[]);
|
|
|
|
void set_exit_attribute_mode (char[]);
|
|
|
|
void set_enter_alt_charset_mode (char[]);
|
|
|
|
void set_exit_alt_charset_mode (char[]);
|
|
|
|
void set_enter_pc_charset_mode (char[]);
|
|
|
|
void set_exit_pc_charset_mode (char[]);
|
|
|
|
void set_a_foreground_color (char[]);
|
|
|
|
void set_a_background_color (char[]);
|
|
|
|
void set_foreground_color (char[]);
|
|
|
|
void set_background_color (char[]);
|
|
|
|
void set_term_color_pair (char[]);
|
|
|
|
void set_orig_pair (char[]);
|
|
|
|
void set_orig_orig_colors (char[]);
|
2017-09-11 03:06:02 +02:00
|
|
|
|
|
|
|
// Inquiry
|
|
|
|
static bool isNormal (char_data*&);
|
|
|
|
|
|
|
|
// Methods
|
2018-04-02 22:04:29 +02:00
|
|
|
void initialize();
|
2017-09-11 03:06:02 +02:00
|
|
|
static short vga2ansi (register short);
|
|
|
|
char* changeAttribute (char_data*&, char_data*&);
|
|
|
|
|
|
|
|
private:
|
|
|
|
// Typedefs and Enumerations
|
|
|
|
typedef unsigned char uChar;
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
char* cap;
|
|
|
|
bool caused_reset;
|
|
|
|
} capability;
|
|
|
|
|
|
|
|
enum init_reset_tests
|
|
|
|
{
|
|
|
|
no_test = 0x00,
|
|
|
|
test_ansi_reset = 0x01, // ANSI X3.64 terminal
|
|
|
|
test_adm3_reset = 0x02, // Lear Siegler ADM-3 terminal
|
|
|
|
same_like_ue = 0x04,
|
|
|
|
same_like_se = 0x08,
|
|
|
|
same_like_me = 0x10,
|
|
|
|
all_tests = 0x1f
|
|
|
|
};
|
|
|
|
|
|
|
|
enum default_color
|
|
|
|
{
|
|
|
|
Default = -1,
|
|
|
|
Black = 0,
|
|
|
|
LightGray = 7
|
|
|
|
};
|
|
|
|
|
2017-12-03 21:06:21 +01:00
|
|
|
enum attr_modes
|
|
|
|
{
|
|
|
|
standout_mode = 1,
|
|
|
|
underline_mode = 2,
|
|
|
|
reverse_mode = 4,
|
|
|
|
blink_mode = 8,
|
|
|
|
dim_mode = 16,
|
|
|
|
bold_mode = 32,
|
|
|
|
invisible_mode = 64,
|
|
|
|
protected_mode = 128,
|
|
|
|
alt_charset_mode = 256,
|
|
|
|
horizontal_mode = 512,
|
|
|
|
left_mode = 1024,
|
|
|
|
low_mode = 2048,
|
|
|
|
right_mode = 4096,
|
|
|
|
top_mode = 8192,
|
|
|
|
vertical_mode = 16384,
|
|
|
|
italic_mode = 32768,
|
|
|
|
no_mode = 65536
|
|
|
|
};
|
|
|
|
|
2017-09-11 03:06:02 +02:00
|
|
|
// Disable copy constructor
|
|
|
|
FOptiAttr (const FOptiAttr&);
|
|
|
|
|
|
|
|
// Disable assignment operator (=)
|
|
|
|
FOptiAttr& operator = (const FOptiAttr&);
|
|
|
|
|
|
|
|
// Mutators
|
|
|
|
bool setTermBold (char_data*&);
|
|
|
|
bool unsetTermBold (char_data*&);
|
|
|
|
bool setTermDim (char_data*&);
|
|
|
|
bool unsetTermDim (char_data*&);
|
|
|
|
bool setTermItalic (char_data*&);
|
|
|
|
bool unsetTermItalic (char_data*&);
|
|
|
|
bool setTermUnderline (char_data*&);
|
|
|
|
bool unsetTermUnderline (char_data*&);
|
|
|
|
bool setTermBlink (char_data*&);
|
|
|
|
bool unsetTermBlink (char_data*&);
|
|
|
|
bool setTermReverse (char_data*&);
|
|
|
|
bool unsetTermReverse (char_data*&);
|
|
|
|
bool setTermStandout (char_data*&);
|
|
|
|
bool unsetTermStandout (char_data*&);
|
|
|
|
bool setTermInvisible (char_data*&);
|
|
|
|
bool unsetTermInvisible (char_data*&);
|
|
|
|
bool setTermProtected (char_data*&);
|
|
|
|
bool unsetTermProtected (char_data*&);
|
|
|
|
bool setTermCrossedOut (char_data*&);
|
|
|
|
bool unsetTermCrossedOut (char_data*&);
|
|
|
|
bool setTermDoubleUnderline (char_data*&);
|
|
|
|
bool unsetTermDoubleUnderline (char_data*&);
|
|
|
|
bool setTermAttributes ( char_data*&
|
|
|
|
, bool, bool, bool
|
|
|
|
, bool, bool, bool
|
|
|
|
, bool, bool, bool );
|
|
|
|
bool unsetTermAttributes (char_data*&);
|
|
|
|
bool setTermAltCharset (char_data*&);
|
|
|
|
bool unsetTermAltCharset (char_data*&);
|
|
|
|
bool setTermPCcharset (char_data*&);
|
|
|
|
bool unsetTermPCcharset (char_data*&);
|
|
|
|
bool setTermDefaultColor (char_data*&);
|
2017-11-23 00:59:58 +01:00
|
|
|
void setAttributesOn (char_data*&);
|
|
|
|
void setAttributesOff (char_data*&);
|
2017-09-11 03:06:02 +02:00
|
|
|
|
|
|
|
// Inquiries
|
|
|
|
static bool hasColor (char_data*&);
|
|
|
|
static bool hasAttribute (char_data*&);
|
|
|
|
static bool hasNoAttribute (char_data*&);
|
|
|
|
|
|
|
|
// Methods
|
|
|
|
bool colorChange (char_data*&, char_data*&);
|
|
|
|
void resetColor (char_data*&);
|
2018-04-02 22:04:29 +02:00
|
|
|
void prevent_no_color_video_attributes (char_data*&, bool = false);
|
2018-01-03 20:06:22 +01:00
|
|
|
void preProcessing_cygwin_quirks (char_data*&);
|
|
|
|
void postProcessing_cygwin_quirks (char_data*&, char_data*&);
|
|
|
|
void deactivateAttributes (char_data*&, char_data*&);
|
|
|
|
void changeAttributeSGR (char_data*&, char_data*&);
|
|
|
|
void changeAttributeSeparately (char_data*&, char_data*&);
|
2017-09-11 03:06:02 +02:00
|
|
|
void change_color (char_data*&, char_data*&);
|
2018-01-03 20:06:22 +01:00
|
|
|
void change_to_default_color (char_data*&, char_data*&, short&, short&);
|
|
|
|
void change_current_color (char_data*&, short, short);
|
2017-09-11 03:06:02 +02:00
|
|
|
void resetAttribute (char_data*&);
|
|
|
|
void reset (char_data*&);
|
2017-12-19 02:06:27 +01:00
|
|
|
bool caused_reset_attributes (char[], uChar = all_tests);
|
2018-04-02 22:04:29 +02:00
|
|
|
bool hasCharsetEquivalence();
|
2017-09-11 03:06:02 +02:00
|
|
|
void detectSwitchOn (char_data*&, char_data*&);
|
|
|
|
void detectSwitchOff (char_data*&, char_data*&);
|
|
|
|
bool switchOn();
|
|
|
|
bool switchOff();
|
2017-12-19 02:06:27 +01:00
|
|
|
bool append_sequence (char[]);
|
|
|
|
bool replace_sequence (char[]);
|
2017-09-11 03:06:02 +02:00
|
|
|
|
|
|
|
// Data Members
|
|
|
|
capability F_enter_bold_mode;
|
|
|
|
capability F_exit_bold_mode;
|
|
|
|
capability F_enter_dim_mode;
|
|
|
|
capability F_exit_dim_mode;
|
|
|
|
capability F_enter_italics_mode;
|
|
|
|
capability F_exit_italics_mode;
|
|
|
|
capability F_enter_underline_mode;
|
|
|
|
capability F_exit_underline_mode;
|
|
|
|
capability F_enter_blink_mode;
|
|
|
|
capability F_exit_blink_mode;
|
|
|
|
capability F_enter_reverse_mode;
|
|
|
|
capability F_exit_reverse_mode;
|
|
|
|
capability F_enter_standout_mode;
|
|
|
|
capability F_exit_standout_mode;
|
|
|
|
capability F_enter_secure_mode;
|
|
|
|
capability F_exit_secure_mode;
|
|
|
|
capability F_enter_protected_mode;
|
|
|
|
capability F_exit_protected_mode;
|
|
|
|
capability F_enter_crossed_out_mode;
|
|
|
|
capability F_exit_crossed_out_mode;
|
|
|
|
capability F_enter_dbl_underline_mode;
|
|
|
|
capability F_exit_dbl_underline_mode;
|
|
|
|
capability F_set_attributes;
|
|
|
|
capability F_exit_attribute_mode;
|
|
|
|
capability F_enter_alt_charset_mode;
|
|
|
|
capability F_exit_alt_charset_mode;
|
|
|
|
capability F_enter_pc_charset_mode;
|
|
|
|
capability F_exit_pc_charset_mode;
|
|
|
|
capability F_set_a_foreground;
|
|
|
|
capability F_set_a_background;
|
|
|
|
capability F_set_foreground;
|
|
|
|
capability F_set_background;
|
|
|
|
capability F_set_color_pair;
|
|
|
|
capability F_orig_pair;
|
|
|
|
capability F_orig_colors;
|
|
|
|
|
|
|
|
char_data on;
|
|
|
|
char_data off;
|
2018-04-02 22:04:29 +02:00
|
|
|
char_data reset_byte_mask;
|
2017-09-11 03:06:02 +02:00
|
|
|
|
|
|
|
int max_color;
|
|
|
|
int attr_without_color;
|
|
|
|
bool ansi_default_color;
|
2018-04-02 22:04:29 +02:00
|
|
|
bool alt_equal_pc_charset;
|
2017-09-11 03:06:02 +02:00
|
|
|
bool monochron;
|
|
|
|
bool fake_reverse;
|
|
|
|
bool cygwin_terminal;
|
|
|
|
char attr_buf[8192];
|
|
|
|
char* attr_ptr;
|
2016-11-02 00:37:58 +01:00
|
|
|
};
|
|
|
|
#pragma pack(pop)
|
|
|
|
|
|
|
|
|
|
|
|
// FOptiAttr inline functions
|
2016-01-08 01:00:05 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
inline bool operator == ( const FOptiAttr::char_data& lhs,
|
|
|
|
const FOptiAttr::char_data& rhs )
|
|
|
|
{
|
2017-11-26 22:37:18 +01:00
|
|
|
return lhs.code == rhs.code
|
|
|
|
&& lhs.fg_color == rhs.fg_color
|
|
|
|
&& lhs.bg_color == rhs.bg_color
|
2017-09-15 01:31:02 +02:00
|
|
|
&& lhs.attr.byte[0] == rhs.attr.byte[0]
|
|
|
|
&& lhs.attr.byte[1] == rhs.attr.byte[1];
|
2016-01-08 01:00:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
inline bool operator != ( const FOptiAttr::char_data& lhs,
|
|
|
|
const FOptiAttr::char_data& rhs )
|
|
|
|
{ return ! ( lhs == rhs ); }
|
|
|
|
|
2018-03-28 00:03:57 +02:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
inline const char* FOptiAttr::getClassName() const
|
|
|
|
{ return "FOptiAttr"; }
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
2017-09-11 03:06:02 +02:00
|
|
|
inline void FOptiAttr::setMaxColor (const int& c)
|
2016-11-02 00:37:58 +01:00
|
|
|
{ max_color = c; }
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
inline void FOptiAttr::setNoColorVideo (int attr)
|
|
|
|
{ attr_without_color = attr; }
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
inline void FOptiAttr::setDefaultColorSupport()
|
|
|
|
{ ansi_default_color = true; }
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
inline void FOptiAttr::setCygwinTerminal()
|
|
|
|
{ cygwin_terminal = true; }
|
|
|
|
|
2017-04-09 20:08:53 +02:00
|
|
|
#endif // FOPTIATTR_H
|