@@ -123,12 +123,58 @@ static VALUE set_mouse2(VALUE self, VALUE visible) | |||
static VALUE get_event(VALUE self, VALUE event_mask, VALUE timeout) | |||
{ | |||
caca_event_t ev; | |||
VALUE e; | |||
if(caca_get_event(_SELF, NUM2UINT(event_mask), &ev, NUM2INT(timeout)) == 0) | |||
{ | |||
return Qnil; | |||
} | |||
//FIXME | |||
return Qnil; | |||
switch(ev.type) | |||
{ | |||
case CACA_EVENT_KEY_PRESS: | |||
e = rb_funcall(cEventKeyPress, rb_intern("new"), 3, | |||
UINT2NUM(ev.data.key.ch), | |||
ULONG2NUM(ev.data.key.utf32), | |||
rb_str_new(ev.data.key.utf8, 8)); | |||
break; | |||
case CACA_EVENT_KEY_RELEASE: | |||
e = rb_funcall(cEventKeyRelease, rb_intern("new"), 3, | |||
UINT2NUM(ev.data.key.ch), | |||
ULONG2NUM(ev.data.key.utf32), | |||
rb_str_new(ev.data.key.utf8, 8)); | |||
break; | |||
case CACA_EVENT_MOUSE_PRESS: | |||
e = rb_funcall(cEventMousePress, rb_intern("new"), 3, | |||
UINT2NUM(ev.data.mouse.x), | |||
UINT2NUM(ev.data.mouse.y), | |||
UINT2NUM(ev.data.mouse.button)); | |||
break; | |||
case CACA_EVENT_MOUSE_RELEASE: | |||
e = rb_funcall(cEventMouseRelease, rb_intern("new"), 3, | |||
UINT2NUM(ev.data.mouse.x), | |||
UINT2NUM(ev.data.mouse.y), | |||
UINT2NUM(ev.data.mouse.button)); | |||
break; | |||
case CACA_EVENT_MOUSE_MOTION: | |||
e = rb_funcall(cEventMouseMotion, rb_intern("new"), 3, | |||
UINT2NUM(ev.data.mouse.x), | |||
UINT2NUM(ev.data.mouse.y), | |||
Qnil); | |||
break; | |||
case CACA_EVENT_RESIZE: | |||
e = rb_funcall(cEventResize, rb_intern("new"), 2, | |||
UINT2NUM(ev.data.resize.w), | |||
UINT2NUM(ev.data.resize.h)); | |||
break; | |||
case CACA_EVENT_QUIT: | |||
e = rb_funcall(cEventQuit, rb_intern("new"), 0); | |||
break; | |||
default: | |||
rb_raise(rb_eRuntimeError, "Invalid event received !"); | |||
} | |||
return e; | |||
} | |||
void Init_caca_display(VALUE mCaca) | |||
@@ -149,5 +195,5 @@ void Init_caca_display(VALUE mCaca) | |||
rb_define_method(cDisplay, "mouse_y", get_mouse_y, 0); | |||
rb_define_method(cDisplay, "mouse=", set_mouse, 1); | |||
rb_define_method(cDisplay, "set_mouse", set_mouse2, 1); | |||
rb_define_method(cDisplay, "get_event", get_event, 3); | |||
rb_define_method(cDisplay, "get_event", get_event, 2); | |||
} |
@@ -15,8 +15,58 @@ | |||
#include "common.h" | |||
VALUE cEvent; | |||
static VALUE cEventKey; | |||
VALUE cEventKeyPress; | |||
VALUE cEventKeyRelease; | |||
static VALUE cEventMouse; | |||
VALUE cEventMousePress; | |||
VALUE cEventMouseRelease; | |||
VALUE cEventMouseMotion; | |||
VALUE cEventResize; | |||
VALUE cEventQuit; | |||
void Init_caca_event(VALUE mCaca) | |||
{ | |||
cEvent = rb_define_class_under(mCaca, "Event", rb_cObject); | |||
rb_define_const(cEvent, "TYPE", INT2FIX(CACA_EVENT_ANY)); | |||
cEventKey = rb_define_class_under(cEvent, "Key", cEvent); | |||
rb_define_const(cEventKey, "TYPE", | |||
INT2FIX(CACA_EVENT_KEY_PRESS| | |||
CACA_EVENT_KEY_RELEASE)); | |||
cEventKeyPress = rb_define_class_under(cEventKey, "Press", cEventKey); | |||
rb_define_const(cEventKeyPress, "TYPE", | |||
INT2FIX(CACA_EVENT_KEY_PRESS)); | |||
cEventKeyRelease = rb_define_class_under(cEventKey, "Release", cEventKey); | |||
rb_define_const(cEventKeyRelease, "TYPE", | |||
INT2FIX(CACA_EVENT_KEY_RELEASE)); | |||
cEventMouse = rb_define_class_under(cEvent, "Mouse", cEvent); | |||
rb_define_const(cEventMouse, "TYPE", | |||
INT2FIX(CACA_EVENT_MOUSE_PRESS| | |||
CACA_EVENT_MOUSE_RELEASE| | |||
CACA_EVENT_MOUSE_MOTION)); | |||
cEventMousePress = rb_define_class_under(cEventMouse, "Press", cEventMouse); | |||
rb_define_const(cEventMousePress, "TYPE", | |||
INT2FIX(CACA_EVENT_MOUSE_PRESS)); | |||
cEventMouseRelease = rb_define_class_under(cEventMouse, "Release", cEventMouse); | |||
rb_define_const(cEventMouseRelease, "TYPE", | |||
INT2FIX(CACA_EVENT_MOUSE_RELEASE)); | |||
cEventMouseMotion = rb_define_class_under(cEventMouse, "Motion", cEventMouse); | |||
rb_define_const(cEventMouseMotion, "TYPE", | |||
INT2FIX(CACA_EVENT_MOUSE_MOTION)); | |||
cEventResize = rb_define_class_under(cEvent, "Resize", cEvent); | |||
rb_define_const(cEventResize, "TYPE", | |||
INT2FIX(CACA_EVENT_RESIZE)); | |||
cEventQuit = rb_define_class_under(cEvent, "Quit", cEvent); | |||
rb_define_const(cEventQuit, "TYPE", | |||
INT2FIX(CACA_EVENT_QUIT)); | |||
} |
@@ -4,6 +4,14 @@ | |||
#include <ruby.h> | |||
extern VALUE cEvent; | |||
extern VALUE cEventKeyPress; | |||
extern VALUE cEventKeyRelease; | |||
extern VALUE cEventMouse; | |||
extern VALUE cEventMousePress; | |||
extern VALUE cEventMouseRelease; | |||
extern VALUE cEventMouseMotion; | |||
extern VALUE cEventResize; | |||
extern VALUE cEventQuit; | |||
extern void Init_caca_event(VALUE); | |||
#endif |
@@ -13,10 +13,12 @@ | |||
#include <caca.h> | |||
#include "caca-display.h" | |||
#include "caca-event.h" | |||
void Init_caca() | |||
{ | |||
VALUE mCaca = rb_define_module("Caca"); | |||
Init_caca_display(mCaca); | |||
Init_caca_event(mCaca); | |||
} |
@@ -0,0 +1,32 @@ | |||
require 'cucul' | |||
require 'caca.so' | |||
module Caca | |||
class Event | |||
def Event.to_i | |||
const_get("TYPE") | |||
end | |||
def Event.|(i) | |||
i = i.to_i | |||
const_get("TYPE")|i | |||
end | |||
class Key | |||
attr_reader :ch, :utf32, :utf8 | |||
def initialize(ch, utf32, utf8) | |||
@ch, @utf32, @utf8 = ch, utf32, utf8 | |||
end | |||
end | |||
class Mouse | |||
attr_reader :x, :y, :button | |||
def initialize(x, y, button) | |||
@x, @y, @button = x, y, button | |||
end | |||
end | |||
class Resize | |||
attr_reader :w, :h | |||
def initialize(w, h) | |||
@w, @h = w, h | |||
end | |||
end | |||
end | |||
end |