42 lines
1.1 KiB
C++
42 lines
1.1 KiB
C++
#include "fgc/ui/HeadlessUi.h"
|
|
|
|
#include <chrono>
|
|
#include <iostream>
|
|
#include <string>
|
|
|
|
namespace fgc {
|
|
|
|
HeadlessUi::~HeadlessUi() { stop(); }
|
|
|
|
void HeadlessUi::start(SnapshotFn /*snapshot*/, CommandSink sink) {
|
|
sink_ = std::move(sink);
|
|
running_ = true;
|
|
input_thread_ = std::thread(&HeadlessUi::inputLoop, this);
|
|
}
|
|
|
|
void HeadlessUi::stop() {
|
|
if (!running_.exchange(false)) return;
|
|
// inputLoop blocks on getline; closing happens when stdin hits EOF or the
|
|
// process exits. Detach if it is still parked so shutdown does not hang.
|
|
if (input_thread_.joinable()) {
|
|
if (std::cin.eof()) input_thread_.join();
|
|
else input_thread_.detach();
|
|
}
|
|
}
|
|
|
|
// Lifted verbatim from the old Application::Impl::inputLoop: read lines and push
|
|
// them onto the command sink (formerly the cmd_queue).
|
|
void HeadlessUi::inputLoop() {
|
|
std::string line;
|
|
while (running_) {
|
|
if (!std::getline(std::cin, line)) {
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
|
continue;
|
|
}
|
|
if (line.empty()) continue;
|
|
if (sink_) sink_(line);
|
|
}
|
|
}
|
|
|
|
} // namespace fgc
|