wrb 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. checksums.yaml +7 -0
  2. data/README +28 -0
  3. data/Rakefile +66 -0
  4. data/bin/wrb +41 -0
  5. data/bin/wrb.bat +6 -0
  6. data/ext/rwin/aatree.c +192 -0
  7. data/ext/rwin/aatree.h +55 -0
  8. data/ext/rwin/extconf.rb +47 -0
  9. data/ext/rwin/rw_api.c +2058 -0
  10. data/ext/rwin/rw_devices.c +215 -0
  11. data/ext/rwin/rw_gdiplus.h +278 -0
  12. data/ext/rwin/rw_graphics.c +1583 -0
  13. data/ext/rwin/rw_resources.c +1988 -0
  14. data/ext/rwin/rw_ubfuncs.c +281 -0
  15. data/ext/rwin/rw_windows.c +1936 -0
  16. data/ext/rwin/rwin.c +451 -0
  17. data/ext/rwin/rwin.h +442 -0
  18. data/lib/rwin.rb +820 -0
  19. data/lib/wrb.rb +20 -0
  20. data/lib/wrb/applications/frmdesigner/angle.cur +0 -0
  21. data/lib/wrb/applications/frmdesigner/angle2.cur +0 -0
  22. data/lib/wrb/applications/frmdesigner/controls/Button.bmp +0 -0
  23. data/lib/wrb/applications/frmdesigner/controls/Button.rb +34 -0
  24. data/lib/wrb/applications/frmdesigner/controls/Checkbox.bmp +0 -0
  25. data/lib/wrb/applications/frmdesigner/controls/Checkbox.rb +10 -0
  26. data/lib/wrb/applications/frmdesigner/controls/Combobox.bmp +0 -0
  27. data/lib/wrb/applications/frmdesigner/controls/Combobox.rb +88 -0
  28. data/lib/wrb/applications/frmdesigner/controls/ComboboxEx.rb +97 -0
  29. data/lib/wrb/applications/frmdesigner/controls/Comboboxex.bmp +0 -0
  30. data/lib/wrb/applications/frmdesigner/controls/DateTimePicker.bmp +0 -0
  31. data/lib/wrb/applications/frmdesigner/controls/DateTimePicker.rb +11 -0
  32. data/lib/wrb/applications/frmdesigner/controls/Edit.bmp +0 -0
  33. data/lib/wrb/applications/frmdesigner/controls/Edit.rb +8 -0
  34. data/lib/wrb/applications/frmdesigner/controls/Groupbox.bmp +0 -0
  35. data/lib/wrb/applications/frmdesigner/controls/Groupbox.rb +9 -0
  36. data/lib/wrb/applications/frmdesigner/controls/Hotkeyctrl.bmp +0 -0
  37. data/lib/wrb/applications/frmdesigner/controls/Hotkeyctrl.rb +9 -0
  38. data/lib/wrb/applications/frmdesigner/controls/Imagelist.bmp +0 -0
  39. data/lib/wrb/applications/frmdesigner/controls/Imagelist.rb +115 -0
  40. data/lib/wrb/applications/frmdesigner/controls/Listbox.bmp +0 -0
  41. data/lib/wrb/applications/frmdesigner/controls/Listbox.rb +77 -0
  42. data/lib/wrb/applications/frmdesigner/controls/Listview.bmp +0 -0
  43. data/lib/wrb/applications/frmdesigner/controls/Listview.rb +157 -0
  44. data/lib/wrb/applications/frmdesigner/controls/Menu.bmp +0 -0
  45. data/lib/wrb/applications/frmdesigner/controls/Menu.rb +198 -0
  46. data/lib/wrb/applications/frmdesigner/controls/Menubar.bmp +0 -0
  47. data/lib/wrb/applications/frmdesigner/controls/Menubar.rb +9 -0
  48. data/lib/wrb/applications/frmdesigner/controls/MonthCalender.bmp +0 -0
  49. data/lib/wrb/applications/frmdesigner/controls/Monthcalender.rb +9 -0
  50. data/lib/wrb/applications/frmdesigner/controls/Panel.bmp +0 -0
  51. data/lib/wrb/applications/frmdesigner/controls/Panel.rb +30 -0
  52. data/lib/wrb/applications/frmdesigner/controls/Progressbar.rb +10 -0
  53. data/lib/wrb/applications/frmdesigner/controls/Radiobutton.bmp +0 -0
  54. data/lib/wrb/applications/frmdesigner/controls/Radiobutton.rb +13 -0
  55. data/lib/wrb/applications/frmdesigner/controls/Rebar.bmp +0 -0
  56. data/lib/wrb/applications/frmdesigner/controls/Rebar.rb +162 -0
  57. data/lib/wrb/applications/frmdesigner/controls/Splitter.bmp +0 -0
  58. data/lib/wrb/applications/frmdesigner/controls/Splitter.rb +66 -0
  59. data/lib/wrb/applications/frmdesigner/controls/Static.bmp +0 -0
  60. data/lib/wrb/applications/frmdesigner/controls/Static.rb +9 -0
  61. data/lib/wrb/applications/frmdesigner/controls/Statusbar.bmp +0 -0
  62. data/lib/wrb/applications/frmdesigner/controls/Statusbar.rb +103 -0
  63. data/lib/wrb/applications/frmdesigner/controls/Tabctrl.bmp +0 -0
  64. data/lib/wrb/applications/frmdesigner/controls/Tabctrl.rb +136 -0
  65. data/lib/wrb/applications/frmdesigner/controls/Timer.bmp +0 -0
  66. data/lib/wrb/applications/frmdesigner/controls/Timer.rb +36 -0
  67. data/lib/wrb/applications/frmdesigner/controls/Toolbar.bmp +0 -0
  68. data/lib/wrb/applications/frmdesigner/controls/Toolbar.rb +165 -0
  69. data/lib/wrb/applications/frmdesigner/controls/Trackbar.bmp +0 -0
  70. data/lib/wrb/applications/frmdesigner/controls/Trackbar.rb +34 -0
  71. data/lib/wrb/applications/frmdesigner/controls/Treeview.bmp +0 -0
  72. data/lib/wrb/applications/frmdesigner/controls/Treeview.rb +107 -0
  73. data/lib/wrb/applications/frmdesigner/controls/Updown.bmp +0 -0
  74. data/lib/wrb/applications/frmdesigner/controls/Updown.rb +31 -0
  75. data/lib/wrb/applications/frmdesigner/controls/default.bmp +0 -0
  76. data/lib/wrb/applications/frmdesigner/controls/progressbar.bmp +0 -0
  77. data/lib/wrb/applications/frmdesigner/controls/unselect.bmp +0 -0
  78. data/lib/wrb/applications/frmdesigner/fddialogs.rb +87 -0
  79. data/lib/wrb/applications/frmdesigner/fdesign.rb +1315 -0
  80. data/lib/wrb/applications/frmdesigner/fdmodules.rb +1394 -0
  81. data/lib/wrb/applications/frmdesigner/fdparseform.rb +197 -0
  82. data/lib/wrb/applications/frmdesigner/img13.bmp +0 -0
  83. data/lib/wrb/base.rb +1294 -0
  84. data/lib/wrb/combocommon.rb +77 -0
  85. data/lib/wrb/commctrlconst.rb +139 -0
  86. data/lib/wrb/commdlg.rb +77 -0
  87. data/lib/wrb/components/animate.rb +114 -0
  88. data/lib/wrb/components/bitmap.rb +116 -0
  89. data/lib/wrb/components/button.rb +134 -0
  90. data/lib/wrb/components/canvas.rb +266 -0
  91. data/lib/wrb/components/checkbox.rb +118 -0
  92. data/lib/wrb/components/choosecolordlg.rb +87 -0
  93. data/lib/wrb/components/choosefontdlg.rb +142 -0
  94. data/lib/wrb/components/clipboard.rb +174 -0
  95. data/lib/wrb/components/combobox.rb +282 -0
  96. data/lib/wrb/components/comboboxex.rb +574 -0
  97. data/lib/wrb/components/cursor.rb +91 -0
  98. data/lib/wrb/components/datetimepicker.rb +197 -0
  99. data/lib/wrb/components/ddeclient.rb +180 -0
  100. data/lib/wrb/components/ddeserver.rb +131 -0
  101. data/lib/wrb/components/dialog.rb +228 -0
  102. data/lib/wrb/components/edit.rb +412 -0
  103. data/lib/wrb/components/font.rb +35 -0
  104. data/lib/wrb/components/form.rb +65 -0
  105. data/lib/wrb/components/groupbox.rb +122 -0
  106. data/lib/wrb/components/header.rb +479 -0
  107. data/lib/wrb/components/hotkeyctrl.rb +72 -0
  108. data/lib/wrb/components/icon.rb +109 -0
  109. data/lib/wrb/components/imagelist.rb +396 -0
  110. data/lib/wrb/components/inifile.rb +97 -0
  111. data/lib/wrb/components/listbox.rb +149 -0
  112. data/lib/wrb/components/listview.rb +1467 -0
  113. data/lib/wrb/components/menu.rb +592 -0
  114. data/lib/wrb/components/menubar.rb +84 -0
  115. data/lib/wrb/components/monthcalender.rb +164 -0
  116. data/lib/wrb/components/openfilenamedlg.rb +147 -0
  117. data/lib/wrb/components/pager.rb +199 -0
  118. data/lib/wrb/components/panel.rb +103 -0
  119. data/lib/wrb/components/picture.rb +55 -0
  120. data/lib/wrb/components/printdlg.rb +148 -0
  121. data/lib/wrb/components/printdlgex.rb +117 -0
  122. data/lib/wrb/components/printer.rb +97 -0
  123. data/lib/wrb/components/progressbar.rb +140 -0
  124. data/lib/wrb/components/radiobutton.rb +49 -0
  125. data/lib/wrb/components/rebar.rb +830 -0
  126. data/lib/wrb/components/registry.rb +408 -0
  127. data/lib/wrb/components/richedit.rb +1181 -0
  128. data/lib/wrb/components/savefilenamedlg.rb +27 -0
  129. data/lib/wrb/components/scintilla.rb +1298 -0
  130. data/lib/wrb/components/scrollbar.rb +239 -0
  131. data/lib/wrb/components/splitter.rb +494 -0
  132. data/lib/wrb/components/static.rb +198 -0
  133. data/lib/wrb/components/statusbar.rb +490 -0
  134. data/lib/wrb/components/tabctrl.rb +686 -0
  135. data/lib/wrb/components/timer.rb +117 -0
  136. data/lib/wrb/components/toolbar.rb +1107 -0
  137. data/lib/wrb/components/tooltip.rb +651 -0
  138. data/lib/wrb/components/trackbar.rb +298 -0
  139. data/lib/wrb/components/treeview.rb +845 -0
  140. data/lib/wrb/components/updown.rb +198 -0
  141. data/lib/wrb/ddeml.rb +241 -0
  142. data/lib/wrb/documents/animate.html +46 -0
  143. data/lib/wrb/documents/bitmap.html +69 -0
  144. data/lib/wrb/documents/button.html +78 -0
  145. data/lib/wrb/documents/canvas.html +137 -0
  146. data/lib/wrb/documents/checkbox.html +77 -0
  147. data/lib/wrb/documents/choosecolordlg.html +29 -0
  148. data/lib/wrb/documents/choosefontdlg.html +31 -0
  149. data/lib/wrb/documents/clipboard.html +31 -0
  150. data/lib/wrb/documents/combobox.html +117 -0
  151. data/lib/wrb/documents/comboboxex.html +139 -0
  152. data/lib/wrb/documents/control.html +53 -0
  153. data/lib/wrb/documents/cursor.html +45 -0
  154. data/lib/wrb/documents/datetimepicker.html +70 -0
  155. data/lib/wrb/documents/ddeclient.html +33 -0
  156. data/lib/wrb/documents/ddeserver.html +26 -0
  157. data/lib/wrb/documents/dialog.html +78 -0
  158. data/lib/wrb/documents/edit.html +169 -0
  159. data/lib/wrb/documents/empty.html +11 -0
  160. data/lib/wrb/documents/favicon.png +0 -0
  161. data/lib/wrb/documents/font.html +38 -0
  162. data/lib/wrb/documents/form.html +63 -0
  163. data/lib/wrb/documents/groupbox.html +57 -0
  164. data/lib/wrb/documents/header.html +85 -0
  165. data/lib/wrb/documents/hotkeyctrl.html +42 -0
  166. data/lib/wrb/documents/icon.html +45 -0
  167. data/lib/wrb/documents/imagelist.html +101 -0
  168. data/lib/wrb/documents/images/button.png +0 -0
  169. data/lib/wrb/documents/images/checkbox.png +0 -0
  170. data/lib/wrb/documents/images/combobox.png +0 -0
  171. data/lib/wrb/documents/images/comboboxex.png +0 -0
  172. data/lib/wrb/documents/images/datetimepicker.png +0 -0
  173. data/lib/wrb/documents/images/edit.png +0 -0
  174. data/lib/wrb/documents/images/groupbox.png +0 -0
  175. data/lib/wrb/documents/images/hotkeyctrl.png +0 -0
  176. data/lib/wrb/documents/images/listbox.png +0 -0
  177. data/lib/wrb/documents/images/listview.png +0 -0
  178. data/lib/wrb/documents/images/menu.png +0 -0
  179. data/lib/wrb/documents/images/menubar.png +0 -0
  180. data/lib/wrb/documents/images/monthcalender.png +0 -0
  181. data/lib/wrb/documents/images/progressbar.png +0 -0
  182. data/lib/wrb/documents/images/radiobutton.png +0 -0
  183. data/lib/wrb/documents/images/rebar.png +0 -0
  184. data/lib/wrb/documents/images/richedit.png +0 -0
  185. data/lib/wrb/documents/images/splitter.png +0 -0
  186. data/lib/wrb/documents/images/static.png +0 -0
  187. data/lib/wrb/documents/images/statusbar.png +0 -0
  188. data/lib/wrb/documents/images/tabctrl.png +0 -0
  189. data/lib/wrb/documents/images/toolbar.png +0 -0
  190. data/lib/wrb/documents/images/tooltip.png +0 -0
  191. data/lib/wrb/documents/images/trackbar.png +0 -0
  192. data/lib/wrb/documents/images/treeview.png +0 -0
  193. data/lib/wrb/documents/images/updown.png +0 -0
  194. data/lib/wrb/documents/index.html +155 -0
  195. data/lib/wrb/documents/inifile.html +36 -0
  196. data/lib/wrb/documents/license.txt +22 -0
  197. data/lib/wrb/documents/listbox.html +96 -0
  198. data/lib/wrb/documents/listview.html +277 -0
  199. data/lib/wrb/documents/make_doc.rb +596 -0
  200. data/lib/wrb/documents/menu.html +144 -0
  201. data/lib/wrb/documents/menubar.html +54 -0
  202. data/lib/wrb/documents/monthcalender.html +48 -0
  203. data/lib/wrb/documents/openfilenamedlg.html +36 -0
  204. data/lib/wrb/documents/pager.html +63 -0
  205. data/lib/wrb/documents/panel.html +32 -0
  206. data/lib/wrb/documents/picture.html +48 -0
  207. data/lib/wrb/documents/printdlg.html +35 -0
  208. data/lib/wrb/documents/printdlgex.html +35 -0
  209. data/lib/wrb/documents/printer.html +40 -0
  210. data/lib/wrb/documents/progressbar.html +69 -0
  211. data/lib/wrb/documents/radiobutton.html +51 -0
  212. data/lib/wrb/documents/rebar.html +143 -0
  213. data/lib/wrb/documents/registry.html +36 -0
  214. data/lib/wrb/documents/richedit.html +232 -0
  215. data/lib/wrb/documents/samples/editimg.bmp +0 -0
  216. data/lib/wrb/documents/samples/editimg.iml +0 -0
  217. data/lib/wrb/documents/samples/fileimg.bmp +0 -0
  218. data/lib/wrb/documents/samples/fileimg.iml +0 -0
  219. data/lib/wrb/documents/samples/sample_button.rb +21 -0
  220. data/lib/wrb/documents/samples/sample_checkbox.rb +18 -0
  221. data/lib/wrb/documents/samples/sample_combobox.rb +18 -0
  222. data/lib/wrb/documents/samples/sample_comboboxex.rb +23 -0
  223. data/lib/wrb/documents/samples/sample_datetimepicker.rb +11 -0
  224. data/lib/wrb/documents/samples/sample_edit.rb +25 -0
  225. data/lib/wrb/documents/samples/sample_groupbox.rb +19 -0
  226. data/lib/wrb/documents/samples/sample_hotkeyctrl.rb +12 -0
  227. data/lib/wrb/documents/samples/sample_listbox.rb +12 -0
  228. data/lib/wrb/documents/samples/sample_listview.rb +32 -0
  229. data/lib/wrb/documents/samples/sample_menu.rb +21 -0
  230. data/lib/wrb/documents/samples/sample_menubar.rb +23 -0
  231. data/lib/wrb/documents/samples/sample_monthcalender.rb +11 -0
  232. data/lib/wrb/documents/samples/sample_progressbar.rb +14 -0
  233. data/lib/wrb/documents/samples/sample_radiobutton.rb +14 -0
  234. data/lib/wrb/documents/samples/sample_rebar.rb +25 -0
  235. data/lib/wrb/documents/samples/sample_richedit.rb +60 -0
  236. data/lib/wrb/documents/samples/sample_splitter.rb +33 -0
  237. data/lib/wrb/documents/samples/sample_static.rb +15 -0
  238. data/lib/wrb/documents/samples/sample_statusbar.rb +17 -0
  239. data/lib/wrb/documents/samples/sample_tabctrl.rb +19 -0
  240. data/lib/wrb/documents/samples/sample_toolbar.rb +29 -0
  241. data/lib/wrb/documents/samples/sample_tooltip.rb +50 -0
  242. data/lib/wrb/documents/samples/sample_trackbar.rb +30 -0
  243. data/lib/wrb/documents/samples/sample_treeview.rb +19 -0
  244. data/lib/wrb/documents/samples/sample_updown.rb +18 -0
  245. data/lib/wrb/documents/samples/sampleimg16.iml +0 -0
  246. data/lib/wrb/documents/samples/sampleimg32.iml +0 -0
  247. data/lib/wrb/documents/samples/samplemg16.png +0 -0
  248. data/lib/wrb/documents/samples/samplemg32.png +0 -0
  249. data/lib/wrb/documents/samples/wrb.ico +0 -0
  250. data/lib/wrb/documents/savefilenamedlg.html +19 -0
  251. data/lib/wrb/documents/scrollbar.html +60 -0
  252. data/lib/wrb/documents/splitter.html +96 -0
  253. data/lib/wrb/documents/static.html +84 -0
  254. data/lib/wrb/documents/statusbar.html +110 -0
  255. data/lib/wrb/documents/tabctrl.html +151 -0
  256. data/lib/wrb/documents/timer.html +43 -0
  257. data/lib/wrb/documents/toolbar.html +181 -0
  258. data/lib/wrb/documents/tooltip.html +131 -0
  259. data/lib/wrb/documents/trackbar.html +107 -0
  260. data/lib/wrb/documents/treeview.html +210 -0
  261. data/lib/wrb/documents/updown.html +85 -0
  262. data/lib/wrb/documents/wincontrol.html +258 -0
  263. data/lib/wrb/documents/window.html +499 -0
  264. data/lib/wrb/documents/wrb.css +228 -0
  265. data/lib/wrb/gmem.rb +26 -0
  266. data/lib/wrb/imecommon.rb +59 -0
  267. data/lib/wrb/listcommon.rb +185 -0
  268. data/lib/wrb/lzss.rb +126 -0
  269. data/lib/wrb/scrollinfo.rb +142 -0
  270. data/lib/wrb/toplevelcommon.rb +634 -0
  271. metadata +315 -0
@@ -0,0 +1,451 @@
1
+ /*
2
+ # Project WRB was forked from Project VisualuRuby(temp-name).
3
+ # Author of this project: BANJO Koyu <banjokoyu at gmail.com>
4
+ # The URL of this project: https://bitbucket.org/wrb/
5
+ #
6
+ # This is a ext-library part of WRB.
7
+ */
8
+
9
+ #include "rwin.h"
10
+ #include "shlwapi.h"
11
+
12
+ VALUE IS_GUIAPP;
13
+ VALUE COMCTL_MAJOR_VERSION;
14
+ VALUE COMCTL_MINOR_VERSION;
15
+
16
+ HINSTANCE hInstance;
17
+ ATOM RwClassAtom;
18
+
19
+ AAtree *winlist;
20
+ AAtree *childwinlist;
21
+ AAtree *rsclist;
22
+
23
+ VALUE internal_encoding, external_encoding, wchar_encoding;
24
+ rb_encoding *rw_internal_enc, *rw_external_enc, *rw_wchar_enc;
25
+
26
+ /* modules and classes */
27
+ VALUE mRwin;
28
+ VALUE mRwApp;
29
+ VALUE cRwCancelDefWndProc;
30
+
31
+ /* ruby's global variables */
32
+ VALUE resources;
33
+
34
+ /* Errors */
35
+ VALUE rw_eResourceNotAliveError;
36
+ VALUE rw_eWindowNotAliveError;
37
+
38
+ /* Window's global variables */
39
+ HWND current_hwnd;
40
+ HACCEL current_haccel;
41
+ RwWindow *activewin;
42
+
43
+ /* Encoding */
44
+ TCHAR* /* front end from Ruby */
45
+ rw_str2tchar(VALUE str){ /* pointer only*/
46
+ volatile VALUE t = rb_str_encode(str, internal_encoding, 0, Qnil); /* GC_GUARD */
47
+ return (TCHAR*)RSTRING_PTR(t);
48
+ }
49
+
50
+ TCHAR* /* pointer and bytesize */
51
+ rw_str2tchar2(VALUE str, size_t *bytesize){
52
+ volatile VALUE t = rb_str_encode(str, internal_encoding, 0, Qnil); /* GC_GUARD */
53
+ *bytesize = RSTRING_LEN(t);
54
+ return (TCHAR*)RSTRING_PTR(t);
55
+ }
56
+
57
+ WCHAR*
58
+ rw_str2wchar(VALUE str){
59
+ volatile VALUE w = rb_str_encode(str, wchar_encoding, 0, Qnil); /* GC_GUARD */
60
+ return (WCHAR*)RSTRING_PTR(w);
61
+ }
62
+
63
+ VALUE /* Back end to Ruby */
64
+ rw_encode_external(TCHAR *buff){
65
+ #if UNICODE
66
+ VALUE str = rb_enc_str_new((char*)buff, wcslen(buff)*sizeof(WCHAR), rw_internal_enc);
67
+ #else
68
+ VALUE str = rb_enc_str_new((char*)buff, strlen(buff)*sizeof(CHAR), rw_internal_enc);
69
+ #endif
70
+ return rb_str_encode(str, external_encoding, 0, Qnil);
71
+ }
72
+
73
+ VALUE /* Back end to Ruby */
74
+ rw_encode_external2(WCHAR *buff, int len){
75
+ VALUE str = rb_enc_str_new((char*)buff, len, rw_internal_enc);
76
+ return rb_str_encode(str, external_encoding, 0, Qnil);
77
+ }
78
+
79
+ /* for converting cygwin path*/
80
+ void
81
+ rwconv2absolute_path(char* dst, char* src){
82
+ #ifdef __CYGWIN__
83
+ cygwin_conv_path(CCP_POSIX_TO_WIN_A|CCP_ABSOLUTE, src, dst, RW_MAXPATH);
84
+ #else
85
+ _fullpath(dst, src, RW_MAXPATH);
86
+ #endif
87
+ }
88
+
89
+ void
90
+ rwconv2absolute_pathW(wchar_t* dst, wchar_t* src){
91
+ #ifdef __CYGWIN__
92
+ cygwin_conv_path(CCP_POSIX_TO_WIN_W|CCP_ABSOLUTE, src, dst, RW_MAXPATH);
93
+ #else
94
+ _wfullpath(dst, src, RW_MAXPATH);
95
+ #endif
96
+ }
97
+
98
+ static VALUE
99
+ rwapp_hinstance(){
100
+ return INT2NUM((INT_PTR)hInstance);
101
+ }
102
+
103
+ /* Message loops */
104
+ static VALUE
105
+ rwapp_msgloop(){
106
+ MSG msg;
107
+ #if RWIN_USEMULTITHREAD
108
+ while(TRUE){
109
+ if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
110
+ if (msg.message == WM_QUIT) break;
111
+ if (!(activewin && TranslateAccelerator(activewin->hwnd, activewin->haccel, &msg))){
112
+ TranslateMessage(&msg);
113
+ DispatchMessage(&msg);
114
+ }
115
+ } else { /* for Ruby's Thread */
116
+ if(!GetQueueStatus(QS_ALLEVENTS)){
117
+ rb_thread_call_without_gvl((void*(*)(void*))WaitMessage, 0, RUBY_UBF_IO, 0);
118
+ }
119
+ }
120
+ }
121
+ #else
122
+ while(GetMessage(&msg, NULL, 0, 0)){
123
+ if (!(activewin && TranslateAccelerator(activewin->hwnd, activewin->haccel, &msg))){
124
+ TranslateMessage(&msg);
125
+ DispatchMessage(&msg);
126
+ }
127
+ }
128
+ #endif
129
+ rb_exit(msg.wParam);
130
+ }
131
+
132
+ static VALUE
133
+ rwapp_dlgmsgloop(){
134
+ MSG msg;
135
+ #if RWIN_USEMULTITHREAD
136
+ while(TRUE){
137
+ if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
138
+ if (msg.message == WM_QUIT) break;
139
+ if (!((activewin && TranslateAccelerator(activewin->hwnd,activewin->haccel,&msg)) ||
140
+ activewin && IsDialogMessage(activewin->hwnd, &msg))){
141
+ TranslateMessage(&msg);
142
+ DispatchMessage(&msg);
143
+ }
144
+ } else { /* for Ruby Thread */
145
+ if(!GetQueueStatus(QS_ALLEVENTS)){
146
+ rb_thread_call_without_gvl((void*(*)(void*))WaitMessage, 0, RUBY_UBF_IO, 0);
147
+ }
148
+ }
149
+ }
150
+ #else
151
+ while(GetMessage(&msg, NULL, 0, 0)){
152
+ if (!((activewin && TranslateAccelerator(activewin->hwnd,activewin->haccel,&msg)) ||
153
+ activewin && IsDialogMessage(activewin->hwnd, &msg))){
154
+ TranslateMessage(&msg);
155
+ DispatchMessage(&msg);
156
+ }
157
+ }
158
+ #endif
159
+ rb_exit(msg.wParam);
160
+ }
161
+
162
+ /* Prototyping */
163
+ INT_PTR CALLBACK RwDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
164
+
165
+ static VALUE
166
+ rwapp_automsgloop(){
167
+ MSG msg;
168
+ #if RWIN_USEMULTITHREAD
169
+ while(TRUE){
170
+ if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
171
+ if (msg.message==WM_QUIT) break;
172
+ if (!((activewin && TranslateAccelerator(activewin->hwnd,activewin->haccel,&msg)) ||
173
+ activewin && (INT_PTR)RwDlgProc==GetWindowLongPtr(activewin->hwnd,DWLP_DLGPROC) &&
174
+ IsDialogMessage(activewin->hwnd, &msg))){
175
+ TranslateMessage(&msg);
176
+ DispatchMessage(&msg);
177
+ }
178
+ } else { /* for Ruby Thread */
179
+ if(!GetQueueStatus(QS_ALLEVENTS)){
180
+ rb_thread_call_without_gvl((void*(*)(void*))WaitMessage, 0, RUBY_UBF_IO, 0);
181
+ }
182
+ }
183
+ }
184
+ #else
185
+ while(GetMessage(&msg, NULL, 0, 0)){
186
+ if (!((activewin && TranslateAccelerator(activewin->hwnd,activewin->haccel,&msg)) ||
187
+ activewin && (INT_PTR)RwDlgProc==GetWindowLongPtr(activewin->hwnd,DWLP_DLGPROC) &&
188
+ IsDialogMessage(activewin->hwnd, &msg))){
189
+ TranslateMessage(&msg);
190
+ DispatchMessage(&msg);
191
+ }
192
+ }
193
+ #endif
194
+ // destroy_all_win(0);
195
+ rb_exit(msg.wParam);
196
+ }
197
+
198
+ BOOL
199
+ RegisterWndClass(const TCHAR* classname, HICON hIcon,UINT clstyle, HBRUSH hBackGnd, HCURSOR hCursor, WNDPROC wndproc)
200
+ {
201
+ WNDCLASSEX wc;
202
+ wc.cbSize = sizeof(WNDCLASSEX);
203
+ wc.style = clstyle;
204
+ wc.lpfnWndProc = wndproc;
205
+ wc.cbClsExtra = 0;
206
+ wc.cbWndExtra = DWLP_USER;
207
+ wc.hInstance = hInstance;
208
+ wc.hIcon = hIcon;
209
+ wc.hCursor = hCursor;
210
+ wc.hbrBackground = hBackGnd;
211
+ wc.lpszMenuName = NULL;
212
+ wc.lpszClassName = classname;
213
+ wc.hIconSm = 0;
214
+ return (RegisterClassEx(&wc));
215
+ }
216
+
217
+
218
+ static void
219
+ aa_callback_mark_rw_window(const AAnode *node, void *arg){
220
+ VALUE wobj = (VALUE)node->val;
221
+ RwWindow *rw = DATA_PTR(wobj);
222
+ if(rw->hwnd) rb_gc_mark(wobj);
223
+ }
224
+
225
+ static void
226
+ aa_callback_mark_rw_rsrc(const AAnode *node, void *arg){
227
+ VALUE robj = (VALUE)node->val;
228
+ RwResource *rr = DATA_PTR(robj);
229
+ // fprintf(stderr, "@%d: type=%d, handle=%p\n", __LINE__, rr->type, rr->handle);
230
+ if(rr->handle) rb_gc_mark(robj); /* Bitmap image will be held by Imagelist. */
231
+ // if(rr->type==RcMenu && rr->handle) rb_gc_mark(robj); /* Menu will be held by another one. */
232
+ }
233
+
234
+ static void
235
+ mark_rw_window(void *ptr){
236
+ if (ptr){
237
+ RwResources *rc = ptr;
238
+ aaForeach(rc->winlist, aa_callback_mark_rw_window, NULL);
239
+ aaForeach(rc->childwinlist, aa_callback_mark_rw_window, NULL);
240
+ aaForeach(rc->rsclist, aa_callback_mark_rw_rsrc, NULL);
241
+ }
242
+ }
243
+
244
+ static void
245
+ aa_callback_destroy_win(const AAnode *node, void *arg){
246
+ HWND hwnd = (HWND)node->key;
247
+ if (!GetParent(hwnd)){
248
+ DestroyWindow(hwnd);
249
+ }
250
+ }
251
+
252
+ void
253
+ destroy_all_win(int gui){
254
+ RwResources *rc;
255
+ Data_Get_Struct(resources, RwResources, rc);
256
+ aaForeach(rc->winlist, aa_callback_destroy_win, &gui);
257
+ }
258
+
259
+ static VALUE
260
+ rwapp_quit_app(VALUE mod){
261
+ PostQuitMessage(0);
262
+ return Qnil;
263
+ }
264
+
265
+ static VALUE
266
+ rwapp_getcursorpos(VALUE mod){
267
+ VALUE robj;
268
+ POINT pt;
269
+ GetCursorPos(&pt);
270
+ robj = rb_ary_new2(2);
271
+ rb_ary_store(robj, 0, INT2FIX(pt.x));
272
+ rb_ary_store(robj, 1, INT2FIX(pt.y));
273
+ return robj;
274
+ }
275
+
276
+ /* Cancel DefWindowProc */
277
+ static size_t
278
+ rw_candefwndprc_m_size(const void *ptr){
279
+ return ptr ? sizeof(RwCancelDefWindowProc) : 0;
280
+ }
281
+
282
+ const rb_data_type_t
283
+ rw_candefwndprc_d_type = {
284
+ "CancelDefWindowProc", {NULL, free, rw_candefwndprc_m_size,}, NULL, NULL
285
+ };
286
+
287
+ static VALUE
288
+ rw_msg_new_and_set_retval(int argc, VALUE *argv, VALUE klass){
289
+ RwCancelDefWindowProc *rcp;
290
+ VALUE obj = TypedData_Make_Struct(cRwCancelDefWndProc, RwCancelDefWindowProc, &rw_candefwndprc_d_type, rcp);
291
+ if (argc>0) {
292
+ rcp->retval = NIL_P(argv[0]) ? 1 : NUM2ULONG_PTR(argv[0]);
293
+ }
294
+ return obj;
295
+ }
296
+
297
+ static VALUE
298
+ rwapp_get_externalenc(){
299
+ return external_encoding;
300
+ }
301
+ static VALUE
302
+ rwapp_set_externalenc(VALUE klass, VALUE enc){
303
+ external_encoding = enc;
304
+ rw_external_enc = rb_enc_from_index(rb_to_encoding_index(external_encoding));
305
+ return enc;
306
+ }
307
+
308
+ static VALUE
309
+ is_unicodep(){
310
+ #ifdef UNICODE
311
+ return Qtrue;
312
+ #else
313
+ return Qfalse;
314
+ #endif
315
+ }
316
+
317
+ static void
318
+ set_rw_gui_app_p(){
319
+ IMAGE_OPTIONAL_HEADER32 *opt_hdr;
320
+ IMAGE_DOS_HEADER *dos_hdr = (IMAGE_DOS_HEADER*)hInstance;
321
+ opt_hdr = (IMAGE_OPTIONAL_HEADER32*)((char*)hInstance + dos_hdr->e_lfanew + sizeof(DWORD) +
322
+ sizeof(IMAGE_FILE_HEADER));
323
+ IS_GUIAPP = (opt_hdr->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI) ? Qtrue : Qfalse;
324
+ }
325
+
326
+ static void
327
+ set_rw_comctlversion(){
328
+ DLLVERSIONINFO dvi;
329
+ HANDLE hdll = LoadLibrary(TEXT("comctl32.dll"));
330
+ FARPROC pDllGetVersion = (FARPROC)GetProcAddress(hdll, "DllGetVersion");
331
+ ZeroMemory(&dvi, sizeof(dvi));
332
+ dvi.cbSize = sizeof(dvi);
333
+ if (pDllGetVersion && pDllGetVersion(&dvi)==S_OK) {
334
+ COMCTL_MAJOR_VERSION = INT2FIX(dvi.dwMajorVersion);
335
+ COMCTL_MINOR_VERSION = INT2FIX(dvi.dwMinorVersion);
336
+ } else {
337
+ COMCTL_MAJOR_VERSION = Qnil;
338
+ COMCTL_MINOR_VERSION = Qnil;
339
+ }
340
+ }
341
+
342
+ static VALUE
343
+ rwapp_count_opened_window(){
344
+ return INT2FIX(aaCount(winlist));
345
+ }
346
+
347
+ static VALUE
348
+ rwapp_hwnd2ref(VALUE klass, VALUE v_handle){
349
+ VALUE wobj;
350
+ int hsearch = NUM2ULONG_PTR(v_handle);
351
+ if(wobj=Get_childwin(hsearch)) return wobj;
352
+ if(wobj=Get_win(hsearch)) return wobj;
353
+ return Qnil;
354
+ }
355
+
356
+ static VALUE
357
+ rwapp_hrsc2ref(VALUE klass, VALUE v_handle){
358
+ VALUE wobj;
359
+ if(wobj=Get_rsc(NUM2ULONG_PTR(v_handle))) return wobj;
360
+ return Qnil;
361
+ }
362
+
363
+ /* Initializing */
364
+ void
365
+ Init_rwin(){
366
+ RwResources *rc;
367
+
368
+ hInstance = GetModuleHandle(NULL);
369
+ set_rw_gui_app_p();
370
+ set_rw_comctlversion();
371
+
372
+ resources = Data_Make_Struct(rb_cObject, RwResources, mark_rw_window, -1, rc);
373
+ rb_global_variable(&resources);
374
+
375
+ activewin = NULL;
376
+
377
+ winlist = newAAtree(NULL);/* destructor is't needed, 'cause Ruby destructs all at shudown */
378
+ childwinlist = newAAtree(NULL); /* ditto */
379
+ rsclist = newAAtree(NULL); /* ditto */
380
+ rc->winlist = winlist;
381
+ rc->childwinlist = childwinlist;
382
+ rc->rsclist = rsclist;
383
+
384
+ external_encoding = rb_enc_from_encoding(rb_default_external_encoding());
385
+ wchar_encoding = rb_enc_from_encoding(rb_enc_find("UTF-16LE"));
386
+ #ifdef UNICODE
387
+ internal_encoding = wchar_encoding;
388
+ #else
389
+ internal_encoding = external_encoding;
390
+ #endif
391
+ rw_internal_enc = rb_enc_from_index(rb_to_encoding_index(internal_encoding));
392
+ rw_external_enc = rb_enc_from_index(rb_to_encoding_index(external_encoding));
393
+ rw_wchar_enc = rb_enc_from_index(rb_to_encoding_index(wchar_encoding));
394
+
395
+ mRwin = rb_define_module("RWin");
396
+ mRwApp = rb_define_module_under(mRwin, "Application");
397
+
398
+ rb_define_const(mRwin, "RW_VERSION", rb_str_new2(RW_VERSION));
399
+ #if UNICODE
400
+ rb_define_const(mRwin, "UNICODE", Qtrue);
401
+ #else
402
+ rb_define_const(mRwin, "UNICODE", Qfalse);
403
+ #endif
404
+
405
+ #ifdef _WIN64
406
+ rb_define_const(mRwin, "X64", Qtrue);
407
+ #else
408
+ rb_define_const(mRwin, "X64", Qfalse);
409
+ #endif
410
+
411
+ rb_define_const(mRwApp, "IS_GUIAPP", IS_GUIAPP);
412
+ rb_define_const(mRwApp, "COMCTL_MAJOR_VERSION", COMCTL_MAJOR_VERSION);
413
+ rb_define_const(mRwApp, "COMCTL_MINOR_VERSION", COMCTL_MINOR_VERSION);
414
+
415
+ rw_eResourceNotAliveError = rb_define_class_under(mRwin, "ResourceNotAliveError",
416
+ rb_eRuntimeError);
417
+ rw_eWindowNotAliveError = rb_define_class_under(mRwin, "WindowNotAliveError",
418
+ rb_eRuntimeError);
419
+
420
+ rb_define_singleton_method(mRwApp,"hInstance", rwapp_hinstance, 0);
421
+ rb_define_singleton_method(mRwApp,"msgloop", rwapp_msgloop, 0);
422
+ rb_define_singleton_method(mRwApp,"dlgmsgloop", rwapp_dlgmsgloop, 0);
423
+ rb_define_singleton_method(mRwApp,"automsgloop", rwapp_automsgloop, 0);
424
+ rb_define_singleton_method(mRwApp,"quit!", rwapp_quit_app, 0);
425
+ rb_define_singleton_method(mRwApp, "GetCursorPos", rwapp_getcursorpos, 0);
426
+
427
+ rb_define_singleton_method(mRwApp,"count_opened_window", rwapp_count_opened_window, 0);
428
+ rb_define_singleton_method(mRwApp,"hwnd2ref", rwapp_hwnd2ref, 1);
429
+ rb_define_singleton_method(mRwApp,"hrsc2ref", rwapp_hrsc2ref, 1);
430
+
431
+ cRwCancelDefWndProc = rb_define_class_under(mRwApp, "CancelDefWindowProc", rb_cObject);
432
+ rb_define_singleton_method(mRwApp, "CancelDefWindowProc", rw_msg_new_and_set_retval, -1);
433
+
434
+ RwClassAtom = RegisterWndClass(RW_CLASS_NAME, LoadIcon(NULL,IDI_APPLICATION),
435
+ CS_GLOBALCLASS | CS_HREDRAW | CS_VREDRAW ,
436
+ (HBRUSH)(1+COLOR_3DFACE), LoadCursor(NULL, IDC_ARROW),
437
+ RwWndProc);
438
+
439
+
440
+ /* Encoding */
441
+ rb_define_singleton_method(mRwApp, "external_encoding", rwapp_get_externalenc, 0);
442
+ rb_define_singleton_method(mRwApp, "external_encoding=", rwapp_set_externalenc, 1);
443
+ rb_define_singleton_method(mRwApp, "is_unicode?", is_unicodep, 0);
444
+
445
+ /* Initialize modules */
446
+ Init_rw_api();
447
+ Init_rw_windows();
448
+ Init_rw_resources();
449
+ Init_rw_graphics();
450
+ Init_rw_devices();
451
+ }
@@ -0,0 +1,442 @@
1
+ /*
2
+ # Project WRB was forked from Project VisualuRuby(temp-name).
3
+ # Author of this project: BANJO Koyu <banjokoyu at gmail.com>
4
+ # The URL of this project: https://bitbucket.org/wrb/
5
+ #
6
+ # This is a ext-library part of WRB.
7
+ */
8
+
9
+ #ifndef __RWIN_H__
10
+ #define __RWIN_H__
11
+
12
+ #include <ctype.h>
13
+ #include <wchar.h>
14
+ #include "ruby.h"
15
+ #include <windows.h>
16
+ #include <commctrl.h>
17
+
18
+ #include "rw_gdiplus.h"
19
+
20
+ #ifdef __CYGWIN__
21
+ # include <sys/cygwin.h>
22
+ #endif
23
+
24
+ #include "ruby/thread.h"
25
+ #include "ruby/encoding.h"
26
+
27
+ #include "aatree.h"
28
+
29
+ #ifndef WINVER
30
+ # define WINVER 0x0580 /* Only for Windows XP and later, will not work on Windows 2000 or 9X */
31
+ #endif
32
+
33
+ #define RW_VERSION "2.0.0"
34
+ #define RW_MAXPATH 256
35
+ #define RW_CLASS_NAME TEXT("RUBYWIN")
36
+
37
+ #ifdef _WIN64
38
+ # define NUM2HANDLE NUM2ULL
39
+ # define NUM2ULONG_PTR NUM2ULL
40
+ # define NUM2LONG_PTR NUM2LL
41
+ # define LONG_PTR2NUM LL2NUM
42
+ # define ULONG_PTR2NUM ULL2NUM
43
+ #else
44
+ # define NUM2HANDLE NUM2ULONG
45
+ # define NUM2ULONG_PTR NUM2ULONG
46
+ # define NUM2LONG_PTR NUM2LONG
47
+ # define LONG_PTR2NUM LONG2NUM
48
+ # define ULONG_PTR2NUM ULONG2NUM
49
+ #endif
50
+
51
+ #define RW_MALLOC(ptr, size) do{ \
52
+ ptr = malloc(size); \
53
+ if(!ptr) rb_raise(rb_eRuntimeError, "failed to allocate memory"); \
54
+ } while(0)
55
+
56
+ #define RW_CALLOC(ptr, size) do{ \
57
+ ptr = calloc(size, sizeof(char)); \
58
+ if(!ptr) rb_raise(rb_eRuntimeError, "failed to allocate memory"); \
59
+ } while(0)
60
+
61
+
62
+ /* Global variables */
63
+ extern ATOM RwClassAtom;
64
+ extern HINSTANCE hInstance;
65
+
66
+ extern AAtree *winlist;
67
+ extern AAtree *childwinlist;
68
+ extern AAtree *rsclist;
69
+
70
+ /* Ruby's constants */
71
+ extern VALUE IS_GUIAPP;
72
+ extern VALUE COMCTL_MAJOR_VERSION;
73
+ extern VALUE COMCTL_MINOR_VERSION;
74
+
75
+ /* classes and modules */
76
+ extern VALUE mRwin;
77
+ extern VALUE mRwApp;
78
+ extern VALUE cRwWindow;
79
+ extern VALUE cRwCancelDefWndProc;
80
+ extern VALUE cRwBitmap;
81
+ extern VALUE cRwIcon;
82
+ extern VALUE cRwImage;
83
+
84
+ extern VALUE cRwCanvas;
85
+ extern VALUE mRwAPI;
86
+ extern VALUE cRwAPIfunc;
87
+ extern VALUE cRwAPIstruct;
88
+ extern VALUE apifunc_class_libs;
89
+
90
+ /* CStruct constants */
91
+ extern int _id_apistr_class_stsize;
92
+ extern int _id_apistr_class_sttemplate;
93
+ extern int _id_apistr_class_stclasses;
94
+ extern int _id_apistr_class_stargcount;
95
+
96
+ /* pre-defined classes for CStruct */
97
+ extern VALUE ccsCHAR, ccsWCHAR, ccsTCHAR, ccsBYTE, ccsWORD, ccsDWORD, ccsPOINT, ccsSIZE, ccsRECT;
98
+ extern VALUE ccsLOGBRUSH, ccsLOGFONT, ccsLOGPEN, ccsIMAGEINFO, ccsBITMAPINFO, ccsMENUITEMINFO;
99
+ extern VALUE ccsDEVMODE;
100
+
101
+ /* Errors */
102
+ extern VALUE rw_eWindowNotAliveError;
103
+ extern VALUE rw_eResourceNotAliveError;
104
+
105
+ #define Register_win(hwnd, wobj) aaInsert(winlist, (ULONG_PTR)hwnd, (void*)wobj)
106
+ #define Unregister_win(hwnd) aaDelete(winlist, (ULONG_PTR)hwnd)
107
+ #define Get_win(hwnd) ((VALUE)aaGetval(winlist, (ULONG_PTR)hwnd))
108
+
109
+ #define Register_childwin(hwnd, wobj) aaInsert(childwinlist, (ULONG_PTR)hwnd, (void*)wobj)
110
+ #define Unregister_childwin(hwnd) aaDelete(childwinlist, (ULONG_PTR)hwnd)
111
+ #define Get_childwin(hwnd) ((VALUE)aaGetval(childwinlist, (ULONG_PTR)hwnd))
112
+
113
+ #define Register_rsc(handle, rcobj) aaInsert(rsclist, (ULONG_PTR)handle, (void*)rcobj)
114
+ #define Unregister_rsc(handle) aaDelete(rsclist, (ULONG_PTR)handle)
115
+ #define Get_rsc(handle) ((VALUE)aaGetval(rsclist, (ULONG_PTR)handle))
116
+
117
+ /* Structures */
118
+
119
+ typedef struct {
120
+ AAtree *winlist;
121
+ AAtree *childwinlist;
122
+ AAtree *rsclist;
123
+ } RwResources;
124
+
125
+ typedef struct {
126
+ HWND hwnd;
127
+ AAtree *msgfilter;
128
+ AAtree *handler_ids;
129
+ DWORD nthread_id;
130
+ HACCEL haccel;
131
+ } RwWindow;
132
+
133
+ typedef struct RwMsgHandler_ {
134
+ unsigned handler_id;
135
+ char *arg_template;
136
+ VALUE klass;
137
+ VALUE receiver;
138
+ struct RwMsgHandler_ *next;
139
+ } RwMsgHandler;
140
+
141
+ typedef struct {
142
+ RwMsgHandler *handler;
143
+ AAtree *senders;
144
+ } RwBaseHandler;
145
+
146
+ #define RwCheckWindow(win) \
147
+ if(!(win)->hwnd){rb_raise(rw_eWindowNotAliveError, "Window is not alive");}
148
+
149
+ /* resources */
150
+
151
+ typedef enum {
152
+ RcMenu = 0,
153
+ RcFont,
154
+ RcIcon,
155
+ RcCursor,
156
+ RcBitmap,
157
+ RcImagelist,
158
+ RcPen,
159
+ RcBrush
160
+ } RCTYPE;
161
+
162
+ typedef struct {
163
+ RCTYPE type;
164
+ HANDLE handle;
165
+ } RwResource;
166
+
167
+ typedef struct {
168
+ RCTYPE type;
169
+ HMENU hmenu;
170
+ HWND hwnd;
171
+ } RwMenu;
172
+
173
+ typedef struct {
174
+ RCTYPE type;
175
+ HFONT hfont;
176
+ int external;
177
+ } RwFont;
178
+
179
+ typedef struct {
180
+ RCTYPE type;
181
+ HICON hicon;
182
+ BOOL shared;
183
+ } RwIcon;
184
+
185
+ typedef struct {
186
+ RCTYPE type;
187
+ HCURSOR hcursor;
188
+ BOOL shared;
189
+ } RwCursor;
190
+
191
+ typedef struct {
192
+ RCTYPE type;
193
+ HBITMAP hbitmap;
194
+ HBITMAP hddbitmap; /* device dependent bitmap */
195
+ HDC hdc;
196
+ BOOL shared;
197
+ } RwBitmap;
198
+
199
+ typedef struct {
200
+ RCTYPE type;
201
+ HIMAGELIST himagelist;
202
+ } RwImagelist;
203
+
204
+ typedef struct{
205
+ RCTYPE type;
206
+ HPEN hpen;
207
+ } RwPen;
208
+
209
+ typedef struct{
210
+ RCTYPE type;
211
+ HBRUSH hbrush;
212
+ } RwBrush;
213
+
214
+ #define RwCheckResource(rc) \
215
+ if(!((RwResource*)rc)->handle){rb_raise(rw_eResourceNotAliveError, "Resource is not alive");}
216
+
217
+ /* device contexts */
218
+ typedef struct {
219
+ HDC hdc;
220
+ union {
221
+ HWND hwnd;
222
+ HBITMAP hbitmap;
223
+ };
224
+ union {
225
+ HANDLE h_orig;
226
+ HPEN hp_orig;
227
+ HBRUSH hb_orig;
228
+ HFONT hf_orig;
229
+ };
230
+ double rx;
231
+ double ry;
232
+ } RwCanvas;
233
+
234
+ typedef struct {
235
+ LRESULT retval;
236
+ } RwCancelDefWindowProc;
237
+
238
+ typedef struct {
239
+ int nargs;
240
+ ULONG_PTR procaddress;
241
+ } CFuncData;
242
+
243
+ typedef struct {
244
+ char* dtstr;
245
+ int dtoffset;
246
+ size_t dtlen;
247
+ VALUE dtparent;
248
+ VALUE* dtreferences;
249
+ BYTE dtwrapped;
250
+ BYTE bifunc;
251
+ WORD prindex; /* index of parent for ArrayPart*/
252
+ } CStructData;
253
+
254
+ typedef struct {
255
+ RwWindow rwwin;
256
+ VALUE param;
257
+ BOOL modal;
258
+ } RwDialog;
259
+
260
+ typedef struct{
261
+ void* himage;
262
+ } RwImage;
263
+
264
+ /* Global variable for message loop */
265
+ extern RwWindow *activewin;
266
+
267
+ /* Definitions of TypedData */
268
+ #ifndef HAVE_TYPE_RB_DATA_TYPE_T
269
+ # error "Need HAVE_TYPE_RB_DATA_TYPE_T"
270
+ #endif
271
+
272
+ extern const rb_data_type_t cfunc_data_type;
273
+ extern const rb_data_type_t cstruct_data_type;
274
+ extern const rb_data_type_t rwwin_data_type;
275
+ extern const rb_data_type_t rw_candefwndprc_d_type;
276
+ extern const rb_data_type_t rwcanvas_data_type;
277
+ extern const rb_data_type_t rwfont_data_type;
278
+ extern const rb_data_type_t rwicon_data_type;
279
+ extern const rb_data_type_t rwcursor_data_type;
280
+ extern const rb_data_type_t rwbitmap_data_type;
281
+ extern const rb_data_type_t rwpen_data_type;
282
+ extern const rb_data_type_t rwbrush_data_type;
283
+ extern const rb_data_type_t rwimagelist_data_type;
284
+ extern const rb_data_type_t rwmenu_data_type;
285
+ extern const rb_data_type_t rwimage_data_type;
286
+
287
+ #define CFunc_Data_Make_Struct(obj, sval) \
288
+ TypedData_Make_Struct(obj, CFuncData, &cfunc_data_type, sval)
289
+
290
+ #define CFunc_Data_Get_Struct(obj, sval) \
291
+ TypedData_Get_Struct(obj, CFuncData, &cfunc_data_type, sval)
292
+
293
+ #define CStruct_Data_Make_Struct(obj, sval) \
294
+ TypedData_Make_Struct(obj, CStructData, &cstruct_data_type, sval)
295
+
296
+ #define CStruct_Data_Get_Struct(obj, sval) \
297
+ TypedData_Get_Struct(obj, CStructData, &cstruct_data_type, sval)
298
+
299
+ #define RwWindow_Data_Make_Struct(obj, sval) \
300
+ TypedData_Make_Struct(obj, RwWindow, &rwwin_data_type, sval)
301
+
302
+ #define RwWindow_Data_Get_Struct(obj, sval) \
303
+ TypedData_Get_Struct(obj, RwWindow, &rwwin_data_type, sval)
304
+
305
+ #define RwDialog_Data_Make_Struct(obj, sval) \
306
+ TypedData_Make_Struct(obj, RwDialog, &rwdlg_data_type, sval)
307
+
308
+ #define RwDialog_Data_Get_Struct(obj, sval) \
309
+ TypedData_Get_Struct(obj, RwDialog, &rwdlg_data_type, sval)
310
+
311
+ #define RwCanvas_Data_Make_Struct(obj, sval) \
312
+ TypedData_Make_Struct(obj, RwCanvas, &rwcanvas_data_type, sval)
313
+
314
+ #define RwCanvas_Data_Get_Struct(obj, sval) \
315
+ TypedData_Get_Struct(obj, RwCanvas, &rwcanvas_data_type, sval)
316
+
317
+ #define RwFont_Data_Make_Struct(obj, sval) \
318
+ TypedData_Make_Struct(obj, RwFont, &rwfont_data_type, sval)
319
+
320
+ #define RwFont_Data_Get_Struct(obj, sval) \
321
+ TypedData_Get_Struct(obj, RwFont, &rwfont_data_type, sval)
322
+
323
+ #define RwIcon_Data_Make_Struct(obj, sval) \
324
+ TypedData_Make_Struct(obj, RwIcon, &rwicon_data_type, sval)
325
+
326
+ #define RwIcon_Data_Get_Struct(obj, sval) \
327
+ TypedData_Get_Struct(obj, RwIcon, &rwicon_data_type, sval)
328
+
329
+ #define RwCursor_Data_Make_Struct(obj, sval) \
330
+ TypedData_Make_Struct(obj, RwCursor, &rwcursor_data_type, sval)
331
+
332
+ #define RwCursor_Data_Get_Struct(obj, sval) \
333
+ TypedData_Get_Struct(obj, RwCursor, &rwcursor_data_type, sval)
334
+
335
+ #define RwBitmap_Data_Make_Struct(obj, sval) \
336
+ TypedData_Make_Struct(obj, RwBitmap, &rwbitmap_data_type, sval)
337
+
338
+ #define RwBitmap_Data_Get_Struct(obj, sval) \
339
+ TypedData_Get_Struct(obj, RwBitmap, &rwbitmap_data_type, sval)
340
+
341
+ #define RwPen_Data_Make_Struct(obj, sval) \
342
+ TypedData_Make_Struct(obj, RwPen, &rwpen_data_type, sval)
343
+
344
+ #define RwPen_Data_Get_Struct(obj, sval) \
345
+ TypedData_Get_Struct(obj, RwPen, &rwpen_data_type, sval)
346
+
347
+ #define RwBrush_Data_Make_Struct(obj, sval) \
348
+ TypedData_Make_Struct(obj, RwBrush, &rwbrush_data_type, sval)
349
+
350
+ #define RwBrush_Data_Get_Struct(obj, sval) \
351
+ TypedData_Get_Struct(obj, RwBrush, &rwbrush_data_type, sval)
352
+
353
+ #define RwImagelist_Data_Make_Struct(obj, sval) \
354
+ TypedData_Make_Struct(obj, RwImagelist, &rwimagelist_data_type, sval)
355
+
356
+ #define RwImagelist_Data_Get_Struct(obj, sval) \
357
+ TypedData_Get_Struct(obj, RwImagelist, &rwimagelist_data_type, sval)
358
+
359
+ #define RwMenu_Data_Make_Struct(obj, sval) \
360
+ TypedData_Make_Struct(obj, RwMenu, &rwmenu_data_type, sval)
361
+
362
+ #define RwMenu_Data_Get_Struct(obj, sval) \
363
+ TypedData_Get_Struct(obj, RwMenu, &rwmenu_data_type, sval)
364
+
365
+ #define RwImage_Data_Make_Struct(obj, sval) \
366
+ TypedData_Make_Struct(obj, RwImage, &rwimage_data_type, sval)
367
+
368
+ #define RwImage_Data_Get_Struct(obj, sval) \
369
+ TypedData_Get_Struct(obj, RwImage, &rwimage_data_type, sval)
370
+
371
+ /* Encoding */
372
+ extern VALUE internal_encoding, external_encoding, wchar_encoding;
373
+ extern rb_encoding *rw_internal_enc, *rw_external_enc, *rw_wchar_enc;
374
+
375
+ //inline TCHAR* rw_encode_internal(VALUE str);
376
+ TCHAR *rw_str2tchar(VALUE str);
377
+ WCHAR *rw_str2wchar(VALUE str);
378
+ TCHAR *rw_str2tchar2(VALUE str, size_t* bytesize);
379
+
380
+ VALUE rw_encode_external(TCHAR *buff);
381
+ VALUE rw_encode_external2(WCHAR *buff, int len);
382
+
383
+ /* prototyping */
384
+ // void cst_set_memory_to_struct(CStructData* sdtptr, char *target, const size_t len);
385
+
386
+ /* Unblocking functions (defined in 'rw_ubfunc.c')*/
387
+ #ifdef RWIN_USEMULTITHREAD
388
+ # define CALL_NON_GVL_FUNC(apiproc, calldata) \
389
+ (LONG_PTR)rb_thread_call_without_gvl((void*(*)(void*))apiproc, calldata, RUBY_UBF_IO, 0)
390
+ #else
391
+ # define CALL_NON_GVL_FUNC(apiproc, calldata) (LONG_PTR)apiproc(calldata)
392
+ #endif
393
+
394
+ ULONG_PTR rw_call_std_func_0(ULONG_PTR* arg);
395
+ ULONG_PTR rw_call_std_func_1(ULONG_PTR* arg);
396
+ ULONG_PTR rw_call_std_func_2(ULONG_PTR* arg);
397
+ ULONG_PTR rw_call_std_func_3(ULONG_PTR* arg);
398
+ ULONG_PTR rw_call_std_func_4(ULONG_PTR* arg);
399
+ ULONG_PTR rw_call_std_func_5(ULONG_PTR* arg);
400
+ ULONG_PTR rw_call_std_func_6(ULONG_PTR* arg);
401
+ ULONG_PTR rw_call_std_func_7(ULONG_PTR* arg);
402
+ ULONG_PTR rw_call_std_func_8(ULONG_PTR* arg);
403
+ ULONG_PTR rw_call_std_func_9(ULONG_PTR* arg);
404
+ ULONG_PTR rw_call_std_func_10(ULONG_PTR* arg);
405
+ ULONG_PTR rw_call_std_func_11(ULONG_PTR* arg);
406
+ ULONG_PTR rw_call_std_func_12(ULONG_PTR* arg);
407
+
408
+ ULONG_PTR rw_call_without_gvl_0(DWORD, FARPROC);
409
+ ULONG_PTR rw_call_without_gvl_1(DWORD, FARPROC, ULONG_PTR);
410
+ ULONG_PTR rw_call_without_gvl_2(DWORD, FARPROC, ULONG_PTR, ULONG_PTR);
411
+ ULONG_PTR rw_call_without_gvl_3(DWORD, FARPROC, ULONG_PTR, ULONG_PTR, ULONG_PTR);
412
+ ULONG_PTR rw_call_without_gvl_4(DWORD, FARPROC, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR);
413
+ ULONG_PTR rw_call_without_gvl_5(DWORD, FARPROC, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR);
414
+ ULONG_PTR rw_call_without_gvl_6(DWORD, FARPROC, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR);
415
+ ULONG_PTR rw_call_without_gvl_7(DWORD, FARPROC, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR);
416
+ ULONG_PTR rw_call_without_gvl_8(DWORD, FARPROC, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR);
417
+ ULONG_PTR rw_call_without_gvl_9(DWORD, FARPROC, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR);
418
+ ULONG_PTR rw_call_without_gvl_10(DWORD, FARPROC, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR);
419
+ ULONG_PTR rw_call_without_gvl_11(DWORD, FARPROC, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR);
420
+ ULONG_PTR rw_call_without_gvl_12(DWORD, FARPROC, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR);
421
+
422
+ /* prototypes */
423
+ LRESULT CALLBACK RwWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
424
+ void destroy_all_win(int);
425
+ VALUE cstruct_wrapptr(VALUE klass, char* pointer, VALUE parent);
426
+ VALUE rwcvs_new_from_hdc(VALUE klass, HDC hdc);
427
+ void rwgdiplus_shutdown();
428
+ VALUE stream2string(LPSTREAM pstream);
429
+ VALUE api_cstruct_new(VALUE klass);
430
+ void rwconv2absolute_path(char* dst, char* src);
431
+ void rwconv2absolute_pathW(wchar_t* dst, wchar_t* src);
432
+
433
+ /* prototypes of Initializer */
434
+ void Init_rwin();
435
+ void Init_rw_api();
436
+ void Init_rw_windows();
437
+ void Init_rw_dialog();
438
+ void Init_rw_resources();
439
+ void Init_rw_graphics();
440
+ void Init_rw_devices();
441
+
442
+ #endif /* __RWIN_H__ */