in resctl-demo/src/main.rs [492:625]
fn main() {
let matches = clap::App::new("resctl-demo")
.version((*FULL_VERSION).as_str())
.author(clap::crate_authors!("\n"))
.about(std::str::from_utf8(include_bytes!("../README.md")).unwrap())
.args_from_usage(&ARGS_STR)
.setting(clap::AppSettings::UnifiedHelpMessage)
.setting(clap::AppSettings::DeriveDisplayOrder)
.get_matches();
let args = Args {
dir: match matches.value_of("dir") {
Some(v) => v.into(),
None => rd_agent_intf::Args::default().dir,
},
dev: matches.value_of("dev").unwrap_or("").into(),
linux_tar: matches.value_of("linux").unwrap_or("").into(),
keep: matches.is_present("keep"),
no_iolat: matches.is_present("no-iolat"),
force: matches.is_present("force"),
};
if let Err(e) = startup_checks() {
if args.force {
error!("Ignoring startup check failure: {}", &e);
} else {
panic!("Startup check failed: {}", &e);
}
}
ARGS.lock().unwrap().replace(args);
if std::env::var("RUST_LOG").is_ok() {
init_logging(0);
} else {
logger::init();
}
log::set_max_level(log::LevelFilter::Info);
info!("TEMP_DIR: {:?}", TEMP_DIR.path());
touch_units();
let mut siv = Cursive::default();
set_cursive_theme(&mut siv);
let _exit_guard = ExitGuard {};
let mut upd = UPDATERS.lock().unwrap();
upd.status
.replace(status::Updater::new(siv.cb_sink().clone()));
upd.graphs
.append(&mut graph::updater_factory(siv.cb_sink().clone()));
upd.journal.insert(
JournalViewId::Default,
journal::updater_factory(siv.cb_sink().clone(), JournalViewId::Default),
);
drop(upd);
// global key bindings
siv.add_global_callback('~', |siv| siv.toggle_debug_console());
siv.add_global_callback('i', |siv| doc::show_doc(siv, "index", true, false));
siv.add_global_callback('!', |siv| doc::show_doc(siv, "doc-format", true, false));
siv.add_global_callback('r', |siv| {
let id = doc::CUR_DOC.read().unwrap().id.clone();
doc::show_doc(siv, &id, true, false);
});
siv.add_global_callback('b', |siv| {
let mut doc_hist = doc::DOC_HIST.lock().unwrap();
if let Some(id) = doc_hist.pop() {
drop(doc_hist);
doc::show_doc(siv, &id, true, true);
}
});
siv.add_global_callback('q', |siv| {
siv.add_layer(Dialog::around(TextView::new("Exiting...")));
siv.quit();
});
siv.add_global_callback(event::Event::CtrlChar('l'), |siv| {
siv.clear();
});
siv.add_global_callback(event::Event::Key(event::Key::Esc), |siv| {
AGENT_ZV_REQ.store(false, Ordering::Relaxed);
update_agent_zoomed_view(siv);
toggle_zoomed_view(siv, None)
});
siv.add_global_callback('a', |siv| {
let req = !AGENT_ZV_REQ.load(Ordering::Relaxed);
AGENT_ZV_REQ.store(req, Ordering::Relaxed);
update_agent_zoomed_view(siv);
});
siv.add_global_callback('g', |siv| toggle_zoomed_view(siv, Some(ZoomedView::Graphs)));
siv.add_global_callback('l', |siv| {
toggle_zoomed_view(siv, Some(ZoomedView::Journals))
});
siv.add_global_callback('t', |_siv| {
graph::graph_intv_next();
kick_refresh();
});
siv.add_global_callback('T', |_siv| {
graph::graph_intv_prev();
kick_refresh();
});
siv.set_global_callback(event::Event::WindowResize, move |siv| {
// see https://github.com/gyscos/cursive/issues/519#issuecomment-721966516
siv.clear();
refresh_layout_and_kick(siv);
});
siv.add_global_callback(event::Event::Key(event::Key::Right), |siv| {
if ZOOMED_VIEW.lock().unwrap().last() == Some(&ZoomedView::Graphs) {
graph::graph_tab_next(siv)
}
});
siv.add_global_callback(event::Event::Key(event::Key::Left), |siv| {
if ZOOMED_VIEW.lock().unwrap().last() == Some(&ZoomedView::Graphs) {
graph::graph_tab_prev(siv)
}
});
refresh_layout_and_kick(&mut siv);
update_agent_zoomed_view(&mut siv);
// Run the event loop. Use the termion backend so that resctl-demo can
// be built without external dependencies. The buffered backend wrapping
// is necessary to avoid flickering, see
// https://github.com/gyscos/cursive/issues/525.
siv.run_with(|| {
let termion_backend = cursive::backends::termion::Backend::init().unwrap();
Box::new(cursive_buffered_backend::BufferedBackend::new(
termion_backend,
))
})
}