Adding a tty check for stdin

This commit is contained in:
Markus Gans 2020-02-09 21:58:17 +01:00
parent 07a29910b7
commit dd625e0822
6 changed files with 86 additions and 32 deletions

View File

@ -1,4 +1,5 @@
2020-02-08 Markus Gans <guru.mail@muenster.de>
2020-02-09 Markus Gans <guru.mail@muenster.de>
* Adding a tty check for stdin
* An application structure diagram was added to the document
of the first steps

View File

@ -12,7 +12,7 @@
width="101.5mm"
version="1.1"
id="svg61"
sodipodi:docname="application-structure.svg"
sodipodi:docname="final-cut-application-structure.svg"
inkscape:version="0.92.1 r15371">
<sodipodi:namedview
pagecolor="#ffffff"
@ -27,13 +27,13 @@
inkscape:window-height="1984"
id="namedview35"
showgrid="false"
inkscape:zoom="4.0861905"
inkscape:cx="81.193565"
inkscape:cy="171.2161"
inkscape:zoom="2.8893731"
inkscape:cx="331.13905"
inkscape:cy="54.29145"
inkscape:window-x="0"
inkscape:window-y="55"
inkscape:window-maximized="1"
inkscape:current-layer="g59" />
inkscape:current-layer="g23" />
<metadata
id="metadata67">
<rdf:RDF>
@ -42,7 +42,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@ -70,7 +70,7 @@
id="g59">
<g
id="g23"
style="stroke:#000000"
style="stroke:#000000;fill:none"
transform="translate(-0.00447221)">
<rect
height="74.20752"
@ -80,7 +80,7 @@
x="0.2115"
y="222.58098"
id="rect7"
style="fill:#f0f0f0;fill-opacity:1;stroke-width:0.42300001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5" />
style="fill:#f6f8fa;fill-opacity:1;stroke-width:0.42300001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5" />
<path
d="M 7.8726193,233.11525 H 66.187848"
id="path9"

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -29,9 +29,22 @@ Table of Contents
Basic functions
---------------
FINAL CUT is a library for creating text-based terminal applications. It runs on several Unix-like platforms. The release of FINAL CUT is licensed under the terms of the GNU Lesser General Public License v3.0 ([GNU LGPL v3](https://www.gnu.org/licenses/lgpl-3.0-standalone.html)), which allows flexible licensing of applications. FINAL CUT has a [C++](https://en.wikipedia.org/wiki/C%2B%2B)-based object-oriented architecture for creating fast and lean programs.
FINAL CUT is a library for creating text-based terminal applications.
It runs on several Unix-like platforms. The release of FINAL CUT is
licensed under the terms of the GNU Lesser General Public License v3.0
([GNU LGPL v3](https://www.gnu.org/licenses/lgpl-3.0-standalone.html)),
which allows flexible licensing of applications. FINAL CUT was written
in the programming language [C++](https://en.wikipedia.org/wiki/C%2B%2B).
The object-oriented design allows the creation of fast and lean programs.
FINAL CUT is a [widget toolkit](http://en.wikipedia.org/wiki/Widget_toolkit). A user interface created consists of several widgets. FINAL CUT draws widgets on virtual windows and then mapped them on a virtual terminal. It uses the terminal capabilities from the [Termcap library](https://en.wikipedia.org/wiki/Termcap) to display the character matrix of the virtual terminal on the screen or a terminal emulator. It uses various optimization methods to improve the speed of the display.
FINAL CUT is a [widget toolkit](http://en.wikipedia.org/wiki/Widget_toolkit).
A user interface usually consists of several
[widgets](https://en.wikipedia.org/wiki/Software_widget). FINAL CUT
draws widgets on virtual windows and then mapped them on a virtual
terminal. It uses the terminal capabilities from the
[Termcap library](https://en.wikipedia.org/wiki/Termcap) to display
the character matrix of the virtual terminal on the screen or a terminal
emulator. It uses various optimization methods to improve the drawing speed.
<figure class="image">
<img src="final-cut-application-structure.svg" alt="application structure">

View File

@ -25,6 +25,7 @@
#include <string>
#include <vector>
#include "final/fapplication.h"
#include "final/fc.h"
#include "final/fcharmap.h"
#include "final/fcolorpalette.h"
@ -2211,24 +2212,9 @@ void FTerm::init (bool disable_alt_screen)
allocationValues();
init_global_values(disable_alt_screen);
// Initialize termios
FTermios::init();
// Get pathname of the terminal device
init_terminal_device_path();
// Initialize Linux or *BSD console
initOSspecifics();
// Save termios settings
FTermios::storeTTYsettings();
// Get output baud rate
initBaudRate();
// Terminal detection
term_detection->detect();
setTermType (term_detection->getTermType());
// Initialize the terminal
if ( ! init_terminal() )
return;
// Set maximum number of colors for detected terminals
init_fixed_max_color();
@ -2312,6 +2298,49 @@ void FTerm::init (bool disable_alt_screen)
term_initialized = true;
}
//----------------------------------------------------------------------
bool FTerm::init_terminal()
{
// Initialize termios
FTermios::init();
// Check if stdin is a tty
if ( ! fsys->isTTY(FTermios::getStdIn()) )
{
data->setExitMessage("FTerm: Standard input is not a TTY.");
FApplication::exit(EXIT_FAILURE);
return false;
}
// Get pathname of the terminal device
init_terminal_device_path();
// Initialize Linux or *BSD console
initOSspecifics();
// Save termios settings
try
{
FTermios::storeTTYsettings();
}
catch (const std::runtime_error& ex)
{
FString msg = "FTerm: " + FString(ex.what());
data->setExitMessage(msg);
FApplication::exit(EXIT_FAILURE);
return false;
}
// Get output baud rate
initBaudRate();
// Terminal detection
term_detection->detect();
setTermType (term_detection->getTermType());
return true;
}
//----------------------------------------------------------------------
void FTerm::initOSspecifics()
{

View File

@ -3,7 +3,7 @@
* *
* This file is part of the Final Cut widget toolkit *
* *
* Copyright 2018-2019 Markus Gans *
* Copyright 2018-2020 Markus Gans *
* *
* The Final Cut is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public License *
@ -72,7 +72,10 @@ void FTermios::init()
termios FTermios::getTTY()
{
struct termios t{};
tcgetattr (stdin_no, &t);
if ( tcgetattr(stdin_no, &t) == -1 )
std::runtime_error("Cannot find tty");
return t;
}
@ -86,8 +89,15 @@ void FTermios::setTTY (const termios& t)
void FTermios::storeTTYsettings()
{
// Store termios settings
try
{
term_init = getTTY();
}
catch (...)
{
throw std::current_exception();
}
}
//----------------------------------------------------------------------
void FTermios::restoreTTYsettings()

View File

@ -343,6 +343,7 @@ class FTerm final
void allocationValues();
void deallocationValues();
void init (bool);
bool init_terminal();
void initOSspecifics();
void initTermspecifics();
void initBaudRate();