/glib2/ext/glib2/rbgobj_paramspecs.c

https://github.com/masaakiaoyagi/ruby-gnome2 · C · 311 lines · 248 code · 42 blank · 21 comment · 0 complexity · 12382ba967f8c80a059a64b65e6b71db MD5 · raw file

  1. /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
  2. /*
  3. * Copyright (C) 2011 Ruby-GNOME2 Project Team
  4. * Copyright (C) 2004 Ruby-GNOME2 Project Team
  5. * Copyright (C) 2002,2003 Masahiro Sakai
  6. *
  7. * This library is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * This library is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with this library; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  20. * MA 02110-1301 USA
  21. */
  22. #include "rbgprivate.h"
  23. #define DEF_NUMERIC_PSPEC_METHODS_FUNC(pspec_type, typename, from_ruby, to_ruby, pspec_cast) \
  24. static VALUE \
  25. typename##_initialize(VALUE self, VALUE name, VALUE nick, VALUE blurb, \
  26. VALUE minimum, VALUE maximum, VALUE default_value, \
  27. VALUE flags) \
  28. { \
  29. GParamSpec* pspec; \
  30. pspec = g_param_spec_##typename(StringValuePtr(name), \
  31. StringValuePtr(nick), \
  32. StringValuePtr(blurb), \
  33. from_ruby(minimum), \
  34. from_ruby(maximum), \
  35. from_ruby(default_value), \
  36. NUM2UINT(flags)); \
  37. rbgobj_param_spec_initialize(self, pspec); \
  38. return Qnil; \
  39. } \
  40. \
  41. static VALUE \
  42. typename##_minimum(VALUE self) \
  43. { \
  44. return to_ruby(pspec_cast(RVAL2GOBJ(self))->minimum); \
  45. } \
  46. \
  47. static VALUE \
  48. typename##_maximum(VALUE self) \
  49. { \
  50. return to_ruby(pspec_cast(RVAL2GOBJ(self))->maximum); \
  51. } \
  52. \
  53. static VALUE \
  54. typename##_range(VALUE self) \
  55. { \
  56. pspec_type* pspec = pspec_cast(RVAL2GOBJ(self)); \
  57. return rb_range_new(pspec->minimum, pspec->maximum, 0); \
  58. }
  59. DEF_NUMERIC_PSPEC_METHODS_FUNC(GParamSpecChar, char, NUM2INT, INT2FIX, G_PARAM_SPEC_CHAR)
  60. DEF_NUMERIC_PSPEC_METHODS_FUNC(GParamSpecUChar, uchar, NUM2UINT, INT2FIX, G_PARAM_SPEC_UCHAR)
  61. DEF_NUMERIC_PSPEC_METHODS_FUNC(GParamSpecInt, int, NUM2INT, INT2NUM, G_PARAM_SPEC_INT)
  62. DEF_NUMERIC_PSPEC_METHODS_FUNC(GParamSpecUInt, uint, NUM2UINT, UINT2NUM, G_PARAM_SPEC_UINT)
  63. DEF_NUMERIC_PSPEC_METHODS_FUNC(GParamSpecLong, long, NUM2LONG, INT2NUM, G_PARAM_SPEC_LONG)
  64. DEF_NUMERIC_PSPEC_METHODS_FUNC(GParamSpecULong, ulong, NUM2ULONG, UINT2NUM, G_PARAM_SPEC_ULONG)
  65. DEF_NUMERIC_PSPEC_METHODS_FUNC(GParamSpecInt64, int64, rbglib_num_to_int64, rbglib_int64_to_num, G_PARAM_SPEC_INT64)
  66. DEF_NUMERIC_PSPEC_METHODS_FUNC(GParamSpecUInt64, uint64, rbglib_num_to_uint64, rbglib_uint64_to_num, G_PARAM_SPEC_UINT64)
  67. DEF_NUMERIC_PSPEC_METHODS_FUNC(GParamSpecFloat, float, NUM2DBL, rb_float_new, G_PARAM_SPEC_FLOAT)
  68. DEF_NUMERIC_PSPEC_METHODS_FUNC(GParamSpecDouble, double, NUM2DBL, rb_float_new, G_PARAM_SPEC_DOUBLE)
  69. static VALUE
  70. float_epsilon(VALUE self)
  71. {
  72. return rb_float_new(G_PARAM_SPEC_FLOAT(RVAL2GOBJ(self))->epsilon);
  73. }
  74. static VALUE
  75. double_epsilon(VALUE self)
  76. {
  77. return rb_float_new(G_PARAM_SPEC_DOUBLE(RVAL2GOBJ(self))->epsilon);
  78. }
  79. static VALUE
  80. boolean_initialize(VALUE self, VALUE name, VALUE nick, VALUE blurb,
  81. VALUE default_value, VALUE flags)
  82. {
  83. GParamSpec* pspec;
  84. pspec = g_param_spec_boolean(StringValuePtr(name),
  85. StringValuePtr(nick),
  86. StringValuePtr(blurb),
  87. RVAL2CBOOL(default_value),
  88. NUM2UINT(flags));
  89. rbgobj_param_spec_initialize(self, pspec);
  90. return Qnil;
  91. }
  92. static VALUE
  93. unichar_initialize(VALUE self, VALUE name, VALUE nick, VALUE blurb,
  94. VALUE default_value, VALUE flags)
  95. {
  96. GParamSpec* pspec;
  97. pspec = g_param_spec_unichar(StringValuePtr(name),
  98. StringValuePtr(nick),
  99. StringValuePtr(blurb),
  100. NUM2UINT(default_value),
  101. NUM2UINT(flags));
  102. rbgobj_param_spec_initialize(self, pspec);
  103. return Qnil;
  104. }
  105. static VALUE
  106. enum_initialize(VALUE self, VALUE name, VALUE nick, VALUE blurb,
  107. VALUE enum_type, VALUE default_value, VALUE flags)
  108. {
  109. GParamSpec* pspec;
  110. GType gtype = rbgobj_gtype_get(enum_type);
  111. pspec = g_param_spec_enum(StringValuePtr(name),
  112. StringValuePtr(nick),
  113. StringValuePtr(blurb),
  114. gtype,
  115. RVAL2GENUM(default_value, gtype),
  116. NUM2UINT(flags));
  117. rbgobj_param_spec_initialize(self, pspec);
  118. return Qnil;
  119. }
  120. static VALUE
  121. flags_initialize(VALUE self, VALUE name, VALUE nick, VALUE blurb,
  122. VALUE flags_type, VALUE default_value, VALUE flags)
  123. {
  124. GParamSpec* pspec;
  125. GType gtype = rbgobj_gtype_get(flags_type);
  126. pspec = g_param_spec_flags(StringValuePtr(name),
  127. StringValuePtr(nick),
  128. StringValuePtr(blurb),
  129. gtype,
  130. RVAL2GFLAGS(default_value, gtype),
  131. NUM2UINT(flags));
  132. rbgobj_param_spec_initialize(self, pspec);
  133. return Qnil;
  134. }
  135. static VALUE
  136. string_initialize(VALUE self, VALUE name, VALUE nick, VALUE blurb,
  137. VALUE default_value, VALUE flags)
  138. {
  139. GParamSpec* pspec;
  140. pspec = g_param_spec_string(StringValuePtr(name),
  141. StringValuePtr(nick),
  142. StringValuePtr(blurb),
  143. NIL_P(default_value) ? NULL : StringValuePtr(default_value),
  144. NUM2UINT(flags));
  145. rbgobj_param_spec_initialize(self, pspec);
  146. return Qnil;
  147. }
  148. static VALUE
  149. param_initialize(VALUE self, VALUE name, VALUE nick, VALUE blurb,
  150. VALUE param_type, VALUE flags)
  151. {
  152. GParamSpec* pspec;
  153. pspec = g_param_spec_param(StringValuePtr(name),
  154. StringValuePtr(nick),
  155. StringValuePtr(blurb),
  156. rbgobj_gtype_get(param_type),
  157. NUM2UINT(flags));
  158. rbgobj_param_spec_initialize(self, pspec);
  159. return Qnil;
  160. }
  161. static VALUE
  162. boxed_initialize(VALUE self, VALUE name, VALUE nick, VALUE blurb,
  163. VALUE boxed_type, VALUE flags)
  164. {
  165. GParamSpec* pspec;
  166. pspec = g_param_spec_boxed(StringValuePtr(name),
  167. StringValuePtr(nick),
  168. StringValuePtr(blurb),
  169. rbgobj_gtype_get(boxed_type),
  170. NUM2UINT(flags));
  171. rbgobj_param_spec_initialize(self, pspec);
  172. return Qnil;
  173. }
  174. static VALUE
  175. pointer_initialize(VALUE self, VALUE name, VALUE nick, VALUE blurb, VALUE flags)
  176. {
  177. GParamSpec* pspec;
  178. pspec = g_param_spec_pointer(StringValuePtr(name),
  179. StringValuePtr(nick),
  180. StringValuePtr(blurb),
  181. NUM2UINT(flags));
  182. rbgobj_param_spec_initialize(self, pspec);
  183. return Qnil;
  184. }
  185. static VALUE
  186. value_array_initialize(VALUE self, VALUE name, VALUE nick, VALUE blurb,
  187. VALUE element_spec, VALUE flags)
  188. {
  189. GParamSpec* pspec;
  190. pspec = g_param_spec_value_array(StringValuePtr(name),
  191. StringValuePtr(nick),
  192. StringValuePtr(blurb),
  193. RVAL2GOBJ(element_spec),
  194. NUM2UINT(flags));
  195. rbgobj_param_spec_initialize(self, pspec);
  196. return Qnil;
  197. }
  198. static VALUE
  199. object_initialize(VALUE self, VALUE name, VALUE nick, VALUE blurb,
  200. VALUE object_type, VALUE flags)
  201. {
  202. GParamSpec* pspec;
  203. pspec = g_param_spec_object(StringValuePtr(name),
  204. StringValuePtr(nick),
  205. StringValuePtr(blurb),
  206. rbgobj_gtype_get(object_type),
  207. NUM2UINT(flags));
  208. rbgobj_param_spec_initialize(self, pspec);
  209. return Qnil;
  210. }
  211. void
  212. Init_gobject_gparamspecs(void)
  213. {
  214. VALUE cParamSpec = GTYPE2CLASS(G_TYPE_PARAM);
  215. VALUE c;
  216. #define DEF_NUMERIC_PSPEC_METHODS(c, typename) \
  217. G_STMT_START {\
  218. rbg_define_method(c, "initialize", typename##_initialize, 7); \
  219. rbg_define_method(c, "minimum", typename##_minimum, 0); \
  220. rbg_define_method(c, "maximum", typename##_maximum, 0); \
  221. rbg_define_method(c, "range", typename##_range, 0); \
  222. } G_STMT_END
  223. #if 0
  224. rbg_define_method(c, "default_value", typename##_default_value, 0); \
  225. rb_define_alias(c, "default", "default_value"); \
  226. #endif
  227. c = G_DEF_CLASS(G_TYPE_PARAM_CHAR, "Char", cParamSpec);
  228. DEF_NUMERIC_PSPEC_METHODS(c, char);
  229. c = G_DEF_CLASS(G_TYPE_PARAM_UCHAR, "UChar", cParamSpec);
  230. DEF_NUMERIC_PSPEC_METHODS(c, uchar);
  231. c = G_DEF_CLASS(G_TYPE_PARAM_INT, "Int", cParamSpec);
  232. DEF_NUMERIC_PSPEC_METHODS(c, int);
  233. c = G_DEF_CLASS(G_TYPE_PARAM_UINT, "UInt", cParamSpec);
  234. DEF_NUMERIC_PSPEC_METHODS(c, uint);
  235. c = G_DEF_CLASS(G_TYPE_PARAM_LONG, "Long", cParamSpec);
  236. DEF_NUMERIC_PSPEC_METHODS(c, long);
  237. c = G_DEF_CLASS(G_TYPE_PARAM_ULONG, "ULong", cParamSpec);
  238. DEF_NUMERIC_PSPEC_METHODS(c, ulong);
  239. c = G_DEF_CLASS(G_TYPE_PARAM_INT64, "Int64", cParamSpec);
  240. DEF_NUMERIC_PSPEC_METHODS(c, int64);
  241. c = G_DEF_CLASS(G_TYPE_PARAM_UINT64, "UInt64", cParamSpec);
  242. DEF_NUMERIC_PSPEC_METHODS(c, uint64);
  243. c = G_DEF_CLASS(G_TYPE_PARAM_FLOAT, "Float", cParamSpec);
  244. DEF_NUMERIC_PSPEC_METHODS(c, float);
  245. rbg_define_method(c, "epsilon", float_epsilon, 0);
  246. c = G_DEF_CLASS(G_TYPE_PARAM_DOUBLE, "Double", cParamSpec);
  247. DEF_NUMERIC_PSPEC_METHODS(c, double);
  248. rbg_define_method(c, "epsilon", double_epsilon, 0);
  249. c = G_DEF_CLASS(G_TYPE_PARAM_BOOLEAN, "Boolean", cParamSpec);
  250. rbg_define_method(c, "initialize", boolean_initialize, 5);
  251. c = G_DEF_CLASS(G_TYPE_PARAM_UNICHAR, "UniChar", cParamSpec);
  252. rbg_define_method(c, "initialize", unichar_initialize, 5);
  253. c = G_DEF_CLASS(G_TYPE_PARAM_ENUM, "Enum", cParamSpec);
  254. rbg_define_method(c, "initialize", enum_initialize, 6);
  255. c = G_DEF_CLASS(G_TYPE_PARAM_FLAGS, "Flags", cParamSpec);
  256. rbg_define_method(c, "initialize", flags_initialize, 6);
  257. c = G_DEF_CLASS(G_TYPE_PARAM_STRING, "String", cParamSpec);
  258. rbg_define_method(c, "initialize", string_initialize, 5);
  259. c = G_DEF_CLASS(G_TYPE_PARAM_PARAM, "Param", cParamSpec);
  260. rbg_define_method(c, "initialize", param_initialize, 5);
  261. c = G_DEF_CLASS(G_TYPE_PARAM_BOXED, "Boxed", cParamSpec);
  262. rbg_define_method(c, "initialize", boxed_initialize, 5);
  263. c = G_DEF_CLASS(G_TYPE_PARAM_POINTER, "Pointer", cParamSpec);
  264. rbg_define_method(c, "initialize", pointer_initialize, 4);
  265. c = G_DEF_CLASS(G_TYPE_PARAM_VALUE_ARRAY, "ValueArray", cParamSpec);
  266. rbg_define_method(c, "initialize", value_array_initialize, 5);
  267. c = G_DEF_CLASS(G_TYPE_PARAM_OBJECT, "Object", cParamSpec);
  268. rbg_define_method(c, "initialize", object_initialize, 5);
  269. }