4 #if (DRV_OSNUM == 0x0002)
6 #error "Your OS is not supported."
8 #elif (DRV_OSNUM == 0x0003)
10 #error "Your OS is not supported."
12 #elif (DRV_OSNUM == 0x0001)
15 #define TIMER_INTERVAL 10
21 int tmcount1, tmcount2, flags, smp; /* bit0: 終了 */
26 struct BLD_WORK bld_work;
35 int csiz_x, csiz_y, cx, cy, col0, col1, tabsiz, slctwin;
36 int tmcount, tmcount0, mod, rand_seed;
41 int *kbuf, kbuf_rp, kbuf_wp, kbuf_c;
44 struct BL_WORK bl_work;
46 #define BL_SIZ_KBUF 8192
48 #define BL_WAITKEYF 0x00000001
49 #define BL_WAITKEYNF 0x00000002
50 #define BL_WAITKEY 0x00000003
51 #define BL_GETKEY 0x00000004
52 #define BL_CLEARREP 0x00000008
53 #define BL_DELFFF 0x00000010
55 #define BL_KEYMODE 0x00000000 // 作りかけ, make/remake/breakが見えるかどうか
60 void bld_openWin(int x, int y, char *winClosed);
61 void bld_flshWin(int sx, int sy, int x0, int y0);
62 LRESULT CALLBACK WndProc(HWND hw, unsigned int msg, WPARAM wp, LPARAM lp);
65 void bl_readyWin(int n);
67 static HANDLE threadhandle;
69 void *mallocRWE(int bytes)
71 void *p = malloc(bytes);
73 VirtualProtect(p, bytes, PAGE_EXECUTE_READWRITE, &dmy);
77 static int winthread(void *dmy)
84 x = dw.bmi.bmiHeader.biWidth;
85 y = -dw.bmi.bmiHeader.biHeight;
87 wc.cbSize = sizeof (WNDCLASSEX);
88 wc.style = CS_HREDRAW | CS_VREDRAW;
89 wc.lpfnWndProc = WndProc;
93 wc.hIcon = (HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION),
94 IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED);
95 wc.hIconSm = wc.hIcon;
96 wc.hCursor = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(IDC_ARROW),
97 IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED);
98 wc.hbrBackground = (HBRUSH)COLOR_APPWORKSPACE;
99 wc.lpszMenuName = NULL;
100 wc.lpszClassName = L"WinClass";
101 if (RegisterClassEx(&wc) == 0)
107 AdjustWindowRect(&r, WS_OVERLAPPEDWINDOW, FALSE);
108 x = r.right - r.left;
109 y = r.bottom - r.top;
113 dw.hw = CreateWindowA("WinClass", t, WS_OVERLAPPEDWINDOW,
114 CW_USEDEFAULT, CW_USEDEFAULT, x, y, NULL, NULL, dw.hi, NULL);
117 ShowWindow(dw.hw, SW_SHOW);
119 SetTimer(dw.hw, TIMER_ID, TIMER_INTERVAL, NULL);
120 SetTimer(dw.hw, TIMER_ID + 1, TIMER_INTERVAL * 10, NULL);
121 SetTimer(dw.hw, TIMER_ID + 2, TIMER_INTERVAL * 100, NULL);
125 i = GetMessage(&msg, NULL, 0, 0);
126 if (i == 0 || i == -1) /* エラーもしくは終了メッセージ */
128 /* そのほかはとりあえずデフォルト処理で */
129 TranslateMessage(&msg);
130 DispatchMessage(&msg);
132 // PostQuitMessage(0);
133 dw.flags |= 1; /* 終了, bld_waitNF()が見つける */
134 if (dw.winClosed != NULL)
139 void bld_openWin(int sx, int sy, char *winClosed)
143 dw.bmi.bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
144 dw.bmi.bmiHeader.biWidth = sx;
145 dw.bmi.bmiHeader.biHeight = -sy;
146 dw.bmi.bmiHeader.biPlanes = 1;
147 dw.bmi.bmiHeader.biBitCount = 32;
148 dw.bmi.bmiHeader.biCompression = BI_RGB;
149 dw.winClosed = winClosed;
151 threadhandle = CreateThread(NULL, 0, (void *)&winthread, NULL, 0, (void *)&i);
156 void drv_flshWin(int sx, int sy, int x0, int y0)
158 InvalidateRect(dw.hw, NULL, FALSE);
163 LRESULT CALLBACK WndProc(HWND hw, unsigned int msg, WPARAM wp, LPARAM lp)
166 if (msg == WM_PAINT) {
168 HDC hdc = BeginPaint(dw.hw, &ps);
169 SetDIBitsToDevice(hdc, 0, 0, w.win.xsiz, w.win.ysiz,
170 0, 0, 0, w.win.ysiz, w.win.buf, &dw.bmi, DIB_RGB_COLORS);
171 EndPaint(dw.hw, &ps);
173 if (msg == WM_DESTROY) {
177 if (msg == WM_TIMER && wp == TIMER_ID) {
178 w.tmcount += TIMER_INTERVAL;
181 if (msg == WM_TIMER && wp == TIMER_ID + 1) {
182 dw.tmcount1 += TIMER_INTERVAL * 10;
183 w.tmcount = dw.tmcount1;
186 if (msg == WM_TIMER && wp == TIMER_ID + 2) {
187 dw.tmcount2 += TIMER_INTERVAL * 100;
188 w.tmcount = dw.tmcount1 = dw.tmcount2;
191 if (msg == WM_KEYDOWN || msg == WM_SYSKEYDOWN) {
194 if (wp == VK_RETURN) i = KEY_ENTER;
195 if (wp == VK_ESCAPE) i = KEY_ESC;
196 if (wp == VK_BACK) i = KEY_BACKSPACE;
197 if (wp == VK_TAB) i = KEY_TAB;
198 if (wp == VK_PRIOR) i = KEY_PAGEUP;
199 if (wp == VK_NEXT) i = KEY_PAGEDWN;
200 if (wp == VK_END) i = KEY_END;
201 if (wp == VK_HOME) i = KEY_HOME;
202 if (wp == VK_LEFT) i = KEY_LEFT;
203 if (wp == VK_RIGHT) i = KEY_RIGHT;
204 if (wp == VK_UP) i = KEY_UP;
205 if (wp == VK_DOWN) i = KEY_DOWN;
206 if (wp == VK_INSERT) i = KEY_INS;
207 if (wp == VK_DELETE) i = KEY_DEL;
209 if ((GetKeyState(VK_LCONTROL) & (1 << 15)) != 0) j |= 1 << 17;
210 if ((GetKeyState(VK_LMENU) & (1 << 15)) != 0) j |= 1 << 18;
211 if ((GetKeyState(VK_RCONTROL) & (1 << 15)) != 0) j |= 1 << 25;
212 if ((GetKeyState(VK_RMENU) & (1 << 15)) != 0) j |= 1 << 26;
213 if ((GetKeyState(VK_RSHIFT) & (1 << 15)) != 0) i |= 1 << 24;
214 if ((GetKeyState(VK_LSHIFT) & (1 << 15)) != 0) i |= 1 << 16;
215 if ((GetKeyState(VK_NUMLOCK) & (1 << 0)) != 0) i |= 1 << 22;
216 if ((GetKeyState(VK_CAPITAL) & (1 << 0)) != 0) i |= 1 << 23;
218 if ('A' <= wp && wp <= 'Z') i = wp;
222 // bl_putKeyB(1, &i);
226 if (msg == WM_KEYUP) {
228 // bl_putKeyB(1, &i);
230 if (msg == WM_CHAR) {
232 if (' ' <= wp && wp <= 0x7e) {
235 if ((GetKeyState(VK_LCONTROL) & (1 << 15)) != 0) j |= 1 << 17;
236 if ((GetKeyState(VK_LMENU) & (1 << 15)) != 0) j |= 1 << 18;
237 if ((GetKeyState(VK_RCONTROL) & (1 << 15)) != 0) j |= 1 << 25;
238 if ((GetKeyState(VK_RMENU) & (1 << 15)) != 0) j |= 1 << 26;
239 if ((GetKeyState(VK_RSHIFT) & (1 << 15)) != 0) i |= 1 << 24;
240 if ((GetKeyState(VK_LSHIFT) & (1 << 15)) != 0) i |= 1 << 16;
241 if ((GetKeyState(VK_NUMLOCK) & (1 << 0)) != 0) i |= 1 << 22;
242 if ((GetKeyState(VK_CAPITAL) & (1 << 0)) != 0) i |= 1 << 23;
243 if (('A' <= wp && wp <= 'Z') || ('a' <= wp && wp <= 'z')) {
250 // bl_putKeyB(1, &i);
254 return DefWindowProc(hw, msg, wp, lp);
257 void drv_openWin(int sx, int sy, UCHAR *buf, char *winClosed)
259 w.win.buf = (int *)buf;
262 bld_openWin(sx, sy, winClosed);
266 void drv_sleep(int msec)
269 // MsgWaitForMultipleObjects(1, &threadhandle, FALSE, msec, QS_ALLINPUT);
270 /* 勉強不足でまだ書き方が分かりません! */
276 #error "Illegal OS type. Edit switch.h and look at DRV_OSNUM"