class IO - io-console-0.4.2 Documentation

# class IO

### Public Class Methods

console → #<File:/dev/tty> click to toggle source

Returns an File instance opened console.

You must require 'io/console' to use this method.

    static VALUE
    console_dev(VALUE klass)
    {
        VALUE con = 0;
        rb_io_t *fptr;

        if (klass == rb_cIO) klass = rb_cFile;
        if (rb_const_defined(klass, id_console)) {
            con = rb_const_get(klass, id_console);
            if (RB_TYPE_P(con, T_FILE)) {
                if ((fptr = RFILE(con)->fptr) && GetReadFD(fptr) != -1)
                    return con;
            }
            rb_mod_remove_const(klass, ID2SYM(id_console));
        }
        {
            VALUE args[2];
    #if defined HAVE_TERMIOS_H || defined HAVE_TERMIO_H || defined HAVE_SGTTY_H
    # define CONSOLE_DEVICE "/dev/tty"
    #elif defined _WIN32
    # define CONSOLE_DEVICE "con$"
    # define CONSOLE_DEVICE_FOR_READING "conin$"
    # define CONSOLE_DEVICE_FOR_WRITING "conout$"
    #endif
    #ifndef CONSOLE_DEVICE_FOR_READING
    # define CONSOLE_DEVICE_FOR_READING CONSOLE_DEVICE
    #endif
    #ifdef CONSOLE_DEVICE_FOR_WRITING
            VALUE out;
            rb_io_t *ofptr;
    #endif
            int fd;

    #ifdef CONSOLE_DEVICE_FOR_WRITING
            fd = rb_cloexec_open(CONSOLE_DEVICE_FOR_WRITING, O_WRONLY, 0);
            if (fd < 0) return Qnil;
            rb_update_max_fd(fd);
            args[1] = INT2FIX(O_WRONLY);
            args[0] = INT2NUM(fd);
            out = rb_class_new_instance(2, args, klass);
    #endif
            fd = rb_cloexec_open(CONSOLE_DEVICE_FOR_READING, O_RDWR, 0);
            if (fd < 0) {
    #ifdef CONSOLE_DEVICE_FOR_WRITING
                rb_io_close(out);
    #endif
                return Qnil;
            }
            rb_update_max_fd(fd);
            args[1] = INT2FIX(O_RDWR);
            args[0] = INT2NUM(fd);
            con = rb_class_new_instance(2, args, klass);
            GetOpenFile(con, fptr);
    #ifdef HAVE_RUBY_IO_H
            fptr->pathv = rb_obj_freeze(rb_str_new2(CONSOLE_DEVICE));
    #else
            fptr->path = ruby_strdup(CONSOLE_DEVICE);
    #endif
    #ifdef CONSOLE_DEVICE_FOR_WRITING
            GetOpenFile(out, ofptr);
    # ifdef HAVE_RB_IO_GET_WRITE_IO
            ofptr->pathv = fptr->pathv;
            fptr->tied_io_for_writing = out;
    # else
            fptr->f2 = ofptr->f;
            ofptr->f = 0;
    # endif
            ofptr->mode |= FMODE_SYNC;
    #endif
            fptr->mode |= FMODE_SYNC;
            rb_const_set(klass, id_console, con);
        }
        return con;
    }

console_size() click to toggle source

    # File lib/console/size.rb, line 15
    def IO.console_size
      console.winsize
    rescue NoMethodError
      default_console_size
    end

default_console_size() click to toggle source

    # File lib/console/size.rb, line 1
    def IO.default_console_size
      [
        ENV["LINES"].to_i.nonzero? || 25,
        ENV["COLUMNS"].to_i.nonzero? || 80,
      ]
    end

### Public Instance Methods

cooked {|io| } click to toggle source

Yields `self` within cooked mode.

    STDIN.cooked(&:gets)

will read and return a line with echo back and line editing.

You must require 'io/console' to use this method.

    static VALUE
    console_cooked(VALUE io)
    {
        return ttymode(io, rb_yield, set_cookedmode, NULL);
    }

cooked! click to toggle source

Enables cooked mode.

If the terminal mode needs to be back, use io.cooked { … }.

You must require 'io/console' to use this method.

    static VALUE
    console_set_cooked(VALUE io)
    {
        conmode t;
        rb_io_t *fptr;
        int fd;

        GetOpenFile(io, fptr);
        fd = GetReadFD(fptr);
        if (!getattr(fd, &t)) rb_sys_fail(0);
        set_cookedmode(&t, NULL);
        if (!setattr(fd, &t)) rb_sys_fail(0);
        return io;
    }

echo = flag click to toggle source

Enables/disables echo back. On some platforms, all combinations of this flags and raw/cooked mode may not be valid.

You must require 'io/console' to use this method.

    static VALUE
    console_set_echo(VALUE io, VALUE f)
    {
        conmode t;
        rb_io_t *fptr;
        int fd;

        GetOpenFile(io, fptr);
        fd = GetReadFD(fptr);
        if (!getattr(fd, &t)) rb_sys_fail(0);
        if (RTEST(f))
            set_echo(&t, NULL);
        else
            set_noecho(&t, NULL);
        if (!setattr(fd, &t)) rb_sys_fail(0);
        return io;
    }

echo? → true or false click to toggle source

Returns `true` if echo back is enabled.

You must require 'io/console' to use this method.

    static VALUE
    console_echo_p(VALUE io)
    {
        conmode t;
        rb_io_t *fptr;
        int fd;

        GetOpenFile(io, fptr);
        fd = GetReadFD(fptr);
        if (!getattr(fd, &t)) rb_sys_fail(0);
        return echo_p(&t) ? Qtrue : Qfalse;
    }

getch(min: nil, time: nil) → char click to toggle source

Reads and returns a character in raw mode.

You must require 'io/console' to use this method.

    static VALUE
    console_getch(int argc, VALUE *argv, VALUE io)
    {
        rawmode_arg_t opts, *optp = rawmode_opt(argc, argv, &opts);
        return ttymode(io, getc_call, set_rawmode, optp);
    }

iflush click to toggle source

Flushes input buffer in kernel.

You must require 'io/console' to use this method.

    static VALUE
    console_iflush(VALUE io)
    {
        rb_io_t *fptr;
        int fd;

        GetOpenFile(io, fptr);
        fd = GetReadFD(fptr);
    #if defined HAVE_TERMIOS_H || defined HAVE_TERMIO_H
        if (tcflush(fd, TCIFLUSH)) rb_sys_fail(0);
    #endif
        return io;
    }

ioflush click to toggle source

Flushes input and output buffers in kernel.

You must require 'io/console' to use this method.

    static VALUE
    console_ioflush(VALUE io)
    {
        rb_io_t *fptr;
    #if defined HAVE_TERMIOS_H || defined HAVE_TERMIO_H
        int fd1, fd2;
    #endif

        GetOpenFile(io, fptr);
    #if defined HAVE_TERMIOS_H || defined HAVE_TERMIO_H
        fd1 = GetReadFD(fptr);
        fd2 = GetWriteFD(fptr);
        if (fd2 != -1 && fd1 != fd2) {
            if (tcflush(fd1, TCIFLUSH)) rb_sys_fail(0);
            if (tcflush(fd2, TCOFLUSH)) rb_sys_fail(0);
        }
        else {
            if (tcflush(fd1, TCIOFLUSH)) rb_sys_fail(0);
        }
    #endif
        return io;
    }

noecho {|io| } click to toggle source

Yields `self` with disabling echo back.

    STDIN.noecho(&:gets)

will read and return a line without echo back.

You must require 'io/console' to use this method.

    static VALUE
    console_noecho(VALUE io)
    {
        return ttymode(io, rb_yield, set_noecho, NULL);
    }

oflush click to toggle source

Flushes output buffer in kernel.

You must require 'io/console' to use this method.

    static VALUE
    console_oflush(VALUE io)
    {
        rb_io_t *fptr;
        int fd;

        GetOpenFile(io, fptr);
        fd = GetWriteFD(fptr);
    #if defined HAVE_TERMIOS_H || defined HAVE_TERMIO_H
        if (tcflush(fd, TCOFLUSH)) rb_sys_fail(0);
    #endif
        return io;
    }

raw(min: nil, time: nil) {|io| } click to toggle source

Yields `self` within raw mode.

    STDIN.raw(&:gets)

will read and return a line without echo back and line editing.

You must require 'io/console' to use this method.

    static VALUE
    console_raw(int argc, VALUE *argv, VALUE io)
    {
        rawmode_arg_t opts, *optp = rawmode_opt(argc, argv, &opts);
        return ttymode(io, rb_yield, set_rawmode, optp);
    }

raw!(min: nil, time: nil) click to toggle source

Enables raw mode.

If the terminal mode needs to be back, use io.raw { … }.

You must require 'io/console' to use this method.

    static VALUE
    console_set_raw(int argc, VALUE *argv, VALUE io)
    {
        conmode t;
        rb_io_t *fptr;
        int fd;
        rawmode_arg_t opts, *optp = rawmode_opt(argc, argv, &opts);

        GetOpenFile(io, fptr);
        fd = GetReadFD(fptr);
        if (!getattr(fd, &t)) rb_sys_fail(0);
        set_rawmode(&t, optp);
        if (!setattr(fd, &t)) rb_sys_fail(0);
        return io;
    }

winsize → [rows, columns] click to toggle source

Returns console size.

You must require 'io/console' to use this method.

    static VALUE
    console_winsize(VALUE io)
    {
        rb_io_t *fptr;
        int fd;
        rb_console_size_t ws;

        GetOpenFile(io, fptr);
        fd = GetWriteFD(fptr);
        if (!getwinsize(fd, &ws)) rb_sys_fail(0);
        return rb_assoc_new(INT2NUM(winsize_row(&ws)), INT2NUM(winsize_col(&ws)));
    }

winsize = [rows, columns] click to toggle source

Tries to set console size. The effect depends on the platform and the running environment.

You must require 'io/console' to use this method.

    static VALUE
    console_set_winsize(VALUE io, VALUE size)
    {
        rb_io_t *fptr;
        rb_console_size_t ws;
    #if defined _WIN32
        HANDLE wh;
        int newrow, newcol;
    #endif
        VALUE row, col, xpixel, ypixel;
    #if defined TIOCSWINSZ
        int fd;
    #endif

        GetOpenFile(io, fptr);
        size = rb_Array(size);
        rb_scan_args((int)RARRAY_LEN(size), RARRAY_PTR(size), "22",
                    &row, &col, &xpixel, &ypixel);
    #if defined TIOCSWINSZ
        fd = GetWriteFD(fptr);
        ws.ws_row = ws.ws_col = ws.ws_xpixel = ws.ws_ypixel = 0;
    #define SET(m) ws.ws_##m = NIL_P(m) ? 0 : (unsigned short)NUM2UINT(m)
        SET(row);
        SET(col);
        SET(xpixel);
        SET(ypixel);
    #undef SET
        if (!setwinsize(fd, &ws)) rb_sys_fail(0);
    #elif defined _WIN32
        wh = (HANDLE)rb_w32_get_osfhandle(GetReadFD(fptr));
        newrow = (SHORT)NUM2UINT(row);
        newcol = (SHORT)NUM2UINT(col);
        if (!getwinsize(GetReadFD(fptr), &ws)) {
            rb_sys_fail("GetConsoleScreenBufferInfo");
        }
        if ((ws.dwSize.X < newcol && (ws.dwSize.X = newcol, 1)) ||
            (ws.dwSize.Y < newrow && (ws.dwSize.Y = newrow, 1))) {
            if (!(SetConsoleScreenBufferSize(wh, ws.dwSize) || SET_LAST_ERROR)) {
                rb_sys_fail("SetConsoleScreenBufferInfo");
            }
        }
        ws.srWindow.Left = 0;
        ws.srWindow.Top = 0;
        ws.srWindow.Right = newcol;
        ws.srWindow.Bottom = newrow;
        if (!(SetConsoleWindowInfo(wh, FALSE, &ws.srWindow) || SET_LAST_ERROR)) {
            rb_sys_fail("SetConsoleWindowInfo");
        }
    #endif
        return io;
    }