shoes 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (275) hide show
  1. data/.gitignore +12 -0
  2. data/CHANGELOG +29 -0
  3. data/COPYING +30 -0
  4. data/README.md +76 -0
  5. data/README.old +117 -0
  6. data/Rakefile +130 -0
  7. data/Rakefile.bk +651 -0
  8. data/app.yaml +7 -0
  9. data/bin/main.skel +104 -0
  10. data/bugs/issue-012e9468ddc7b0cb7e1503413a8a11c4f8707b67.yaml +21 -0
  11. data/bugs/issue-0711ff8b67baa63586f11d0096fee9dd4436bf58.yaml +23 -0
  12. data/bugs/issue-07f87998d93eb401e22395c11085676389b935c4.yaml +22 -0
  13. data/bugs/issue-0bff2d80008803cbc7efbcdacdc60ef2163664d2.yaml +22 -0
  14. data/bugs/issue-0c66f223d19efbca7b692f3b91961f407ad7abec.yaml +24 -0
  15. data/bugs/issue-183bc3c7a8f575aff2b24e0bf22aa0dfcc8e4fc2.yaml +29 -0
  16. data/bugs/issue-1bad1e60a04cb3adb6a8f3ded128af2e16b56ffe.yaml +18 -0
  17. data/bugs/issue-1f1d43f76bf4de79d7f94adbae6dd506a9d81633.yaml +41 -0
  18. data/bugs/issue-320924117cadb045cc91f2a6fca922b4d81d4bb5.yaml +20 -0
  19. data/bugs/issue-33e5c8355fbf65252ea9e939714651df8bd8cb3b.yaml +25 -0
  20. data/bugs/issue-36f7c8262a72bcd5e28cfa4ed29328b8237ea79b.yaml +20 -0
  21. data/bugs/issue-39bf04ee50c3bef67b89b8e9beb28657805587ce.yaml +18 -0
  22. data/bugs/issue-3e28ba7754f73d02ef416eef989af707a8c00f01.yaml +23 -0
  23. data/bugs/issue-3f638cc03f41f9c3fdf217355321f1563f8fee45.yaml +22 -0
  24. data/bugs/issue-41e48e14f1ef4f6deb69be68165d7dd3ffd99156.yaml +22 -0
  25. data/bugs/issue-4c9408166a2aa5dd333bbb05520deebf4ded08e0.yaml +22 -0
  26. data/bugs/issue-55c687e108ecd5aeb8e0d0aeb4294984f84acd3e.yaml +18 -0
  27. data/bugs/issue-5811d34692cc292717a58ec1df1f8948cf30d826.yaml +28 -0
  28. data/bugs/issue-5a7c1f59a0526f9cea7fb366867cf1e6ed8ef69d.yaml +22 -0
  29. data/bugs/issue-688a2c2566bef6a03efa57a4ae1f7cfa8fc74444.yaml +21 -0
  30. data/bugs/issue-78b16c7988ade2ef96e716fa8cb9a004bd4ced65.yaml +33 -0
  31. data/bugs/issue-804ee49f9800154eddf0650690c7a9bb5626253f.yaml +27 -0
  32. data/bugs/issue-807dd1c610b2e941a5d454e26b2eac27e89a0ab4.yaml +22 -0
  33. data/bugs/issue-822ee33ec11ebd25f90ea86e8438de7891e63aee.yaml +18 -0
  34. data/bugs/issue-82ff7152cebb8a1cb065b864cb4fe22de2328146.yaml +29 -0
  35. data/bugs/issue-856afbdcdd4970ad54b8ce4a6c017fbaab45f49d.yaml +31 -0
  36. data/bugs/issue-8d49e32fb21522651c67490adb4d80076dbb14e1.yaml +24 -0
  37. data/bugs/issue-91583359653a9d530c1e32be72d874d847a306e7.yaml +21 -0
  38. data/bugs/issue-af41a5229613172764e7d3c98431172db337053d.yaml +20 -0
  39. data/bugs/issue-bd9856b3788dd429c998a5af1b2aae8221cb80b7.yaml +28 -0
  40. data/bugs/issue-be22aef5c564fb7b5e9938343136a9cd6a2edb7b.yaml +22 -0
  41. data/bugs/issue-bf8697523c77c326e7e35fc82cf3dd739ae92310.yaml +27 -0
  42. data/bugs/issue-cdd4b4795f34d6ff46e56ece10f8216a4a5456b2.yaml +25 -0
  43. data/bugs/issue-d9bfb5581d745ef9deb3b9b2e08ef74d1cd43082.yaml +20 -0
  44. data/bugs/issue-e0ce2f687cc096f35715d28b0af88589f4ab6cc6.yaml +18 -0
  45. data/bugs/issue-e4b0aca4a10a574b333aeaecaaf221dbc5ed22c6.yaml +38 -0
  46. data/bugs/issue-f263746594b95ba778455730478ee8df60ee639d.yaml +22 -0
  47. data/bugs/project.yaml +72 -0
  48. data/builddeps.sh +102 -0
  49. data/fonts/Coolvetica.ttf +0 -0
  50. data/fonts/Lacuna.ttf +0 -0
  51. data/gemlib/shoes.rb +1 -0
  52. data/lib/shoes.rb +548 -0
  53. data/lib/shoes/cache.rb +54 -0
  54. data/lib/shoes/chipmunk.rb +35 -0
  55. data/lib/shoes/data.rb +39 -0
  56. data/lib/shoes/help.rb +468 -0
  57. data/lib/shoes/image.rb +25 -0
  58. data/lib/shoes/inspect.rb +128 -0
  59. data/lib/shoes/log.rb +48 -0
  60. data/lib/shoes/minitar.rb +986 -0
  61. data/lib/shoes/override.rb +38 -0
  62. data/lib/shoes/pack.rb +543 -0
  63. data/lib/shoes/search.rb +46 -0
  64. data/lib/shoes/setup.rb +329 -0
  65. data/lib/shoes/shy.rb +131 -0
  66. data/lib/shoes/shybuilder.rb +44 -0
  67. data/lib/shoes/version.rb +3 -0
  68. data/make/darwin/deps.vlc +12 -0
  69. data/make/darwin/dylibs.shoes +22 -0
  70. data/make/darwin/dylibs.video +11 -0
  71. data/make/darwin/env.rb +81 -0
  72. data/make/darwin/tasks.rb +105 -0
  73. data/make/linux/env.rb +65 -0
  74. data/make/linux/tasks.rb +61 -0
  75. data/make/make.rb +85 -0
  76. data/make/mingw/dlls +19 -0
  77. data/make/mingw/env.rb +69 -0
  78. data/make/mingw/tasks.rb +70 -0
  79. data/make/rakefile_common.rb +8 -0
  80. data/manual-snapshots/class-book.png +0 -0
  81. data/manual-snapshots/expert-definr.png +0 -0
  82. data/manual-snapshots/expert-funnies.png +0 -0
  83. data/manual-snapshots/expert-irb.png +0 -0
  84. data/manual-snapshots/expert-minesweeper.png +0 -0
  85. data/manual-snapshots/expert-othello.png +0 -0
  86. data/manual-snapshots/expert-pong.png +0 -0
  87. data/manual-snapshots/expert-tankspank.png +0 -0
  88. data/manual-snapshots/good-arc.png +0 -0
  89. data/manual-snapshots/good-clock.png +0 -0
  90. data/manual-snapshots/good-follow.png +0 -0
  91. data/manual-snapshots/good-reminder.png +0 -0
  92. data/manual-snapshots/good-vjot.png +0 -0
  93. data/manual-snapshots/simple-accordion.png +0 -0
  94. data/manual-snapshots/simple-anim-shapes.png +0 -0
  95. data/manual-snapshots/simple-anim-text.png +0 -0
  96. data/manual-snapshots/simple-arc.png +0 -0
  97. data/manual-snapshots/simple-bounce.png +0 -0
  98. data/manual-snapshots/simple-calc.png +0 -0
  99. data/manual-snapshots/simple-chipmunk.png +0 -0
  100. data/manual-snapshots/simple-control-sizes.png +0 -0
  101. data/manual-snapshots/simple-curve.png +0 -0
  102. data/manual-snapshots/simple-dialogs.png +0 -0
  103. data/manual-snapshots/simple-downloader.png +0 -0
  104. data/manual-snapshots/simple-draw.png +0 -0
  105. data/manual-snapshots/simple-editor.png +0 -0
  106. data/manual-snapshots/simple-form.png +0 -0
  107. data/manual-snapshots/simple-mask.png +0 -0
  108. data/manual-snapshots/simple-menu.png +0 -0
  109. data/manual-snapshots/simple-menu1.png +0 -0
  110. data/manual-snapshots/simple-rubygems.png +0 -0
  111. data/manual-snapshots/simple-slide.png +0 -0
  112. data/manual-snapshots/simple-sphere.png +0 -0
  113. data/manual-snapshots/simple-sqlite3.png +0 -0
  114. data/manual-snapshots/simple-timer.png +0 -0
  115. data/manual-snapshots/simple-video.png +0 -0
  116. data/platform/mac/Info.plist +55 -0
  117. data/platform/mac/build-deps.sh +658 -0
  118. data/platform/mac/command-manual.rb +1 -0
  119. data/platform/mac/deps-osx.patch +159 -0
  120. data/platform/mac/dmg_ds_store +0 -0
  121. data/platform/mac/pangorc +2 -0
  122. data/platform/mac/pkg-dmg +1447 -0
  123. data/platform/mac/shoes +31 -0
  124. data/platform/mac/shoes-launch +7 -0
  125. data/platform/mac/stub.m +178 -0
  126. data/platform/mac/version.plist +14 -0
  127. data/platform/msw/base.nsi +644 -0
  128. data/platform/msw/installer-1.bmp +0 -0
  129. data/platform/msw/installer-2.bmp +0 -0
  130. data/platform/msw/shoes.exe.manifest +17 -0
  131. data/platform/msw/shoes.ico +0 -0
  132. data/platform/msw/stub-inject.c +59 -0
  133. data/platform/msw/stub.c +271 -0
  134. data/platform/msw/stub32.h +14 -0
  135. data/platform/msw/stub32.rc +16 -0
  136. data/platform/nix/INSTALL +56 -0
  137. data/platform/nix/Makefile +144 -0
  138. data/platform/nix/shoes.launch +20 -0
  139. data/platform/skel.rb +27 -0
  140. data/rakefile_darwin.rb +7 -0
  141. data/rakefile_linux.rb +3 -0
  142. data/rakefile_mingw.rb +7 -0
  143. data/samples/class-book.rb +43 -0
  144. data/samples/class-book.yaml +387 -0
  145. data/samples/expert-definr.rb +23 -0
  146. data/samples/expert-funnies.rb +51 -0
  147. data/samples/expert-irb.rb +112 -0
  148. data/samples/expert-minesweeper.rb +267 -0
  149. data/samples/expert-othello.rb +319 -0
  150. data/samples/expert-pong.rb +62 -0
  151. data/samples/expert-tankspank.rb +385 -0
  152. data/samples/good-arc.rb +37 -0
  153. data/samples/good-clock.rb +51 -0
  154. data/samples/good-follow.rb +26 -0
  155. data/samples/good-reminder.rb +174 -0
  156. data/samples/good-vjot.rb +56 -0
  157. data/samples/simple-accordion.rb +75 -0
  158. data/samples/simple-anim-shapes.rb +17 -0
  159. data/samples/simple-anim-text.rb +13 -0
  160. data/samples/simple-arc.rb +23 -0
  161. data/samples/simple-bounce.rb +24 -0
  162. data/samples/simple-calc.rb +70 -0
  163. data/samples/simple-chipmunk.rb +26 -0
  164. data/samples/simple-control-sizes.rb +24 -0
  165. data/samples/simple-curve.rb +26 -0
  166. data/samples/simple-dialogs.rb +29 -0
  167. data/samples/simple-downloader.rb +27 -0
  168. data/samples/simple-draw.rb +13 -0
  169. data/samples/simple-editor.rb +28 -0
  170. data/samples/simple-form.rb +28 -0
  171. data/samples/simple-form.shy +0 -0
  172. data/samples/simple-mask.rb +21 -0
  173. data/samples/simple-menu.rb +31 -0
  174. data/samples/simple-menu1.rb +35 -0
  175. data/samples/simple-rubygems.rb +29 -0
  176. data/samples/simple-slide.rb +45 -0
  177. data/samples/simple-sphere.rb +28 -0
  178. data/samples/simple-sqlite3.rb +13 -0
  179. data/samples/simple-timer.rb +13 -0
  180. data/samples/simple-video.rb +13 -0
  181. data/shoes.gemspec +21 -0
  182. data/shoes/app.c +591 -0
  183. data/shoes/app.h +110 -0
  184. data/shoes/appwin32.h +13 -0
  185. data/shoes/appwin32.rc +28 -0
  186. data/shoes/canvas.c +2202 -0
  187. data/shoes/canvas.h +682 -0
  188. data/shoes/code.h +14 -0
  189. data/shoes/config.h +232 -0
  190. data/shoes/effects.c +243 -0
  191. data/shoes/effects.h +7 -0
  192. data/shoes/http.h +44 -0
  193. data/shoes/http/common.h +86 -0
  194. data/shoes/http/curl.c +259 -0
  195. data/shoes/http/nsurl.m +274 -0
  196. data/shoes/http/windownload.c +114 -0
  197. data/shoes/http/winhttp.c +216 -0
  198. data/shoes/http/winhttp.h +19 -0
  199. data/shoes/image.c +1020 -0
  200. data/shoes/internal.c +46 -0
  201. data/shoes/internal.h +63 -0
  202. data/shoes/native.h +110 -0
  203. data/shoes/native/cocoa.h +105 -0
  204. data/shoes/native/cocoa.m +1557 -0
  205. data/shoes/native/gtk.c +1257 -0
  206. data/shoes/native/windows.c +2392 -0
  207. data/shoes/ruby.c +5221 -0
  208. data/shoes/ruby.h +299 -0
  209. data/shoes/world.c +243 -0
  210. data/shoes/world.h +63 -0
  211. data/static/Shoes.icns +0 -0
  212. data/static/avatar.png +0 -0
  213. data/static/code_highlighter.js +188 -0
  214. data/static/code_highlighter_ruby.js +26 -0
  215. data/static/icon-debug.png +0 -0
  216. data/static/icon-error.png +0 -0
  217. data/static/icon-info.png +0 -0
  218. data/static/icon-warn.png +0 -0
  219. data/static/listbox_button1.png +0 -0
  220. data/static/listbox_button2.png +0 -0
  221. data/static/man-app.png +0 -0
  222. data/static/man-builds.png +0 -0
  223. data/static/man-builds1.png +0 -0
  224. data/static/man-editor-notepad.png +0 -0
  225. data/static/man-editor-osx.png +0 -0
  226. data/static/man-ele-background.png +0 -0
  227. data/static/man-ele-border.png +0 -0
  228. data/static/man-ele-button.png +0 -0
  229. data/static/man-ele-check.png +0 -0
  230. data/static/man-ele-editbox.png +0 -0
  231. data/static/man-ele-editline.png +0 -0
  232. data/static/man-ele-image.png +0 -0
  233. data/static/man-ele-listbox.png +0 -0
  234. data/static/man-ele-progress.png +0 -0
  235. data/static/man-ele-radio.png +0 -0
  236. data/static/man-ele-shape.png +0 -0
  237. data/static/man-ele-textblock.png +0 -0
  238. data/static/man-ele-video.png +0 -0
  239. data/static/man-intro-dmg.png +0 -0
  240. data/static/man-intro-exe.png +0 -0
  241. data/static/man-look-tiger.png +0 -0
  242. data/static/man-look-ubuntu.png +0 -0
  243. data/static/man-look-vista.png +0 -0
  244. data/static/man-run-osx.png +0 -0
  245. data/static/man-run-vista.png +0 -0
  246. data/static/man-run-xp.png +0 -0
  247. data/static/man-shot1.png +0 -0
  248. data/static/manual-en.txt +3531 -0
  249. data/static/manual-ja.txt +2825 -0
  250. data/static/manual.css +167 -0
  251. data/static/menu-corner1.png +0 -0
  252. data/static/menu-corner2.png +0 -0
  253. data/static/menu-gray.png +0 -0
  254. data/static/menu-left.png +0 -0
  255. data/static/menu-right.png +0 -0
  256. data/static/menu-top.png +0 -0
  257. data/static/shoes-dmg.jpg +0 -0
  258. data/static/shoes-icon-blue.png +0 -0
  259. data/static/shoes-icon.png +0 -0
  260. data/static/shoes-manual-apps.gif +0 -0
  261. data/static/shoes_main_window.png +0 -0
  262. data/static/stripe.png +0 -0
  263. data/static/stubs/blank.exe +0 -0
  264. data/static/stubs/blank.hfz +0 -0
  265. data/static/stubs/blank.run +375 -0
  266. data/static/stubs/cocoa-install +0 -0
  267. data/static/stubs/sh-install +49 -0
  268. data/static/stubs/shoes-stub-inject.exe +0 -0
  269. data/static/stubs/shoes-stub.exe +0 -0
  270. data/static/tutor-back.png +0 -0
  271. data/test/shoes_test.rb +8 -0
  272. data/test/test_helper.rb +25 -0
  273. data/use-deps +12 -0
  274. data/use-tmp-dep +8 -0
  275. metadata +509 -0
@@ -0,0 +1,299 @@
1
+ //
2
+ // shoes/ruby.h
3
+ // Some defs for Ruby.
4
+ //
5
+ #include <ruby.h>
6
+ #include "shoes/canvas.h"
7
+
8
+ #if defined(__cplusplus)
9
+ extern "C" {
10
+ #if 0
11
+ } /* satisfy cc-mode */
12
+ #endif
13
+ #endif
14
+
15
+ #ifdef RUBY_RUBY_H
16
+ #define RUBY_CRITICAL(statements) do {statements;} while (0)
17
+ #else
18
+ #include <rubysig.h>
19
+ #include <st.h>
20
+ #ifndef RUBY_1_9
21
+ #include <node.h>
22
+ #endif
23
+ #endif
24
+
25
+ #if defined(__cplusplus)
26
+ #if 0
27
+ { /* satisfy cc-mode */
28
+ #endif
29
+ } /* extern "C" { */
30
+ #endif
31
+
32
+ #ifndef SHOES_RUBY_H
33
+ #define SHOES_RUBY_H
34
+
35
+ #if _MSC_VER
36
+ typedef VALUE (*HOOK)(...);
37
+ typedef int (*FOREACH)(...);
38
+ #define CASTFOREACH(x) reinterpret_cast<FOREACH>(x)
39
+ #define CASTHOOK(x) reinterpret_cast<HOOK>(x)
40
+ #undef fopen
41
+ #undef fclose
42
+ #undef fread
43
+ #else
44
+ typedef VALUE (*HOOK)();
45
+ #define CASTHOOK(x) x
46
+ #define CASTFOREACH(x) x
47
+ #endif
48
+
49
+ #ifdef WORDS_BIGENDIAN
50
+ #define BE_CPU_N(x, n)
51
+ #define LE_CPU_N(x, n) flip_endian((unsigned char *)(x), n)
52
+ #else
53
+ #define BE_CPU_N(x, n) flip_endian((unsigned char *)(x), n)
54
+ #define LE_CPU_N(x, n)
55
+ #endif
56
+
57
+ #define BE_CPU(x) BE_CPU_N(&(x), sizeof(x))
58
+ #define LE_CPU(x) LE_CPU_N(&(x), sizeof(x))
59
+
60
+ static inline void flip_endian(unsigned char* x, int length) {
61
+ int i;
62
+ unsigned char tmp;
63
+
64
+ for(i = 0; i < (length / 2); i++) {
65
+ tmp = x[i];
66
+ x[i] = x[length - i - 1];
67
+ x[length - i - 1] = tmp;
68
+ }
69
+ }
70
+
71
+ #ifndef RARRAY_LEN
72
+ #define RARRAY_LEN(arr) RARRAY(arr)->len
73
+ #define RARRAY_PTR(arr) RARRAY(arr)->ptr
74
+ #define RSTRING_LEN(str) RSTRING(str)->len
75
+ #define RSTRING_PTR(str) RSTRING(str)->ptr
76
+ #endif
77
+
78
+ #undef s_host
79
+
80
+ extern VALUE cShoes, cApp, cDialog, cTypes, cShoesWindow, cMouse, cCanvas, cFlow, cStack, cMask, cNative, cShape, cVideo, cImage, cEffect, cEvery, cTimer, cAnim, cPattern, cBorder, cBackground, cPara, cBanner, cTitle, cSubtitle, cTagline, cCaption, cInscription, cLinkText, cTextBlock, cTextClass, cSpan, cStrong, cSub, cSup, cCode, cDel, cEm, cIns, cButton, cEditLine, cEditBox, cListBox, cProgress, cSlider, cCheck, cRadio, cColor, cDownload, cResponse, cColors, cLink, cLinkHover, ssNestSlot;
81
+ extern VALUE aMsgList;
82
+ extern VALUE eInvMode, eNotImpl, eImageError;
83
+ extern VALUE reHEX_SOURCE, reHEX3_SOURCE, reRGB_SOURCE, reRGBA_SOURCE, reGRAY_SOURCE, reGRAYA_SOURCE, reLF;
84
+ extern VALUE symAltQuest, symAltSlash, symAltDot;
85
+ extern VALUE instance_eval_proc;
86
+ extern ID s_checked_q, s_perc, s_aref, s_mult;
87
+
88
+ typedef struct {
89
+ int n;
90
+ VALUE a[10];
91
+ } rb_arg_list;
92
+
93
+ VALUE mfp_instance_eval(VALUE, VALUE);
94
+ VALUE ts_funcall2(VALUE, ID, int, VALUE *);
95
+ int rb_parse_args(int, const VALUE *, const char *, rb_arg_list *);
96
+ int rb_parse_args_allow(int, const VALUE *, const char *, rb_arg_list *);
97
+ long rb_ary_index_of(VALUE, VALUE);
98
+ VALUE rb_ary_insert_at(VALUE, long, int, VALUE);
99
+ VALUE shoes_safe_block(VALUE, VALUE, VALUE);
100
+ void shoes_ruby_init(void);
101
+
102
+ #define BEZIER 0.55228475;
103
+
104
+ //
105
+ // Exception handling strings for eval
106
+ //
107
+ #define SHOES_META \
108
+ "(class << Shoes; self; end).instance_eval do;"
109
+ #ifdef SHOES_WIN32
110
+ #define QUIT_ALERT_MSG() MessageBox(NULL, RSTRING_PTR(msg), "Shoes", MB_OK)
111
+ #else
112
+ #define QUIT_ALERT_MSG() printf("%s\n", RSTRING_PTR(msg))
113
+ #endif
114
+ #define QUIT_ALERT(v) \
115
+ VALUE line_re = rb_eval_string("/:\\d+:\\s*/"); \
116
+ VALUE msg = rb_funcall(v, rb_intern("message"), 0); \
117
+ VALUE msg2 = rb_funcall(msg, rb_intern("split"), 2, line_re, INT2NUM(2)); \
118
+ if (RARRAY_LEN(msg2) > 1) msg = rb_ary_entry(msg2, 1); \
119
+ QUIT_ALERT_MSG(); \
120
+ return SHOES_QUIT;
121
+
122
+ #define NUM2RGBINT(x) (rb_obj_is_kind_of(x, rb_cFloat) ? NUM2DBL(x) * 255 : NUM2INT(x))
123
+ #define DEF_COLOR(name, r, g, b) rb_hash_aset(cColors, ID2SYM(rb_intern("" # name)), shoes_color_new(r, g, b, 255))
124
+ #define GET_STRUCT(ele, var) \
125
+ shoes_##ele *var; \
126
+ Data_Get_Struct(self, shoes_##ele, var)
127
+
128
+
129
+ //
130
+ // Common funcs for dealing with attribute hashes
131
+ //
132
+ #define CHECK_HASH(hsh) if (TYPE(hsh) != T_HASH) { hsh = Qnil; }
133
+ #define ATTR(attr, n) shoes_hash_get(attr, s_##n)
134
+ #define PX(attr, n, dn, pn) shoes_px(shoes_hash_get(attr, s_##n), dn, pn, 1)
135
+ #define PXN(attr, n, dn, pn) shoes_px(shoes_hash_get(attr, s_##n), dn, pn, 0)
136
+ #define PX2(attr, n1, n2, dn, dr, pn) shoes_px2(attr, s_##n1, s_##n2, dn, dr, pn)
137
+ #define ATTR2(typ, attr, n, dn) shoes_hash_##typ(attr, s_##n, dn)
138
+ #define ATTRSET(attr, k, v) attr = shoes_hash_set(attr, s_##k, v)
139
+ #define ATTR_MARGINS(attr, dm, canvas) \
140
+ int lmargin, rmargin, tmargin, bmargin; \
141
+ VALUE margino = ATTR(attr, margin); \
142
+ if (rb_obj_is_kind_of(margino, rb_cArray)) \
143
+ { \
144
+ lmargin = shoes_px(rb_ary_entry(margino, 0), dm, CPW(canvas), 1); \
145
+ tmargin = shoes_px(rb_ary_entry(margino, 1), dm, CPH(canvas), 1); \
146
+ rmargin = shoes_px(rb_ary_entry(margino, 2), dm, CPW(canvas), 1); \
147
+ bmargin = shoes_px(rb_ary_entry(margino, 3), dm, CPH(canvas), 1); \
148
+ } \
149
+ else \
150
+ { \
151
+ lmargin = rmargin = PX(attr, margin, dm, CPW(canvas)); \
152
+ tmargin = bmargin = PX(attr, margin, dm, CPH(canvas)); \
153
+ } \
154
+ lmargin = PX(attr, margin_left, lmargin, CPW(canvas)); \
155
+ rmargin = PX(attr, margin_right, rmargin, CPW(canvas)); \
156
+ tmargin = PX(attr, margin_top, tmargin, CPH(canvas)); \
157
+ bmargin = PX(attr, margin_bottom, bmargin, CPH(canvas))
158
+
159
+ #define CHECK_HOVER(self_t, h, touch) \
160
+ if ((self_t->hover & HOVER_MOTION) != h && !NIL_P(self_t->attr)) \
161
+ { \
162
+ VALUE action = ID2SYM(h ? s_hover : s_leave); \
163
+ VALUE proc = rb_hash_aref(self_t->attr, action); \
164
+ if (!NIL_P(proc)) \
165
+ shoes_safe_block(self, proc, rb_ary_new3(1, self)); \
166
+ if (touch != NULL) *touch += 1; \
167
+ self_t->hover = (self_t->hover & HOVER_CLICK) | h; \
168
+ }
169
+
170
+ #define IS_INSIDE(self_t, x, y) \
171
+ (self_t->place.iw > 0 && self_t->place.ih > 0 && \
172
+ x >= self_t->place.ix + self_t->place.dx && \
173
+ x <= self_t->place.ix + self_t->place.dx + self_t->place.iw && \
174
+ y >= self_t->place.iy + self_t->place.dy && \
175
+ y <= self_t->place.iy + self_t->place.dy + self_t->place.ih)
176
+
177
+ int shoes_px(VALUE, int, int, int);
178
+ int shoes_px2(VALUE, ID, ID, int, int, int);
179
+ VALUE shoes_hash_set(VALUE, ID, VALUE);
180
+ VALUE shoes_hash_get(VALUE, ID);
181
+ int shoes_hash_int(VALUE, ID, int);
182
+ double shoes_hash_dbl(VALUE, ID, double);
183
+ char *shoes_hash_cstr(VALUE, ID, char *);
184
+ VALUE rb_str_to_pas(VALUE);
185
+ void shoes_place_exact(shoes_place *, VALUE, int, int);
186
+ void shoes_place_decide(shoes_place *, VALUE, VALUE, int, int, unsigned char, int);
187
+ unsigned char shoes_is_element(VALUE);
188
+ unsigned char shoes_is_any(VALUE);
189
+ void shoes_extras_remove_all(shoes_canvas *);
190
+ void shoes_ele_remove_all(VALUE);
191
+ void shoes_cairo_rect(cairo_t *, double, double, double, double, double);
192
+ void shoes_cairo_arc(cairo_t *, double, double, double, double, double, double);
193
+
194
+ #define SYMBOL_DEFS(f) f(bind); f(gsub); f(keys); f(update); f(merge); f(new); f(URI); f(now); f(debug); f(info); f(warn); f(error); f(run); f(to_a); f(to_ary); f(to_f); f(to_i); f(to_int); f(to_s); f(to_str); f(to_pattern); f(align); f(angle); f(angle1); f(angle2); f(arrow); f(autoplay); f(begin); f(body); f(cancel); f(call); f(center); f(change); f(checked); f(choose); f(click); f(corner); f(curve); f(distance); f(displace_left); f(displace_top); f(downcase); f(draw); f(emphasis); f(end); f(family); f(fill); f(finish); f(font); f(fullscreen); f(group); f(hand); f(headers); f(hidden); f(host); f(hover); f(href); f(insert); f(inner); f(items); f(justify); f(kerning); f(keydown); f(keypress); f(keyup); f(match); f(method); f(motion); f(link); f(leading); f(leave); f(ok); f(outer); f(path); f(points); f(port); f(progress); f(redirect); f(release); f(request_uri); f(rise); f(scheme); f(save); f(size); f(slider); f(state); f(wheel); f(scroll); f(stretch); f(strikecolor); f(strikethrough); f(stroke); f(start); f(attach); f(text); f(title); f(top); f(right); f(bottom); f(left); f(up); f(down); f(height); f(minheight); f(remove); f(resizable); f(strokewidth); f(cap); f(widget); f(width); f(minwidth); f(marker); f(margin); f(margin_left); f(margin_right); f(margin_top); f(margin_bottom); f(radius); f(secret); f(blur); f(glow); f(shadow); f(arc); f(rect); f(oval); f(line); f(shape); f(star); f(project); f(round); f(square); f(undercolor); f(underline); f(variant); f(weight); f(wrap); f(dash); f(nodot); f(onedot);
195
+ #define SYMBOL_INTERN(name) s_##name = rb_intern("" # name)
196
+ #define SYMBOL_ID(name) ID s_##name
197
+ #define SYMBOL_EXTERN(name) extern ID s_##name
198
+
199
+ SYMBOL_DEFS(SYMBOL_EXTERN);
200
+
201
+ #define CANVAS_DEFS(f) \
202
+ f(".close", close, 0); \
203
+ f(".gutter", get_gutter_width, 0); \
204
+ f(".nostroke", nostroke, 0); \
205
+ f(".stroke", stroke, -1); \
206
+ f(".strokewidth", strokewidth, 1); \
207
+ f(".dash", dash, 1); \
208
+ f(".cap", cap, 1); \
209
+ f(".nofill", nofill, 0); \
210
+ f(".fill", fill, -1); \
211
+ f("+arc", arc, -1); \
212
+ f("+rect", rect, -1); \
213
+ f("+oval", oval, -1); \
214
+ f("+line", line, -1); \
215
+ f("+arrow", arrow, -1); \
216
+ f("+star", star, -1); \
217
+ f("+para", para, -1); \
218
+ f("+banner", banner, -1); \
219
+ f("+title", title, -1); \
220
+ f("+subtitle", subtitle, -1); \
221
+ f("+tagline", tagline, -1); \
222
+ f("+caption", caption, -1); \
223
+ f("+inscription", inscription, -1); \
224
+ f(".code", code, -1); \
225
+ f(".del", del, -1); \
226
+ f(".em", em, -1); \
227
+ f(".ins", ins, -1); \
228
+ f(".link", link, -1); \
229
+ f(".span", span, -1); \
230
+ f(".strong", strong, -1); \
231
+ f(".sub", sub, -1); \
232
+ f(".sup", sup, -1); \
233
+ f("+background", background, -1); \
234
+ f("+border", border, -1); \
235
+ f("+video", video, -1); \
236
+ f(".blur", blur, -1); \
237
+ f(".glow", glow, -1); \
238
+ f(".shadow", shadow, -1); \
239
+ f("+image", image, -1); \
240
+ f(".imagesize", imagesize, 1); \
241
+ f("+animate", animate, -1); \
242
+ f("+every", every, -1); \
243
+ f("+timer", timer, -1); \
244
+ f("+shape", shape, -1); \
245
+ f(".move_to", move_to, 2); \
246
+ f(".line_to", line_to, 2); \
247
+ f(".curve_to", curve_to, 6); \
248
+ f(".arc_to", arc_to, 6); \
249
+ f(".transform", transform, 1); \
250
+ f(".translate", translate, 2); \
251
+ f(".rotate", rotate, 1); \
252
+ f(".scale", scale, -1); \
253
+ f(".skew", skew, -1); \
254
+ f(".push", push, 0); \
255
+ f(".pop", pop, 0); \
256
+ f(".reset", reset, 0); \
257
+ f("+button", button, -1); \
258
+ f("+list_box", list_box, -1); \
259
+ f("+edit_line", edit_line, -1); \
260
+ f("+edit_box", edit_box, -1); \
261
+ f("+progress", progress, -1); \
262
+ f("+slider", slider, -1); \
263
+ f("+check", check, -1); \
264
+ f("+radio", radio, -1); \
265
+ f(".app", get_app, 0); \
266
+ f("+after", after, -1); \
267
+ f("+before", before, -1); \
268
+ f("+append", append, -1); \
269
+ f("+prepend", prepend, -1); \
270
+ f("+flow", flow, -1); \
271
+ f("+stack", stack, -1); \
272
+ f("+mask", mask, -1); \
273
+ f("+widget", widget, -1); \
274
+ f(".start", start, -1); \
275
+ f(".finish", finish, -1); \
276
+ f(".hover", hover, -1); \
277
+ f(".leave", leave, -1); \
278
+ f(".click", click, -1); \
279
+ f(".release", release, -1); \
280
+ f(".motion", motion, -1); \
281
+ f(".keydown", keydown, -1); \
282
+ f(".keypress", keypress, -1); \
283
+ f(".keyup", keyup, -1); \
284
+ f("+clear", clear_contents, -1); \
285
+ f(".visit", goto, 1); \
286
+ f(".mouse", mouse, 0); \
287
+ f(".cursor", get_cursor, 0); \
288
+ f(".cursor=", set_cursor, 1); \
289
+ f(".clipboard", get_clipboard, 0); \
290
+ f(".clipboard=", set_clipboard, 1); \
291
+ f(".download", download, -1); \
292
+ f(".owner", owner, 0); \
293
+ f(".window", window, -1); \
294
+ f(".dialog", dialog, -1); \
295
+ f(".window_plain", window_plain, 0); \
296
+ f(".dialog_plain", dialog_plain, 0); \
297
+ f("._snapshot", snapshot, -1)
298
+
299
+ #endif
@@ -0,0 +1,243 @@
1
+ ///
2
+ // shoes/world.c
3
+ // Abstract windowing for GTK, Quartz (OSX) and Win32.
4
+ //
5
+ #include "shoes/app.h"
6
+ #include "shoes/ruby.h"
7
+ #include "shoes/config.h"
8
+ #include "shoes/world.h"
9
+ #include "shoes/native.h"
10
+ #include "shoes/internal.h"
11
+ #ifdef SHOES_SIGNAL
12
+ #include <signal.h>
13
+
14
+ void
15
+ shoes_sigint()
16
+ {
17
+ shoes_native_quit();
18
+ }
19
+ #endif
20
+
21
+ #ifdef __cplusplus
22
+ extern "C" {
23
+ #endif
24
+
25
+ shoes_world_t *shoes_world = NULL;
26
+
27
+ shoes_world_t *
28
+ shoes_world_alloc()
29
+ {
30
+ shoes_world_t *world = SHOE_ALLOC(shoes_world_t);
31
+ SHOE_MEMZERO(world, shoes_world_t, 1);
32
+ world->apps = rb_ary_new();
33
+ world->msgs = rb_ary_new();
34
+ world->mainloop = FALSE;
35
+ world->image_cache = st_init_strtable();
36
+ world->blank_image = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 1, 1);
37
+ world->blank_cache = SHOE_ALLOC(shoes_cached_image);
38
+ world->blank_cache->surface = world->blank_image;
39
+ world->blank_cache->pattern = NULL;
40
+ world->blank_cache->width = 1;
41
+ world->blank_cache->height = 1;
42
+ world->blank_cache->mtime = 0;
43
+ world->default_font = pango_font_description_new();
44
+ pango_font_description_set_family(world->default_font, "Arial");
45
+ pango_font_description_set_absolute_size(world->default_font, 14. * PANGO_SCALE * (96./72.));
46
+ rb_gc_register_address(&world->apps);
47
+ rb_gc_register_address(&world->msgs);
48
+ return world;
49
+ }
50
+
51
+ int
52
+ shoes_world_free_image_cache(char *key, shoes_cache_entry *cached, char *arg)
53
+ {
54
+ if (cached->type != SHOES_CACHE_ALIAS && cached->image != NULL)
55
+ {
56
+ if (cached->image->pattern != NULL)
57
+ cairo_pattern_destroy(cached->image->pattern);
58
+ if (cached->image->surface != shoes_world->blank_image)
59
+ cairo_surface_destroy(cached->image->surface);
60
+ free(cached->image);
61
+ }
62
+ free(cached);
63
+ free(key);
64
+ return ST_CONTINUE;
65
+ }
66
+
67
+ void
68
+ shoes_world_free(shoes_world_t *world)
69
+ {
70
+ #ifdef VLC_0_9
71
+ if (world->vlc != NULL) libvlc_release(world->vlc);
72
+ #endif
73
+ shoes_native_cleanup(world);
74
+ st_foreach(world->image_cache, CASTFOREACH(shoes_world_free_image_cache), 0);
75
+ st_free_table(world->image_cache);
76
+ SHOE_FREE(world->blank_cache);
77
+ cairo_surface_destroy(world->blank_image);
78
+ pango_font_description_free(world->default_font);
79
+ rb_gc_unregister_address(&world->apps);
80
+ rb_gc_unregister_address(&world->msgs);
81
+ if (world != NULL)
82
+ SHOE_FREE(world);
83
+ }
84
+
85
+ #ifdef RUBY_1_9
86
+ int
87
+ shoes_ruby_embed()
88
+ {
89
+ VALUE v;
90
+ char *argv[] = {"ruby", "-e", "1"};
91
+ int sysinit_argc = 0;
92
+ char** sysinit_argv = NULL;
93
+ RUBY_INIT_STACK;
94
+ #ifdef SHOES_WIN32
95
+ ruby_sysinit( &sysinit_argc, &sysinit_argv );
96
+ #endif
97
+ ruby_init();
98
+ v = (VALUE)ruby_options(3, argv);
99
+ return !FIXNUM_P(v);
100
+ }
101
+ #else
102
+ #define shoes_ruby_embed ruby_init
103
+ #endif
104
+
105
+ shoes_code
106
+ shoes_init(SHOES_INIT_ARGS)
107
+ {
108
+ #ifdef SHOES_SIGNAL
109
+ signal(SIGINT, shoes_sigint);
110
+ signal(SIGQUIT, shoes_sigint);
111
+ #endif
112
+ shoes_ruby_embed();
113
+ shoes_ruby_init();
114
+ shoes_world = shoes_world_alloc();
115
+ #ifdef SHOES_WIN32
116
+ shoes_world->os.instance = inst;
117
+ shoes_world->os.style = style;
118
+ #endif
119
+ shoes_native_init();
120
+ rb_const_set(cShoes, rb_intern("FONTS"), shoes_font_list());
121
+ return SHOES_OK;
122
+ }
123
+
124
+ void
125
+ shoes_update_fonts(VALUE ary)
126
+ {
127
+ #if PANGO_VERSION_MAJOR > 1 || PANGO_VERSION_MINOR >= 22
128
+ pango_cairo_font_map_set_default(NULL);
129
+ #endif
130
+ rb_funcall(rb_const_get(cShoes, rb_intern("FONTS")), rb_intern("replace"), 1, ary);
131
+ }
132
+
133
+ static VALUE
134
+ shoes_load_begin(VALUE v)
135
+ {
136
+ char *bootup = (char *)v;
137
+ return rb_eval_string(bootup);
138
+ }
139
+
140
+ static VALUE
141
+ shoes_load_exception(VALUE v, VALUE exc)
142
+ {
143
+ return exc;
144
+ }
145
+
146
+ shoes_code
147
+ shoes_load(char *path)
148
+ {
149
+ char bootup[SHOES_BUFSIZE];
150
+
151
+ if (path)
152
+ {
153
+ sprintf(bootup, "Shoes.visit(%%q<%s>);", path);
154
+
155
+ VALUE v = rb_rescue2(CASTHOOK(shoes_load_begin), (VALUE)bootup, CASTHOOK(shoes_load_exception), Qnil, rb_cObject, 0);
156
+ if (rb_obj_is_kind_of(v, rb_eException))
157
+ {
158
+ shoes_canvas_error(Qnil, v);
159
+ rb_eval_string("Shoes.show_log");
160
+ }
161
+ }
162
+
163
+ return SHOES_OK;
164
+ }
165
+
166
+ void
167
+ shoes_set_argv(int argc, char **argv)
168
+ {
169
+ ruby_set_argv(argc, argv);
170
+ }
171
+
172
+ static VALUE
173
+ shoes_start_begin(VALUE v)
174
+ {
175
+ return rb_eval_string("$SHOES_URI = Shoes.args!");
176
+ }
177
+
178
+ static VALUE
179
+ shoes_start_exception(VALUE v, VALUE exc)
180
+ {
181
+ return exc;
182
+ }
183
+
184
+ shoes_code
185
+ shoes_start(char *path, char *uri)
186
+ {
187
+ shoes_code code = SHOES_OK;
188
+ char bootup[SHOES_BUFSIZE];
189
+ int len = shoes_snprintf(bootup,
190
+ SHOES_BUFSIZE,
191
+ "begin;"
192
+ "DIR = File.expand_path(File.dirname(%%q<%s>));"
193
+ "$:.replace([DIR+'/ruby/lib/'+RUBY_PLATFORM, DIR+'/ruby/lib', DIR+'/lib', '.']);"
194
+ "require 'shoes';"
195
+ "DIR;"
196
+ "rescue Object => e;"
197
+ "puts(e.message);"
198
+ "end",
199
+ path);
200
+
201
+ if (len < 0 || len >= SHOES_BUFSIZE)
202
+ {
203
+ QUIT("Path to script is too long.");
204
+ }
205
+
206
+ VALUE str = rb_eval_string(bootup);
207
+ if (NIL_P(str))
208
+ return SHOES_QUIT;
209
+
210
+ StringValue(str);
211
+ strcpy(shoes_world->path, RSTRING_PTR(str));
212
+
213
+ char *load_uri_str = NULL;
214
+ VALUE load_uri = rb_rescue2(CASTHOOK(shoes_start_begin), Qnil, CASTHOOK(shoes_start_exception), Qnil, rb_cObject, 0);
215
+ if (!RTEST(load_uri))
216
+ return SHOES_QUIT;
217
+ if (rb_obj_is_kind_of(load_uri, rb_eException))
218
+ {
219
+ QUIT_ALERT(load_uri);
220
+ }
221
+
222
+ if (rb_obj_is_kind_of(load_uri, rb_cString))
223
+ load_uri_str = RSTRING_PTR(load_uri);
224
+
225
+ code = shoes_load(load_uri_str);
226
+ if (code != SHOES_OK)
227
+ goto quit;
228
+
229
+ code = shoes_app_start(shoes_world->apps, uri);
230
+ quit:
231
+ return code;
232
+ }
233
+
234
+ shoes_code
235
+ shoes_final()
236
+ {
237
+ shoes_world_free(shoes_world);
238
+ return SHOES_OK;
239
+ }
240
+
241
+ #ifdef __cplusplus
242
+ }
243
+ #endif