| @@ -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; | ||||