summaryrefslogtreecommitdiff
path: root/jni/ruby/ext/-test-/win32/console/attribute.c
blob: a2c07fc4fe6758266fbf7ac830d0cb57bf8cc467 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <ruby.h>

static VALUE rb_cConsoleScreenBufferInfo;

static VALUE
console_info(VALUE io)
{
    int fd = NUM2INT(rb_funcallv(io, rb_intern("fileno"), 00));
    HANDLE h = (HANDLE)rb_w32_get_osfhandle(fd);
    CONSOLE_SCREEN_BUFFER_INFO csbi;

    if (h == (HANDLE)-1) rb_raise(rb_eIOError, "invalid io");
    if (!GetConsoleScreenBufferInfo(h, &csbi))
        rb_syserr_fail(rb_w32_map_errno(GetLastError()), "not console");
    return rb_struct_new(rb_cConsoleScreenBufferInfo,
                         INT2FIX(csbi.dwSize.X), INT2FIX(csbi.dwSize.Y),
                         INT2FIX(csbi.dwCursorPosition.X), INT2FIX(csbi.dwCursorPosition.Y),
                         INT2FIX(csbi.wAttributes));
}

static VALUE
console_set_attribute(VALUE io, VALUE attr)
{
    int fd = NUM2INT(rb_funcallv(io, rb_intern("fileno"), 00));
    HANDLE h = (HANDLE)rb_w32_get_osfhandle(fd);

    if (h == (HANDLE)-1) rb_raise(rb_eIOError, "invalid io");
    SetConsoleTextAttribute(h, (WORD)NUM2INT(attr));
    return Qnil;
}

#define FOREGROUND_MASK (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY)
#define BACKGROUND_MASK (BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY)

void
Init_attribute(VALUE m)
{
    rb_cConsoleScreenBufferInfo = rb_struct_define_under(m, "ConsoleScreenBufferInfo",
                                                         "size_x""size_y",
                                                         "cur_x""cur_y",
                                                         "attr"NULL);
    rb_define_method(rb_cIO, "console_info", console_info, 0);
    rb_define_method(rb_cIO, "console_attribute", console_set_attribute, 1);

    rb_define_const(m, "FOREGROUND_MASK", INT2FIX(FOREGROUND_MASK));
    rb_define_const(m, "FOREGROUND_BLUE", INT2FIX(FOREGROUND_BLUE));
    rb_define_const(m, "FOREGROUND_GREEN", INT2FIX(FOREGROUND_GREEN));
    rb_define_const(m, "FOREGROUND_RED", INT2FIX(FOREGROUND_RED));
    rb_define_const(m, "FOREGROUND_INTENSITY", INT2FIX(FOREGROUND_INTENSITY));

    rb_define_const(m, "BACKGROUND_MASK", INT2FIX(BACKGROUND_MASK));
    rb_define_const(m, "BACKGROUND_BLUE", INT2FIX(BACKGROUND_BLUE));
    rb_define_const(m, "BACKGROUND_GREEN", INT2FIX(BACKGROUND_GREEN));
    rb_define_const(m, "BACKGROUND_RED", INT2FIX(BACKGROUND_RED));
    rb_define_const(m, "BACKGROUND_INTENSITY", INT2FIX(BACKGROUND_INTENSITY));
}