TTY review

This commit is contained in:
Michele Caini 2016-07-28 15:50:49 +02:00
parent 184dc33aa5
commit b466f00c46

View File

@ -16,6 +16,13 @@ namespace uvw {
namespace details {
struct ResetModeMemo {
~ResetModeMemo() {
uv_tty_reset_mode();
}
};
enum class UVTTYModeT: std::underlying_type_t<uv_tty_mode_t> {
NORMAL = UV_TTY_MODE_NORMAL,
RAW = UV_TTY_MODE_RAW,
@ -29,8 +36,12 @@ enum class UVTTYModeT: std::underlying_type_t<uv_tty_mode_t> {
class TTYHandle final: public StreamHandle<TTYHandle, uv_tty_t> {
explicit TTYHandle(std::shared_ptr<Loop> ref,
FileHandle desc,
bool readable)
: StreamHandle{std::move(ref)}, fd{desc}, rw{readable}
bool readable,
std::shared_ptr<details::ResetModeMemo> rmm)
: StreamHandle{std::move(ref)},
memo{std::move(rmm)},
fd{desc},
rw{readable}
{ }
public:
@ -38,7 +49,10 @@ public:
template<typename... Args>
static std::shared_ptr<TTYHandle> create(Args&&... args) {
return std::shared_ptr<TTYHandle>{new TTYHandle{std::forward<Args>(args)...}};
static std::weak_ptr<details::ResetModeMemo> rmm;
auto ptr = rmm.lock();
if(!ptr) { rmm = ptr = std::make_shared<details::ResetModeMemo>(); }
return std::shared_ptr<TTYHandle>{new TTYHandle{std::forward<Args>(args)..., ptr}};
}
bool init() { return initialize<uv_tty_t>(&uv_tty_init, fd, rw); }
@ -50,7 +64,7 @@ public:
}, get<uv_tty_t>(), static_cast<std::underlying_type_t<Mode>>(m));
}
void reset() { invoke(&uv_tty_reset_mode); }
void reset() noexcept { invoke(&uv_tty_reset_mode); }
WinSize getWinSize() {
std::pair<int, int> size{0, 0};
@ -70,6 +84,7 @@ public:
}
private:
std::shared_ptr<details::ResetModeMemo> memo;
FileHandle::Type fd;
int rw;
};