summaryrefslogtreecommitdiff
path: root/src/tty_wrap.cc
diff options
context:
space:
mode:
authorRyan Dahl <ry@tinyclouds.org>2011-09-20 15:57:23 -0700
committerRyan Dahl <ry@tinyclouds.org>2011-09-27 13:02:11 -0700
commit74b6426ec657aaa36bd3a6beab3f5723006a7ea0 (patch)
tree8920ca353f3b043c59231fd007a237b9d6803e8a /src/tty_wrap.cc
parentf5bdce9cc0abd5e49674ac5791ba623bc8fda085 (diff)
downloadandroid-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.cc55
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;