@@ -44,6 +44,7 @@ using namespace lol; | |||||
Pty::Pty() | Pty::Pty() | ||||
: m_fd(-1), | : m_fd(-1), | ||||
m_pid(-1), | m_pid(-1), | ||||
m_eof(false), | |||||
m_unread_data(0), | m_unread_data(0), | ||||
m_unread_len(0) | m_unread_len(0) | ||||
{ | { | ||||
@@ -104,6 +105,11 @@ void Pty::Run(char const *command, ivec2 size) | |||||
#endif | #endif | ||||
} | } | ||||
bool Pty::IsEof() const | |||||
{ | |||||
return m_eof; | |||||
} | |||||
size_t Pty::ReadData(char *data, size_t maxlen) | size_t Pty::ReadData(char *data, size_t maxlen) | ||||
{ | { | ||||
#if defined HAVE_PTY_H || defined HAVE_UTIL_H || defined HAVE_LIBUTIL_H | #if defined HAVE_PTY_H || defined HAVE_UTIL_H || defined HAVE_LIBUTIL_H | ||||
@@ -141,14 +147,19 @@ size_t Pty::ReadData(char *data, size_t maxlen) | |||||
if (ret < 0) | if (ret < 0) | ||||
{ | { | ||||
Log::Error("cannot read from PTY\n"); | Log::Error("cannot read from PTY\n"); | ||||
m_eof = true; | |||||
return 0; | return 0; | ||||
} | } | ||||
if (ret) | |||||
else if (ret) | |||||
{ | { | ||||
if (FD_ISSET((int)m_fd, &fdset)) | if (FD_ISSET((int)m_fd, &fdset)) | ||||
{ | { | ||||
ssize_t nr = read((int)m_fd, data, maxlen); | ssize_t nr = read((int)m_fd, data, maxlen); | ||||
/* Data available but zero-length read: EOF */ | |||||
if (nr <= 0) | |||||
m_eof = true; | |||||
if (nr >= 0) | if (nr >= 0) | ||||
return nr; | return nr; | ||||
} | } | ||||
@@ -12,6 +12,7 @@ public: | |||||
~Pty(); | ~Pty(); | ||||
void Run(char const *command, ivec2 size); | void Run(char const *command, ivec2 size); | ||||
bool IsEof() const; | |||||
size_t ReadData(char *data, size_t maxlen); | size_t ReadData(char *data, size_t maxlen); | ||||
void UnreadData(char *data, size_t len); | void UnreadData(char *data, size_t len); | ||||
@@ -22,6 +23,7 @@ public: | |||||
private: | private: | ||||
int64_t m_fd; | int64_t m_fd; | ||||
int64_t m_pid; | int64_t m_pid; | ||||
bool m_eof; | |||||
char const *m_argv[2]; | char const *m_argv[2]; | ||||
char *m_unread_data; | char *m_unread_data; | ||||
size_t m_unread_len; | size_t m_unread_len; | ||||
@@ -113,13 +113,18 @@ void Term::TickGame(float seconds) | |||||
} | } | ||||
} | } | ||||
/* This is the real terminal code */ | |||||
/* XXX: for now we draw fancy shit */ | |||||
m_time += seconds; | m_time += seconds; | ||||
if (m_pty->IsEof()) | |||||
{ | |||||
/* FIXME: we could do more interesting things here… */ | |||||
Ticker::Shutdown(); | |||||
} | |||||
m_pty->SetWindowSize(ivec2(caca_get_canvas_width(m_caca), | m_pty->SetWindowSize(ivec2(caca_get_canvas_width(m_caca), | ||||
caca_get_canvas_height(m_caca))); | caca_get_canvas_height(m_caca))); | ||||
/* This is the real terminal code */ | |||||
size_t total = 0; | size_t total = 0; | ||||
for (;;) | for (;;) | ||||
{ | { | ||||
@@ -248,4 +253,4 @@ void Term::DrawFancyShit() | |||||
caca_put_str(m_caca, 0, 2, "root@lol:~/ echo LOL"); | caca_put_str(m_caca, 0, 2, "root@lol:~/ echo LOL"); | ||||
caca_put_str(m_caca, 0, 3, "LOL"); | caca_put_str(m_caca, 0, 3, "LOL"); | ||||
caca_put_str(m_caca, 0, 4, "root@lol:~/"); | caca_put_str(m_caca, 0, 4, "root@lol:~/"); | ||||
} | |||||
} |
@@ -726,10 +726,6 @@ void Render::Pause() | |||||
void Render::TickDraw(float seconds) | void Render::TickDraw(float seconds) | ||||
{ | { | ||||
/* keyboard manager */ | /* keyboard manager */ | ||||
if (Input::WasReleased(Key::Escape)) | |||||
{ | |||||
Ticker::Shutdown(); | |||||
} | |||||
if (Input::WasPressed(Key::F1)) | if (Input::WasPressed(Key::F1)) | ||||
{ | { | ||||
g_setup = !g_setup; | g_setup = !g_setup; | ||||