diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2011-09-20 15:57:23 -0700 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2011-09-27 13:02:11 -0700 |
commit | 74b6426ec657aaa36bd3a6beab3f5723006a7ea0 (patch) | |
tree | 8920ca353f3b043c59231fd007a237b9d6803e8a /src/tty_wrap.cc | |
parent | f5bdce9cc0abd5e49674ac5791ba623bc8fda085 (diff) | |
download | android-node-v8-74b6426ec657aaa36bd3a6beab3f5723006a7ea0.tar.gz android-node-v8-74b6426ec657aaa36bd3a6beab3f5723006a7ea0.tar.bz2 android-node-v8-74b6426ec657aaa36bd3a6beab3f5723006a7ea0.zip |
Initial pass at new TTY js layer
This breaks Windows.
Diffstat (limited to 'src/tty_wrap.cc')
-rw-r--r-- | src/tty_wrap.cc | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/tty_wrap.cc b/src/tty_wrap.cc index f78739808d..3c85aaeb07 100644 --- a/src/tty_wrap.cc +++ b/src/tty_wrap.cc @@ -6,6 +6,16 @@ namespace node { +#define UNWRAP \ + assert(!args.Holder().IsEmpty()); \ + assert(args.Holder()->InternalFieldCount() > 0); \ + TTYWrap* wrap = \ + static_cast<TTYWrap*>(args.Holder()->GetPointerFromInternalField(0)); \ + if (!wrap) { \ + SetErrno(UV_EBADF); \ + return scope.Close(Integer::New(-1)); \ + } + using v8::Object; using v8::Handle; using v8::Local; @@ -40,6 +50,9 @@ class TTYWrap : StreamWrap { NODE_SET_PROTOTYPE_METHOD(t, "readStop", StreamWrap::ReadStop); NODE_SET_PROTOTYPE_METHOD(t, "write", StreamWrap::Write); + NODE_SET_PROTOTYPE_METHOD(t, "getWindowSize", TTYWrap::GetWindowSize); + NODE_SET_PROTOTYPE_METHOD(t, "setRawMode", SetRawMode); + NODE_SET_METHOD(target, "isTTY", IsTTY); target->Set(String::NewSymbol("TTY"), t->GetFunction()); @@ -53,6 +66,48 @@ class TTYWrap : StreamWrap { return uv_guess_handle(fd) == UV_TTY ? v8::True() : v8::False(); } + static Handle<Value> GetWindowSize(const Arguments& args) { + HandleScope scope; + + UNWRAP + + int width, height; + int r = uv_tty_get_winsize(&wrap->handle_, &width, &height); + + if (r) { + SetErrno(uv_last_error(uv_default_loop()).code); + return v8::Undefined(); + } + + Local<v8::Array> a = v8::Array::New(2); + a->Set(0, Integer::New(width)); + a->Set(1, Integer::New(height)); + + return scope.Close(a); + } + + static Handle<Value> SetRawMode(const Arguments& args) { + HandleScope scope; + + assert(!args.Holder().IsEmpty()); + assert(args.Holder()->InternalFieldCount() > 0); + TTYWrap* wrap = + static_cast<TTYWrap*>(args.Holder()->GetPointerFromInternalField(0)); + + if (!wrap) { + SetErrno(UV_EBADF); + return scope.Close(Integer::New(-1)); + } + + int r = uv_tty_set_mode(&wrap->handle_, args[0]->IsTrue()); + + if (r) { + SetErrno(uv_last_error(uv_default_loop()).code); + } + + return scope.Close(Integer::New(r)); + } + static Handle<Value> New(const Arguments& args) { HandleScope scope; |