Splitting FOptiMove::moveCursor into sub-functions
This commit is contained in:
parent
64aa8d18b8
commit
6ef36ac7f7
|
@ -1,4 +1,8 @@
|
||||||
2017-11-24 Markus Gans <guru.mail@muenster.de>
|
2017-11-26 Markus Gans <guru.mail@muenster.de>
|
||||||
|
* Better code readability by splitting FOptiMove::moveCursor
|
||||||
|
into sub-functions
|
||||||
|
|
||||||
|
2017-11-25 Markus Gans <guru.mail@muenster.de>
|
||||||
* Splitting quirks in serperate methods
|
* Splitting quirks in serperate methods
|
||||||
|
|
||||||
2017-11-24 Markus Gans <guru.mail@muenster.de>
|
2017-11-24 Markus Gans <guru.mail@muenster.de>
|
||||||
|
|
|
@ -22,7 +22,7 @@ FONTFILE="8x16graph.bdf"
|
||||||
| while IFS=$'\n'; read -r LINE
|
| while IFS=$'\n'; read -r LINE
|
||||||
do
|
do
|
||||||
echo "$LINE /* $N */"
|
echo "$LINE /* $N */"
|
||||||
let N++
|
(( N++ ))
|
||||||
done
|
done
|
||||||
|
|
||||||
echo -e "};"
|
echo -e "};"
|
||||||
|
|
|
@ -20,7 +20,7 @@ FONTFILE="8x16std"
|
||||||
echo "$LINE"
|
echo "$LINE"
|
||||||
else
|
else
|
||||||
echo "$LINE /* $N */" | sed -e 's/\([0-9]\) \/\*/\1 \/*/'
|
echo "$LINE /* $N */" | sed -e 's/\([0-9]\) \/\*/\1 \/*/'
|
||||||
let N++
|
(( N++ ))
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
|
@ -121,6 +121,13 @@ class FOptiMove
|
||||||
int repeatedAppend (const capability&, int, char*);
|
int repeatedAppend (const capability&, int, char*);
|
||||||
int relativeMove (char*&, int, int, int, int);
|
int relativeMove (char*&, int, int, int, int);
|
||||||
bool isWideMove (int, int, int, int);
|
bool isWideMove (int, int, int, int);
|
||||||
|
bool isMethod0Faster (int&, int, int);
|
||||||
|
bool isMethod1Faster (int&, int, int, int, int);
|
||||||
|
bool isMethod2Faster (int&, int, int, int);
|
||||||
|
bool isMethod3Faster (int&, int, int);
|
||||||
|
bool isMethod4Faster (int&, int, int);
|
||||||
|
bool isMethod5Faster (int&, int, int, int);
|
||||||
|
void moveByMethod (int, int, int, int, int);
|
||||||
|
|
||||||
// Data Members
|
// Data Members
|
||||||
capability F_cursor_home;
|
capability F_cursor_home;
|
||||||
|
|
|
@ -481,10 +481,14 @@ class FTerm
|
||||||
static void init_termcaps_keys (char*&);
|
static void init_termcaps_keys (char*&);
|
||||||
static void init_OptiMove();
|
static void init_OptiMove();
|
||||||
static void init_OptiAttr();
|
static void init_OptiAttr();
|
||||||
|
static void init_font();
|
||||||
static void init_locale();
|
static void init_locale();
|
||||||
static void init_encoding();
|
static void init_encoding();
|
||||||
static void redefineColorPalette();
|
static void redefineColorPalette();
|
||||||
static void restoreColorPalette();
|
static void restoreColorPalette();
|
||||||
|
static void enableMouse();
|
||||||
|
static void disableMouse();
|
||||||
|
static void captureXTermFontAndTitle();
|
||||||
void init();
|
void init();
|
||||||
void finish();
|
void finish();
|
||||||
static uInt cp437_to_unicode (uChar);
|
static uInt cp437_to_unicode (uChar);
|
||||||
|
|
|
@ -4,6 +4,6 @@ find ../src/ \
|
||||||
../include/final/ \
|
../include/final/ \
|
||||||
../examples/ \
|
../examples/ \
|
||||||
-regextype posix-egrep \
|
-regextype posix-egrep \
|
||||||
-regex ".*\.(cpp|h)$" \
|
-regex ".*\\.(cpp|h)$" \
|
||||||
-exec sed -i 's/ *$//' "{}" \;
|
-exec sed -i 's/ *$//' "{}" \;
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ fi
|
||||||
test ! -x "$PROG" && echo "No executable file not found" && exit -1
|
test ! -x "$PROG" && echo "No executable file not found" && exit -1
|
||||||
|
|
||||||
# ELF executable file?
|
# ELF executable file?
|
||||||
ELFMAGIC="$(echo -e "\x7fELF")"
|
ELFMAGIC="$(echo -e "\\x7fELF")"
|
||||||
MAGIC="$(dd bs=1 count=4 if="$PROG" 2>/dev/null)"
|
MAGIC="$(dd bs=1 count=4 if="$PROG" 2>/dev/null)"
|
||||||
test "$MAGIC" != "$ELFMAGIC" && echo "No ELF executable file" && exit -2
|
test "$MAGIC" != "$ELFMAGIC" && echo "No ELF executable file" && exit -2
|
||||||
|
|
||||||
|
|
|
@ -488,23 +488,12 @@ int FOptiMove::set_clr_eol (char*& cap)
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
char* FOptiMove::moveCursor (int xold, int yold, int xnew, int ynew)
|
char* FOptiMove::moveCursor (int xold, int yold, int xnew, int ynew)
|
||||||
{
|
{
|
||||||
char null_result[sizeof(move_buf)];
|
int method = 0;
|
||||||
char* null_ptr = null_result;
|
int move_time = LONG_DURATION;
|
||||||
char* move_ptr = move_buf;
|
|
||||||
char* move_xy;
|
|
||||||
int method = 0
|
|
||||||
, new_time
|
|
||||||
, move_time = LONG_DURATION;
|
|
||||||
|
|
||||||
// Method 0: direct cursor addressing
|
// Method 0: direct cursor addressing
|
||||||
move_xy = tgoto(F_cursor_address.cap, xnew, ynew);
|
if ( isMethod0Faster(move_time, xnew, ynew) )
|
||||||
|
|
||||||
if ( move_xy )
|
|
||||||
{
|
{
|
||||||
method = 0;
|
|
||||||
std::strncpy (move_ptr, move_xy, sizeof(move_buf) - 1);
|
|
||||||
move_time = F_cursor_address.duration;
|
|
||||||
|
|
||||||
if ( xold < 0
|
if ( xold < 0
|
||||||
|| yold < 0
|
|| yold < 0
|
||||||
|| isWideMove (xold, yold, xnew, ynew) )
|
|| isWideMove (xold, yold, xnew, ynew) )
|
||||||
|
@ -514,123 +503,27 @@ char* FOptiMove::moveCursor (int xold, int yold, int xnew, int ynew)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Method 1: local movement
|
// Method 1: local movement
|
||||||
if ( xold >= 0 && yold >= 0 )
|
if ( isMethod1Faster(move_time, xold, yold, xnew, ynew) )
|
||||||
{
|
|
||||||
new_time = relativeMove (null_ptr, xold, yold, xnew, ynew);
|
|
||||||
|
|
||||||
if ( new_time < LONG_DURATION && new_time < move_time )
|
|
||||||
{
|
|
||||||
method = 1;
|
method = 1;
|
||||||
move_time = new_time;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Method 2: carriage-return + local movement
|
// Method 2: carriage-return + local movement
|
||||||
if ( yold >= 0 && F_carriage_return.cap )
|
if ( isMethod2Faster(move_time, yold, xnew, ynew) )
|
||||||
{
|
|
||||||
new_time = relativeMove (null_ptr, 0, yold, xnew, ynew);
|
|
||||||
|
|
||||||
if ( new_time < LONG_DURATION
|
|
||||||
&& F_carriage_return.duration + new_time < move_time )
|
|
||||||
{
|
|
||||||
method = 2;
|
method = 2;
|
||||||
move_time = F_carriage_return.duration + new_time;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Method 3: home-cursor + local movement
|
// Method 3: home-cursor + local movement
|
||||||
if ( F_cursor_home.cap )
|
if ( isMethod3Faster(move_time, xnew, ynew) )
|
||||||
{
|
|
||||||
new_time = relativeMove (null_ptr, 0, 0, xnew, ynew);
|
|
||||||
|
|
||||||
if ( new_time < LONG_DURATION
|
|
||||||
&& F_cursor_home.duration + new_time < move_time )
|
|
||||||
{
|
|
||||||
method = 3;
|
method = 3;
|
||||||
move_time = F_cursor_home.duration + new_time;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Method 4: home-down + local movement
|
// Method 4: home-down + local movement
|
||||||
if ( F_cursor_to_ll.cap )
|
if ( isMethod4Faster(move_time, xnew, ynew) )
|
||||||
{
|
|
||||||
new_time = relativeMove (null_ptr, 0, screen_height - 1, xnew, ynew);
|
|
||||||
|
|
||||||
if ( new_time < LONG_DURATION
|
|
||||||
&& F_cursor_to_ll.duration + new_time < move_time )
|
|
||||||
{
|
|
||||||
method = 4;
|
method = 4;
|
||||||
move_time = F_cursor_to_ll.duration + new_time;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Method 5: left margin for wrap to right-hand side
|
// Method 5: left margin for wrap to right-hand side
|
||||||
if ( automatic_left_margin
|
if ( isMethod5Faster(move_time, yold, xnew, ynew) )
|
||||||
&& ! eat_nl_glitch
|
|
||||||
&& yold > 0
|
|
||||||
&& F_cursor_left.cap )
|
|
||||||
{
|
|
||||||
new_time = relativeMove (null_ptr, screen_width - 1, yold - 1, xnew, ynew);
|
|
||||||
|
|
||||||
if ( new_time < LONG_DURATION
|
|
||||||
&& F_carriage_return.cap
|
|
||||||
&& F_carriage_return.duration
|
|
||||||
+ F_cursor_left.duration + new_time < move_time )
|
|
||||||
{
|
|
||||||
method = 5;
|
method = 5;
|
||||||
move_time = F_carriage_return.duration
|
|
||||||
+ F_cursor_left.duration + new_time;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( method )
|
// Copy the escape sequence for the chosen method in move_buf
|
||||||
{
|
moveByMethod (method, xold, yold, xnew, ynew);
|
||||||
switch ( method )
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
relativeMove (move_ptr, xold, yold, xnew, ynew);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
if ( F_carriage_return.cap )
|
|
||||||
{
|
|
||||||
std::strncpy (move_ptr, F_carriage_return.cap, sizeof(move_buf) - 1);
|
|
||||||
move_ptr += F_carriage_return.length;
|
|
||||||
relativeMove (move_ptr, 0, yold, xnew, ynew);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
std::strncpy (move_ptr, F_cursor_home.cap, sizeof(move_buf) - 1);
|
|
||||||
move_ptr += F_cursor_home.length;
|
|
||||||
relativeMove (move_ptr, 0, 0, xnew, ynew);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 4:
|
|
||||||
std::strncpy (move_ptr, F_cursor_to_ll.cap, sizeof(move_buf) - 1);
|
|
||||||
move_ptr += F_cursor_to_ll.length;
|
|
||||||
relativeMove (move_ptr, 0, screen_height - 1, xnew, ynew);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 5:
|
|
||||||
move_buf[0] = '\0';
|
|
||||||
|
|
||||||
if ( xold >= 0 )
|
|
||||||
std::strncat ( move_ptr
|
|
||||||
, F_carriage_return.cap
|
|
||||||
, sizeof(move_buf) - std::strlen(move_ptr) - 1 );
|
|
||||||
|
|
||||||
std::strncat ( move_ptr
|
|
||||||
, F_cursor_left.cap
|
|
||||||
, sizeof(move_buf) - std::strlen(move_ptr) - 1 );
|
|
||||||
move_ptr += std::strlen(move_buf);
|
|
||||||
relativeMove (move_ptr, screen_width - 1, yold - 1, xnew, ynew);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( move_time < LONG_DURATION )
|
if ( move_time < LONG_DURATION )
|
||||||
return move_buf;
|
return move_buf;
|
||||||
|
@ -989,3 +882,200 @@ inline bool FOptiMove::isWideMove ( int xold, int yold
|
||||||
&& std::abs(xnew - xold) + std::abs(ynew - yold)
|
&& std::abs(xnew - xold) + std::abs(ynew - yold)
|
||||||
> MOVE_LIMIT );
|
> MOVE_LIMIT );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
inline bool FOptiMove::isMethod0Faster ( int& move_time
|
||||||
|
, int xnew, int ynew )
|
||||||
|
{
|
||||||
|
// Test method 0: direct cursor addressing
|
||||||
|
char* move_xy = tgoto(F_cursor_address.cap, xnew, ynew);
|
||||||
|
|
||||||
|
if ( move_xy )
|
||||||
|
{
|
||||||
|
char* move_ptr = move_buf;
|
||||||
|
std::strncpy (move_ptr, move_xy, sizeof(move_buf) - 1);
|
||||||
|
move_time = F_cursor_address.duration;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
inline bool FOptiMove::isMethod1Faster ( int& move_time
|
||||||
|
, int xold, int yold
|
||||||
|
, int xnew, int ynew )
|
||||||
|
{
|
||||||
|
// Test method 1: local movement
|
||||||
|
|
||||||
|
if ( xold >= 0 && yold >= 0 )
|
||||||
|
{
|
||||||
|
char null_result[sizeof(move_buf)];
|
||||||
|
char* null_ptr = null_result;
|
||||||
|
int new_time = relativeMove (null_ptr, xold, yold, xnew, ynew);
|
||||||
|
|
||||||
|
if ( new_time < LONG_DURATION && new_time < move_time )
|
||||||
|
{
|
||||||
|
move_time = new_time;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
inline bool FOptiMove::isMethod2Faster ( int& move_time
|
||||||
|
, int yold
|
||||||
|
, int xnew, int ynew )
|
||||||
|
{
|
||||||
|
// Test method 2: carriage-return + local movement
|
||||||
|
|
||||||
|
if ( yold >= 0 && F_carriage_return.cap )
|
||||||
|
{
|
||||||
|
char null_result[sizeof(move_buf)];
|
||||||
|
char* null_ptr = null_result;
|
||||||
|
int new_time = relativeMove (null_ptr, 0, yold, xnew, ynew);
|
||||||
|
|
||||||
|
if ( new_time < LONG_DURATION
|
||||||
|
&& F_carriage_return.duration + new_time < move_time )
|
||||||
|
{
|
||||||
|
move_time = F_carriage_return.duration + new_time;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
inline bool FOptiMove::isMethod3Faster ( int& move_time
|
||||||
|
, int xnew, int ynew )
|
||||||
|
{
|
||||||
|
// Test method 3: home-cursor + local movement
|
||||||
|
|
||||||
|
if ( F_cursor_home.cap )
|
||||||
|
{
|
||||||
|
char null_result[sizeof(move_buf)];
|
||||||
|
char* null_ptr = null_result;
|
||||||
|
int new_time = relativeMove (null_ptr, 0, 0, xnew, ynew);
|
||||||
|
|
||||||
|
if ( new_time < LONG_DURATION
|
||||||
|
&& F_cursor_home.duration + new_time < move_time )
|
||||||
|
{
|
||||||
|
move_time = F_cursor_home.duration + new_time;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
inline bool FOptiMove::isMethod4Faster ( int& move_time
|
||||||
|
, int xnew, int ynew )
|
||||||
|
{
|
||||||
|
// Test method 4: home-down + local movement
|
||||||
|
if ( F_cursor_to_ll.cap )
|
||||||
|
{
|
||||||
|
char null_result[sizeof(move_buf)];
|
||||||
|
char* null_ptr = null_result;
|
||||||
|
int new_time = relativeMove ( null_ptr
|
||||||
|
, 0, screen_height - 1
|
||||||
|
, xnew, ynew );
|
||||||
|
|
||||||
|
if ( new_time < LONG_DURATION
|
||||||
|
&& F_cursor_to_ll.duration + new_time < move_time )
|
||||||
|
{
|
||||||
|
move_time = F_cursor_to_ll.duration + new_time;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
inline bool FOptiMove::isMethod5Faster ( int& move_time
|
||||||
|
, int yold
|
||||||
|
, int xnew, int ynew )
|
||||||
|
{
|
||||||
|
// Test method 5: left margin for wrap to right-hand side
|
||||||
|
if ( automatic_left_margin
|
||||||
|
&& ! eat_nl_glitch
|
||||||
|
&& yold > 0
|
||||||
|
&& F_cursor_left.cap )
|
||||||
|
{
|
||||||
|
char null_result[sizeof(move_buf)];
|
||||||
|
char* null_ptr = null_result;
|
||||||
|
int new_time = relativeMove ( null_ptr
|
||||||
|
, screen_width - 1, yold - 1
|
||||||
|
, xnew, ynew );
|
||||||
|
|
||||||
|
if ( new_time < LONG_DURATION
|
||||||
|
&& F_carriage_return.cap
|
||||||
|
&& F_carriage_return.duration
|
||||||
|
+ F_cursor_left.duration + new_time < move_time )
|
||||||
|
{
|
||||||
|
move_time = F_carriage_return.duration
|
||||||
|
+ F_cursor_left.duration + new_time;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
void FOptiMove::moveByMethod ( int method
|
||||||
|
, int xold, int yold
|
||||||
|
, int xnew, int ynew )
|
||||||
|
{
|
||||||
|
char* move_ptr = move_buf;
|
||||||
|
|
||||||
|
switch ( method )
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
relativeMove (move_ptr, xold, yold, xnew, ynew);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
if ( F_carriage_return.cap )
|
||||||
|
{
|
||||||
|
std::strncpy (move_ptr, F_carriage_return.cap, sizeof(move_buf) - 1);
|
||||||
|
move_ptr += F_carriage_return.length;
|
||||||
|
relativeMove (move_ptr, 0, yold, xnew, ynew);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
std::strncpy (move_ptr, F_cursor_home.cap, sizeof(move_buf) - 1);
|
||||||
|
move_ptr += F_cursor_home.length;
|
||||||
|
relativeMove (move_ptr, 0, 0, xnew, ynew);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
std::strncpy (move_ptr, F_cursor_to_ll.cap, sizeof(move_buf) - 1);
|
||||||
|
move_ptr += F_cursor_to_ll.length;
|
||||||
|
relativeMove (move_ptr, 0, screen_height - 1, xnew, ynew);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
move_buf[0] = '\0';
|
||||||
|
|
||||||
|
if ( xold >= 0 )
|
||||||
|
std::strncat ( move_ptr
|
||||||
|
, F_carriage_return.cap
|
||||||
|
, sizeof(move_buf) - std::strlen(move_ptr) - 1 );
|
||||||
|
|
||||||
|
std::strncat ( move_ptr
|
||||||
|
, F_cursor_left.cap
|
||||||
|
, sizeof(move_buf) - std::strlen(move_ptr) - 1 );
|
||||||
|
move_ptr += std::strlen(move_buf);
|
||||||
|
relativeMove (move_ptr, screen_width - 1, yold - 1, xnew, ynew);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
134
src/fterm.cpp
134
src/fterm.cpp
|
@ -4015,6 +4015,26 @@ void FTerm::init_OptiAttr()
|
||||||
opti_attr->init();
|
opti_attr->init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
void FTerm::init_font()
|
||||||
|
{
|
||||||
|
if ( init_values.vgafont )
|
||||||
|
{
|
||||||
|
bool ret = setVGAFont();
|
||||||
|
|
||||||
|
if ( ! ret )
|
||||||
|
exitWithMessage ("VGAfont is not supported by this terminal");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( init_values.newfont )
|
||||||
|
{
|
||||||
|
bool ret = setNewFont();
|
||||||
|
|
||||||
|
if ( ! ret )
|
||||||
|
exitWithMessage ("Newfont is not supported by this terminal");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
void FTerm::init_locale()
|
void FTerm::init_locale()
|
||||||
{
|
{
|
||||||
|
@ -4197,6 +4217,54 @@ void FTerm::restoreColorPalette()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
void FTerm::enableMouse()
|
||||||
|
{
|
||||||
|
#ifdef F_HAVE_LIBGPM
|
||||||
|
// Enable the linux general purpose mouse (gpm) server
|
||||||
|
gpm_mouse_enabled = enableGpmMouse();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Enable xterm mouse support
|
||||||
|
if ( TCAP(fc::t_key_mouse) && ! linux_terminal )
|
||||||
|
{
|
||||||
|
mouse_support = true;
|
||||||
|
enableXTermMouse();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
void FTerm::disableMouse()
|
||||||
|
{
|
||||||
|
// Disable xterm mouse support
|
||||||
|
if ( mouse_support )
|
||||||
|
disableXTermMouse();
|
||||||
|
|
||||||
|
#ifdef F_HAVE_LIBGPM
|
||||||
|
// Disable the linux general purpose mouse (gpm) server
|
||||||
|
if ( gpm_mouse_enabled )
|
||||||
|
disableGpmMouse();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
void FTerm::captureXTermFontAndTitle()
|
||||||
|
{
|
||||||
|
if ( (xterm_terminal || urxvt_terminal) && ! rxvt_terminal )
|
||||||
|
{
|
||||||
|
struct termios t;
|
||||||
|
tcgetattr (stdin_no, &t);
|
||||||
|
t.c_lflag &= uInt(~(ICANON | ECHO));
|
||||||
|
tcsetattr (stdin_no, TCSANOW, &t);
|
||||||
|
|
||||||
|
xterm_font = getXTermFont();
|
||||||
|
xterm_title = getXTermTitle();
|
||||||
|
|
||||||
|
t.c_lflag |= uInt(ICANON | ECHO);
|
||||||
|
tcsetattr (stdin_no, TCSADRAIN, &t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
void FTerm::init()
|
void FTerm::init()
|
||||||
{
|
{
|
||||||
|
@ -4238,18 +4306,24 @@ void FTerm::init()
|
||||||
term_name[0] = '\0';
|
term_name[0] = '\0';
|
||||||
|
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
|
|
||||||
// initialize Linux console
|
// initialize Linux console
|
||||||
initLinuxConsole();
|
initLinuxConsole();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__FreeBSD__) || defined(__DragonFly__)
|
#if defined(__FreeBSD__) || defined(__DragonFly__)
|
||||||
|
|
||||||
// Initialize BSD console
|
// Initialize BSD console
|
||||||
initFreeBSDConsole();
|
initFreeBSDConsole();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__NetBSD__) || defined(__OpenBSD__)
|
#if defined(__NetBSD__) || defined(__OpenBSD__)
|
||||||
|
|
||||||
// Initialize wscons console
|
// Initialize wscons console
|
||||||
initWSConsConsole();
|
initWSConsConsole();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Save termios settings
|
// Save termios settings
|
||||||
|
@ -4283,19 +4357,8 @@ void FTerm::init()
|
||||||
if ( init_values.encoding != fc::UNKNOWN )
|
if ( init_values.encoding != fc::UNKNOWN )
|
||||||
setEncoding(init_values.encoding);
|
setEncoding(init_values.encoding);
|
||||||
|
|
||||||
#ifdef F_HAVE_LIBGPM
|
// Enable the terminal mouse support
|
||||||
|
enableMouse();
|
||||||
// Enable the linux general purpose mouse (gpm) server
|
|
||||||
gpm_mouse_enabled = enableGpmMouse();
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// xterm mouse support
|
|
||||||
if ( TCAP(fc::t_key_mouse) && ! linux_terminal )
|
|
||||||
{
|
|
||||||
mouse_support = true;
|
|
||||||
enableXTermMouse();
|
|
||||||
}
|
|
||||||
|
|
||||||
// activate meta key sends escape
|
// activate meta key sends escape
|
||||||
if ( xterm_terminal )
|
if ( xterm_terminal )
|
||||||
|
@ -4329,19 +4392,8 @@ void FTerm::init()
|
||||||
std::fflush(stdout);
|
std::fflush(stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (xterm_terminal || urxvt_terminal) && ! rxvt_terminal )
|
// Save the used xterm font and window title
|
||||||
{
|
captureXTermFontAndTitle();
|
||||||
struct termios t;
|
|
||||||
tcgetattr (stdin_no, &t);
|
|
||||||
t.c_lflag &= uInt(~(ICANON | ECHO));
|
|
||||||
tcsetattr (stdin_no, TCSANOW, &t);
|
|
||||||
|
|
||||||
xterm_font = getXTermFont();
|
|
||||||
xterm_title = getXTermTitle();
|
|
||||||
|
|
||||||
t.c_lflag |= uInt(ICANON | ECHO);
|
|
||||||
tcsetattr (stdin_no, TCSADRAIN, &t);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( kde_konsole )
|
if ( kde_konsole )
|
||||||
setKDECursor(fc::UnderlineCursor);
|
setKDECursor(fc::UnderlineCursor);
|
||||||
|
@ -4365,21 +4417,9 @@ void FTerm::init()
|
||||||
if ( ! init_values.cursor_optimisation )
|
if ( ! init_values.cursor_optimisation )
|
||||||
setCursorOptimisation (false);
|
setCursorOptimisation (false);
|
||||||
|
|
||||||
if ( init_values.vgafont )
|
// Activate the VGA or the new graphic font
|
||||||
{
|
// (depending on the initialization values)
|
||||||
bool ret = setVGAFont();
|
init_font();
|
||||||
|
|
||||||
if ( ! ret )
|
|
||||||
exitWithMessage ("VGAfont is not supported by this terminal");
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( init_values.newfont )
|
|
||||||
{
|
|
||||||
bool ret = setNewFont();
|
|
||||||
|
|
||||||
if ( ! ret )
|
|
||||||
exitWithMessage ("Newfont is not supported by this terminal");
|
|
||||||
}
|
|
||||||
|
|
||||||
// turn off hardware echo
|
// turn off hardware echo
|
||||||
noHardwareEcho();
|
noHardwareEcho();
|
||||||
|
@ -4458,21 +4498,13 @@ void FTerm::finish()
|
||||||
|
|
||||||
resetBeep();
|
resetBeep();
|
||||||
|
|
||||||
// Disable xterm mouse support
|
// Disable the terminal mouse support
|
||||||
if ( mouse_support )
|
disableMouse();
|
||||||
disableXTermMouse();
|
|
||||||
|
|
||||||
// Deactivate meta key sends escape
|
// Deactivate meta key sends escape
|
||||||
if ( xterm_terminal )
|
if ( xterm_terminal )
|
||||||
xtermMetaSendsESC(false);
|
xtermMetaSendsESC(false);
|
||||||
|
|
||||||
#ifdef F_HAVE_LIBGPM
|
|
||||||
|
|
||||||
if ( gpm_mouse_enabled )
|
|
||||||
disableGpmMouse(); // Disable gpm server
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// restores the screen and the cursor position
|
// restores the screen and the cursor position
|
||||||
if ( use_alternate_screen && TCAP(fc::t_exit_ca_mode) )
|
if ( use_alternate_screen && TCAP(fc::t_exit_ca_mode) )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue