From 8407a9d2b6939d661f61d3da842cef922b560fc2 Mon Sep 17 00:00:00 2001 From: Markus Gans Date: Mon, 1 Oct 2018 22:27:54 +0200 Subject: [PATCH] Extract FTerm data members into the data class FTermData --- ChangeLog | 3 + examples/Makefile.clang | 2 +- src/Makefile.am | 2 +- src/Makefile.clang | 24 +- src/Makefile.gcc | 21 +- src/fdialog.cpp | 24 +- src/fkeyboard.cpp | 8 +- src/flistview.cpp | 72 ++-- src/foptimove.cpp | 5 +- src/fstatusbar.cpp | 2 +- src/fstring.cpp | 4 + src/fterm.cpp | 521 ++++++++++++++--------------- src/ftermcap.cpp | 47 ++- src/ftermcapquirks.cpp | 19 +- src/ftermdetection.cpp | 13 +- src/ftermlinux.cpp | 32 +- src/ftermxterminal.cpp | 30 +- src/fvterm.cpp | 5 +- src/fwidget.cpp | 4 +- src/fwindow.cpp | 2 +- src/include/final/fc.h | 2 +- src/include/final/fdialog.h | 1 + src/include/final/fkeyboard.h | 2 +- src/include/final/flistview.h | 3 +- src/include/final/fterm.h | 400 +++++++++------------- src/include/final/ftermcap.h | 21 +- src/include/final/ftermcapquirks.h | 6 +- src/include/final/ftermdata.h | 394 ++++++++++++++++++++++ src/include/final/ftermdetection.h | 10 +- src/include/final/ftermlinux.h | 8 +- src/include/final/ftermxterminal.h | 21 +- src/include/final/fvterm.h | 2 +- test/ftermcapquirks-test.cpp | 95 +++--- test/ftermdetection-test.cpp | 86 +++-- 34 files changed, 1133 insertions(+), 758 deletions(-) create mode 100644 src/include/final/ftermdata.h diff --git a/ChangeLog b/ChangeLog index 36f4a1e8..cd561068 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2018-10-01 Markus Gans + * Extract FTerm data members into the data class FTermData + 2018-09-28 Markus Gans * FListView now has the ability to sort by columns diff --git a/examples/Makefile.clang b/examples/Makefile.clang index 3ce11e90..8fe6f0c9 100644 --- a/examples/Makefile.clang +++ b/examples/Makefile.clang @@ -16,7 +16,7 @@ INCLUDES = -I../src/include -I/usr/include/final RM = rm -f ifdef DEBUG - OPTIMIZE = -O0 -fsanitize=undefined + OPTIMIZE = -O0 -fsanitize=bool,bounds,enum,float-cast-overflow,function,null else OPTIMIZE = -O2 endif diff --git a/src/Makefile.am b/src/Makefile.am index 5d099c39..ccb53641 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -42,6 +42,7 @@ libfinal_la_SOURCES = \ fkey_map.cpp \ ftextview.cpp \ fstatusbar.cpp \ + ftermcap.cpp \ ftermcapquirks.cpp \ ftermxterminal.cpp \ ftermfreebsd.cpp \ @@ -108,7 +109,6 @@ finalcutinclude_HEADERS = \ include/final/fscrollview.h \ include/final/fstatusbar.h \ include/final/fstring.h \ - include/final/ftcap_map.h \ include/final/ftermcap.h \ include/final/ftermcapquirks.h \ include/final/ftermxterminal.h \ diff --git a/src/Makefile.clang b/src/Makefile.clang index 36a18907..a86ff5ee 100644 --- a/src/Makefile.clang +++ b/src/Makefile.clang @@ -12,10 +12,11 @@ INCLUDE_HEADERS = \ fapplication.h \ fbuttongroup.h \ fbutton.h \ + ftogglebutton.h \ fcheckbox.h \ fswitch.h \ fdialog.h \ - fevent.h \ + fwindow.h \ ffiledialog.h \ final.h \ flabel.h \ @@ -23,15 +24,12 @@ INCLUDE_HEADERS = \ flistbox.h \ flistview.h \ fmenu.h \ - fmouse.h \ - fkeyboard.h \ fdialoglistmenu.h \ fmenubar.h \ fradiomenuitem.h \ fcheckmenuitem.h \ fmessagebox.h \ ftooltip.h \ - fobject.h \ foptiattr.h \ foptimove.h \ ftermbuffer.h \ @@ -43,6 +41,8 @@ INCLUDE_HEADERS = \ fscrollview.h \ fstatusbar.h \ fstring.h \ + fmouse.h \ + fkeyboard.h \ ftermcap.h \ fterm.h \ ftermios.h \ @@ -54,11 +54,11 @@ INCLUDE_HEADERS = \ ftermlinux.h \ fvterm.h \ ftextview.h \ - ftogglebutton.h \ fcolorpalette.h \ fwidgetcolors.h \ fwidget.h \ - fwindow.h + fevent.h \ + fobject.h \ # compiler parameter CXX = clang++ @@ -87,8 +87,6 @@ OBJS = \ flistbox.o \ flistview.o \ fmenu.o \ - fmouse.o \ - fkeyboard.o \ fdialoglistmenu.o \ fmenubar.o \ fmenuitem.o \ @@ -96,14 +94,17 @@ OBJS = \ fcheckmenuitem.o \ fmenulist.o \ fdialog.o \ - fscrollview.o \ fwindow.o \ + fscrollview.o \ fmessagebox.o \ ftooltip.o \ ffiledialog.o \ fkey_map.o \ ftextview.o \ fstatusbar.o \ + fmouse.o \ + fkeyboard.o \ + ftermcap.o \ fterm.o \ ftermios.o \ ftermdetection.o \ @@ -113,7 +114,6 @@ OBJS = \ ftermopenbsd.o \ ftermlinux.o \ fvterm.o \ - fevent.o \ foptiattr.o \ foptimove.o \ ftermbuffer.o \ @@ -121,12 +121,14 @@ OBJS = \ fcolorpalette.o \ fwidgetcolors.o \ fwidget.o \ + fevent.o \ fobject.o TERMCAP := $(shell test -n "$$(ldd {/usr,}/lib64/libncursesw.so.5 2>/dev/null | grep libtinfo)" && echo "-ltinfo" || echo "-lncurses") ifdef DEBUG - OPTIMIZE = -O0 -fsanitize=undefined + OPTIMIZE = -O0 -fsanitize=bool,bounds,enum,float-cast-overflow,function,null +# OPTIMIZE = -O0 -fsanitize=undefined else OPTIMIZE = -O2 endif diff --git a/src/Makefile.gcc b/src/Makefile.gcc index 909b2afe..60a1c15f 100644 --- a/src/Makefile.gcc +++ b/src/Makefile.gcc @@ -12,10 +12,11 @@ INCLUDE_HEADERS = \ fapplication.h \ fbuttongroup.h \ fbutton.h \ + ftogglebutton.h \ fcheckbox.h \ fswitch.h \ fdialog.h \ - fevent.h \ + fwindow.h \ ffiledialog.h \ final.h \ flabel.h \ @@ -23,15 +24,12 @@ INCLUDE_HEADERS = \ flistbox.h \ flistview.h \ fmenu.h \ - fmouse.h \ - fkeyboard.h \ fdialoglistmenu.h \ fmenubar.h \ fradiomenuitem.h \ fcheckmenuitem.h \ fmessagebox.h \ ftooltip.h \ - fobject.h \ foptiattr.h \ foptimove.h \ ftermbuffer.h \ @@ -43,6 +41,8 @@ INCLUDE_HEADERS = \ fscrollview.h \ fstatusbar.h \ fstring.h \ + fmouse.h \ + fkeyboard.h \ ftermcap.h \ fterm.h \ ftermios.h \ @@ -54,11 +54,11 @@ INCLUDE_HEADERS = \ ftermlinux.h \ fvterm.h \ ftextview.h \ - ftogglebutton.h \ fcolorpalette.h \ fwidgetcolors.h \ fwidget.h \ - fwindow.h + fevent.h \ + fobject.h # compiler parameter CXX = g++ @@ -87,8 +87,6 @@ OBJS = \ flistbox.o \ flistview.o \ fmenu.o \ - fmouse.o \ - fkeyboard.o \ fdialoglistmenu.o \ fmenubar.o \ fmenuitem.o \ @@ -96,14 +94,17 @@ OBJS = \ fcheckmenuitem.o \ fmenulist.o \ fdialog.o \ - fscrollview.o \ fwindow.o \ + fscrollview.o \ fmessagebox.o \ ftooltip.o \ ffiledialog.o \ fkey_map.o \ ftextview.o \ fstatusbar.o \ + fmouse.o \ + fkeyboard.o \ + ftermcap.o \ fterm.o \ ftermios.o \ ftermdetection.o \ @@ -113,7 +114,6 @@ OBJS = \ ftermopenbsd.o \ ftermlinux.o \ fvterm.o \ - fevent.o \ foptiattr.o \ foptimove.o \ ftermbuffer.o \ @@ -121,6 +121,7 @@ OBJS = \ fcolorpalette.o \ fwidgetcolors.o \ fwidget.o \ + fevent.o \ fobject.o TERMCAP := $(shell test -n "$$(ldd {/usr,}/lib64/libncursesw.so.5 2>/dev/null | grep libtinfo)" && echo "-ltinfo" || echo "-lncurses") diff --git a/src/fdialog.cpp b/src/fdialog.cpp index 9f26b13a..83a38a47 100644 --- a/src/fdialog.cpp +++ b/src/fdialog.cpp @@ -1548,15 +1548,31 @@ inline void FDialog::lowerActivateDialog() updateTerminal(); } +//---------------------------------------------------------------------- +bool FDialog::isLowerRightResizeCorner (mouseStates& ms) +{ + // 3 characters in the lower right corner | + // x + // -----xx + + if ( (ms.mouse_x == getWidth() && ms.mouse_y == getHeight() - 1) + || ( ( ms.mouse_x == getWidth() - 1 + || ms.mouse_x == getWidth() ) && ms.mouse_y == getHeight() ) ) + { + return true; + } + else + { + return false; + } +} + //---------------------------------------------------------------------- void FDialog::resizeMouseDown (mouseStates& ms) { // Click on the lower right resize corner - if ( isResizeable() - && ( (ms.mouse_x == getWidth() && ms.mouse_y == getHeight() - 1) - || ( (ms.mouse_x == getWidth() - 1 - || ms.mouse_x == getWidth()) && ms.mouse_y == getHeight()) ) ) + if ( isResizeable() && isLowerRightResizeCorner(ms) ) { resize_click_pos = ms.termPos; FPoint lower_right_pos = getTermGeometry().getLowerRightPos(); diff --git a/src/fkeyboard.cpp b/src/fkeyboard.cpp index e34448ee..918ef8e5 100644 --- a/src/fkeyboard.cpp +++ b/src/fkeyboard.cpp @@ -79,7 +79,7 @@ FKeyboard::FKeyboard() , keypressed_cmd() , keyreleased_cmd() , escape_key_cmd() - , termcap_map(0) + , key_map(0) { // Initialize keyboard values time_keypressed.tv_sec = 0; @@ -123,7 +123,7 @@ const FString FKeyboard::getKeyName (int keynum) //---------------------------------------------------------------------- void FKeyboard::setTermcapMap (fc::fkeymap* keymap) { - termcap_map = keymap; + key_map = keymap; } //---------------------------------------------------------------------- @@ -232,10 +232,10 @@ inline int FKeyboard::getTermcapKey() assert ( fifo_buf_size > 0 ); - if ( ! termcap_map ) + if ( ! key_map ) return -1; - fc::fkeymap* keymap = reinterpret_cast(termcap_map); + fc::fkeymap* keymap = reinterpret_cast(key_map); for (int i = 0; keymap[i].tname[0] != 0; i++) { char* k = keymap[i].string; diff --git a/src/flistview.cpp b/src/flistview.cpp index f64afa1e..c02fdd6c 100644 --- a/src/flistview.cpp +++ b/src/flistview.cpp @@ -789,42 +789,14 @@ int FListView::addColumn (const FString& label, int width) FObject::FObjectIterator FListView::insert ( FListViewItem* item , FObjectIterator parent_iter ) { - static const int padding_space = 1; - int line_width = padding_space; // leading space - uInt column_idx = 0; - uInt entries = uInt(item->column_list.size()); FObjectIterator item_iter; - headerItems::iterator header_iter; + int line_width; + int element_count; if ( parent_iter == FListView::null_iter ) return FListView::null_iter; - // Determine the line width - header_iter = header.begin(); - - while ( header_iter != header.end() ) - { - int width = header_iter->width; - bool fixed_width = header_iter->fixed_width; - - if ( ! fixed_width ) - { - int len; - - if ( column_idx < entries ) - len = int(item->column_list[column_idx].getLength()); - else - len = 0; - - if ( len > width ) - header_iter->width = len; - } - - line_width += header_iter->width + padding_space; // width + trailing space - column_idx++; - ++header_iter; - } - + line_width = determineLineWidth (item); recalculateHorizontalBar (line_width); if ( parent_iter == root ) @@ -862,7 +834,7 @@ FObject::FObjectIterator FListView::insert ( FListViewItem* item // Sort list by a column (only if activated) sort(); - int element_count = int(getCount()); + element_count = int(getCount()); recalculateVerticalBar (element_count); return item_iter; } @@ -1862,6 +1834,42 @@ void FListView::updateDrawing (bool draw_vbar, bool draw_hbar) flush_out(); } +//---------------------------------------------------------------------- +int FListView::determineLineWidth (FListViewItem* item) +{ + static const int padding_space = 1; + int line_width = padding_space; // leading space + uInt column_idx = 0; + uInt entries = uInt(item->column_list.size()); + headerItems::iterator header_iter; + header_iter = header.begin(); + + while ( header_iter != header.end() ) + { + int width = header_iter->width; + bool fixed_width = header_iter->fixed_width; + + if ( ! fixed_width ) + { + int len; + + if ( column_idx < entries ) + len = int(item->column_list[column_idx].getLength()); + else + len = 0; + + if ( len > width ) + header_iter->width = len; + } + + line_width += header_iter->width + padding_space; // width + trailing space + column_idx++; + ++header_iter; + } + + return line_width; +} + //---------------------------------------------------------------------- void FListView::recalculateHorizontalBar (int len) { diff --git a/src/foptimove.cpp b/src/foptimove.cpp index a7167f13..d198408c 100644 --- a/src/foptimove.cpp +++ b/src/foptimove.cpp @@ -65,7 +65,10 @@ FOptiMove::FOptiMove (int baud) , screen_height(24) { assert ( baud >= 0 ); - move_buf[0] = '\0'; + + // Initialize arrays with '\0' + std::fill_n (move_buf, sizeof(move_buf), '\0'); + calculateCharDuration(); // ANSI set cursor address preset for undefined terminals diff --git a/src/fstatusbar.cpp b/src/fstatusbar.cpp index 79112831..cd40903d 100644 --- a/src/fstatusbar.cpp +++ b/src/fstatusbar.cpp @@ -99,7 +99,7 @@ bool FStatusKey::setMouseFocus(bool on) if ( on == mouse_focus ) return true; - return mouse_focus = ( on ) ? true : false; + return mouse_focus = on; } diff --git a/src/fstring.cpp b/src/fstring.cpp index eb0a31f5..0d9a15cd 100644 --- a/src/fstring.cpp +++ b/src/fstring.cpp @@ -2705,6 +2705,10 @@ inline void FString::_insert (uInt pos, uInt len, const wchar_t s[]) else { uInt x; + uInt insert_len = uInt(std::wcslen(s)); + + if ( len > insert_len ) + len = insert_len; if ( (length + len + 1) <= bufsize ) { diff --git a/src/fterm.cpp b/src/fterm.cpp index 7b09db28..d57f75aa 100644 --- a/src/fterm.cpp +++ b/src/fterm.cpp @@ -27,7 +27,6 @@ #include "final/fterm.h" #include "final/fcharmap.h" -#include "final/ftcap_map.h" namespace finalcut { @@ -42,59 +41,15 @@ static bool term_initialized = false; int (*FTerm::Fputchar)(int); // static class attributes -int FTerm::fd_tty; -uInt FTerm::baudrate; -bool FTerm::resize_term; -bool FTerm::monochron; -bool FTerm::pc_charset_console; -bool FTerm::utf8_state; -bool FTerm::utf8_console; -bool FTerm::utf8_linux_terminal; -bool FTerm::force_vt100; // VT100 line drawing -bool FTerm::vt100_console; -bool FTerm::ascii_console; -bool FTerm::NewFont; -bool FTerm::VGAFont; -bool FTerm::shadow_character; -bool FTerm::half_block_character; -bool FTerm::cursor_optimisation; -bool FTerm::hidden_cursor; -bool FTerm::use_alternate_screen = true; -char FTerm::termtype[256] = { }; -char FTerm::termfilename[256] = { }; -#if DEBUG -int FTerm::framebuffer_bpp = -1; -#endif -char* FTerm::locale_name = 0; -char* FTerm::locale_xterm = 0; -FRect* FTerm::term = 0; - -char FTerm::exit_message[8192] = ""; -fc::encoding FTerm::term_encoding; -const FString* FTerm::save_xterm_font = 0; -const FString* FTerm::save_xterm_title = 0; -FOptiMove* FTerm::opti_move = 0; -FOptiAttr* FTerm::opti_attr = 0; -FTermDetection* FTerm::term_detection = 0; -FTermXTerminal* FTerm::xterm = 0; -FKeyboard* FTerm::keyboard = 0; -FMouseControl* FTerm::mouse = 0; -std::map* FTerm::vt100_alt_char = 0; -std::map* \ - FTerm::encoding_set = 0; -FTerm::termcap_map* FTerm::tcap = fc::term_caps; -bool FTermcap::background_color_erase = false; -bool FTermcap::automatic_left_margin = false; -bool FTermcap::automatic_right_margin = false; -bool FTermcap::eat_nl_glitch = false; -bool FTermcap::ansi_default_color = false; -bool FTermcap::osc_support = false; -bool FTermcap::no_utf8_acs_chars = false; -int FTermcap::max_color = 1; -int FTermcap::tabstop = 8; -int FTermcap::attr_without_color = 0; -FTerm::initializationValues FTerm::init_values; -fc::linuxConsoleCursorStyle FTerm::linux_console_cursor_style; +FTerm::initializationValues FTerm::init_values; +FTermData* FTerm::data = 0; +FTermcap::tcap_map* FTerm::tcap = 0; +FOptiMove* FTerm::opti_move = 0; +FOptiAttr* FTerm::opti_attr = 0; +FTermDetection* FTerm::term_detection = 0; +FTermXTerminal* FTerm::xterm = 0; +FKeyboard* FTerm::keyboard = 0; +FMouseControl* FTerm::mouse = 0; #if defined(__linux__) FTermLinux* FTerm::linux = 0; @@ -117,13 +72,8 @@ fc::linuxConsoleCursorStyle FTerm::linux_console_cursor_style; //---------------------------------------------------------------------- FTerm::FTerm (bool disable_alt_screen) { - resize_term = false; - if ( ! term_initialized ) - { - use_alternate_screen = ! disable_alt_screen; - init(); - } + init (disable_alt_screen); } //---------------------------------------------------------------------- @@ -138,19 +88,23 @@ FTerm::~FTerm() // destructor //---------------------------------------------------------------------- int FTerm::getLineNumber() { - if ( term->getHeight() == 0 ) + FRect& term_geometry = data->getTermGeometry(); + + if ( term_geometry.getHeight() == 0 ) detectTermSize(); - return term->getHeight(); + return term_geometry.getHeight(); } //---------------------------------------------------------------------- int FTerm::getColumnNumber() { - if ( term->getWidth() == 0 ) + FRect& term_geometry = data->getTermGeometry(); + + if ( term_geometry.getWidth() == 0 ) detectTermSize(); - return term->getWidth(); + return term_geometry.getWidth(); } //---------------------------------------------------------------------- @@ -168,11 +122,7 @@ bool FTerm::isNormal (charData*& ch) //---------------------------------------------------------------------- void FTerm::setTermType (const char term_name[]) { - if ( ! term_name ) - return; - - std::strncpy (termtype, term_name, sizeof(termtype)); - termtype[sizeof(termtype) - 1] = '\0'; + data->setTermType(term_name); } //---------------------------------------------------------------------- @@ -199,26 +149,26 @@ void FTerm::setDblclickInterval (const long timeout) //---------------------------------------------------------------------- bool FTerm::setUTF8 (bool on) // UTF-8 (Unicode) { - if ( on == utf8_state ) - return utf8_state; + if ( on == data->isUTF8() ) + return on; if ( on ) - utf8_state = true; + data->setUTF8(true); else - utf8_state = false; + data->setUTF8(false); #if defined(__linux__) linux->setUTF8 (on); #endif - return utf8_state; + return data->isUTF8(); } //---------------------------------------------------------------------- bool FTerm::setVGAFont() { - if ( VGAFont ) - return VGAFont; + if ( data->isVGAFont() ) + return data->isVGAFont(); if ( isGnomeTerminal() || isKdeTerminal() @@ -232,14 +182,13 @@ bool FTerm::setVGAFont() if ( isXTerminal() || isScreenTerm() || isUrxvtTerminal() || FTermcap::osc_support ) { - VGAFont = true; + data->setVGAFont(true); // Set font in xterm to vga xterm->setFont("vga"); - NewFont = false; - pc_charset_console = true; - term_encoding = fc::PC; + data->setNewFont(false); + data->setTermEncoding (fc::PC); - if ( isXTerminal() && utf8_console ) + if ( isXTerminal() && data->hasUTF8Console() ) Fputchar = &FTerm::putchar_UTF8; else Fputchar = &FTerm::putchar_ASCII; @@ -247,25 +196,27 @@ bool FTerm::setVGAFont() #if defined(__linux__) else if ( isLinuxTerm() ) { - VGAFont = linux->loadVGAFont(); - pc_charset_console = true; - term_encoding = fc::PC; + data->setVGAFont(linux->loadVGAFont()); + data->setTermEncoding (fc::PC); Fputchar = &FTerm::putchar_ASCII; } #endif // defined(__linux__) else - VGAFont = false; + data->setVGAFont(false); - if ( VGAFont ) - shadow_character = half_block_character = true; + if ( data->isVGAFont() ) + { + data->supportShadowCharacter (true); + data->supportHalfBlockCharacter (true); + } - return VGAFont; + return data->isVGAFont(); } //---------------------------------------------------------------------- bool FTerm::setNewFont() { - if ( NewFont ) + if ( isNewFont() ) return true; if ( isGnomeTerminal() @@ -279,13 +230,12 @@ bool FTerm::setNewFont() if ( isXTerminal() || isScreenTerm() || isUrxvtTerminal() || FTermcap::osc_support ) { - NewFont = true; + data->setNewFont(true); // Set font in xterm to 8x16graph xterm->setFont("8x16graph"); - pc_charset_console = true; - term_encoding = fc::PC; + data->setTermEncoding (fc::PC); - if ( isXTerminal() && utf8_console ) + if ( isXTerminal() && data->hasUTF8Console() ) Fputchar = &FTerm::putchar_UTF8; else Fputchar = &FTerm::putchar_ASCII; @@ -293,19 +243,21 @@ bool FTerm::setNewFont() #if defined(__linux__) else if ( isLinuxTerm() ) { - NewFont = linux->loadNewFont(); - pc_charset_console = true; - term_encoding = fc::PC; + data->setNewFont(linux->loadNewFont()); + data->setTermEncoding (fc::PC); Fputchar = &FTerm::putchar_ASCII; // function pointer } #endif // defined(__linux__) else - NewFont = false; + data->setNewFont(false); - if ( NewFont ) - shadow_character = half_block_character = true; + if ( isNewFont() ) + { + data->supportShadowCharacter (true); + data->supportHalfBlockCharacter (true); + } - return NewFont; + return isNewFont(); } //---------------------------------------------------------------------- @@ -313,20 +265,22 @@ bool FTerm::setOldFont() { bool retval = false; - if ( ! (NewFont || VGAFont) ) + if ( ! (data->isNewFont() || data->isVGAFont()) ) return false; - retval = \ - NewFont = \ - VGAFont = false; + retval = false; + data->setNewFont(false); + data->setVGAFont(false); if ( isXTerminal() || isScreenTerm() || isUrxvtTerminal() || FTermcap::osc_support ) { - if ( save_xterm_font && save_xterm_font->getLength() > 2 ) + const FString& font = data->getXtermFont(); + + if ( font.getLength() > 2 ) { // restore saved xterm font - xterm->setFont(*save_xterm_font); + xterm->setFont (font); } else { @@ -343,14 +297,17 @@ bool FTerm::setOldFont() if ( retval ) { - shadow_character = linux->hasShadowCharacter(); - half_block_character = linux->hasHalfBlockCharacter(); + data->supportShadowCharacter (linux->hasShadowCharacter()); + data->supportHalfBlockCharacter (linux->hasHalfBlockCharacter()); } } #endif // defined(__linux__) if ( retval ) - VGAFont = NewFont = false; + { + data->setVGAFont(false); + data->setNewFont(false); + } return retval; } @@ -358,6 +315,9 @@ bool FTerm::setOldFont() //---------------------------------------------------------------------- int FTerm::openConsole() { + int fd = data->getTTYFileDescriptor(); + char* termfilename = data->getTermFileName(); + static const char* terminal_devices[] = { "/proc/self/fd/0", @@ -369,15 +329,20 @@ int FTerm::openConsole() 0 }; - if ( fd_tty >= 0 ) // console is already opened + if ( fd >= 0 ) // console is already opened return 0; if ( ! *termfilename ) return 0; for (int i = 0; terminal_devices[i] != 0; i++) - if ( (fd_tty = open(terminal_devices[i], O_RDWR, 0)) >= 0 ) + { + fd = open(terminal_devices[i], O_RDWR, 0); + data->setTTYFileDescriptor(fd); + + if ( fd >= 0 ) return 0; + } return -1; // No file descriptor referring to the console } @@ -385,11 +350,14 @@ int FTerm::openConsole() //---------------------------------------------------------------------- int FTerm::closeConsole() { - if ( fd_tty < 0 ) // console is already closed + int fd = data->getTTYFileDescriptor(); + + if ( fd < 0 ) // console is already closed return 0; - int ret = ::close (fd_tty); // use 'close' from the global namespace - fd_tty = -1; + // use 'close' from the global namespace + int ret = ::close (fd); + data->setTTYFileDescriptor(-1); if ( ret == 0 ) return 0; @@ -402,7 +370,7 @@ char* FTerm::moveCursor (int xold, int yold, int xnew, int ynew) { // Returns the cursor move string - if ( cursor_optimisation ) + if ( data->hasCursorOptimisation() ) return opti_move->moveCursor (xold, yold, xnew, ynew); else return tgoto(TCAP(fc::t_cursor_address), xnew, ynew); @@ -415,7 +383,7 @@ char* FTerm::cursorsVisibility (bool on) char* visibility_str = 0; - if ( on == hidden_cursor ) + if ( on == data->isCursorHidden() ) return 0; if ( on ) @@ -423,14 +391,14 @@ char* FTerm::cursorsVisibility (bool on) visibility_str = disableCursor(); if ( visibility_str ) - hidden_cursor = true; // global state + data->setCursorHidden (true); // Global state } else { visibility_str = enableCursor(); if ( visibility_str ) - hidden_cursor = false; // global state + data->setCursorHidden (false); // Global state } return visibility_str; @@ -500,55 +468,57 @@ void FTerm::detectTermSize() struct winsize win_size; bool close_after_detect = false; + int fd = data->getTTYFileDescriptor(); int ret; - if ( fd_tty < 0 ) // console is already closed + if ( fd < 0 ) // console is closed { if ( openConsole() != 0 ) return; + fd = data->getTTYFileDescriptor(); close_after_detect = true; } - ret = ioctl (fd_tty, TIOCGWINSZ, &win_size); + FRect& term_geometry = data->getTermGeometry(); + ret = ioctl (fd, TIOCGWINSZ, &win_size); if ( ret != 0 || win_size.ws_col == 0 || win_size.ws_row == 0 ) { char* str; - term->setPos(1,1); + term_geometry.setPos(1,1); // Use COLUMNS or fallback to the xterm default width of 80 characters str = std::getenv("COLUMNS"); - term->setWidth(str ? std::atoi(str) : 80); + term_geometry.setWidth(str ? std::atoi(str) : 80); // Use LINES or fallback to the xterm default height of 24 characters str = std::getenv("LINES"); - term->setHeight(str ? std::atoi(str) : 24); + term_geometry.setHeight(str ? std::atoi(str) : 24); } else { - term->setRect(1, 1, win_size.ws_col, win_size.ws_row); + term_geometry.setRect(1, 1, win_size.ws_col, win_size.ws_row); } - opti_move->setTermSize (term->getWidth(), term->getHeight()); + opti_move->setTermSize ( term_geometry.getWidth() + , term_geometry.getHeight() ); if ( close_after_detect ) closeConsole(); } //---------------------------------------------------------------------- -void FTerm::setTermSize (int term_width, int term_height) +void FTerm::setTermSize (int width, int height) { - // Set xterm size to {term_width} x {term_height} + // Set xterm size to {width} x {height} - if ( isXTerminal() ) - { - putstringf (CSI "8;%d;%dt", term_height, term_width); - std::fflush(stdout); - } + xterm->setTermSize (width, height); } //---------------------------------------------------------------------- void FTerm::setTermTitle (const FString& title) { + // Set the xterm window title + xterm->setTitle (title); } @@ -661,15 +631,15 @@ void FTerm::beep() //---------------------------------------------------------------------- void FTerm::setEncoding (fc::encoding enc) { - term_encoding = enc; + data->setTermEncoding (enc); - assert ( term_encoding == fc::UTF8 - || term_encoding == fc::VT100 // VT100 line drawing - || term_encoding == fc::PC // CP-437 - || term_encoding == fc::ASCII ); + assert ( enc == fc::UTF8 + || enc == fc::VT100 // VT100 line drawing + || enc == fc::PC // CP-437 + || enc == fc::ASCII ); // Set the new Fputchar function pointer - switch ( term_encoding ) + switch ( enc ) { case fc::UTF8: Fputchar = &FTerm::putchar_UTF8; @@ -677,7 +647,7 @@ void FTerm::setEncoding (fc::encoding enc) case fc::VT100: case fc::PC: - if ( isXTerminal() && utf8_console ) + if ( isXTerminal() && data->hasUTF8Console() ) Fputchar = &FTerm::putchar_UTF8; else Fputchar = &FTerm::putchar_ASCII; @@ -691,7 +661,7 @@ void FTerm::setEncoding (fc::encoding enc) if ( isLinuxTerm() ) { - if ( term_encoding == fc::VT100 || term_encoding == fc::PC ) + if ( enc == fc::VT100 || enc == fc::PC ) { char* empty = 0; opti_move->set_tabular (empty); @@ -704,16 +674,18 @@ void FTerm::setEncoding (fc::encoding enc) //---------------------------------------------------------------------- fc::encoding FTerm::getEncoding() { - return term_encoding; + return data->getTermEncoding(); } //---------------------------------------------------------------------- std::string FTerm::getEncodingString() { - std::map::const_iterator it, end; - end = encoding_set->end(); + fc::encoding term_encoding = data->getTermEncoding(); + FTermData::encodingMap& encoding_list = data->getEncodingList(); + std::map::const_iterator it, end; + end = encoding_list.end(); - for (it = encoding_set->begin(); it != end; ++it ) + for (it = encoding_list.begin(); it != end; ++it ) if ( it->second == term_encoding ) return it->first; @@ -730,7 +702,7 @@ bool FTerm::charEncodable (uInt c) //---------------------------------------------------------------------- uInt FTerm::charEncode (uInt c) { - return charEncode (c, term_encoding); + return charEncode (c, data->getTermEncoding()); } //---------------------------------------------------------------------- @@ -866,8 +838,8 @@ void FTerm::initScreenSettings() // Important: Do not use setNewFont() or setVGAFont() after // the console character mapping has been initialized linux->initCharMap (fc::character); - shadow_character = linux->hasShadowCharacter(); - half_block_character = linux->hasHalfBlockCharacter(); + data->supportShadowCharacter (linux->hasShadowCharacter()); + data->supportHalfBlockCharacter (linux->hasHalfBlockCharacter()); #endif #if defined(__FreeBSD__) || defined(__DragonFly__) @@ -889,14 +861,8 @@ char* FTerm::changeAttribute ( charData*& term_attr } //---------------------------------------------------------------------- -void FTerm::exitWithMessage (std::string message) +void FTerm::exitWithMessage (const FString& message) { - // Set the exit_message for the atexit-handler - snprintf ( exit_message - , sizeof(exit_message) - , "%s" - , message.c_str() ); - // Exit the programm if ( init_term_object ) init_term_object->finish(); @@ -904,8 +870,8 @@ void FTerm::exitWithMessage (std::string message) std::fflush (stderr); std::fflush (stdout); - if ( exit_message[0] ) - std::fprintf (stderr, "Warning: %s\n", exit_message); + if ( ! message.isEmpty() ) + std::cerr << "Warning: " << message << std::endl; std::exit (EXIT_FAILURE); } @@ -913,41 +879,35 @@ void FTerm::exitWithMessage (std::string message) // private methods of FTerm //---------------------------------------------------------------------- -void FTerm::init_global_values() +void FTerm::init_global_values (bool disable_alt_screen) { // Initialize global values - // Teletype (tty) file descriptor is still undefined - fd_tty = -1; - - // Preset to true - shadow_character = \ - half_block_character = \ - cursor_optimisation = true; - // Preset to false - hidden_cursor = \ - utf8_console = \ - utf8_state = \ - utf8_linux_terminal = \ - pc_charset_console = \ - vt100_console = \ - NewFont = \ - VGAFont = \ - ascii_console = \ - force_vt100 = false; + data->setNewFont(false); - // Init arrays with '\0' - std::fill_n (exit_message, sizeof(exit_message), '\0'); + // Sets alternative screen usage + data->useAlternateScreen(! disable_alt_screen); // Initialize xterm object - xterm->setTermcapMap(tcap); xterm->setFTermDetection(term_detection); if ( ! init_values.terminal_detection ) term_detection->setTerminalDetection (false); } +//---------------------------------------------------------------------- +void FTerm::init_terminal_device_path() +{ + char termfilename[256] = { }; + int stdout_no = FTermios::getStdOut(); + + if ( ttyname_r(stdout_no, termfilename, sizeof(termfilename)) ) + termfilename[0] = '\0'; + + data->setTermFileName(termfilename); +} + //---------------------------------------------------------------------- void FTerm::oscPrefix() { @@ -978,6 +938,8 @@ void FTerm::init_alt_charset() { // Read the used VT100 pairs + std::map vt100_alt_char; + if ( TCAP(fc::t_acs_chars) ) { for (int n = 0; TCAP(fc::t_acs_chars)[n]; n += 2) @@ -985,7 +947,7 @@ void FTerm::init_alt_charset() // insert the VT100 key/value pairs into a map uChar p1 = uChar(TCAP(fc::t_acs_chars)[n]); uChar p2 = uChar(TCAP(fc::t_acs_chars)[n + 1]); - (*vt100_alt_char)[p1] = p2; + vt100_alt_char[p1] = p2; } } @@ -999,7 +961,7 @@ void FTerm::init_alt_charset() for (int n = 0; n <= fc::lastKeyItem; n++ ) { uChar keyChar = uChar(fc::vt100_key_to_utf8[n][vt100_key]); - uChar altChar = uChar((*vt100_alt_char)[ keyChar ]); + uChar altChar = uChar(vt100_alt_char[keyChar]); uInt utf8char = uInt(fc::vt100_key_to_utf8[n][utf8_char]); fc::encoding num = fc::NUM_OF_ENCODINGS; @@ -1010,10 +972,10 @@ void FTerm::init_alt_charset() { int item = int(std::distance(fc::character[0], p) / num); - if ( altChar ) - fc::character[item][fc::VT100] = altChar; // update alternate character set - else - fc::character[item][fc::VT100] = 0; // delete VT100 char in character + if ( altChar ) // update alternate character set + fc::character[item][fc::VT100] = altChar; + else // delete VT100 char in character + fc::character[item][fc::VT100] = 0; } } } @@ -1032,7 +994,7 @@ void FTerm::init_pc_charset() // Fallback if tcap "S2" is not found if ( ! TCAP(fc::t_enter_pc_charset_mode) ) { - if ( utf8_console ) + if ( data->hasUTF8Console() ) { // Select iso8859-1 + null mapping TCAP(fc::t_enter_pc_charset_mode) = \ @@ -1053,7 +1015,7 @@ void FTerm::init_pc_charset() // Fallback if tcap "S3" is not found if ( ! TCAP(fc::t_exit_pc_charset_mode) ) { - if ( utf8_console ) + if ( data->hasUTF8Console() ) { // Select ascii mapping + utf8 TCAP(fc::t_exit_pc_charset_mode) = \ @@ -1150,9 +1112,10 @@ void FTerm::init_termcap() bool color256 = term_detection->canDisplay256Colors(); // Share the terminal capabilities - FTermcap().setTermcapMap(tcap); + tcap = FTermcap::getTermcapMap(); // Open termcap file + const char* termtype = data->getTermType(); terminals.push_back(termtype); // available terminal type if ( color256 ) // 1st fallback if not found @@ -1165,8 +1128,7 @@ void FTerm::init_termcap() while ( iter != terminals.end() ) { - // Copy c-string + terminating null-character ('\0') - std::strncpy (termtype, iter->c_str(), iter->length() + 1); + data->setTermType(iter->c_str()); // Open the termcap file + load entry for termtype status = tgetent(term_buffer, termtype); @@ -1193,6 +1155,7 @@ void FTerm::init_termcap_error (int status) if ( status == no_entry || status == uninitialized ) { + const char* termtype = data->getTermType(); std::cerr << "Unknown terminal: " << termtype << "\n" << "Check the TERM environment variable\n" << "Also make sure that the terminal\n" @@ -1220,9 +1183,8 @@ void FTerm::init_termcap_variables (char*& buffer) // Terminal quirks FTermcapQuirks quirks; - quirks.setTermcapMap (tcap); + quirks.setTermData (data); quirks.setFTermDetection (term_detection); - quirks.setTerminalType (termtype); quirks.terminalFixup(); // Fix terminal quirks // Get termcap keys @@ -1276,9 +1238,9 @@ void FTerm::init_termcap_numerics() FTermcap::max_color = 1; if ( getMaxColor() < 8 ) - monochron = true; + data->setMonochron(true); else - monochron = false; + data->setMonochron(false); // Get initial spacing for hardware tab stop FTermcap::tabstop = tgetnum(C_STR("it")); @@ -1493,6 +1455,10 @@ void FTerm::init_font() void FTerm::init_locale() { // Init current locale + + char* locale_name; + char* locale_xterm; + const char* termtype = data->getTermType(); locale_name = std::setlocale (LC_ALL, ""); locale_name = std::setlocale (LC_NUMERIC, ""); @@ -1542,6 +1508,7 @@ void FTerm::init_encoding() { // detect encoding and set the Fputchar function pointer + bool force_vt100 = false; // VT100 line drawing (G1 character set) init_encoding_set(); if ( isRxvtTerminal() && ! isUrxvtTerminal() ) @@ -1551,7 +1518,9 @@ void FTerm::init_encoding() init_pc_charset(); init_individual_term_encoding(); - if ( ! init_force_vt100_encoding() ) + if ( force_vt100 ) + init_force_vt100_encoding(); + else init_utf8_without_alt_charset(); init_tab_quirks(); @@ -1567,25 +1536,28 @@ inline void FTerm::init_encoding_set() { // Define the encoding set - (*encoding_set)["UTF8"] = fc::UTF8; - (*encoding_set)["UTF-8"] = fc::UTF8; - (*encoding_set)["VT100"] = fc::VT100; // VT100 line drawing - (*encoding_set)["PC"] = fc::PC; // CP-437 - (*encoding_set)["ASCII"] = fc::ASCII; + FTermData::encodingMap& encoding_list = data->getEncodingList(); + + encoding_list["UTF8"] = fc::UTF8; + encoding_list["UTF-8"] = fc::UTF8; + encoding_list["VT100"] = fc::VT100; // VT100 line drawing + encoding_list["PC"] = fc::PC; // CP-437 + encoding_list["ASCII"] = fc::ASCII; } //---------------------------------------------------------------------- void FTerm::init_term_encoding() { int stdout_no = FTermios::getStdOut(); + const char* termtype = data->getTermType(); if ( isatty(stdout_no) && ! std::strcmp(nl_langinfo(CODESET), "UTF-8") ) { - utf8_console = true; - term_encoding = fc::UTF8; - Fputchar = &FTerm::putchar_UTF8; // function pointer - utf8_state = true; + data->setUTF8Console(true); + data->setTermEncoding (fc::UTF8); + Fputchar = &FTerm::putchar_UTF8; // function pointer + data->setUTF8(true); setUTF8(true); keyboard->enableUTF8(); } @@ -1593,15 +1565,15 @@ void FTerm::init_term_encoding() && (std::strlen(termtype) > 0) && (TCAP(fc::t_exit_alt_charset_mode) != 0) ) { - vt100_console = true; - term_encoding = fc::VT100; - Fputchar = &FTerm::putchar_ASCII; // function pointer + data->setVT100Console (true); + data->setTermEncoding (fc::VT100); + Fputchar = &FTerm::putchar_ASCII; // function pointer } else { - ascii_console = true; - term_encoding = fc::ASCII; - Fputchar = &FTerm::putchar_ASCII; // function pointer + data->setASCIIConsole (true); + data->setTermEncoding (fc::ASCII); + Fputchar = &FTerm::putchar_ASCII; // function pointer } } @@ -1611,12 +1583,11 @@ void FTerm::init_individual_term_encoding() if ( isLinuxTerm() || isCygwinTerminal() || isNewFont() - || (isPuttyTerminal() && ! isUTF8()) - || (isTeraTerm() && ! isUTF8()) ) + || (isPuttyTerminal() && ! data->isUTF8()) + || (isTeraTerm() && ! data->isUTF8()) ) { - pc_charset_console = true; - term_encoding = fc::PC; - Fputchar = &FTerm::putchar_ASCII; // function pointer + data->setTermEncoding (fc::PC); + Fputchar = &FTerm::putchar_ASCII; // function pointer if ( hasUTF8() ) { @@ -1629,16 +1600,11 @@ void FTerm::init_individual_term_encoding() } //---------------------------------------------------------------------- -bool FTerm::init_force_vt100_encoding() +void FTerm::init_force_vt100_encoding() { - if ( force_vt100 ) // Force VT100 line drawing - { - vt100_console = true; - term_encoding = fc::VT100; - Fputchar = &FTerm::putchar_ASCII; // function pointer - } - - return force_vt100; + data->setVT100Console(true); + data->setTermEncoding (fc::VT100); + Fputchar = &FTerm::putchar_ASCII; // function pointer } //---------------------------------------------------------------------- @@ -1647,12 +1613,12 @@ void FTerm::init_utf8_without_alt_charset() // Fall back to ascii for utf-8 terminals that // do not support VT100 line drawings - if ( FTermcap::no_utf8_acs_chars && isUTF8() - && term_encoding == fc::VT100 ) + if ( FTermcap::no_utf8_acs_chars && data->isUTF8() + && data->getTermEncoding() == fc::VT100 ) { - ascii_console = true; - term_encoding = fc::ASCII; - Fputchar = &FTerm::putchar_ASCII; // function pointer + data->setASCIIConsole(true); + data->setTermEncoding (fc::ASCII); + Fputchar = &FTerm::putchar_ASCII; // function pointer } } @@ -1663,7 +1629,9 @@ void FTerm::init_tab_quirks() // on the terminal and does not move the cursor to the next tab stop // position - if ( term_encoding == fc::VT100 || term_encoding == fc::PC ) + fc::encoding enc = data->getTermEncoding(); + + if ( enc == fc::VT100 || enc == fc::PC ) { char* empty = 0; opti_move->set_tabular (empty); @@ -1680,10 +1648,10 @@ void FTerm::init_captureFontAndTitle() const FString* title = xterm->getTitle(); if ( font ) - save_xterm_font = new FString(*font); + data->setXtermFont(*font); if ( title ) - save_xterm_title = new FString(*title); + data->setXtermTitle(*title); } //---------------------------------------------------------------------- @@ -1741,13 +1709,15 @@ void FTerm::setInsertCursorStyle() #if defined(__linux__) char* cstyle; - cstyle = linux->setCursorStyle (fc::underscore_cursor, isCursorHidden()); + cstyle = linux->setCursorStyle ( fc::underscore_cursor + , data->isCursorHidden() ); putstring (cstyle); std::fflush(stdout); #endif #if defined(__FreeBSD__) || defined(__DragonFly__) - freebsd->setCursorStyle (fc::destructive_cursor, isCursorHidden()); + freebsd->setCursorStyle ( fc::destructive_cursor + , data->isCursorHidden() ); #endif if ( isUrxvtTerminal() ) @@ -1762,13 +1732,15 @@ void FTerm::setOverwriteCursorStyle() #if defined(__linux__) char* cstyle; - cstyle = linux->setCursorStyle (fc::full_block_cursor, isCursorHidden()); + cstyle = linux->setCursorStyle ( fc::full_block_cursor + , data->isCursorHidden() ); putstring (cstyle); std::fflush(stdout); #endif #if defined(__FreeBSD__) || defined(__DragonFly__) - freebsd->setCursorStyle (fc::normal_cursor, isCursorHidden()); + freebsd->setCursorStyle ( fc::normal_cursor + , data->isCursorHidden() ); #endif if ( isUrxvtTerminal() ) @@ -1814,7 +1786,7 @@ void FTerm::disableMouse() //---------------------------------------------------------------------- void FTerm::useAlternateScreenBuffer() { - if ( ! use_alternate_screen ) + if ( ! hasAlternateScreen() ) return; // Save current cursor position @@ -1835,7 +1807,7 @@ void FTerm::useAlternateScreenBuffer() //---------------------------------------------------------------------- void FTerm::useNormalScreenBuffer() { - if ( ! use_alternate_screen ) + if ( ! hasAlternateScreen() ) return; // restores the screen and the cursor position @@ -1858,10 +1830,13 @@ inline void FTerm::allocationValues() { try { + data = new FTermData(); opti_move = new FOptiMove(); opti_attr = new FOptiAttr(); term_detection = new FTermDetection(); xterm = new FTermXTerminal(); + keyboard = new FKeyboard(); + mouse = new FMouseControl(); #if defined(__linux__) linux = new FTermLinux(); @@ -1874,12 +1849,6 @@ inline void FTerm::allocationValues() #if defined(__NetBSD__) || defined(__OpenBSD__) openbsd = new FTermOpenBSD(); #endif - - keyboard = new FKeyboard(); - mouse = new FMouseControl(); - term = new FRect(0, 0, 0, 0); - vt100_alt_char = new std::map; - encoding_set = new std::map; } catch (const std::bad_alloc& ex) { @@ -1891,26 +1860,6 @@ inline void FTerm::allocationValues() //---------------------------------------------------------------------- inline void FTerm::deallocationValues() { - if ( encoding_set ) - delete encoding_set; - - if ( vt100_alt_char ) - delete vt100_alt_char; - - if ( save_xterm_title ) - delete save_xterm_title; - - if ( save_xterm_font ) - delete save_xterm_font; - - if ( term ) - delete term; - - if ( mouse ) - delete mouse; - - if ( keyboard ) - delete keyboard; #if defined(__NetBSD__) || defined(__OpenBSD__) if ( openbsd ) @@ -1927,6 +1876,12 @@ inline void FTerm::deallocationValues() delete linux; #endif + if ( mouse ) + delete mouse; + + if ( keyboard ) + delete keyboard; + if ( xterm ) delete xterm; @@ -1938,39 +1893,42 @@ inline void FTerm::deallocationValues() if ( opti_move ) delete opti_move; + + if ( data ) + delete data; } //---------------------------------------------------------------------- -void FTerm::init() +void FTerm::init (bool disable_alt_screen) { int stdout_no = FTermios::getStdOut(); init_term_object = this; // Initialize global values for all objects allocationValues(); - init_global_values(); + init_global_values(disable_alt_screen); // Initialize termios FTermios::init(); // Get pathname of the terminal device - if ( ttyname_r(stdout_no, termfilename, sizeof(termfilename)) ) - termfilename[0] = '\0'; - - term_detection->setTermFileName(termfilename); + init_terminal_device_path(); + // Initialize Linux or *BSD console initOSspecifics(); // Save termios settings FTermios::storeTTYsettings(); // Get output baud rate - baudrate = FTermios::getBaudRate(); + uInt baud = FTermios::getBaudRate(); + data->setBaudrate(baud); if ( isatty(stdout_no) ) - opti_move->setBaudRate(int(baudrate)); + opti_move->setBaudRate(int(baud)); // Terminal detection + term_detection->setTermData(data); term_detection->detect(); setTermType (term_detection->getTermType()); @@ -2044,7 +2002,7 @@ void FTerm::init() setSignalHandler(); if ( ! init_values.cursor_optimisation ) - setCursorOptimisation (false); + data->supportCursorOptimisation(false); // Activate the VGA or the new graphic font // (depending on the initialization values) @@ -2068,7 +2026,7 @@ void FTerm::initOSspecifics() linux->init(); // Initialize Linux console #if DEBUG - framebuffer_bpp = linux->getFramebufferBpp(); + data->setFramebufferBpp (linux->getFramebufferBpp()); #endif #endif // defined(__linux__) @@ -2101,10 +2059,12 @@ void FTerm::initOSspecifics() void FTerm::finish() { // Set default signal handler + + const FString& title = data->getXtermTitle(); resetSignalHandler(); - if ( save_xterm_title && isXTerminal() && ! isRxvtTerminal() ) - setTermTitle (*save_xterm_title); + if ( title && isXTerminal() && ! isRxvtTerminal() ) + setTermTitle (title); // Restore the saved termios settings FTermios::restoreTTYsettings(); @@ -2166,7 +2126,7 @@ void FTerm::finish() finish_encoding(); - if ( NewFont || VGAFont ) + if ( data->isNewFont() || data->isVGAFont() ) setOldFont(); deallocationValues(); @@ -2192,7 +2152,7 @@ void FTerm::finishOSspecifics1() void FTerm::finish_encoding() { #if defined(__linux__) - if ( isLinuxTerm() && utf8_console ) + if ( isLinuxTerm() && data->hasUTF8Console() ) setUTF8(true); #endif } @@ -2244,10 +2204,13 @@ void FTerm::signal_handler (int signum) switch (signum) { case SIGWINCH: - if ( resize_term ) + if ( ! data ) break; + else if ( data->hasTermResized() ) + break; + // initialize a resize event to the root element - resize_term = true; + data->setTermResized(true); break; case SIGTERM: diff --git a/src/ftermcap.cpp b/src/ftermcap.cpp index 1b43b71d..7e0f15ce 100644 --- a/src/ftermcap.cpp +++ b/src/ftermcap.cpp @@ -1,9 +1,9 @@ /*********************************************************************** -* ftcap_map.h - Internally used termcap capabilities * +* ftermcap.cpp - Provides access to terminal capabilities * * * * This file is part of the Final Cut widget toolkit * * * -* Copyright 2015-2017 Markus Gans * +* Copyright 2015-2018 Markus Gans * * * * The Final Cut is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public License * @@ -20,22 +20,41 @@ * . * ***********************************************************************/ -#ifndef FTCAPMAP_H -#define FTCAPMAP_H - -#if !defined (USE_FINAL_H) && !defined (COMPILE_FINAL_CUT) - #error "Only can be included directly." -#endif - #include "final/ftermcap.h" namespace finalcut { -namespace fc -{ +// static class attributes +bool FTermcap::background_color_erase = false; +bool FTermcap::automatic_left_margin = false; +bool FTermcap::automatic_right_margin = false; +bool FTermcap::eat_nl_glitch = false; +bool FTermcap::ansi_default_color = false; +bool FTermcap::osc_support = false; +bool FTermcap::no_utf8_acs_chars = false; +int FTermcap::max_color = 1; +int FTermcap::tabstop = 8; +int FTermcap::attr_without_color = 0; -static FTermcap::tcap_map term_caps[] = + +//---------------------------------------------------------------------- +// class FTermcap +//---------------------------------------------------------------------- + +// constructors and destructor +//---------------------------------------------------------------------- +FTermcap::FTermcap() +{ } + +//---------------------------------------------------------------------- +FTermcap::~FTermcap() // destructor +{ } + + +// private Data Member of FTermcap - termcap capabilities +//---------------------------------------------------------------------- +FTermcap::tcap_map FTermcap::tcap[] = { // .------------- term string // | .-------- Tcap-code @@ -140,8 +159,4 @@ static FTermcap::tcap_map term_caps[] = * "XX", "Us" and "Ue" are unofficial and they are only used here. */ -} // namespace fc - } // namespace finalcut - -#endif // FTCAPMAP_H diff --git a/src/ftermcapquirks.cpp b/src/ftermcapquirks.cpp index b58b5833..18b085e5 100644 --- a/src/ftermcapquirks.cpp +++ b/src/ftermcapquirks.cpp @@ -26,8 +26,8 @@ namespace finalcut { // static class attributes -char FTermcapQuirks::termtype[256] = { }; FTermcap::tcap_map* FTermcapQuirks::tcap = 0; +FTermData* FTermcapQuirks::fterm_data = 0; FTermDetection* FTermcapQuirks::term_detection = 0; @@ -38,7 +38,9 @@ FTermDetection* FTermcapQuirks::term_detection = 0; // constructors and destructor //---------------------------------------------------------------------- FTermcapQuirks::FTermcapQuirks() -{ } +{ + tcap = FTermcap::getTermcapMap(); +} //---------------------------------------------------------------------- FTermcapQuirks::~FTermcapQuirks() // destructor @@ -47,16 +49,9 @@ FTermcapQuirks::~FTermcapQuirks() // destructor // public methods of FTermcapQuirks //---------------------------------------------------------------------- -void FTermcapQuirks::setTerminalType (const char tt[]) +void FTermcapQuirks::setTermData (FTermData* data) { - std::strncpy (termtype, tt, sizeof(termtype)); - termtype[sizeof(termtype) - 1] = '\0'; -} - -//---------------------------------------------------------------------- -void FTermcapQuirks::setTermcapMap (FTermcap::tcap_map* tc) -{ - tcap = tc; + fterm_data = data; } //---------------------------------------------------------------------- @@ -255,6 +250,8 @@ void FTermcapQuirks::init_termcap_xterm_quirks() void FTermcapQuirks::init_termcap_rxvt_quirks() { // Set enter/exit alternative charset mode for rxvt terminal + const char* termtype = fterm_data->getTermType(); + if ( std::strncmp(termtype, "rxvt-16color", 12) == 0 ) { TCAP(fc::t_enter_alt_charset_mode) = \ diff --git a/src/ftermdetection.cpp b/src/ftermdetection.cpp index 84803c26..ba728668 100644 --- a/src/ftermdetection.cpp +++ b/src/ftermdetection.cpp @@ -31,8 +31,8 @@ FTermDetection::terminalType FTermDetection::terminal_type = \ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; FTermDetection::colorEnv FTermDetection::color_env; FTermDetection::secondaryDA FTermDetection::secondary_da; +FTermData* FTermDetection::fterm_data = 0; char FTermDetection::termtype[256] = { }; -char FTermDetection::termfilename[256] = { }; char FTermDetection::ttytypename[256] = { }; bool FTermDetection::decscusr_support; bool FTermDetection::terminal_detection; @@ -89,13 +89,9 @@ FTermDetection::~FTermDetection() // destructor // public methods of FTermDetection //---------------------------------------------------------------------- -void FTermDetection::setTermFileName (char term_filename[]) +void FTermDetection::setTermData (FTermData* data) { - if ( ! term_filename ) - return; - - std::strncpy (termfilename, term_filename, sizeof(termfilename)); - termfilename[sizeof(termfilename) - 1] = '\0'; + fterm_data = data; } //---------------------------------------------------------------------- @@ -128,6 +124,7 @@ void FTermDetection::getSystemTermType() { // Import the untrusted environment variable TERM const char* const& term_env = std::getenv(C_STR("TERM")); + const char* termfilename = fterm_data->getTermFileName(); if ( term_env ) { @@ -164,6 +161,7 @@ bool FTermDetection::getTTYtype() // vt100 ttys0 // Get term basename + const char* termfilename = fterm_data->getTermFileName(); const char* term_basename = std::strrchr(termfilename, '/'); if ( term_basename == 0 ) @@ -221,6 +219,7 @@ bool FTermDetection::getTTYSFileEntry() // Analyse /etc/ttys and get the term name // get term basename + const char* termfilename = fterm_data->getTermFileName(); const char* term_basename = std::strrchr(termfilename, '/'); if ( term_basename == 0 ) diff --git a/src/ftermlinux.cpp b/src/ftermlinux.cpp index 50f95984..e802805e 100644 --- a/src/ftermlinux.cpp +++ b/src/ftermlinux.cpp @@ -38,8 +38,8 @@ namespace finalcut console_font_op FTermLinux::screen_font; unimapdesc FTermLinux::screen_unicode_map; - bool FTermLinux::NewFont; - bool FTermLinux::VGAFont; + bool FTermLinux::new_font; + bool FTermLinux::vga_font; bool FTermLinux::shadow_character = true; bool FTermLinux::half_block_character = true; bool FTermLinux::has_saved_palette = false; @@ -194,7 +194,7 @@ void FTermLinux::initCharMap (uInt char_map[][fc::NUM_OF_ENCODINGS]) { uInt c1, c2, c3, c4, c5; - if ( NewFont || VGAFont ) + if ( new_font || vga_font ) return; if ( screen_unicode_map.entry_ct != 0 ) @@ -255,7 +255,7 @@ void FTermLinux::finish() //---------------------------------------------------------------------- bool FTermLinux::loadVGAFont() { - VGAFont = true; + vga_font = true; if ( FTerm::openConsole() == 0 ) { @@ -265,7 +265,7 @@ bool FTermLinux::loadVGAFont() int ret = setScreenFont(fc::__8x16std, 256, 8, 16); if ( ret != 0 ) - VGAFont = false; + vga_font = false; // unicode character mapping struct unimapdesc unimap; @@ -275,24 +275,24 @@ bool FTermLinux::loadVGAFont() setUnicodeMap(&unimap); } else - VGAFont = false; + vga_font = false; FTerm::detectTermSize(); FTerm::closeConsole(); } else - VGAFont = false; + vga_font = false; - if ( VGAFont ) + if ( vga_font ) shadow_character = half_block_character = true; - return VGAFont; + return vga_font; } //---------------------------------------------------------------------- bool FTermLinux::loadNewFont() { - NewFont = true; + new_font = true; if ( FTerm::openConsole() == 0 ) { @@ -302,7 +302,7 @@ bool FTermLinux::loadNewFont() int ret = setScreenFont(fc::__8x16graph, 256, 8, 16); if ( ret != 0 ) - NewFont = false; + new_font = false; // unicode character mapping struct unimapdesc unimap; @@ -312,18 +312,18 @@ bool FTermLinux::loadNewFont() setUnicodeMap(&unimap); } else - NewFont = false; + new_font = false; FTerm::detectTermSize(); FTerm::closeConsole(); } else - NewFont = false; + new_font = false; - if ( VGAFont ) + if ( vga_font ) shadow_character = half_block_character = true; - return NewFont; + return new_font; } //---------------------------------------------------------------------- @@ -363,7 +363,7 @@ bool FTermLinux::loadOldFont (uInt char_map[][fc::NUM_OF_ENCODINGS]) } if ( retval ) - VGAFont = NewFont = false; + vga_font = new_font = false; return retval; } diff --git a/src/ftermxterminal.cpp b/src/ftermxterminal.cpp index 0b4d07e9..7cfb1517 100644 --- a/src/ftermxterminal.cpp +++ b/src/ftermxterminal.cpp @@ -31,9 +31,8 @@ namespace finalcut bool FTermXTerminal::mouse_support; bool FTermXTerminal::meta_sends_esc; bool FTermXTerminal::xterm_default_colors; -FTermcap::tcap_map* FTermXTerminal::tcap = 0; -FTermDetection* FTermXTerminal::term_detection = 0; -fc::xtermCursorStyle FTermXTerminal::cursor_style = fc::unknown_cursor_style; +int FTermXTerminal::term_width = 80; +int FTermXTerminal::term_height = 24; const FString* FTermXTerminal::xterm_font = 0; const FString* FTermXTerminal::xterm_title = 0; const FString* FTermXTerminal::foreground_color = 0; @@ -42,6 +41,9 @@ const FString* FTermXTerminal::cursor_color = 0; const FString* FTermXTerminal::mouse_foreground_color = 0; const FString* FTermXTerminal::mouse_background_color = 0; const FString* FTermXTerminal::highlight_background_color = 0; +FTermcap::tcap_map* FTermXTerminal::tcap = 0; +FTermDetection* FTermXTerminal::term_detection = 0; +fc::xtermCursorStyle FTermXTerminal::cursor_style = fc::unknown_cursor_style; //---------------------------------------------------------------------- @@ -56,6 +58,8 @@ FTermXTerminal::FTermXTerminal() mouse_support = \ meta_sends_esc = \ xterm_default_colors = false; + + tcap = FTermcap::getTermcapMap(); } //---------------------------------------------------------------------- @@ -121,6 +125,16 @@ void FTermXTerminal::setTitle (const FString& title) setXTermTitle(); } +//---------------------------------------------------------------------- +void FTermXTerminal::setTermSize (int width, int height) +{ + // Set xterm size to {term_width} x {term_height} + + term_width = width; + term_height = height; + setXTermSize(); +} + //---------------------------------------------------------------------- void FTermXTerminal::setForeground (const FString& fg) { @@ -398,6 +412,16 @@ void FTermXTerminal::setXTermTitle() } } +//---------------------------------------------------------------------- +void FTermXTerminal::setXTermSize() +{ + if ( term_detection->isXTerminal() ) + { + FTerm::putstringf (CSI "8;%d;%dt", term_height, term_width); + std::fflush(stdout); + } +} + //---------------------------------------------------------------------- void FTermXTerminal::setXTermFont() { diff --git a/src/fvterm.cpp b/src/fvterm.cpp index 6e2c09bc..0cba59ba 100644 --- a/src/fvterm.cpp +++ b/src/fvterm.cpp @@ -51,8 +51,7 @@ FPoint* FVTerm::term_pos = 0; FVTerm::term_area* FVTerm::vterm = 0; FVTerm::term_area* FVTerm::vdesktop = 0; FVTerm::term_area* FVTerm::active_area = 0; -FVTerm::termcap_map* FVTerm::tcap = 0; -FTermcap::tcap_map* FTermcap::tcap = 0; +FTermcap::tcap_map* FVTerm::tcap = 0; FKeyboard* FVTerm::keyboard = 0; FVTerm::charData FVTerm::term_attribute; FVTerm::charData FVTerm::next_attribute; @@ -2099,7 +2098,7 @@ void FVTerm::init() std::memcpy (&next_attribute, &term_attribute, sizeof(charData)); // Receive the terminal capabilities - tcap = FTermcap().getTermcapMap(); + tcap = FTermcap::getTermcapMap(); // Create virtual terminal FRect term_geometry (0, 0, getColumnNumber(), getLineNumber()); diff --git a/src/fwidget.cpp b/src/fwidget.cpp index 040f1134..8c6c563f 100644 --- a/src/fwidget.cpp +++ b/src/fwidget.cpp @@ -361,7 +361,7 @@ bool FWidget::setEnable (bool on) else flags &= ~fc::active; - return enable = ( on ) ? true : false; + return enable = on; } //---------------------------------------------------------------------- @@ -414,7 +414,7 @@ bool FWidget::setFocus (bool on) window->setWindowFocusWidget(this); } - return focus = ( on ) ? true : false; + return focus = on; } //---------------------------------------------------------------------- diff --git a/src/fwindow.cpp b/src/fwindow.cpp index f59decf1..ec501bd5 100644 --- a/src/fwindow.cpp +++ b/src/fwindow.cpp @@ -174,7 +174,7 @@ bool FWindow::activateWindow (bool on) active_area = getVWin(); } - return window_active = ( on ) ? true : false; + return window_active = on; } //---------------------------------------------------------------------- diff --git a/src/include/final/fc.h b/src/include/final/fc.h index 626ed874..9613c1f8 100644 --- a/src/include/final/fc.h +++ b/src/include/final/fc.h @@ -79,7 +79,7 @@ enum events Timer_Event // timer event occur }; -// Properties of a widget +// Properties of a widget ⚑ enum widget_flags { shadow = 0x00000001, diff --git a/src/include/final/fdialog.h b/src/include/final/fdialog.h index f1c924f0..edcd32f4 100644 --- a/src/include/final/fdialog.h +++ b/src/include/final/fdialog.h @@ -207,6 +207,7 @@ class FDialog : public FWindow void moveSizeKey (FKeyEvent*); void raiseActivateDialog(); void lowerActivateDialog(); + bool isLowerRightResizeCorner (mouseStates&); void resizeMouseDown (mouseStates&); void resizeMouseUpMove (mouseStates&, bool = false); void cancelMouseResize(); diff --git a/src/include/final/fkeyboard.h b/src/include/final/fkeyboard.h index 495752ec..85fd5eb0 100644 --- a/src/include/final/fkeyboard.h +++ b/src/include/final/fkeyboard.h @@ -177,7 +177,7 @@ class FKeyboard FKeyboardCommand escape_key_cmd; static timeval time_keypressed; - fc::fkeymap* termcap_map; + fc::fkeymap* key_map; #if defined(__linux__) #undef linux diff --git a/src/include/final/flistview.h b/src/include/final/flistview.h index 5fdf3c40..e3f506d5 100644 --- a/src/include/final/flistview.h +++ b/src/include/final/flistview.h @@ -355,6 +355,7 @@ class FListView : public FWidget void drawColumnEllipsis ( headerItems::const_iterator& , const FString& ); void updateDrawing (bool, bool); + int determineLineWidth (FListViewItem* item); void recalculateHorizontalBar (int); void recalculateVerticalBar (int); void wheelUp (int); @@ -473,7 +474,7 @@ inline void FListView::setUserDescendingCompare (Compare cmp) //---------------------------------------------------------------------- inline bool FListView::setTreeView (bool on) -{ return tree_view = ( on ) ? true : false; } +{ return tree_view = on; } //---------------------------------------------------------------------- inline bool FListView::setTreeView() diff --git a/src/include/final/fterm.h b/src/include/final/fterm.h index 09a7b7d9..e7e2ef55 100644 --- a/src/include/final/fterm.h +++ b/src/include/final/fterm.h @@ -139,7 +139,6 @@ #include "final/fkey_map.h" #include "final/fkeyboard.h" #include "final/fmouse.h" -#include "final/fobject.h" #include "final/foptiattr.h" #include "final/foptimove.h" #include "final/fpoint.h" @@ -147,6 +146,7 @@ #include "final/fstring.h" #include "final/ftermcap.h" #include "final/ftermcapquirks.h" +#include "final/ftermdata.h" #include "final/ftermdetection.h" #if defined(__linux__) @@ -187,147 +187,138 @@ class FTerm virtual ~FTerm(); // Accessors - virtual const char* getClassName() const; - static FKeyboard* getKeyboard(); - static FMouseControl* getMouseControl(); - static int getLineNumber(); - static int getColumnNumber(); - static const FString getKeyName (int); + virtual const char* getClassName() const; + static FKeyboard* getKeyboard(); + static FMouseControl* getMouseControl(); + static int getLineNumber(); + static int getColumnNumber(); + static const FString getKeyName (int); - static int getTTYFileDescriptor(); - static char* getTermType(); - static char* getTermFileName(); - static int getTabstop(); - static int getMaxColor(); + static int getTTYFileDescriptor(); + static char* getTermType(); + static char* getTermFileName(); + static int getTabstop(); + static int getMaxColor(); #if DEBUG - static const FString& getAnswerbackString(); - static const FString& getSecDAString(); - static const char* getTermType_256color(); - static const char* getTermType_Answerback(); - static const char* getTermType_SecDA(); - static int getFramebufferBpp(); + static const FString& getAnswerbackString(); + static const FString& getSecDAString(); + static const char* getTermType_256color(); + static const char* getTermType_Answerback(); + static const char* getTermType_SecDA(); + static int getFramebufferBpp(); #endif // DEBUG // Inquiries - static bool isCursorHidden(); - static bool isNormal (charData*&); - static bool isRaw(); - static bool hasPCcharset(); - static bool hasUTF8(); - static bool hasVT100(); - static bool hasASCII(); - static bool isMonochron(); - static bool isXTerminal(); - static bool isAnsiTerminal(); - static bool isRxvtTerminal(); - static bool isUrxvtTerminal(); - static bool isMltermTerminal(); - static bool isPuttyTerminal(); - static bool isKdeTerminal(); - static bool isGnomeTerminal(); - static bool isKtermTerminal(); - static bool isTeraTerm(); - static bool isSunTerminal(); - static bool isCygwinTerminal(); - static bool isMinttyTerm(); - static bool isLinuxTerm(); - static bool isFreeBSDTerm(); - static bool isNetBSDTerm(); - static bool isOpenBSDTerm(); - static bool isScreenTerm(); - static bool isTmuxTerm(); - static bool isNewFont(); - static bool isUTF8(); + static bool isNormal (charData*&); + static bool isRaw(); + static bool hasUTF8(); + static bool hasVT100(); + static bool hasASCII(); + static bool isMonochron(); + static bool isXTerminal(); + static bool isAnsiTerminal(); + static bool isRxvtTerminal(); + static bool isUrxvtTerminal(); + static bool isMltermTerminal(); + static bool isPuttyTerminal(); + static bool isKdeTerminal(); + static bool isGnomeTerminal(); + static bool isKtermTerminal(); + static bool isTeraTerm(); + static bool isSunTerminal(); + static bool isCygwinTerminal(); + static bool isMinttyTerm(); + static bool isLinuxTerm(); + static bool isFreeBSDTerm(); + static bool isNetBSDTerm(); + static bool isOpenBSDTerm(); + static bool isScreenTerm(); + static bool isTmuxTerm(); + static bool isNewFont(); // Mutators - static void setTermType (const char[]); - static void setInsertCursor (bool on); - static void setInsertCursor(); - static void unsetInsertCursor(); - static bool setCursorOptimisation (bool); - static void redefineDefaultColors (bool); - static void setDblclickInterval (const long); - static void disableAltScreen(); - static bool setUTF8 (bool); - static bool setUTF8(); - static bool unsetUTF8(); + static void setTermType (const char[]); + static void setInsertCursor (bool on); + static void setInsertCursor(); + static void unsetInsertCursor(); + static void redefineDefaultColors (bool); + static void setDblclickInterval (const long); + static bool setUTF8 (bool); + static bool setUTF8(); + static bool unsetUTF8(); // Methods - static bool setVGAFont(); - static bool setNewFont(); - static bool setOldFont(); - static int openConsole(); - static int closeConsole(); - static char* moveCursor (int, int, int, int); - static char* cursorsVisibility (bool); - static void printMoveDurations(); - static char* enableCursor(); - static char* disableCursor(); - static void detectTermSize(); - static void setTermSize (int, int); - static void setTermTitle(const FString&); - static void setKDECursor (fc::kdeKonsoleCursorShape); - static void saveColorMap(); - static void resetColorMap(); - static void setPalette (short, int, int, int); - static void setBeep (int, int); - static void resetBeep(); - static void beep(); + static bool setVGAFont(); + static bool setNewFont(); + static bool setOldFont(); + static int openConsole(); + static int closeConsole(); + static char* moveCursor (int, int, int, int); + static char* cursorsVisibility (bool); + static void printMoveDurations(); + static char* enableCursor(); + static char* disableCursor(); + static void detectTermSize(); + static void setTermSize (int, int); + static void setTermTitle(const FString&); + static void setKDECursor (fc::kdeKonsoleCursorShape); + static void saveColorMap(); + static void resetColorMap(); + static void setPalette (short, int, int, int); + static void setBeep (int, int); + static void resetBeep(); + static void beep(); - static void setEncoding (fc::encoding); - static fc::encoding getEncoding(); - static std::string getEncodingString(); - static bool charEncodable (uInt); - static uInt charEncode (uInt); - static uInt charEncode (uInt, fc::encoding); + static void setEncoding (fc::encoding); + static fc::encoding getEncoding(); + static std::string getEncodingString(); + static bool charEncodable (uInt); + static uInt charEncode (uInt); + static uInt charEncode (uInt, fc::encoding); - static bool scrollTermForward(); - static bool scrollTermReverse(); + static bool scrollTermForward(); + static bool scrollTermReverse(); // function pointer -> static function - static int (*Fputchar)(int); + static int (*Fputchar)(int); - static void putstringf (const char[], ...) + static void putstringf (const char[], ...) #if defined(__clang__) __attribute__((__format__ (__printf__, 1, 2))) #elif defined(__GNUC__) __attribute__ ((format (printf, 1, 2))) #endif - ; - static void putstring (const char[], int = 1); + ; + static void putstring (const char[], int = 1); #if defined(__sun) && defined(__SVR4) - static int putchar_ASCII (char); + static int putchar_ASCII (char); #endif - static int putchar_ASCII (int); - static int putchar_UTF8 (int); - -#if DEBUG - static int framebuffer_bpp; -#endif + static int putchar_ASCII (int); + static int putchar_UTF8 (int); protected: // Inquiries - static bool hasChangedTermSize(); - static bool hasShadowCharacter(); - static bool hasHalfBlockCharacter(); - static bool hasAlternateScreen(); + static bool hasChangedTermSize(); + static bool hasShadowCharacter(); + static bool hasHalfBlockCharacter(); + static bool hasAlternateScreen(); // Accessors - FOptiMove* getFOptiMove(); + FOptiMove* getFOptiMove(); // Methods - static void initScreenSettings(); - static char* changeAttribute ( charData*& - , charData*& ); - static void changeTermSizeFinished(); - static void exitWithMessage (std::string) + static void initScreenSettings(); + static char* changeAttribute ( charData*& + , charData*& ); + static void changeTermSizeFinished(); + static void exitWithMessage (const FString&) #if defined(__clang__) || defined(__GNUC__) __attribute__((noreturn)) #endif - ; + ; // Data Members static struct initializationValues { @@ -374,107 +365,70 @@ class FTerm } init_values; private: - // Typedefs - typedef FTermcap::tcap_map termcap_map; - // Disable copy constructor FTerm (const FTerm&); // Disable assignment operator (=) FTerm& operator = (const FTerm&); // Methods - static void init_global_values(); - static void oscPrefix(); - static void oscPostfix(); - static void init_alt_charset(); - static void init_pc_charset(); - static void init_cygwin_charmap(); - static void init_teraterm_charmap(); - static void init_fixed_max_color(); - static void init_keyboard(); - static void init_termcap(); - static void init_termcap_error (int); - static void init_termcap_variables(char*&); - static void init_termcap_booleans(); - static void init_termcap_numerics(); - static void init_termcap_strings (char*&); - static void init_termcap_keys (char*&); - static void init_OptiMove(); - static void init_OptiAttr(); - static void init_font(); - static void init_locale(); - static void init_encoding(); - static void init_encoding_set(); - static void init_term_encoding(); - static void init_individual_term_encoding(); - static bool init_force_vt100_encoding(); - static void init_utf8_without_alt_charset(); - static void init_tab_quirks(); - static void init_captureFontAndTitle(); - static void redefineColorPalette(); - static void restoreColorPalette(); - static void setInsertCursorStyle(); - static void setOverwriteCursorStyle(); - static void enableMouse(); - static void disableMouse(); - static void useAlternateScreenBuffer(); - static void useNormalScreenBuffer(); - void allocationValues(); - void deallocationValues(); - void init(); - void initOSspecifics(); - void finish(); - void finishOSspecifics1(); - void finish_encoding(); - static uInt cp437_to_unicode (uChar); - static void setSignalHandler(); - static void resetSignalHandler(); - static void signal_handler (int); + static void init_global_values (bool); + static void init_terminal_device_path(); + static void oscPrefix(); + static void oscPostfix(); + static void init_alt_charset(); + static void init_pc_charset(); + static void init_cygwin_charmap(); + static void init_teraterm_charmap(); + static void init_fixed_max_color(); + static void init_keyboard(); + static void init_termcap(); + static void init_termcap_error (int); + static void init_termcap_variables(char*&); + static void init_termcap_booleans(); + static void init_termcap_numerics(); + static void init_termcap_strings (char*&); + static void init_termcap_keys (char*&); + static void init_OptiMove(); + static void init_OptiAttr(); + static void init_font(); + static void init_locale(); + static void init_encoding(); + static void init_encoding_set(); + static void init_term_encoding(); + static void init_individual_term_encoding(); + static void init_force_vt100_encoding(); + static void init_utf8_without_alt_charset(); + static void init_tab_quirks(); + static void init_captureFontAndTitle(); + static void redefineColorPalette(); + static void restoreColorPalette(); + static void setInsertCursorStyle(); + static void setOverwriteCursorStyle(); + static void enableMouse(); + static void disableMouse(); + static void useAlternateScreenBuffer(); + static void useNormalScreenBuffer(); + void allocationValues(); + void deallocationValues(); + void init (bool); + void initOSspecifics(); + void finish(); + void finishOSspecifics1(); + void finish_encoding(); + static uInt cp437_to_unicode (uChar); + static void setSignalHandler(); + static void resetSignalHandler(); + static void signal_handler (int); // Data Members - static std::map * vt100_alt_char; - static std::map * encoding_set; + static FTermData* data; static FTermcap::tcap_map* tcap; - static fc::encoding term_encoding; - - static bool shadow_character; - static bool half_block_character; - static bool cursor_optimisation; - static bool hidden_cursor; - static bool use_alternate_screen; - static bool pc_charset_console; - static bool utf8_state; - static bool utf8_console; - static bool utf8_linux_terminal; - static bool force_vt100; - static bool vt100_console; - static bool ascii_console; - static bool NewFont; - static bool VGAFont; - static bool monochron; - static char termtype[256]; - static char termfilename[256]; - static char exit_message[8192]; - static char* locale_name; - static char* locale_xterm; - static FRect* term; // current terminal geometry - - static int fd_tty; - static uInt baudrate; - static bool resize_term; - - static fc::linuxConsoleCursorStyle \ - linux_console_cursor_style; - static struct console_font_op \ - screen_font; - static struct unimapdesc \ - screen_unicode_map; - static FOptiMove* opti_move; static FOptiAttr* opti_attr; static FTermDetection* term_detection; static FTermXTerminal* xterm; static FKeyboard* keyboard; + static FMouseControl* mouse; #if defined(__linux__) #undef linux @@ -488,10 +442,6 @@ class FTerm #if defined(__NetBSD__) || defined(__OpenBSD__) static FTermOpenBSD* openbsd; #endif - - static FMouseControl* mouse; - static const FString* save_xterm_font; - static const FString* save_xterm_title; }; #pragma pack(pop) @@ -511,15 +461,15 @@ inline FMouseControl* FTerm::getMouseControl() //---------------------------------------------------------------------- inline int FTerm::getTTYFileDescriptor() -{ return fd_tty; } +{ return data->getTTYFileDescriptor(); } //---------------------------------------------------------------------- inline char* FTerm::getTermType() -{ return termtype; } +{ return data->getTermType(); } //---------------------------------------------------------------------- inline char* FTerm::getTermFileName() -{ return termfilename; } +{ return data->getTermFileName(); } //---------------------------------------------------------------------- inline int FTerm::getTabstop() @@ -552,32 +502,16 @@ inline const char* FTerm::getTermType_SecDA() //---------------------------------------------------------------------- inline int FTerm::getFramebufferBpp() -{ return framebuffer_bpp; } +{ return data->getFramebufferBpp(); } #endif // DEBUG -//---------------------------------------------------------------------- -inline bool FTerm::isCursorHidden() -{ return hidden_cursor; } - -//---------------------------------------------------------------------- -inline bool FTerm::hasPCcharset() -{ return pc_charset_console; } - //---------------------------------------------------------------------- inline bool FTerm::hasUTF8() -{ return utf8_console; } - -//---------------------------------------------------------------------- -inline bool FTerm::hasVT100() -{ return vt100_console; } - -//---------------------------------------------------------------------- -inline bool FTerm::hasASCII() -{ return ascii_console; } +{ return data->hasUTF8Console(); } //---------------------------------------------------------------------- inline bool FTerm::isMonochron() -{ return monochron; } +{ return data->isMonochron(); } //---------------------------------------------------------------------- inline bool FTerm::isXTerminal() @@ -657,11 +591,7 @@ inline bool FTerm::isTmuxTerm() //---------------------------------------------------------------------- inline bool FTerm::isNewFont() -{ return NewFont; } - -//---------------------------------------------------------------------- -inline bool FTerm::isUTF8() -{ return utf8_state; } +{ return data->isNewFont(); } //---------------------------------------------------------------------- inline void FTerm::setInsertCursor() @@ -671,14 +601,6 @@ inline void FTerm::setInsertCursor() inline void FTerm::unsetInsertCursor() { setInsertCursor(false); } -//---------------------------------------------------------------------- -inline bool FTerm::setCursorOptimisation (bool on) -{ return cursor_optimisation = ( on ) ? true : false; } - -//---------------------------------------------------------------------- -inline void FTerm::disableAltScreen() -{ use_alternate_screen = false; } - //---------------------------------------------------------------------- inline bool FTerm::setUTF8() { return setUTF8(true); } @@ -689,19 +611,19 @@ inline bool FTerm::unsetUTF8() //---------------------------------------------------------------------- inline bool FTerm::hasChangedTermSize() -{ return resize_term; } +{ return data->hasTermResized(); } //---------------------------------------------------------------------- inline bool FTerm::hasShadowCharacter() -{ return shadow_character; } +{ return data->hasShadowCharacter(); } //---------------------------------------------------------------------- inline bool FTerm::hasHalfBlockCharacter() -{ return half_block_character; } +{ return data->hasHalfBlockCharacter(); } //---------------------------------------------------------------------- inline bool FTerm::hasAlternateScreen() -{ return use_alternate_screen; } +{ return data->hasAlternateScreen(); } //---------------------------------------------------------------------- inline FOptiMove* FTerm::getFOptiMove() @@ -709,7 +631,7 @@ inline FOptiMove* FTerm::getFOptiMove() //---------------------------------------------------------------------- inline void FTerm::changeTermSizeFinished() -{ resize_term = false; } +{ data->setTermResized(false); } } // namespace finalcut diff --git a/src/include/final/ftermcap.h b/src/include/final/ftermcap.h index eb619c0d..44140854 100644 --- a/src/include/final/ftermcap.h +++ b/src/include/final/ftermcap.h @@ -3,7 +3,7 @@ * * * This file is part of the Final Cut widget toolkit * * * -* Copyright 2016-2017 Markus Gans * +* Copyright 2016-2018 Markus Gans * * * * The Final Cut is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public License * @@ -61,12 +61,10 @@ class FTermcap tcap_map; // Constructors - FTermcap() - { } + FTermcap(); // Destructor - ~FTermcap() - { } + ~FTermcap(); // Accessors const char* getClassName() const; @@ -76,12 +74,6 @@ class FTermcap return tcap; } - // Mutator - static void setTermcapMap (tcap_map* t) - { - tcap = t; - } - // Data Members static bool background_color_erase; static bool automatic_left_margin; @@ -95,16 +87,17 @@ class FTermcap static int attr_without_color; private: - // Data Members - static tcap_map* tcap; + // Data Member + static tcap_map tcap[]; }; #pragma pack(pop) -// FOptiMove inline functions +// FTermcap inline functions //---------------------------------------------------------------------- inline const char* FTermcap::getClassName() const { return "FTermcap"; } } // namespace finalcut + #endif // FTERMCAP_H diff --git a/src/include/final/ftermcapquirks.h b/src/include/final/ftermcapquirks.h index 41f7e0dc..01cc64b4 100644 --- a/src/include/final/ftermcapquirks.h +++ b/src/include/final/ftermcapquirks.h @@ -38,6 +38,7 @@ #include "final/fc.h" #include "final/fterm.h" #include "final/ftermcap.h" +#include "final/ftermdata.h" #include "final/ftermdetection.h" namespace finalcut @@ -63,8 +64,7 @@ class FTermcapQuirks const char* getClassName() const; // Mutator - static void setTerminalType (const char[]); - static void setTermcapMap (FTermcap::tcap_map*); + static void setTermData (FTermData*); static void setFTermDetection (FTermDetection*); // Methods @@ -87,8 +87,8 @@ class FTermcapQuirks static void init_termcap_general_quirks(); // Data Members - static char termtype[256]; static FTermcap::tcap_map* tcap; + static FTermData* fterm_data; static FTermDetection* term_detection; }; #pragma pack(pop) diff --git a/src/include/final/ftermdata.h b/src/include/final/ftermdata.h new file mode 100644 index 00000000..201e11e8 --- /dev/null +++ b/src/include/final/ftermdata.h @@ -0,0 +1,394 @@ +/*********************************************************************** +* ftermdata.h - Data class for FTerm * +* * +* This file is part of the Final Cut widget toolkit * +* * +* Copyright 2018 Markus Gans * +* * +* 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 * +* . * +***********************************************************************/ + +/* Standalone class + * ════════════════ + * + * ▕▔▔▔▔▔▔▔▔▔▔▔▏ + * ▕ FTermData ▏ + * ▕▁▁▁▁▁▁▁▁▁▁▁▏ + */ + +#ifndef FTERMDATA_H +#define FTERMDATA_H + +#if !defined (USE_FINAL_H) && !defined (COMPILE_FINAL_CUT) + #error "Only can be included directly." +#endif + +#include + +#include "final/fc.h" +#include "final/frect.h" +#include "final/fstring.h" +#include "final/ftypes.h" + +namespace finalcut +{ + +//---------------------------------------------------------------------- +// class FTermData +//---------------------------------------------------------------------- + +#pragma pack(push) +#pragma pack(1) + +class FTermData +{ + public: + // Typedefs + typedef std::map encodingMap; + + // Constructors + FTermData(); + + // Destructor + ~FTermData(); + + // Accessors + const char* getClassName() const; + encodingMap& getEncodingList(); + fc::encoding getTermEncoding() const; + FRect& getTermGeometry(); + int getTTYFileDescriptor() const; + uInt getBaudrate() const; + char* getTermType(); + char* getTermFileName(); + const FString& getXtermFont() const; + const FString& getXtermTitle() const; +#if DEBUG + int getFramebufferBpp() const; +#endif + + // Inquiries + bool hasShadowCharacter() const; + bool hasHalfBlockCharacter() const; + bool hasCursorOptimisation() const; + bool isCursorHidden() const; + bool hasAlternateScreen() const; + bool hasASCIIConsole() const; + bool hasVT100Console() const; + bool hasUTF8Console() const; + bool isUTF8() const; + bool isNewFont() const; + bool isVGAFont() const; + bool isMonochron() const; + bool hasTermResized() const; + + // Mutators + void setTermEncoding(fc::encoding); + void setTTYFileDescriptor (int); + void setBaudrate (uInt); + void supportShadowCharacter (bool); + void supportHalfBlockCharacter (bool); + void supportCursorOptimisation (bool); + void setCursorHidden (bool); + void useAlternateScreen (bool); + void setASCIIConsole (bool); + void setVT100Console (bool); + void setUTF8Console (bool); + void setUTF8 (bool); + void setNewFont (bool); + void setVGAFont (bool); + void setMonochron (bool); + void setTermResized (bool); + void setTermType (const char[]); + void setTermFileName (const char[]); + void setXtermFont (const FString&); + void setXtermTitle (const FString&); +#if DEBUG + void setFramebufferBpp (int); +#endif + + private: + // Disable copy constructor + FTermData (const FTermData&); + + // Disable assignment operator (=) + FTermData& operator = (const FTermData&); + + // Data Members + encodingMap encoding_list; + fc::encoding term_encoding; + FRect term_geometry; // current terminal geometry + int fd_tty; + uInt baudrate; + bool shadow_character; + bool half_block_character; + bool cursor_optimisation; + bool hidden_cursor; + bool use_alternate_screen; + bool ascii_console; + bool vt100_console; + bool utf8_console; + bool utf8_state; + bool new_font; + bool vga_font; + bool monochron; + bool resize_term; + char termtype[256]; + char termfilename[256]; + FString xterm_font; + FString xterm_title; + +#if DEBUG + int framebuffer_bpp; +#endif +}; +#pragma pack(pop) + +// FTermData inline functions +//---------------------------------------------------------------------- +inline FTermData::FTermData() + : encoding_list() + , term_encoding(fc::UNKNOWN) + , term_geometry() + , fd_tty(-1) // Teletype (tty) file descriptor is still undefined + , baudrate(0) + , shadow_character(true) + , half_block_character(true) + , cursor_optimisation(true) + , hidden_cursor(false) // Global cursor hidden state + , use_alternate_screen(true) + , ascii_console(false) + , vt100_console(false) + , utf8_console(false) + , utf8_state(false) + , new_font(false) + , vga_font(false) + , monochron(false) + , resize_term(false) + , termtype() + , termfilename() + , xterm_font() + , xterm_title() +{ + // Initialize arrays with '\0' + std::fill_n (termtype, sizeof(termtype), '\0'); + std::fill_n (termfilename, sizeof(termfilename), '\0'); +} + +//---------------------------------------------------------------------- +inline FTermData::~FTermData() +{ } + +//---------------------------------------------------------------------- +inline const char* FTermData::getClassName() const +{ return "FTermData"; } + +//---------------------------------------------------------------------- +inline FTermData::encodingMap& FTermData::getEncodingList() +{ return encoding_list; } + +//---------------------------------------------------------------------- +inline fc::encoding FTermData::getTermEncoding() const +{ return term_encoding; } + +//---------------------------------------------------------------------- +inline FRect& FTermData::getTermGeometry() +{ return term_geometry; } + +//---------------------------------------------------------------------- +inline int FTermData::getTTYFileDescriptor() const +{ return fd_tty; } + +//---------------------------------------------------------------------- +inline uInt FTermData::getBaudrate() const +{ return baudrate; } + +//---------------------------------------------------------------------- +inline char* FTermData::getTermType() +{ return termtype; } + +//---------------------------------------------------------------------- +inline char* FTermData::getTermFileName() +{ return termfilename; } + +//---------------------------------------------------------------------- +inline const FString& FTermData::getXtermFont() const +{ return xterm_font; } + +//---------------------------------------------------------------------- +inline const FString& FTermData::getXtermTitle() const +{ return xterm_title; } + +//---------------------------------------------------------------------- +#if DEBUG +inline int FTermData::getFramebufferBpp() const +{ return framebuffer_bpp; } +#endif + +//---------------------------------------------------------------------- +inline bool FTermData::hasShadowCharacter() const +{ return shadow_character; } + +//---------------------------------------------------------------------- +inline bool FTermData::hasHalfBlockCharacter() const +{ return half_block_character; } + +//---------------------------------------------------------------------- +inline bool FTermData::hasCursorOptimisation() const +{ return cursor_optimisation; } + +//---------------------------------------------------------------------- +inline bool FTermData::isCursorHidden() const +{ return hidden_cursor; } + +//---------------------------------------------------------------------- +inline bool FTermData::hasAlternateScreen() const +{ return use_alternate_screen; } + +//---------------------------------------------------------------------- +inline bool FTermData::hasASCIIConsole() const +{ return ascii_console; } + +//---------------------------------------------------------------------- +inline bool FTermData::hasVT100Console() const +{ return vt100_console; } + +//---------------------------------------------------------------------- +inline bool FTermData::hasUTF8Console() const +{ return utf8_console; } + +//---------------------------------------------------------------------- +inline bool FTermData::isUTF8() const +{ return utf8_state; } + +//---------------------------------------------------------------------- +inline bool FTermData::isNewFont() const +{ return new_font; } + +//---------------------------------------------------------------------- +inline bool FTermData::isVGAFont() const +{ return vga_font; } + +//---------------------------------------------------------------------- +inline bool FTermData::isMonochron() const +{ return monochron; } + +//---------------------------------------------------------------------- +inline bool FTermData::hasTermResized() const +{ return resize_term; } + +//---------------------------------------------------------------------- +inline void FTermData::setTermEncoding (fc::encoding enc) +{ term_encoding = enc; } + +//---------------------------------------------------------------------- +inline void FTermData::setTTYFileDescriptor (int fd) +{ fd_tty = fd; } + +//---------------------------------------------------------------------- +inline void FTermData::setBaudrate (uInt baud) +{ baudrate = baud; } + +//---------------------------------------------------------------------- +inline void FTermData::supportShadowCharacter (bool available) +{ shadow_character = available; } + +//---------------------------------------------------------------------- +inline void FTermData::supportHalfBlockCharacter (bool available) +{ half_block_character = available; } + +//---------------------------------------------------------------------- +inline void FTermData::supportCursorOptimisation (bool available) +{ cursor_optimisation = available; } + +//---------------------------------------------------------------------- +inline void FTermData::setCursorHidden (bool hidden_state) +{ hidden_cursor = hidden_state; } + +//---------------------------------------------------------------------- +inline void FTermData::useAlternateScreen (bool use) +{ use_alternate_screen = use; } + +//---------------------------------------------------------------------- +inline void FTermData::setASCIIConsole (bool ascii) +{ ascii_console = ascii; } + +//---------------------------------------------------------------------- +inline void FTermData::setVT100Console (bool vt100) +{ vt100_console = vt100; } + +//---------------------------------------------------------------------- +inline void FTermData::setUTF8Console (bool utf8) +{ utf8_console = utf8; } + +//---------------------------------------------------------------------- +inline void FTermData::setUTF8 (bool utf8) +{ utf8_state = utf8; } + +//---------------------------------------------------------------------- +inline void FTermData::setNewFont (bool nfont) +{ new_font = nfont; } + +//---------------------------------------------------------------------- +inline void FTermData::setVGAFont (bool vga) +{ vga_font = vga; } + +//---------------------------------------------------------------------- +inline void FTermData::setMonochron (bool mono) +{ monochron = mono; } + +//---------------------------------------------------------------------- +inline void FTermData::setTermResized (bool resize) +{ resize_term = resize; } + +//---------------------------------------------------------------------- +inline void FTermData::setTermType (const char name[]) +{ + if ( ! name ) + return; + + std::strncpy (termtype, name, sizeof(termtype)); + termtype[sizeof(termtype) - 1] = '\0'; +} + +//---------------------------------------------------------------------- +inline void FTermData::setTermFileName (const char file_name[]) +{ + if ( ! file_name ) + return; + + std::strncpy (termfilename, file_name, sizeof(termfilename)); + termtype[sizeof(termfilename) - 1] = '\0'; +} + +//---------------------------------------------------------------------- +inline void FTermData::setXtermFont (const FString& font) +{ xterm_font = font; } + +//---------------------------------------------------------------------- +inline void FTermData::setXtermTitle (const FString& title) +{ xterm_title = title; } + +//---------------------------------------------------------------------- +#if DEBUG +inline void FTermData::setFramebufferBpp (int bpp) +{ framebuffer_bpp = bpp; } +#endif + +} // namespace finalcut + +#endif // FTERMDATA_H + + diff --git a/src/include/final/ftermdetection.h b/src/include/final/ftermdetection.h index f48a357b..6c2e57db 100644 --- a/src/include/final/ftermdetection.h +++ b/src/include/final/ftermdetection.h @@ -43,6 +43,7 @@ #include "final/fc.h" #include "final/fconfig.h" +#include "final/ftermdata.h" #include "final/ftermios.h" #include "final/ftypes.h" @@ -96,7 +97,6 @@ class FTermDetection // Accessor const char* getClassName() const; static char* getTermType(); - static char* getTermFileName(); static int getGnomeTerminalID(); terminalType& getTermTypeStruct(); @@ -153,7 +153,7 @@ class FTermDetection static void setScreenTerm (bool); static void setTmuxTerm (bool); static void setTerminalDetection (bool); - static void setTermFileName (char[]); + static void setTermData (FTermData*); static void setTtyTypeFileName (char[]); // Methods @@ -199,7 +199,6 @@ class FTermDetection // Data Members static char termtype[256]; - static char termfilename[256]; static char ttytypename[256]; static bool decscusr_support; static bool terminal_detection; @@ -207,6 +206,7 @@ class FTermDetection static int gnome_terminal_id; static const FString* answer_back; static const FString* sec_da; + static FTermData* fterm_data; static terminalType terminal_type; static struct colorEnv @@ -256,10 +256,6 @@ inline const char* FTermDetection::getClassName() const inline char* FTermDetection::getTermType() { return termtype; } -//---------------------------------------------------------------------- -inline char* FTermDetection::getTermFileName() -{ return termfilename; } - //---------------------------------------------------------------------- inline int FTermDetection::getGnomeTerminalID() { return gnome_terminal_id; } diff --git a/src/include/final/ftermlinux.h b/src/include/final/ftermlinux.h index f006b4b3..9378243e 100644 --- a/src/include/final/ftermlinux.h +++ b/src/include/final/ftermlinux.h @@ -169,8 +169,8 @@ class FTermLinux // Data Members #if defined(__linux__) - static bool VGAFont; - static bool NewFont; + static bool vga_font; + static bool new_font; static bool shadow_character; static bool half_block_character; static bool has_saved_palette; @@ -210,11 +210,11 @@ inline bool FTermLinux::hasHalfBlockCharacter() //---------------------------------------------------------------------- inline bool FTermLinux::isVGAFontUsed() -{ return VGAFont; } +{ return vga_font; } //---------------------------------------------------------------------- inline bool FTermLinux::isNewFontUsed() -{ return NewFont; } +{ return new_font; } #endif // defined(__linux__) } // namespace finalcut diff --git a/src/include/final/ftermxterminal.h b/src/include/final/ftermxterminal.h index 78af0b38..b8ed1e7c 100644 --- a/src/include/final/ftermxterminal.h +++ b/src/include/final/ftermxterminal.h @@ -60,12 +60,12 @@ class FTermXTerminal virtual ~FTermXTerminal(); // Mutators - static void setTermcapMap (FTermcap::tcap_map*); static void setFTermDetection (FTermDetection*); static void redefineDefaultColors (bool); static void setCursorStyle (fc::xtermCursorStyle); static void setFont (const FString&); static void setTitle (const FString&); + static void setTermSize (int, int); static void setForeground (const FString&); static void setBackground (const FString&); static void setCursorColor (const FString&); @@ -110,6 +110,7 @@ class FTermXTerminal static void setXTermCursorStyle(); static void setXTermFont(); static void setXTermTitle(); + static void setXTermSize(); static void setXTermForeground(); static void setXTermBackground(); static void setXTermCursorColor(); @@ -135,9 +136,11 @@ class FTermXTerminal static void disableXTermMetaSendsESC(); // Data Members - static FTermcap::tcap_map* tcap; - static FTermDetection* term_detection; - static fc::xtermCursorStyle cursor_style; + static bool mouse_support; + static bool meta_sends_esc; + static bool xterm_default_colors; + static int term_width; + static int term_height; static const FString* xterm_font; static const FString* xterm_title; static const FString* foreground_color; @@ -146,9 +149,9 @@ class FTermXTerminal static const FString* mouse_foreground_color; static const FString* mouse_background_color; static const FString* highlight_background_color; - static bool mouse_support; - static bool meta_sends_esc; - static bool xterm_default_colors; + static FTermcap::tcap_map* tcap; + static FTermDetection* term_detection; + static fc::xtermCursorStyle cursor_style; }; #pragma pack(pop) @@ -157,10 +160,6 @@ class FTermXTerminal inline const char* FTermXTerminal::getClassName() const { return "FTermXTerminal"; } -//---------------------------------------------------------------------- -inline void FTermXTerminal::setTermcapMap (FTermcap::tcap_map* tc) -{ tcap = tc; } - //---------------------------------------------------------------------- inline void FTermXTerminal::setFTermDetection (FTermDetection* td) { term_detection = td; } diff --git a/src/include/final/fvterm.h b/src/include/final/fvterm.h index 3900cd95..976339ce 100644 --- a/src/include/final/fvterm.h +++ b/src/include/final/fvterm.h @@ -440,7 +440,7 @@ class FVTerm : public FTerm static charData s_ch; // shadow character static charData i_ch; // inherit background character static FPoint* term_pos; // terminal cursor position - static termcap_map* tcap; + static FTermcap::tcap_map* tcap; static FKeyboard* keyboard; static bool terminal_update_complete; static bool terminal_update_pending; diff --git a/test/ftermcapquirks-test.cpp b/test/ftermcapquirks-test.cpp index f805f9af..c3b184fa 100644 --- a/test/ftermcapquirks-test.cpp +++ b/test/ftermcapquirks-test.cpp @@ -149,7 +149,7 @@ static tcap_map tcap[] = { 0, "\0" } }; -} // namespace test +} // namespace test //---------------------------------------------------------------------- @@ -227,17 +227,18 @@ void FTermcapQuirksTest::classNameTest() //---------------------------------------------------------------------- void FTermcapQuirksTest::generalTest() { + finalcut::FTermcap::tcap_map* caps = finalcut::FTermcap::getTermcapMap(); const int last_item = int(sizeof(test::tcap) / sizeof(test::tcap[0])) - 1; - test::tcap_map* caps = new test::tcap_map[last_item]; for (int i = 0; i < last_item; i++) memcpy(&caps[i], &test::tcap[i], sizeof(test::tcap[0])); + finalcut::FTermData data; finalcut::FTermcap::tabstop = -1; finalcut::FTermcap::attr_without_color = -1; finalcut::FTermcapQuirks quirks; finalcut::FTermDetection detect; - quirks.setTermcapMap (reinterpret_cast(caps)); + quirks.setTermData(&data); quirks.setFTermDetection (&detect); quirks.terminalFixup(); @@ -286,23 +287,24 @@ void FTermcapQuirksTest::generalTest() , C_STR(CSI "29m") ); CPPUNIT_ASSERT_CSTRING ( printSequence(caps[finalcut::fc::t_enter_ca_mode].string).c_str() , C_STR("Esc 7 Esc [ ? 4 7 h ") ); - delete[] caps; + //delete[] caps; } //---------------------------------------------------------------------- void FTermcapQuirksTest::xtermTest() { + finalcut::FTermcap::tcap_map* caps = finalcut::FTermcap::getTermcapMap(); const int last_item = int(sizeof(test::tcap) / sizeof(test::tcap[0])) - 1; - test::tcap_map* caps = new test::tcap_map[last_item]; for (int i = 0; i < last_item; i++) memcpy(&caps[i], &test::tcap[i], sizeof(test::tcap[0])); + finalcut::FTermData data; finalcut::FTermcapQuirks quirks; finalcut::FTermDetection detect; detect.setXTerminal (true); - quirks.setTerminalType ("xterm"); - quirks.setTermcapMap (reinterpret_cast(caps)); + data.setTermType ("xterm"); + quirks.setTermData(&data); quirks.setFTermDetection (&detect); quirks.terminalFixup(); @@ -316,25 +318,25 @@ void FTermcapQuirksTest::xtermTest() CPPUNIT_ASSERT_CSTRING ( caps[finalcut::fc::t_cursor_normal].string , C_STR(CSI "?12l" CSI "?25h") ); detect.setXTerminal (false); - delete[] caps; } #if defined(__FreeBSD__) || defined(__DragonFly__) //---------------------------------------------------------------------- void FTermcapQuirksTest::freebsdTest() { + finalcut::FTermcap::tcap_map* caps = finalcut::FTermcap::getTermcapMap(); const int last_item = int(sizeof(test::tcap) / sizeof(test::tcap[0])) - 1; - test::tcap_map* caps = new test::tcap_map[last_item]; for (int i = 0; i < last_item; i++) memcpy(&caps[i], &test::tcap[i], sizeof(test::tcap[0])); + finalcut::FTermData data; finalcut::FTermcap::attr_without_color = -1; finalcut::FTermcapQuirks quirks; finalcut::FTermDetection detect; detect.setFreeBSDTerm (true); - quirks.setTerminalType ("xterm-16color"); - quirks.setTermcapMap (reinterpret_cast(caps)); + data.setTermType ("xterm-16color"); + quirks.setTermData(&data); quirks.setFTermDetection (&detect); quirks.terminalFixup(); @@ -355,25 +357,25 @@ void FTermcapQuirksTest::freebsdTest() "%?%p4%t;5%;m" "%?%p9%t\016%e\017%;") ); detect.setFreeBSDTerm (false); - delete[] caps; } #endif //---------------------------------------------------------------------- void FTermcapQuirksTest::cygwinTest() { + finalcut::FTermcap::tcap_map* caps = finalcut::FTermcap::getTermcapMap(); const int last_item = int(sizeof(test::tcap) / sizeof(test::tcap[0])) - 1; - test::tcap_map* caps = new test::tcap_map[last_item]; for (int i = 0; i < last_item; i++) memcpy(&caps[i], &test::tcap[i], sizeof(test::tcap[0])); + finalcut::FTermData data; finalcut::FTermcap::background_color_erase = false; finalcut::FTermcapQuirks quirks; finalcut::FTermDetection detect; detect.setCygwinTerminal (true); - quirks.setTerminalType ("cygwin"); - quirks.setTermcapMap (reinterpret_cast(caps)); + data.setTermType ("cygwin"); + quirks.setTermData(&data); quirks.setFTermDetection (&detect); quirks.terminalFixup(); @@ -383,25 +385,25 @@ void FTermcapQuirksTest::cygwinTest() CPPUNIT_ASSERT_CSTRING ( caps[finalcut::fc::t_cursor_visible].string , C_STR(CSI "?25h") ); detect.setCygwinTerminal (false); - delete[] caps; } //---------------------------------------------------------------------- void FTermcapQuirksTest::linuxTest() { + finalcut::FTermcap::tcap_map* caps = finalcut::FTermcap::getTermcapMap(); const int last_item = int(sizeof(test::tcap) / sizeof(test::tcap[0])) - 1; - test::tcap_map* caps = new test::tcap_map[last_item]; for (int i = 0; i < last_item; i++) memcpy(&caps[i], &test::tcap[i], sizeof(test::tcap[0])); + finalcut::FTermData data; finalcut::FTermcap::max_color = 8; finalcut::FTermcap::attr_without_color = -1; finalcut::FTermcapQuirks quirks; finalcut::FTermDetection detect; detect.setLinuxTerm (true); - quirks.setTerminalType ("linux"); - quirks.setTermcapMap (reinterpret_cast(caps)); + data.setTermType ("linux"); + quirks.setTermData(&data); quirks.setFTermDetection (&detect); quirks.terminalFixup(); @@ -457,23 +459,23 @@ void FTermcapQuirksTest::linuxTest() CPPUNIT_ASSERT_CSTRING ( caps[finalcut::fc::t_exit_underline_mode].string , 0 ); detect.setLinuxTerm (false); - delete[] caps; } //---------------------------------------------------------------------- void FTermcapQuirksTest::rxvtTest() { + finalcut::FTermcap::tcap_map* caps = finalcut::FTermcap::getTermcapMap(); const int last_item = int(sizeof(test::tcap) / sizeof(test::tcap[0])) - 1; - test::tcap_map* caps = new test::tcap_map[last_item]; for (int i = 0; i < last_item; i++) memcpy(&caps[i], &test::tcap[i], sizeof(test::tcap[0])); + finalcut::FTermData data; finalcut::FTermcapQuirks quirks; finalcut::FTermDetection detect; detect.setRxvtTerminal (true); - quirks.setTerminalType ("rxvt"); - quirks.setTermcapMap (reinterpret_cast(caps)); + data.setTermType ("rxvt"); + quirks.setTermData(&data); quirks.setFTermDetection (&detect); quirks.terminalFixup(); @@ -483,7 +485,7 @@ void FTermcapQuirksTest::rxvtTest() CPPUNIT_ASSERT_CSTRING ( caps[finalcut::fc::t_exit_alt_charset_mode].string , 0 ); // rxvt-16color - quirks.setTerminalType ("rxvt-16color"); + data.setTermType ("rxvt-16color"); quirks.terminalFixup(); CPPUNIT_ASSERT_CSTRING ( caps[finalcut::fc::t_enter_alt_charset_mode].string , C_STR(ESC "(0") ); @@ -500,24 +502,24 @@ void FTermcapQuirksTest::rxvtTest() detect.setUrxvtTerminal (false); detect.setRxvtTerminal (false); - delete[] caps; } //---------------------------------------------------------------------- void FTermcapQuirksTest::vteTest() { + finalcut::FTermcap::tcap_map* caps = finalcut::FTermcap::getTermcapMap(); const int last_item = int(sizeof(test::tcap) / sizeof(test::tcap[0])) - 1; - test::tcap_map* caps = new test::tcap_map[last_item]; for (int i = 0; i < last_item; i++) memcpy(&caps[i], &test::tcap[i], sizeof(test::tcap[0])); + finalcut::FTermData data; finalcut::FTermcap::attr_without_color = -1; finalcut::FTermcapQuirks quirks; finalcut::FTermDetection detect; detect.setGnomeTerminal (true); - quirks.setTerminalType ("gnome-256color"); - quirks.setTermcapMap (reinterpret_cast(caps)); + data.setTermType ("gnome-256color"); + quirks.setTermData(&data); quirks.setFTermDetection (&detect); quirks.terminalFixup(); @@ -526,26 +528,26 @@ void FTermcapQuirksTest::vteTest() , C_STR(CSI "24m") ); detect.setGnomeTerminal (false); - delete[] caps; } //---------------------------------------------------------------------- void FTermcapQuirksTest::puttyTest() { + finalcut::FTermcap::tcap_map* caps = finalcut::FTermcap::getTermcapMap(); const int last_item = int(sizeof(test::tcap) / sizeof(test::tcap[0])) - 1; - test::tcap_map* caps = new test::tcap_map[last_item]; for (int i = 0; i < last_item; i++) memcpy(&caps[i], &test::tcap[i], sizeof(test::tcap[0])); + finalcut::FTermData data; finalcut::FTermcap::background_color_erase = false; finalcut::FTermcap::osc_support = false; finalcut::FTermcap::attr_without_color = -1; finalcut::FTermcapQuirks quirks; finalcut::FTermDetection detect; detect.setPuttyTerminal (true); - quirks.setTerminalType ("putty"); - quirks.setTermcapMap (reinterpret_cast(caps)); + data.setTermType ("putty"); + quirks.setTermData(&data); quirks.setFTermDetection (&detect); quirks.terminalFixup(); @@ -611,24 +613,24 @@ void FTermcapQuirksTest::puttyTest() , C_STR(CSI "M") ); detect.setPuttyTerminal (false); - delete[] caps; } //---------------------------------------------------------------------- void FTermcapQuirksTest::teratermTest() { + finalcut::FTermcap::tcap_map* caps = finalcut::FTermcap::getTermcapMap(); const int last_item = int(sizeof(test::tcap) / sizeof(test::tcap[0])) - 1; - test::tcap_map* caps = new test::tcap_map[last_item]; for (int i = 0; i < last_item; i++) memcpy(&caps[i], &test::tcap[i], sizeof(test::tcap[0])); + finalcut::FTermData data; finalcut::FTermcap::eat_nl_glitch = false; finalcut::FTermcapQuirks quirks; finalcut::FTermDetection detect; detect.setTeraTerm (true); - quirks.setTerminalType ("teraterm"); - quirks.setTermcapMap (reinterpret_cast(caps)); + data.setTermType ("teraterm"); + quirks.setTermData(&data); quirks.setFTermDetection (&detect); quirks.terminalFixup(); @@ -643,47 +645,41 @@ void FTermcapQuirksTest::teratermTest() , C_STR(CSI "39;49m") ); detect.setTeraTerm (false); - delete[] caps; } //---------------------------------------------------------------------- void FTermcapQuirksTest::sunTest() { - const int last_item = int(sizeof(test::tcap) / sizeof(test::tcap[0])) - 1; - test::tcap_map* caps = new test::tcap_map[last_item]; - - for (int i = 0; i < last_item; i++) - memcpy(&caps[i], &test::tcap[i], sizeof(test::tcap[0])); - + finalcut::FTermData data; finalcut::FTermcap::eat_nl_glitch = false; finalcut::FTermcapQuirks quirks; finalcut::FTermDetection detect; detect.setSunTerminal (true); - quirks.setTerminalType ("sun-color"); - quirks.setTermcapMap (reinterpret_cast(caps)); + data.setTermType ("sun-color"); + quirks.setTermData(&data); quirks.setFTermDetection (&detect); quirks.terminalFixup(); CPPUNIT_ASSERT ( finalcut::FTermcap::eat_nl_glitch == true ); detect.setSunTerminal (false); - delete[] caps; } //---------------------------------------------------------------------- void FTermcapQuirksTest::screenTest() { + finalcut::FTermcap::tcap_map* caps = finalcut::FTermcap::getTermcapMap(); const int last_item = int(sizeof(test::tcap) / sizeof(test::tcap[0])) - 1; - test::tcap_map* caps = new test::tcap_map[last_item]; for (int i = 0; i < last_item; i++) memcpy(&caps[i], &test::tcap[i], sizeof(test::tcap[0])); + finalcut::FTermData data; finalcut::FTermcapQuirks quirks; finalcut::FTermDetection detect; detect.setScreenTerm (true); - quirks.setTerminalType ("screen-256color"); - quirks.setTermcapMap (reinterpret_cast(caps)); + data.setTermType ("screen-256color"); + quirks.setTermData(&data); quirks.setFTermDetection (&detect); quirks.terminalFixup(); @@ -704,7 +700,6 @@ void FTermcapQuirksTest::screenTest() "%p4%{255}%*%{1000}%/%2.2X" BEL ESC "\\") ); detect.setTmuxTerm (false); detect.setScreenTerm (false); - delete[] caps; } diff --git a/test/ftermdetection-test.cpp b/test/ftermdetection-test.cpp index 2c1e126e..eac89d28 100644 --- a/test/ftermdetection-test.cpp +++ b/test/ftermdetection-test.cpp @@ -474,9 +474,11 @@ void FTermDetectionTest::classNameTest() //---------------------------------------------------------------------- void FTermDetectionTest::ansiTest() { - setenv ("TERM", "ansi", 1); + finalcut::FTermData data; finalcut::FTermDetection detect; - detect.setTermFileName(C_STR("ansi")); + setenv ("TERM", "ansi", 1); + data.setTermFileName(C_STR("ansi")); + detect.setTermData(&data); pid_t pid = forkProcess(); @@ -542,8 +544,10 @@ void FTermDetectionTest::ansiTest() //---------------------------------------------------------------------- void FTermDetectionTest::xtermTest() { + finalcut::FTermData data; finalcut::FTermDetection detect; - detect.setTermFileName(C_STR("xterm")); + data.setTermFileName(C_STR("xterm")); + detect.setTermData(&data); detect.setTerminalDetection(true); pid_t pid = forkProcess(); @@ -602,8 +606,10 @@ void FTermDetectionTest::xtermTest() //---------------------------------------------------------------------- void FTermDetectionTest::rxvtTest() { + finalcut::FTermData data; finalcut::FTermDetection detect; - detect.setTermFileName(C_STR("rxvt-cygwin-native")); + data.setTermFileName(C_STR("rxvt-cygwin-native")); + detect.setTermData(&data); detect.setTerminalDetection(true); pid_t pid = forkProcess(); @@ -663,8 +669,10 @@ void FTermDetectionTest::rxvtTest() //---------------------------------------------------------------------- void FTermDetectionTest::urxvtTest() { + finalcut::FTermData data; finalcut::FTermDetection detect; - detect.setTermFileName(C_STR("rxvt-unicode-256color")); + data.setTermFileName(C_STR("rxvt-unicode-256color")); + detect.setTermData(&data); detect.setTerminalDetection(true); pid_t pid = forkProcess(); @@ -724,8 +732,10 @@ void FTermDetectionTest::urxvtTest() //---------------------------------------------------------------------- void FTermDetectionTest::mltermTest() { + finalcut::FTermData data; finalcut::FTermDetection detect; - detect.setTermFileName(C_STR("mlterm")); + data.setTermFileName(C_STR("mlterm")); + detect.setTermData(&data); detect.setTerminalDetection(true); pid_t pid = forkProcess(); @@ -792,8 +802,10 @@ void FTermDetectionTest::mltermTest() //---------------------------------------------------------------------- void FTermDetectionTest::puttyTest() { + finalcut::FTermData data; finalcut::FTermDetection detect; - detect.setTermFileName(C_STR("xterm")); + data.setTermFileName(C_STR("xterm")); + detect.setTermData(&data); detect.setTerminalDetection(true); pid_t pid = forkProcess(); @@ -853,8 +865,10 @@ void FTermDetectionTest::puttyTest() //---------------------------------------------------------------------- void FTermDetectionTest::kdeKonsoleTest() { + finalcut::FTermData data; finalcut::FTermDetection detect; - detect.setTermFileName(C_STR("xterm-256color")); + data.setTermFileName(C_STR("xterm-256color")); + detect.setTermData(&data); detect.setTerminalDetection(true); pid_t pid = forkProcess(); @@ -913,8 +927,10 @@ void FTermDetectionTest::kdeKonsoleTest() //---------------------------------------------------------------------- void FTermDetectionTest::gnomeTerminalTest() { + finalcut::FTermData data; finalcut::FTermDetection detect; - detect.setTermFileName(C_STR("xterm-256color")); + data.setTermFileName(C_STR("xterm-256color")); + detect.setTermData(&data); detect.setTerminalDetection(true); pid_t pid = forkProcess(); @@ -974,8 +990,10 @@ void FTermDetectionTest::gnomeTerminalTest() //---------------------------------------------------------------------- void FTermDetectionTest::ktermTest() { + finalcut::FTermData data; finalcut::FTermDetection detect; - detect.setTermFileName(C_STR("kterm")); + data.setTermFileName(C_STR("kterm")); + detect.setTermData(&data); detect.setTerminalDetection(true); pid_t pid = forkProcess(); @@ -1042,8 +1060,10 @@ void FTermDetectionTest::ktermTest() //---------------------------------------------------------------------- void FTermDetectionTest::teraTermTest() { + finalcut::FTermData data; finalcut::FTermDetection detect; - detect.setTermFileName(C_STR("xterm")); + data.setTermFileName(C_STR("xterm")); + detect.setTermData(&data); detect.setTerminalDetection(true); pid_t pid = forkProcess(); @@ -1103,8 +1123,10 @@ void FTermDetectionTest::teraTermTest() //---------------------------------------------------------------------- void FTermDetectionTest::cygwinTest() { + finalcut::FTermData data; finalcut::FTermDetection detect; - detect.setTermFileName(C_STR("cygwin")); + data.setTermFileName(C_STR("cygwin")); + detect.setTermData(&data); detect.setTerminalDetection(true); pid_t pid = forkProcess(); @@ -1164,8 +1186,10 @@ void FTermDetectionTest::cygwinTest() //---------------------------------------------------------------------- void FTermDetectionTest::minttyTest() { + finalcut::FTermData data; finalcut::FTermDetection detect; - detect.setTermFileName(C_STR("xterm-256color")); + data.setTermFileName(C_STR("xterm-256color")); + detect.setTermData(&data); detect.setTerminalDetection(true); pid_t pid = forkProcess(); @@ -1225,8 +1249,10 @@ void FTermDetectionTest::minttyTest() //---------------------------------------------------------------------- void FTermDetectionTest::linuxTest() { + finalcut::FTermData data; finalcut::FTermDetection detect; - detect.setTermFileName(C_STR("linux")); + data.setTermFileName(C_STR("linux")); + detect.setTermData(&data); detect.setTerminalDetection(true); pid_t pid = forkProcess(); @@ -1293,8 +1319,10 @@ void FTermDetectionTest::linuxTest() //---------------------------------------------------------------------- void FTermDetectionTest::freebsdTest() { + finalcut::FTermData data; finalcut::FTermDetection detect; - detect.setTermFileName(C_STR("xterm")); + data.setTermFileName(C_STR("xterm")); + detect.setTermData(&data); detect.setTerminalDetection(true); pid_t pid = forkProcess(); @@ -1364,8 +1392,10 @@ void FTermDetectionTest::freebsdTest() //---------------------------------------------------------------------- void FTermDetectionTest::netbsdTest() { + finalcut::FTermData data; finalcut::FTermDetection detect; - detect.setTermFileName(C_STR("wsvt25")); + data.setTermFileName(C_STR("wsvt25")); + detect.setTermData(&data); detect.setTerminalDetection(true); pid_t pid = forkProcess(); @@ -1433,8 +1463,10 @@ void FTermDetectionTest::netbsdTest() //---------------------------------------------------------------------- void FTermDetectionTest::openbsdTest() { + finalcut::FTermData data; finalcut::FTermDetection detect; - detect.setTermFileName(C_STR("vt220")); + data.setTermFileName(C_STR("vt220")); + detect.setTermData(&data); detect.setTerminalDetection(true); pid_t pid = forkProcess(); @@ -1502,8 +1534,10 @@ void FTermDetectionTest::openbsdTest() //---------------------------------------------------------------------- void FTermDetectionTest::sunTest() { + finalcut::FTermData data; finalcut::FTermDetection detect; - detect.setTermFileName(C_STR("sun-color")); + data.setTermFileName(C_STR("sun-color")); + detect.setTermData(&data); pid_t pid = forkProcess(); @@ -1569,8 +1603,10 @@ void FTermDetectionTest::sunTest() //---------------------------------------------------------------------- void FTermDetectionTest::screenTest() { + finalcut::FTermData data; finalcut::FTermDetection detect; - detect.setTermFileName(C_STR("screen")); + data.setTermFileName(C_STR("screen")); + detect.setTermData(&data); detect.setTerminalDetection(true); pid_t pid = forkProcess(); @@ -1636,8 +1672,10 @@ void FTermDetectionTest::screenTest() //---------------------------------------------------------------------- void FTermDetectionTest::tmuxTest() { + finalcut::FTermData data; finalcut::FTermDetection detect; - detect.setTermFileName(C_STR("screen")); + data.setTermFileName(C_STR("screen")); + detect.setTermData(&data); detect.setTerminalDetection(true); pid_t pid = forkProcess(); @@ -1739,7 +1777,9 @@ void FTermDetectionTest::ttytypeTest() ttytype << "vt100" << "\t" << "ttyp6" << std::endl; ttytype.close(); + finalcut::FTermData data; finalcut::FTermDetection detect; + detect.setTermData(&data); detect.setTerminalDetection(true); detect.setTtyTypeFileName(C_STR("new-root-dir/etc/ttytype")); @@ -1759,17 +1799,17 @@ void FTermDetectionTest::ttytypeTest() unsetenv("TMUX"); // Test /dev/tty3 with linux - detect.setTermFileName(C_STR("/dev/tty3")); + data.setTermFileName(C_STR("/dev/tty3")); detect.detect(); CPPUNIT_ASSERT_CSTRING ( detect.getTermType(), C_STR("linux") ); // Test /dev/ttyp0 with vt100 - detect.setTermFileName(C_STR("/dev/ttyp0")); + data.setTermFileName(C_STR("/dev/ttyp0")); detect.detect(); CPPUNIT_ASSERT_CSTRING ( detect.getTermType(), C_STR("vt100") ); // Test non-existent /dev/tty8 with fallback to vt100 - detect.setTermFileName(C_STR("/dev/tty8")); + data.setTermFileName(C_STR("/dev/tty8")); detect.detect(); CPPUNIT_ASSERT_CSTRING ( detect.getTermType(), C_STR("vt100") );