diff --git a/native_client_sdk/src/libraries/nacl_io/mount_node_tty.cc b/native_client_sdk/src/libraries/nacl_io/mount_node_tty.cc index af9b7543a1637..6b8fb66877134 100644 --- a/native_client_sdk/src/libraries/nacl_io/mount_node_tty.cc +++ b/native_client_sdk/src/libraries/nacl_io/mount_node_tty.cc @@ -257,6 +257,8 @@ Error MountNodeTty::VIoctl(int request, va_list args) { struct winsize* size = va_arg(args, struct winsize*); { AUTO_LOCK(node_lock_); + if (rows_ == size->ws_row && cols_ == size->ws_col) + return 0; rows_ = size->ws_row; cols_ = size->ws_col; } diff --git a/native_client_sdk/src/libraries/ppapi_simple/ps_instance.cc b/native_client_sdk/src/libraries/ppapi_simple/ps_instance.cc index 3f59e08b48ac2..a7dffc7118149 100644 --- a/native_client_sdk/src/libraries/ppapi_simple/ps_instance.cc +++ b/native_client_sdk/src/libraries/ppapi_simple/ps_instance.cc @@ -238,6 +238,26 @@ bool PSInstance::ProcessProperties() { if (tty_resize) RegisterMessageHandler(tty_resize, MessageHandlerResizeStatic, this); + char* tty_rows = getenv("PS_TTY_ROWS"); + char* tty_cols = getenv("PS_TTY_COLS"); + if (tty_rows && tty_cols) { + char* end = tty_rows; + int rows = strtol(tty_rows, &end, 10); + if (*end != '\0' || rows < 0) { + Error("Invalid value for PS_TTY_ROWS: %s", tty_rows); + } else { + end = tty_cols; + int cols = strtol(tty_cols, &end, 10); + if (*end != '\0' || cols < 0) + Error("Invalid value for PS_TTY_COLS: %s", tty_cols); + else + HandleResize(cols, rows); + } + } + else if (tty_rows || tty_cols) { + Error("PS_TTY_ROWS and PS_TTY_COLS must be set together"); + } + tioc_nacl_output handler; handler.handler = TtyOutputHandlerStatic; handler.user_data = this; @@ -372,16 +392,22 @@ void PSInstance::MessageHandlerInput(const pp::Var& message) { } } +void PSInstance::HandleResize(int width, int height){ + struct winsize size; + memset(&size, 0, sizeof(size)); + size.ws_col = width; + size.ws_row = height; + ioctl(tty_fd_, TIOCSWINSZ, reinterpret_cast<char*>(&size)); +} + void PSInstance::MessageHandlerResize(const pp::Var& message) { assert(message.is_array()); pp::VarArray array(message); assert(array.GetLength() == 2); - struct winsize size; - memset(&size, 0, sizeof(size)); - size.ws_col = array.Get(0).AsInt(); - size.ws_row = array.Get(1).AsInt(); - ioctl(tty_fd_, TIOCSWINSZ, reinterpret_cast<char*>(&size)); + int width = array.Get(0).AsInt(); + int height = array.Get(1).AsInt(); + HandleResize(width, height); } ssize_t PSInstance::TtyOutputHandlerStatic(const char* buf, diff --git a/native_client_sdk/src/libraries/ppapi_simple/ps_instance.h b/native_client_sdk/src/libraries/ppapi_simple/ps_instance.h index ce96aae5b991b..4138982b48755 100644 --- a/native_client_sdk/src/libraries/ppapi_simple/ps_instance.h +++ b/native_client_sdk/src/libraries/ppapi_simple/ps_instance.h @@ -154,6 +154,7 @@ class PSInstance : public pp::Instance, pp::MouseLock, pp::Graphics3DClient { ssize_t TtyOutputHandler(const char* buf, size_t count); void MessageHandlerInput(const pp::Var& message); void MessageHandlerResize(const pp::Var& message); + void HandleResize(int width, int height); static ssize_t TtyOutputHandlerStatic(const char* buf, size_t count, void* user_data);