wrb 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README +28 -0
- data/Rakefile +66 -0
- data/bin/wrb +41 -0
- data/bin/wrb.bat +6 -0
- data/ext/rwin/aatree.c +192 -0
- data/ext/rwin/aatree.h +55 -0
- data/ext/rwin/extconf.rb +47 -0
- data/ext/rwin/rw_api.c +2058 -0
- data/ext/rwin/rw_devices.c +215 -0
- data/ext/rwin/rw_gdiplus.h +278 -0
- data/ext/rwin/rw_graphics.c +1583 -0
- data/ext/rwin/rw_resources.c +1988 -0
- data/ext/rwin/rw_ubfuncs.c +281 -0
- data/ext/rwin/rw_windows.c +1936 -0
- data/ext/rwin/rwin.c +451 -0
- data/ext/rwin/rwin.h +442 -0
- data/lib/rwin.rb +820 -0
- data/lib/wrb.rb +20 -0
- data/lib/wrb/applications/frmdesigner/angle.cur +0 -0
- data/lib/wrb/applications/frmdesigner/angle2.cur +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Button.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Button.rb +34 -0
- data/lib/wrb/applications/frmdesigner/controls/Checkbox.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Checkbox.rb +10 -0
- data/lib/wrb/applications/frmdesigner/controls/Combobox.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Combobox.rb +88 -0
- data/lib/wrb/applications/frmdesigner/controls/ComboboxEx.rb +97 -0
- data/lib/wrb/applications/frmdesigner/controls/Comboboxex.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/DateTimePicker.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/DateTimePicker.rb +11 -0
- data/lib/wrb/applications/frmdesigner/controls/Edit.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Edit.rb +8 -0
- data/lib/wrb/applications/frmdesigner/controls/Groupbox.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Groupbox.rb +9 -0
- data/lib/wrb/applications/frmdesigner/controls/Hotkeyctrl.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Hotkeyctrl.rb +9 -0
- data/lib/wrb/applications/frmdesigner/controls/Imagelist.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Imagelist.rb +115 -0
- data/lib/wrb/applications/frmdesigner/controls/Listbox.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Listbox.rb +77 -0
- data/lib/wrb/applications/frmdesigner/controls/Listview.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Listview.rb +157 -0
- data/lib/wrb/applications/frmdesigner/controls/Menu.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Menu.rb +198 -0
- data/lib/wrb/applications/frmdesigner/controls/Menubar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Menubar.rb +9 -0
- data/lib/wrb/applications/frmdesigner/controls/MonthCalender.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Monthcalender.rb +9 -0
- data/lib/wrb/applications/frmdesigner/controls/Panel.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Panel.rb +30 -0
- data/lib/wrb/applications/frmdesigner/controls/Progressbar.rb +10 -0
- data/lib/wrb/applications/frmdesigner/controls/Radiobutton.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Radiobutton.rb +13 -0
- data/lib/wrb/applications/frmdesigner/controls/Rebar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Rebar.rb +162 -0
- data/lib/wrb/applications/frmdesigner/controls/Splitter.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Splitter.rb +66 -0
- data/lib/wrb/applications/frmdesigner/controls/Static.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Static.rb +9 -0
- data/lib/wrb/applications/frmdesigner/controls/Statusbar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Statusbar.rb +103 -0
- data/lib/wrb/applications/frmdesigner/controls/Tabctrl.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Tabctrl.rb +136 -0
- data/lib/wrb/applications/frmdesigner/controls/Timer.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Timer.rb +36 -0
- data/lib/wrb/applications/frmdesigner/controls/Toolbar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Toolbar.rb +165 -0
- data/lib/wrb/applications/frmdesigner/controls/Trackbar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Trackbar.rb +34 -0
- data/lib/wrb/applications/frmdesigner/controls/Treeview.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Treeview.rb +107 -0
- data/lib/wrb/applications/frmdesigner/controls/Updown.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/Updown.rb +31 -0
- data/lib/wrb/applications/frmdesigner/controls/default.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/progressbar.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/controls/unselect.bmp +0 -0
- data/lib/wrb/applications/frmdesigner/fddialogs.rb +87 -0
- data/lib/wrb/applications/frmdesigner/fdesign.rb +1315 -0
- data/lib/wrb/applications/frmdesigner/fdmodules.rb +1394 -0
- data/lib/wrb/applications/frmdesigner/fdparseform.rb +197 -0
- data/lib/wrb/applications/frmdesigner/img13.bmp +0 -0
- data/lib/wrb/base.rb +1294 -0
- data/lib/wrb/combocommon.rb +77 -0
- data/lib/wrb/commctrlconst.rb +139 -0
- data/lib/wrb/commdlg.rb +77 -0
- data/lib/wrb/components/animate.rb +114 -0
- data/lib/wrb/components/bitmap.rb +116 -0
- data/lib/wrb/components/button.rb +134 -0
- data/lib/wrb/components/canvas.rb +266 -0
- data/lib/wrb/components/checkbox.rb +118 -0
- data/lib/wrb/components/choosecolordlg.rb +87 -0
- data/lib/wrb/components/choosefontdlg.rb +142 -0
- data/lib/wrb/components/clipboard.rb +174 -0
- data/lib/wrb/components/combobox.rb +282 -0
- data/lib/wrb/components/comboboxex.rb +574 -0
- data/lib/wrb/components/cursor.rb +91 -0
- data/lib/wrb/components/datetimepicker.rb +197 -0
- data/lib/wrb/components/ddeclient.rb +180 -0
- data/lib/wrb/components/ddeserver.rb +131 -0
- data/lib/wrb/components/dialog.rb +228 -0
- data/lib/wrb/components/edit.rb +412 -0
- data/lib/wrb/components/font.rb +35 -0
- data/lib/wrb/components/form.rb +65 -0
- data/lib/wrb/components/groupbox.rb +122 -0
- data/lib/wrb/components/header.rb +479 -0
- data/lib/wrb/components/hotkeyctrl.rb +72 -0
- data/lib/wrb/components/icon.rb +109 -0
- data/lib/wrb/components/imagelist.rb +396 -0
- data/lib/wrb/components/inifile.rb +97 -0
- data/lib/wrb/components/listbox.rb +149 -0
- data/lib/wrb/components/listview.rb +1467 -0
- data/lib/wrb/components/menu.rb +592 -0
- data/lib/wrb/components/menubar.rb +84 -0
- data/lib/wrb/components/monthcalender.rb +164 -0
- data/lib/wrb/components/openfilenamedlg.rb +147 -0
- data/lib/wrb/components/pager.rb +199 -0
- data/lib/wrb/components/panel.rb +103 -0
- data/lib/wrb/components/picture.rb +55 -0
- data/lib/wrb/components/printdlg.rb +148 -0
- data/lib/wrb/components/printdlgex.rb +117 -0
- data/lib/wrb/components/printer.rb +97 -0
- data/lib/wrb/components/progressbar.rb +140 -0
- data/lib/wrb/components/radiobutton.rb +49 -0
- data/lib/wrb/components/rebar.rb +830 -0
- data/lib/wrb/components/registry.rb +408 -0
- data/lib/wrb/components/richedit.rb +1181 -0
- data/lib/wrb/components/savefilenamedlg.rb +27 -0
- data/lib/wrb/components/scintilla.rb +1298 -0
- data/lib/wrb/components/scrollbar.rb +239 -0
- data/lib/wrb/components/splitter.rb +494 -0
- data/lib/wrb/components/static.rb +198 -0
- data/lib/wrb/components/statusbar.rb +490 -0
- data/lib/wrb/components/tabctrl.rb +686 -0
- data/lib/wrb/components/timer.rb +117 -0
- data/lib/wrb/components/toolbar.rb +1107 -0
- data/lib/wrb/components/tooltip.rb +651 -0
- data/lib/wrb/components/trackbar.rb +298 -0
- data/lib/wrb/components/treeview.rb +845 -0
- data/lib/wrb/components/updown.rb +198 -0
- data/lib/wrb/ddeml.rb +241 -0
- data/lib/wrb/documents/animate.html +46 -0
- data/lib/wrb/documents/bitmap.html +69 -0
- data/lib/wrb/documents/button.html +78 -0
- data/lib/wrb/documents/canvas.html +137 -0
- data/lib/wrb/documents/checkbox.html +77 -0
- data/lib/wrb/documents/choosecolordlg.html +29 -0
- data/lib/wrb/documents/choosefontdlg.html +31 -0
- data/lib/wrb/documents/clipboard.html +31 -0
- data/lib/wrb/documents/combobox.html +117 -0
- data/lib/wrb/documents/comboboxex.html +139 -0
- data/lib/wrb/documents/control.html +53 -0
- data/lib/wrb/documents/cursor.html +45 -0
- data/lib/wrb/documents/datetimepicker.html +70 -0
- data/lib/wrb/documents/ddeclient.html +33 -0
- data/lib/wrb/documents/ddeserver.html +26 -0
- data/lib/wrb/documents/dialog.html +78 -0
- data/lib/wrb/documents/edit.html +169 -0
- data/lib/wrb/documents/empty.html +11 -0
- data/lib/wrb/documents/favicon.png +0 -0
- data/lib/wrb/documents/font.html +38 -0
- data/lib/wrb/documents/form.html +63 -0
- data/lib/wrb/documents/groupbox.html +57 -0
- data/lib/wrb/documents/header.html +85 -0
- data/lib/wrb/documents/hotkeyctrl.html +42 -0
- data/lib/wrb/documents/icon.html +45 -0
- data/lib/wrb/documents/imagelist.html +101 -0
- data/lib/wrb/documents/images/button.png +0 -0
- data/lib/wrb/documents/images/checkbox.png +0 -0
- data/lib/wrb/documents/images/combobox.png +0 -0
- data/lib/wrb/documents/images/comboboxex.png +0 -0
- data/lib/wrb/documents/images/datetimepicker.png +0 -0
- data/lib/wrb/documents/images/edit.png +0 -0
- data/lib/wrb/documents/images/groupbox.png +0 -0
- data/lib/wrb/documents/images/hotkeyctrl.png +0 -0
- data/lib/wrb/documents/images/listbox.png +0 -0
- data/lib/wrb/documents/images/listview.png +0 -0
- data/lib/wrb/documents/images/menu.png +0 -0
- data/lib/wrb/documents/images/menubar.png +0 -0
- data/lib/wrb/documents/images/monthcalender.png +0 -0
- data/lib/wrb/documents/images/progressbar.png +0 -0
- data/lib/wrb/documents/images/radiobutton.png +0 -0
- data/lib/wrb/documents/images/rebar.png +0 -0
- data/lib/wrb/documents/images/richedit.png +0 -0
- data/lib/wrb/documents/images/splitter.png +0 -0
- data/lib/wrb/documents/images/static.png +0 -0
- data/lib/wrb/documents/images/statusbar.png +0 -0
- data/lib/wrb/documents/images/tabctrl.png +0 -0
- data/lib/wrb/documents/images/toolbar.png +0 -0
- data/lib/wrb/documents/images/tooltip.png +0 -0
- data/lib/wrb/documents/images/trackbar.png +0 -0
- data/lib/wrb/documents/images/treeview.png +0 -0
- data/lib/wrb/documents/images/updown.png +0 -0
- data/lib/wrb/documents/index.html +155 -0
- data/lib/wrb/documents/inifile.html +36 -0
- data/lib/wrb/documents/license.txt +22 -0
- data/lib/wrb/documents/listbox.html +96 -0
- data/lib/wrb/documents/listview.html +277 -0
- data/lib/wrb/documents/make_doc.rb +596 -0
- data/lib/wrb/documents/menu.html +144 -0
- data/lib/wrb/documents/menubar.html +54 -0
- data/lib/wrb/documents/monthcalender.html +48 -0
- data/lib/wrb/documents/openfilenamedlg.html +36 -0
- data/lib/wrb/documents/pager.html +63 -0
- data/lib/wrb/documents/panel.html +32 -0
- data/lib/wrb/documents/picture.html +48 -0
- data/lib/wrb/documents/printdlg.html +35 -0
- data/lib/wrb/documents/printdlgex.html +35 -0
- data/lib/wrb/documents/printer.html +40 -0
- data/lib/wrb/documents/progressbar.html +69 -0
- data/lib/wrb/documents/radiobutton.html +51 -0
- data/lib/wrb/documents/rebar.html +143 -0
- data/lib/wrb/documents/registry.html +36 -0
- data/lib/wrb/documents/richedit.html +232 -0
- data/lib/wrb/documents/samples/editimg.bmp +0 -0
- data/lib/wrb/documents/samples/editimg.iml +0 -0
- data/lib/wrb/documents/samples/fileimg.bmp +0 -0
- data/lib/wrb/documents/samples/fileimg.iml +0 -0
- data/lib/wrb/documents/samples/sample_button.rb +21 -0
- data/lib/wrb/documents/samples/sample_checkbox.rb +18 -0
- data/lib/wrb/documents/samples/sample_combobox.rb +18 -0
- data/lib/wrb/documents/samples/sample_comboboxex.rb +23 -0
- data/lib/wrb/documents/samples/sample_datetimepicker.rb +11 -0
- data/lib/wrb/documents/samples/sample_edit.rb +25 -0
- data/lib/wrb/documents/samples/sample_groupbox.rb +19 -0
- data/lib/wrb/documents/samples/sample_hotkeyctrl.rb +12 -0
- data/lib/wrb/documents/samples/sample_listbox.rb +12 -0
- data/lib/wrb/documents/samples/sample_listview.rb +32 -0
- data/lib/wrb/documents/samples/sample_menu.rb +21 -0
- data/lib/wrb/documents/samples/sample_menubar.rb +23 -0
- data/lib/wrb/documents/samples/sample_monthcalender.rb +11 -0
- data/lib/wrb/documents/samples/sample_progressbar.rb +14 -0
- data/lib/wrb/documents/samples/sample_radiobutton.rb +14 -0
- data/lib/wrb/documents/samples/sample_rebar.rb +25 -0
- data/lib/wrb/documents/samples/sample_richedit.rb +60 -0
- data/lib/wrb/documents/samples/sample_splitter.rb +33 -0
- data/lib/wrb/documents/samples/sample_static.rb +15 -0
- data/lib/wrb/documents/samples/sample_statusbar.rb +17 -0
- data/lib/wrb/documents/samples/sample_tabctrl.rb +19 -0
- data/lib/wrb/documents/samples/sample_toolbar.rb +29 -0
- data/lib/wrb/documents/samples/sample_tooltip.rb +50 -0
- data/lib/wrb/documents/samples/sample_trackbar.rb +30 -0
- data/lib/wrb/documents/samples/sample_treeview.rb +19 -0
- data/lib/wrb/documents/samples/sample_updown.rb +18 -0
- data/lib/wrb/documents/samples/sampleimg16.iml +0 -0
- data/lib/wrb/documents/samples/sampleimg32.iml +0 -0
- data/lib/wrb/documents/samples/samplemg16.png +0 -0
- data/lib/wrb/documents/samples/samplemg32.png +0 -0
- data/lib/wrb/documents/samples/wrb.ico +0 -0
- data/lib/wrb/documents/savefilenamedlg.html +19 -0
- data/lib/wrb/documents/scrollbar.html +60 -0
- data/lib/wrb/documents/splitter.html +96 -0
- data/lib/wrb/documents/static.html +84 -0
- data/lib/wrb/documents/statusbar.html +110 -0
- data/lib/wrb/documents/tabctrl.html +151 -0
- data/lib/wrb/documents/timer.html +43 -0
- data/lib/wrb/documents/toolbar.html +181 -0
- data/lib/wrb/documents/tooltip.html +131 -0
- data/lib/wrb/documents/trackbar.html +107 -0
- data/lib/wrb/documents/treeview.html +210 -0
- data/lib/wrb/documents/updown.html +85 -0
- data/lib/wrb/documents/wincontrol.html +258 -0
- data/lib/wrb/documents/window.html +499 -0
- data/lib/wrb/documents/wrb.css +228 -0
- data/lib/wrb/gmem.rb +26 -0
- data/lib/wrb/imecommon.rb +59 -0
- data/lib/wrb/listcommon.rb +185 -0
- data/lib/wrb/lzss.rb +126 -0
- data/lib/wrb/scrollinfo.rb +142 -0
- data/lib/wrb/toplevelcommon.rb +634 -0
- metadata +315 -0
data/ext/rwin/rwin.c
ADDED
@@ -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
|
+
}
|
data/ext/rwin/rwin.h
ADDED
@@ -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__ */
|