From b466f00c464534dd55f03e7cc8704b2d91cab5cc Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Thu, 28 Jul 2016 15:50:49 +0200 Subject: [PATCH] TTY review --- src/uvw/tty.hpp | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/uvw/tty.hpp b/src/uvw/tty.hpp index fd9e4e92..9750a093 100644 --- a/src/uvw/tty.hpp +++ b/src/uvw/tty.hpp @@ -16,6 +16,13 @@ namespace uvw { namespace details { +struct ResetModeMemo { + ~ResetModeMemo() { + uv_tty_reset_mode(); + } +}; + + enum class UVTTYModeT: std::underlying_type_t { NORMAL = UV_TTY_MODE_NORMAL, RAW = UV_TTY_MODE_RAW, @@ -29,8 +36,12 @@ enum class UVTTYModeT: std::underlying_type_t { class TTYHandle final: public StreamHandle { explicit TTYHandle(std::shared_ptr ref, FileHandle desc, - bool readable) - : StreamHandle{std::move(ref)}, fd{desc}, rw{readable} + bool readable, + std::shared_ptr rmm) + : StreamHandle{std::move(ref)}, + memo{std::move(rmm)}, + fd{desc}, + rw{readable} { } public: @@ -38,7 +49,10 @@ public: template static std::shared_ptr create(Args&&... args) { - return std::shared_ptr{new TTYHandle{std::forward(args)...}}; + static std::weak_ptr rmm; + auto ptr = rmm.lock(); + if(!ptr) { rmm = ptr = std::make_shared(); } + return std::shared_ptr{new TTYHandle{std::forward(args)..., ptr}}; } bool init() { return initialize(&uv_tty_init, fd, rw); } @@ -50,7 +64,7 @@ public: }, get(), static_cast>(m)); } - void reset() { invoke(&uv_tty_reset_mode); } + void reset() noexcept { invoke(&uv_tty_reset_mode); } WinSize getWinSize() { std::pair size{0, 0}; @@ -70,6 +84,7 @@ public: } private: + std::shared_ptr memo; FileHandle::Type fd; int rw; };