TTY review
This commit is contained in:
parent
184dc33aa5
commit
b466f00c46
@ -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;
|
||||
};
|
||||
|
||||
Loading…
Reference in New Issue
Block a user