Improved command line paramenter handlin

This commit is contained in:
Markus Gans 2017-11-18 02:34:41 +01:00
parent 053b6bcf30
commit 9c987ca49c
14 changed files with 598 additions and 433 deletions

View File

@ -1,3 +1,8 @@
2017-11-18 Markus Gans <guru.mail@muenster.de>
* Improved command line paramenter handling
* New command line paramenter --no-terminal-detection
* New command line paramenter --no-color-change
2017-11-11 Markus Gans <guru.mail@muenster.de>
* Improved code coverage tests

View File

@ -110,7 +110,8 @@ class FApplication : public FWidget
static void sendQueuedEvents ();
static bool eventInQueue();
static bool removeQueuedEvent (const FObject*);
static FWidget* showParameterUsage (const int&, char*[]);
static FWidget* processParameters (const int&, char*[]);
static void showParameterUsage ();
static void closeConfirmationDialog (FWidget*, FCloseEvent*);
// Callback method
@ -148,8 +149,7 @@ class FApplication : public FWidget
// Methods
void init();
void setExitMessage (std::string);
void cmd_options();
static void cmd_options (const int&, char*[]);
#ifdef F_HAVE_LIBGPM
int gpmEvent (bool = true);

View File

@ -112,7 +112,8 @@ class fc
VT100,
PC,
ASCII,
NUM_OF_ENCODINGS // number of items
NUM_OF_ENCODINGS, // number of items
UNKNOWN
};
// VT100 line graphic keys

View File

@ -260,8 +260,9 @@ class FTerm
static void resetBeep();
static void beep();
static void setEncoding (std::string);
static std::string getEncoding();
static void setEncoding (fc::encoding);
static fc::encoding getEncoding();
static std::string getEncodingString();
static bool scrollTermForward();
static bool scrollTermReverse();
@ -300,9 +301,6 @@ class FTerm
static void initFreeBSDConsoleCharMap();
#endif
static void initCygwinCharMap();
static void initTeraTermCharMap();
static bool charEncodable (uInt);
static uInt charEncode (uInt);
static uInt charEncode (uInt, fc::encoding);
@ -324,6 +322,7 @@ class FTerm
static FPoint& getMousePos();
static void setMousePos (const FPoint&);
static void setMousePos (short, short);
static void exitWithMessage (std::string);
// Data Members
static int stdin_no;
@ -340,9 +339,33 @@ class FTerm
static bool cursor_optimisation;
static bool xterm_default_colors;
static bool use_alternate_screen;
static fc::encoding Encoding;
static fc::encoding term_encoding;
static char exit_message[8192];
static struct initializationValues
{
public:
initializationValues()
: terminal_detection(true)
, cursor_optimisation(true)
, color_change(true)
, vgafont(false)
, newfont(false)
, encoding(fc::UNKNOWN)
{ }
~initializationValues()
{ }
uInt8 terminal_detection : 1;
uInt8 cursor_optimisation : 1;
uInt8 color_change : 1;
uInt8 vgafont : 1;
uInt8 newfont : 1;
uInt8 : 3; // padding bits
fc::encoding encoding;
} init_values;
private:
// Typedefs
typedef FTermcap::tcap_map termcap_map;
@ -418,6 +441,9 @@ class FTerm
#endif
static uInt getBaudRate (const struct termios*);
static void init_global_values();
static void detectTerminal();
static void termtypeAnalysis();
static char* init_256colorTerminal();
static char* parseAnswerbackMsg (char*&);
static char* parseSecDA (char*&);
@ -425,11 +451,18 @@ class FTerm
static void oscPostfix();
static void init_alt_charset();
static void init_pc_charset();
static void init_cygwin_charmap();
static void init_teraterm_charmap();
static void init_termcaps();
static void init_locale();
static void init_encoding();
static void redefineColorPalette();
static void restoreColorPalette();
void init();
void finish();
static uInt cp437_to_unicode (uChar);
static void setSignalHandler();
static void resetSignalHandler();
static void signal_handler (int);
// Data Members

View File

@ -58,7 +58,7 @@ FApplication::eventQueue* FApplication::event_queue = 0;
FApplication::FApplication ( const int& _argc
, char* _argv[]
, bool disable_alt_screen )
: FWidget(showParameterUsage(_argc,_argv), disable_alt_screen)
: FWidget(processParameters(_argc,_argv), disable_alt_screen)
, app_argc(_argc)
, app_argv(_argv)
, key(0)
@ -310,33 +310,44 @@ bool FApplication::removeQueuedEvent (const FObject* receiver)
}
//----------------------------------------------------------------------
FWidget* FApplication::showParameterUsage (const int& argc, char* argv[])
FWidget* FApplication::processParameters (const int& argc, char* argv[])
{
if ( argc > 0 && argv[1] && ( std::strcmp(argv[1], "--help") == 0
|| std::strcmp(argv[1], "-h") == 0 ) )
{
std::cout \
<< "Generic options:" << std::endl
<< " -h, --help "
<< " Display this help and exit" << std::endl
<< std::endl
<< "FinalCut Options:" << std::endl
<< " --encoding <name> "
<< " Sets the character encoding mode" << std::endl
<< " "
<< " {UTF8, VT100, PC, ASCII}" << std::endl
<< " --no-optimized-cursor"
<< " No cursor optimisation" << std::endl
<< " --vgafont "
<< " Set the standard vga 8x16 font" << std::endl
<< " --newfont "
<< " Enables the graphical font" << std::endl;
std::exit(EXIT_SUCCESS);
showParameterUsage();
}
cmd_options (argc, argv);
return 0;
}
//----------------------------------------------------------------------
void FApplication::showParameterUsage()
{
std::cout \
<< "Generic options:" << std::endl
<< " -h, --help "
<< " Display this help and exit" << std::endl
<< std::endl
<< "FinalCut Options:" << std::endl
<< " --encoding <name> "
<< " Sets the character encoding mode" << std::endl
<< " "
<< " {UTF8, VT100, PC, ASCII}" << std::endl
<< " --no-optimized-cursor "
<< " Disable cursor optimization" << std::endl
<< " --no-terminal-detection"
<< " Disable terminal detection" << std::endl
<< " --no-color-change "
<< " Do not redefine the color palette" << std::endl
<< " --vgafont "
<< " Set the standard vga 8x16 font" << std::endl
<< " --newfont "
<< " Enables the graphical font" << std::endl;
std::exit(EXIT_SUCCESS);
}
//----------------------------------------------------------------------
void FApplication::closeConfirmationDialog (FWidget* w, FCloseEvent* ev)
{
@ -385,40 +396,31 @@ void FApplication::init()
std::fill_n (urxvt_mouse, sizeof(urxvt_mouse), '\0');
// init bit field with 0
std::memset(&b_state, 0x00, sizeof(b_state));
}
//----------------------------------------------------------------------
void FApplication::cmd_options (const int& argc, char* argv[])
{
// interpret the command line options
cmd_options();
}
//----------------------------------------------------------------------
void FApplication::setExitMessage (std::string message)
{
quit_now = true;
snprintf ( FTerm::exit_message
, sizeof(FTerm::exit_message)
, "%s"
, message.c_str() );
}
//----------------------------------------------------------------------
void FApplication::cmd_options ()
{
while ( true )
{
int c, idx = 0;
static struct option long_options[] =
{
{"encoding", required_argument, 0, 0 },
{"no-optimized-cursor", no_argument, 0, 0 },
{"vgafont", no_argument, 0, 0 },
{"newfont", no_argument, 0, 0 },
{0, 0, 0, 0 }
{"encoding", required_argument, 0, 0 },
{"no-optimized-cursor", no_argument, 0, 0 },
{"no-terminal-detection", no_argument, 0, 0 },
{"no-color-change", no_argument, 0, 0 },
{"vgafont", no_argument, 0, 0 },
{"newfont", no_argument, 0, 0 },
{0, 0, 0, 0 }
};
opterr = 0;
c = getopt_long ( app_argc
, app_argv
c = getopt_long ( argc
, argv
, ""
, long_options
, &idx );
@ -432,36 +434,35 @@ void FApplication::cmd_options ()
FString encoding(optarg);
encoding = encoding.toUpper();
if ( encoding.includes("UTF8")
|| encoding.includes("VT100")
|| encoding.includes("PC")
|| encoding.includes("ASCII") )
{
setEncoding(encoding.c_str());
}
if ( encoding.includes("UTF8") )
init_values.encoding = fc::UTF8;
else if ( encoding.includes("VT100") )
init_values.encoding = fc::VT100;
else if ( encoding.includes("PC") )
init_values.encoding = fc::PC;
else if ( encoding.includes("ASCII") )
init_values.encoding = fc::ASCII;
else if ( encoding.includes("HELP") )
showParameterUsage();
else
setExitMessage ( "Unknown encoding "
+ std::string(encoding.c_str()) );
exitWithMessage ( "Unknown encoding "
+ std::string(encoding.c_str()) );
}
if ( std::strcmp(long_options[idx].name, "no-optimized-cursor") == 0 )
setCursorOptimisation (false);
init_values.cursor_optimisation = false;
if ( std::strcmp(long_options[idx].name, "no-terminal-detection") == 0 )
init_values.terminal_detection = false;
if ( std::strcmp(long_options[idx].name, "no-color-change") == 0 )
init_values.color_change = false;
if ( std::strcmp(long_options[idx].name, "vgafont") == 0 )
{
bool ret = setVGAFont();
if ( ! ret )
setExitMessage ("VGAfont is not supported by this terminal");
}
init_values.vgafont = true;
if ( std::strcmp(long_options[idx].name, "newfont") == 0 )
{
bool ret = setNewFont();
if ( ! ret )
setExitMessage ("Newfont is not supported by this terminal");
}
init_values.newfont = true;
}
}
}

View File

@ -206,8 +206,8 @@ bool FButton::setFlat (bool on)
bool FButton::setShadow (bool on)
{
if ( on
&& Encoding != fc::VT100
&& Encoding != fc::ASCII )
&& term_encoding != fc::VT100
&& term_encoding != fc::ASCII )
{
flags |= fc::shadow;
setShadowSize(1,1);

View File

@ -234,8 +234,8 @@ bool FLineEdit::setFocus (bool on)
bool FLineEdit::setShadow (bool on)
{
if ( on
&& Encoding != fc::VT100
&& Encoding != fc::ASCII )
&& term_encoding != fc::VT100
&& term_encoding != fc::ASCII )
{
flags |= fc::shadow;
setShadowSize(1,1);

View File

@ -1344,7 +1344,7 @@ void FMenu::drawItems()
{
setColor (wc.menu_inactive_fg, getBackgroundColor());
if ( getEncoding() == "ASCII" )
if ( getEncoding() == fc::ASCII )
print ('-');
else
print (fc::SmallBullet); // ·

View File

@ -79,8 +79,8 @@ void FProgressbar::setGeometry (int x, int y, int w, int h, bool adjust)
bool FProgressbar::setShadow (bool on)
{
if ( on
&& Encoding != fc::VT100
&& Encoding != fc::ASCII )
&& term_encoding != fc::VT100
&& term_encoding != fc::ASCII )
{
flags |= fc::shadow;
setShadowSize(1,1);

File diff suppressed because it is too large Load Diff

View File

@ -791,7 +791,7 @@ void FTextView::drawText()
for (i = 0; i < len; i++)
{
wchar_t ch = line_str[i];
bool utf8 = ( Encoding == fc::UTF8 ) ? true : false;
bool utf8 = ( term_encoding == fc::UTF8 ) ? true : false;
// only printable and 1 column per character
if ( ( (utf8 && std::iswprint(wint_t(ch)))

View File

@ -2717,7 +2717,7 @@ inline void FVTerm::newFontChanges (char_data*& next_char)
//----------------------------------------------------------------------
inline void FVTerm::charsetChanges (char_data*& next_char)
{
if ( Encoding == fc::UTF8 )
if ( term_encoding == fc::UTF8 )
return;
uInt code = uInt(next_char->code);
@ -2733,9 +2733,9 @@ inline void FVTerm::charsetChanges (char_data*& next_char)
next_char->code = int(ch_enc);
if ( Encoding == fc::VT100 )
if ( term_encoding == fc::VT100 )
next_char->attr.bit.alt_charset = true;
else if ( Encoding == fc::PC )
else if ( term_encoding == fc::PC )
{
next_char->attr.bit.pc_charset = true;

View File

@ -1411,8 +1411,8 @@ void FWidget::drawShadow()
if ( isMonochron() && ! trans_shadow )
return;
if ( (Encoding == fc::VT100 && ! trans_shadow)
|| (Encoding == fc::ASCII && ! trans_shadow) )
if ( (term_encoding == fc::VT100 && ! trans_shadow)
|| (term_encoding == fc::ASCII && ! trans_shadow) )
{
clearShadow();
return;