wrb 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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__ */