[init] fix handling of unknown TERM

This commit is contained in:
Tim Stack 2022-08-22 13:15:31 -07:00
parent 5751fe89c4
commit d01db38d51
6 changed files with 81 additions and 19 deletions

View File

@ -1006,13 +1006,6 @@ looper()
static auto* filter_source = injector::get<filter_sub_source*>();
try {
auto_fd errpipe[2];
auto_fd::pipe(errpipe);
dup2(errpipe[1], STDERR_FILENO);
errpipe[1].reset();
log_pipe_err(errpipe[0]);
auto* sql_cmd_map = injector::get<readline_context::command_map_t*,
sql_cmd_map_tag>();
auto& ec = lnav_data.ld_exec_context;
@ -1091,7 +1084,26 @@ looper()
(void) signal(SIGWINCH, sigwinch);
(void) signal(SIGCHLD, sigchld);
screen_curses sc;
auto create_screen_res = screen_curses::create();
if (create_screen_res.isErr()) {
log_error("create screen failed with: %s",
create_screen_res.unwrapErr().c_str());
lnav::console::print(
stderr,
lnav::console::user_message::error("unable to open TUI")
.with_reason(create_screen_res.unwrapErr()));
return;
}
auto sc = create_screen_res.unwrap();
auto_fd errpipe[2];
auto_fd::pipe(errpipe);
dup2(errpipe[1], STDERR_FILENO);
errpipe[1].reset();
log_pipe_err(errpipe[0]);
lnav_behavior lb;
ui_periodic_timer::singleton();
@ -1264,8 +1276,8 @@ looper()
lnav_data.ld_status[LNS_TOP].set_enabled(false);
lnav_data.ld_status[LNS_TOP].set_data_source(&lnav_data.ld_top_source);
lnav_data.ld_status[LNS_BOTTOM].set_top(-(rlc->get_height() + 1));
for (auto& sc : lnav_data.ld_status) {
sc.set_window(lnav_data.ld_window);
for (auto& stat_bar : lnav_data.ld_status) {
stat_bar.set_window(lnav_data.ld_window);
}
lnav_data.ld_status[LNS_BOTTOM].set_data_source(
&lnav_data.ld_bottom_source);

View File

@ -1203,3 +1203,31 @@ view_colors::roles::file()
{
return VC_ROLE.value(role_t::VCR_FILE);
}
#include <term.h>
Result<screen_curses, std::string>
screen_curses::create()
{
int errret = 0;
if (setupterm(nullptr, STDIN_FILENO, &errret) == ERR) {
switch (errret) {
case 1:
return Err(std::string("the terminal is a hardcopy, da fuq?!"));
case 0:
return Err(
fmt::format(FMT_STRING("the TERM environment variable is "
"set to an unknown value: {}"),
getenv("TERM")));
case -1:
return Err(
std::string("the terminfo database could not be found"));
default:
return Err(std::string("setupterm() failed unexpectedly"));
}
}
newterm(nullptr, stdout, stdin);
return Ok(screen_curses{stdscr});
}

View File

@ -53,7 +53,6 @@
#else
# error "SysV or X/Open-compatible Curses header file required"
#endif
#include <functional>
#include <map>
#include <string>
@ -84,15 +83,40 @@ class view_curses;
*/
class screen_curses : public log_crash_recoverer {
public:
void log_crash_recover() override { endwin(); }
static Result<screen_curses, std::string> create();
screen_curses() : sc_main_window(initscr()) {}
void log_crash_recover() override
{
if (this->sc_main_window != nullptr) {
endwin();
}
}
virtual ~screen_curses() { endwin(); }
virtual ~screen_curses()
{
if (this->sc_main_window != nullptr) {
endwin();
}
}
screen_curses(screen_curses&& other)
: sc_main_window(std::exchange(other.sc_main_window, nullptr))
{
}
screen_curses(const screen_curses&) = delete;
screen_curses& operator=(screen_curses&& other)
{
this->sc_main_window = std::exchange(other.sc_main_window, nullptr);
return *this;
}
WINDOW* get_window() { return this->sc_main_window; }
private:
screen_curses(WINDOW* win) : sc_main_window(win) {}
WINDOW* sc_main_window;
};

View File

@ -53,7 +53,7 @@ main(int argc, char* argv[])
setlocale(LC_ALL, "");
{
screen_curses sc;
auto sc = screen_curses::create().unwrap();
WINDOW* win = sc.get_window();
struct line_range lr(0, 40);
attr_line_t al;

View File

@ -101,8 +101,7 @@ main(int argc, char* argv[])
drive_data.dd_rl_view = &rlc;
screen_curses sc;
auto sc = screen_curses::create().unwrap();
keypad(stdscr, TRUE);
nonl();
cbreak();

View File

@ -108,8 +108,7 @@ main(int argc, char* argv[])
"ab\bcdef",
};
screen_curses sc;
auto sc = screen_curses::create().unwrap();
noecho();
vt.set_window(sc.get_window());
vt.set_width(10);