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 { namespace details {
struct ResetModeMemo {
~ResetModeMemo() {
uv_tty_reset_mode();
}
};
enum class UVTTYModeT: std::underlying_type_t<uv_tty_mode_t> { enum class UVTTYModeT: std::underlying_type_t<uv_tty_mode_t> {
NORMAL = UV_TTY_MODE_NORMAL, NORMAL = UV_TTY_MODE_NORMAL,
RAW = UV_TTY_MODE_RAW, 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> { class TTYHandle final: public StreamHandle<TTYHandle, uv_tty_t> {
explicit TTYHandle(std::shared_ptr<Loop> ref, explicit TTYHandle(std::shared_ptr<Loop> ref,
FileHandle desc, FileHandle desc,
bool readable) bool readable,
: StreamHandle{std::move(ref)}, fd{desc}, rw{readable} std::shared_ptr<details::ResetModeMemo> rmm)
: StreamHandle{std::move(ref)},
memo{std::move(rmm)},
fd{desc},
rw{readable}
{ } { }
public: public:
@ -38,7 +49,10 @@ public:
template<typename... Args> template<typename... Args>
static std::shared_ptr<TTYHandle> create(Args&&... 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); } 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)); }, 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() { WinSize getWinSize() {
std::pair<int, int> size{0, 0}; std::pair<int, int> size{0, 0};
@ -70,6 +84,7 @@ public:
} }
private: private:
std::shared_ptr<details::ResetModeMemo> memo;
FileHandle::Type fd; FileHandle::Type fd;
int rw; int rw;
}; };