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