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

View File

@ -1120,7 +1120,7 @@ void FDialog::onWindowActive (FEvent*)
void FDialog::onWindowInactive (FEvent*) void FDialog::onWindowInactive (FEvent*)
{ {
if ( dialog_menu && ! dialog_menu->isVisible() ) if ( dialog_menu && ! dialog_menu->isVisible() )
FWindow::previous_widget = this; FWindow::previous_window = this;
if ( isVisible() && isEnabled() ) if ( isVisible() && isEnabled() )
drawTitleBar(); 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; fake_reverse = false;
attr_buf[0] = '\0'; attr_buf[0] = '\0';

View File

@ -234,7 +234,7 @@ class FOptiAttr
void set_orig_orig_colors (char*&); void set_orig_orig_colors (char*&);
void init(); 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&);
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::stdin_no;
int FTerm::stdout_no; int FTerm::stdout_no;
int FTerm::fd_tty; int FTerm::fd_tty;
int FTerm::max_color;
int FTerm::stdin_status_flags; int FTerm::stdin_status_flags;
uInt FTerm::baudrate; uInt FTerm::baudrate;
uInt FTerm::tabstop;
uInt FTerm::attr_without_color;
bool FTerm::resize_term; bool FTerm::resize_term;
bool FTerm::mouse_support; bool FTerm::mouse_support;
bool FTerm::raw_mode; bool FTerm::raw_mode;
@ -36,11 +33,6 @@ bool FTerm::non_blocking_stdin;
bool FTerm::gpm_mouse_enabled; bool FTerm::gpm_mouse_enabled;
bool FTerm::color256; bool FTerm::color256;
bool FTerm::monochron; 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::xterm_terminal;
bool FTerm::rxvt_terminal; bool FTerm::rxvt_terminal;
bool FTerm::urxvt_terminal; bool FTerm::urxvt_terminal;
@ -66,8 +58,6 @@ bool FTerm::ascii_console;
bool FTerm::NewFont; bool FTerm::NewFont;
bool FTerm::VGAFont; bool FTerm::VGAFont;
bool FTerm::cursor_optimisation; bool FTerm::cursor_optimisation;
bool FTerm::osc_support;
uChar FTerm::x11_button_state;
termios FTerm::term_init; termios FTerm::term_init;
char FTerm::termtype[30] = ""; char FTerm::termtype[30] = "";
char* FTerm::term_name = 0; char* FTerm::term_name = 0;
@ -76,20 +66,29 @@ char* FTerm::locale_xterm = 0;
FPoint* FTerm::mouse = 0; FPoint* FTerm::mouse = 0;
FRect* FTerm::term = 0; FRect* FTerm::term = 0;
char FTerm::exit_message[8192] = ""; char FTerm::exit_message[8192] = "";
fc::encoding FTerm::Encoding; fc::encoding FTerm::Encoding;
const FString* FTerm::xterm_font = 0; const FString* FTerm::xterm_font = 0;
const FString* FTerm::xterm_title = 0; const FString* FTerm::xterm_title = 0;
const FString* FTerm::answer_back = 0; const FString* FTerm::answer_back = 0;
const FString* FTerm::sec_da = 0; const FString* FTerm::sec_da = 0;
FOptiMove* FTerm::opti_move = 0; FOptiMove* FTerm::opti_move = 0;
FOptiAttr* FTerm::opti_attr = 0; FOptiAttr* FTerm::opti_attr = 0;
FTerm::modifier_key FTerm::mod_key; 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>* \ std::map<std::string,fc::encoding>* \
FTerm::encoding_set = 0; FTerm::encoding_set = 0;
FTermcap::tcap_map* FTermcap::tcap = 0; FTermcap::tcap_map* FTerm::tcap = term_caps;
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; console_font_op FTerm::screen_font;
unimapdesc FTerm::screen_unicode_map; unimapdesc FTerm::screen_unicode_map;
fc::consoleCursorStyle FTerm::console_cursor_style; fc::consoleCursorStyle FTerm::console_cursor_style;
@ -104,6 +103,8 @@ fc::consoleCursorStyle FTerm::console_cursor_style;
FTerm::FTerm() FTerm::FTerm()
: map() : map()
{ {
resize_term = false;
if ( ! term_initialized ) if ( ! term_initialized )
{ {
init(); init();
@ -660,7 +661,7 @@ bool& FTerm::unprocessedInput()
int FTerm::getLineNumber() int FTerm::getLineNumber()
{ {
if ( term->getHeight() == 0 ) if ( term->getHeight() == 0 )
getTermSize(); detectTermSize();
return term->getHeight(); return term->getHeight();
} }
@ -669,7 +670,7 @@ int FTerm::getLineNumber()
int FTerm::getColumnNumber() int FTerm::getColumnNumber()
{ {
if ( term->getWidth() == 0 ) if ( term->getWidth() == 0 )
getTermSize(); detectTermSize();
return term->getWidth(); return term->getWidth();
} }
@ -688,7 +689,7 @@ FString FTerm::getKeyName (int keynum)
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FTerm::getModifierKey() FTerm::modifier_key& FTerm::getModifierKey()
{ {
char subcode = 6; char subcode = 6;
// fill bit field with 0 // fill bit field with 0
@ -709,11 +710,14 @@ void FTerm::getModifierKey()
if ( subcode & (1 << KG_ALT) ) if ( subcode & (1 << KG_ALT) )
mod_key.alt = true; mod_key.alt = true;
} }
return mod_key;
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FTerm::init_console() void FTerm::init_console()
{ {
// initialize terminal and Linux console
fd_tty = -1; fd_tty = -1;
screen_unicode_map.entries = 0; screen_unicode_map.entries = 0;
screen_font.data = 0; screen_font.data = 0;
@ -726,7 +730,7 @@ void FTerm::init_console()
getScreenFont(); getScreenFont();
} }
getTermSize(); detectTermSize();
closeConsole(); closeConsole();
} }
else else
@ -763,30 +767,6 @@ uInt FTerm::getBaudRate (const struct termios* termios_p)
return ospeed[cfgetospeed(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) void FTerm::signal_handler (int signum)
{ {
@ -1221,48 +1201,48 @@ void FTerm::init_termcaps()
char* key_up_string; char* key_up_string;
// screen erased with the background color // 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 // 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 // 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 // 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 // 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) // terminal supports operating system commands (OSC)
// OSC = Esc + ']' // OSC = Esc + ']'
osc_support = tgetflag(const_cast<char*>("XT")); FTermcap::osc_support = tgetflag(const_cast<char*>("XT"));
if ( isTeraTerm() ) if ( isTeraTerm() )
eat_nl_glitch = true; FTermcap::eat_nl_glitch = true;
// maximum number of colors on screen // 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 ) if ( FTermcap::max_color < 0 )
max_color = 1; FTermcap::max_color = 1;
if ( max_color < 8 ) if ( FTermcap::max_color < 8 )
monochron = true; monochron = true;
else else
monochron = false; monochron = false;
tabstop = uInt(tgetnum(const_cast<char*>("it"))); FTermcap::tabstop = uInt(tgetnum(const_cast<char*>("it")));
attr_without_color = uInt(tgetnum(const_cast<char*>("NC"))); FTermcap::attr_without_color = uInt(tgetnum(const_cast<char*>("NC")));
// gnome-terminal has NC=16 however, it can use the dim attribute // gnome-terminal has NC=16 however, it can use the dim attribute
if ( gnome_terminal ) if ( gnome_terminal )
attr_without_color = 0; FTermcap::attr_without_color = 0;
// PuTTY has NC=22 however, it can show underline and reverse // PuTTY has NC=22 however, it can show underline and reverse
if ( putty_terminal ) if ( putty_terminal )
attr_without_color = 16; FTermcap::attr_without_color = 16;
// read termcap output strings // read termcap output strings
for (int i=0; tcap[i].tname[0] != 0; i++) 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 // 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_home (tcap[fc::t_cursor_home].string);
opti_move->set_cursor_to_ll (tcap[fc::t_cursor_to_ll].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); 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_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_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_parm_right_cursor (tcap[fc::t_parm_right_cursor].string);
opti_move->set_auto_left_margin (automatic_left_margin); opti_move->set_auto_left_margin (FTermcap::automatic_left_margin);
opti_move->set_eat_newline_glitch (eat_nl_glitch); opti_move->set_eat_newline_glitch (FTermcap::eat_nl_glitch);
//opti_move->printDurations(); //opti_move->printDurations();
// attribute settings // 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_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_exit_bold_mode (tcap[fc::t_exit_bold_mode].string);
opti_attr->set_enter_dim_mode (tcap[fc::t_enter_dim_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_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_pair (tcap[fc::t_orig_pair].string);
opti_attr->set_orig_orig_colors (tcap[fc::t_orig_colors].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(); opti_attr->setDefaultColorSupport();
if ( cygwin_terminal ) if ( cygwin_terminal )
@ -1642,8 +1622,6 @@ void FTerm::init()
char* new_termtype = 0; char* new_termtype = 0;
term_initialized = true; term_initialized = true;
init_term_object = this; init_term_object = this;
x11_button_state = 0x03;
max_color = 1;
fd_tty = -1; fd_tty = -1;
opti_move = new FOptiMove(); opti_move = new FOptiMove();
opti_attr = new FOptiAttr(); opti_attr = new FOptiAttr();
@ -1681,8 +1659,7 @@ void FTerm::init()
mlterm_terminal = \ mlterm_terminal = \
mintty_terminal = \ mintty_terminal = \
screen_terminal = \ screen_terminal = \
tmux_terminal = \ tmux_terminal = false;
background_color_erase = false;
// Preset to true // Preset to true
cursor_optimisation = true; cursor_optimisation = true;
@ -1882,33 +1859,33 @@ void FTerm::init()
unsetNonBlockingInput(); unsetNonBlockingInput();
} }
if ( (max_color == 8) if ( (FTermcap::max_color == 8)
&& ( linux_terminal && ( linux_terminal
|| cygwin_terminal || cygwin_terminal
|| putty_terminal || putty_terminal
|| tera_terminal || tera_terminal
|| rxvt_terminal) ) || rxvt_terminal) )
{ {
max_color = 16; FTermcap::max_color = 16;
} }
if ( linux_terminal && openConsole() == 0 ) if ( linux_terminal && openConsole() == 0 )
{ {
if ( isConsole() ) if ( isConsole() )
if ( setBlinkAsIntensity(true) != 0 ) if ( setBlinkAsIntensity(true) != 0 )
max_color = 8; FTermcap::max_color = 8;
closeConsole(); closeConsole();
setConsoleCursor(fc::underscore_cursor, true); setConsoleCursor(fc::underscore_cursor, true);
} }
if ( linux_terminal && getFramebuffer_bpp() >= 4 ) if ( linux_terminal && getFramebuffer_bpp() >= 4 )
max_color = 16; FTermcap::max_color = 16;
if ( kde_konsole ) if ( kde_konsole )
setKDECursor(fc::UnderlineCursor); setKDECursor(fc::UnderlineCursor);
if ( max_color >= 16 if ( FTermcap::max_color >= 16
&& ! cygwin_terminal && ! cygwin_terminal
&& ! kde_konsole && ! kde_konsole
&& ! tera_terminal ) && ! tera_terminal )
@ -1987,7 +1964,7 @@ void FTerm::finish()
resetXTermHighlightBackground(); resetXTermHighlightBackground();
setXTermCursorStyle(fc::steady_block); setXTermCursorStyle(fc::steady_block);
if ( max_color >= 16 && ! (kde_konsole || tera_terminal) ) if ( FTermcap::max_color >= 16 && ! (kde_konsole || tera_terminal) )
{ {
// reset screen settings // reset screen settings
setPalette (fc::Cyan, 0x18, 0xb2, 0xb2); setPalette (fc::Cyan, 0x18, 0xb2, 0xb2);
@ -2019,7 +1996,7 @@ void FTerm::finish()
resetBeep(); resetBeep();
if ( linux_terminal if ( linux_terminal
&& background_color_erase && FTermcap::background_color_erase
&& tcap[fc::t_clear_screen].string ) && tcap[fc::t_clear_screen].string )
{ {
int rows = term->getHeight(); int rows = term->getHeight();
@ -2102,6 +2079,59 @@ void FTerm::finish()
delete opti_move; 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) 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 if ( ! isConsole() )
{ return false;
ucs = cp437_to_ucs[i][1];
break; 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 switch ( gpm_fd )
//---------------------------------------------------------------------- {
bool FTerm::charEncodable (uInt c) case -1:
{ return false;
uInt ch = charEncode(c);
return bool(ch > 0 && ch != c); case -2:
Gpm_Close();
return false;
default:
break;
}
}
else
{
Gpm_Close();
}
return on;
} }
#endif // F_HAVE_LIBGPM
// public methods of FTerm // public methods of FTerm
@ -2166,7 +2249,7 @@ bool FTerm::setVGAFont()
VGAFont = true; VGAFont = true;
if ( xterm_terminal || screen_terminal || osc_support ) if ( xterm_terminal || screen_terminal || FTermcap::osc_support )
{ {
// Set font in xterm to vga // Set font in xterm to vga
oscPrefix(); oscPrefix();
@ -2204,7 +2287,7 @@ bool FTerm::setVGAFont()
else else
VGAFont = false; VGAFont = false;
getTermSize(); detectTermSize();
closeConsole(); closeConsole();
} }
else else
@ -2234,7 +2317,8 @@ bool FTerm::setNewFont()
|| mintty_terminal ) || mintty_terminal )
return false; return false;
if ( xterm_terminal || screen_terminal || urxvt_terminal || osc_support ) if ( xterm_terminal || screen_terminal
|| urxvt_terminal || FTermcap::osc_support )
{ {
NewFont = true; NewFont = true;
// Set font in xterm to 8x16graph // Set font in xterm to 8x16graph
@ -2274,7 +2358,7 @@ bool FTerm::setNewFont()
setUnicodeMap(&unimap); setUnicodeMap(&unimap);
} }
getTermSize(); detectTermSize();
closeConsole(); closeConsole();
} }
@ -2300,7 +2384,8 @@ bool FTerm::setOldFont()
NewFont = \ NewFont = \
VGAFont = false; 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 ) if ( xterm_font && xterm_font->getLength() > 2 )
{ {
@ -2347,7 +2432,7 @@ bool FTerm::setOldFont()
} }
getTermSize(); detectTermSize();
closeConsole(); closeConsole();
} }
} }
@ -2355,6 +2440,12 @@ bool FTerm::setOldFont()
return retval; return retval;
} }
//----------------------------------------------------------------------
fc::consoleCursorStyle FTerm::getConsoleCursor()
{
return console_cursor_style;
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FTerm::setConsoleCursor (fc::consoleCursorStyle style, bool hidden) 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; struct winsize win_size;
bool close_after_detect = false;
int ret; int ret;
if ( fd_tty < 0 ) if ( fd_tty < 0 ) // console is already closed
return; {
if ( openConsole() != 0 )
return;
close_after_detect = true;
}
ret = ioctl (fd_tty, TIOCGWINSZ, &win_size); ret = ioctl (fd_tty, TIOCGWINSZ, &win_size);
@ -2432,6 +2529,9 @@ void FTerm::getTermSize()
} }
opti_move->setTermSize (term->getWidth(), term->getHeight()); 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(""); FString font("");
if ( xterm_terminal || screen_terminal || osc_support ) if ( xterm_terminal || screen_terminal || FTermcap::osc_support )
{ {
if ( raw_mode && non_blocking_stdin ) if ( raw_mode && non_blocking_stdin )
{ {
@ -2491,7 +2591,7 @@ FString FTerm::getXTermFont()
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
FString FTerm::getXTermTitle() const FString FTerm::getXTermTitle()
{ {
FString title(""); FString title("");
@ -2537,7 +2637,7 @@ void FTerm::setXTermTitle (const FString& title)
// Set the xterm title // Set the xterm title
if ( xterm_terminal || screen_terminal if ( xterm_terminal || screen_terminal
|| mintty_terminal || putty_terminal || mintty_terminal || putty_terminal
|| osc_support ) || FTermcap::osc_support )
{ {
oscPrefix(); oscPrefix();
putstringf (OSC "0;%s" BEL, title.c_str()); putstringf (OSC "0;%s" BEL, title.c_str());
@ -2552,7 +2652,7 @@ void FTerm::setXTermForeground (const FString& fg)
// Set the VT100 text foreground color // Set the VT100 text foreground color
if ( xterm_terminal || screen_terminal if ( xterm_terminal || screen_terminal
|| mintty_terminal || mlterm_terminal || mintty_terminal || mlterm_terminal
|| osc_support ) || FTermcap::osc_support )
{ {
oscPrefix(); oscPrefix();
putstringf (OSC "10;%s" BEL, fg.c_str()); putstringf (OSC "10;%s" BEL, fg.c_str());
@ -2567,7 +2667,7 @@ void FTerm::setXTermBackground (const FString& bg)
// Set the VT100 text background color // Set the VT100 text background color
if ( xterm_terminal || screen_terminal if ( xterm_terminal || screen_terminal
|| mintty_terminal || mlterm_terminal || mintty_terminal || mlterm_terminal
|| osc_support ) || FTermcap::osc_support )
{ {
oscPrefix(); oscPrefix();
putstringf (OSC "11;%s" BEL, bg.c_str()); putstringf (OSC "11;%s" BEL, bg.c_str());
@ -2582,7 +2682,7 @@ void FTerm::setXTermCursorColor (const FString& cc)
// Set the text cursor color // Set the text cursor color
if ( xterm_terminal || screen_terminal if ( xterm_terminal || screen_terminal
|| mintty_terminal || urxvt_terminal || mintty_terminal || urxvt_terminal
|| osc_support ) || FTermcap::osc_support )
{ {
oscPrefix(); oscPrefix();
putstringf (OSC "12;%s" BEL, cc.c_str()); putstringf (OSC "12;%s" BEL, cc.c_str());
@ -2595,7 +2695,8 @@ void FTerm::setXTermCursorColor (const FString& cc)
void FTerm::setXTermMouseForeground (const FString& mfg) void FTerm::setXTermMouseForeground (const FString& mfg)
{ {
// Set the mouse foreground color // 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(); oscPrefix();
putstringf (OSC "13;%s" BEL, mfg.c_str()); putstringf (OSC "13;%s" BEL, mfg.c_str());
@ -2608,7 +2709,7 @@ void FTerm::setXTermMouseForeground (const FString& mfg)
void FTerm::setXTermMouseBackground (const FString& mbg) void FTerm::setXTermMouseBackground (const FString& mbg)
{ {
// Set the mouse background color // Set the mouse background color
if ( xterm_terminal || screen_terminal || osc_support ) if ( xterm_terminal || screen_terminal || FTermcap::osc_support )
{ {
oscPrefix(); oscPrefix();
putstringf (OSC "14;%s" BEL, mbg.c_str()); putstringf (OSC "14;%s" BEL, mbg.c_str());
@ -2621,7 +2722,8 @@ void FTerm::setXTermMouseBackground (const FString& mbg)
void FTerm::setXTermHighlightBackground (const FString& hbg) void FTerm::setXTermHighlightBackground (const FString& hbg)
{ {
// Set the highlight background color // 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(); oscPrefix();
putstringf (OSC "17;%s" BEL, hbg.c_str()); putstringf (OSC "17;%s" BEL, hbg.c_str());
@ -2634,7 +2736,7 @@ void FTerm::setXTermHighlightBackground (const FString& hbg)
void FTerm::resetXTermColors() void FTerm::resetXTermColors()
{ {
// Reset the entire color table // Reset the entire color table
if ( xterm_terminal || screen_terminal || osc_support ) if ( xterm_terminal || screen_terminal || FTermcap::osc_support )
{ {
oscPrefix(); oscPrefix();
putstringf (OSC "104" BEL); putstringf (OSC "104" BEL);
@ -2647,7 +2749,7 @@ void FTerm::resetXTermColors()
void FTerm::resetXTermForeground() void FTerm::resetXTermForeground()
{ {
// Reset the VT100 text foreground color // Reset the VT100 text foreground color
if ( xterm_terminal || screen_terminal || osc_support ) if ( xterm_terminal || screen_terminal || FTermcap::osc_support )
{ {
oscPrefix(); oscPrefix();
putstring (OSC "110" BEL); putstring (OSC "110" BEL);
@ -2660,7 +2762,7 @@ void FTerm::resetXTermForeground()
void FTerm::resetXTermBackground() void FTerm::resetXTermBackground()
{ {
// Reset the VT100 text background color // Reset the VT100 text background color
if ( xterm_terminal || screen_terminal || osc_support ) if ( xterm_terminal || screen_terminal || FTermcap::osc_support )
{ {
oscPrefix(); oscPrefix();
putstring (OSC "111" BEL); putstring (OSC "111" BEL);
@ -2673,7 +2775,7 @@ void FTerm::resetXTermBackground()
void FTerm::resetXTermCursorColor() void FTerm::resetXTermCursorColor()
{ {
// Reset the text cursor color // Reset the text cursor color
if ( xterm_terminal || screen_terminal || osc_support ) if ( xterm_terminal || screen_terminal || FTermcap::osc_support )
{ {
oscPrefix(); oscPrefix();
putstring (OSC "112" BEL); putstring (OSC "112" BEL);
@ -2686,7 +2788,7 @@ void FTerm::resetXTermCursorColor()
void FTerm::resetXTermMouseForeground() void FTerm::resetXTermMouseForeground()
{ {
// Reset the mouse foreground color // Reset the mouse foreground color
if ( xterm_terminal || screen_terminal || osc_support ) if ( xterm_terminal || screen_terminal || FTermcap::osc_support )
{ {
oscPrefix(); oscPrefix();
putstring (OSC "113" BEL); putstring (OSC "113" BEL);
@ -2699,7 +2801,7 @@ void FTerm::resetXTermMouseForeground()
void FTerm::resetXTermMouseBackground() void FTerm::resetXTermMouseBackground()
{ {
// Reset the mouse background color // Reset the mouse background color
if ( xterm_terminal || screen_terminal || osc_support ) if ( xterm_terminal || screen_terminal || FTermcap::osc_support )
{ {
oscPrefix(); oscPrefix();
putstring (OSC "114" BEL); putstring (OSC "114" BEL);
@ -2712,7 +2814,8 @@ void FTerm::resetXTermMouseBackground()
void FTerm::resetXTermHighlightBackground() void FTerm::resetXTermHighlightBackground()
{ {
// Reset the highlight background color // 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(); oscPrefix();
putstringf (OSC "117" BEL); putstringf (OSC "117" BEL);
@ -2803,77 +2906,6 @@ void FTerm::setPalette (short index, int r, int g, int b)
std::fflush(stdout); 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) 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 = ""; FString answerback = "";
@ -3128,7 +3160,7 @@ FString FTerm::getAnswerbackMsg()
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
FString FTerm::getSecDA() const FString FTerm::getSecDA()
{ {
FString sec_da_str = ""; FString sec_da_str = "";

View File

@ -129,28 +129,17 @@ class FTerm
static bool linux_terminal; static bool linux_terminal;
static bool screen_terminal; static bool screen_terminal;
static bool tmux_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 termtype[30];
static char* term_name; static char* term_name;
static char* locale_name; static char* locale_name;
static char* locale_xterm; static char* locale_xterm;
static uChar x11_button_state;
static FRect* term; // current terminal geometry static FRect* term; // current terminal geometry
static FPoint* mouse; // mouse click position static FPoint* mouse; // mouse click position
static int stdin_status_flags; static int stdin_status_flags;
static int stdin_no;
static int stdout_no;
static int max_color;
static int fd_tty; static int fd_tty;
static uInt baudrate; static uInt baudrate;
static bool resize_term; static bool resize_term;
static char exit_message[8192];
static struct termios term_init; static struct termios term_init;
@ -177,6 +166,15 @@ class FTerm
dacreg d[16]; dacreg d[16];
} map; } 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 static struct modifier_key // bit field
{ {
uChar shift : 1; // 0..1 uChar shift : 1; // 0..1
@ -186,58 +184,62 @@ class FTerm
uChar : 4; // padding bits uChar : 4; // padding bits
} mod_key; } 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: private:
// Disable copy constructor // Disable copy constructor
FTerm (const FTerm&); FTerm (const FTerm&);
// Disable assignment operator (=) // Disable assignment operator (=)
FTerm& operator = (const FTerm&); FTerm& operator = (const FTerm&);
static void outb_Attribute_Controller (int, int); static void outb_Attribute_Controller (int, int);
static int inb_Attribute_Controller (int); static int inb_Attribute_Controller (int);
static int getFramebuffer_bpp(); static int getFramebuffer_bpp();
static int openConsole(); static int openConsole();
static int closeConsole(); static int closeConsole();
static int isConsole(); static int isConsole();
static void identifyTermType(); static void identifyTermType();
static int getScreenFont(); static int getScreenFont();
static int setScreenFont (uChar*, uInt, uInt, uInt, bool = false); static int setScreenFont (uChar*, uInt, uInt, uInt, bool = false);
static int setUnicodeMap (struct unimapdesc*); static int setUnicodeMap (struct unimapdesc*);
static int getUnicodeMap (); static int getUnicodeMap ();
static int setBlinkAsIntensity (bool); static int setBlinkAsIntensity (bool);
static void init_console(); static void init_console();
static uInt getBaudRate (const struct termios*); static uInt getBaudRate (const struct termios*);
static void init_consoleCharMap(); static char* init_256colorTerminal();
static char* init_256colorTerminal(); static char* parseAnswerbackMsg (char*&);
static char* parseAnswerbackMsg (char*&); static char* parseSecDA (char*&);
static char* parseSecDA (char*&); static void oscPrefix();
static void oscPrefix(); static void oscPostfix();
static void oscPostfix(); static void init_alt_charset();
static void init_alt_charset(); static void init_pc_charset();
static void init_pc_charset(); static void init_termcaps();
static void init_termcaps(); static void init_encoding();
static void init_encoding(); void init();
void init(); void finish();
void finish(); static uInt cp437_to_unicode (uChar);
static uInt charEncode (uInt); static void signal_handler (int);
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;
protected: 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: public:
// Constructor // Constructor
@ -245,125 +247,164 @@ class FTerm
// Destructor // Destructor
virtual ~FTerm(); virtual ~FTerm();
virtual const char* getClassName() const; virtual const char* getClassName() const;
static bool isKeyTimeout (timeval*, register long); static bool isKeyTimeout (timeval*, register long);
static int parseKeyString (char*, int, timeval*); static int parseKeyString (char*, int, timeval*);
static bool& unprocessedInput(); static bool& unprocessedInput();
static int getLineNumber(); static int getLineNumber();
static int getColumnNumber(); static int getColumnNumber();
static FString getKeyName (int); static FString getKeyName (int);
static void getModifierKey(); 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 void setEncoding (std::string);
static char* getTermName(); static std::string getEncoding();
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();
#ifdef F_HAVE_LIBGPM static bool setNonBlockingInput (bool);
static bool gpmMouse (bool); static bool setNonBlockingInput();
static bool enableGpmMouse(); static bool unsetNonBlockingInput();
static bool disableGpmMouse();
#endif // F_HAVE_LIBGPM
static void setBeep (int, int); static bool scrollTermForward();
static void resetBeep(); static bool scrollTermReverse();
static void beep();
static void setEncoding (std::string); static bool setUTF8 (bool);
static std::string getEncoding(); static bool setUTF8();
static bool unsetUTF8();
static bool isUTF8();
static bool isUTF8_linux_terminal();
static bool setNonBlockingInput (bool); static bool setRawMode (bool);
static bool setNonBlockingInput(); static bool setRawMode();
static bool unsetNonBlockingInput(); static bool unsetRawMode();
static bool setCookedMode();
static bool isRaw();
static bool scrollTermForward(); static const FString getAnswerbackMsg();
static bool scrollTermReverse(); static const FString getSecDA();
static bool setUTF8 (bool); // function pointer -> static function
static bool setUTF8(); static int (*Fputchar)(int);
static bool unsetUTF8(); static void putstringf (const char*, ...)
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*, ...)
#if defined(__clang__) #if defined(__clang__)
__attribute__((__format__ (__printf__, 1, 2))) __attribute__((__format__ (__printf__, 1, 2)))
#elif defined(__GNUC__) #elif defined(__GNUC__)
__attribute__ ((format (printf, 1, 2))) __attribute__ ((format (printf, 1, 2)))
#endif #endif
; ;
static void putstring (const char*, int = 1); static void putstring (const char*, int = 1);
static int putchar_ASCII (register int); static int putchar_ASCII (register int);
static int putchar_UTF8 (register int); static int putchar_UTF8 (register int);
static int UTF8decode (char*); static int UTF8decode (char*);
}; };
#pragma pack(pop) #pragma pack(pop)
// FTerm inline functions // 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 inline const char* FTerm::getClassName() const
{ return "FTerm"; } { return "FTerm"; }
@ -376,6 +417,10 @@ inline char* FTerm::getTermType()
inline char* FTerm::getTermName() inline char* FTerm::getTermName()
{ return term_name; } { return term_name; }
//----------------------------------------------------------------------
inline uInt FTerm::getTabstop()
{ return FTermcap::tabstop; }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FTerm::hasPCcharset() inline bool FTerm::hasPCcharset()
{ return pc_charset_console; } { return pc_charset_console; }
@ -456,6 +501,10 @@ inline bool FTerm::isScreenTerm()
inline bool FTerm::isTmuxTerm() inline bool FTerm::isTmuxTerm()
{ return tmux_terminal; } { return tmux_terminal; }
//----------------------------------------------------------------------
inline bool FTerm::isInputDataPending()
{ return input_data_pending; }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FTerm::setCursorOptimisation (bool on) inline bool FTerm::setCursorOptimisation (bool on)
{ return cursor_optimisation = (on) ? true : false; } { return cursor_optimisation = (on) ? true : false; }
@ -466,29 +515,7 @@ inline bool FTerm::isRaw()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline int FTerm::getMaxColor() inline int FTerm::getMaxColor()
{ return max_color; } { return FTermcap::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); }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FTerm::unsetNonBlockingInput() inline bool FTerm::unsetNonBlockingInput()

View File

@ -28,7 +28,17 @@ class FTermcap
char tname[3]; char tname[3];
} }
tcap_map; 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: private:
static tcap_map* tcap; static tcap_map* tcap;

View File

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

View File

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

View File

@ -11,10 +11,17 @@
// │ │ // │ │
// └─────┬─────┘ // └─────┬─────┘
// │ // │
// ▕▔▔▔▔▔▔▔▔▏ // ▕▔▔▔▔▔▔▔▔▏ 1 *▕▔▔▔▔▔▔▔▔▔▏
// ▕ FVTerm ▏ // ▕ FVTerm ▏-┬- - - -▕ FString ▏
// ▕▁▁▁▁▁▁▁▁▏ // ▕▁▁▁▁▁▁▁▁▏ : ▕▁▁▁▁▁▁▁▁▁▏
// :
// : *▕▔▔▔▔▔▔▔▔▏
// :- - - -▕ FPoint ▏
// : ▕▁▁▁▁▁▁▁▁▏
// :
// : *▕▔▔▔▔▔▔▔▏
// └- - - -▕ FRect ▏
// ▕▁▁▁▁▁▁▁▏
#ifndef _FVTERM_H #ifndef _FVTERM_H
#define _FVTERM_H #define _FVTERM_H
@ -47,9 +54,9 @@ class FVTerm : public FObject, public FTerm
static FTermcap::tcap_map* tcap; static FTermcap::tcap_map* tcap;
static bool hidden_cursor; static bool hidden_cursor;
static bool terminal_update_complete;
static bool terminal_update_pending; static bool terminal_update_pending;
static bool force_terminal_update; static bool force_terminal_update;
static bool terminal_updates;
static bool stop_terminal_updates; static bool stop_terminal_updates;
static bool vterm_updates; static bool vterm_updates;
static int skipped_terminal_update; static int skipped_terminal_update;
@ -128,20 +135,19 @@ class FVTerm : public FObject, public FTerm
static FOptiAttr::char_data getCoveredCharacter (int, int, FVTerm*); static FOptiAttr::char_data getCoveredCharacter (int, int, FVTerm*);
static FOptiAttr::char_data getOverlappedCharacter (const FPoint&, FVTerm*); static FOptiAttr::char_data getOverlappedCharacter (const FPoint&, FVTerm*);
static FOptiAttr::char_data getOverlappedCharacter (int, int, FVTerm*); static FOptiAttr::char_data getOverlappedCharacter (int, int, FVTerm*);
static void startTerminalUpdate();
static void finishTerminalUpdate();
private: private:
// Disable copy constructor // Disable copy constructor
FVTerm (const FVTerm&); FVTerm (const FVTerm&);
// Disable assignment operator (=) // Disable assignment operator (=)
FVTerm& operator = (const FVTerm&); FVTerm& operator = (const FVTerm&);
void init(); void init();
void finish(); void finish();
term_area* getPrintArea(); term_area* getPrintArea();
void setPrintArea (term_area*); void setPrintArea (term_area*);
// Friend class
friend class FWidget;
public: public:
// Constructor // Constructor
@ -151,59 +157,142 @@ class FVTerm : public FObject, public FTerm
virtual const char* getClassName() const; 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 (bool);
static bool hideCursor(); static bool hideCursor();
static bool showCursor(); static bool showCursor();
static bool isCursorHidden(); static bool isCursorHidden();
static short getTermForegroundColor(); static short getTermForegroundColor();
static short getTermBackgroundColor(); static short getTermBackgroundColor();
FVTerm::term_area* getVWin() const; FVTerm::term_area* getVWin() const;
void createVTerm (const FRect&); void createVTerm (const FRect&);
void createVTerm (int, int); void createVTerm (int, int);
static void resizeVTerm (const FRect&); static void resizeVTerm (const FRect&);
static void resizeVTerm (int, int); static void resizeVTerm (int, int);
static void putVTerm(); static void putVTerm();
static void updateTerminal (bool); static void updateTerminal (bool);
static void updateTerminal(); static void updateTerminal();
static bool updateTerminalCursor(); static bool updateTerminalCursor();
static void processTerminalUpdate(); static void processTerminalUpdate();
static bool isInsideTerminal (int, int); static bool isInsideTerminal (int, int);
void setPrintCursor (const FPoint&); void setPrintCursor (const FPoint&);
void setPrintCursor (register int, register int); void setPrintCursor (register int, register int);
FPoint* getPrintPos() const; FPoint* getPrintPos() const;
int printf (const wchar_t*, ...); int printf (const wchar_t*, ...);
int printf (const char*, ...) int printf (const char*, ...)
#if defined(__clang__) #if defined(__clang__)
__attribute__((__format__ (__printf__, 2, 3))) __attribute__((__format__ (__printf__, 2, 3)))
#elif defined(__GNUC__) #elif defined(__GNUC__)
__attribute__ ((format (printf, 2, 3))) __attribute__ ((format (printf, 2, 3)))
#endif #endif
; ;
int print (const std::wstring&); int print (const std::wstring&);
int print (FVTerm::term_area*, const std::wstring&); int print (FVTerm::term_area*, const std::wstring&);
int print (const wchar_t*); int print (const wchar_t*);
int print (FVTerm::term_area*, const wchar_t*); int print (FVTerm::term_area*, const wchar_t*);
int print (const char*); int print (const char*);
int print (FVTerm::term_area*, const char*); int print (FVTerm::term_area*, const char*);
int print (const std::string&); int print (const std::string&);
int print (FVTerm::term_area*, const std::string&); int print (FVTerm::term_area*, const std::string&);
int print (FString&); int print (FString&);
int print (FVTerm::term_area*, FString&); int print (FVTerm::term_area*, FString&);
int print (int); int print (int);
int print (FVTerm::term_area*, int); int print (FVTerm::term_area*, int);
static void newFontChanges (FOptiAttr::char_data*&); static void newFontChanges (FOptiAttr::char_data*&);
static void charsetChanges (FOptiAttr::char_data*&); static void charsetChanges (FOptiAttr::char_data*&);
static void appendCharacter (FOptiAttr::char_data*&); static void appendCharacter (FOptiAttr::char_data*&);
static void appendAttributes (FOptiAttr::char_data*&); static void appendAttributes (FOptiAttr::char_data*&);
static int appendLowerRight (FOptiAttr::char_data*&); static int appendLowerRight (FOptiAttr::char_data*&);
static void appendOutputBuffer (std::string&); static void appendOutputBuffer (std::string&);
static void appendOutputBuffer (const char*); static void appendOutputBuffer (const char*);
static int appendOutputBuffer (int); static int appendOutputBuffer (int);
static void flush_out(); 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) #pragma pack(pop)
@ -249,4 +338,293 @@ inline void FVTerm::setPrintCursor (const FPoint& pos)
inline void FVTerm::setPrintCursor (register int x, register int y) inline void FVTerm::setPrintCursor (register int x, register int y)
{ cursor->setPoint(x,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 #endif // _FVTERM_H

View File

@ -58,8 +58,6 @@ FWidget::FWidget (FWidget* parent)
, background_color(fc::Default) , background_color(fc::Default)
, statusbar_message() , statusbar_message()
{ {
resize_term = false;
if ( ! parent ) if ( ! parent )
{ {
assert ( ! rootObject assert ( ! rootObject
@ -125,10 +123,10 @@ void FWidget::init()
close_widget = new widgetList(); close_widget = new widgetList();
// determine width and height of the terminal // determine width and height of the terminal
getTermSize(); detectTermSize();
wsize.setRect(1, 1, term->getWidth(), term->getHeight()); wsize.setRect(1, 1, getColumnNumber(), getLineNumber());
adjust_wsize = wsize; adjust_wsize = wsize;
offset.setRect(0, 0, term->getWidth(), term->getHeight()); offset.setRect(0, 0, getColumnNumber(), getLineNumber());
client_offset = offset; client_offset = offset;
double_flatline_mask.top.resize (uLong(getWidth()), false); double_flatline_mask.top.resize (uLong(getWidth()), false);
@ -270,13 +268,13 @@ void FWidget::setColorTheme()
wc.progressbar_fg = fc::DarkGray; wc.progressbar_fg = fc::DarkGray;
wc.progressbar_bg = fc::LightBlue; wc.progressbar_bg = fc::LightBlue;
if ( kde_konsole ) if ( isKdeTerminal() )
wc.term_bg = fc::SteelBlue3; wc.term_bg = fc::SteelBlue3;
if ( tera_terminal ) if ( isTeraTerm() )
wc.term_bg = fc::LightBlue; 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_fg = fc::Black;
wc.term_bg = fc::Blue; wc.term_bg = fc::Blue;
@ -1198,7 +1196,7 @@ void FWidget::redraw()
if ( isRootWidget() ) if ( isRootWidget() )
{ {
terminal_updates = false; startTerminalUpdate();
// clean desktop // clean desktop
setColor (wc.term_fg, wc.term_bg); setColor (wc.term_fg, wc.term_bg);
clearArea (vdesktop); clearArea (vdesktop);
@ -1279,7 +1277,7 @@ void FWidget::redraw()
} }
if ( isRootWidget() ) if ( isRootWidget() )
terminal_updates = true; finishTerminalUpdate();
if ( redraw_root_widget == this ) if ( redraw_root_widget == this )
{ {
@ -1292,11 +1290,10 @@ void FWidget::redraw()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FWidget::resize() void FWidget::resize()
{ {
if ( isRootWidget() && openConsole() == 0 ) if ( isRootWidget() )
{ {
getTermSize(); detectTermSize();
const FRect& term_geometry = getGeometry(); const FRect& term_geometry = getGeometry();
closeConsole();
resizeVTerm (term_geometry); resizeVTerm (term_geometry);
resizeArea (term_geometry, getShadow(), vdesktop); resizeArea (term_geometry, getShadow(), vdesktop);
adjustSizeGlobal(); adjustSizeGlobal();
@ -1317,12 +1314,14 @@ void FWidget::show()
if ( ! visible ) if ( ! visible )
return; 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(); init_consoleCharMap();
if ( ! show_root_widget ) if ( ! show_root_widget )
{ {
terminal_updates = false; startTerminalUpdate();
show_root_widget = this; show_root_widget = this;
} }
@ -1348,7 +1347,7 @@ void FWidget::show()
if ( show_root_widget && show_root_widget == this ) if ( show_root_widget && show_root_widget == this )
{ {
terminal_updates = true; finishTerminalUpdate();
updateTerminal(); updateTerminal();
flush_out(); flush_out();
show_root_widget = 0; show_root_widget = 0;
@ -1534,16 +1533,7 @@ bool FWidget::setFocus (bool on)
void FWidget::setColor () void FWidget::setColor ()
{ {
// Changes colors to the widget default colors // Changes colors to the widget default colors
next_attribute.fg_color = foreground_color; setColor (foreground_color, background_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;
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
@ -1799,24 +1789,18 @@ void FWidget::setTermOffsetWithPadding()
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FWidget::getTermSize() void FWidget::detectTermSize()
{ {
FWidget* r = rootObject; FWidget* r = rootObject;
FTerm::detectTermSize();
if ( openConsole() == 0 ) r->adjust_wsize.setRect (1, 1, getColumnNumber(), getLineNumber());
{ r->offset.setRect (0, 0, getColumnNumber(), getLineNumber());
FTerm::getTermSize();
closeConsole();
}
r->adjust_wsize.setRect (1, 1, term->getWidth(), term->getHeight());
r->offset.setRect (0, 0, term->getWidth(), term->getHeight());
r->client_offset.setCoordinates r->client_offset.setCoordinates
( (
r->padding.left, r->padding.left,
r->padding.top, r->padding.top,
term->getWidth() - 1 - r->padding.right, getColumnNumber() - 1 - r->padding.right,
term->getHeight() - 1 - r->padding.bottom getLineNumber() - 1 - r->padding.bottom
); );
} }
@ -1829,7 +1813,7 @@ void FWidget::setTermSize (int w, int h)
rootObject->wsize.setRect(1, 1, w, h); rootObject->wsize.setRect(1, 1, w, h);
rootObject->adjust_wsize = rootObject->wsize; rootObject->adjust_wsize = rootObject->wsize;
FTerm::setTermSize (w, h); // w = columns / h = lines 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* show_root_widget;
static FWidget* redraw_root_widget; static FWidget* redraw_root_widget;
friend class FApplication; // Friend classes
friend class FToggleButton; friend class FToggleButton;
private: private:
@ -473,7 +473,8 @@ class FWidget : public FVTerm
void setForegroundColor (short); void setForegroundColor (short);
void setBackgroundColor (short); void setBackgroundColor (short);
void setColor(); void setColor();
void setColor (short, short); // make every setColor from FVTerm available
using FVTerm::setColor;
void setX (int, bool = true); void setX (int, bool = true);
void setY (int, bool = true); void setY (int, bool = true);
virtual void setPos (const FPoint&, bool = true); virtual void setPos (const FPoint&, bool = true);
@ -488,7 +489,7 @@ class FWidget : public FVTerm
void setParentOffset(); void setParentOffset();
void setTermOffset(); void setTermOffset();
void setTermOffsetWithPadding(); void setTermOffsetWithPadding();
void getTermSize(); void detectTermSize();
void setTermSize (int, int); void setTermSize (int, int);
virtual void setGeometry (const FRect&, bool = true); virtual void setGeometry (const FRect&, bool = true);
virtual void setGeometry (int, int, int, int, 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); void setPrintPos (register int, register int);
FPoint getPrintPos() const; 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 drawShadow();
void clearShadow(); void clearShadow();
void drawFlatBorder(); void drawFlatBorder();
@ -928,286 +847,6 @@ inline void FWidget::unsetCursorPos()
inline void FWidget::setPrintPos (const FPoint& pos) inline void FWidget::setPrintPos (const FPoint& pos)
{ setPrintPos (pos.getX(), pos.getY()); } { 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) inline void FWidget::unsetDoubleFlatLine (int side)
{ setDoubleFlatLine(side, false); } { setDoubleFlatLine(side, false); }

View File

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

View File

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