Reduces in the code the number of friend classes

This commit is contained in:
Markus Gans 2016-10-13 02:16:51 +02:00
parent 560e8c9811
commit cae1a742ea
16 changed files with 1010 additions and 907 deletions

View File

@ -1,3 +1,6 @@
2016-10-13 Markus Gans <guru.mail@muenster.de>
* Reduces in the code the number of friend classes
2016-10-11 Markus Gans <guru.mail@muenster.de>
* Separate the virtual terminal into a own class vterm

View File

@ -21,6 +21,7 @@ FWidget* FApplication::clicked_widget = 0; // is focused by click
FWidget* FApplication::open_menu = 0; // currently open menu
FWidget* FApplication::move_size_widget = 0; // move/size by keyboard
FPoint* FApplication::zero_point = 0; // zero point (x=0, y=0)
uChar FApplication::x11_button_state = 0x03;
int FApplication::quit_code = 0;
bool FApplication::quit_now = false;
@ -278,7 +279,7 @@ void FApplication::processKeyboardEvent()
#ifdef F_HAVE_LIBGPM
if ( gpm_mouse_enabled )
if ( isGpmMouseEnabled() )
{
gpmMouseEvent = false;
int type = gpmEvent();
@ -496,8 +497,7 @@ void FApplication::processKeyboardEvent()
int FApplication::modifierKeyCorrection (int& key_id)
{
// get the current modifier key state
getModifierKey();
modifier_key& m = mod_key;
FTerm::modifier_key& m = getModifierKey();
if ( ! (m.shift || m.ctrl || m.alt) )
{
@ -845,6 +845,7 @@ bool FApplication::processAccelerator (FWidget*& widget)
void FApplication::getX11ButtonState (int button)
{
// get the x11 and urxvt mouse button state
const FPoint& mouse_position = getMousePos();
enum btn_states
{
@ -870,7 +871,7 @@ void FApplication::getX11ButtonState (int button)
{
case button1_pressed:
case button1_pressed_move:
if ( *mouse == new_mouse_position
if ( mouse_position == new_mouse_position
&& x11_button_state == all_buttons_released
&& ! isKeyTimeout(&time_mousepressed, dblclick_interval) )
{
@ -942,6 +943,7 @@ void FApplication::getX11ButtonState (int button)
//----------------------------------------------------------------------
bool FApplication::parseX11Mouse()
{
const FPoint& mouse_position = getMousePos();
uChar x, y;
enum x11_btn_states
@ -979,15 +981,15 @@ bool FApplication::parseX11Mouse()
if ( (x11_mouse[0] & button_mask) >= button1_pressed_move
&& (x11_mouse[0] & button_mask) <= button3_pressed_move
&& *mouse != *zero_point )
&& mouse_position != *zero_point )
{
b_state.mouse_moved = true;
}
getX11ButtonState (x11_mouse[0] & button_mask);
if ( uChar(x11_mouse[1]) == mouse->getX() + 0x20
&& uChar(x11_mouse[2]) == mouse->getY() + 0x20
if ( uChar(x11_mouse[1]) == mouse_position.getX() + 0x20
&& uChar(x11_mouse[2]) == mouse_position.getY() + 0x20
&& b_state.wheel_up != Pressed
&& b_state.wheel_down != Pressed
&& uChar(x11_mouse[0]) == x11_button_state )
@ -995,7 +997,7 @@ bool FApplication::parseX11Mouse()
return false;
}
mouse->setPoint(x,y);
setMousePos (x, y);
x11_button_state = uChar(x11_mouse[0]);
x11_mouse[0] = '\0';
return true;
@ -1004,6 +1006,7 @@ bool FApplication::parseX11Mouse()
//----------------------------------------------------------------------
bool FApplication::parseSGRMouse()
{
const FPoint& mouse_position = getMousePos();
register char* p;
int button;
uChar x, y;
@ -1026,6 +1029,7 @@ bool FApplication::parseSGRMouse()
pressed = 'M',
released = 'm'
};
x = 0;
y = 0;
button = 0;
@ -1072,7 +1076,7 @@ bool FApplication::parseSGRMouse()
if ( (button & button_mask) >= button1_move
&& (button & button_mask) <= button3_move
&& *mouse != *zero_point )
&& mouse_position != *zero_point )
{
b_state.mouse_moved = true;
}
@ -1083,7 +1087,7 @@ bool FApplication::parseSGRMouse()
{
case button1:
case button1_move:
if ( *mouse == new_mouse_position
if ( mouse_position == new_mouse_position
&& (((x11_button_state & 0x80) >> 2) + 'M') == released
&& ! isKeyTimeout(&time_mousepressed, dblclick_interval) )
{
@ -1152,7 +1156,7 @@ bool FApplication::parseSGRMouse()
}
}
if ( *mouse == new_mouse_position
if ( mouse_position == new_mouse_position
&& b_state.wheel_up != Pressed
&& b_state.wheel_down != Pressed
&& x11_button_state == uChar(((*p & 0x20) << 2) + button) )
@ -1160,7 +1164,7 @@ bool FApplication::parseSGRMouse()
return false;
}
mouse->setPoint(x,y);
setMousePos (x, y);
x11_button_state = uChar(((*p & 0x20) << 2) + button);
sgr_mouse[0] = '\0';
return true;
@ -1169,6 +1173,7 @@ bool FApplication::parseSGRMouse()
//----------------------------------------------------------------------
bool FApplication::parseUrxvtMouse()
{
const FPoint& mouse_position = getMousePos();
register char* p;
register bool x_neg;
register bool y_neg;
@ -1248,11 +1253,11 @@ bool FApplication::parseUrxvtMouse()
if ( y_neg || y == 0 )
y = 1;
if ( x > term->getWidth() )
x = uChar(term->getWidth());
if ( x > getColumnNumber() )
x = uChar(getColumnNumber());
if ( y > term->getHeight() )
y = uChar(term->getHeight());
if ( y > getLineNumber() )
y = uChar(getLineNumber());
new_mouse_position.setPoint(x,y);
// fill bit field with 0
@ -1269,14 +1274,14 @@ bool FApplication::parseUrxvtMouse()
if ( (button & button_mask) >= button1_pressed_move
&& (button & button_mask) <= button3_pressed_move
&& *mouse != *zero_point )
&& mouse_position != *zero_point )
{
b_state.mouse_moved = true;
}
getX11ButtonState (button & button_mask);
if ( *mouse == new_mouse_position
if ( mouse_position == new_mouse_position
&& b_state.wheel_up != Pressed
&& b_state.wheel_down != Pressed
&& x11_button_state == uChar(button) )
@ -1284,7 +1289,7 @@ bool FApplication::parseUrxvtMouse()
return false;
}
mouse->setPoint(x,y);
setMousePos (x, y);
x11_button_state = uChar(button);
urxvt_mouse[0] = '\0';
return true;
@ -1359,7 +1364,7 @@ bool FApplication::processGpmEvent()
break;
}
mouse->setPoint(gpm_ev.x, gpm_ev.y);
setMousePos (gpm_ev.x, gpm_ev.y);
if ( gpmEvent(false) == mouse_event )
unprocessedInput() = true;
@ -1416,6 +1421,8 @@ void FApplication::processMouseEvent()
if ( ! Event )
return;
const FPoint& mouse_position = getMousePos();
if ( ! clicked_widget
&& ( b_state.left_button == Pressed
|| b_state.left_button == DoubleClick
@ -1425,12 +1432,12 @@ void FApplication::processMouseEvent()
|| b_state.wheel_down == Pressed ) )
{
// determine the window object on the current click position
FWidget* window = FWindow::getWindowWidgetAt (*mouse);
FWidget* window = FWindow::getWindowWidgetAt (mouse_position);
if ( window )
{
// determine the widget at the current click position
FWidget* child = childWidgetAt (window, *mouse);
FWidget* child = childWidgetAt (window, mouse_position);
clicked_widget = (child != 0) ? child : window;
}
@ -1448,7 +1455,7 @@ void FApplication::processMouseEvent()
{
FMenu* menu = static_cast<FMenu*>(open_menu);
if ( ! menu->containsMenuStructure(*mouse) )
if ( ! menu->containsMenuStructure(mouse_position) )
{
bool is_window_menu;
FWidget* super = menu->getSuperMenu();
@ -1480,7 +1487,7 @@ void FApplication::processMouseEvent()
&& menuBar()->hasSelectedItem()
&& ! b_state.mouse_moved )
{
if ( ! menuBar()->getTermGeometry().contains(*mouse) )
if ( ! menuBar()->getTermGeometry().contains(mouse_position) )
{
if ( statusBar() )
statusBar()->clearMessage();
@ -1514,7 +1521,7 @@ void FApplication::processMouseEvent()
if ( b_state.control_button == Pressed )
key_state |= fc::ControlButton;
widgetMousePos = clicked_widget->termToWidgetPos(*mouse);
widgetMousePos = clicked_widget->termToWidgetPos(mouse_position);
if ( b_state.mouse_moved )
{
@ -1522,7 +1529,7 @@ void FApplication::processMouseEvent()
{
FMouseEvent m_down_ev ( fc::MouseMove_Event
, widgetMousePos
, *mouse
, mouse_position
, fc::LeftButton | key_state );
sendEvent (clicked_widget, &m_down_ev);
}
@ -1531,7 +1538,7 @@ void FApplication::processMouseEvent()
{
FMouseEvent m_down_ev ( fc::MouseMove_Event
, widgetMousePos
, *mouse
, mouse_position
, fc::RightButton | key_state );
sendEvent (clicked_widget, &m_down_ev);
}
@ -1540,7 +1547,7 @@ void FApplication::processMouseEvent()
{
FMouseEvent m_down_ev ( fc::MouseMove_Event
, widgetMousePos
, *mouse
, mouse_position
, fc::MiddleButton | key_state );
sendEvent (clicked_widget, &m_down_ev);
}
@ -1551,7 +1558,7 @@ void FApplication::processMouseEvent()
{
FMouseEvent m_dblclick_ev ( fc::MouseDoubleClick_Event
, widgetMousePos
, *mouse
, mouse_position
, fc::LeftButton | key_state );
sendEvent (clicked_widget, &m_dblclick_ev);
}
@ -1559,7 +1566,7 @@ void FApplication::processMouseEvent()
{
FMouseEvent m_down_ev ( fc::MouseDown_Event
, widgetMousePos
, *mouse
, mouse_position
, fc::LeftButton | key_state );
sendEvent (clicked_widget, &m_down_ev);
}
@ -1567,7 +1574,7 @@ void FApplication::processMouseEvent()
{
FMouseEvent m_up_ev ( fc::MouseUp_Event
, widgetMousePos
, *mouse
, mouse_position
, fc::LeftButton | key_state );
FWidget* released_widget = clicked_widget;
@ -1582,7 +1589,7 @@ void FApplication::processMouseEvent()
{
FMouseEvent m_down_ev ( fc::MouseDown_Event
, widgetMousePos
, *mouse
, mouse_position
, fc::RightButton | key_state );
sendEvent (clicked_widget, &m_down_ev);
}
@ -1590,7 +1597,7 @@ void FApplication::processMouseEvent()
{
FMouseEvent m_up_ev ( fc::MouseUp_Event
, widgetMousePos
, *mouse
, mouse_position
, fc::RightButton | key_state );
FWidget* released_widget = clicked_widget;
@ -1605,7 +1612,7 @@ void FApplication::processMouseEvent()
{
FMouseEvent m_down_ev ( fc::MouseDown_Event
, widgetMousePos
, *mouse
, mouse_position
, fc::MiddleButton | key_state );
sendEvent (clicked_widget, &m_down_ev);
@ -1617,7 +1624,7 @@ void FApplication::processMouseEvent()
{
FMouseEvent m_up_ev ( fc::MouseUp_Event
, widgetMousePos
, *mouse
, mouse_position
, fc::MiddleButton | key_state );
FWidget* released_widget = clicked_widget;
@ -1635,7 +1642,7 @@ void FApplication::processMouseEvent()
{
FWheelEvent wheel_ev ( fc::MouseWheel_Event
, widgetMousePos
, *mouse
, mouse_position
, fc::WheelUp );
FWidget* scroll_over_widget = clicked_widget;
clicked_widget = 0;
@ -1646,7 +1653,7 @@ void FApplication::processMouseEvent()
{
FWheelEvent wheel_ev ( fc::MouseWheel_Event
, widgetMousePos
, *mouse
, mouse_position
, fc::WheelDown );
FWidget* scroll_over_widget = clicked_widget;
clicked_widget = 0;
@ -1656,7 +1663,7 @@ void FApplication::processMouseEvent()
}
#ifdef F_HAVE_LIBGPM
if ( gpm_mouse_enabled && gpm_ev.x != -1 )
if ( isGpmMouseEnabled() && gpm_ev.x != -1 )
GPM_DRAWPOINTER(&gpm_ev);
#endif
}
@ -1664,13 +1671,13 @@ void FApplication::processMouseEvent()
//----------------------------------------------------------------------
void FApplication::processResizeEvent()
{
if ( resize_term )
if ( hasChangedTermSize() )
{
FResizeEvent r_ev(fc::Resize_Event);
sendEvent(rootObj, &r_ev);
if ( r_ev.isAccepted() )
resize_term = false;
changeTermSizeFinished();
}
}
@ -1899,7 +1906,12 @@ bool FApplication::sendEvent(FObject* receiver, FEvent* event)
return false;
// sends event event directly to receiver
return widget->event(event);
FApplication* w = static_cast<FApplication*>(widget);
if ( w )
return w->event(event); // access to a protected base class member
else
return false;
}
//----------------------------------------------------------------------

View File

@ -65,12 +65,14 @@ class FApplication : public FWidget
static int loop_level;
static bool process_timer_event;
static FPoint* zero_point;
static uChar x11_button_state;
int key;
char k_buf[1024];
char x11_mouse[4];
char sgr_mouse[13];
char urxvt_mouse[13];
#ifdef F_HAVE_LIBGPM
Gpm_Event gpm_ev;

View File

@ -1120,7 +1120,7 @@ void FDialog::onWindowActive (FEvent*)
void FDialog::onWindowInactive (FEvent*)
{
if ( dialog_menu && ! dialog_menu->isVisible() )
FWindow::previous_widget = this;
FWindow::previous_window = this;
if ( isVisible() && isEnabled() )
drawTitleBar();

View File

@ -1325,7 +1325,7 @@ void FOptiAttr::init()
}
//----------------------------------------------------------------------
char* FOptiAttr::change_attribute (char_data*& term, char_data*& next)
char* FOptiAttr::changeAttribute (char_data*& term, char_data*& next)
{
fake_reverse = false;
attr_buf[0] = '\0';

View File

@ -234,7 +234,7 @@ class FOptiAttr
void set_orig_orig_colors (char*&);
void init();
char* change_attribute (char_data*&, char_data*&);
char* changeAttribute (char_data*&, char_data*&);
friend bool operator == (const char_data&, const char_data&);
friend bool operator != (const char_data&, const char_data&);

View File

@ -23,11 +23,8 @@ int (*FTerm::Fputchar)(int);
int FTerm::stdin_no;
int FTerm::stdout_no;
int FTerm::fd_tty;
int FTerm::max_color;
int FTerm::stdin_status_flags;
uInt FTerm::baudrate;
uInt FTerm::tabstop;
uInt FTerm::attr_without_color;
bool FTerm::resize_term;
bool FTerm::mouse_support;
bool FTerm::raw_mode;
@ -36,11 +33,6 @@ bool FTerm::non_blocking_stdin;
bool FTerm::gpm_mouse_enabled;
bool FTerm::color256;
bool FTerm::monochron;
bool FTerm::background_color_erase;
bool FTerm::automatic_left_margin;
bool FTerm::automatic_right_margin;
bool FTerm::eat_nl_glitch;
bool FTerm::ansi_default_color;
bool FTerm::xterm_terminal;
bool FTerm::rxvt_terminal;
bool FTerm::urxvt_terminal;
@ -66,8 +58,6 @@ bool FTerm::ascii_console;
bool FTerm::NewFont;
bool FTerm::VGAFont;
bool FTerm::cursor_optimisation;
bool FTerm::osc_support;
uChar FTerm::x11_button_state;
termios FTerm::term_init;
char FTerm::termtype[30] = "";
char* FTerm::term_name = 0;
@ -76,20 +66,29 @@ char* FTerm::locale_xterm = 0;
FPoint* FTerm::mouse = 0;
FRect* FTerm::term = 0;
char FTerm::exit_message[8192] = "";
char FTerm::exit_message[8192] = "";
fc::encoding FTerm::Encoding;
const FString* FTerm::xterm_font = 0;
const FString* FTerm::xterm_title = 0;
const FString* FTerm::answer_back = 0;
const FString* FTerm::sec_da = 0;
FOptiMove* FTerm::opti_move = 0;
FOptiAttr* FTerm::opti_attr = 0;
const FString* FTerm::xterm_font = 0;
const FString* FTerm::xterm_title = 0;
const FString* FTerm::answer_back = 0;
const FString* FTerm::sec_da = 0;
FOptiMove* FTerm::opti_move = 0;
FOptiAttr* FTerm::opti_attr = 0;
FTerm::modifier_key FTerm::mod_key;
std::map<uChar,uChar>* FTerm::vt100_alt_char = 0;
std::map<uChar,uChar>* FTerm::vt100_alt_char = 0;
std::map<std::string,fc::encoding>* \
FTerm::encoding_set = 0;
FTermcap::tcap_map* FTermcap::tcap = 0;
FTermcap::tcap_map* FTerm::tcap = term_caps;
FTerm::encoding_set = 0;
FTermcap::tcap_map* FTerm::tcap = term_caps;
FTermcap::tcap_map* FTermcap::tcap = 0;
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;
int FTermcap::max_color = 1;
uInt FTermcap::tabstop = 8;
uInt FTermcap::attr_without_color = 0;
console_font_op FTerm::screen_font;
unimapdesc FTerm::screen_unicode_map;
fc::consoleCursorStyle FTerm::console_cursor_style;
@ -104,6 +103,8 @@ fc::consoleCursorStyle FTerm::console_cursor_style;
FTerm::FTerm()
: map()
{
resize_term = false;
if ( ! term_initialized )
{
init();
@ -660,7 +661,7 @@ bool& FTerm::unprocessedInput()
int FTerm::getLineNumber()
{
if ( term->getHeight() == 0 )
getTermSize();
detectTermSize();
return term->getHeight();
}
@ -669,7 +670,7 @@ int FTerm::getLineNumber()
int FTerm::getColumnNumber()
{
if ( term->getWidth() == 0 )
getTermSize();
detectTermSize();
return term->getWidth();
}
@ -688,7 +689,7 @@ FString FTerm::getKeyName (int keynum)
}
//----------------------------------------------------------------------
void FTerm::getModifierKey()
FTerm::modifier_key& FTerm::getModifierKey()
{
char subcode = 6;
// fill bit field with 0
@ -709,11 +710,14 @@ void FTerm::getModifierKey()
if ( subcode & (1 << KG_ALT) )
mod_key.alt = true;
}
return mod_key;
}
//----------------------------------------------------------------------
void FTerm::init_console()
{
// initialize terminal and Linux console
fd_tty = -1;
screen_unicode_map.entries = 0;
screen_font.data = 0;
@ -726,7 +730,7 @@ void FTerm::init_console()
getScreenFont();
}
getTermSize();
detectTermSize();
closeConsole();
}
else
@ -763,30 +767,6 @@ uInt FTerm::getBaudRate (const struct termios* termios_p)
return ospeed[cfgetospeed(termios_p)];
}
//----------------------------------------------------------------------
void FTerm::init_consoleCharMap()
{
if ( screen_unicode_map.entry_ct != 0 )
{
for (int i=0; i <= lastCharItem; i++ )
{
bool found = false;
for (uInt n=0; n < screen_unicode_map.entry_ct; n++)
{
if ( character[i][fc::UTF8] == screen_unicode_map.entries[n].unicode )
{
found = true;
break;
}
}
if ( ! found )
character[i][fc::PC] = character[i][fc::ASCII];
}
}
}
//----------------------------------------------------------------------
void FTerm::signal_handler (int signum)
{
@ -1221,48 +1201,48 @@ void FTerm::init_termcaps()
char* key_up_string;
// screen erased with the background color
background_color_erase = tgetflag(const_cast<char*>("ut"));
FTermcap::background_color_erase = tgetflag(const_cast<char*>("ut"));
// t_cursor_left wraps from column 0 to last column
automatic_left_margin = tgetflag(const_cast<char*>("bw"));
FTermcap::automatic_left_margin = tgetflag(const_cast<char*>("bw"));
// terminal has auto-matic margins
automatic_right_margin = tgetflag(const_cast<char*>("am"));
FTermcap::automatic_right_margin = tgetflag(const_cast<char*>("am"));
// newline ignored after 80 cols
eat_nl_glitch = tgetflag(const_cast<char*>("xn"));
FTermcap::eat_nl_glitch = tgetflag(const_cast<char*>("xn"));
// terminal supports ANSI set default fg and bg color
ansi_default_color = tgetflag(const_cast<char*>("AX"));
FTermcap::ansi_default_color = tgetflag(const_cast<char*>("AX"));
// terminal supports operating system commands (OSC)
// OSC = Esc + ']'
osc_support = tgetflag(const_cast<char*>("XT"));
FTermcap::osc_support = tgetflag(const_cast<char*>("XT"));
if ( isTeraTerm() )
eat_nl_glitch = true;
FTermcap::eat_nl_glitch = true;
// maximum number of colors on screen
max_color = tgetnum(const_cast<char*>("Co"));
FTermcap::max_color = tgetnum(const_cast<char*>("Co"));
if ( max_color < 0 )
max_color = 1;
if ( FTermcap::max_color < 0 )
FTermcap::max_color = 1;
if ( max_color < 8 )
if ( FTermcap::max_color < 8 )
monochron = true;
else
monochron = false;
tabstop = uInt(tgetnum(const_cast<char*>("it")));
attr_without_color = uInt(tgetnum(const_cast<char*>("NC")));
FTermcap::tabstop = uInt(tgetnum(const_cast<char*>("it")));
FTermcap::attr_without_color = uInt(tgetnum(const_cast<char*>("NC")));
// gnome-terminal has NC=16 however, it can use the dim attribute
if ( gnome_terminal )
attr_without_color = 0;
FTermcap::attr_without_color = 0;
// PuTTY has NC=22 however, it can show underline and reverse
if ( putty_terminal )
attr_without_color = 16;
FTermcap::attr_without_color = 16;
// read termcap output strings
for (int i=0; tcap[i].tname[0] != 0; i++)
@ -1508,7 +1488,7 @@ void FTerm::init_termcaps()
}
// duration precalculation of the cursor movement strings
opti_move->setTabStop(int(tabstop));
opti_move->setTabStop(int(FTermcap::tabstop));
opti_move->set_cursor_home (tcap[fc::t_cursor_home].string);
opti_move->set_cursor_to_ll (tcap[fc::t_cursor_to_ll].string);
opti_move->set_carriage_return (tcap[fc::t_carriage_return].string);
@ -1525,12 +1505,12 @@ void FTerm::init_termcaps()
opti_move->set_parm_down_cursor (tcap[fc::t_parm_down_cursor].string);
opti_move->set_parm_left_cursor (tcap[fc::t_parm_left_cursor].string);
opti_move->set_parm_right_cursor (tcap[fc::t_parm_right_cursor].string);
opti_move->set_auto_left_margin (automatic_left_margin);
opti_move->set_eat_newline_glitch (eat_nl_glitch);
opti_move->set_auto_left_margin (FTermcap::automatic_left_margin);
opti_move->set_eat_newline_glitch (FTermcap::eat_nl_glitch);
//opti_move->printDurations();
// attribute settings
opti_attr->setNoColorVideo (int(attr_without_color));
opti_attr->setNoColorVideo (int(FTermcap::attr_without_color));
opti_attr->set_enter_bold_mode (tcap[fc::t_enter_bold_mode].string);
opti_attr->set_exit_bold_mode (tcap[fc::t_exit_bold_mode].string);
opti_attr->set_enter_dim_mode (tcap[fc::t_enter_dim_mode].string);
@ -1566,9 +1546,9 @@ void FTerm::init_termcaps()
opti_attr->set_term_color_pair (tcap[fc::t_set_color_pair].string);
opti_attr->set_orig_pair (tcap[fc::t_orig_pair].string);
opti_attr->set_orig_orig_colors (tcap[fc::t_orig_colors].string);
opti_attr->setMaxColor (max_color);
opti_attr->setMaxColor (FTermcap::max_color);
if ( ansi_default_color )
if ( FTermcap::ansi_default_color )
opti_attr->setDefaultColorSupport();
if ( cygwin_terminal )
@ -1642,8 +1622,6 @@ void FTerm::init()
char* new_termtype = 0;
term_initialized = true;
init_term_object = this;
x11_button_state = 0x03;
max_color = 1;
fd_tty = -1;
opti_move = new FOptiMove();
opti_attr = new FOptiAttr();
@ -1681,8 +1659,7 @@ void FTerm::init()
mlterm_terminal = \
mintty_terminal = \
screen_terminal = \
tmux_terminal = \
background_color_erase = false;
tmux_terminal = false;
// Preset to true
cursor_optimisation = true;
@ -1882,33 +1859,33 @@ void FTerm::init()
unsetNonBlockingInput();
}
if ( (max_color == 8)
if ( (FTermcap::max_color == 8)
&& ( linux_terminal
|| cygwin_terminal
|| putty_terminal
|| tera_terminal
|| rxvt_terminal) )
{
max_color = 16;
FTermcap::max_color = 16;
}
if ( linux_terminal && openConsole() == 0 )
{
if ( isConsole() )
if ( setBlinkAsIntensity(true) != 0 )
max_color = 8;
FTermcap::max_color = 8;
closeConsole();
setConsoleCursor(fc::underscore_cursor, true);
}
if ( linux_terminal && getFramebuffer_bpp() >= 4 )
max_color = 16;
FTermcap::max_color = 16;
if ( kde_konsole )
setKDECursor(fc::UnderlineCursor);
if ( max_color >= 16
if ( FTermcap::max_color >= 16
&& ! cygwin_terminal
&& ! kde_konsole
&& ! tera_terminal )
@ -1987,7 +1964,7 @@ void FTerm::finish()
resetXTermHighlightBackground();
setXTermCursorStyle(fc::steady_block);
if ( max_color >= 16 && ! (kde_konsole || tera_terminal) )
if ( FTermcap::max_color >= 16 && ! (kde_konsole || tera_terminal) )
{
// reset screen settings
setPalette (fc::Cyan, 0x18, 0xb2, 0xb2);
@ -2019,7 +1996,7 @@ void FTerm::finish()
resetBeep();
if ( linux_terminal
&& background_color_erase
&& FTermcap::background_color_erase
&& tcap[fc::t_clear_screen].string )
{
int rows = term->getHeight();
@ -2102,6 +2079,59 @@ void FTerm::finish()
delete opti_move;
}
//----------------------------------------------------------------------
uInt FTerm::cp437_to_unicode (uChar c)
{
register uInt ucs = uInt(c);
for (register uInt i=0; i <= lastCP437Item; i++)
{
if ( cp437_to_ucs[i][0] == c ) // found
{
ucs = cp437_to_ucs[i][1];
break;
}
}
return ucs;
}
// protected methods of FTerm
//----------------------------------------------------------------------
void FTerm::init_consoleCharMap()
{
if ( NewFont || VGAFont )
return;
if ( screen_unicode_map.entry_ct != 0 )
{
for (int i=0; i <= lastCharItem; i++ )
{
bool found = false;
for (uInt n=0; n < screen_unicode_map.entry_ct; n++)
{
if ( character[i][fc::UTF8] == screen_unicode_map.entries[n].unicode )
{
found = true;
break;
}
}
if ( ! found )
character[i][fc::PC] = character[i][fc::ASCII];
}
}
}
//----------------------------------------------------------------------
bool FTerm::charEncodable (uInt c)
{
uInt ch = charEncode(c);
return bool(ch > 0 && ch != c);
}
//----------------------------------------------------------------------
uInt FTerm::charEncode (uInt c)
{
@ -2124,29 +2154,82 @@ uInt FTerm::charEncode (uInt c, fc::encoding enc)
}
//----------------------------------------------------------------------
uInt FTerm::cp437_to_unicode (uChar c)
char* FTerm::changeAttribute ( FOptiAttr::char_data*& term_attr
, FOptiAttr::char_data*& next_attr )
{
register uInt ucs = uInt(c);
return opti_attr->changeAttribute (term_attr, next_attr);
}
for (register uInt i=0; i <= lastCP437Item; i++)
//----------------------------------------------------------------------
void FTerm::xtermMouse (bool on)
{
// activate/deactivate the xterm mouse support
if ( ! mouse_support )
return;
if ( on )
putstring (CSI "?1001s" // save old highlight mouse tracking
CSI "?1000h" // enable x11 mouse tracking
CSI "?1002h" // enable cell motion mouse tracking
CSI "?1015h" // enable urxvt mouse mode
CSI "?1006h"); // enable SGR mouse mode
else
putstring (CSI "?1006l" // disable SGR mouse mode
CSI "?1015l" // disable urxvt mouse mode
CSI "?1002l" // disable cell motion mouse tracking
CSI "?1000l" // disable x11 mouse tracking
CSI "?1001r"); // restore old highlight mouse tracking
std::fflush(stdout);
}
#ifdef F_HAVE_LIBGPM
//----------------------------------------------------------------------
bool FTerm::gpmMouse (bool on)
{
// activate/deactivate the gpm mouse support
if ( ! linux_terminal )
return false;
if ( openConsole() == 0 )
{
if ( cp437_to_ucs[i][0] == c ) // found
{
ucs = cp437_to_ucs[i][1];
break;
}
if ( ! isConsole() )
return false;
closeConsole();
}
return ucs;
}
if ( on )
{
Gpm_Connect conn;
conn.eventMask = uInt16(~GPM_MOVE);
conn.defaultMask = GPM_MOVE;
conn.maxMod = uInt16(~0);
conn.minMod = 0;
Gpm_Open(&conn, 0);
// protected methods of FTerm
//----------------------------------------------------------------------
bool FTerm::charEncodable (uInt c)
{
uInt ch = charEncode(c);
return bool(ch > 0 && ch != c);
switch ( gpm_fd )
{
case -1:
return false;
case -2:
Gpm_Close();
return false;
default:
break;
}
}
else
{
Gpm_Close();
}
return on;
}
#endif // F_HAVE_LIBGPM
// public methods of FTerm
@ -2166,7 +2249,7 @@ bool FTerm::setVGAFont()
VGAFont = true;
if ( xterm_terminal || screen_terminal || osc_support )
if ( xterm_terminal || screen_terminal || FTermcap::osc_support )
{
// Set font in xterm to vga
oscPrefix();
@ -2204,7 +2287,7 @@ bool FTerm::setVGAFont()
else
VGAFont = false;
getTermSize();
detectTermSize();
closeConsole();
}
else
@ -2234,7 +2317,8 @@ bool FTerm::setNewFont()
|| mintty_terminal )
return false;
if ( xterm_terminal || screen_terminal || urxvt_terminal || osc_support )
if ( xterm_terminal || screen_terminal
|| urxvt_terminal || FTermcap::osc_support )
{
NewFont = true;
// Set font in xterm to 8x16graph
@ -2274,7 +2358,7 @@ bool FTerm::setNewFont()
setUnicodeMap(&unimap);
}
getTermSize();
detectTermSize();
closeConsole();
}
@ -2300,7 +2384,8 @@ bool FTerm::setOldFont()
NewFont = \
VGAFont = false;
if ( xterm_terminal || screen_terminal || urxvt_terminal || osc_support )
if ( xterm_terminal || screen_terminal
|| urxvt_terminal || FTermcap::osc_support )
{
if ( xterm_font && xterm_font->getLength() > 2 )
{
@ -2347,7 +2432,7 @@ bool FTerm::setOldFont()
}
getTermSize();
detectTermSize();
closeConsole();
}
}
@ -2355,6 +2440,12 @@ bool FTerm::setOldFont()
return retval;
}
//----------------------------------------------------------------------
fc::consoleCursorStyle FTerm::getConsoleCursor()
{
return console_cursor_style;
}
//----------------------------------------------------------------------
void FTerm::setConsoleCursor (fc::consoleCursorStyle style, bool hidden)
{
@ -2407,13 +2498,19 @@ char* FTerm::disableCursor()
}
//----------------------------------------------------------------------
void FTerm::getTermSize()
void FTerm::detectTermSize()
{
struct winsize win_size;
bool close_after_detect = false;
int ret;
if ( fd_tty < 0 )
return;
if ( fd_tty < 0 ) // console is already closed
{
if ( openConsole() != 0 )
return;
close_after_detect = true;
}
ret = ioctl (fd_tty, TIOCGWINSZ, &win_size);
@ -2432,6 +2529,9 @@ void FTerm::getTermSize()
}
opti_move->setTermSize (term->getWidth(), term->getHeight());
if ( close_after_detect )
closeConsole();
}
//----------------------------------------------------------------------
@ -2459,11 +2559,11 @@ void FTerm::setKDECursor (fc::kdeKonsoleCursorShape style)
}
//----------------------------------------------------------------------
FString FTerm::getXTermFont()
const FString FTerm::getXTermFont()
{
FString font("");
if ( xterm_terminal || screen_terminal || osc_support )
if ( xterm_terminal || screen_terminal || FTermcap::osc_support )
{
if ( raw_mode && non_blocking_stdin )
{
@ -2491,7 +2591,7 @@ FString FTerm::getXTermFont()
}
//----------------------------------------------------------------------
FString FTerm::getXTermTitle()
const FString FTerm::getXTermTitle()
{
FString title("");
@ -2537,7 +2637,7 @@ void FTerm::setXTermTitle (const FString& title)
// Set the xterm title
if ( xterm_terminal || screen_terminal
|| mintty_terminal || putty_terminal
|| osc_support )
|| FTermcap::osc_support )
{
oscPrefix();
putstringf (OSC "0;%s" BEL, title.c_str());
@ -2552,7 +2652,7 @@ void FTerm::setXTermForeground (const FString& fg)
// Set the VT100 text foreground color
if ( xterm_terminal || screen_terminal
|| mintty_terminal || mlterm_terminal
|| osc_support )
|| FTermcap::osc_support )
{
oscPrefix();
putstringf (OSC "10;%s" BEL, fg.c_str());
@ -2567,7 +2667,7 @@ void FTerm::setXTermBackground (const FString& bg)
// Set the VT100 text background color
if ( xterm_terminal || screen_terminal
|| mintty_terminal || mlterm_terminal
|| osc_support )
|| FTermcap::osc_support )
{
oscPrefix();
putstringf (OSC "11;%s" BEL, bg.c_str());
@ -2582,7 +2682,7 @@ void FTerm::setXTermCursorColor (const FString& cc)
// Set the text cursor color
if ( xterm_terminal || screen_terminal
|| mintty_terminal || urxvt_terminal
|| osc_support )
|| FTermcap::osc_support )
{
oscPrefix();
putstringf (OSC "12;%s" BEL, cc.c_str());
@ -2595,7 +2695,8 @@ void FTerm::setXTermCursorColor (const FString& cc)
void FTerm::setXTermMouseForeground (const FString& mfg)
{
// Set the mouse foreground color
if ( xterm_terminal || screen_terminal || urxvt_terminal || osc_support )
if ( xterm_terminal || screen_terminal
|| urxvt_terminal || FTermcap::osc_support )
{
oscPrefix();
putstringf (OSC "13;%s" BEL, mfg.c_str());
@ -2608,7 +2709,7 @@ void FTerm::setXTermMouseForeground (const FString& mfg)
void FTerm::setXTermMouseBackground (const FString& mbg)
{
// Set the mouse background color
if ( xterm_terminal || screen_terminal || osc_support )
if ( xterm_terminal || screen_terminal || FTermcap::osc_support )
{
oscPrefix();
putstringf (OSC "14;%s" BEL, mbg.c_str());
@ -2621,7 +2722,8 @@ void FTerm::setXTermMouseBackground (const FString& mbg)
void FTerm::setXTermHighlightBackground (const FString& hbg)
{
// Set the highlight background color
if ( xterm_terminal || screen_terminal || urxvt_terminal || osc_support )
if ( xterm_terminal || screen_terminal
|| urxvt_terminal || FTermcap::osc_support )
{
oscPrefix();
putstringf (OSC "17;%s" BEL, hbg.c_str());
@ -2634,7 +2736,7 @@ void FTerm::setXTermHighlightBackground (const FString& hbg)
void FTerm::resetXTermColors()
{
// Reset the entire color table
if ( xterm_terminal || screen_terminal || osc_support )
if ( xterm_terminal || screen_terminal || FTermcap::osc_support )
{
oscPrefix();
putstringf (OSC "104" BEL);
@ -2647,7 +2749,7 @@ void FTerm::resetXTermColors()
void FTerm::resetXTermForeground()
{
// Reset the VT100 text foreground color
if ( xterm_terminal || screen_terminal || osc_support )
if ( xterm_terminal || screen_terminal || FTermcap::osc_support )
{
oscPrefix();
putstring (OSC "110" BEL);
@ -2660,7 +2762,7 @@ void FTerm::resetXTermForeground()
void FTerm::resetXTermBackground()
{
// Reset the VT100 text background color
if ( xterm_terminal || screen_terminal || osc_support )
if ( xterm_terminal || screen_terminal || FTermcap::osc_support )
{
oscPrefix();
putstring (OSC "111" BEL);
@ -2673,7 +2775,7 @@ void FTerm::resetXTermBackground()
void FTerm::resetXTermCursorColor()
{
// Reset the text cursor color
if ( xterm_terminal || screen_terminal || osc_support )
if ( xterm_terminal || screen_terminal || FTermcap::osc_support )
{
oscPrefix();
putstring (OSC "112" BEL);
@ -2686,7 +2788,7 @@ void FTerm::resetXTermCursorColor()
void FTerm::resetXTermMouseForeground()
{
// Reset the mouse foreground color
if ( xterm_terminal || screen_terminal || osc_support )
if ( xterm_terminal || screen_terminal || FTermcap::osc_support )
{
oscPrefix();
putstring (OSC "113" BEL);
@ -2699,7 +2801,7 @@ void FTerm::resetXTermMouseForeground()
void FTerm::resetXTermMouseBackground()
{
// Reset the mouse background color
if ( xterm_terminal || screen_terminal || osc_support )
if ( xterm_terminal || screen_terminal || FTermcap::osc_support )
{
oscPrefix();
putstring (OSC "114" BEL);
@ -2712,7 +2814,8 @@ void FTerm::resetXTermMouseBackground()
void FTerm::resetXTermHighlightBackground()
{
// Reset the highlight background color
if ( xterm_terminal || screen_terminal || urxvt_terminal || osc_support )
if ( xterm_terminal || screen_terminal
|| urxvt_terminal || FTermcap::osc_support )
{
oscPrefix();
putstringf (OSC "117" BEL);
@ -2803,77 +2906,6 @@ void FTerm::setPalette (short index, int r, int g, int b)
std::fflush(stdout);
}
//----------------------------------------------------------------------
void FTerm::xtermMouse (bool on)
{
// activate/deactivate the xterm mouse support
if ( ! mouse_support )
return;
if ( on )
putstring (CSI "?1001s" // save old highlight mouse tracking
CSI "?1000h" // enable x11 mouse tracking
CSI "?1002h" // enable cell motion mouse tracking
CSI "?1015h" // enable urxvt mouse mode
CSI "?1006h"); // enable SGR mouse mode
else
putstring (CSI "?1006l" // disable SGR mouse mode
CSI "?1015l" // disable urxvt mouse mode
CSI "?1002l" // disable cell motion mouse tracking
CSI "?1000l" // disable x11 mouse tracking
CSI "?1001r"); // restore old highlight mouse tracking
std::fflush(stdout);
}
#ifdef F_HAVE_LIBGPM
//----------------------------------------------------------------------
bool FTerm::gpmMouse (bool on)
{
// activate/deactivate the gpm mouse support
if ( ! linux_terminal )
return false;
if ( openConsole() == 0 )
{
if ( ! isConsole() )
return false;
closeConsole();
}
if ( on )
{
Gpm_Connect conn;
conn.eventMask = uInt16(~GPM_MOVE);
conn.defaultMask = GPM_MOVE;
conn.maxMod = uInt16(~0);
conn.minMod = 0;
Gpm_Open(&conn, 0);
switch ( gpm_fd )
{
case -1:
return false;
case -2:
Gpm_Close();
return false;
default:
break;
}
}
else
{
Gpm_Close();
}
return on;
}
#endif // F_HAVE_LIBGPM
//----------------------------------------------------------------------
void FTerm::setBeep (int Hz, int ms)
{
@ -3092,7 +3124,7 @@ bool FTerm::setRawMode (bool on)
}
//----------------------------------------------------------------------
FString FTerm::getAnswerbackMsg()
const FString FTerm::getAnswerbackMsg()
{
FString answerback = "";
@ -3128,7 +3160,7 @@ FString FTerm::getAnswerbackMsg()
}
//----------------------------------------------------------------------
FString FTerm::getSecDA()
const FString FTerm::getSecDA()
{
FString sec_da_str = "";

View File

@ -129,28 +129,17 @@ class FTerm
static bool linux_terminal;
static bool screen_terminal;
static bool tmux_terminal;
static bool background_color_erase;
static bool automatic_left_margin;
static bool automatic_right_margin;
static bool eat_nl_glitch;
static bool ansi_default_color;
static bool osc_support;
static char termtype[30];
static char* term_name;
static char* locale_name;
static char* locale_xterm;
static uChar x11_button_state;
static FRect* term; // current terminal geometry
static FPoint* mouse; // mouse click position
static int stdin_status_flags;
static int stdin_no;
static int stdout_no;
static int max_color;
static int fd_tty;
static uInt baudrate;
static bool resize_term;
static char exit_message[8192];
static struct termios term_init;
@ -177,6 +166,15 @@ class FTerm
dacreg d[16];
} map;
protected:
static int stdin_no;
static int stdout_no;
static bool NewFont;
static bool VGAFont;
static bool cursor_optimisation;
static fc::encoding Encoding;
static char exit_message[8192];
static struct modifier_key // bit field
{
uChar shift : 1; // 0..1
@ -186,58 +184,62 @@ class FTerm
uChar : 4; // padding bits
} mod_key;
protected:
static bool NewFont;
static bool VGAFont;
static bool cursor_optimisation;
static uInt tabstop;
static uInt attr_without_color;
static fc::encoding Encoding;
private:
// Disable copy constructor
FTerm (const FTerm&);
// Disable assignment operator (=)
FTerm& operator = (const FTerm&);
static void outb_Attribute_Controller (int, int);
static int inb_Attribute_Controller (int);
static int getFramebuffer_bpp();
static int openConsole();
static int closeConsole();
static int isConsole();
static void identifyTermType();
static int getScreenFont();
static int setScreenFont (uChar*, uInt, uInt, uInt, bool = false);
static int setUnicodeMap (struct unimapdesc*);
static int getUnicodeMap ();
static int setBlinkAsIntensity (bool);
static void init_console();
static uInt getBaudRate (const struct termios*);
static void init_consoleCharMap();
static char* init_256colorTerminal();
static char* parseAnswerbackMsg (char*&);
static char* parseSecDA (char*&);
static void oscPrefix();
static void oscPostfix();
static void init_alt_charset();
static void init_pc_charset();
static void init_termcaps();
static void init_encoding();
void init();
void finish();
static uInt charEncode (uInt);
static uInt charEncode (uInt, fc::encoding);
static uInt cp437_to_unicode (uChar);
static void signal_handler (int);
// Friend classes
friend class FWidget;
friend class FVTerm;
friend class FApplication;
static void outb_Attribute_Controller (int, int);
static int inb_Attribute_Controller (int);
static int getFramebuffer_bpp();
static int openConsole();
static int closeConsole();
static int isConsole();
static void identifyTermType();
static int getScreenFont();
static int setScreenFont (uChar*, uInt, uInt, uInt, bool = false);
static int setUnicodeMap (struct unimapdesc*);
static int getUnicodeMap ();
static int setBlinkAsIntensity (bool);
static void init_console();
static uInt getBaudRate (const struct termios*);
static char* init_256colorTerminal();
static char* parseAnswerbackMsg (char*&);
static char* parseSecDA (char*&);
static void oscPrefix();
static void oscPostfix();
static void init_alt_charset();
static void init_pc_charset();
static void init_termcaps();
static void init_encoding();
void init();
void finish();
static uInt cp437_to_unicode (uChar);
static void signal_handler (int);
protected:
static bool charEncodable (uInt);
static void init_consoleCharMap();
static bool charEncodable (uInt);
static uInt charEncode (uInt);
static uInt charEncode (uInt, fc::encoding);
static char* changeAttribute ( FOptiAttr::char_data*&
, FOptiAttr::char_data*& );
static bool hasChangedTermSize();
static void changeTermSizeFinished();
static void xtermMouse (bool);
static void enableXTermMouse();
static void disableXTermMouse();
#ifdef F_HAVE_LIBGPM
static bool gpmMouse (bool);
static bool enableGpmMouse();
static bool disableGpmMouse();
static bool isGpmMouseEnabled();
#endif // F_HAVE_LIBGPM
static FPoint& getMousePos();
static void setMousePos (FPoint&);
static void setMousePos (short, short);
public:
// Constructor
@ -245,125 +247,164 @@ class FTerm
// Destructor
virtual ~FTerm();
virtual const char* getClassName() const;
static bool isKeyTimeout (timeval*, register long);
static int parseKeyString (char*, int, timeval*);
static bool& unprocessedInput();
static int getLineNumber();
static int getColumnNumber();
static FString getKeyName (int);
static void getModifierKey();
virtual const char* getClassName() const;
static bool isKeyTimeout (timeval*, register long);
static int parseKeyString (char*, int, timeval*);
static bool& unprocessedInput();
static int getLineNumber();
static int getColumnNumber();
static FString getKeyName (int);
static modifier_key& getModifierKey();
static char* getTermType();
static char* getTermName();
static uInt getTabstop();
static bool hasPCcharset();
static bool hasUTF8();
static bool hasVT100();
static bool hasASCII();
static bool isMonochron();
static bool isXTerminal();
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 isCygwinTerminal();
static bool isMinttyTerm();
static bool isLinuxTerm();
static bool isScreenTerm();
static bool isTmuxTerm();
static bool isInputDataPending();
static bool setVGAFont();
static bool setNewFont();
static bool isNewFont();
static bool setOldFont();
static bool setCursorOptimisation (bool);
static fc::consoleCursorStyle getConsoleCursor();
static void setConsoleCursor (fc::consoleCursorStyle, bool);
static char* moveCursor (int, int, int, int);
static char* enableCursor();
static char* disableCursor();
static void detectTermSize();
static void setTermSize (int, int);
static void setKDECursor (fc::kdeKonsoleCursorShape);
static const FString getXTermFont();
static const FString getXTermTitle();
static void setXTermCursorStyle (fc::xtermCursorStyle);
static void setXTermTitle (const FString&);
static void setXTermForeground (const FString&);
static void setXTermBackground (const FString&);
static void setXTermCursorColor (const FString&);
static void setXTermMouseForeground (const FString&);
static void setXTermMouseBackground (const FString&);
static void setXTermHighlightBackground (const FString&);
static void resetXTermColors();
static void resetXTermForeground();
static void resetXTermBackground();
static void resetXTermCursorColor();
static void resetXTermMouseForeground();
static void resetXTermMouseBackground();
static void resetXTermHighlightBackground();
static void saveColorMap();
static void resetColorMap();
static void setPalette (short, int, int, int);
static int getMaxColor();
static void setBeep (int, int);
static void resetBeep();
static void beep();
static char* getTermType();
static char* getTermName();
static bool hasPCcharset();
static bool hasUTF8();
static bool hasVT100();
static bool hasASCII();
static bool isMonochron();
static bool isXTerminal();
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 isCygwinTerminal();
static bool isMinttyTerm();
static bool isLinuxTerm();
static bool isScreenTerm();
static bool isTmuxTerm();
static bool setVGAFont();
static bool setNewFont();
static bool isNewFont();
static bool setOldFont();
static bool setCursorOptimisation (bool);
static void setConsoleCursor (fc::consoleCursorStyle, bool);
static char* moveCursor (int, int, int, int);
static char* enableCursor();
static char* disableCursor();
static void getTermSize();
static void setTermSize (int, int);
static void setKDECursor (fc::kdeKonsoleCursorShape);
static FString getXTermFont();
static FString getXTermTitle();
static void setXTermCursorStyle (fc::xtermCursorStyle);
static void setXTermTitle (const FString&);
static void setXTermForeground (const FString&);
static void setXTermBackground (const FString&);
static void setXTermCursorColor (const FString&);
static void setXTermMouseForeground (const FString&);
static void setXTermMouseBackground (const FString&);
static void setXTermHighlightBackground (const FString&);
static void resetXTermColors();
static void resetXTermForeground();
static void resetXTermBackground();
static void resetXTermCursorColor();
static void resetXTermMouseForeground();
static void resetXTermMouseBackground();
static void resetXTermHighlightBackground();
static void saveColorMap();
static void resetColorMap();
static void setPalette (short, int, int, int);
static int getMaxColor();
static void xtermMouse (bool);
static void enableXTermMouse();
static void disableXTermMouse();
static void setEncoding (std::string);
static std::string getEncoding();
#ifdef F_HAVE_LIBGPM
static bool gpmMouse (bool);
static bool enableGpmMouse();
static bool disableGpmMouse();
#endif // F_HAVE_LIBGPM
static bool setNonBlockingInput (bool);
static bool setNonBlockingInput();
static bool unsetNonBlockingInput();
static void setBeep (int, int);
static void resetBeep();
static void beep();
static bool scrollTermForward();
static bool scrollTermReverse();
static void setEncoding (std::string);
static std::string getEncoding();
static bool setUTF8 (bool);
static bool setUTF8();
static bool unsetUTF8();
static bool isUTF8();
static bool isUTF8_linux_terminal();
static bool setNonBlockingInput (bool);
static bool setNonBlockingInput();
static bool unsetNonBlockingInput();
static bool setRawMode (bool);
static bool setRawMode();
static bool unsetRawMode();
static bool setCookedMode();
static bool isRaw();
static bool scrollTermForward();
static bool scrollTermReverse();
static const FString getAnswerbackMsg();
static const FString getSecDA();
static bool setUTF8 (bool);
static bool setUTF8();
static bool unsetUTF8();
static bool isUTF8();
static bool isUTF8_linux_terminal();
static bool setRawMode (bool);
static bool setRawMode();
static bool unsetRawMode();
static bool setCookedMode();
static bool isRaw();
static FString getAnswerbackMsg();
static FString getSecDA();
static int (*Fputchar)(int); // function pointer -> static function
static void putstringf (const char*, ...)
// function pointer -> static function
static int (*Fputchar)(int);
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 int putchar_ASCII (register int);
static int putchar_UTF8 (register int);
static int UTF8decode (char*);
;
static void putstring (const char*, int = 1);
static int putchar_ASCII (register int);
static int putchar_UTF8 (register int);
static int UTF8decode (char*);
};
#pragma pack(pop)
// FTerm inline functions
//----------------------------------------------------------------------
inline bool FTerm::hasChangedTermSize()
{ return resize_term; }
//----------------------------------------------------------------------
inline void FTerm::changeTermSizeFinished()
{ resize_term = false; }
//----------------------------------------------------------------------
inline void FTerm::enableXTermMouse()
{ xtermMouse(true); }
//----------------------------------------------------------------------
inline void FTerm::disableXTermMouse()
{ xtermMouse(false); }
#ifdef F_HAVE_LIBGPM
//----------------------------------------------------------------------
inline bool FTerm::enableGpmMouse()
{ return gpmMouse(true); }
//----------------------------------------------------------------------
inline bool FTerm::disableGpmMouse()
{ return gpmMouse(false); }
//----------------------------------------------------------------------
inline bool FTerm::isGpmMouseEnabled()
{ return gpm_mouse_enabled; }
#endif // F_HAVE_LIBGPM
//----------------------------------------------------------------------
inline FPoint& FTerm::getMousePos()
{ return *mouse; }
//----------------------------------------------------------------------
inline void FTerm::setMousePos (FPoint& m)
{ *mouse = m; }
//----------------------------------------------------------------------
inline void FTerm::setMousePos (short x, short y)
{ mouse->setPoint (x, y); }
//----------------------------------------------------------------------
inline bool FTerm::setNonBlockingInput()
{ return setNonBlockingInput(true); }
//----------------------------------------------------------------------
inline const char* FTerm::getClassName() const
{ return "FTerm"; }
@ -376,6 +417,10 @@ inline char* FTerm::getTermType()
inline char* FTerm::getTermName()
{ return term_name; }
//----------------------------------------------------------------------
inline uInt FTerm::getTabstop()
{ return FTermcap::tabstop; }
//----------------------------------------------------------------------
inline bool FTerm::hasPCcharset()
{ return pc_charset_console; }
@ -456,6 +501,10 @@ inline bool FTerm::isScreenTerm()
inline bool FTerm::isTmuxTerm()
{ return tmux_terminal; }
//----------------------------------------------------------------------
inline bool FTerm::isInputDataPending()
{ return input_data_pending; }
//----------------------------------------------------------------------
inline bool FTerm::setCursorOptimisation (bool on)
{ return cursor_optimisation = (on) ? true : false; }
@ -466,29 +515,7 @@ inline bool FTerm::isRaw()
//----------------------------------------------------------------------
inline int FTerm::getMaxColor()
{ return max_color; }
//----------------------------------------------------------------------
inline void FTerm::enableXTermMouse()
{ xtermMouse(true); }
//----------------------------------------------------------------------
inline void FTerm::disableXTermMouse()
{ xtermMouse(false); }
#ifdef F_HAVE_LIBGPM
//----------------------------------------------------------------------
inline bool FTerm::enableGpmMouse()
{ return gpmMouse(true); }
//----------------------------------------------------------------------
inline bool FTerm::disableGpmMouse()
{ return gpmMouse(false); }
#endif // F_HAVE_LIBGPM
//----------------------------------------------------------------------
inline bool FTerm::setNonBlockingInput()
{ return setNonBlockingInput(true); }
{ return FTermcap::max_color; }
//----------------------------------------------------------------------
inline bool FTerm::unsetNonBlockingInput()

View File

@ -29,6 +29,16 @@ class FTermcap
}
tcap_map;
static bool background_color_erase;
static bool automatic_left_margin;
static bool automatic_right_margin;
static bool eat_nl_glitch;
static bool ansi_default_color;
static bool osc_support;
static int max_color;
static uInt tabstop;
static uInt attr_without_color;
private:
static tcap_map* tcap;

View File

@ -823,7 +823,7 @@ void FTextView::insert (const FString& str, int pos)
if ( str.isEmpty() )
s = "\n";
else
s = FString(str).rtrim().expandTabs(tabstop);
s = FString(str).rtrim().expandTabs(getTabstop());
iter = data.begin();
text_split = s.split("\r\n");

View File

@ -11,9 +11,9 @@ static FVTerm* init_object = 0;
// static class attributes
bool FVTerm::hidden_cursor;
bool FVTerm::terminal_update_complete;
bool FVTerm::terminal_update_pending;
bool FVTerm::force_terminal_update;
bool FVTerm::terminal_updates;
bool FVTerm::stop_terminal_updates;
bool FVTerm::vterm_updates;
int FVTerm::skipped_terminal_update = 0;
@ -40,7 +40,7 @@ FVTerm::FVTerm (FVTerm* parent)
, print_area(0)
, vwin(0)
{
terminal_updates = false;
terminal_update_complete = false;
vterm_updates = true;
if ( ! parent )
@ -103,11 +103,12 @@ void FVTerm::init()
tcap = FTermcap().getTermcapMap();
// create virtual terminal
createVTerm (*term);
FRect term_geometry (1, 1, getColumnNumber(), getLineNumber());
createVTerm (term_geometry);
// create virtual desktop area
FPoint shadow_size(0,0);
createArea (*term, shadow_size, vdesktop);
createArea (term_geometry, shadow_size, vdesktop);
vdesktop->visible = true;
active_area = vdesktop;
@ -1250,6 +1251,18 @@ FOptiAttr::char_data FVTerm::getOverlappedCharacter ( const FPoint& pos
return getCharacter (overlapped_character, pos.getX(), pos.getY(), obj);
}
//----------------------------------------------------------------------
void FVTerm::startTerminalUpdate()
{
terminal_update_complete = false;
}
//----------------------------------------------------------------------
void FVTerm::finishTerminalUpdate()
{
terminal_update_complete = true;
}
//----------------------------------------------------------------------
void FVTerm::setTermXY (register int x, register int y)
{
@ -1260,8 +1273,8 @@ void FVTerm::setTermXY (register int x, register int y)
if ( term_pos->getX() == x && term_pos->getY() == y )
return;
term_width = term->getWidth();
term_height = term->getHeight();
term_width = getColumnNumber();
term_height = getLineNumber();
if ( x >= term_width )
{
@ -1315,7 +1328,7 @@ bool FVTerm::hideCursor (bool on)
flush_out();
if ( ! hidden_cursor && isLinuxTerm() )
setConsoleCursor (console_cursor_style, false);
setConsoleCursor (getConsoleCursor(), false);
return hidden_cursor;
}
@ -1381,10 +1394,10 @@ void FVTerm::updateTerminal()
if ( ! force_terminal_update )
{
if ( ! terminal_updates )
if ( ! terminal_update_complete )
return;
if ( input_data_pending )
if ( isInputDataPending() )
{
terminal_update_pending = true;
return;
@ -1431,11 +1444,11 @@ void FVTerm::updateTerminal()
term_pos->x_ref()--;
else
{
if ( eat_nl_glitch )
if ( FTermcap::eat_nl_glitch )
{
term_pos->setPoint(-1,-1);
}
else if ( automatic_right_margin )
else if ( FTermcap::automatic_right_margin )
{
term_pos->setX(0);
term_pos->y_ref()++;
@ -1502,7 +1515,9 @@ void FVTerm::processTerminalUpdate()
bool FVTerm::isInsideTerminal (int x, int y)
{
// Check whether the coordinates are within the virtual terminal
if ( term->contains(x,y) )
FRect term_geometry (1, 1, getColumnNumber(), getLineNumber());
if ( term_geometry.contains(x,y) )
return true;
else
return false;
@ -1650,6 +1665,7 @@ int FVTerm::print (FVTerm::term_area* area, FString& s)
assert ( ! s.isNull() );
register int len = 0;
const wchar_t* p;
uInt tabstop = getTabstop();
FWidget* window;
if ( ! area )
@ -1975,7 +1991,7 @@ inline void FVTerm::charsetChanges (FOptiAttr::char_data*& next_char)
{
next_char->pc_charset = true;
if ( isXTerminal() && utf8_console && ch < 0x20 ) // Character 0x00..0x1f
if ( isXTerminal() && hasUTF8() && ch < 0x20 ) // Character 0x00..0x1f
next_char->code = int(charEncode(code, fc::ASCII));
}
}
@ -1998,7 +2014,7 @@ inline void FVTerm::appendAttributes (FOptiAttr::char_data*& next_attr)
FOptiAttr::char_data* term_attr = &term_attribute;
// generate attribute string for the next character
attr_str = opti_attr->change_attribute (term_attr, next_attr);
attr_str = changeAttribute (term_attr, next_attr);
if ( attr_str )
appendOutputBuffer (attr_str);
@ -2010,7 +2026,7 @@ int FVTerm::appendLowerRight (FOptiAttr::char_data*& screen_char)
char* SA = tcap[fc::t_enter_am_mode].string;
char* RA = tcap[fc::t_exit_am_mode].string;
if ( ! automatic_right_margin )
if ( ! FTermcap::automatic_right_margin )
{
appendCharacter (screen_char);
}
@ -2029,8 +2045,8 @@ int FVTerm::appendLowerRight (FOptiAttr::char_data*& screen_char)
char* ip = tcap[fc::t_insert_padding].string;
char* ic = tcap[fc::t_insert_character].string;
x = term->getWidth() - 2;
y = term->getHeight() - 1;
x = getColumnNumber() - 2;
y = getLineNumber() - 1;
setTermXY (x, y);
appendCharacter (screen_char);
term_pos->x_ref()++;

View File

@ -11,10 +11,17 @@
// │ │
// └─────┬─────┘
// │
// ▕▔▔▔▔▔▔▔▔▏
// ▕ FVTerm ▏
// ▕▁▁▁▁▁▁▁▁▏
// ▕▔▔▔▔▔▔▔▔▏ 1 *▕▔▔▔▔▔▔▔▔▔▏
// ▕ FVTerm ▏-┬- - - -▕ FString ▏
// ▕▁▁▁▁▁▁▁▁▏ : ▕▁▁▁▁▁▁▁▁▁▏
// :
// : *▕▔▔▔▔▔▔▔▔▏
// :- - - -▕ FPoint ▏
// : ▕▁▁▁▁▁▁▁▁▏
// :
// : *▕▔▔▔▔▔▔▔▏
// └- - - -▕ FRect ▏
// ▕▁▁▁▁▁▁▁▏
#ifndef _FVTERM_H
#define _FVTERM_H
@ -47,9 +54,9 @@ class FVTerm : public FObject, public FTerm
static FTermcap::tcap_map* tcap;
static bool hidden_cursor;
static bool terminal_update_complete;
static bool terminal_update_pending;
static bool force_terminal_update;
static bool terminal_updates;
static bool stop_terminal_updates;
static bool vterm_updates;
static int skipped_terminal_update;
@ -128,6 +135,8 @@ class FVTerm : public FObject, public FTerm
static FOptiAttr::char_data getCoveredCharacter (int, int, FVTerm*);
static FOptiAttr::char_data getOverlappedCharacter (const FPoint&, FVTerm*);
static FOptiAttr::char_data getOverlappedCharacter (int, int, FVTerm*);
static void startTerminalUpdate();
static void finishTerminalUpdate();
private:
// Disable copy constructor
@ -135,13 +144,10 @@ class FVTerm : public FObject, public FTerm
// Disable assignment operator (=)
FVTerm& operator = (const FVTerm&);
void init();
void finish();
term_area* getPrintArea();
void setPrintArea (term_area*);
// Friend class
friend class FWidget;
void init();
void finish();
term_area* getPrintArea();
void setPrintArea (term_area*);
public:
// Constructor
@ -151,59 +157,142 @@ class FVTerm : public FObject, public FTerm
virtual const char* getClassName() const;
static void setTermXY (register int, register int);
static void setTermXY (register int, register int);
static bool hideCursor (bool);
static bool hideCursor();
static bool showCursor();
static bool isCursorHidden();
static bool hideCursor (bool);
static bool hideCursor();
static bool showCursor();
static bool isCursorHidden();
static short getTermForegroundColor();
static short getTermBackgroundColor();
FVTerm::term_area* getVWin() const;
void createVTerm (const FRect&);
void createVTerm (int, int);
static void resizeVTerm (const FRect&);
static void resizeVTerm (int, int);
static void putVTerm();
static void updateTerminal (bool);
static void updateTerminal();
static bool updateTerminalCursor();
static void processTerminalUpdate();
static bool isInsideTerminal (int, int);
static short getTermForegroundColor();
static short getTermBackgroundColor();
FVTerm::term_area* getVWin() const;
void createVTerm (const FRect&);
void createVTerm (int, int);
static void resizeVTerm (const FRect&);
static void resizeVTerm (int, int);
static void putVTerm();
static void updateTerminal (bool);
static void updateTerminal();
static bool updateTerminalCursor();
static void processTerminalUpdate();
static bool isInsideTerminal (int, int);
void setPrintCursor (const FPoint&);
void setPrintCursor (register int, register int);
FPoint* getPrintPos() const;
int printf (const wchar_t*, ...);
int printf (const char*, ...)
void setPrintCursor (const FPoint&);
void setPrintCursor (register int, register int);
FPoint* getPrintPos() const;
int printf (const wchar_t*, ...);
int printf (const char*, ...)
#if defined(__clang__)
__attribute__((__format__ (__printf__, 2, 3)))
#elif defined(__GNUC__)
__attribute__ ((format (printf, 2, 3)))
#endif
;
int print (const std::wstring&);
int print (FVTerm::term_area*, const std::wstring&);
int print (const wchar_t*);
int print (FVTerm::term_area*, const wchar_t*);
int print (const char*);
int print (FVTerm::term_area*, const char*);
int print (const std::string&);
int print (FVTerm::term_area*, const std::string&);
int print (FString&);
int print (FVTerm::term_area*, FString&);
int print (int);
int print (FVTerm::term_area*, int);
static void newFontChanges (FOptiAttr::char_data*&);
static void charsetChanges (FOptiAttr::char_data*&);
static void appendCharacter (FOptiAttr::char_data*&);
static void appendAttributes (FOptiAttr::char_data*&);
static int appendLowerRight (FOptiAttr::char_data*&);
static void appendOutputBuffer (std::string&);
static void appendOutputBuffer (const char*);
static int appendOutputBuffer (int);
static void flush_out();
;
int print (const std::wstring&);
int print (FVTerm::term_area*, const std::wstring&);
int print (const wchar_t*);
int print (FVTerm::term_area*, const wchar_t*);
int print (const char*);
int print (FVTerm::term_area*, const char*);
int print (const std::string&);
int print (FVTerm::term_area*, const std::string&);
int print (FString&);
int print (FVTerm::term_area*, FString&);
int print (int);
int print (FVTerm::term_area*, int);
static void newFontChanges (FOptiAttr::char_data*&);
static void charsetChanges (FOptiAttr::char_data*&);
static void appendCharacter (FOptiAttr::char_data*&);
static void appendAttributes (FOptiAttr::char_data*&);
static int appendLowerRight (FOptiAttr::char_data*&);
static void appendOutputBuffer (std::string&);
static void appendOutputBuffer (const char*);
static int appendOutputBuffer (int);
static void flush_out();
void setColor (short, short);
static void setNormal();
static bool setBold (register bool);
static bool setBold();
static bool unsetBold();
static bool isBold();
static bool setDim (register bool);
static bool setDim();
static bool unsetDim();
static bool isDim();
static bool setItalic (register bool);
static bool setItalic();
static bool unsetItalic();
static bool isItalic();
static bool setUnderline (register bool);
static bool setUnderline();
static bool unsetUnderline();
static bool isUnderline();
static bool setBlink (register bool);
static bool setBlink();
static bool unsetBlink();
static bool isBlink();
static bool setReverse (register bool);
static bool setReverse();
static bool unsetReverse();
static bool isReverse();
static bool setStandout (register bool);
static bool setStandout();
static bool unsetStandout();
static bool isStandout();
static bool setInvisible (register bool);
static bool setInvisible();
static bool unsetInvisible();
static bool isInvisible();
static bool setProtected (register bool);
static bool setProtected();
static bool unsetProtected();
static bool isProtected();
static bool setCrossedOut (register bool);
static bool setCrossedOut();
static bool unsetCrossedOut();
static bool isCrossedOut();
static bool setDoubleUnderline (register bool);
static bool setDoubleUnderline();
static bool unsetDoubleUnderline();
static bool isDoubleUnderline();
static bool setAltCharset (register bool);
static bool setAltCharset();
static bool unsetAltCharset();
static bool isAltCharset();
static bool setPCcharset (register bool);
static bool setPCcharset();
static bool unsetPCcharset();
static bool isPCcharset();
static bool setTransparent (register bool);
static bool setTransparent();
static bool unsetTransparent();
static bool isTransparent();
static bool setTransShadow (register bool);
static bool setTransShadow();
static bool unsetTransShadow();
static bool isTransShadow();
static bool setInheritBackground (register bool);
static bool setInheritBackground();
static bool unsetInheritBackground();
static bool isInheritBackground();
};
#pragma pack(pop)
@ -249,4 +338,293 @@ inline void FVTerm::setPrintCursor (const FPoint& pos)
inline void FVTerm::setPrintCursor (register int x, register int y)
{ cursor->setPoint(x,y); }
//----------------------------------------------------------------------
inline void FVTerm::setColor (register short fg, register short bg)
{
// Changes colors
next_attribute.fg_color = fg;
next_attribute.bg_color = bg;
}
//----------------------------------------------------------------------
inline void FVTerm::setNormal()
{
// reset all character attributes
next_attribute.bold = \
next_attribute.dim = \
next_attribute.italic = \
next_attribute.underline = \
next_attribute.blink = \
next_attribute.reverse = \
next_attribute.standout = \
next_attribute.invisible = \
next_attribute.protect = \
next_attribute.crossed_out = \
next_attribute.dbl_underline = \
next_attribute.alt_charset = \
next_attribute.pc_charset = \
next_attribute.transparent = \
next_attribute.trans_shadow = \
next_attribute.inherit_bg = false;
next_attribute.fg_color = fc::Default;
next_attribute.bg_color = fc::Default;
}
//----------------------------------------------------------------------
inline bool FVTerm::setBold (register bool on)
{ return (next_attribute.bold = on); }
//----------------------------------------------------------------------
inline bool FVTerm::setBold()
{ return setBold(true); }
//----------------------------------------------------------------------
inline bool FVTerm::unsetBold()
{ return setBold(false); }
//----------------------------------------------------------------------
inline bool FVTerm::isBold()
{ return next_attribute.bold; }
//----------------------------------------------------------------------
inline bool FVTerm::setDim (register bool on)
{ return (next_attribute.dim = on); }
//----------------------------------------------------------------------
inline bool FVTerm::setDim()
{ return setDim(true); }
//----------------------------------------------------------------------
inline bool FVTerm::unsetDim()
{ return setDim(false); }
//----------------------------------------------------------------------
inline bool FVTerm::isDim()
{ return next_attribute.dim; }
//----------------------------------------------------------------------
inline bool FVTerm::setItalic (register bool on)
{ return (next_attribute.italic = on); }
//----------------------------------------------------------------------
inline bool FVTerm::setItalic()
{ return setItalic(true); }
//----------------------------------------------------------------------
inline bool FVTerm::unsetItalic()
{ return setItalic(false); }
//----------------------------------------------------------------------
inline bool FVTerm::isItalic()
{ return next_attribute.italic; }
//----------------------------------------------------------------------
inline bool FVTerm::setUnderline (register bool on)
{ return (next_attribute.underline = on); }
//----------------------------------------------------------------------
inline bool FVTerm::setUnderline()
{ return setUnderline(true); }
//----------------------------------------------------------------------
inline bool FVTerm::unsetUnderline()
{ return setUnderline(false); }
//----------------------------------------------------------------------
inline bool FVTerm::isUnderline()
{ return next_attribute.underline; }
//----------------------------------------------------------------------
inline bool FVTerm::setBlink (register bool on)
{ return (next_attribute.blink = on); }
//----------------------------------------------------------------------
inline bool FVTerm::setBlink()
{ return setBlink(true); }
//----------------------------------------------------------------------
inline bool FVTerm::unsetBlink()
{ return setBlink(false); }
//----------------------------------------------------------------------
inline bool FVTerm::isBlink()
{ return next_attribute.blink; }
//----------------------------------------------------------------------
inline bool FVTerm::setReverse (register bool on)
{ return (next_attribute.reverse = on); }
//----------------------------------------------------------------------
inline bool FVTerm::setReverse()
{ return setReverse(true); }
//----------------------------------------------------------------------
inline bool FVTerm::unsetReverse()
{ return setReverse(false); }
//----------------------------------------------------------------------
inline bool FVTerm::isReverse()
{ return next_attribute.reverse; }
//----------------------------------------------------------------------
inline bool FVTerm::setStandout (register bool on)
{ return (next_attribute.standout = on); }
//----------------------------------------------------------------------
inline bool FVTerm::setStandout()
{ return setStandout(true); }
//----------------------------------------------------------------------
inline bool FVTerm::unsetStandout()
{ return setStandout(false); }
//----------------------------------------------------------------------
inline bool FVTerm::isStandout()
{ return next_attribute.standout; }
//----------------------------------------------------------------------
inline bool FVTerm::setInvisible (register bool on)
{ return (next_attribute.invisible = on); }
//----------------------------------------------------------------------
inline bool FVTerm::setInvisible()
{ return setInvisible(true); }
//----------------------------------------------------------------------
inline bool FVTerm::unsetInvisible()
{ return setInvisible(false); }
//----------------------------------------------------------------------
inline bool FVTerm::isInvisible()
{ return next_attribute.invisible; }
//----------------------------------------------------------------------
inline bool FVTerm::setProtected (register bool on)
{ return (next_attribute.protect = on); }
//----------------------------------------------------------------------
inline bool FVTerm::setProtected()
{ return setProtected(true); }
//----------------------------------------------------------------------
inline bool FVTerm::unsetProtected()
{ return setProtected(false); }
//----------------------------------------------------------------------
inline bool FVTerm::isProtected()
{ return next_attribute.protect; }
//----------------------------------------------------------------------
inline bool FVTerm::setCrossedOut (register bool on)
{ return (next_attribute.crossed_out = on); }
//----------------------------------------------------------------------
inline bool FVTerm::setCrossedOut()
{ return setCrossedOut(true); }
//----------------------------------------------------------------------
inline bool FVTerm::unsetCrossedOut()
{ return setCrossedOut(false); }
//----------------------------------------------------------------------
inline bool FVTerm::isCrossedOut()
{ return next_attribute.crossed_out; }
//----------------------------------------------------------------------
inline bool FVTerm::setDoubleUnderline (register bool on)
{ return (next_attribute.dbl_underline = on); }
//----------------------------------------------------------------------
inline bool FVTerm::setDoubleUnderline()
{ return setDoubleUnderline(true); }
//----------------------------------------------------------------------
inline bool FVTerm::unsetDoubleUnderline()
{ return setDoubleUnderline(false); }
//----------------------------------------------------------------------
inline bool FVTerm::isDoubleUnderline()
{ return next_attribute.dbl_underline; }
//----------------------------------------------------------------------
inline bool FVTerm::setAltCharset (register bool on)
{ return (next_attribute.alt_charset = on); }
//----------------------------------------------------------------------
inline bool FVTerm::setAltCharset()
{ return setAltCharset(true); }
//----------------------------------------------------------------------
inline bool FVTerm::unsetAltCharset()
{ return setAltCharset(false); }
//----------------------------------------------------------------------
inline bool FVTerm::isAltCharset()
{ return next_attribute.alt_charset; }
//----------------------------------------------------------------------
inline bool FVTerm::setPCcharset (register bool on)
{ return (next_attribute.pc_charset = on); }
//----------------------------------------------------------------------
inline bool FVTerm::setPCcharset()
{ return setPCcharset(true); }
//----------------------------------------------------------------------
inline bool FVTerm::unsetPCcharset()
{ return setPCcharset(false); }
//----------------------------------------------------------------------
inline bool FVTerm::isPCcharset()
{ return next_attribute.pc_charset; }
//----------------------------------------------------------------------
inline bool FVTerm::setTransparent (register bool on)
{ return (next_attribute.transparent = on); }
//----------------------------------------------------------------------
inline bool FVTerm::setTransparent()
{ return setTransparent(true); }
//----------------------------------------------------------------------
inline bool FVTerm::unsetTransparent()
{ return setTransparent(false); }
//----------------------------------------------------------------------
inline bool FVTerm::isTransparent()
{ return next_attribute.transparent; }
//----------------------------------------------------------------------
inline bool FVTerm::setTransShadow (register bool on)
{ return (next_attribute.trans_shadow = on); }
//----------------------------------------------------------------------
inline bool FVTerm::setTransShadow()
{ return setTransShadow(true); }
//----------------------------------------------------------------------
inline bool FVTerm::unsetTransShadow()
{ return setTransShadow(false); }
//----------------------------------------------------------------------
inline bool FVTerm::isTransShadow()
{ return next_attribute.trans_shadow; }
//----------------------------------------------------------------------
inline bool FVTerm::setInheritBackground (register bool on)
{ return (next_attribute.inherit_bg = on); }
//----------------------------------------------------------------------
inline bool FVTerm::setInheritBackground()
{ return setInheritBackground(true); }
//----------------------------------------------------------------------
inline bool FVTerm::unsetInheritBackground()
{ return setInheritBackground(false); }
//----------------------------------------------------------------------
inline bool FVTerm::isInheritBackground()
{ return next_attribute.inherit_bg; }
#endif // _FVTERM_H

View File

@ -58,8 +58,6 @@ FWidget::FWidget (FWidget* parent)
, background_color(fc::Default)
, statusbar_message()
{
resize_term = false;
if ( ! parent )
{
assert ( ! rootObject
@ -125,10 +123,10 @@ void FWidget::init()
close_widget = new widgetList();
// determine width and height of the terminal
getTermSize();
wsize.setRect(1, 1, term->getWidth(), term->getHeight());
detectTermSize();
wsize.setRect(1, 1, getColumnNumber(), getLineNumber());
adjust_wsize = wsize;
offset.setRect(0, 0, term->getWidth(), term->getHeight());
offset.setRect(0, 0, getColumnNumber(), getLineNumber());
client_offset = offset;
double_flatline_mask.top.resize (uLong(getWidth()), false);
@ -270,13 +268,13 @@ void FWidget::setColorTheme()
wc.progressbar_fg = fc::DarkGray;
wc.progressbar_bg = fc::LightBlue;
if ( kde_konsole )
if ( isKdeTerminal() )
wc.term_bg = fc::SteelBlue3;
if ( tera_terminal )
if ( isTeraTerm() )
wc.term_bg = fc::LightBlue;
if ( max_color < 16 ) // for 8 color mode
if ( getMaxColor() < 16 ) // for 8 color mode
{
wc.term_fg = fc::Black;
wc.term_bg = fc::Blue;
@ -1198,7 +1196,7 @@ void FWidget::redraw()
if ( isRootWidget() )
{
terminal_updates = false;
startTerminalUpdate();
// clean desktop
setColor (wc.term_fg, wc.term_bg);
clearArea (vdesktop);
@ -1279,7 +1277,7 @@ void FWidget::redraw()
}
if ( isRootWidget() )
terminal_updates = true;
finishTerminalUpdate();
if ( redraw_root_widget == this )
{
@ -1292,11 +1290,10 @@ void FWidget::redraw()
//----------------------------------------------------------------------
void FWidget::resize()
{
if ( isRootWidget() && openConsole() == 0 )
if ( isRootWidget() )
{
getTermSize();
detectTermSize();
const FRect& term_geometry = getGeometry();
closeConsole();
resizeVTerm (term_geometry);
resizeArea (term_geometry, getShadow(), vdesktop);
adjustSizeGlobal();
@ -1317,12 +1314,14 @@ void FWidget::show()
if ( ! visible )
return;
if ( getMainWidget() == this && ! (NewFont || VGAFont) )
// Important: Do not use setNewFont() or setVGAFont() after
// the console character mapping has been initialized
if ( getMainWidget() == this )
init_consoleCharMap();
if ( ! show_root_widget )
{
terminal_updates = false;
startTerminalUpdate();
show_root_widget = this;
}
@ -1348,7 +1347,7 @@ void FWidget::show()
if ( show_root_widget && show_root_widget == this )
{
terminal_updates = true;
finishTerminalUpdate();
updateTerminal();
flush_out();
show_root_widget = 0;
@ -1534,16 +1533,7 @@ bool FWidget::setFocus (bool on)
void FWidget::setColor ()
{
// Changes colors to the widget default colors
next_attribute.fg_color = foreground_color;
next_attribute.bg_color = background_color;
}
//----------------------------------------------------------------------
void FWidget::setColor (register short fg, register short bg)
{
// Changes colors
next_attribute.fg_color = fg;
next_attribute.bg_color = bg;
setColor (foreground_color, background_color);
}
//----------------------------------------------------------------------
@ -1799,24 +1789,18 @@ void FWidget::setTermOffsetWithPadding()
}
//----------------------------------------------------------------------
void FWidget::getTermSize()
void FWidget::detectTermSize()
{
FWidget* r = rootObject;
if ( openConsole() == 0 )
{
FTerm::getTermSize();
closeConsole();
}
r->adjust_wsize.setRect (1, 1, term->getWidth(), term->getHeight());
r->offset.setRect (0, 0, term->getWidth(), term->getHeight());
FTerm::detectTermSize();
r->adjust_wsize.setRect (1, 1, getColumnNumber(), getLineNumber());
r->offset.setRect (0, 0, getColumnNumber(), getLineNumber());
r->client_offset.setCoordinates
(
r->padding.left,
r->padding.top,
term->getWidth() - 1 - r->padding.right,
term->getHeight() - 1 - r->padding.bottom
getColumnNumber() - 1 - r->padding.right,
getLineNumber() - 1 - r->padding.bottom
);
}
@ -1829,7 +1813,7 @@ void FWidget::setTermSize (int w, int h)
rootObject->wsize.setRect(1, 1, w, h);
rootObject->adjust_wsize = rootObject->wsize;
FTerm::setTermSize (w, h); // w = columns / h = lines
getTermSize();
detectTermSize();
}
}

View File

@ -314,7 +314,7 @@ class FWidget : public FVTerm
static FWidget* show_root_widget;
static FWidget* redraw_root_widget;
friend class FApplication;
// Friend classes
friend class FToggleButton;
private:
@ -473,7 +473,8 @@ class FWidget : public FVTerm
void setForegroundColor (short);
void setBackgroundColor (short);
void setColor();
void setColor (short, short);
// make every setColor from FVTerm available
using FVTerm::setColor;
void setX (int, bool = true);
void setY (int, bool = true);
virtual void setPos (const FPoint&, bool = true);
@ -488,7 +489,7 @@ class FWidget : public FVTerm
void setParentOffset();
void setTermOffset();
void setTermOffsetWithPadding();
void getTermSize();
void detectTermSize();
void setTermSize (int, int);
virtual void setGeometry (const FRect&, bool = true);
virtual void setGeometry (int, int, int, int, bool = true);
@ -509,88 +510,6 @@ class FWidget : public FVTerm
void setPrintPos (register int, register int);
FPoint getPrintPos() const;
static void setNormal();
static bool setBold (register bool);
static bool setBold();
static bool unsetBold();
static bool isBold();
static bool setDim (register bool);
static bool setDim();
static bool unsetDim();
static bool isDim();
static bool setItalic (register bool);
static bool setItalic();
static bool unsetItalic();
static bool isItalic();
static bool setUnderline (register bool);
static bool setUnderline();
static bool unsetUnderline();
static bool isUnderline();
static bool setBlink (register bool);
static bool setBlink();
static bool unsetBlink();
static bool isBlink();
static bool setReverse (register bool);
static bool setReverse();
static bool unsetReverse();
static bool isReverse();
static bool setStandout (register bool);
static bool setStandout();
static bool unsetStandout();
static bool isStandout();
static bool setInvisible (register bool);
static bool setInvisible();
static bool unsetInvisible();
static bool isInvisible();
static bool setProtected (register bool);
static bool setProtected();
static bool unsetProtected();
static bool isProtected();
static bool setCrossedOut (register bool);
static bool setCrossedOut();
static bool unsetCrossedOut();
static bool isCrossedOut();
static bool setDoubleUnderline (register bool);
static bool setDoubleUnderline();
static bool unsetDoubleUnderline();
static bool isDoubleUnderline();
static bool setAltCharset (register bool);
static bool setAltCharset();
static bool unsetAltCharset();
static bool isAltCharset();
static bool setPCcharset (register bool);
static bool setPCcharset();
static bool unsetPCcharset();
static bool isPCcharset();
static bool setTransparent (register bool);
static bool setTransparent();
static bool unsetTransparent();
static bool isTransparent();
static bool setTransShadow (register bool);
static bool setTransShadow();
static bool unsetTransShadow();
static bool isTransShadow();
static bool setInheritBackground (register bool);
static bool setInheritBackground();
static bool unsetInheritBackground();
static bool isInheritBackground();
void drawShadow();
void clearShadow();
void drawFlatBorder();
@ -928,286 +847,6 @@ inline void FWidget::unsetCursorPos()
inline void FWidget::setPrintPos (const FPoint& pos)
{ setPrintPos (pos.getX(), pos.getY()); }
//----------------------------------------------------------------------
inline void FWidget::setNormal()
{
next_attribute.bold = \
next_attribute.dim = \
next_attribute.italic = \
next_attribute.underline = \
next_attribute.blink = \
next_attribute.reverse = \
next_attribute.standout = \
next_attribute.invisible = \
next_attribute.protect = \
next_attribute.crossed_out = \
next_attribute.dbl_underline = \
next_attribute.alt_charset = \
next_attribute.pc_charset = \
next_attribute.transparent = \
next_attribute.trans_shadow = \
next_attribute.inherit_bg = false;
next_attribute.fg_color = fc::Default;
next_attribute.bg_color = fc::Default;
}
//----------------------------------------------------------------------
inline bool FWidget::setBold (register bool on)
{ return (next_attribute.bold = on); }
//----------------------------------------------------------------------
inline bool FWidget::setBold()
{ return setBold(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetBold()
{ return setBold(false); }
//----------------------------------------------------------------------
inline bool FWidget::isBold()
{ return next_attribute.bold; }
//----------------------------------------------------------------------
inline bool FWidget::setDim (register bool on)
{ return (next_attribute.dim = on); }
//----------------------------------------------------------------------
inline bool FWidget::setDim()
{ return setDim(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetDim()
{ return setDim(false); }
//----------------------------------------------------------------------
inline bool FWidget::isDim()
{ return next_attribute.dim; }
//----------------------------------------------------------------------
inline bool FWidget::setItalic (register bool on)
{ return (next_attribute.italic = on); }
//----------------------------------------------------------------------
inline bool FWidget::setItalic()
{ return setItalic(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetItalic()
{ return setItalic(false); }
//----------------------------------------------------------------------
inline bool FWidget::isItalic()
{ return next_attribute.italic; }
//----------------------------------------------------------------------
inline bool FWidget::setUnderline (register bool on)
{ return (next_attribute.underline = on); }
//----------------------------------------------------------------------
inline bool FWidget::setUnderline()
{ return setUnderline(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetUnderline()
{ return setUnderline(false); }
//----------------------------------------------------------------------
inline bool FWidget::isUnderline()
{ return next_attribute.underline; }
//----------------------------------------------------------------------
inline bool FWidget::setBlink (register bool on)
{ return (next_attribute.blink = on); }
//----------------------------------------------------------------------
inline bool FWidget::setBlink()
{ return setBlink(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetBlink()
{ return setBlink(false); }
//----------------------------------------------------------------------
inline bool FWidget::isBlink()
{ return next_attribute.blink; }
//----------------------------------------------------------------------
inline bool FWidget::setReverse (register bool on)
{ return (next_attribute.reverse = on); }
//----------------------------------------------------------------------
inline bool FWidget::setReverse()
{ return setReverse(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetReverse()
{ return setReverse(false); }
//----------------------------------------------------------------------
inline bool FWidget::isReverse()
{ return next_attribute.reverse; }
//----------------------------------------------------------------------
inline bool FWidget::setStandout (register bool on)
{ return (next_attribute.standout = on); }
//----------------------------------------------------------------------
inline bool FWidget::setStandout()
{ return setStandout(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetStandout()
{ return setStandout(false); }
//----------------------------------------------------------------------
inline bool FWidget::isStandout()
{ return next_attribute.standout; }
//----------------------------------------------------------------------
inline bool FWidget::setInvisible (register bool on)
{ return (next_attribute.invisible = on); }
//----------------------------------------------------------------------
inline bool FWidget::setInvisible()
{ return setInvisible(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetInvisible()
{ return setInvisible(false); }
//----------------------------------------------------------------------
inline bool FWidget::isInvisible()
{ return next_attribute.invisible; }
//----------------------------------------------------------------------
inline bool FWidget::setProtected (register bool on)
{ return (next_attribute.protect = on); }
//----------------------------------------------------------------------
inline bool FWidget::setProtected()
{ return setProtected(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetProtected()
{ return setProtected(false); }
//----------------------------------------------------------------------
inline bool FWidget::isProtected()
{ return next_attribute.protect; }
//----------------------------------------------------------------------
inline bool FWidget::setCrossedOut (register bool on)
{ return (next_attribute.crossed_out = on); }
//----------------------------------------------------------------------
inline bool FWidget::setCrossedOut()
{ return setCrossedOut(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetCrossedOut()
{ return setCrossedOut(false); }
//----------------------------------------------------------------------
inline bool FWidget::isCrossedOut()
{ return next_attribute.crossed_out; }
//----------------------------------------------------------------------
inline bool FWidget::setDoubleUnderline (register bool on)
{ return (next_attribute.dbl_underline = on); }
//----------------------------------------------------------------------
inline bool FWidget::setDoubleUnderline()
{ return setDoubleUnderline(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetDoubleUnderline()
{ return setDoubleUnderline(false); }
//----------------------------------------------------------------------
inline bool FWidget::isDoubleUnderline()
{ return next_attribute.dbl_underline; }
//----------------------------------------------------------------------
inline bool FWidget::setAltCharset (register bool on)
{ return (next_attribute.alt_charset = on); }
//----------------------------------------------------------------------
inline bool FWidget::setAltCharset()
{ return setAltCharset(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetAltCharset()
{ return setAltCharset(false); }
//----------------------------------------------------------------------
inline bool FWidget::isAltCharset()
{ return next_attribute.alt_charset; }
//----------------------------------------------------------------------
inline bool FWidget::setPCcharset (register bool on)
{ return (next_attribute.pc_charset = on); }
//----------------------------------------------------------------------
inline bool FWidget::setPCcharset()
{ return setPCcharset(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetPCcharset()
{ return setPCcharset(false); }
//----------------------------------------------------------------------
inline bool FWidget::isPCcharset()
{ return next_attribute.pc_charset; }
//----------------------------------------------------------------------
inline bool FWidget::setTransparent (register bool on)
{ return (next_attribute.transparent = on); }
//----------------------------------------------------------------------
inline bool FWidget::setTransparent()
{ return setTransparent(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetTransparent()
{ return setTransparent(false); }
//----------------------------------------------------------------------
inline bool FWidget::isTransparent()
{ return next_attribute.transparent; }
//----------------------------------------------------------------------
inline bool FWidget::setTransShadow (register bool on)
{ return (next_attribute.trans_shadow = on); }
//----------------------------------------------------------------------
inline bool FWidget::setTransShadow()
{ return setTransShadow(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetTransShadow()
{ return setTransShadow(false); }
//----------------------------------------------------------------------
inline bool FWidget::isTransShadow()
{ return next_attribute.trans_shadow; }
//----------------------------------------------------------------------
inline bool FWidget::setInheritBackground (register bool on)
{ return (next_attribute.inherit_bg = on); }
//----------------------------------------------------------------------
inline bool FWidget::setInheritBackground()
{ return setInheritBackground(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetInheritBackground()
{ return setInheritBackground(false); }
//----------------------------------------------------------------------
inline bool FWidget::isInheritBackground()
{ return next_attribute.inherit_bg; }
//----------------------------------------------------------------------
inline void FWidget::unsetDoubleFlatLine (int side)
{ setDoubleFlatLine(side, false); }

View File

@ -7,7 +7,7 @@
#include "fwindow.h"
// static attributes
FWindow* FWindow::previous_widget = 0;
FWindow* FWindow::previous_window = 0;
//----------------------------------------------------------------------
@ -33,8 +33,8 @@ FWindow::~FWindow() // destructor
{
FApplication* fapp = static_cast<FApplication*>(getRootWidget());
if ( previous_widget == this )
previous_widget = 0;
if ( previous_window == this )
previous_window = 0;
if ( isAlwaysOnTop() )
deleteFromAlwaysOnTopList (this);
@ -665,7 +665,7 @@ void FWindow::switchToPrevWindow()
bool FWindow::activatePrevWindow()
{
// activate the previous window
FWindow* w = previous_widget;
FWindow* w = previous_window;
if ( w )
{

View File

@ -55,7 +55,7 @@ class FWindow : public FWidget
FRect normalGeometry;
protected:
static FWindow* previous_widget;
static FWindow* previous_window;
private:
// Disable copy constructor