Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 
 

301 lignes
7.7 KiB

  1. /*
  2. * libcaca Ruby bindings
  3. * Copyright (c) 2007-2012 Pascal Terjan <pterjan@linuxfr.org>
  4. *
  5. * This library is free software. It comes without any warranty, to
  6. * the extent permitted by applicable law. You can redistribute it
  7. * and/or modify it under the terms of the Do What the Fuck You Want
  8. * to Public License, Version 2, as published by Sam Hocevar. See
  9. * http://www.wtfpl.net/ for more details.
  10. */
  11. #include <ruby.h>
  12. #include <caca.h>
  13. #include <errno.h>
  14. #include "caca-event.h"
  15. #include "caca-canvas.h"
  16. #include "common.h"
  17. VALUE cDisplay;
  18. void display_free(void *display)
  19. {
  20. caca_free_display((caca_display_t *)display);
  21. }
  22. static VALUE display_alloc(VALUE klass)
  23. {
  24. VALUE obj;
  25. obj = Data_Wrap_Struct(klass, 0, display_free, NULL);
  26. return obj;
  27. }
  28. static VALUE display_initialize(int argc, VALUE* argv, VALUE self)
  29. {
  30. caca_display_t *display;
  31. caca_canvas_t *canvas = NULL;
  32. const char *driver = NULL;
  33. VALUE cv = Qnil;
  34. VALUE arg1, arg2;
  35. rb_scan_args(argc, argv, "02", &arg1, &arg2);
  36. if(CLASS_OF(arg1) == cCanvas)
  37. {
  38. cv = arg1;
  39. if(CLASS_OF(arg2) == cCanvas)
  40. {
  41. rb_raise(rb_eArgError, "Only one argument can be a Caca::Canvas");
  42. }
  43. }
  44. else if(CLASS_OF(arg2) == cCanvas)
  45. {
  46. cv = arg2;
  47. }
  48. if(TYPE(arg1) == T_STRING)
  49. {
  50. driver = StringValuePtr(arg1);
  51. if(TYPE(arg2) == T_STRING)
  52. {
  53. rb_raise(rb_eArgError, "Only one argument can be a string");
  54. }
  55. }
  56. else if(TYPE(arg2) == T_STRING)
  57. {
  58. driver = StringValuePtr(arg2);
  59. }
  60. if(cv != Qnil)
  61. canvas = DATA_PTR(cv);
  62. display = caca_create_display_with_driver(canvas, driver);
  63. if(display == NULL)
  64. {
  65. rb_raise(rb_eRuntimeError, "%s", strerror(errno));
  66. }
  67. if(NIL_P(cv))
  68. {
  69. cv = canvas_create(caca_get_canvas(display));
  70. }
  71. _SELF = display;
  72. rb_iv_set(self, "@canvas", cv);
  73. return self;
  74. }
  75. static VALUE display_refresh(VALUE self)
  76. {
  77. caca_refresh_display(_SELF);
  78. return self;
  79. }
  80. static VALUE set_time(VALUE self, VALUE t)
  81. {
  82. caca_set_display_time(_SELF, UINT2NUM(t));
  83. return t;
  84. }
  85. static VALUE set_time2(VALUE self, VALUE t)
  86. {
  87. set_time(self, t);
  88. return self;
  89. }
  90. static VALUE get_time(VALUE self)
  91. {
  92. return NUM2UINT(caca_get_display_time(_SELF));
  93. }
  94. static VALUE get_width(VALUE self)
  95. {
  96. return NUM2UINT(caca_get_display_width(_SELF));
  97. }
  98. static VALUE get_height(VALUE self)
  99. {
  100. return NUM2UINT(caca_get_display_height(_SELF));
  101. }
  102. static VALUE set_title(VALUE self, VALUE t)
  103. {
  104. if(caca_set_display_title(_SELF, StringValuePtr(t))<0)
  105. {
  106. rb_raise(rb_eRuntimeError, "%s", strerror(errno));
  107. }
  108. return t;
  109. }
  110. static VALUE set_title2(VALUE self, VALUE t)
  111. {
  112. set_title(self, t);
  113. return self;
  114. }
  115. static VALUE get_mouse_x(VALUE self)
  116. {
  117. return NUM2UINT(caca_get_mouse_x(_SELF));
  118. }
  119. static VALUE get_mouse_y(VALUE self)
  120. {
  121. return NUM2UINT(caca_get_mouse_y(_SELF));
  122. }
  123. static VALUE set_mouse(VALUE self, VALUE visible)
  124. {
  125. caca_set_display_time(_SELF, visible);
  126. return visible;
  127. }
  128. static VALUE set_mouse2(VALUE self, VALUE visible)
  129. {
  130. set_mouse(self, visible);
  131. return self;
  132. }
  133. static VALUE get_event(VALUE self, VALUE event_mask, VALUE timeout)
  134. {
  135. char utf8[8];
  136. caca_event_t ev;
  137. VALUE e;
  138. event_mask = rb_funcall(event_mask, rb_intern("to_i"), 0);
  139. if(caca_get_event(_SELF, NUM2UINT(event_mask), &ev, NUM2INT(timeout)) == 0)
  140. {
  141. return Qnil;
  142. }
  143. switch(caca_get_event_type(&ev))
  144. {
  145. case CACA_EVENT_KEY_PRESS:
  146. caca_get_event_key_utf8(&ev, utf8);
  147. e = rb_funcall(cEventKeyPress, rb_intern("new"), 3,
  148. UINT2NUM(caca_get_event_key_ch(&ev)),
  149. ULONG2NUM(caca_get_event_key_utf32(&ev)),
  150. rb_str_new(utf8, 8));
  151. break;
  152. case CACA_EVENT_KEY_RELEASE:
  153. caca_get_event_key_utf8(&ev, utf8);
  154. e = rb_funcall(cEventKeyRelease, rb_intern("new"), 3,
  155. UINT2NUM(caca_get_event_key_ch(&ev)),
  156. ULONG2NUM(caca_get_event_key_utf32(&ev)),
  157. rb_str_new(utf8, 8));
  158. break;
  159. case CACA_EVENT_MOUSE_PRESS:
  160. e = rb_funcall(cEventMousePress, rb_intern("new"), 3,
  161. UINT2NUM(caca_get_event_mouse_x(&ev)),
  162. UINT2NUM(caca_get_event_mouse_y(&ev)),
  163. UINT2NUM(caca_get_event_mouse_button(&ev)));
  164. break;
  165. case CACA_EVENT_MOUSE_RELEASE:
  166. e = rb_funcall(cEventMouseRelease, rb_intern("new"), 3,
  167. UINT2NUM(caca_get_event_mouse_x(&ev)),
  168. UINT2NUM(caca_get_event_mouse_y(&ev)),
  169. UINT2NUM(caca_get_event_mouse_button(&ev)));
  170. break;
  171. case CACA_EVENT_MOUSE_MOTION:
  172. e = rb_funcall(cEventMouseMotion, rb_intern("new"), 3,
  173. UINT2NUM(caca_get_event_mouse_x(&ev)),
  174. UINT2NUM(caca_get_event_mouse_y(&ev)),
  175. Qnil);
  176. break;
  177. case CACA_EVENT_RESIZE:
  178. e = rb_funcall(cEventResize, rb_intern("new"), 2,
  179. UINT2NUM(caca_get_event_resize_width(&ev)),
  180. UINT2NUM(caca_get_event_resize_height(&ev)));
  181. break;
  182. case CACA_EVENT_QUIT:
  183. e = rb_funcall(cEventQuit, rb_intern("new"), 0);
  184. break;
  185. default:
  186. rb_raise(rb_eRuntimeError, "Invalid event received !");
  187. }
  188. return e;
  189. }
  190. static VALUE driver_list(VALUE unused)
  191. {
  192. VALUE ary;
  193. char const* const* list;
  194. list = caca_get_display_driver_list();
  195. ary = rb_hash_new();
  196. while (*list != NULL && *(list+1) != NULL)
  197. {
  198. rb_hash_aset(ary, rb_str_new2(*list), rb_str_new2(*(list+1)));
  199. list+=2;
  200. }
  201. return ary;
  202. }
  203. static VALUE get_driver(VALUE self)
  204. {
  205. return rb_str_new2(caca_get_display_driver(_SELF));
  206. }
  207. static VALUE set_driver(VALUE self, VALUE driver)
  208. {
  209. if(caca_set_display_driver(_SELF, StringValuePtr(driver))<0)
  210. {
  211. rb_raise(rb_eRuntimeError, "%s", strerror(errno));
  212. }
  213. return driver;
  214. }
  215. static VALUE set_driver2(VALUE self, VALUE driver)
  216. {
  217. set_driver(self, driver);
  218. return self;
  219. }
  220. static VALUE set_cursor(VALUE self, VALUE flag)
  221. {
  222. if(caca_set_cursor(_SELF, flag)<0)
  223. {
  224. rb_raise(rb_eRuntimeError, "%s", strerror(errno));
  225. }
  226. return flag;
  227. }
  228. static VALUE set_cursor2(VALUE self, VALUE flag)
  229. {
  230. set_cursor(self, flag);
  231. return self;
  232. }
  233. void Init_caca_display(VALUE mCaca)
  234. {
  235. cDisplay = rb_define_class_under(mCaca, "Display", rb_cObject);
  236. rb_define_alloc_func(cDisplay, display_alloc);
  237. rb_define_singleton_method(cDisplay, "driver_list", driver_list, 0);
  238. rb_define_method(cDisplay, "initialize", display_initialize, -1);
  239. rb_define_method(cDisplay, "refresh", display_refresh, 0);
  240. rb_define_method(cDisplay, "time=", set_time, 1);
  241. rb_define_method(cDisplay, "set_time", set_time2, 1);
  242. rb_define_method(cDisplay, "time", get_time, 0);
  243. rb_define_method(cDisplay, "width", get_width, 0);
  244. rb_define_method(cDisplay, "height", get_height, 0);
  245. rb_define_method(cDisplay, "title=", set_title, 1);
  246. rb_define_method(cDisplay, "set_title", set_title2, 1);
  247. rb_define_method(cDisplay, "mouse_x", get_mouse_x, 0);
  248. rb_define_method(cDisplay, "mouse_y", get_mouse_y, 0);
  249. rb_define_method(cDisplay, "mouse=", set_mouse, 1);
  250. rb_define_method(cDisplay, "driver", get_driver, 0);
  251. rb_define_method(cDisplay, "set_driver", set_driver2, 1);
  252. rb_define_method(cDisplay, "driver=", set_driver, 1);
  253. rb_define_method(cDisplay, "set_mouse", set_mouse2, 1);
  254. rb_define_method(cDisplay, "get_event", get_event, 2);
  255. rb_define_method(cDisplay, "cursor=", set_cursor, 1);
  256. rb_define_method(cDisplay, "set_cursor", set_cursor2, 1);
  257. }