1 /*
2     TiMidity++ -- MIDI to WAVE converter and player
3     Copyright (C) 1999-2018 Masanao Izumo <iz@onicos.co.jp>
4     Copyright (C) 1995 Tuukka Toivonen <tt@cgs.fi>
5 
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10 
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15 
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 
20     w32g_main.c: Written by Daisuke Aoki <dai@y7.net>
21                  Modified by Masanao Izumo <iz@onicos.co.jp>
22 */
23 
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif /* HAVE_CONFIG_H */
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <process.h>
30 #include <stddef.h>
31 #include <windows.h>
32 #undef RC_NONE
33 #include <shlobj.h>
34 // #include <prsht.h>
35 #if defined(__CYGWIN32__) || defined(__MINGW32__)
36 #ifndef HAVE_NEW_MMSYSTEM
37 #include <commdlg.h>
38 #ifndef TPM_TOPALIGN
39 #define TPM_TOPALIGN	0x0000L	/* for old version of cygwin */
40 #endif
41 #define TIME_ONESHOT 0
42 #define TIME_PERIODIC 1
43 int WINAPI timeSetEvent(UINT uDelay, UINT uResolution,
44 			     void *fptc, DWORD dwUser, UINT fuEvent);
45 int WINAPI timeKillEvent(UINT uTimerID);
46 #endif
47 #else
48 #include <commctrl.h>
49 #endif /* __CYGWIN32__ */
50 
51 #include <commctrl.h>
52 #ifndef NO_STRING_H
53 #include <string.h>
54 #else
55 #include <strings.h>
56 #endif
57 #include <shlobj.h>
58 
59 #include <windowsx.h>	/* There is no <windowsx.h> on CYGWIN.
60 			 * Edit_* and ListBox_* are defined in
61 			 * <windowsx.h>
62 			 */
63 #include "timidity.h"
64 #include "common.h"
65 #include "instrum.h"
66 #include "playmidi.h"
67 #include "readmidi.h"
68 #include "output.h"
69 #include "controls.h"
70 
71 #include "wrd.h"
72 
73 #include "w32g.h"
74 #include "w32g_res.h"
75 #include "w32g_utl.h"
76 #include "w32g_ut2.h"
77 #include "w32g_pref.h"
78 #include "w32g_subwin.h"
79 
80 #if defined(__CYGWIN32__) || defined(__MINGW32__)
81 #define WIN32GCC
82 WINAPI void InitCommonControls(void);
83 #endif
84 
85 #if 0
86 #define GDI_LOCK() { \
87 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "GDI_LOCK(%s: %d)", __FILE__, __LINE__ ); \
88 	gdi_lock(); \
89 }
90 #define GDI_UNLOCK() { \
91 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "GDI_UNLOCK(%s: %d)", __FILE__, __LINE__ ); \
92 	gdi_unlock(); \
93 }
94 #else
95 #define GDI_LOCK() { gdi_lock(); }
96 #define GDI_UNLOCK() { gdi_unlock(); }
97 #endif
98 
99 static void InitMainWnd(HWND hStartWnd);
100 
101 static void ConsoleWndVerbosityApplyIncDec(int num);
102 void ConsoleWndVerbosityApply(void);
103 
104 void CanvasPaintAll(void);
105 void CanvasReset(void);
106 void CanvasClear(void);
107 void CanvasUpdate(int flag);
108 void CanvasReadPanelInfo(int flag);
109 void CanvasChange(int mode);
110 void MPanelPaintAll(void);
111 void MPanelReadPanelInfo(int flag);
112 void MPanelReset(void);
113 void MPanelUpdateAll(void);
114 void ClearConsoleWnd(void);
115 void InitListWnd(HWND hParentWnd);
116 void InitTracerWnd(HWND hParentWnd);
117 void InitWrdWnd(HWND hParentWnd);
118 void InitDocWnd(HWND hParentWnd);
119 void InitListSearchWnd(HWND hParentWnd);
120 void PutsDocWnd(char *str);
121 void ClearDocWnd(void);
122 static void DlgPlaylistSave(HWND hwnd);
123 static void DlgPlaylistOpen(HWND hwnd);
124 static void DlgDirOpen(HWND hwnd);
125 static void DlgMidiFileOpen(HWND hwnd);
126 void VprintfEditCtlWnd(HWND hwnd, char *fmt, va_list argList);
127 void PutsEditCtlWnd(HWND hwnd, char *str);
128 void ClearEditCtlWnd(HWND hwnd);
129 
130 int	w32gSaveDefaultPlaylist(void);
131 
132 
133 #ifndef CLR_INVALID
134 #define CLR_INVALID 0xffffffff
135 #endif /* CLR_INVALID */
136 extern int optind;
137 
138 HINSTANCE hInst;
139 static int progress_jump = -1;
140 static HWND hMainWndScrollbarProgressWnd;
141 static HWND hMainWndScrollbarVolumeWnd;
142 #define W32G_VOLUME_MAX 200
143 
144 // HWND
145 HWND hMainWnd = 0;
146 HWND hDebugWnd = 0;
147 HWND hConsoleWnd = 0;
148 HWND hTracerWnd = 0;
149 HWND hDocWnd = 0;
150 HWND hListWnd = 0;
151 HWND hWrdWnd = 0;
152 HWND hSoundSpecWnd = 0;
153 HWND hDebugEditWnd = 0;
154 HWND hDocEditWnd = 0;
155 
156 // Process.
157 HANDLE hProcess = 0;
158 
159 // Main Thread.
160 HANDLE hMainThread = 0;
161 HANDLE hPlayerThread = 0;
162 HANDLE hMainThreadInfo = 0;
163 DWORD dwMainThreadID = 0;
164 static volatile int wait_thread_flag = 1;
165 typedef struct MAINTHREAD_ARGS_ {
166 	int *pArgc;
167 	char ***pArgv;
168 } MAINTHREAD_ARGS;
169 void WINAPI MainThread(void *arglist);
170 
171 // Window Thread
172 HANDLE hWindowThread = 0;
173 HANDLE hWindowThreadInfo = 0;
174 
175 // Thread
176 volatile int ThreadNumMax = 0;
177 
178 // Debug Thread
179 volatile int DebugThreadExit = 1;
180 volatile HANDLE hDebugThread = 0;
181 void DebugThreadInit(void);
182 void PrintfDebugWnd(char *fmt, ...);
183 void ClearDebugWnd(void);
184 void InitDebugWnd(HWND hParentWnd);
185 
186 // Flags
187 int InitMinimizeFlag = 0;
188 int DebugWndStartFlag = 1;
189 int ConsoleWndStartFlag = 0;
190 int ListWndStartFlag = 0;
191 int TracerWndStartFlag = 0;
192 int DocWndStartFlag = 0;
193 int WrdWndStartFlag = 0;
194 
195 int DebugWndFlag = 1;
196 int ConsoleWndFlag = 1;
197 int ListWndFlag = 1;
198 int TracerWndFlag = 0;
199 int DocWndFlag = 1;
200 int WrdWndFlag = 0;
201 int SoundSpecWndFlag = 0;
202 
203 int WrdGraphicFlag;
204 int TraceGraphicFlag;
205 
206 char *IniFile;
207 char *ConfigFile;
208 char *PlaylistFile;
209 char *PlaylistHistoryFile;
210 char *MidiFileOpenDir;
211 char *ConfigFileOpenDir;
212 char *PlaylistFileOpenDir;
213 
214 // Priority
215 int PlayerThreadPriority;
216 int MidiPlayerThreadPriority;
217 int MainThreadPriority;
218 int GUIThreadPriority;
219 int TracerThreadPriority;
220 int WrdThreadPriority;
221 
222 // dir
223 int SeachDirRecursive = 0;	// �ċA�I�f�B���N�g������
224 
225 // Ini File
226 int IniFileAutoSave = 1;	// INI �t�@�C���̎����Z�[�u
227 
228 // misc
229 int DocMaxSize;
230 char *DocFileExt;
231 
232 int AutoloadPlaylist = 0;
233 int AutosavePlaylist = 0;
234 int volatile save_playlist_once_before_exit_flag = 1;
235 
236 static volatile int w32g_wait_for_init;
237 void w32g_send_rc(int rc, ptr_size_t value);
238 int w32g_lock_open_file = 0;
239 
240 void TiMidityHeapCheck(void);
241 
242 volatile DWORD dwWindowThreadID = -1;
w32g_i_init(void)243 void w32g_i_init(void)
244 {
245     ThreadNumMax++;
246     hProcess = GetCurrentProcess();
247     hWindowThread = GetCurrentThread();
248 	dwWindowThreadID = GetCurrentThreadId();
249 
250     InitCommonControls();
251 
252 #ifdef W32GUI_DEBUG
253     DebugThreadInit();
254 #endif
255 }
256 
257 int PlayerLanguage = LANGUAGE_ENGLISH;
258 //int PlayerLanguage = LANGUAGE_JAPANESE;
259 #define PInfoOK 1
SetValue(int32 value,int32 min,int32 max)260 long SetValue(int32 value, int32 min, int32 max)
261 {
262   int32 v = value;
263   if(v < min) v = min;
264   else if( v > max) v = max;
265   return v;
266 }
267 
268 int w32gSecondTiMidity(int opt, int argc, char **argv);
269 int w32gSecondTiMidityExit(void);
270 int SecondMode = 0;
271 void FirstLoadIniFile(void);
272 
273 #ifndef WIN32GCC
274 extern void CmdLineToArgv(LPSTR lpCmdLine, int *argc, CHAR ***argv);
275 extern int win_main(int argc, char **argv); /* timidity.c */
276 int WINAPI
WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)277 WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
278 LPSTR lpCmdLine, int nCmdShow)
279 {
280 	int argc;
281 	CHAR **argv = NULL;
282 	CmdLineToArgv(lpCmdLine,&argc,&argv);
283 #if 0
284 	FirstLoadIniFile();
285 	if(w32gSecondTiMidity(SecondMode,argc,argv)==TRUE){
286 		int res = win_main(argc, argv);
287 		w32gSecondTiMidityExit();
288 		return res;
289 	} else
290 		return -1;
291 #else
292 	wrdt=wrdt_list[0];
293 	return win_main(argc, argv);
294 #endif
295 }
296 #endif /* WIN32GCC */
297 
298 // ***************************************************************************
299 // System Function
300 
KillProcess(UINT IDEvent,UINT uReserved,DWORD dwUser,DWORD dwReserved1,DWORD dwReserved2)301 void CALLBACK KillProcess(UINT IDEvent, UINT uReserved, DWORD dwUser,
302 	DWORD dwReserved1, DWORD dwReserved2)
303 {
304 	exit(0);
305 	//	ExitProcess(0);
306 }
307 
OnExit(void)308 void OnExit(void)
309 {
310 #ifdef W32GUI_DEBUG
311 	PrintfDebugWnd("PostQuitMessage\n");
312 	Sleep(200);
313 #endif
314 	PostQuitMessage(0);
315 }
316 
317 static int OnExitReadyWait = 200;
OnExitReady(void)318 void OnExitReady(void)
319 {
320 	int i;
321 #ifdef W32GUI_DEBUG
322 	PrintfDebugWnd("OnExitReady: Start.\n");
323 #endif
324     w32g_send_rc(RC_STOP, 0);
325 
326 	/* Exit after 10 sec. */
327 
328 	timeSetEvent(10000, 1000, KillProcess, 0, TIME_ONESHOT);
329 
330 	/* Wait really stopping to play */
331 	i = 1000/OnExitReadyWait; /* 1 sec. */
332     while(w32g_play_active && i-- > 0)
333 	{
334 		Sleep(OnExitReadyWait);
335 		VOLATILE_TOUCH(w32g_play_active);
336 	}
337 
338 #ifdef W32GUI_DEBUG
339 	PrintfDebugWnd("OnExitReady: End.\n");
340 #endif
341 }
342 
OnQuit(void)343 void OnQuit(void)
344 {
345 	SendMessage(hMainWnd, WM_CLOSE, 0, 0);
346 }
347 
348 
349 // ***************************************************************************
350 // Start Window
351 // �匳�̃E�B���h�E�̒n�ʂ�Main Window�ɏ���A���ł͂����̏������֐�
352 
InitStartWnd(int nCmdShow)353 void InitStartWnd(int nCmdShow)
354 {
355 	InitMainWnd(NULL);
356 	InitConsoleWnd(hMainWnd);
357 	InitListWnd(hMainWnd);
358 	InitTracerWnd(hMainWnd);
359 	InitDocWnd(hMainWnd);
360 	InitWrdWnd(hMainWnd);
361 	InitSoundSpecWnd(hMainWnd);
362 
363     hMainWndScrollbarProgressWnd = GetDlgItem(hMainWnd, IDC_SCROLLBAR_PROGRESS);
364 	hMainWndScrollbarVolumeWnd = GetDlgItem(hMainWnd, IDC_SCROLLBAR_VOLUME);
365 	EnableScrollBar(hMainWndScrollbarVolumeWnd, SB_CTL,ESB_ENABLE_BOTH);
366 	SetScrollRange(hMainWndScrollbarVolumeWnd, SB_CTL,
367 		       0, W32G_VOLUME_MAX, TRUE);
368 	SetScrollPos(hMainWndScrollbarVolumeWnd, SB_CTL,
369 		     W32G_VOLUME_MAX - amplification, TRUE);
370 }
371 
372 /*****************************************************************************/
373 // Main Window
374 
375 #define SWS_EXIST		0x0001
376 #define SWS_ICON		0x0002
377 #define SWS_HIDE		0x0004
378 typedef struct SUBWINDOW_ {
379 	HWND *hwnd;
380 	int status;
381 }	SUBWINDOW;
382 SUBWINDOW subwindow[] =
383 {
384   {&hConsoleWnd,0},
385   {&hListWnd,0},
386   {&hTracerWnd,0},
387   {&hDocWnd,0},
388   {&hWrdWnd,0},
389   {&hSoundSpecWnd,0},
390   {NULL,0}
391 };
392 
393 int SubWindowMax = 5;
394 SUBWINDOW SubWindowHistory[] =
395 {
396   {&hConsoleWnd,0},
397   {&hListWnd,0},
398   {&hTracerWnd,0},
399   {&hDocWnd,0},
400   {&hWrdWnd,0},
401   {&hSoundSpecWnd,0},
402   {NULL,0}
403 };
404 
405 MAINWNDINFO MainWndInfo;
406 
407 BOOL CALLBACK MainProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam);
408 
409 void update_subwindow(void);
410 void OnShow(void);
411 void OnHide(void);
412 
413 static int MainWndInfoReset(HWND hwnd);
414 static int MainWndInfoApply(void);
415 
416 extern void reload_cfg(void);
417 // OUTPUT MENU
418 #define IDM_OUTPUT 0x4000
419 static HMENU outputMenu;
420 
InitOutputMenu(HWND hWnd)421 static void InitOutputMenu(HWND hWnd)
422 {
423 	HMENU hMenu;
424 	MENUITEMINFO mii;
425 	int i;
426 
427 	hMenu = GetMenu(hWnd);
428 	if (outputMenu != NULL)	{DestroyMenu (outputMenu);}
429 	outputMenu = CreateMenu();
430 
431 	mii.cbSize = sizeof (MENUITEMINFO);
432 	mii.fMask = MIIM_TYPE | MIIM_SUBMENU;
433 	mii.fType = MFT_STRING;
434 	mii.hSubMenu = outputMenu;
435 	if (PlayerLanguage == LANGUAGE_JAPANESE) {
436 		mii.dwTypeData = TEXT("�o��(&O)");
437 	} else {
438 		mii.dwTypeData = TEXT("Output(&O)");
439 	}
440 	InsertMenuItem(hMenu, GetMenuItemCount(hMenu) - 1, TRUE, &mii);
441 
442 	for (i = 0; play_mode_list[i] != 0; i++) {
443 		mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
444 		mii.wID = IDM_OUTPUT + i;
445 		mii.fType = MFT_STRING;
446 		if (st_temp->opt_playmode[0] == play_mode_list[i]->id_character) {
447 			mii.fState = MFS_CHECKED;
448 		} else {
449 			mii.fState = MFS_UNCHECKED;
450 		}
451 		mii.dwTypeData = play_mode_list[i]->id_name;
452 		InsertMenuItem(outputMenu, i, TRUE, &mii);
453 	}
454 
455 	SetMenu(hWnd , hMenu);
456 }
457 
UpdateOutputMenu(HWND hWnd,UINT wId)458 static void UpdateOutputMenu(HWND hWnd, UINT wId)
459 {
460 	MENUITEMINFO mii;
461 	int i, num = -1, oldnum;
462 
463 	for (i = 0; play_mode_list[i] != 0; i++) {
464 		mii.cbSize = sizeof (MENUITEMINFO);
465 		mii.fMask = MIIM_STATE | MIIM_ID;
466 		GetMenuItemInfo(outputMenu, i, TRUE, &mii);
467 		if (wId == mii.wID) {
468 			mii.fState = MFS_CHECKED;
469 			num = i;
470 		} else {mii.fState = MFS_UNCHECKED;}
471 		SetMenuItemInfo(outputMenu, i, TRUE, &mii);
472 		if (st_temp->opt_playmode[0] == play_mode_list[i]->id_character) {
473 			oldnum = i;
474 		}
475 	}
476 	if (!w32g_play_active && num != oldnum) {
477 		if (num >= 0) {st_temp->opt_playmode[0] = play_mode_list[num]->id_character;}
478 		else {st_temp->opt_playmode[0] = 'd';}
479 		PrefSettingApplyReally();
480 	}
481 }
482 
InitMainWnd(HWND hParentWnd)483 static void InitMainWnd(HWND hParentWnd)
484 {
485 	HICON hIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON_TIMIDITY), IMAGE_ICON, 16, 16, 0);
486 	if ( hMainWnd != NULL ) {
487 		DestroyWindow ( hMainWnd );
488 		hMainWnd = NULL;
489 	}
490 	INILoadMainWnd();
491 	if (PlayerLanguage == LANGUAGE_JAPANESE)
492 	  hMainWnd = CreateDialog(hInst,MAKEINTRESOURCE(IDD_DIALOG_MAIN),hParentWnd,MainProc);
493 	else
494 	  hMainWnd = CreateDialog(hInst,MAKEINTRESOURCE(IDD_DIALOG_MAIN_EN),hParentWnd,MainProc);
495 	InitOutputMenu(hMainWnd);
496 
497 	if (hIcon!=NULL) SendMessage(hMainWnd,WM_SETICON,FALSE,(LPARAM)hIcon);
498 	{  // Set the title of the main window again.
499    	char buffer[256];
500    	SendMessage( hMainWnd, WM_GETTEXT, (WPARAM)255, (LPARAM)buffer);
501    	SendMessage( hMainWnd, WM_SETTEXT, (WPARAM)0, (LPARAM)buffer);
502 	}
503 	MainWndInfoApply();
504 }
505 
MainWndInfoReset(HWND hwnd)506 static int MainWndInfoReset(HWND hwnd)
507 {
508 	memset(&MainWndInfo,0,sizeof(MAINWNDINFO));
509 	MainWndInfo.PosX = - 1;
510 	MainWndInfo.PosY = - 1;
511 	return 0;
512 }
513 
MainWndInfoApply(void)514 static int MainWndInfoApply(void)
515 {
516 	return 0;
517 }
518 
519 void MainCmdProc(HWND hwnd, int wId, HWND hwndCtl, UINT wNotifyCode);
520 
521 void MainWndSetPauseButton(int flag);
522 void MainWndSetPlayButton(int flag);
523 
524 void MainWndToggleConsoleButton(void);
525 void MainWndUpdateConsoleButton(void);
526 void MainWndToggleTracerButton(void);
527 void MainWndUpdateTracerButton(void);
528 void MainWndToggleListButton(void);
529 void MainWndUpdateListButton(void);
530 void MainWndToggleDocButton(void);
531 void MainWndUpdateDocButton(void);
532 void MainWndToggleWrdButton(void);
533 void MainWndUpdateWrdButton(void);
534 void MainWndToggleSoundSpecButton(void);
535 void MainWndUpdateSoundSpecButton(void);
536 
537 void ShowSubWindow(HWND hwnd,int showflag);
538 void ToggleSubWindow(HWND hwnd);
539 
540 static void VersionWnd(HWND hParentWnd);
541 static void TiMidityWnd(HWND hParentWnd);
542 static void SupplementWnd(HWND hParentWnd);
543 
544 static void InitCanvasWnd(HWND hwnd);
545 static void CanvasInit(HWND hwnd);
546 static void InitPanelWnd(HWND hwnd);
547 static void MPanelInit(HWND hwnd);
548 
549 static void InitMainToolbar(HWND hwnd);
550 static void InitSubWndToolbar(HWND hwnd);
551 
552 static UINT PlayerForwardAndBackwardEventID = 0;
PlayerForward(UINT IDEvent,UINT uReserved,DWORD dwUser,DWORD dwReserved1,DWORD dwReserved2)553 static void CALLBACK PlayerForward(UINT IDEvent, UINT uReserved, DWORD dwUser,
554 	DWORD dwReserved1, DWORD dwReserved2)
555 {
556 	w32g_send_rc(RC_FORWARD, play_mode->rate);
557 }
558 
PlayerBackward(UINT IDEvent,UINT uReserved,DWORD dwUser,DWORD dwReserved1,DWORD dwReserved2)559 static void CALLBACK PlayerBackward(UINT IDEvent, UINT uReserved, DWORD dwUser,
560 	DWORD dwReserved1, DWORD dwReserved2)
561 {
562 	w32g_send_rc(RC_BACK, play_mode->rate);
563 }
564 
565 extern void ShowPrefWnd ( void );
566 extern void HidePrefWnd ( void );
567 extern BOOL IsVisiblePrefWnd ( void );
568 
569 BOOL CALLBACK
MainProc(HWND hwnd,UINT uMess,WPARAM wParam,LPARAM lParam)570 MainProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam)
571 {
572 	static BOOL PrefWndShow;
573 	// PrintfDebugWnd("MainProc: Mess%lx WPARAM%lx LPARAM%lx\n",uMess,wParam,lParam);
574 	switch (uMess)
575 	{
576       case WM_INITDIALOG:
577 		PrefWndShow = FALSE;
578 		update_subwindow();
579 		MainWndUpdateConsoleButton();
580 		MainWndUpdateTracerButton();
581 		MainWndUpdateListButton();
582 		MainWndUpdateDocButton();
583 		MainWndUpdateWrdButton();
584 		MainWndUpdateSoundSpecButton();
585 		InitPanelWnd(hwnd);
586 		InitCanvasWnd(hwnd);
587 		InitMainToolbar(hwnd);
588 		InitSubWndToolbar(hwnd);
589 	    {
590 			HMENU hMenu = GetSystemMenu(hwnd, FALSE);
591 #if 1
592 			RemoveMenu(hMenu,SC_MAXIMIZE,MF_BYCOMMAND);
593 			RemoveMenu(hMenu,SC_SIZE,MF_BYCOMMAND);
594 #else
595 			EnableMenuItem(hMenu, SC_MAXIMIZE, MF_BYCOMMAND	| MF_GRAYED);
596 			EnableMenuItem(hMenu, SC_SIZE, MF_BYCOMMAND | MF_GRAYED);
597 #endif
598 			EnableMenuItem(hMenu, SC_MOVE, MF_BYCOMMAND | MF_GRAYED);
599 			InsertMenu(hMenu, 0, MF_BYPOSITION | MF_SEPARATOR, 0, 0);
600 			InsertMenu(hMenu, 0, MF_BYPOSITION, SC_SCREENSAVE, "Screen Saver");
601 			InsertMenu(hMenu, 0, MF_BYPOSITION | MF_SEPARATOR, 0, 0);
602 			InsertMenu(hMenu, 0, MF_BYPOSITION | MF_STRING, IDM_STOP, "Stop");
603 			InsertMenu(hMenu, 0, MF_BYPOSITION | MF_STRING, IDM_PAUSE, "Pause");
604 			InsertMenu(hMenu, 0, MF_BYPOSITION | MF_STRING, IDM_PREV, "Prev");
605 			InsertMenu(hMenu, 0, MF_BYPOSITION | MF_STRING, IDM_NEXT, "Next");
606 			InsertMenu(hMenu, 0, MF_BYPOSITION | MF_STRING, IDM_PLAY, "Play");
607 			DrawMenuBar(hwnd);
608     	}
609 			{
610 				RECT d_rc, w_rc;
611 				GetClientRect ( GetDesktopWindow (), &d_rc );
612 				GetWindowRect ( hwnd, &w_rc );
613 				d_rc.right -= w_rc.right - w_rc.left;
614 				d_rc.bottom -= w_rc.bottom - w_rc.top;
615 				if ( MainWndInfo.PosX < d_rc.left ) MainWndInfo.PosX = d_rc.left;
616 				if ( MainWndInfo.PosX > d_rc.right ) MainWndInfo.PosX = d_rc.right;
617 				if ( MainWndInfo.PosY < d_rc.top ) MainWndInfo.PosY = d_rc.top;
618 				if ( MainWndInfo.PosY > d_rc.bottom ) MainWndInfo.PosY = d_rc.bottom;
619 				SetWindowPosSize(GetDesktopWindow(),hwnd,MainWndInfo.PosX, MainWndInfo.PosY );
620 			}
621 		return FALSE;
622 	  HANDLE_MSG(hwnd,WM_COMMAND,MainCmdProc);
623 
624 	  case WM_DESTROY:
625 		if(save_playlist_once_before_exit_flag) {
626 			save_playlist_once_before_exit_flag = 0;
627 			w32gSaveDefaultPlaylist();
628 		}
629 		INISaveMainWnd();
630 		PostQuitMessage(0);
631 		break;
632 	  case WM_CLOSE:
633 		if(save_playlist_once_before_exit_flag) {
634 			save_playlist_once_before_exit_flag = 0;
635 			w32gSaveDefaultPlaylist();
636 		}
637 		DestroyWindow(hwnd);
638 		break;
639 
640       case WM_SIZE:
641 		if(wParam == SIZE_MINIMIZED){
642 			if ( IsVisiblePrefWnd () )
643 				PrefWndShow = TRUE;
644 			else
645 				PrefWndShow = FALSE;
646 			HidePrefWnd ();
647 			update_subwindow();
648 			OnHide();
649 		} else if ( wParam == SIZE_RESTORED ) {
650 			if ( PrefWndShow ) {
651 				ShowPrefWnd ();
652 			}
653 		}
654 		return FALSE;
655 	  case WM_MOVE:
656 		if ( ! IsIconic(hwnd) ) {
657 			RECT rc;
658 			GetWindowRect(hwnd,&rc);
659 			MainWndInfo.PosX = rc.left;
660 			MainWndInfo.PosY = rc.top;
661 		}
662 		break;
663       case WM_QUERYOPEN:
664 		OnShow();
665 		return FALSE;
666       case WM_DROPFILES:
667 		w32g_send_rc(RC_EXT_DROP, (ptr_size_t)wParam);
668 		return FALSE;
669       case WM_HSCROLL: {
670 		  int nScrollCode = (int)LOWORD(wParam);
671 		  int nPos = (int) HIWORD(wParam);
672 		  HWND bar = (HWND)lParam;
673 
674 		  if(bar != hMainWndScrollbarProgressWnd)
675 			  break;
676 
677 		  switch(nScrollCode)
678 		  {
679 			case SB_THUMBTRACK:
680 			case SB_THUMBPOSITION:
681 			  progress_jump = nPos;
682 			  break;
683 			case SB_LINELEFT:
684 			  progress_jump = GetScrollPos(bar, SB_CTL) - 1;
685 			  if(progress_jump < 0)
686 				  progress_jump = 0;
687 			  break;
688 			case SB_PAGELEFT:
689 			  progress_jump = GetScrollPos(bar, SB_CTL) - 10;
690 			  if(progress_jump < 0)
691 				  progress_jump = 0;
692 			  break;
693 			case SB_LINERIGHT:
694 			  progress_jump = GetScrollPos(bar, SB_CTL) + 1;
695 			  break;
696 			case SB_PAGERIGHT:
697 			  progress_jump = GetScrollPos(bar, SB_CTL) + 10;
698 			  break;
699 			case SB_ENDSCROLL:
700 			  if(progress_jump != -1)
701 			  {
702 				  w32g_send_rc(RC_JUMP, progress_jump * play_mode->rate);
703 				  SetScrollPos(hMainWndScrollbarProgressWnd, SB_CTL,
704 							   progress_jump, TRUE);
705 				  progress_jump = -1;
706 			  }
707 			  break;
708 		  }
709 		  break;
710 		}
711 	  break;
712 
713 	  case WM_VSCROLL: {
714 		int nScrollCode = (int) LOWORD(wParam);
715 		int nPos = (int) HIWORD(wParam);
716 		HWND bar = (HWND) lParam;
717 		static int pos = -1;
718 
719 		if(bar != hMainWndScrollbarVolumeWnd)
720 			break;
721 
722 		switch(nScrollCode)
723 		{
724 		  case SB_THUMBTRACK:
725 		  case SB_THUMBPOSITION:
726 			pos = nPos;
727 			break;
728 		  case SB_LINEUP:
729 		  case SB_PAGEUP:
730 			pos = GetScrollPos(bar, SB_CTL) - 5;
731 			if(pos < 0)
732 				pos = 0;
733 			break;
734 		  case SB_LINEDOWN:
735 		  case SB_PAGEDOWN:
736 			pos = GetScrollPos(bar, SB_CTL) + 5;
737 			if(pos > W32G_VOLUME_MAX)
738 				pos = W32G_VOLUME_MAX;
739 			break;
740 		  case SB_ENDSCROLL:
741 			if(pos != -1)
742 			{
743 				w32g_send_rc(RC_CHANGE_VOLUME,
744 							 (W32G_VOLUME_MAX - pos) - amplification);
745 				SetScrollPos(bar, SB_CTL, pos, TRUE);
746 				pos = -1;
747 			}
748 			break;
749 		}
750 	  }
751 	  break;
752 
753 	  case WM_SYSCOMMAND:
754 		switch(wParam){
755 		  case IDM_STOP:
756 		  case IDM_PAUSE:
757 		  case IDM_PREV:
758 		  case IDM_PLAY:
759 		  case IDM_NEXT:
760 		  case IDM_FOREWARD:
761 		  case IDM_BACKWARD:
762 			SendMessage(hwnd,WM_COMMAND,wParam,(LPARAM)NULL);
763 			break;
764 		  default:
765 			break;
766 		}
767 		return FALSE;
768       case WM_NOTIFY:
769 		switch(wParam) {
770 		  case IDC_TOOLBARWINDOW_MAIN:{
771 			  LPTBNOTIFY TbNotify = (LPTBNOTIFY)lParam;
772 			  switch(TbNotify->iItem){
773 				case IDM_BACKWARD:
774 				  if(TbNotify->hdr.code==TBN_BEGINDRAG){
775 #ifdef W32GUI_DEBUG
776 					  //PrintfDebugWnd("IDM_BACKWARD: BUTTON ON\n");
777 #endif
778 					  PlayerBackward(0,0,0,0,0);
779 					  PlayerForwardAndBackwardEventID =
780 						  timeSetEvent(100, 100, PlayerBackward, 0, TIME_PERIODIC);
781 				  }
782 				  if(PlayerForwardAndBackwardEventID != 0)
783 					  if(TbNotify->hdr.code==TBN_ENDDRAG){
784 #ifdef W32GUI_DEBUG
785 						  //PrintfDebugWnd("IDM_BACKWARD: BUTTON OFF\n");
786 #endif
787 						  timeKillEvent(PlayerForwardAndBackwardEventID);
788 						  PlayerForwardAndBackwardEventID = 0;
789 					  }
790 				  break;
791 				case IDM_FOREWARD:
792 				  if(TbNotify->hdr.code ==TBN_BEGINDRAG &&
793 					 PlayerForwardAndBackwardEventID == 0){
794 #ifdef W32GUI_DEBUG
795 					  //PrintfDebugWnd("IDM_FOREWARD: BUTTON ON\n");
796 #endif
797 					  PlayerForward(0,0,0,0,0);
798 					  PlayerForwardAndBackwardEventID =
799 						  timeSetEvent(100,300,PlayerForward,0,TIME_PERIODIC);
800 				  }
801 				  else if((TbNotify->hdr.code == TBN_ENDDRAG ||
802 						   TbNotify->hdr.code == NM_CLICK ||
803 						   TbNotify->hdr.code == NM_RCLICK) &&
804 						  PlayerForwardAndBackwardEventID != 0)
805 				  {
806 #ifdef W32GUI_DEBUG
807 					  //PrintfDebugWnd("IDM_FOREWARD: BUTTON OFF\n");
808 #endif
809 					  timeKillEvent(PlayerForwardAndBackwardEventID);
810 					  PlayerForwardAndBackwardEventID = 0;
811 				  }
812 				  break;
813 				default:
814 				  break;
815 			  }
816 		    }
817 			break; /* end of case IDC_TOOLBARWINDOW_MAIN */
818 		  default:
819 			break;
820 		}
821 		return FALSE;
822 	case WM_SHOWWINDOW:
823 	{
824 		BOOL fShow = (BOOL)wParam;
825 		if ( fShow ) {
826 			if ( PrefWndShow ) {
827 				ShowPrefWnd ();
828 			} else {
829 				HidePrefWnd ();
830 			}
831 		} else {
832 			if ( IsVisiblePrefWnd () )
833 				PrefWndShow = TRUE;
834 			else
835 				PrefWndShow = FALSE;
836 			HidePrefWnd ();
837 		}
838 		break;
839 	}
840 		break;
841       default:
842 		if (uMess == RegisterWindowMessage("TaskbarCreated")) {
843 			ShowWindow(hMainWnd, SW_HIDE);
844 			ShowWindow(hMainWnd, SW_SHOWNOACTIVATE);
845 			return 0;
846 		}
847 		return FALSE;
848     }
849 	return FALSE;
850 }
851 
MainCmdProc(HWND hwnd,int wId,HWND hwndCtl,UINT wNotifyCode)852 void MainCmdProc(HWND hwnd, int wId, HWND hwndCtl, UINT wNotifyCode)
853 {
854 	 // PrintfDebugWnd("WM_COMMAND: ID%lx HWND%lx CODE%lx\n",wId,hwndCtl,wNotifyCode);
855     switch(wId)
856     {
857       case IDM_STOP:
858 		  w32g_send_rc(RC_STOP, 0);
859 		  break;
860       case IDM_PAUSE:
861 		  SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_MAIN,
862 									TB_CHECKBUTTON, IDM_PAUSE,
863 									(LPARAM)MAKELONG(!play_pause_flag, 0));
864 		  w32g_send_rc(RC_TOGGLE_PAUSE, 0);
865 		  break;
866       case IDM_PREV:
867 		  w32g_send_rc(RC_REALLY_PREVIOUS, 0);
868 		  break;
869       case IDM_BACKWARD:
870 		  /* Do nothing here. See WM_NOTIFY in MainProc() */
871 		  break;
872       case IDM_PLAY:
873 		  if(play_pause_flag)
874 		  {
875 				SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_MAIN,
876 										 TB_CHECKBUTTON, IDM_PAUSE,
877 										 (LPARAM)MAKELONG(FALSE, 0));
878 				w32g_send_rc(RC_TOGGLE_PAUSE, 0);
879 		  }
880 		  if(!w32g_play_active)
881 				w32g_send_rc(RC_LOAD_FILE, 0);
882 		  break;
883       case IDM_FOREWARD:
884 		  /* Do nothing here. See WM_NOTIFY in MainProc() */
885 		  break;
886       case IDM_NEXT:
887 		  w32g_send_rc(RC_NEXT, 0);
888 		  break;
889       case IDM_CONSOLE:
890       case IDM_MWCONSOLE:
891 		  ToggleSubWindow(hConsoleWnd);
892 		  break;
893       case IDM_TRACER:
894       case IDM_MWTRACER:
895 		  ToggleSubWindow(hTracerWnd);
896 //		  MainWndUpdateTracerButton();
897 //		  MessageBox(hwnd, "Not Supported.","Warning!",MB_OK);
898 		  break;
899       case IDM_LIST:
900       case IDM_MWPLAYLIST:
901 		  ToggleSubWindow(hListWnd);
902 		  if(IsWindowVisible(hListWnd))
903 			w32g_send_rc(RC_EXT_UPDATE_PLAYLIST, 0);
904 		  break;
905       case IDM_DOC:
906       case IDM_MWDOCUMENT:
907 		  ToggleSubWindow(hDocWnd);
908 //		  if(IsWindowVisible(hDocWnd))
909 //			  w32g_send_rc(RC_EXT_DOC, 0);
910 		  break;
911       case IDM_WRD:
912       case IDM_MWWRDTRACER:
913 		  ToggleSubWindow(hWrdWnd);
914 //		  MainWndUpdateWrdButton();
915 //		  MessageBox(hwnd, "Not Supported.","Warning!",MB_OK);
916 		  break;
917       case IDM_SOUNDSPEC:
918       case IDM_MWSOUNDSPEC:
919 		  MainWndUpdateSoundSpecButton();
920 		  MessageBox(hwnd, "Not Supported.","Warning!",MB_OK);
921 		  break;
922       case IDOK:
923 		  break;
924       case IDCANCEL:
925 		  OnQuit();
926 		  break;
927       case IDM_MFOPENFILE:
928 		  DlgMidiFileOpen(hwnd);
929 		  break;
930       case IDM_MFOPENDIR:
931 		  DlgDirOpen(hwnd);
932 		  break;
933       case IDM_MFLOADPLAYLIST:
934 		  DlgPlaylistOpen(hwnd);
935 		  break;
936       case IDM_MFSAVEPLAYLISTAS:
937 		  DlgPlaylistSave(hwnd);
938 		  break;
939       case IDM_MFEXIT:
940 		  OnQuit();
941 		  break;
942 
943       case IDM_SETTING:
944 		  PrefWndCreate(hMainWnd);
945 		  break;
946 
947       case IDM_MCSAVEINIFILE:
948 		  VOLATILE_TOUCH(PrefWndDoing);
949 		  if(PrefWndDoing){
950 				MessageBox(hMainWnd, "Can't Save Ini file while preference dialog.",
951 							  "Warning", MB_OK);
952 				break;
953 		  }
954 		  SaveIniFile(sp_current, st_current);
955 		  break;
956       case IDM_MCLOADINIFILE:
957 		 if(!w32g_has_ini_file) {
958 		     MessageBox(hMainWnd, "Can't load Ini file.",
959 				"Warning", MB_OK);
960 		     break;
961 		 }
962 
963 		  VOLATILE_TOUCH(PrefWndDoing);
964 		  if(PrefWndDoing){
965 				MessageBox(hMainWnd, "Can't load Ini file while preference dialog.",
966 							  "Warning", MB_OK);
967 				break;
968 		  }
969 		  LoadIniFile(sp_temp,st_temp);
970 		  PrefWndCreate(hMainWnd);
971 		  break;
972       case IDM_MWDEBUG:
973 #ifdef W32GUI_DEBUG
974 		  if(IsWindowVisible(hDebugWnd))
975 				ShowWindow(hDebugWnd,SW_HIDE);
976 		  else
977 				ShowWindow(hDebugWnd,SW_SHOW);
978 #endif
979 		  break;
980       case IDM_MHTOPIC:
981 		  MessageBox(hwnd, "Not Supported.","Warning!",MB_OK);
982 		  break;
983       case IDM_MHHELP:
984 		  MessageBox(hwnd, "Not Supported.","Warning!",MB_OK);
985 		  break;
986       case IDM_MHONLINEHELP:
987 		  if (PlayerLanguage == LANGUAGE_JAPANESE) {
988 			  ShellExecute(HWND_DESKTOP, NULL, "http://timidity-docs.sourceforge.jp/", NULL, NULL, SW_SHOWNORMAL);
989 		  } else {
990 			  ShellExecute(HWND_DESKTOP, NULL, "http://timidity.sourceforge.net/index.html.en", NULL, NULL, SW_SHOWNORMAL);
991 		  }
992 		  break;
993       case IDM_MHBTS:
994 		  if (PlayerLanguage == LANGUAGE_JAPANESE) {
995 			  ShellExecute(HWND_DESKTOP, NULL, "http://timidity-docs.sourceforge.jp/cgi-bin/kagemai-ja/guest.cgi", NULL, NULL, SW_SHOWNORMAL);
996 		  } else {
997 			  ShellExecute(HWND_DESKTOP, NULL, "http://timidity-docs.sourceforge.jp/cgi-bin/kagemai-en/guest.cgi", NULL, NULL, SW_SHOWNORMAL);
998 		  }
999 		  break;
1000       case IDM_MHONLINEHELPCFG:
1001 		  ShellExecute(HWND_DESKTOP, NULL, "http://timidity-docs.sourceforge.jp/cgi-bin/hiki/hiki.cgi?%28ja%29timidity.cfg", NULL, NULL, SW_SHOWNORMAL);
1002 		  break;
1003       case IDM_MHVERSION:
1004 		  VersionWnd(hwnd);
1005 		  break;
1006       case IDM_MHTIMIDITY:
1007 		  TiMidityWnd(hwnd);
1008 		  break;
1009       case IDM_FORCE_RELOAD:
1010 		  if (!w32g_play_active) {reload_cfg();}
1011 		  break;
1012       case IDM_MHSUPPLEMENT:
1013 		  SupplementWnd(hwnd);
1014 		  break;
1015 	  default:
1016 		  UpdateOutputMenu(hwnd, wId);
1017 		  break;
1018     }
1019 }
1020 
1021 
1022 
update_subwindow(void)1023 void update_subwindow(void)
1024 {
1025   SUBWINDOW *s = subwindow;
1026   int i;
1027   for(i=0;s[i].hwnd!=NULL;i++){
1028 		if(IsWindow(*(s[i].hwnd)))
1029   		s[i].status |= SWS_EXIST;
1030 		else {
1031   		s[i].status = 0;
1032     	continue;
1033     }
1034 		if(IsIconic(*(s[i].hwnd)))
1035   		s[i].status |= SWS_ICON;
1036 		else
1037   		s[i].status &= ~ SWS_ICON;
1038 		if(IsWindowVisible(*(s[i].hwnd)))
1039   		s[i].status &= ~ SWS_HIDE;
1040 		else
1041   		s[i].status |= SWS_HIDE;
1042 	}
1043 }
1044 
MainWndSetPauseButton(int flag)1045 void MainWndSetPauseButton(int flag)
1046 {
1047 	if(flag)
1048   	SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_MAIN,
1049     	TB_CHECKBUTTON, IDM_PAUSE, (LPARAM)MAKELONG(TRUE, 0));
1050 	else
1051   	SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_MAIN,
1052     	TB_CHECKBUTTON, IDM_PAUSE, (LPARAM)MAKELONG(FALSE, 0));
1053 }
1054 
MainWndSetPlayButton(int flag)1055 void MainWndSetPlayButton(int flag)
1056 {
1057 	return;
1058 }
1059 
MainWndUpdateConsoleButton(void)1060 void MainWndUpdateConsoleButton(void)
1061 {
1062 	if(IsWindowVisible(hConsoleWnd))
1063   	SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND,
1064     	TB_CHECKBUTTON, IDM_CONSOLE, (LPARAM)MAKELONG(TRUE, 0));
1065 	else
1066   	SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND,
1067     	TB_CHECKBUTTON, IDM_CONSOLE, (LPARAM)MAKELONG(FALSE, 0));
1068 }
1069 
MainWndUpdateListButton(void)1070 void MainWndUpdateListButton(void)
1071 {
1072 	if(IsWindowVisible(hListWnd))
1073   	SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND,
1074     	TB_CHECKBUTTON, IDM_LIST, (LPARAM)MAKELONG(TRUE, 0));
1075 	else
1076   	SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND,
1077     	TB_CHECKBUTTON, IDM_LIST, (LPARAM)MAKELONG(FALSE, 0));
1078 }
1079 
MainWndUpdateDocButton(void)1080 void MainWndUpdateDocButton(void)
1081 {
1082 	if(IsWindowVisible(hDocWnd))
1083   	SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND,
1084     	TB_CHECKBUTTON, IDM_DOC, (LPARAM)MAKELONG(TRUE, 0));
1085 	else
1086   	SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND,
1087     	TB_CHECKBUTTON, IDM_DOC, (LPARAM)MAKELONG(FALSE, 0));
1088 }
1089 
MainWndUpdateTracerButton(void)1090 void MainWndUpdateTracerButton(void)
1091 {
1092 	if(IsWindowVisible(hTracerWnd))
1093 		SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND,
1094 			TB_CHECKBUTTON, IDM_TRACER,
1095 			(LPARAM)MAKELONG(TRUE, 0));
1096    else
1097   		SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND,
1098 			TB_CHECKBUTTON, IDM_TRACER,
1099 			(LPARAM)MAKELONG(FALSE, 0));
1100 }
1101 
MainWndUpdateWrdButton(void)1102 void MainWndUpdateWrdButton(void)
1103 {
1104 	if(IsWindowVisible(hWrdWnd))
1105   	SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND,
1106     	TB_CHECKBUTTON, IDM_WRD, (LPARAM)MAKELONG(TRUE, 0));
1107 	else
1108   	SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND,
1109     	TB_CHECKBUTTON, IDM_WRD, (LPARAM)MAKELONG(FALSE, 0));
1110 }
1111 
MainWndUpdateSoundSpecButton(void)1112 void MainWndUpdateSoundSpecButton(void)
1113 {
1114 }
1115 
1116 #undef SUBWINDOW_POS_IS_OLD_CLOSED_WINDOW
ShowSubWindow(HWND hwnd,int showflag)1117 void ShowSubWindow(HWND hwnd,int showflag)
1118 {
1119 	int i, num;
1120 	RECT rc;
1121 #ifdef SUBWINDOW_POS_IS_OLD_CLOSED_WINDOW
1122 	RECT rc2;
1123 #endif
1124 	int max = 0;
1125 	if(showflag){
1126 		if(IsWindowVisible(hwnd))
1127   		return;
1128 		for(i=0;SubWindowHistory[i].hwnd!=NULL;i++)
1129   		if(*(SubWindowHistory[i].hwnd)==hwnd)
1130       	num = i;
1131 		for(i=0;SubWindowHistory[i].hwnd!=NULL;i++)
1132   		if(*(SubWindowHistory[i].hwnd)!=hwnd){
1133 	  		if(SubWindowHistory[i].status > 0)
1134 					SubWindowHistory[i].status += 1;
1135 	  		if(SubWindowHistory[i].status>SubWindowMax){
1136 					if(SubWindowHistory[i].status>max){
1137     				GetWindowRect(*(SubWindowHistory[i].hwnd), &rc);
1138 						max = SubWindowHistory[i].status;
1139 					}
1140       		ShowWindow(*(SubWindowHistory[i].hwnd),SW_HIDE);
1141 					SubWindowHistory[i].status = 0;
1142 				}
1143 			}
1144 #ifdef SUBWINDOW_POS_IS_OLD_CLOSED_WINDOW
1145 		// �T�u�E�C���h�E���ő吔���z���ĕ‚�����Â��E�C���h�E�ɍ��킹��d�l�͎~�߂邱�Ƃɂ����B
1146 		if(max>0){
1147 			GetWindowRect(hwnd, &rc2);
1148 			MoveWindow(hwnd,rc.left,rc.top,rc2.right-rc2.left,rc2.bottom-rc2.top,TRUE);
1149 		}
1150 #endif
1151 		ShowWindow(hwnd,SW_SHOW);
1152 		SubWindowHistory[num].status = 1;
1153 	} else {
1154 		if(!IsWindowVisible(hwnd))
1155   		return;
1156 		for(i=0;SubWindowHistory[i].hwnd!=NULL;i++)
1157   		if(*(SubWindowHistory[i].hwnd)==hwnd)
1158       	num = i;
1159 		for(i=0;SubWindowHistory[i].hwnd!=NULL;i++)
1160     	if(i!=num)
1161 	  		if(SubWindowHistory[i].status>=SubWindowHistory[num].status)
1162 					SubWindowHistory[i].status -= 1;
1163     ShowWindow(hwnd,SW_HIDE);
1164 		SubWindowHistory[num].status = 0;
1165 	}
1166 	MainWndUpdateConsoleButton();
1167 	MainWndUpdateListButton();
1168 	MainWndUpdateTracerButton();
1169 	MainWndUpdateDocButton();
1170 	MainWndUpdateWrdButton();
1171 	MainWndUpdateSoundSpecButton();
1172 }
1173 
ToggleSubWindow(HWND hwnd)1174 void ToggleSubWindow(HWND hwnd)
1175 {
1176 	if(IsWindowVisible(hwnd))
1177 		ShowSubWindow(hwnd,0);
1178   else
1179 		ShowSubWindow(hwnd,1);
1180 }
1181 
OnShow(void)1182 void OnShow(void)
1183 {
1184   SUBWINDOW *s = subwindow;
1185 	int i;
1186   for(i=0;s[i].hwnd!=NULL;i++)
1187 		if(s[i].status & SWS_EXIST) {
1188 			if(s[i].status & SWS_HIDE)
1189     		ShowWindow(*(s[i].hwnd),SW_HIDE);
1190 			else
1191     		ShowWindow(*(s[i].hwnd),SW_SHOW);
1192 		}
1193 }
1194 
OnHide(void)1195 void OnHide(void)
1196 {
1197   SUBWINDOW *s = subwindow;
1198 	int i;
1199   for(i=0;s[i].hwnd!=NULL;i++){
1200 		if(s[i].status & SWS_EXIST)
1201     	ShowWindow(*(s[i].hwnd),SW_HIDE);
1202   }
1203 }
1204 
1205 #ifdef W32GUI_DEBUG
DebugThread(void * args)1206 void DebugThread(void *args)
1207 {
1208 	MSG msg;
1209 	DebugThreadExit = 0;
1210 	InitDebugWnd(NULL);
1211 	AttachThreadInput(GetWindowThreadProcessId(hDebugThread,NULL),
1212    	GetWindowThreadProcessId(hWindowThread,NULL),TRUE);
1213 	AttachThreadInput(GetWindowThreadProcessId(hWindowThread,NULL),
1214    	GetWindowThreadProcessId(hDebugThread,NULL),TRUE);
1215 	while( GetMessage(&msg,NULL,0,0) ){
1216 		TranslateMessage(&msg);
1217 		DispatchMessage(&msg);
1218 	}
1219 	DebugThreadExit = 1;
1220 	crt_endthread();
1221 }
1222 
DebugThreadInit(void)1223 void DebugThreadInit(void)
1224 {
1225 	DWORD dwThreadID;
1226 	if(!DebugThreadExit)
1227    	return;
1228 	hDebugThread = crt_beginthreadex(NULL,0,DebugThread,0,0,&dwThreadID);
1229 }
1230 #endif
1231 
1232 
1233 
1234 
1235 
1236 //-----------------------------------------------------------------------------
1237 // Toolbar Main
1238 
1239 static TBBUTTON MainTbb[] = {
1240     {4, IDM_STOP, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
1241     {3, IDM_PAUSE, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0},
1242     {0, IDM_PREV, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
1243     {1, IDM_BACKWARD, TBSTATE_ENABLED,TBSTYLE_BUTTON, 0, 0},
1244     {2, IDM_PLAY, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
1245     {5, IDM_FOREWARD, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
1246     {6, IDM_NEXT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}
1247 };
1248 
InitMainToolbar(HWND hwnd)1249 static void InitMainToolbar(HWND hwnd)
1250 {
1251 	TBADDBITMAP MainTbab;
1252   SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_MAIN,
1253   		TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
1254   SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_MAIN,
1255   		TB_SETBUTTONSIZE, (WPARAM)0, (LPARAM)MAKELONG(16,16));
1256 	MainTbab.hInst = hInst;
1257 	MainTbab.nID =(int)IDB_BITMAP_MAIN_BUTTON;
1258   SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_MAIN,
1259   	TB_ADDBITMAP, 7, (LPARAM)&MainTbab);
1260   SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_MAIN,
1261   	TB_ADDBUTTONS, (WPARAM)7,(LPARAM)&MainTbb);
1262   SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_MAIN,
1263 		TB_AUTOSIZE, 0, 0);
1264 }
1265 
1266 //-----------------------------------------------------------------------------
1267 // Toolbar SubWnd
1268 
1269 static TBBUTTON SubWndTbb[] = {
1270     {3, IDM_CONSOLE, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0},
1271     {1, IDM_LIST, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0},
1272     {2, IDM_TRACER, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0},
1273     {0, IDM_DOC, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0},
1274     {4, IDM_WRD, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0},
1275 };
1276 
InitSubWndToolbar(HWND hwnd)1277 static void InitSubWndToolbar(HWND hwnd)
1278 {
1279 	TBADDBITMAP SubWndTbab;
1280   SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_SUBWND,
1281   		TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
1282   SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_SUBWND,
1283   		TB_SETBUTTONSIZE, (WPARAM)0, (LPARAM)MAKELONG(16,16));
1284 	SubWndTbab.hInst = hInst;
1285 	SubWndTbab.nID =(int)IDB_BITMAP_SUBWND_BUTTON;
1286   SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_SUBWND,
1287   	TB_ADDBITMAP, 5, (LPARAM)&SubWndTbab);
1288   SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_SUBWND,
1289   	TB_ADDBUTTONS, (WPARAM)5,(LPARAM)&SubWndTbb);
1290   SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_SUBWND,
1291 		TB_AUTOSIZE, 0, 0);
1292 }
1293 
1294 
1295 
1296 //-----------------------------------------------------------------------------
1297 // Canvas Window
1298 
1299 #define MAPBAR_LIKE_TMIDI	// note bar view like tmidi
1300 #define TM_CANVAS_XMAX 160
1301 #define TM_CANVAS_YMAX 160
1302 #define TM_CANVASMAP_XMAX 16
1303 #define TM_CANVASMAP_YMAX 16
1304 #define CANVAS_XMAX 160
1305 #define CANVAS_YMAX 160
1306 #define CMAP_XMAX 16
1307 #define CMAP_YMAX 16
1308 #define CK_MAX_CHANNELS 16
1309 #define CMAP_MODE_16		1
1310 #define CMAP_MODE_32		2
1311 #define CMAP_MAX_CHANNELS	32
1312 struct Canvas_ {
1313 	HWND hwnd;
1314 	HWND hParentWnd;
1315 	RECT rcMe;
1316 	int Mode;
1317 	HDC hdc;
1318 	HDC hmdc;
1319 	HGDIOBJ hgdiobj_hmdcprev;
1320 	int UpdateAll;
1321 	int PaintDone;
1322 	HANDLE hPopupMenu;
1323 	HANDLE hPopupMenuKeyboard;
1324 // Sleep mode
1325 	RECT rcSleep;
1326 	HBITMAP hbitmap;
1327 	HBITMAP hBitmapSleep;
1328 	int SleepUpdateFlag;
1329 // Map mode
1330 	RECT rcMap;
1331 	char MapMap[CMAP_MAX_CHANNELS][CMAP_YMAX];
1332 	char MapMapOld[CMAP_MAX_CHANNELS][CMAP_YMAX];
1333 	char MapBar[CMAP_MAX_CHANNELS];
1334 	char MapBarOld[CMAP_MAX_CHANNELS];
1335 	int MapDelay;
1336 	int MapResidual;
1337 	int MapUpdateFlag;
1338 	int MapMode;
1339 	int MapBarWidth;
1340 	int MapBarMax;
1341    int MapCh;
1342    int MapPan[CMAP_MAX_CHANNELS];
1343    int MapPanOld[CMAP_MAX_CHANNELS];
1344    int MapSustain[CMAP_MAX_CHANNELS];
1345    int MapSustainOld[CMAP_MAX_CHANNELS];
1346    int MapExpression[CMAP_MAX_CHANNELS];
1347    int MapExpressionOld[CMAP_MAX_CHANNELS];
1348    int MapVolume[CMAP_MAX_CHANNELS];
1349    int MapVolumeOld[CMAP_MAX_CHANNELS];
1350    int MapPitchbend[CMAP_MAX_CHANNELS];
1351    int MapPitchbendOld[CMAP_MAX_CHANNELS];
1352    int MapChChanged;
1353 	ChannelBitMask DrumChannel;
1354    RECT rcMapMap;
1355    RECT rcMapSub;
1356 // Keyboard mode
1357 	RECT rcKeyboard;
1358 	uint32 CKxnote[MAX_W32G_MIDI_CHANNELS][4];
1359 	uint32 CKxnote_old[MAX_W32G_MIDI_CHANNELS][4];
1360 	int CKNoteFrom;
1361    int CKNoteTo;
1362 	int CKCh;
1363 	int CKPart;
1364 	RECT rcGSLCD;
1365 	int8 GSLCD[16][16];
1366 	int8 GSLCD_old[16][16];
1367 	int KeyboardUpdateFlag;
1368   	int xnote_reset;
1369 // misc
1370    Channel channel[MAX_W32G_MIDI_CHANNELS];
1371 } volatile Canvas;
1372 
1373 #define IDC_CANVAS 4242
1374 
1375 static HWND hCanvasWnd;
1376 static char CanvasWndClassName[] = "TiMidity Canvas";
1377 static LRESULT CALLBACK CanvasWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam);
1378 static void CanvasPaintDo(void);
1379 
1380 #define IDM_CANVAS_SLEEP		2321
1381 #define IDM_CANVAS_MAP        2322
1382 #define IDM_CANVAS_KEYBOARD   2323
1383 #define IDM_CANVAS_REDRAW     2324
1384 #define IDM_CANVAS_MAP16      2325
1385 #define IDM_CANVAS_MAP32      2326
1386 #define IDM_CANVAS_KEYBOARD_A   2327
1387 #define IDM_CANVAS_KEYBOARD_B   2328
1388 #define IDM_CANVAS_KEYBOARD_C   2329
1389 #define IDM_CANVAS_GSLCD   2330
InitCanvasWnd(HWND hwnd)1390 static void InitCanvasWnd(HWND hwnd)
1391 {
1392 	WNDCLASS wndclass ;
1393 	hCanvasWnd = 0;
1394 	wndclass.style         = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_CLASSDC;
1395 	wndclass.lpfnWndProc   = CanvasWndProc ;
1396 	wndclass.cbClsExtra    = 0 ;
1397 	wndclass.cbWndExtra    = 0 ;
1398 	wndclass.hInstance     = hInst ;
1399 	wndclass.hIcon         = NULL;
1400 	wndclass.hCursor       = LoadCursor(0,IDC_ARROW) ;
1401 	wndclass.hbrBackground = (HBRUSH)(COLOR_SCROLLBAR + 1);
1402 	wndclass.lpszMenuName  = NULL;
1403 	wndclass.lpszClassName = CanvasWndClassName;
1404 	RegisterClass(&wndclass);
1405    hCanvasWnd = CreateWindowEx(0,CanvasWndClassName,0,WS_CHILD,CW_USEDEFAULT,
1406    	0,CANVAS_XMAX,CANVAS_YMAX,GetDlgItem(hwnd,IDC_RECT_CANVAS),0,hInst,0);
1407 	CanvasInit(hCanvasWnd);
1408 	CanvasReset();
1409 	CanvasClear();
1410 	CanvasReadPanelInfo(1);
1411 	CanvasUpdate(1);
1412 	CanvasPaintAll();
1413 	ShowWindow(hCanvasWnd,SW_SHOW);
1414 	UpdateWindow(hCanvasWnd);
1415 }
1416 
1417 static LRESULT CALLBACK
CanvasWndProc(HWND hwnd,UINT uMess,WPARAM wParam,LPARAM lParam)1418 CanvasWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam)
1419 {
1420 	switch (uMess)
1421 	{
1422 		case WM_CREATE:
1423 			Canvas.hPopupMenuKeyboard = CreatePopupMenu();
1424 			AppendMenu(Canvas.hPopupMenuKeyboard,MF_STRING,IDM_CANVAS_KEYBOARD_A,"A Part");
1425 			AppendMenu(Canvas.hPopupMenuKeyboard,MF_STRING,IDM_CANVAS_KEYBOARD_B,"B Part");
1426 			Canvas.hPopupMenu = CreatePopupMenu();
1427 			AppendMenu(Canvas.hPopupMenu,MF_STRING,IDM_CANVAS_GSLCD,"LCD Mode");
1428 			AppendMenu(Canvas.hPopupMenu,MF_STRING,IDM_CANVAS_MAP16,"Map16 Mode");
1429 			AppendMenu(Canvas.hPopupMenu,MF_STRING,IDM_CANVAS_MAP32,"Map32 Mode");
1430 			//	AppendMenu(Canvas.hPopupMenu,MF_STRING,IDM_CANVAS_KEYBOARD,"Keyboard Mode");
1431 			AppendMenu(Canvas.hPopupMenu,MF_POPUP,(UINT)Canvas.hPopupMenuKeyboard,"Keyboard Mode");
1432 			AppendMenu(Canvas.hPopupMenu,MF_STRING,IDM_CANVAS_SLEEP,"Sleep Mode");
1433 			AppendMenu(Canvas.hPopupMenu,MF_SEPARATOR,0,0);
1434 			AppendMenu(Canvas.hPopupMenu,MF_STRING,IDM_CANVAS_REDRAW,"Redraw");
1435 			break;
1436 		case WM_DESTROY:
1437 			DestroyMenu ( Canvas.hPopupMenuKeyboard );
1438 			Canvas.hPopupMenuKeyboard = NULL;
1439 			break;
1440 		case WM_PAINT:
1441 			CanvasPaintDo();
1442     		return 0;
1443 		case WM_LBUTTONDBLCLK:
1444 			w32g_send_rc(RC_EXT_MODE_CHANGE, 0);
1445 			break;
1446       case WM_RBUTTONDOWN:
1447       {
1448       	RECT rc;
1449       	GetWindowRect(Canvas.hwnd,(RECT *)&rc);
1450 				SetForegroundWindow ( Canvas.hwnd );
1451 			TrackPopupMenu(Canvas.hPopupMenu,TPM_TOPALIGN|TPM_LEFTALIGN,
1452          	rc.left+(int)LOWORD(lParam),rc.top+(int)HIWORD(lParam),
1453             0,Canvas.hwnd,NULL);
1454 				PostMessage ( Canvas.hwnd, WM_NULL, 0, 0 );
1455       }
1456 			break;
1457 		case WM_COMMAND:
1458 			switch (LOWORD(wParam)) {
1459 			case IDM_CANVAS_GSLCD:
1460 				CanvasChange(CANVAS_MODE_GSLCD);
1461 				break;
1462 			case IDM_CANVAS_MAP16:
1463 				Canvas.MapMode = CMAP_MODE_16;
1464 				CanvasChange(CANVAS_MODE_MAP16);
1465 				break;
1466 			case IDM_CANVAS_MAP32:
1467 				Canvas.MapMode = CMAP_MODE_32;
1468 				CanvasChange(CANVAS_MODE_MAP32);
1469 				break;
1470 			case IDM_CANVAS_KEYBOARD:
1471 				CanvasChange(CANVAS_MODE_KBD_A);
1472 				break;
1473 			case IDM_CANVAS_KEYBOARD_A:
1474 				Canvas.CKPart = 1;
1475 				CanvasChange(CANVAS_MODE_KBD_A);
1476 				break;
1477 			case IDM_CANVAS_KEYBOARD_B:
1478 				Canvas.CKPart = 2;
1479 				CanvasChange(CANVAS_MODE_KBD_B);
1480 				break;
1481 			case IDM_CANVAS_SLEEP:
1482 				CanvasChange(CANVAS_MODE_SLEEP);
1483 				break;
1484 			case IDM_CANVAS_REDRAW:
1485 //				PanelResetPart(PANELRESET_CHANNEL);
1486 				CanvasReset();
1487 				CanvasClear();
1488 				CanvasReadPanelInfo(1);
1489 				CanvasUpdate(1);
1490 				CanvasPaintAll();
1491 				break;
1492 			}
1493 			break;
1494 		default:
1495 			return DefWindowProc(hwnd,uMess,wParam,lParam) ;
1496 	}
1497 	return 0L;
1498 }
1499 
1500 // Color
1501 #define CCR_FORE	 	RGB(0x00,0x00,0x00)
1502 #define CCR_BACK 		RGB(0x00,0xf0,0x00)
1503 #define CCR_DFORE	 	RGB(0x70,0x00,0x00)
1504 #define CCR_DBACK		RGB(0x00,0xf0,0x00)
1505 #define CCR_LOW		RGB(0x80,0xd0,0x00)
1506 #define CCR_MIDDLE	RGB(0xb0,0xb0,0x00)
1507 #define CCR_HIGH		RGB(0xe0,0x00,0x00)
1508 // �F�� m : n �ō�����
HalfColorMN(COLORREF fc,COLORREF bc,int m,int n)1509 static COLORREF HalfColorMN(COLORREF fc, COLORREF bc, int m, int n)
1510 {
1511 	return fc*m/(m+n) + bc*n/(m+n);
1512 }
HalfColor23(COLORREF fc,COLORREF bc)1513 static COLORREF HalfColor23(COLORREF fc, COLORREF bc)
1514 {
1515 	return HalfColorMN(fc,bc,2,3);
1516 }
HalfColor15(COLORREF fc,COLORREF bc)1517 static COLORREF HalfColor15(COLORREF fc, COLORREF bc)
1518 {
1519 	return HalfColorMN(fc,bc,1,5);
1520 }
1521 #define CC_BACK				0
1522 #define CC_FORE				1
1523 #define CC_LOW					2
1524 #define CC_MIDDLE				3
1525 #define CC_HIGH				4
1526 #define CC_FORE_HALF			11
1527 #define CC_LOW_HALF			12
1528 #define CC_MIDDLE_HALF		13
1529 #define CC_HIGH_HALF			14
1530 #define CC_FORE_WEAKHALF	15
1531 #define CC_DBACK				21
1532 #define CC_DFORE				22
1533 #define CC_DFORE_HALF		23
1534 #define CC_DFORE_WEAKHALF	24
CanvasColor(int c)1535 static COLORREF CanvasColor(int c)
1536 {
1537   switch(c){
1538   	case CC_BACK:
1539 			return CCR_BACK;
1540   	case CC_FORE:
1541 			return CCR_FORE;
1542   	case CC_FORE_HALF:
1543 			return HalfColor15(CCR_FORE,CCR_BACK);
1544   	case CC_FORE_WEAKHALF:
1545 			return HalfColor23(CCR_FORE,CCR_BACK);
1546   	case CC_DBACK:
1547 			return CCR_DBACK;
1548   	case CC_DFORE:
1549 			return CCR_DFORE;
1550   	case CC_DFORE_HALF:
1551 			return HalfColor15(CCR_DFORE,CCR_DBACK);
1552   	case CC_DFORE_WEAKHALF:
1553 			return HalfColor23(CCR_DFORE,CCR_DBACK);
1554   	case CC_LOW:
1555 			return CCR_LOW;
1556   	case CC_MIDDLE:
1557 			return CCR_MIDDLE;
1558   	case CC_HIGH:
1559 			return CCR_HIGH;
1560   	case CC_LOW_HALF:
1561 			return HalfColor23(CCR_LOW,CCR_BACK);
1562   	case CC_MIDDLE_HALF:
1563 			return HalfColor23(CCR_MIDDLE,CCR_BACK);
1564   	case CC_HIGH_HALF:
1565 			return HalfColor23(CCR_HIGH,CCR_BACK);
1566 		default:
1567 			return CCR_BACK;
1568 	}
1569 }
1570 
1571 static int CanvasOK = 0;
CanvasInit(HWND hwnd)1572 static void CanvasInit(HWND hwnd)
1573 {
1574 	RECT rc;
1575 
1576 	GDI_LOCK(); // gdi_lock
1577 	Canvas.hwnd = hwnd;
1578 	Canvas.hParentWnd = GetParent(Canvas.hwnd);
1579 	GetClientRect(Canvas.hParentWnd,&rc);
1580 	MoveWindow(Canvas.hwnd,0,0,rc.right-rc.left,rc.bottom-rc.top,FALSE);
1581 	GetClientRect(Canvas.hwnd,(RECT *)&(Canvas.rcMe));
1582 	Canvas.hdc = GetDC(Canvas.hwnd);
1583 	Canvas.hbitmap = CreateCompatibleBitmap(Canvas.hdc,CANVAS_XMAX,CANVAS_YMAX);
1584 	Canvas.hmdc = CreateCompatibleDC(Canvas.hdc);
1585 	ReleaseDC(Canvas.hwnd,Canvas.hdc);
1586 	Canvas.hBitmapSleep = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP_SLEEP));
1587 	Canvas.hgdiobj_hmdcprev = SelectObject(Canvas.hmdc,Canvas.hbitmap);
1588 
1589 	SetRect((RECT *)&(Canvas.rcSleep),0,0,96,64);
1590 	SetRect((RECT *)&(Canvas.rcMap),3,2+2,0,0);
1591 	SetRect((RECT *)&(Canvas.rcKeyboard),1,1,0,0);
1592 	SetRect((RECT *)&(Canvas.rcGSLCD),3,4,99,68);
1593    Canvas.rcMapMap.left = Canvas.rcMap.left;
1594    Canvas.rcMapMap.top = Canvas.rcMap.top;
1595    Canvas.rcMapMap.right = Canvas.rcMapMap.left + 6*16 - 1;
1596    Canvas.rcMapMap.bottom = Canvas.rcMapMap.top + 3*16 - 1;
1597    Canvas.rcMapSub.left = Canvas.rcMapMap.left;
1598    Canvas.rcMapSub.top = Canvas.rcMapMap.bottom + 2;
1599    Canvas.rcMapSub.right = Canvas.rcMapSub.left + 6*16 - 1;
1600    Canvas.rcMapSub.bottom = Canvas.rcMapSub.top +4+3+3+3+4 - 1;
1601 	Canvas.MapDelay = 1;
1602 	Canvas.MapResidual = 0;
1603 	Canvas.MapMode = (MainWndInfo.CanvasMode == CANVAS_MODE_MAP32)
1604 			? CMAP_MODE_32 : CMAP_MODE_16;
1605 	Canvas.MapBarMax = 16;
1606 	//	Canvas.CKNoteFrom = 24;
1607 	//   Canvas.CKNoteTo = 24 + 96;
1608 	Canvas.CKNoteFrom = 12;
1609    Canvas.CKNoteTo = Canvas.CKNoteFrom + 96 + 3;
1610 	Canvas.CKCh = 16;
1611 	Canvas.CKPart = (MainWndInfo.CanvasMode == CANVAS_MODE_KBD_B) ? 2 : 1;
1612 	Canvas.UpdateAll = 0;
1613 	Canvas.Mode = (MainWndInfo.CanvasMode < CANVAS_MODE_GSLCD
1614 			|| MainWndInfo.CanvasMode > CANVAS_MODE_SLEEP)
1615 			? 1 : MainWndInfo.CanvasMode;
1616 	Canvas.PaintDone = 0;
1617 	GDI_UNLOCK(); // gdi_lock
1618 	CanvasReset();
1619 	CanvasOK = 1;
1620 }
1621 
1622 // Canvas Map
1623 
CanvasMapClear(void)1624 static void CanvasMapClear(void)
1625 {
1626 	HPEN hPen;
1627 	HBRUSH hBrush;
1628 	HGDIOBJ hgdiobj_hpen, hgdiobj_hbrush;
1629 	if(!CanvasOK)
1630    	return;
1631 	GDI_LOCK(); // gdi_lock
1632 	hPen = CreatePen(PS_SOLID,1,CanvasColor(CC_BACK));
1633 	hBrush = CreateSolidBrush(CanvasColor(CC_BACK));
1634 	hgdiobj_hpen = SelectObject(Canvas.hmdc, hPen);
1635 	hgdiobj_hbrush = SelectObject(Canvas.hmdc, hBrush);
1636 	Rectangle(Canvas.hmdc,
1637    	Canvas.rcMe.left,Canvas.rcMe.top,Canvas.rcMe.right,Canvas.rcMe.bottom);
1638 	SelectObject(Canvas.hmdc, hgdiobj_hpen);
1639 	DeleteObject(hPen);
1640 	SelectObject(Canvas.hmdc, hgdiobj_hbrush);
1641 	DeleteObject(hBrush);
1642 	GDI_UNLOCK(); // gdi_lock
1643 	InvalidateRect(hCanvasWnd, NULL, FALSE);
1644 }
1645 
CanvasMapReset(void)1646 static void CanvasMapReset(void)
1647 {
1648 	int i,j,ch;
1649 	if(!CanvasOK)
1650    	return;
1651 	switch(Canvas.MapMode){
1652    case CMAP_MODE_32:
1653 		Canvas.MapCh = 32;
1654 #ifdef MAPBAR_LIKE_TMIDI
1655 		Canvas.MapBarWidth = 5;
1656 		Canvas.MapBarMax = 10+1;
1657 		Canvas.rcMapMap.bottom = Canvas.rcMapMap.top + 3*Canvas.MapBarMax*2 + 6 - 1;
1658 #else
1659   		Canvas.MapBarWidth = 2;
1660 		Canvas.MapBarMax = 16;
1661 		Canvas.rcMapMap.bottom = Canvas.rcMapMap.top + 3*Canvas.MapBarMax - 1;
1662 #endif
1663 		break;
1664    default:
1665    case CMAP_MODE_16:
1666 		Canvas.MapCh = 16;
1667 		Canvas.MapBarWidth = 5;
1668 		Canvas.MapBarMax = 16;
1669 		Canvas.rcMapMap.bottom = Canvas.rcMapMap.top + 3*Canvas.MapBarMax - 1;
1670 		break;
1671 	}
1672 	for(i=0;i<Canvas.MapCh;i++){
1673 		for(j=0;j<Canvas.MapBarMax;j++){
1674     		Canvas.MapMap[i][j] = CC_FORE_HALF;
1675     		Canvas.MapMapOld[i][j] = -1;
1676 		}
1677    	Canvas.MapBar[i] = -1;
1678     	Canvas.MapBarOld[i] = -1;
1679 	}
1680 	for(ch=0;ch<Canvas.MapCh;ch++){
1681 		Canvas.MapPan[ch] = Canvas.MapPanOld[ch] = 2;
1682 		Canvas.MapSustain[ch] = Canvas.MapSustainOld[ch] = 0;
1683 		Canvas.MapExpression[ch] = Canvas.MapExpressionOld[ch] = 0;
1684 		Canvas.MapVolume[ch] = Canvas.MapVolumeOld[ch] = 0;
1685 		Canvas.MapPitchbend[ch] = Canvas.MapPitchbendOld[ch] = 0x2000;
1686 	}
1687 	Canvas.MapResidual = -1;
1688 	Canvas.MapUpdateFlag = 1;
1689 	Canvas.PaintDone = 0;
1690 }
1691 
CanvasMapReadPanelInfo(int flag)1692 static void CanvasMapReadPanelInfo(int flag)
1693 {
1694 	int ch,v;
1695 
1696 	if(!CanvasOK)
1697 		return;
1698 	if(!PInfoOK)
1699     	return;
1700    if(Canvas.UpdateAll)
1701    	flag = 1;
1702 	if(!Panel->changed && !flag)
1703    	return;
1704 	// Bar
1705 	Canvas.DrumChannel = drumchannels;
1706 	for(ch=0;ch<Canvas.MapCh;ch++){
1707 		Canvas.MapBarOld[ch] = Canvas.MapBar[ch];
1708 		if(Panel->v_flags[ch] == FLAG_NOTE_ON){
1709 #if 0
1710   			v = Panel->ctotal[ch]/8;
1711 #else
1712 			v = (int) Panel->ctotal[ch] * Canvas.MapBarMax / 128;
1713 #endif
1714 		} else {
1715       	v = 0;
1716 		}
1717 		if(v<0) v = 0; else if(v>Canvas.MapBarMax-1) v = Canvas.MapBarMax-1;
1718 		if(v != Canvas.MapBar[ch]){
1719 			// �x��
1720 	    	if(Canvas.MapDelay){
1721    	  		int old = Canvas.MapBar[ch];
1722 				if(Canvas.MapBar[ch]<0)
1723 					Canvas.MapBar[ch] = v;
1724 				else
1725 					Canvas.MapBar[ch] = (old*10*1/3 + v*10*2/3)/10;
1726 				if(old == Canvas.MapBar[ch]){
1727      				if(v>old)
1728 						Canvas.MapBar[ch] = old + 1;
1729      				else if(v<old)
1730 						Canvas.MapBar[ch] = old - 1;
1731       		}
1732 			} else
1733 				Canvas.MapBar[ch] = v;
1734 		}
1735 		if(Canvas.MapBarOld[ch] != Canvas.MapBar[ch])
1736 			Canvas.MapResidual = -1;
1737 	}
1738 	// Sub
1739 	if(Canvas.MapMode==CMAP_MODE_16){
1740 		Canvas.MapChChanged = 0;
1741 		for(ch=0;ch<Canvas.MapCh;ch++){
1742 			int changed = 0;
1743 			Canvas.MapPanOld[ch] = Canvas.MapPan[ch];
1744 			Canvas.MapSustainOld[ch] = Canvas.MapSustain[ch];
1745 			Canvas.MapExpressionOld[ch] = Canvas.MapExpression[ch];
1746 			Canvas.MapVolumeOld[ch] = Canvas.MapVolume[ch];
1747 			Canvas.MapPitchbendOld[ch] = Canvas.MapPitchbend[ch];
1748 			if(Panel->channel[ch].panning==NO_PANNING)
1749          	Canvas.MapPan[ch] = -1;
1750 			else {
1751 				Canvas.MapPan[ch] = ( Panel->channel[ch].panning - 64 ) * 3 /128;
1752 //				Canvas.MapPan[ch] = ( 64 - Panel->channel[ch].panning ) * 3 /128;
1753 				Canvas.MapPan[ch] = SetValue(Canvas.MapPan[ch],-2,2) + 2;
1754 			}
1755 			if(Panel->channel[ch].sustain)
1756 				Canvas.MapSustain[ch] = 5;
1757          else
1758 				Canvas.MapSustain[ch] = 0;
1759 			//Canvas.MapSustain[ch] = SetValue(Canvas.MapSustain[ch],0,10);
1760 #if 0
1761 			Canvas.MapExpression[ch] = (Panel->channel[ch].expression * 11) >>8;
1762 #else
1763 		    Canvas.MapExpression[ch] = (Panel->channel[ch].expression * 11) >>7;
1764 #endif
1765 			Canvas.MapExpression[ch] = SetValue(Canvas.MapExpression[ch],0,10);
1766 #if 0
1767 			Canvas.MapVolume[ch] = (Panel->channel[ch].volume * 11) >>8;
1768 #else
1769 			Canvas.MapVolume[ch] = (Panel->channel[ch].volume * 11) >>7;
1770 #endif
1771 			Canvas.MapVolume[ch] = SetValue(Canvas.MapVolume[ch],0,10);
1772 			Canvas.MapPitchbend[ch] = Panel->channel[ch].pitchbend;
1773 			if(Canvas.MapPanOld[ch]!=Canvas.MapPan[ch]) changed = 1;
1774 			if(Canvas.MapSustainOld[ch]!=Canvas.MapSustain[ch]) changed = 1;
1775 			if(Canvas.MapExpressionOld[ch]!=Canvas.MapExpression[ch]) changed = 1;
1776 			if(Canvas.MapVolumeOld[ch]!=Canvas.MapVolume[ch]) changed = 1;
1777 			if(Canvas.MapPitchbendOld[ch]!=Canvas.MapPitchbend[ch]) changed = 1;
1778 			if(changed)
1779   		    	Canvas.MapChChanged |= 1 << ch;
1780 		}
1781 	}
1782 }
1783 
CanvasMapDrawMapBar(int flag)1784 static void CanvasMapDrawMapBar(int flag)
1785 {
1786 	int i,ch;
1787 
1788 	if(!CanvasOK)
1789 		return;
1790    if(Canvas.UpdateAll)
1791    	flag = 1;
1792 	if(!Canvas.MapResidual && !flag)
1793    	return;
1794 	Canvas.MapResidual = 0;
1795 	for(ch=0;ch<Canvas.MapCh;ch++){
1796 		int drumflag = IS_SET_CHANNELMASK(Canvas.DrumChannel,ch);
1797  		char color1,color2,color3;
1798 		if(drumflag){
1799 			color1 = CC_DFORE;
1800 			color2 = CC_DFORE_WEAKHALF;
1801          color3 = CC_DFORE_HALF;
1802       } else {
1803 			color1 = CC_FORE;
1804 			color2 = CC_FORE_WEAKHALF;
1805          color3 = CC_FORE_HALF;
1806       }
1807 		for(i=0;i<Canvas.MapBarMax;i++){
1808 			int y = Canvas.MapBarMax-1-i;
1809 			Canvas.MapMapOld[ch][y] = Canvas.MapMap[ch][y];
1810 			if(i<=Canvas.MapBar[ch]){
1811 				Canvas.MapMap[ch][y] = color1;
1812 				Canvas.MapResidual = 1;
1813 #if 1		// �c��
1814 			} else if(i<=Canvas.MapBarOld[ch]){
1815 				Canvas.MapMap[ch][y] = color2;
1816 				Canvas.MapResidual = 1;
1817 #endif
1818     		} else {
1819 				Canvas.MapMap[ch][y] = color3;
1820 			}
1821 		}
1822 	}
1823 	if(Canvas.MapResidual==0)
1824 		Canvas.MapResidual = -1;
1825 }
1826 
1827 // #define CMAP_ALL_UPDATE
CanvasMapUpdate(int flag)1828 static void CanvasMapUpdate(int flag)
1829 {
1830 	RECT rc;
1831 	int i,j;
1832 	int change_flag = 0;
1833 	if(!CanvasOK)
1834    	return;
1835 	CanvasMapDrawMapBar(flag);
1836    if(Canvas.UpdateAll)
1837    	flag = 1;
1838 	if(PInfoOK && Canvas.MapMode==CMAP_MODE_16){
1839    if(flag || Panel->changed){
1840 		int ch;
1841 		GDI_LOCK();
1842 		for(ch=0;ch<Canvas.MapCh;ch++){
1843 			int x,y;
1844          COLORREF color;
1845 			COLORREF colorFG, colorBG;
1846 			int drumflag = IS_SET_CHANNELMASK(Canvas.DrumChannel,ch);
1847 			if(!flag && !(Canvas.MapChChanged & (1<<ch)))
1848          	continue;
1849 			if(drumflag){
1850 				colorFG = CanvasColor(CC_DFORE);
1851 				colorBG = CanvasColor(CC_DFORE_HALF);
1852       	} else {
1853 				colorFG = CanvasColor(CC_FORE);
1854 				colorBG = CanvasColor(CC_FORE_HALF);
1855       	}
1856          rc.left = Canvas.rcMapSub.left + (5 + 1) * ch;
1857          rc.right = rc.left + 5 - 1;
1858 			// PAN
1859          rc.top = Canvas.rcMapSub.top;
1860          rc.bottom = rc.top + 3 - 1;
1861 				for(x=rc.left;x<=rc.right;x++){
1862 				for(y=rc.top;y<=rc.bottom;y++)
1863         			SetPixelV(Canvas.hmdc,x,y,colorBG);
1864 				}
1865 			if(Canvas.MapPan[ch]>=0){
1866 				x = rc.left + Canvas.MapPan[ch];
1867 				for(y=rc.top;y<=rc.bottom;y++)
1868      				SetPixelV(Canvas.hmdc,x,y,colorFG);
1869 			}
1870          // SUSTAIN
1871          rc.top = rc.bottom + 2;
1872          rc.bottom = rc.top + 2 - 1;
1873 				if(Canvas.MapSustain[ch]){
1874 					for(x=rc.left;x<=rc.right;x++){
1875 					for(y=rc.top;y<=rc.bottom;y++)
1876         				SetPixelV(Canvas.hmdc,x,y,colorFG);
1877 					}
1878 				} else {
1879 					for(x=rc.left;x<=rc.right;x++){
1880 					for(y=rc.top;y<=rc.bottom;y++)
1881         				SetPixelV(Canvas.hmdc,x,y,colorBG);
1882 					}
1883          // EXPRESSION
1884          rc.top = rc.bottom + 2;
1885          rc.bottom = rc.top + 2 - 1;
1886 			for(i=1;i<=10;i++){
1887          		if(i <= Canvas.MapExpression[ch])
1888             	color = colorFG;
1889             else
1890             	color = colorBG;
1891 			x = rc.left + (i-1)/2;
1892 			y = rc.top + (i+1)%2;
1893   				SetPixelV(Canvas.hmdc,x,y,color);
1894 			}
1895          // VOLUME
1896          rc.top = rc.bottom + 2;
1897          rc.bottom = rc.top + 2 - 1;
1898 			for(i=1;i<=10;i++){
1899         		if(i <= Canvas.MapVolume[ch])
1900             	color = colorFG;
1901             else
1902             	color = colorBG;
1903             x = rc.left + (i-1)/2;
1904 				y = rc.top + (i+1)%2;
1905   				SetPixelV(Canvas.hmdc,x,y,color);
1906 			}
1907          // PITCH_BEND
1908          rc.top = rc.bottom + 2;
1909          rc.bottom = rc.top + 3 - 1;
1910 					for(x=rc.left;x<=rc.right;x++){
1911 				for(y=rc.top;y<=rc.bottom;y++)
1912         			SetPixelV(Canvas.hmdc,x,y,colorBG);
1913 					}
1914          if(Canvas.MapPitchbend[ch]==-2){
1915          	y = rc.top + 1;
1916 				for(x=rc.left;x<=rc.right;x++)
1917   					SetPixelV(Canvas.hmdc,x,y,colorFG);
1918 				y++;
1919 				for(x=rc.left;x<=rc.right;x++)
1920   					SetPixelV(Canvas.hmdc,x,y,colorFG);
1921 			} else if(Canvas.MapPitchbend[ch]>0x2000){
1922          	y = rc.top;
1923 				for(x=rc.left;x<=rc.left;x++)
1924   					SetPixelV(Canvas.hmdc,x,y,colorFG);
1925 				y++;
1926 				for(x=rc.left;x<=rc.left+2;x++)
1927   					SetPixelV(Canvas.hmdc,x,y,colorFG);
1928 				y++;
1929 				for(x=rc.left;x<=rc.left+4;x++)
1930 		 			SetPixelV(Canvas.hmdc,x,y,colorFG);
1931 			} else if(Canvas.MapPitchbend[ch]<0x2000){
1932          	y = rc.top;
1933 				for(x=rc.right;x<=rc.right;x++)
1934   					SetPixelV(Canvas.hmdc,x,y,colorFG);
1935 				y++;
1936 				for(x=rc.right-2;x<=rc.right;x++)
1937   					SetPixelV(Canvas.hmdc,x,y,colorFG);
1938 				y++;
1939 				for(x=rc.right-4;x<=rc.right;x++)
1940 		 			SetPixelV(Canvas.hmdc,x,y,colorFG);
1941          }
1942       }
1943       }
1944 	 		InvalidateRect(hCanvasWnd,(RECT *)&(Canvas.rcMapSub),FALSE);
1945 			GDI_UNLOCK();
1946    }
1947    }
1948 	if(!Canvas.MapResidual && !flag)
1949    	return;
1950 	change_flag = 0;
1951 #ifndef MAPBAR_LIKE_TMIDI
1952 	GDI_LOCK();
1953 	for(i=0;i<Canvas.MapCh;i++){
1954 		for(j=0;j<Canvas.MapBarMax;j++){
1955 			if(Canvas.MapMap[i][j]!=Canvas.MapMapOld[i][j] || flag){
1956 				int x,y;
1957 				COLORREF color = CanvasColor(Canvas.MapMap[i][j]);
1958             rc.left = Canvas.rcMap.left + (Canvas.MapBarWidth + 1) * i;
1959             rc.right = rc.left -1 + Canvas.MapBarWidth;
1960             rc.top = Canvas.rcMap.top + (2 + 1) * j;
1961             rc.bottom = rc.top -1 + 2;
1962 				for(x=rc.left;x<=rc.right;x++)
1963 					for(y=rc.top;y<=rc.bottom;y++)
1964           			SetPixelV(Canvas.hmdc,x,y,color);
1965 				change_flag = 1;
1966     		}
1967    	}
1968 	}
1969 	GDI_UNLOCK();
1970 #else
1971 	GDI_LOCK();
1972 	if(Canvas.MapMode==CMAP_MODE_16){
1973 	for(i=0;i<Canvas.MapCh;i++){
1974 		for(j=0;j<Canvas.MapBarMax;j++){
1975 			if(Canvas.MapMap[i][j]!=Canvas.MapMapOld[i][j] || flag){
1976 				int x,y;
1977 				COLORREF color = CanvasColor(Canvas.MapMap[i][j]);
1978 				rc.left = Canvas.rcMap.left + (Canvas.MapBarWidth + 1) * i;
1979 				rc.right = rc.left -1 + Canvas.MapBarWidth;
1980 				rc.top = Canvas.rcMap.top + (2 + 1) * j;
1981 				rc.bottom = rc.top -1 + 2;
1982 					for(x=rc.left;x<=rc.right;x++){
1983 					for(y=rc.top;y<=rc.bottom;y++)
1984           			SetPixelV(Canvas.hmdc,x,y,color);
1985 					}
1986 				change_flag = 1;
1987     		}
1988    		}
1989 	}
1990 	} else {
1991 	for(i=0;i<Canvas.MapCh;i++){
1992 		for(j=0;j<Canvas.MapBarMax;j++){
1993 			if(Canvas.MapMap[i][j]!=Canvas.MapMapOld[i][j] || flag){
1994 				int x,y;
1995 				COLORREF color = CanvasColor(Canvas.MapMap[i][j]);
1996 				if(i<=15){
1997 					rc.left = Canvas.rcMap.left + (Canvas.MapBarWidth + 1) * i;
1998 					rc.right = rc.left -1 + Canvas.MapBarWidth;
1999 						rc.top = -1 + Canvas.rcMap.top + (2 + 1) * j;
2000 					rc.bottom = rc.top -1 + 2;
2001 				} else {
2002 					rc.left = Canvas.rcMap.left + (Canvas.MapBarWidth + 1) * (i-16);
2003 					rc.right = rc.left -1 + Canvas.MapBarWidth;
2004 						rc.top = -1 + Canvas.rcMap.top + (2 + 1) * j + Canvas.MapBarMax*(2+1) + 2 ;
2005 					rc.bottom = rc.top -1 + 2;
2006 				}
2007 				for(x=rc.left;x<=rc.right;x++)
2008 					for(y=rc.top;y<=rc.bottom;y++)
2009 	          			SetPixelV(Canvas.hmdc,x,y,color);
2010 				change_flag = 1;
2011     		}
2012    		}
2013 	}
2014 	}
2015 	GDI_UNLOCK();
2016 #endif
2017 #ifdef CMAP_ALL_UPDATE
2018 	if(change_flag)
2019 		InvalidateRect(hCanvasWnd,NULL,FALSE);
2020 #else
2021 	if(change_flag)
2022 		InvalidateRect(hCanvasWnd,(RECT *)&(Canvas.rcMapMap),FALSE);
2023 #endif
2024 	if(Canvas.UpdateAll)
2025 		InvalidateRect(hCanvasWnd,NULL,FALSE);
2026 	if(Canvas.MapResidual<0)
2027 		Canvas.MapResidual = 0;
2028 }
2029 
CanvasSleepClear(void)2030 static void CanvasSleepClear(void)
2031 {
2032 	RECT rc;
2033 	HPEN hPen;
2034 	HBRUSH hBrush;
2035 	HGDIOBJ hgdiobj_hpen, hgdiobj_hbrush;
2036 	GDI_LOCK(); // gdi_lock
2037 	hPen = CreatePen(PS_SOLID,1,GetSysColor(COLOR_SCROLLBAR));
2038 	hBrush = CreateSolidBrush(GetSysColor(COLOR_SCROLLBAR));
2039 	hgdiobj_hpen = SelectObject(Canvas.hmdc, hPen);
2040 	hgdiobj_hbrush = SelectObject(Canvas.hmdc, hBrush);
2041 	GetClientRect(Canvas.hwnd, &rc);
2042 	Rectangle(Canvas.hmdc,rc.left,rc.top,rc.right,rc.bottom);
2043 	SelectObject(Canvas.hmdc, hgdiobj_hpen);
2044 	DeleteObject(hPen);
2045 	SelectObject(Canvas.hmdc, hgdiobj_hbrush);
2046 	DeleteObject(hBrush);
2047 	GDI_UNLOCK(); // gdi_lock
2048 	InvalidateRect(hCanvasWnd, NULL, FALSE);
2049 }
2050 
CanvasSleepReset(void)2051 static void CanvasSleepReset(void)
2052 {
2053 	Canvas.PaintDone = 0;
2054 }
2055 
CanvasSleepReadPanelInfo(int flag)2056 static void CanvasSleepReadPanelInfo(int flag)
2057 {
2058 }
2059 
2060 static int CanvasSleepDone = 0;
CanvasSleepUpdate(int flag)2061 static void CanvasSleepUpdate(int flag)
2062 {
2063 	HDC hdc;
2064 	RECT rc;
2065 	int x,y;
2066 	CanvasSleepReset();
2067 	GDI_LOCK(); // gdi_lock
2068    hdc = CreateCompatibleDC(Canvas.hmdc);
2069 	SelectObject(hdc,Canvas.hBitmapSleep);
2070 	GetClientRect(Canvas.hwnd, &rc);
2071 	x = (rc.right - rc.left - Canvas.rcSleep.right)/2;
2072 	y = (rc.bottom - rc.top - Canvas.rcSleep.bottom)/2;
2073 	if(x<0) x = 0;
2074 	if(y<0) y = 0;
2075 	BitBlt(Canvas.hmdc,x,y,Canvas.rcSleep.right,Canvas.rcSleep.bottom,hdc,0,0,SRCCOPY);
2076 	DeleteDC(hdc);
2077 	GDI_UNLOCK(); // gdi_lock
2078 }
2079 
2080 // Canvas GSLCD
2081 
CanvasGSLCDReset(void)2082 static void CanvasGSLCDReset(void)
2083 {
2084 	int i, j;
2085 	for(i = 0; i < 16; i++) {
2086 		for(j = 0; j < 16; j++) {
2087 			Canvas.GSLCD[i][j] = 0;
2088 			Canvas.GSLCD_old[i][j] = 0;
2089 		}
2090 	}
2091 	Canvas.PaintDone = 0;
2092 }
2093 
CanvasGSLCDReadPanelInfo(int flag)2094 static void CanvasGSLCDReadPanelInfo(int flag)
2095 {
2096 	int i, j;
2097 	if (!CanvasOK) {return;}
2098 	if (!PInfoOK) {return;}
2099 	if (Canvas.UpdateAll) {flag = 1;}
2100 	if (!Panel->changed && !flag) {return;}
2101 	for(i = 0; i < 16; i++) {
2102 		for(j = 0; j < 16; j++) {
2103 			Canvas.GSLCD_old[i][j] = Canvas.GSLCD[i][j];
2104 			Canvas.GSLCD[i][j] = Panel->GSLCD[i][j];
2105 		}
2106 	}
2107 }
2108 
2109 #define CGSLCD_BG RGB(0x00,0xf0,0x00)
2110 #define CGSLCD_ON RGB(0x00,0x00,0x00)
2111 #define CGSLCD_OFF RGB(0x00,0xc0,0x00)
CanvasGSLCDUpdate(int flag)2112 static void CanvasGSLCDUpdate(int flag)
2113 {
2114 	int i, j, x, y, changed = 0;
2115 	COLORREF colorON = CGSLCD_ON, colorOFF = CGSLCD_OFF;
2116 	HPEN hPen;
2117 	HBRUSH hBrush;
2118 	HGDIOBJ hgdiobj_hpen, hgdiobj_hbrush;
2119 
2120 	if(!PInfoOK) {return;}
2121 	if(Canvas.UpdateAll) {flag = 1;}
2122 	if(!Panel->changed && !flag) {return;}
2123 	GDI_LOCK(); // gdi_lock
2124 	for (i = 0; i < 16; i++) {
2125 		for (j = 0; j < 16; j++) {
2126      		x = Canvas.rcGSLCD.left + i * 6;
2127    			y = Canvas.rcGSLCD.top + j * 4;
2128 			if (flag || Canvas.GSLCD[i][j] != Canvas.GSLCD_old[i][j]) {
2129 				changed = 1;
2130 				if (Canvas.GSLCD[i][j] == 1) {
2131 					hPen = CreatePen(PS_SOLID, 1, colorON);
2132 					hBrush = CreateSolidBrush(colorON);
2133 				}
2134 				else {
2135 					hPen = CreatePen(PS_SOLID, 1, colorOFF);
2136 					hBrush = CreateSolidBrush(colorOFF);
2137 				}
2138 				hgdiobj_hpen = SelectObject(Canvas.hmdc, hPen);
2139 				hgdiobj_hbrush = SelectObject(Canvas.hmdc, hBrush);
2140 				Rectangle(Canvas.hmdc, x, y, x + 5, y + 3);
2141 				SelectObject(Canvas.hmdc, hgdiobj_hpen);
2142 				DeleteObject(hPen);
2143 				SelectObject(Canvas.hmdc, hgdiobj_hbrush);
2144 				DeleteObject(hBrush);
2145 			}
2146 		}
2147 	}
2148 	if (changed) {
2149 		GDI_UNLOCK();
2150        	InvalidateRect(Canvas.hwnd, (RECT *)&Canvas.rcGSLCD, FALSE);
2151 		GDI_LOCK();
2152 	}
2153 	GDI_UNLOCK(); // gdi_lock
2154 	if(flag) {InvalidateRect(hCanvasWnd, NULL, FALSE);}
2155 }
2156 
CanvasGSLCDClear(void)2157 static void CanvasGSLCDClear(void)
2158 {
2159 	HPEN hPen;
2160 	HBRUSH hBrush;
2161 	HGDIOBJ hgdiobj_hpen, hgdiobj_hbrush;
2162 	COLORREF BGcolor;
2163 	if(!CanvasOK)
2164    	return;
2165  	GDI_LOCK(); // gdi_lock
2166 	BGcolor = RGB(0,0,0);
2167 	hPen = CreatePen(PS_SOLID,1,BGcolor);
2168 	hBrush = CreateSolidBrush(BGcolor);
2169 	hgdiobj_hpen = SelectObject(Canvas.hmdc, hPen);
2170 	hgdiobj_hbrush = SelectObject(Canvas.hmdc, hBrush);
2171 	Rectangle(Canvas.hmdc,
2172    	Canvas.rcMe.left,Canvas.rcMe.top,Canvas.rcMe.right,Canvas.rcMe.bottom);
2173 	SelectObject(Canvas.hmdc, hgdiobj_hpen);
2174 	DeleteObject(hPen);
2175 	SelectObject(Canvas.hmdc, hgdiobj_hbrush);
2176 	DeleteObject(hBrush);
2177 	BGcolor = CGSLCD_BG;
2178 	hPen = CreatePen(PS_SOLID,1,BGcolor);
2179 	hBrush = CreateSolidBrush(BGcolor);
2180 	hgdiobj_hpen = SelectObject(Canvas.hmdc, hPen);
2181 	hgdiobj_hbrush = SelectObject(Canvas.hmdc, hBrush);
2182 	Rectangle(Canvas.hmdc,
2183    	Canvas.rcMe.left + 1,Canvas.rcMe.top + 1,Canvas.rcMe.right - 1,Canvas.rcMe.bottom - 1);
2184 	SelectObject(Canvas.hmdc, hgdiobj_hpen);
2185 	DeleteObject(hPen);
2186 	SelectObject(Canvas.hmdc, hgdiobj_hbrush);
2187 	DeleteObject(hBrush);
2188 	GDI_UNLOCK(); // gdi_lock
2189 
2190 	CanvasGSLCDReset();
2191 	CanvasGSLCDReadPanelInfo(1);
2192 	CanvasGSLCDUpdate(1);
2193 	InvalidateRect(hCanvasWnd, NULL, FALSE);
2194 }
2195 
2196 // Canvas Keyboard
2197 
CanvasKeyboardReset(void)2198 static void CanvasKeyboardReset(void)
2199 {
2200 	int i,j;
2201 	int ChFrom = (Canvas.CKPart - 1) * Canvas.CKCh;
2202 	int ChTo = Canvas.CKPart * Canvas.CKCh - 1;
2203 	for(i=ChFrom;i<=ChTo;i++){
2204 		for(j=0;j<4;j++){
2205 			Canvas.CKxnote[i][j] = 0;
2206 			Canvas.CKxnote_old[i][j] = 0;
2207 		}
2208 	}
2209 	Canvas.PaintDone = 0;
2210 }
2211 
CanvasKeyboardReadPanelInfo(int flag)2212 static void CanvasKeyboardReadPanelInfo(int flag)
2213 {
2214 	int i,j;
2215 	int ChFrom, ChTo;
2216 	if(!CanvasOK)
2217 		return;
2218 	if(!PInfoOK)
2219     	return;
2220 	ChFrom = (Canvas.CKPart - 1) * Canvas.CKCh;
2221 	ChTo = Canvas.CKPart * Canvas.CKCh - 1;
2222    if(Canvas.UpdateAll)
2223    	flag = 1;
2224 	if(!Panel->changed && !flag)
2225    	return;
2226 	for(i=ChFrom;i<=ChTo;i++)
2227 		for(j=0;j<4;j++){
2228       	Canvas.CKxnote_old[i][j] = Canvas.CKxnote[i][j];
2229 			Canvas.CKxnote[i][j] = Panel->xnote[i][j];
2230       }
2231 }
2232 
2233 #define CK_KEY_BLACK	1
2234 #define CK_KEY_WHITE	2
2235 #define CK_ON RGB(0xff,0x00,0x00)
2236 #define CK_OFF_WHITE RGB(0xff,0xff,0xff)
2237 #define CK_OFF_BLACK RGB(0x00,0x00,0x00)
2238 #define CK_DOFF_WHITE RGB(0xcc,0xcc,0xcc)
2239 #define CK_DOFF_BLACK RGB(0x00,0x00,0x00)
CanvasKeyboardUpdate(int flag)2240 static void CanvasKeyboardUpdate(int flag)
2241 {
2242 	int j,k,l;
2243    int channel;
2244 	int ChFrom, ChTo;
2245 
2246 	if(!PInfoOK)
2247 		return;
2248    if(Canvas.UpdateAll)
2249    	flag = 1;
2250 	if(!COMPARE_CHANNELMASK(Canvas.DrumChannel,drumchannels))
2251    	flag = 1;
2252 	if(!Panel->changed && !flag)
2253    	return;
2254 	ChFrom = (Canvas.CKPart - 1) * Canvas.CKCh;
2255 	ChTo = Canvas.CKPart * Canvas.CKCh - 1;
2256 	GDI_LOCK(); // gdi_lock
2257 	for(channel=ChFrom;channel<=ChTo;channel++){
2258 		int change_flag = 0;
2259 		int drumflag = IS_SET_CHANNELMASK(drumchannels,channel);
2260 		COLORREF colorON, colorOFF_WHITE, colorOFF_BLACK;
2261 		if(drumflag){
2262 			colorON = CK_ON;
2263          colorOFF_WHITE = CK_DOFF_WHITE;
2264          colorOFF_BLACK = CK_OFF_BLACK;
2265       } else {
2266 			colorON = CK_ON;
2267          colorOFF_WHITE = CK_OFF_WHITE;
2268          colorOFF_BLACK = CK_OFF_BLACK;
2269       }
2270 		for(j=0;j<4;j++){
2271 			int32 xnote, xnote_diff;
2272 			xnote = Canvas.CKxnote[channel][j];
2273         	xnote_diff = Canvas.CKxnote[channel][j] ^ Canvas.CKxnote_old[channel][j];
2274 			if(!flag && xnote_diff == 0)
2275          	continue;
2276 			for(k=0;k<32;k++){
2277 				int key = 0;
2278 				int KeyOn = 0;
2279   	   		int note = j*32+k;
2280             int reff = (int32)1 << k;
2281 				int x,y;
2282 				if(note < Canvas.CKNoteFrom || note > Canvas.CKNoteTo)
2283       			continue;
2284             if(!flag && !(xnote_diff & reff))
2285               	continue;
2286             if(xnote & reff)
2287 					KeyOn = 1;
2288 				note = note % 12;
2289             if(note == 1 || note == 3 || note == 6 || note == 8 || note == 10)
2290 			 		key = CK_KEY_BLACK;
2291             else
2292 			 		key = CK_KEY_WHITE;
2293      			x = Canvas.rcKeyboard.left + j * 32 + k - Canvas.CKNoteFrom;
2294    			y = Canvas.rcKeyboard.top + (channel - ChFrom) * 4;
2295 				switch(key){
2296             case CK_KEY_BLACK:
2297 	            if(KeyOn){
2298 						for(l=0;l<2;l++)
2299       	  				SetPixelV(Canvas.hmdc,x,y+l,colorON);
2300   						SetPixelV(Canvas.hmdc,x,y+2,colorOFF_WHITE);
2301 	            } else {
2302 						for(l=0;l<2;l++)
2303       	  				SetPixelV(Canvas.hmdc,x,y+l,colorOFF_BLACK);
2304   						SetPixelV(Canvas.hmdc,x,y+2,colorOFF_WHITE);
2305          	   }
2306 					break;
2307             case CK_KEY_WHITE:
2308 	            if(KeyOn){
2309   						SetPixelV(Canvas.hmdc,x,y,colorOFF_WHITE);
2310 						for(l=1;l<3;l++)
2311       	  				SetPixelV(Canvas.hmdc,x,y+l,colorON);
2312 	            } else {
2313   						SetPixelV(Canvas.hmdc,x,y,colorOFF_WHITE);
2314 						for(l=1;l<3;l++)
2315       	  				SetPixelV(Canvas.hmdc,x,y+l,colorOFF_WHITE);
2316          	   }
2317 					break;
2318 				default:
2319             	break;
2320 	  			}
2321             change_flag = 1;
2322       	}
2323 		}
2324 		if(change_flag){
2325          RECT rc;
2326 			GDI_UNLOCK();
2327 			GetClientRect(Canvas.hwnd,&rc);
2328          rc.top = Canvas.rcKeyboard.top + (channel - ChFrom) * 4;
2329 			rc.bottom = rc.top + 4;
2330        	InvalidateRect(Canvas.hwnd, &rc, FALSE);
2331 			GDI_LOCK();
2332 		}
2333 	}
2334 	GDI_UNLOCK(); // gdi_lock
2335 	if(flag)
2336 		InvalidateRect(hCanvasWnd, NULL, FALSE);
2337 	Canvas.DrumChannel = drumchannels;
2338 }
2339 
CanvasKeyboardClear(void)2340 static void CanvasKeyboardClear(void)
2341 {
2342 	int i;
2343 	HPEN hPen;
2344 	HBRUSH hBrush;
2345 	HGDIOBJ hgdiobj_hpen, hgdiobj_hbrush;
2346 	COLORREF FGcolor, BGcolor;
2347 	HFONT hfont;
2348    HGDIOBJ hgdiobj;
2349 	RECT rc;
2350 	char buffer[16];
2351 	if(!CanvasOK)
2352    	return;
2353  	GDI_LOCK(); // gdi_lock
2354 #if 0
2355 	hPen = CreatePen(PS_SOLID,1,CanvasColor(CC_BACK));
2356 	hBrush = CreateSolidBrush(CanvasColor(CC_BACK));
2357 #else
2358 	FGcolor = RGB(0xff,0xff,0xff);
2359    BGcolor = RGB(0x00,0x00,0x00);
2360 	hPen = CreatePen(PS_SOLID,1,BGcolor);
2361 	hBrush = CreateSolidBrush(BGcolor);
2362 #endif
2363 	hgdiobj_hpen = SelectObject(Canvas.hmdc, hPen);
2364 	hgdiobj_hbrush = SelectObject(Canvas.hmdc, hBrush);
2365 	Rectangle(Canvas.hmdc,
2366    	Canvas.rcMe.left,Canvas.rcMe.top,Canvas.rcMe.right,Canvas.rcMe.bottom);
2367 	SelectObject(Canvas.hmdc, hgdiobj_hpen);
2368 	DeleteObject(hPen);
2369 	SelectObject(Canvas.hmdc, hgdiobj_hbrush);
2370 	DeleteObject(hBrush);
2371 
2372 	hfont = CreateFont(7,7,0,0,FW_DONTCARE,FALSE,FALSE,FALSE,
2373 		DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
2374      	DEFAULT_PITCH | FF_DONTCARE,"Arial Bold");
2375 	hgdiobj = SelectObject(Canvas.hmdc,hfont);
2376    SetTextAlign(Canvas.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP);
2377 	rc.left =	Canvas.rcMe.left+1 ;
2378 	rc.top =		Canvas.rcMe.bottom-7;
2379 	rc.right =	Canvas.rcMe.left+1 + 40;
2380 	rc.bottom =	Canvas.rcMe.bottom;
2381 	SetTextColor(Canvas.hmdc,RGB(0xff,0xff,0xff));
2382 	SetBkColor(Canvas.hmdc,RGB(0x00,0x00,0x00));
2383 	strcpy(buffer," ");
2384  	ExtTextOut(Canvas.hmdc,rc.left,rc.top,ETO_CLIPPED|ETO_OPAQUE,&rc,
2385  		buffer,strlen(buffer),NULL);
2386 	for(i=1;i<=3;i++){
2387 		if(i==Canvas.CKPart){
2388    		SetTextColor(Canvas.hmdc,RGB(0xff,0xff,0xff));
2389    		SetBkColor(Canvas.hmdc,RGB(0x00,0x00,0x00));
2390       } else {
2391    		SetTextColor(Canvas.hmdc,RGB(0x80,0x80,0x80));
2392    		SetBkColor(Canvas.hmdc,RGB(0x00,0x00,0x00));
2393 		}
2394 		rc.left =	Canvas.rcMe.left+1 + 0 + (i-1)*24;
2395 		rc.top =		Canvas.rcMe.bottom-7;
2396 		rc.right =	Canvas.rcMe.left+1 + 0 + (i)*24 - 1;
2397 		rc.bottom =	Canvas.rcMe.bottom;
2398 		sprintf(buffer,"[%c]",i+'A'-1);
2399  	 	ExtTextOut(Canvas.hmdc,rc.left,rc.top,ETO_CLIPPED|ETO_OPAQUE,&rc,
2400    		buffer,strlen(buffer),NULL);
2401 	}
2402    if((HGDIOBJ)hgdiobj!=(HGDIOBJ)NULL && (HGDIOBJ)hgdiobj!=(HGDIOBJ)GDI_ERROR)
2403    	SelectObject(Canvas.hmdc,hgdiobj);
2404 	DeleteObject(hfont);
2405 	GDI_UNLOCK(); // gdi_lock
2406 
2407 	CanvasKeyboardReset();
2408 	CanvasKeyboardReadPanelInfo(1);
2409 	CanvasKeyboardUpdate(1);
2410 	InvalidateRect(hCanvasWnd, NULL, FALSE);
2411 }
2412 
2413 // Canvas All
2414 
CanvasPaintDo(void)2415 static void CanvasPaintDo(void)
2416 {
2417 	RECT rc;
2418 	if ( GetUpdateRect(Canvas.hwnd, &rc, FALSE) ) {
2419 		PAINTSTRUCT ps;
2420 		GDI_LOCK(); // gdi_lock
2421 		Canvas.hdc = BeginPaint(Canvas.hwnd, &ps);
2422 		BitBlt(Canvas.hdc,rc.left,rc.top,rc.right,rc.bottom,Canvas.hmdc,rc.left,rc.top,SRCCOPY);
2423 		EndPaint(Canvas.hwnd, &ps);
2424 		GDI_UNLOCK(); // gdi_lock
2425 	}
2426 }
CanvasPaint(void)2427 void CanvasPaint(void)
2428 {
2429 	Canvas.PaintDone = 0;
2430 	UpdateWindow(hCanvasWnd);
2431 }
CanvasPaintAll(void)2432 void CanvasPaintAll(void)
2433 {
2434 	InvalidateRect(hCanvasWnd, NULL, FALSE);
2435 	CanvasPaint();
2436 }
2437 
CanvasReset(void)2438 void CanvasReset(void)
2439 {
2440 	if (! CanvasOK)
2441 		return;
2442 	switch (Canvas.Mode) {
2443 	case CANVAS_MODE_GSLCD:
2444 		CanvasGSLCDReset();
2445 		break;
2446 	case CANVAS_MODE_MAP16:
2447 	case CANVAS_MODE_MAP32:
2448 		CanvasMapReset();
2449 		break;
2450 	case CANVAS_MODE_KBD_A:
2451 	case CANVAS_MODE_KBD_B:
2452 		CanvasKeyboardReset();
2453 		break;
2454 	case CANVAS_MODE_SLEEP:
2455 		CanvasSleepReset();
2456 		break;
2457 	}
2458 }
2459 
CanvasClear(void)2460 void CanvasClear(void)
2461 {
2462 	if (! CanvasOK)
2463 		return;
2464 	switch (Canvas.Mode) {
2465 	case CANVAS_MODE_GSLCD:
2466 		CanvasGSLCDClear();
2467 		break;
2468 	case CANVAS_MODE_MAP16:
2469 	case CANVAS_MODE_MAP32:
2470 		CanvasMapClear();
2471 		break;
2472 	case CANVAS_MODE_KBD_A:
2473 	case CANVAS_MODE_KBD_B:
2474 		CanvasKeyboardClear();
2475 		break;
2476 	case CANVAS_MODE_SLEEP:
2477 		CanvasSleepClear();
2478 		break;
2479 	}
2480 }
2481 
CanvasUpdate(int flag)2482 void CanvasUpdate(int flag)
2483 {
2484 	if (! CanvasOK)
2485 		return;
2486 	switch (Canvas.Mode) {
2487 	case CANVAS_MODE_GSLCD:
2488 		CanvasGSLCDUpdate(flag);
2489 		break;
2490 	case CANVAS_MODE_MAP16:
2491 	case CANVAS_MODE_MAP32:
2492 		CanvasMapUpdate(flag);
2493 		break;
2494 	case CANVAS_MODE_KBD_A:
2495 	case CANVAS_MODE_KBD_B:
2496 		CanvasKeyboardUpdate(flag);
2497 		break;
2498 	case CANVAS_MODE_SLEEP:
2499 		CanvasSleepUpdate(flag);
2500 		break;
2501 	}
2502 }
2503 
CanvasReadPanelInfo(int flag)2504 void CanvasReadPanelInfo(int flag)
2505 {
2506 	if (! CanvasOK)
2507 		return;
2508 	switch (Canvas.Mode) {
2509 	case CANVAS_MODE_GSLCD:
2510 		CanvasGSLCDReadPanelInfo(flag);
2511 		break;
2512 	case CANVAS_MODE_MAP16:
2513 	case CANVAS_MODE_MAP32:
2514 		CanvasMapReadPanelInfo(flag);
2515 		break;
2516 	case CANVAS_MODE_KBD_A:
2517 	case CANVAS_MODE_KBD_B:
2518 		CanvasKeyboardReadPanelInfo(flag);
2519 		break;
2520 	case CANVAS_MODE_SLEEP:
2521 //		CanvasSleepReadPanelInfo(flag);
2522 		break;
2523 	}
2524 }
2525 
CanvasChange(int mode)2526 void CanvasChange(int mode)
2527 {
2528 	if (mode != 0)
2529 		Canvas.Mode = mode;
2530 	else {
2531 		if (Canvas.Mode == CANVAS_MODE_SLEEP)
2532 			Canvas.Mode = CANVAS_MODE_GSLCD;
2533 		else if (Canvas.Mode == CANVAS_MODE_GSLCD) {
2534 			Canvas.MapMode = CMAP_MODE_16;
2535 			Canvas.Mode = CANVAS_MODE_MAP16;
2536 		} else if (Canvas.Mode == CANVAS_MODE_MAP16) {
2537 			Canvas.MapMode = CMAP_MODE_32;
2538 			Canvas.Mode = CANVAS_MODE_MAP32;
2539 		} else if (Canvas.Mode == CANVAS_MODE_MAP32) {
2540 			Canvas.CKPart = 1;
2541 			Canvas.Mode = CANVAS_MODE_KBD_A;
2542 		} else if (Canvas.Mode == CANVAS_MODE_KBD_A) {
2543 			Canvas.CKPart = 2;
2544 			Canvas.Mode = CANVAS_MODE_KBD_B;
2545 		} else if (Canvas.Mode == CANVAS_MODE_KBD_B)
2546 			Canvas.Mode = CANVAS_MODE_SLEEP;
2547 	}
2548 	MainWndInfo.CanvasMode = Canvas.Mode;
2549 	CanvasReset();
2550 	CanvasClear();
2551 	CanvasReadPanelInfo(1);
2552 	CanvasUpdate(1);
2553 	CanvasPaintAll();
2554 }
2555 
CanvasGetMode(void)2556 int CanvasGetMode(void)
2557 {
2558 	return Canvas.Mode;
2559 }
2560 
2561 
2562 
2563 
2564 
2565 
2566 
2567 
2568 
2569 
2570 
2571 
2572 
2573 
2574 
2575 
2576 
2577 
2578 
2579 
2580 
2581 
2582 
2583 
2584 
2585 
2586 
2587 
2588 
2589 
2590 
2591 //-----------------------------------------------------------------------------
2592 // Main Panel
2593 //  ���C���p�l���E�C���h�E�֘A
2594 //
2595 //
2596 //
2597 //
2598 //
2599 //
2600 //
2601 
2602 #define MPANEL_XMAX 440
2603 #define MPANEL_YMAX 88
2604 
2605 // update flag.
2606 #define MP_UPDATE_ALL		0xffffL
2607 #define MP_UPDATE_NONE		0x0000L
2608 #define MP_UPDATE_TITLE		0x0001L
2609 #define MP_UPDATE_FILE		0x0002L
2610 #define MP_UPDATE_TIME			0x0004L
2611 #define MP_UPDATE_METRONOME		0x0008L
2612 #define MP_UPDATE_VOICES		0x0010L
2613 #define MP_UPDATE_MVOLUME		0x0020L
2614 #define MP_UPDATE_RATE			0x0040L
2615 #define MP_UPDATE_PLAYLIST		0x0080L
2616 #define MP_UPDATE_MISC		0x0200L
2617 #define MP_UPDATE_MESSAGE	0x0400L
2618 #define MP_UPDATE_BACKGROUND	0x0800L
2619 #define MP_UPDATE_KEYSIG		0x1000L
2620 #define MP_UPDATE_TEMPO			0x2000L
2621 
2622 #define MP_TITLE_MAX	256
2623 #define MP_FILE_MAX		256
2624 struct MPanel_ {
2625 	HWND hwnd;
2626 	HWND hParentWnd;
2627 	HDC hdc;
2628    HDC hmdc;
2629 	HGDIOBJ hgdiobj_hmdcprev;
2630 	HBITMAP hbitmap;
2631 	HBITMAP hbitmapBG;			/* the background bitmap */
2632 	HBITMAP hbitmapBGFilter;	/* the background bitmap filter */
2633 	HFONT hfont;
2634 	char Font[256];
2635 	char FontLang[256];
2636 	char FontLangFixed[256];
2637 	RECT rcMe;
2638 	RECT rcTitle;
2639 	RECT rcFile;
2640 	RECT rcTime;
2641 	RECT rcVoices;
2642 	RECT rcMVolume;
2643 	RECT rcRate;
2644 	RECT rcMetronome;
2645 	RECT rcKeysig;
2646 	RECT rcTempo;
2647 	RECT rcList;
2648 	RECT rcMisc;
2649 	RECT rcMessage;
2650 	char Title[MP_TITLE_MAX+1];
2651 	char File[MP_FILE_MAX+1];
2652 	int CurTime_h; int CurTime_m; int CurTime_s; int CurTime_ss;
2653 	int TotalTime_h; int TotalTime_m; int TotalTime_s; int TotalTime_ss;
2654 	int CurVoices;
2655 	int MaxVoices;
2656    int MVolume;
2657 	int Rate;
2658 	int Meas;
2659 	int Beat;
2660 	char Keysig[7];
2661 	int Key_offset;
2662 	int Tempo;
2663 	int Tempo_ratio;
2664 	int PlaylistNum;
2665 	int PlaylistMax;
2666 	HFONT hFontTitle;
2667 	HFONT hFontFile;
2668 	HFONT hFontTime;
2669 	HFONT hFontVoices;
2670 	HFONT hFontMVolume;
2671 	HFONT hFontRate;
2672 	HFONT hFontMetronome;
2673 	HFONT hFontKeysig;
2674 	HFONT hFontTempo;
2675 	HFONT hFontList;
2676 	HFONT hFontMisc;
2677 	HFONT hFontMessage;
2678 	long UpdateFlag;
2679 	COLORREF FGColor;
2680 	COLORREF BGColor;
2681 	COLORREF BGBGColor;
2682 	enum play_system_modes play_system_mode;
2683 	int current_file_info_file_type;
2684 	int current_file_info_max_channel;
2685 } MPanel;
2686 extern volatile int MPanelOK;
2687 
2688 static struct MPanelMessageData_ {
2689 	int len;	// ���b�Z�[�W�{�b�N�X�̒����B
2690 	char buff[1024];	// ���o�b�t�@�B
2691 	DWORD prevtime;
2692 	int msec;	// ���c��b�B
2693 	int pointer;		// ���݂̃|�C���^�B
2694 
2695 	char curbuff[1024];
2696 	int curbuffsize;
2697 	int curmode;	// ���݃��b�Z�[�W�̃��[�h�B
2698 	int curmsec;		// ���݃��b�Z�[�W�̎c��b�B
2699 	char nextbuff[1024];
2700 	int nextmode;	// ���݃��b�Z�[�W�̃��[�h�B
2701 	int nextmsec;		// ���݃��b�Z�[�W�̎c��b�B
2702 } MPanelMessageData;
2703 void MPanelMessageInit(void);
2704 void MPanelMessageAdd(char *message, int msec, int mode);
2705 void MPanelMessageClearAll(void);
2706 void MPanelMessageClear(void);
2707 void MPanelMessageNext(void);
2708 void MPanelMessageUpdate(void);
2709 
2710 static HWND hPanelWnd;
2711 static char PanelWndClassName[] = "TiMidity Main Panel";
2712 static LRESULT CALLBACK PanelWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam);
2713 int MPanelMode = 0;
2714 
InitPanelWnd(HWND hwnd)2715 static void InitPanelWnd(HWND hwnd)
2716 {
2717 	WNDCLASS wndclass ;
2718 	hPanelWnd = 0;
2719 	wndclass.style         = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_CLASSDC;
2720 	wndclass.lpfnWndProc   = PanelWndProc ;
2721 	wndclass.cbClsExtra    = 0 ;
2722 	wndclass.cbWndExtra    = 0 ;
2723 	wndclass.hInstance     = hInst ;
2724 	wndclass.hIcon         = NULL;
2725 	wndclass.hCursor       = LoadCursor(0,IDC_ARROW) ;
2726 	wndclass.hbrBackground = (HBRUSH)(COLOR_SCROLLBAR + 1);
2727 	wndclass.lpszMenuName  = NULL;
2728 	wndclass.lpszClassName = PanelWndClassName;
2729 	RegisterClass(&wndclass);
2730   	hPanelWnd =
2731   	CreateWindowEx(0,PanelWndClassName,0,WS_CHILD,
2732     	CW_USEDEFAULT,0,MPANEL_XMAX,MPANEL_YMAX,
2733       GetDlgItem(hwnd,IDC_RECT_PANEL),0,hInst,0);
2734 	MPanelInit(hPanelWnd);
2735 	MPanelReset();
2736 	MPanelReadPanelInfo(1);
2737 	MPanelUpdateAll();
2738   	MPanelPaintAll();
2739 	UpdateWindow(hPanelWnd);
2740 	ShowWindow(hPanelWnd,SW_SHOW);
2741 }
2742 
2743 static void MPanelPaintDo(void);
2744 static LRESULT CALLBACK
PanelWndProc(HWND hwnd,UINT uMess,WPARAM wParam,LPARAM lParam)2745 PanelWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam)
2746 {
2747 	switch (uMess)
2748 	{
2749 		case WM_CREATE:
2750 			break;
2751 		case WM_PAINT:
2752       	MPanelPaintDo();
2753 	    	return 0;
2754 		case WM_LBUTTONDBLCLK:
2755 //			MPanelReset();
2756 		  	MPanelReadPanelInfo(1);
2757 			MPanelUpdateAll();
2758 		  	MPanelPaintAll();
2759 			break;
2760 		case WM_DESTROY:
2761 			if(MPanel.hFontTitle!=NULL)
2762 				DeleteObject(MPanel.hFontTitle);
2763 			if(MPanel.hFontFile!=NULL)
2764 				DeleteObject(MPanel.hFontFile);
2765 			if(MPanel.hFontTime!=NULL)
2766 				DeleteObject(MPanel.hFontTime);
2767 			if(MPanel.hFontVoices!=NULL)
2768 				DeleteObject(MPanel.hFontVoices);
2769 			if(MPanel.hFontMVolume!=NULL)
2770 				DeleteObject(MPanel.hFontMVolume);
2771 			if(MPanel.hFontRate!=NULL)
2772 				DeleteObject(MPanel.hFontRate);
2773 			if (MPanel.hFontMetronome != NULL)
2774 				DeleteObject(MPanel.hFontMetronome);
2775 			if (MPanel.hFontKeysig != NULL)
2776 				DeleteObject(MPanel.hFontKeysig);
2777 			if (MPanel.hFontTempo != NULL)
2778 				DeleteObject(MPanel.hFontTempo);
2779 			if(MPanel.hFontList!=NULL)
2780 				DeleteObject(MPanel.hFontList);
2781 			if(MPanel.hFontMisc!=NULL)
2782 				DeleteObject(MPanel.hFontMisc);
2783 			if(MPanel.hFontMessage!=NULL)
2784 				DeleteObject(MPanel.hFontMessage);
2785 			break;
2786 		default:
2787 			return DefWindowProc(hwnd,uMess,wParam,lParam) ;
2788 	}
2789 	return 0L;
2790 }
2791 
2792 // Initialization of MPanel strucuter at once.
2793 volatile int MPanelOK = 0;
MPanelInit(HWND hwnd)2794 static void MPanelInit(HWND hwnd)
2795 {
2796 	RECT rc;
2797 	int tmp;
2798 	GDI_LOCK(); // gdi_lock
2799 	MPanel.hwnd = hwnd;
2800 	MPanel.hParentWnd = GetParent(MPanel.hwnd);
2801 	GetClientRect(MPanel.hParentWnd,&rc);
2802 	MoveWindow(MPanel.hwnd,0,0,rc.right-rc.left,rc.bottom-rc.top,FALSE);
2803 	MPanel.hdc = GetDC(MPanel.hwnd);
2804 	MPanel.hbitmap =
2805   		CreateCompatibleBitmap(MPanel.hdc,MPANEL_XMAX,MPANEL_YMAX);
2806 	MPanel.hmdc =
2807     	CreateCompatibleDC(MPanel.hdc);
2808 	MPanel.hgdiobj_hmdcprev = SelectObject(MPanel.hmdc,MPanel.hbitmap);
2809 	ReleaseDC(MPanel.hwnd,MPanel.hdc);
2810 
2811 	GetClientRect(MPanel.hwnd,&rc);
2812 	// RECT reft,top,right,bottom
2813 	SetRect(&(MPanel.rcMe),rc.left,rc.top,rc.right,rc.bottom);
2814 	rc = MPanel.rcMe;
2815 	SetRect(&(MPanel.rcTitle),	rc.left+2,	rc.top+2,				rc.right-2,				rc.top+2+14);
2816 	SetRect(&(MPanel.rcFile),	rc.left+2,	rc.top+2+14+1,		rc.right-2,				rc.top+2+14+1+12);
2817 #if 0
2818 	SetRect(&(MPanel.rcTime),	rc.left+2,	rc.top+2+14+1+12+1,	rc.left+2+180,		rc.top+2+14+1+12+1+25);
2819 	SetRect(&(MPanel.rcVoices), rc.right-2-36-1-24-48,	rc.top+2+14+1+12+1,	rc.right-2-36-1-24,	rc.top+2+14+1+12+1+12);
2820 	SetRect(&(MPanel.rcMVolume),rc.right-2-36,			rc.top+2+14+1+12+1,	rc.right-2,				rc.top+2+14+1+12+1+12);
2821 	SetRect(&(MPanel.rcRate), 	rc.right-2-60-1-18-48,	rc.top+2+14+1+12+1+12+1,	rc.right-2-36-1,	rc.top+2+14+1+12+1+12+1+12);
2822 	SetRect(&(MPanel.rcList),	rc.right-2-60,				rc.top+2+14+1+12+1+12+1,	rc.right-2,				rc.top+2+14+1+12+1+12+1+12);
2823 	SetRect(&(MPanel.rcMisc),	rc.left+2,	rc.top+2+14+1+12+1+25+1,rc.right-2,rc.top+2+14+1+12+1+25+1+12);
2824 	SetRect(&(MPanel.rcMessage),rc.left,rc.top,rc.right,rc.bottom);
2825 #else
2826 	SetRect(&(MPanel.rcTime),
2827 			rc.left + 2,
2828 			rc.top + 2 + 14 + 1 + 12 + 1,
2829 			rc.left + 2 + 176,
2830 			rc.top + 2 + 14 + 1 + 12 + 1 + 25);
2831 	SetRect(&(MPanel.rcVoices),
2832 			rc.left + 2 + 176 + 2,
2833 			rc.top + 2 + 14 + 1 + 12 + 1,
2834 			rc.left + 2 + 176 + 2 + 50,
2835 			rc.top + 2 + 14 + 1 + 12 + 1 + 12);
2836 	SetRect(&(MPanel.rcRate),
2837 			rc.left + 2 + 176 + 2 + 50 + 2,
2838 			rc.top + 2 + 14 + 1 + 12 + 1,
2839 			rc.right - 2 - 38 - 2,
2840 			rc.top + 2 + 14 + 1 + 12 + 1 + 12);
2841 	SetRect(&(MPanel.rcMVolume),
2842 			rc.right - 2 - 38,
2843 			rc.top + 2 + 14 + 1 + 12 + 1,
2844 			rc.right - 2,
2845 			rc.top + 2 + 14 + 1 + 12 + 1 + 12);
2846 	SetRect(&(MPanel.rcMetronome),
2847 			rc.left + 2 + 176 - 40,
2848 			rc.top + 2 + 14 + 1 + 12 + 1 + 12 + 1 + 12 + 1,
2849 			rc.left + 2 + 176,
2850 			rc.top + 2 + 14 + 1 + 12 + 1 + 12 + 1 + 12 + 1 + 12);
2851 	SetRect(&(MPanel.rcKeysig),
2852 			rc.left + 2 + 176 + 2,
2853 			rc.top + 2 + 14 + 1 + 12 + 1 + 12 + 1,
2854 			rc.right - 2 - 69 - 2,
2855 			rc.top + 2 + 14 + 1 + 12 + 1 + 12 + 1 + 12);
2856 	SetRect(&(MPanel.rcTempo),
2857 			rc.right - 2 - 69,
2858 			rc.top + 2 + 14 + 1 + 12 + 1 + 12 + 1,
2859 			rc.right - 2,
2860 			rc.top + 2 + 14 + 1 + 12 + 1 + 12 + 1 + 12);
2861 	SetRect(&(MPanel.rcMisc),
2862 			rc.left + 2 + 176 + 2,
2863 			rc.top + 2 + 14 + 1 + 12 + 1 + 12 + 1 + 12 + 1,
2864 			rc.right - 2 - 54 - 2,
2865 			rc.top + 2 + 14 + 1 + 12 + 1 + 12 + 1 + 12 + 1 + 12);
2866 	SetRect(&(MPanel.rcList),
2867 			rc.right - 2 - 54,
2868 			rc.top + 2 + 14 + 1 + 12 + 1 + 12 + 1 + 12 + 1,
2869 			rc.right - 2,
2870 			rc.top + 2 + 14 + 1 + 12 + 1 + 12 + 1 + 12 + 1 + 12);
2871 	SetRect(&(MPanel.rcMessage),
2872 			rc.left + 2,
2873 			rc.top + 2 + 14 + 1 + 12 + 1 + 25 + 1,
2874 			rc.left + 2 + 176 - 40 - 2,
2875 			rc.top + 2 + 14 + 1 + 12 + 1 + 25 + 1 + 12);
2876 #endif
2877 	MPanel.hFontTitle = NULL;
2878 	MPanel.hFontFile = NULL;
2879 	MPanel.hFontTime = NULL;
2880 	MPanel.hFontVoices = NULL;
2881 	MPanel.hFontMVolume = NULL;
2882 	MPanel.hFontRate = NULL;
2883 	MPanel.hFontMetronome = NULL;
2884 	MPanel.hFontKeysig = NULL;
2885 	MPanel.hFontTempo = NULL;
2886 	MPanel.hFontList = NULL;
2887 //	strcpy(MPanel.Font,"Times New Roman");
2888 	strcpy(MPanel.Font,"Arial Bold");
2889 	switch(PlayerLanguage){
2890    case LANGUAGE_ENGLISH:
2891 		strcpy(MPanel.FontLang,"Times New Roman");
2892 		strcpy(MPanel.FontLangFixed,"Times New Roman");
2893      	break;
2894 	default:
2895 	case LANGUAGE_JAPANESE:
2896 		strcpy(MPanel.FontLang,"�l�r �o����");
2897 		strcpy(MPanel.FontLangFixed,"�l�r ����");
2898 		break;
2899 	}
2900 	rc = MPanel.rcTitle;
2901 	MPanel.hFontTitle =
2902 		CreateFont(rc.bottom-rc.top+1,0,0,0,FW_DONTCARE,FALSE,FALSE,FALSE,
2903 			DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
2904       	DEFAULT_PITCH | FF_DONTCARE,MPanel.FontLang);
2905 	rc = MPanel.rcFile;
2906 	MPanel.hFontFile =
2907 		CreateFont(rc.bottom-rc.top+1,0,0,0,FW_DONTCARE,FALSE,FALSE,FALSE,
2908 			DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
2909       	DEFAULT_PITCH | FF_DONTCARE,MPanel.FontLang);
2910 	rc = MPanel.rcTime;
2911 	MPanel.hFontTime =
2912 		CreateFont(24,0,0,0,FW_DONTCARE,FALSE,FALSE,FALSE,
2913 			DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
2914       	DEFAULT_PITCH | FF_DONTCARE,MPanel.Font);
2915 	rc = MPanel.rcVoices;
2916 	MPanel.hFontVoices =
2917 		CreateFont(rc.bottom-rc.top+1,0,0,0,FW_DONTCARE,FALSE,FALSE,FALSE,
2918 			DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
2919       	DEFAULT_PITCH | FF_DONTCARE,MPanel.Font);
2920 	rc = MPanel.rcMVolume;
2921 	MPanel.hFontMVolume =
2922 		CreateFont(rc.bottom-rc.top+1,0,0,0,FW_DONTCARE,FALSE,FALSE,FALSE,
2923 			DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
2924       	DEFAULT_PITCH | FF_DONTCARE,MPanel.Font);
2925 	rc = MPanel.rcRate;
2926 	MPanel.hFontRate =
2927 		CreateFont(rc.bottom-rc.top+1,0,0,0,FW_DONTCARE,FALSE,FALSE,FALSE,
2928 			DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
2929       	DEFAULT_PITCH | FF_DONTCARE,MPanel.Font);
2930 	rc = MPanel.rcMetronome;
2931 	MPanel.hFontMetronome =
2932 			CreateFont(rc.bottom - rc.top + 1, 0, 0, 0, FW_DONTCARE,
2933 			FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
2934 			CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
2935 			DEFAULT_PITCH | FF_DONTCARE, MPanel.Font);
2936 	rc = MPanel.rcKeysig;
2937 	tmp = (rc.bottom - rc.top + 1) / 2;
2938 	MPanel.hFontKeysig =
2939 			CreateFont(tmp * 2, tmp, 0, 0, FW_DONTCARE,
2940 			FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
2941 			CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
2942 			FIXED_PITCH | FF_DONTCARE, MPanel.Font);
2943 	rc = MPanel.rcTempo;
2944 	tmp = (rc.bottom - rc.top + 1) / 2;
2945 	MPanel.hFontTempo =
2946 			CreateFont(tmp * 2, tmp, 0, 0, FW_DONTCARE,
2947 			FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
2948 			CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
2949 			FIXED_PITCH | FF_DONTCARE, MPanel.Font);
2950 	rc = MPanel.rcList;
2951 	MPanel.hFontList =
2952 		CreateFont(rc.bottom-rc.top+1,0,0,0,FW_DONTCARE,FALSE,FALSE,FALSE,
2953 			DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
2954       	DEFAULT_PITCH | FF_DONTCARE,MPanel.Font);
2955 	rc = MPanel.rcMisc;
2956 	tmp = (rc.bottom-rc.top+1)/2;
2957 	MPanel.hFontMisc =
2958 		CreateFont(tmp*2,tmp,0,0,FW_DONTCARE,FALSE,FALSE,FALSE,
2959 			DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
2960       	FIXED_PITCH | FF_DONTCARE,MPanel.Font);
2961 	rc = MPanel.rcMessage;
2962 	tmp = (rc.bottom-rc.top+1)/2;
2963 	MPanel.hFontMessage =
2964 		CreateFont(tmp*2,tmp,0,0,FW_DONTCARE,FALSE,FALSE,FALSE,
2965 			DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
2966       	FIXED_PITCH | FF_DONTCARE,MPanel.FontLangFixed);
2967 	MPanelOK = 1;
2968 	GDI_UNLOCK(); // gdi_lock
2969 	MPanelMessageInit();
2970 }
2971 
2972 // �p�l���\���̂����Z�b�g����B
MPanelReset(void)2973 void MPanelReset(void)
2974 {
2975 	if(!MPanelOK)
2976 		return;
2977 	MPanel.Title[0] = '\0';
2978 	MPanel.File[0] = '\0';
2979 	strcpy(MPanel.Title,"No title.");
2980 	strcpy(MPanel.File,"No file.");
2981 	MPanel.CurTime_h = 0;
2982 	MPanel.CurTime_m = 0;
2983 	MPanel.CurTime_s = 0;
2984 	MPanel.CurTime_ss = 0;
2985 	MPanel.TotalTime_h = 0;
2986 	MPanel.TotalTime_m = 0;
2987 	MPanel.TotalTime_s = 0;
2988 	MPanel.TotalTime_ss = 0;
2989 	MPanel.CurVoices = 0;
2990 	MPanel.MaxVoices = 0;
2991 	MPanel.MVolume = 0;
2992 	MPanel.Rate = 0;
2993 	MPanel.Meas = 0;
2994 	MPanel.Beat = 0;
2995 	MPanel.Keysig[0] = '\0';
2996 	MPanel.Key_offset = 0;
2997 	MPanel.Tempo = 0;
2998 	MPanel.Tempo_ratio = 0;
2999 	MPanel.PlaylistNum = 0;
3000 	MPanel.PlaylistMax = 0;
3001 	MPanel.UpdateFlag = MP_UPDATE_ALL;
3002 //	MPanel.FGColor = RGB(0x00,0x00,0x00);
3003 //	MPanel.BGColor = RGB(0xff,0xff,0xff);
3004 	MPanel.FGColor = RGB(0x00,0x00,0x00);
3005 //	MPanel.BGColor = RGB(0xc0,0xc0,0xc0);
3006 	MPanel.BGColor = RGB(0xc0,0xc5,0xc3);
3007 	MPanel.BGBGColor = RGB(0x60,0x60,0x60);
3008 #if 0
3009 	if(MPanel.hFontTitle!=NULL)
3010    	DeleteObject(MPanel.hFontTitle);
3011 	if(MPanel.hFontFile!=NULL)
3012    	DeleteObject(MPanel.hFontFile);
3013 	if(MPanel.hFontTime!=NULL)
3014    	DeleteObject(MPanel.hFontTime);
3015 	if(MPanel.hFontVoices!=NULL)
3016    	DeleteObject(MPanel.hFontVoices);
3017 	if(MPanel.hFontMVolume!=NULL)
3018    	DeleteObject(MPanel.hFontMVolume);
3019 	if(MPanel.hFontRate!=NULL)
3020    	DeleteObject(MPanel.hFontRate);
3021 	if (MPanel.hFontMetronome != NULL)
3022 		DeleteObject(MPanel.hFontMetronome);
3023 	if (MPanel.hFontKeysig != NULL)
3024 		DeleteObject(MPanel.hFontKeysig);
3025 	if (MPanel.hFontTempo != NULL)
3026 		DeleteObject(MPanel.hFontTempo);
3027 	if(MPanel.hFontList!=NULL)
3028    	DeleteObject(MPanel.hFontList);
3029 #endif
3030 	MPanel.play_system_mode = DEFAULT_SYSTEM_MODE;
3031 	MPanel.current_file_info_file_type = IS_OTHER_FILE;
3032 	MPanel.current_file_info_max_channel = -1;
3033 	MPanelMessageClearAll();
3034 }
3035 
3036 // �p�l���\���̂����ɍX�V����B
MPanelUpdate(void)3037 void MPanelUpdate(void)
3038 {
3039 	if(!MPanelOK)
3040 		return;
3041 	MPanelMessageUpdate();
3042 	if(MPanel.UpdateFlag==MP_UPDATE_NONE)
3043 	   	return;
3044 	if(MPanel.UpdateFlag & MP_UPDATE_BACKGROUND){
3045 		// �r�b�g�}�b�v��\��t���邪���͓h��‚Ԃ��B
3046 		HPEN hPen;
3047       HBRUSH hBrush;
3048 //		COLORREF color = MPanel.FGColor;
3049 		COLORREF color = MPanel.BGBGColor;
3050 		RECT rc = MPanel.rcMe;
3051 		HGDIOBJ hgdiobj_hpen, hgdiobj_hbrush;
3052 		GDI_LOCK(); // gdi_lock
3053 		hPen = CreatePen(PS_SOLID,1,color);
3054 		hBrush = CreateSolidBrush(color);
3055 		hgdiobj_hpen = SelectObject(MPanel.hmdc, hPen);
3056 		hgdiobj_hbrush = SelectObject(MPanel.hmdc, hBrush);
3057 		Rectangle(MPanel.hmdc,rc.left,rc.top,rc.right,rc.bottom);
3058 		SelectObject(MPanel.hmdc, hgdiobj_hpen);
3059 		DeleteObject(hPen);
3060 		SelectObject(MPanel.hmdc, hgdiobj_hbrush);
3061 		DeleteObject(hBrush);
3062 		GDI_UNLOCK(); // gdi_lock
3063 		InvalidateRect(MPanel.hwnd,&rc, FALSE);
3064    }
3065 	if(MPanel.UpdateFlag & MP_UPDATE_TITLE){
3066 		HGDIOBJ hgdiobj = SelectObject(MPanel.hmdc,MPanel.hFontTitle);
3067 		GDI_LOCK(); // gdi_lock
3068 		SetTextColor(MPanel.hmdc,MPanel.FGColor);
3069 		SetBkColor(MPanel.hmdc,MPanel.BGColor);
3070 	//#include "w32g2_c.h"
3071 	SetTextAlign(MPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP);
3072 		ExtTextOut(MPanel.hmdc,MPanel.rcTitle.left,MPanel.rcTitle.top,
3073     		ETO_CLIPPED	| ETO_OPAQUE,&(MPanel.rcTitle),
3074     		MPanel.Title,strlen(MPanel.Title),NULL);
3075 		if((HGDIOBJ)hgdiobj!=(HGDIOBJ)NULL && (HGDIOBJ)hgdiobj!=(HGDIOBJ)GDI_ERROR)
3076 			SelectObject(MPanel.hmdc,hgdiobj);
3077 		GDI_UNLOCK(); // gdi_lock
3078 		InvalidateRect(hPanelWnd, &(MPanel.rcTitle), FALSE);
3079 	}
3080 	if(MPanel.UpdateFlag & MP_UPDATE_FILE){
3081 		HGDIOBJ hgdiobj;
3082 		GDI_LOCK(); // gdi_lock
3083 		hgdiobj = SelectObject(MPanel.hmdc,MPanel.hFontFile);
3084 		SetTextColor(MPanel.hmdc,MPanel.FGColor);
3085 		SetBkColor(MPanel.hmdc,MPanel.BGColor);
3086 		SetTextAlign(MPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP);
3087 		ExtTextOut(MPanel.hmdc,MPanel.rcFile.left,MPanel.rcFile.top,
3088     		ETO_CLIPPED	| ETO_OPAQUE,&(MPanel.rcFile),
3089     		MPanel.File,strlen(MPanel.File),NULL);
3090 		if((HGDIOBJ)hgdiobj!=(HGDIOBJ)NULL && (HGDIOBJ)hgdiobj!=(HGDIOBJ)GDI_ERROR)
3091 			SelectObject(MPanel.hmdc,hgdiobj);
3092 		GDI_UNLOCK(); // gdi_lock
3093 		InvalidateRect(hPanelWnd, &(MPanel.rcFile), FALSE);
3094    }
3095 	if(MPanel.UpdateFlag & MP_UPDATE_TIME){
3096 		char buffer[256];
3097 		HGDIOBJ hgdiobj;
3098 		GDI_LOCK(); // gdi_lock
3099 		hgdiobj = SelectObject(MPanel.hmdc,MPanel.hFontTime);
3100    	sprintf(buffer," %02d:%02d:%02d/%02d:%02d:%02d",
3101 			MPanel.CurTime_h,MPanel.CurTime_m,MPanel.CurTime_s,
3102     		MPanel.TotalTime_h,MPanel.TotalTime_m,MPanel.TotalTime_s);
3103 		SetTextColor(MPanel.hmdc,MPanel.FGColor);
3104 		SetBkColor(MPanel.hmdc,MPanel.BGColor);
3105 		SetTextAlign(MPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP);
3106 		ExtTextOut(MPanel.hmdc,MPanel.rcTime.left,MPanel.rcTime.top,
3107     		ETO_CLIPPED	| ETO_OPAQUE,&(MPanel.rcTime),
3108     		buffer,strlen(buffer),NULL);
3109 		if((HGDIOBJ)hgdiobj!=(HGDIOBJ)NULL && (HGDIOBJ)hgdiobj!=(HGDIOBJ)GDI_ERROR)
3110 			SelectObject(MPanel.hmdc,hgdiobj);
3111 		GDI_UNLOCK(); // gdi_lock
3112 		InvalidateRect(hPanelWnd, &(MPanel.rcTime), FALSE);
3113    }
3114 	if(MPanel.UpdateFlag & MP_UPDATE_VOICES){
3115 		char buffer[256];
3116 		HGDIOBJ hgdiobj;
3117 		GDI_LOCK(); // gdi_lock
3118 		hgdiobj = SelectObject(MPanel.hmdc,MPanel.hFontVoices);
3119    	sprintf(buffer," %03d/%03d",MPanel.CurVoices,MPanel.MaxVoices);
3120 		SetTextColor(MPanel.hmdc,MPanel.FGColor);
3121 		SetBkColor(MPanel.hmdc,MPanel.BGColor);
3122 		SetTextAlign(MPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP);
3123 		ExtTextOut(MPanel.hmdc,MPanel.rcVoices.left,MPanel.rcVoices.top,
3124     		ETO_CLIPPED	| ETO_OPAQUE,&(MPanel.rcVoices),
3125     		buffer,strlen(buffer),NULL);
3126 		if((HGDIOBJ)hgdiobj!=(HGDIOBJ)NULL && (HGDIOBJ)hgdiobj!=(HGDIOBJ)GDI_ERROR)
3127 			SelectObject(MPanel.hmdc,hgdiobj);
3128 		GDI_UNLOCK(); // gdi_lock
3129 		InvalidateRect(hPanelWnd, &(MPanel.rcVoices), FALSE);
3130    }
3131 	if(MPanel.UpdateFlag & MP_UPDATE_MVOLUME){
3132 		char buffer[256];
3133 		HGDIOBJ hgdiobj;
3134 		GDI_LOCK(); // gdi_lock
3135 		hgdiobj = SelectObject(MPanel.hmdc,MPanel.hFontVoices);
3136    	sprintf(buffer," %03d%%",MPanel.MVolume);
3137 		SetTextColor(MPanel.hmdc,MPanel.FGColor);
3138 		SetBkColor(MPanel.hmdc,MPanel.BGColor);
3139 		SetTextAlign(MPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP);
3140 		ExtTextOut(MPanel.hmdc,MPanel.rcMVolume.left,MPanel.rcMVolume.top,
3141     		ETO_CLIPPED	| ETO_OPAQUE,&(MPanel.rcMVolume),
3142     		buffer,strlen(buffer),NULL);
3143 		if((HGDIOBJ)hgdiobj!=(HGDIOBJ)NULL && (HGDIOBJ)hgdiobj!=(HGDIOBJ)GDI_ERROR)
3144 			SelectObject(MPanel.hmdc,hgdiobj);
3145 		GDI_UNLOCK(); // gdi_lock
3146 		InvalidateRect(hPanelWnd, &(MPanel.rcMVolume), FALSE);
3147    }
3148 	if(MPanel.UpdateFlag & MP_UPDATE_RATE){
3149 		char buffer[256];
3150 		HGDIOBJ hgdiobj;
3151 		GDI_LOCK(); // gdi_lock
3152 		hgdiobj = SelectObject(MPanel.hmdc,MPanel.hFontRate);
3153    	sprintf(buffer," %05dHz",MPanel.Rate);
3154 		SetTextColor(MPanel.hmdc,MPanel.FGColor);
3155 		SetBkColor(MPanel.hmdc,MPanel.BGColor);
3156 		SetTextAlign(MPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP);
3157 		ExtTextOut(MPanel.hmdc,MPanel.rcRate.left,MPanel.rcRate.top,
3158     		ETO_CLIPPED	| ETO_OPAQUE,&(MPanel.rcRate),
3159     		buffer,strlen(buffer),NULL);
3160 		if((HGDIOBJ)hgdiobj!=(HGDIOBJ)NULL && (HGDIOBJ)hgdiobj!=(HGDIOBJ)GDI_ERROR)
3161 			SelectObject(MPanel.hmdc,hgdiobj);
3162 		GDI_UNLOCK(); // gdi_lock
3163 		InvalidateRect(hPanelWnd, &(MPanel.rcRate), FALSE);
3164    }
3165 	if (MPanel.UpdateFlag & MP_UPDATE_METRONOME) {
3166 		char buffer[256];
3167 		HGDIOBJ hgdiobj;
3168 
3169 		GDI_LOCK(); // gdi_lock
3170 		hgdiobj = SelectObject(MPanel.hmdc, MPanel.hFontMetronome);
3171 		sprintf(buffer, " %03d.%02d", MPanel.Meas, MPanel.Beat);
3172 		SetTextColor(MPanel.hmdc, MPanel.FGColor);
3173 		SetBkColor(MPanel.hmdc, MPanel.BGColor);
3174 		SetTextAlign(MPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP);
3175 		ExtTextOut(MPanel.hmdc,
3176 				MPanel.rcMetronome.left, MPanel.rcMetronome.top,
3177 				ETO_CLIPPED | ETO_OPAQUE, &(MPanel.rcMetronome),
3178 				buffer, strlen(buffer), NULL);
3179 		if ((HGDIOBJ) hgdiobj != (HGDIOBJ) NULL
3180 				&& (HGDIOBJ) hgdiobj != (HGDIOBJ) GDI_ERROR)
3181 			SelectObject(MPanel.hmdc, hgdiobj);
3182 		GDI_UNLOCK(); // gdi_lock
3183 		InvalidateRect(hPanelWnd, &(MPanel.rcMetronome), FALSE);
3184 	}
3185 	if (MPanel.UpdateFlag & MP_UPDATE_KEYSIG) {
3186 		char buffer[256];
3187 		HGDIOBJ hgdiobj;
3188 
3189 		GDI_LOCK(); // gdi_lock
3190 		hgdiobj = SelectObject(MPanel.hmdc, MPanel.hFontKeysig);
3191 		if (MPanel.Keysig[0] == '\0')
3192 			strcpy(MPanel.Keysig, "-- ---");
3193 		sprintf(buffer, "%s (%+03d)", MPanel.Keysig, MPanel.Key_offset);
3194 		SetTextColor(MPanel.hmdc, MPanel.FGColor);
3195 		SetBkColor(MPanel.hmdc, MPanel.BGColor);
3196 		SetTextAlign(MPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP);
3197 		ExtTextOut(MPanel.hmdc,
3198 				MPanel.rcKeysig.left + 2, MPanel.rcKeysig.top,
3199 				ETO_CLIPPED | ETO_OPAQUE, &(MPanel.rcKeysig),
3200 				buffer, strlen(buffer), NULL);
3201 		if ((HGDIOBJ) hgdiobj != (HGDIOBJ) NULL
3202 				&& (HGDIOBJ) hgdiobj != (HGDIOBJ) GDI_ERROR)
3203 			SelectObject(MPanel.hmdc, hgdiobj);
3204 		GDI_UNLOCK(); // gdi_lock
3205 		InvalidateRect(hPanelWnd, &(MPanel.rcKeysig), FALSE);
3206 	}
3207 	if (MPanel.UpdateFlag & MP_UPDATE_TEMPO) {
3208 		char buffer[256];
3209 		HGDIOBJ hgdiobj;
3210 
3211 		GDI_LOCK(); // gdi_lock
3212 		hgdiobj = SelectObject(MPanel.hmdc, MPanel.hFontTempo);
3213 		sprintf(buffer, "%3d (%03d %%)", MPanel.Tempo, MPanel.Tempo_ratio);
3214 		SetTextColor(MPanel.hmdc, MPanel.FGColor);
3215 		SetBkColor(MPanel.hmdc, MPanel.BGColor);
3216 		SetTextAlign(MPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP);
3217 		ExtTextOut(MPanel.hmdc,
3218 				MPanel.rcTempo.left + 2, MPanel.rcTempo.top,
3219 				ETO_CLIPPED | ETO_OPAQUE, &(MPanel.rcTempo),
3220 				buffer, strlen(buffer), NULL);
3221 		if ((HGDIOBJ) hgdiobj != (HGDIOBJ) NULL
3222 				&& (HGDIOBJ) hgdiobj != (HGDIOBJ) GDI_ERROR)
3223 			SelectObject(MPanel.hmdc, hgdiobj);
3224 		GDI_UNLOCK(); // gdi_lock
3225 		InvalidateRect(hPanelWnd, &(MPanel.rcTempo), FALSE);
3226 	}
3227 	if(MPanel.UpdateFlag & MP_UPDATE_PLAYLIST){
3228 		char buffer[256];
3229 		HGDIOBJ hgdiobj;
3230 		GDI_LOCK(); // gdi_lock
3231 		hgdiobj = SelectObject(MPanel.hmdc,MPanel.hFontList);
3232    	sprintf(buffer," %04d/%04d",MPanel.PlaylistNum,MPanel.PlaylistMax);
3233 		SetTextColor(MPanel.hmdc,MPanel.FGColor);
3234 		SetBkColor(MPanel.hmdc,MPanel.BGColor);
3235 		SetTextAlign(MPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP);
3236 		ExtTextOut(MPanel.hmdc,MPanel.rcList.left,MPanel.rcList.top,
3237     		ETO_CLIPPED	| ETO_OPAQUE,&(MPanel.rcList),
3238     		buffer,strlen(buffer),NULL);
3239 		if((HGDIOBJ)hgdiobj!=(HGDIOBJ)NULL && (HGDIOBJ)hgdiobj!=(HGDIOBJ)GDI_ERROR)
3240 			SelectObject(MPanel.hmdc,hgdiobj);
3241 		GDI_UNLOCK(); // gdi_lock
3242 		InvalidateRect(hPanelWnd, &(MPanel.rcList), FALSE);
3243    }
3244 	if(MPanel.UpdateFlag & MP_UPDATE_MISC){
3245 		char buffer[256];
3246 		HGDIOBJ hgdiobj;
3247 		GDI_LOCK(); // gdi_lock
3248 		hgdiobj = SelectObject(MPanel.hmdc,MPanel.hFontMisc);
3249 		buffer[0] = '\0';
3250 		switch(MPanel.play_system_mode){
3251     	case GM_SYSTEM_MODE:
3252 			strcat(buffer,"[GM]");
3253 			break;
3254     	case GS_SYSTEM_MODE:
3255 			strcat(buffer,"[GS]");
3256 			break;
3257     	case XG_SYSTEM_MODE:
3258 			strcat(buffer,"[XG]");
3259 			break;
3260 		default:
3261       case DEFAULT_SYSTEM_MODE:
3262 			strcat(buffer,"[--]");
3263 			break;
3264 		}
3265 		switch(MPanel.current_file_info_file_type){
3266 		case  IS_SMF_FILE:
3267 			strcat(buffer,"[SMF]");
3268 			break;
3269 		case  IS_MCP_FILE:
3270 			strcat(buffer,"[MCP]");
3271 			break;
3272 		case  IS_RCP_FILE:
3273 			strcat(buffer,"[RCP]");
3274 			break;
3275 		case  IS_R36_FILE:
3276 			strcat(buffer,"[R36]");
3277 			break;
3278 		case  IS_G18_FILE:
3279 			strcat(buffer,"[G18]");
3280 			break;
3281 		case  IS_G36_FILE:
3282 			strcat(buffer,"[G36]");
3283 			break;
3284 		case  IS_SNG_FILE:
3285 			strcat(buffer,"[SNG]");
3286 			break;
3287 		case  IS_MM2_FILE:
3288 			strcat(buffer,"[MM2]");
3289 			break;
3290 		case  IS_MML_FILE:
3291 			strcat(buffer,"[MML]");
3292 			break;
3293 		case  IS_FM_FILE:
3294 			strcat(buffer,"[FM ]");
3295 			break;
3296 		case  IS_FPD_FILE:
3297 			strcat(buffer,"[FPD]");
3298 			break;
3299 		case  IS_MOD_FILE:
3300 			strcat(buffer,"[MOD]");
3301 			break;
3302 		case  IS_669_FILE:
3303 			strcat(buffer,"[669]");
3304 			break;
3305 		case  IS_MTM_FILE:
3306 			strcat(buffer,"[MTM]");
3307 			break;
3308 		case  IS_STM_FILE:
3309 			strcat(buffer,"[STM]");
3310 			break;
3311 		case  IS_S3M_FILE:
3312 			strcat(buffer,"[S3M]");
3313 			break;
3314 		case  IS_ULT_FILE:
3315 			strcat(buffer,"[ULT]");
3316 			break;
3317 		case  IS_XM_FILE:
3318 			strcat(buffer,"[XM ]");
3319 			break;
3320 		case  IS_FAR_FILE:
3321 			strcat(buffer,"[FAR]");
3322 			break;
3323 		case  IS_WOW_FILE:
3324 			strcat(buffer,"[WOW]");
3325 			break;
3326 		case  IS_OKT_FILE:
3327 			strcat(buffer,"[OKT]");
3328 			break;
3329 		case  IS_DMF_FILE:
3330 			strcat(buffer,"[DMF]");
3331 			break;
3332 		case  IS_MED_FILE:
3333 			strcat(buffer,"[MED]");
3334 			break;
3335 		case  IS_IT_FILE:
3336 			strcat(buffer,"[IT ]");
3337 			break;
3338 		case  IS_PTM_FILE:
3339 			strcat(buffer,"[PTM]");
3340 			break;
3341 		case  IS_MFI_FILE:
3342 			strcat(buffer,"[MFI]");
3343 			break;
3344 		default:
3345 		case  IS_OTHER_FILE:
3346 			strcat(buffer,"[---]");
3347 			break;
3348 		}
3349 		if(MPanel.current_file_info_max_channel>=0){
3350       	char local[16];
3351          sprintf(local,"[%02dch]",MPanel.current_file_info_max_channel+1);
3352 			strcat(buffer,local);
3353       }else
3354 			strcat(buffer,"[--ch]");
3355 		SetTextColor(MPanel.hmdc,MPanel.FGColor);
3356 		SetBkColor(MPanel.hmdc,MPanel.BGColor);
3357 		SetTextAlign(MPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP);
3358 		ExtTextOut(MPanel.hmdc,MPanel.rcMisc.left,MPanel.rcMisc.top,
3359     		ETO_CLIPPED	| ETO_OPAQUE,&(MPanel.rcMisc),
3360     		buffer,strlen(buffer),NULL);
3361 		if((HGDIOBJ)hgdiobj!=(HGDIOBJ)NULL && (HGDIOBJ)hgdiobj!=(HGDIOBJ)GDI_ERROR)
3362 			SelectObject(MPanel.hmdc,hgdiobj);
3363 		GDI_UNLOCK(); // gdi_lock
3364 		InvalidateRect(hPanelWnd, &(MPanel.rcMisc), FALSE);
3365    }
3366    if(MPanel.UpdateFlag & MP_UPDATE_MESSAGE){
3367 		HGDIOBJ hgdiobj;
3368 		GDI_LOCK(); // gdi_lock
3369 		hgdiobj = SelectObject(MPanel.hmdc,MPanel.hFontMessage);
3370 		SetTextColor(MPanel.hmdc,MPanel.FGColor);
3371 		SetBkColor(MPanel.hmdc,MPanel.BGColor);
3372 		SetTextAlign(MPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP);
3373 		switch ( MPanelMessageData.curmode ) {
3374 		case 0:
3375 			ExtTextOut(MPanel.hmdc,MPanel.rcMessage.left,MPanel.rcMessage.top,
3376 				ETO_CLIPPED	| ETO_OPAQUE,&(MPanel.rcMessage),
3377     			MPanelMessageData.buff,strlen(MPanelMessageData.buff),NULL);
3378 		case 1:
3379 			ExtTextOut(MPanel.hmdc,MPanel.rcMessage.left,MPanel.rcMessage.top,
3380 				ETO_CLIPPED	| ETO_OPAQUE,&(MPanel.rcMessage),
3381     			MPanelMessageData.buff,strlen(MPanelMessageData.buff),NULL);
3382 //			ExtTextOut(MPanel.hmdc,MPanel.rcMessage.left-(MPanel.rcMessage.bottom-MPanel.rcMessage.top)*2,
3383 //				MPanel.rcMessage.top, ETO_CLIPPED	| ETO_OPAQUE,&(MPanel.rcMessage),
3384 //    			MPanelMessageData.buff,strlen(MPanelMessageData.buff),NULL);
3385 		case 2:
3386 			ExtTextOut(MPanel.hmdc,MPanel.rcMessage.left,MPanel.rcMessage.top,
3387 				ETO_CLIPPED	| ETO_OPAQUE,&(MPanel.rcMessage),
3388     			MPanelMessageData.buff,strlen(MPanelMessageData.buff),NULL);
3389 		case -1:
3390 		default:
3391 			ExtTextOut(MPanel.hmdc,MPanel.rcMessage.left,MPanel.rcMessage.top,
3392 				ETO_CLIPPED	| ETO_OPAQUE,&(MPanel.rcMessage),
3393     			MPanelMessageData.buff,strlen(MPanelMessageData.buff),NULL);
3394 		}
3395 		if((HGDIOBJ)hgdiobj!=(HGDIOBJ)NULL && (HGDIOBJ)hgdiobj!=(HGDIOBJ)GDI_ERROR)
3396 			SelectObject(MPanel.hmdc,hgdiobj);
3397 		GDI_UNLOCK(); // gdi_lock
3398 		InvalidateRect(hPanelWnd, &(MPanel.rcMessage), FALSE);
3399    }
3400 	if(MPanel.UpdateFlag==MP_UPDATE_ALL)
3401 		InvalidateRect(hPanelWnd, NULL, FALSE);
3402 	MPanel.UpdateFlag = MP_UPDATE_NONE;
3403 }
3404 
MPanelPaintDo(void)3405 static void MPanelPaintDo(void)
3406 {
3407 	RECT rc;
3408 	if ( GetUpdateRect(MPanel.hwnd, &rc, FALSE) ) {
3409 		PAINTSTRUCT ps;
3410 		HDC hdc;
3411 		GDI_LOCK(); // gdi_lock
3412 		hdc = BeginPaint(MPanel.hwnd, &ps);
3413 		BitBlt(hdc,rc.left,rc.top,rc.right,rc.bottom,MPanel.hmdc,rc.left,rc.top,SRCCOPY);
3414 		EndPaint(MPanel.hwnd, &ps);
3415 		GDI_UNLOCK(); // gdi_lock
3416 	}
3417 }
3418 
3419 // �`��
MPanelPaint(void)3420 void MPanelPaint(void)
3421 {
3422 	UpdateWindow(hPanelWnd);
3423 }
3424 
3425 // ���S�`��
MPanelPaintAll(void)3426 void MPanelPaintAll(void)
3427 {
3428 	InvalidateRect(hPanelWnd, NULL, FALSE);
3429 	MPanelPaint();
3430 }
3431 
3432 // �p�l���\���̂����Ɋ��S�X�V������B
MPanelUpdateAll(void)3433 void MPanelUpdateAll(void)
3434 {
3435 	if(!MPanelOK)
3436 		return;
3437 	MPanel.UpdateFlag = MP_UPDATE_ALL;
3438 	MPanelUpdate();
3439 }
3440 
3441 // PanelInfo �\���̂�ǂݍ���Ńp�l���\���̂֓K�p����B
3442 // flag �͋����X�V����B
MPanelReadPanelInfo(int flag)3443 void MPanelReadPanelInfo(int flag)
3444 {
3445 	int cur_pl_num, playlist_num;
3446 
3447 	if(!MPanelOK)
3448 		return;
3449 	if(!PInfoOK)
3450     	return;
3451 
3452 	if(!Panel->changed && !flag)
3453    	return;
3454 
3455 	if(flag
3456    	||	MPanel.CurTime_s != Panel->cur_time_s
3457 //    || MPanel.CurTime_ss != Panel->cur_time_ss
3458 		|| MPanel.CurTime_m != Panel->cur_time_m
3459 		|| MPanel.CurTime_h != Panel->cur_time_h
3460 		|| MPanel.TotalTime_s != Panel->total_time_s
3461 //		|| MPanel.TotalTime_ss != Panel->total_time_ss
3462 		|| MPanel.TotalTime_m != Panel->total_time_m
3463 		|| MPanel.TotalTime_h != Panel->total_time_h
3464 	){
3465 		MPanel.CurTime_h = Panel->cur_time_h;
3466 		MPanel.CurTime_m = Panel->cur_time_m;
3467 		MPanel.CurTime_s = Panel->cur_time_s;
3468 		MPanel.CurTime_ss = Panel->cur_time_ss;
3469 		MPanel.TotalTime_h = Panel->total_time_h;
3470 		MPanel.TotalTime_m = Panel->total_time_m;
3471 		MPanel.TotalTime_s = Panel->total_time_s;
3472 //		MPanel.TotalTime_ss = Panel->total_time_ss;
3473 		RANGE(MPanel.CurTime_h,0,99);
3474       RANGE(MPanel.TotalTime_h,0,99);
3475      	MPanel.UpdateFlag |=	MP_UPDATE_TIME;
3476 	}
3477 	if(flag || MPanel.MaxVoices != Panel->voices){
3478 		MPanel.MaxVoices = Panel->voices;
3479      	MPanel.UpdateFlag |=	MP_UPDATE_VOICES;
3480    }
3481 	if(flag || MPanel.CurVoices != Panel->cur_voices){
3482 		MPanel.CurVoices = Panel->cur_voices;
3483      	MPanel.UpdateFlag |=	MP_UPDATE_VOICES;
3484    }
3485 	if(flag || MPanel.MVolume != amplification){
3486 		MPanel.MVolume = amplification;
3487      	MPanel.UpdateFlag |=	MP_UPDATE_MVOLUME;
3488    }
3489 	if(flag || MPanel.Rate != play_mode->rate){
3490 		MPanel.Rate = play_mode->rate;
3491      	MPanel.UpdateFlag |=	MP_UPDATE_RATE;
3492    }
3493 	if (flag || MPanel.Meas != Panel->meas) {
3494 		MPanel.Meas = Panel->meas;
3495 		MPanel.UpdateFlag |= MP_UPDATE_METRONOME;
3496 	}
3497 	if (flag || MPanel.Beat != Panel->beat) {
3498 		MPanel.Beat = Panel->beat;
3499 		MPanel.UpdateFlag |= MP_UPDATE_METRONOME;
3500 	}
3501 	if (flag || MPanel.Keysig != Panel->keysig) {
3502 		strcpy(MPanel.Keysig, Panel->keysig);
3503 		MPanel.UpdateFlag |= MP_UPDATE_KEYSIG;
3504 	}
3505 	if (flag || MPanel.Key_offset != Panel->key_offset) {
3506 		MPanel.Key_offset = Panel->key_offset;
3507 		MPanel.UpdateFlag |= MP_UPDATE_KEYSIG;
3508 	}
3509 	if (flag || MPanel.Tempo != Panel->tempo) {
3510 		MPanel.Tempo = Panel->tempo;
3511 		MPanel.UpdateFlag |= MP_UPDATE_TEMPO;
3512 	}
3513 	if (flag || MPanel.Tempo_ratio != Panel->tempo_ratio) {
3514 		MPanel.Tempo_ratio = Panel->tempo_ratio;
3515 		MPanel.UpdateFlag |= MP_UPDATE_TEMPO;
3516 	}
3517 
3518 	w32g_get_playlist_index(&cur_pl_num, &playlist_num, NULL);
3519 	if(playlist_num > 0)
3520 		cur_pl_num++;
3521 	if(flag || MPanel.PlaylistNum != cur_pl_num){
3522 		MPanel.PlaylistNum = cur_pl_num;
3523      	MPanel.UpdateFlag |=	MP_UPDATE_PLAYLIST;
3524    }
3525 	if(flag || MPanel.PlaylistMax != playlist_num){
3526 		MPanel.PlaylistMax = playlist_num;
3527      	MPanel.UpdateFlag |=	MP_UPDATE_PLAYLIST;
3528    }
3529 	if(flag || MPanel.play_system_mode != play_system_mode){
3530 		MPanel.play_system_mode = play_system_mode;
3531      	MPanel.UpdateFlag |=	MP_UPDATE_MISC;
3532    }
3533 	if(current_file_info!=NULL){
3534 	if(flag || MPanel.current_file_info_file_type != current_file_info->file_type){
3535       MPanel.current_file_info_file_type = current_file_info->file_type;
3536      	MPanel.UpdateFlag |=	MP_UPDATE_MISC;
3537    }
3538 	if(flag || MPanel.current_file_info_max_channel != current_file_info->max_channel){
3539       MPanel.current_file_info_max_channel = current_file_info->max_channel;
3540      	MPanel.UpdateFlag |=	MP_UPDATE_MISC;
3541    }
3542    }
3543 }
3544 
MPanelStartLoad(char * filename)3545 void MPanelStartLoad(char *filename)
3546 {
3547     strncpy((char *)MPanel.File, filename, MP_FILE_MAX);
3548     MPanel.UpdateFlag |= MP_UPDATE_FILE;
3549     MPanelUpdate();
3550 }
3551 
MPanelMessageInit(void)3552 void MPanelMessageInit(void)
3553 {
3554 	int width = (MPanel.rcMessage.bottom - MPanel.rcMessage.top + 1) / 2;
3555 	MPanelMessageData.len = (MPanel.rcMessage.right - MPanel.rcMessage.left) / width;
3556 	MPanelMessageClearAll();
3557 }
3558 
3559 // sec �b�� message �����B
3560 // mode 0: sec �b���� message ��\���B�f�t�H���g�B
3561 // mode 1: sec �b�̊Ԃ� message ���E���獶�ɗ����B
3562 // mode 2: sec �b�̊Ԃ� messege ��\���B�|�C���^��������E�Ɉڂ��B�|�C���^�����E�ɐF��ς���B
MPanelMessageAdd(char * message,int msec,int mode)3563 void MPanelMessageAdd(char *message, int msec, int mode)
3564 {
3565 	if ( MPanelMessageData.nextmode >= 0 ) {
3566 		MPanelMessageNext();
3567 		strncpy(MPanelMessageData.nextbuff,message,sizeof(MPanelMessageData.nextbuff)-1);
3568 		MPanelMessageData.nextmode = mode;
3569 		MPanelMessageData.nextmsec = msec;
3570 	} else if ( MPanelMessageData.curmode >= 0 ){
3571 		strncpy(MPanelMessageData.nextbuff,message,sizeof(MPanelMessageData.nextbuff)-1);
3572 		MPanelMessageData.nextmode = mode;
3573 		MPanelMessageData.nextmsec = msec;
3574 	} else {
3575 		strncpy(MPanelMessageData.nextbuff,message,sizeof(MPanelMessageData.nextbuff)-1);
3576 		MPanelMessageData.nextmode = mode;
3577 		MPanelMessageData.nextmsec = msec;
3578 		MPanelMessageNext();
3579 	}
3580 }
MPanelMessageHaveMesssage(void)3581 int MPanelMessageHaveMesssage(void)
3582 {
3583 	if ( MPanelMessageData.curmode >= 0 || MPanelMessageData.nextmode >= 0 )
3584 		return 1;
3585 	else
3586 		return 0;
3587 }
MPanelMessageClearAll(void)3588 void MPanelMessageClearAll(void)
3589 {
3590 	MPanelMessageData.buff[0] = '\0';
3591 	MPanelMessageData.curmode = -1;
3592 	MPanelMessageData.nextmode = -1;
3593    	MPanel.UpdateFlag |= MP_UPDATE_MESSAGE;
3594 }
MPanelMessageClear(void)3595 void MPanelMessageClear(void)
3596 {
3597 	MPanelMessageData.buff[0] = '\0';
3598    	MPanel.UpdateFlag |= MP_UPDATE_MESSAGE;
3599 }
MPanelMessageNext(void)3600 void MPanelMessageNext(void)
3601 {
3602 	MPanelMessageClear();
3603 	if ( MPanelMessageData.nextmode >= 0 ) {
3604 		strcpy(MPanelMessageData.curbuff,MPanelMessageData.nextbuff);
3605 		MPanelMessageData.curbuffsize = strlen(MPanelMessageData.curbuff);
3606 		MPanelMessageData.curmode = MPanelMessageData.nextmode;
3607 		MPanelMessageData.curmsec = MPanelMessageData.nextmsec;
3608 		MPanelMessageData.pointer = -1;
3609 		MPanelMessageData.nextmode = -1;
3610 		MPanelMessageData.prevtime = -1;
3611 	} else {
3612 		MPanelMessageData.curmode = -1;
3613 		MPanelMessageData.prevtime = -1;
3614 	}
3615    	MPanel.UpdateFlag |= MP_UPDATE_MESSAGE;
3616 }
MPanelMessageUpdate(void)3617 void MPanelMessageUpdate(void)
3618 {
3619 //	DWORD curtime = GetCurrentTime();
3620 	DWORD curtime = 0;
3621 	int pointer;
3622 
3623 	if ( MPanelMessageData.curmode >= 0 ) {
3624 		curtime += Panel->cur_time_h;
3625 		curtime *= 24;
3626 		curtime += Panel->cur_time_m;
3627 		curtime *= 60;
3628 		curtime += Panel->cur_time_s;
3629 		curtime *= 1000;
3630 		curtime += Panel->cur_time_ss;
3631 	}
3632 	switch ( MPanelMessageData.curmode ) {
3633 	case 0:
3634 		if ( MPanelMessageData.prevtime == -1 ){
3635 			strcpy( MPanelMessageData.buff, MPanelMessageData.curbuff );
3636 			MPanelMessageData.prevtime = curtime;
3637 			MPanelMessageData.msec = MPanelMessageData.curmsec;
3638 	     	MPanel.UpdateFlag |= MP_UPDATE_MESSAGE;
3639 		} else {
3640 			MPanelMessageData.msec -= curtime - MPanelMessageData.prevtime;
3641 			MPanelMessageData.prevtime = curtime;
3642 		}
3643 		if ( MPanelMessageData.msec <= 0 || curtime < MPanelMessageData.prevtime ) {
3644 			MPanelMessageNext();
3645 			MPanelMessageUpdate();
3646 	     	MPanel.UpdateFlag |= MP_UPDATE_MESSAGE;
3647 			break;
3648 		}
3649 		break;
3650 	case 1:
3651 		if ( MPanelMessageData.prevtime == -1 ){
3652 			MPanelMessageData.prevtime = curtime;
3653 			MPanelMessageData.msec = MPanelMessageData.curmsec;
3654 	     	MPanel.UpdateFlag |= MP_UPDATE_MESSAGE;
3655 		} else {
3656 			MPanelMessageData.msec -= curtime - MPanelMessageData.prevtime;
3657 			MPanelMessageData.prevtime = curtime;
3658 		}
3659 		if ( MPanelMessageData.msec <= 0 || curtime < MPanelMessageData.prevtime ) {
3660 			MPanelMessageNext();
3661 			MPanelMessageUpdate();
3662 	     	MPanel.UpdateFlag |= MP_UPDATE_MESSAGE;
3663 			return;
3664 		}
3665 //		pointer = MPanelMessageData.len * 4 / 5 + ( MPanelMessageData.curmsec - MPanelMessageData.msec ) / 1000 * 2;
3666 		pointer = MPanelMessageData.len - 8 + ( MPanelMessageData.curmsec - MPanelMessageData.msec ) / 1000 * 2;
3667 		pointer = (int)( pointer / 2 ) * 2;
3668 		if ( MPanelMessageData.pointer != pointer ) {
3669 			int p = MPanelMessageData.len - pointer;
3670 			MPanelMessageData.buff[0] = '\0';
3671 			MPanelMessageData.pointer = pointer;
3672 			if ( p >= 0 ) {
3673 				memset( MPanelMessageData.buff, 0x20, p );
3674 				MPanelMessageData.buff[p] = '\0';
3675 				strcat( MPanelMessageData.buff, MPanelMessageData.curbuff);
3676 			} else if ( MPanelMessageData.curbuffsize + p > 0 ) {
3677 				strcpy( MPanelMessageData.buff, MPanelMessageData.curbuff - p);
3678 			} else {
3679 				MPanelMessageData.buff[0] = '\0';
3680 			}
3681 	     	MPanel.UpdateFlag |= MP_UPDATE_MESSAGE;
3682 		}
3683 		break;
3684 	case 2:
3685 		if ( MPanelMessageData.prevtime == -1 ){
3686 			strcpy( MPanelMessageData.buff, MPanelMessageData.curbuff );
3687 			MPanelMessageData.prevtime = curtime;
3688 			MPanelMessageData.msec = MPanelMessageData.curmsec;
3689 	     	MPanel.UpdateFlag |= MP_UPDATE_MESSAGE;
3690 		} else {
3691 			MPanelMessageData.msec -= curtime - MPanelMessageData.prevtime;
3692 			MPanelMessageData.prevtime = curtime;
3693 		}
3694 		if ( MPanelMessageData.msec <= 0 || curtime < MPanelMessageData.prevtime ) {
3695 			MPanelMessageNext();
3696 			MPanelMessageUpdate();
3697 	     	MPanel.UpdateFlag |= MP_UPDATE_MESSAGE;
3698 			break;
3699 		}
3700 		pointer = ( MPanelMessageData.len + MPanelMessageData.curbuffsize ) * ( MPanelMessageData.curmsec - MPanelMessageData.msec ) / MPanelMessageData.curmsec;
3701 		if ( MPanelMessageData.pointer != pointer ) {
3702 	     	MPanel.UpdateFlag |= MP_UPDATE_MESSAGE;
3703 		}
3704 		break;
3705 	case 3:
3706 		if ( MPanelMessageData.prevtime == -1 ){
3707 			MPanelMessageData.prevtime = curtime;
3708 			MPanelMessageData.msec = MPanelMessageData.curmsec;
3709 	     	MPanel.UpdateFlag |= MP_UPDATE_MESSAGE;
3710 		} else {
3711 			MPanelMessageData.msec -= curtime - MPanelMessageData.prevtime;
3712 			MPanelMessageData.prevtime = curtime;
3713 		}
3714 		if ( MPanelMessageData.msec <= 0 || curtime < MPanelMessageData.prevtime ) {
3715 			MPanelMessageNext();
3716 			MPanelMessageUpdate();
3717 	     	MPanel.UpdateFlag |= MP_UPDATE_MESSAGE;
3718 			return;
3719 		}
3720 		pointer = MPanelMessageData.len * 3 / 4 + ( MPanelMessageData.len / 4 + MPanelMessageData.curbuffsize ) * ( MPanelMessageData.curmsec - MPanelMessageData.msec ) / MPanelMessageData.curmsec;
3721 		pointer = ((int)(pointer / 2)) * 2;
3722 		if ( MPanelMessageData.pointer != pointer ) {
3723 			int p = MPanelMessageData.len - pointer;
3724 			MPanelMessageData.buff[0] = '\0';
3725 			MPanelMessageData.pointer = pointer;
3726 			if ( p >= 0 ) {
3727 				memset( MPanelMessageData.buff, 0x20, p );
3728 				MPanelMessageData.buff[p] = '\0';
3729 				strcat( MPanelMessageData.buff, MPanelMessageData.curbuff);
3730 			} else if ( MPanelMessageData.curbuffsize + p > 0 ) {
3731 				strcpy( MPanelMessageData.buff, MPanelMessageData.curbuff - p);
3732 			} else {
3733 				MPanelMessageData.buff[0] = '\0';
3734 			}
3735 	     	MPanel.UpdateFlag |= MP_UPDATE_MESSAGE;
3736 		}
3737 		break;
3738 	case 4:
3739 		if ( MPanelMessageData.prevtime == -1 ){
3740 			MPanelMessageData.prevtime = curtime;
3741 #define MPANELMESSAGE_MODE2_SLEEPMSEC 1000
3742 			if ( MPanelMessageData.curmsec < MPANELMESSAGE_MODE2_SLEEPMSEC * 2 ) {
3743 				MPanelMessageData.curmsec = MPANELMESSAGE_MODE2_SLEEPMSEC * 2;
3744 			}
3745 			MPanelMessageData.msec = MPanelMessageData.curmsec;
3746 	     	MPanel.UpdateFlag |= MP_UPDATE_MESSAGE;
3747 		} else {
3748 			MPanelMessageData.msec -= curtime - MPanelMessageData.prevtime;
3749 			MPanelMessageData.prevtime = curtime;
3750 		}
3751 		if ( MPanelMessageData.msec <= 0 || curtime < MPanelMessageData.prevtime ) {
3752 			MPanelMessageNext();
3753 			MPanelMessageUpdate();
3754 	     	MPanel.UpdateFlag |= MP_UPDATE_MESSAGE;
3755 			return;
3756 		}
3757 		if ( MPanelMessageData.curmsec - MPanelMessageData.msec <= MPANELMESSAGE_MODE2_SLEEPMSEC ) {
3758 			pointer = 0;
3759 		} else {
3760 			pointer = MPanelMessageData.curbuffsize * ( MPanelMessageData.curmsec - MPanelMessageData.msec - MPANELMESSAGE_MODE2_SLEEPMSEC ) / ( MPanelMessageData.curmsec - MPANELMESSAGE_MODE2_SLEEPMSEC );
3761 		}
3762 		pointer = ((int)(pointer / 2)) * 2;
3763 		if ( MPanelMessageData.pointer != pointer ) {
3764 			MPanelMessageData.buff[0] = '\0';
3765 			MPanelMessageData.pointer = pointer;
3766 			if ( pointer < MPanelMessageData.curbuffsize ) {
3767 				strcpy( MPanelMessageData.buff, MPanelMessageData.curbuff + pointer );
3768 			} else {
3769 				MPanelMessageData.buff[0] = '\0';
3770 			}
3771 	     	MPanel.UpdateFlag |= MP_UPDATE_MESSAGE;
3772 		}
3773 		break;
3774 	case -1:
3775 	default:
3776 //		MPanelMessageData.buff[0] = '\0';
3777 		break;
3778 	}
3779 }
3780 
3781 
3782 
3783 
3784 // ----------------------------------------------------------------------------
3785 // Misc. Controls
3786 
3787 
3788 
3789 
3790 
3791 
3792 
3793 
3794 
3795 
3796 
3797 // ----------------------------------------------------------------------------
3798 
3799 
3800 
3801 
3802 
3803 
3804 
3805 
3806 
3807 // ****************************************************************************
3808 // Version Window
3809 
VersionWnd(HWND hParentWnd)3810 static void VersionWnd(HWND hParentWnd)
3811 {
3812 	char VersionText[2024];
3813   sprintf(VersionText,
3814 "TiMidity++ %s%s" NLS NLS
3815 "TiMidity-0.2i by Tuukka Toivonen <tt@cgs.fi>." NLS
3816 "TiMidity Win32 version by Davide Moretti <dave@rimini.com>." NLS
3817 "TiMidity Windows 95 port by Nicolas Witczak." NLS
3818 "TiMidity Win32 GUI by Daisuke Aoki <dai@y7.net>." NLS
3819 " Japanese menu, dialog, etc by Saito <timidity@flashmail.com>." NLS
3820 "TiMidity++ by Masanao Izumo <iz@onicos.co.jp>." NLS
3821 ,(strcmp(timidity_version, "current")) ? "version " : "", timidity_version);
3822 	MessageBox(hParentWnd, VersionText, "Version", MB_OK);
3823 }
3824 
TiMidityWnd(HWND hParentWnd)3825 static void TiMidityWnd(HWND hParentWnd)
3826 {
3827 	char TiMidityText[2024];
3828   sprintf(TiMidityText,
3829 " TiMidity++ %s%s -- MIDI to WAVE converter and player" NLS
3830 " Copyright (C) 1999-2018 Masanao Izumo <iz@onicos.co.jp>" NLS
3831 " Copyright (C) 1995 Tuukka Toivonen <tt@cgs.fi>" NLS
3832 NLS
3833 " Win32 version by Davide Moretti <dmoretti@iper.net>" NLS
3834 " GUI by Daisuke Aoki <dai@y7.net>." NLS
3835 " Modified by Masanao Izumo <iz@onicos.co.jp>." NLS
3836 NLS
3837 " This program is free software; you can redistribute it and/or modify" NLS
3838 " it under the terms of the GNU General Public License as published by" NLS
3839 " the Free Software Foundation; either version 2 of the License, or" NLS
3840 " (at your option) any later version." NLS
3841 NLS
3842 " This program is distributed in the hope that it will be useful," NLS
3843 " but WITHOUT ANY WARRANTY; without even the implied warranty of"NLS
3844 " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the" NLS
3845 " GNU General Public License for more details." NLS
3846 NLS
3847 " You should have received a copy of the GNU General Public License" NLS
3848 " along with this program; if not, write to the Free Software" NLS
3849 " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA" NLS
3850 ,
3851 (strcmp(timidity_version, "current")) ? "version " : "", timidity_version
3852 	);
3853 	MessageBox(hParentWnd, TiMidityText, "TiMidity++", MB_OK);
3854 }
3855 
SupplementWnd(HWND hParentWnd)3856 static void SupplementWnd(HWND hParentWnd)
3857 {
3858 	char SupplementText[2024];
3859   sprintf(SupplementText,
3860 "GS is a registered trademark of Roland Corporation. " NLS
3861 "XG is a registered trademark of Yamaha Corporation. " NLS );
3862 	  MessageBox(hParentWnd, SupplementText, "Supplement", MB_OK);
3863 }
3864 
3865 
3866 // ****************************************************************************
3867 
3868 #ifdef W32GUI_DEBUG
TiMidityHeapCheck(void)3869 void TiMidityHeapCheck(void)
3870 {
3871 	HANDLE *ProcessHeaps = NULL;
3872    DWORD dwNumberOfHeaps;
3873 	DWORD dw = 10;
3874    int i;
3875    PrintfDebugWnd("\n[Heaps Check Start]\n");
3876 	if(GetProcessHeap()!=NULL)
3877    	if(HeapValidate(GetProcessHeap(),0,NULL)==TRUE)
3878    		PrintfDebugWnd("Process Heap is Valid\n");
3879      	else
3880    		PrintfDebugWnd("Process Heap is Invalid\n");
3881    ProcessHeaps = (HANDLE *)realloc(ProcessHeaps,sizeof(HANDLE)*dw);
3882    dwNumberOfHeaps = GetProcessHeaps(dw, ProcessHeaps);
3883    if(dw<dwNumberOfHeaps){
3884 		dw = dwNumberOfHeaps;
3885 	   ProcessHeaps = (HANDLE *)realloc(ProcessHeaps,sizeof(HANDLE)*dw);
3886    	dwNumberOfHeaps = GetProcessHeaps(dw, ProcessHeaps);
3887    }
3888    PrintfDebugWnd("NumberOfHeaps=%ld\n",(int)dwNumberOfHeaps);
3889 	for(i=0;i<(int)dwNumberOfHeaps;i++){
3890      	if(HeapValidate(ProcessHeaps[i],0,NULL)==TRUE)
3891     		PrintfDebugWnd("Heap %d is Valid\n",i+1);
3892       else
3893      		PrintfDebugWnd("Heap %d is Invalid\n",i+1);
3894    }
3895    PrintfDebugWnd("[Heaps Check End]\n\n");
3896 	free(ProcessHeaps);
3897 }
3898 #endif
3899 
TiMidityVariablesCheck(void)3900 void TiMidityVariablesCheck(void)
3901 {
3902 #if 0
3903 // player_status
3904 	PrintfDebugWnd("[player_status]\n");
3905 	PrintfDebugWnd("player_status=%ld\n",player_status);
3906 	switch(player_status){
3907 	case PLAYERSTATUS_NONE:
3908 	PrintfDebugWnd("player_status=PLAYERSTATUS_NONE\n");
3909 	break;
3910 	case PLAYERSTATUS_STOP:
3911 	PrintfDebugWnd("player_status=PLAYERSTATUS_STOP\n");
3912 	break;
3913 	case PLAYERSTATUS_PAUSE:
3914 	PrintfDebugWnd("player_status=PLAYERSTATUS_PAUSE\n");
3915 	break;
3916 	case PLAYERSTATUS_PLAY:
3917 	PrintfDebugWnd("player_status=PLAYERSTATUS_PLAY\n");
3918 	break;
3919 	case PLAYERSTATUS_PLAYSTART:
3920 	PrintfDebugWnd("player_status=PLAYERSTATUS_PLAYSTART\n");
3921 	break;
3922 	case PLAYERSTATUS_DEMANDPLAY:
3923 	PrintfDebugWnd("player_status=PLAYERSTATUS_DEMANDPLAY\n");
3924 	break;
3925 	case PLAYERSTATUS_PLAYEND:
3926 	PrintfDebugWnd("player_status=PLAYERSTATUS_PLAYEND\n");
3927 	break;
3928 	case PLAYERSTATUS_PLAYERROREND:
3929 	PrintfDebugWnd("player_status=PLAYERSTATUS_PLAYERROREND\n");
3930 	break;
3931 	case PLAYERSTATUS_QUIT:
3932 	PrintfDebugWnd("player_status=PLAYERSTATUS_QUIT\n");
3933 	break;
3934 	case PLAYERSTATUS_ERROR:
3935 	PrintfDebugWnd("player_status=PLAYERSTATUS_ERROR\n");
3936 	break;
3937 	case PLAYERSTATUS_FORCED_EXIT:
3938 	PrintfDebugWnd("player_status=PLAYERSTATUS_FORCED_EXIT\n");
3939 	break;
3940 	default:
3941    break;
3942    }
3943 #endif
3944 }
3945 
3946 
3947 
3948 
3949 // ****************************************************************************
3950 // Debug Window
3951 #ifdef W32GUI_DEBUG
3952 
3953 BOOL CALLBACK DebugWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam);
3954 void InitDebugEditWnd(HWND hParentWnd);
3955 
InitDebugWnd(HWND hParentWnd)3956 void InitDebugWnd(HWND hParentWnd)
3957 {
3958 	hDebugWnd = CreateDialog
3959   			(hInst,MAKEINTRESOURCE(IDD_DIALOG_DEBUG),hParentWnd,DebugWndProc);
3960 	ShowWindow(hDebugWnd,SW_HIDE);
3961 	UpdateWindow(hDebugWnd);
3962 }
3963 
3964 BOOL CALLBACK
DebugWndProc(HWND hwnd,UINT uMess,WPARAM wParam,LPARAM lParam)3965 DebugWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam)
3966 {
3967 	switch (uMess){
3968 		case WM_INITDIALOG:
3969 //			InitDebugEditWnd(hwnd);
3970 		hDebugEditWnd = GetDlgItem(hwnd,IDC_EDIT);
3971 		if(DebugWndFlag)
3972 			CheckDlgButton(hwnd, IDC_CHECKBOX_DEBUG_WND_VALID, 1);
3973       else
3974 			CheckDlgButton(hwnd, IDC_CHECKBOX_DEBUG_WND_VALID, 0);
3975 		TiMidityHeapCheck();
3976 			return FALSE;
3977 		case WM_DESTROY:
3978       	PostQuitMessage(0);
3979 			return 0;
3980     case WM_COMMAND:
3981     	switch (LOWORD(wParam)) {
3982       case IDCLOSE:
3983       	ShowWindow(hwnd, SW_HIDE);
3984          break;
3985       case IDCLEAR:
3986 			ClearDebugWnd();
3987          break;
3988 			case IDC_CHECKBOX_DEBUG_WND_VALID:
3989 				if(IsDlgButtonChecked(hwnd,IDC_CHECKBOX_DEBUG_WND_VALID))
3990 					DebugWndFlag = 1;
3991 				else
3992 					DebugWndFlag = 0;
3993          break;
3994       case IDC_BUTTON_EXITPROCESS:
3995         	ExitProcess(0);
3996 			return 0;
3997       case IDC_BUTTON_EXIT:
3998         	return DestroyWindow(hwnd);
3999       case IDC_BUTTON_HEAP_CHECK:
4000 			TiMidityHeapCheck();
4001         	break;
4002       case IDC_BUTTON_VARIABLES_CHECK:
4003 			TiMidityVariablesCheck();
4004         	break;
4005       default:
4006         		break;
4007       }
4008    	switch (HIWORD(wParam)) {
4009 		case EN_ERRSPACE:
4010       	ClearConsoleWnd();
4011 //      	PutsConsoleWnd("### EN_ERRSPACE -> Clear! ###\n");
4012 			break;
4013 		default:
4014       	break;
4015       }
4016     	break;
4017     case WM_SIZE:
4018 //      GetClientRect(hDebugWnd, &rc);
4019 //      MoveWindow(hDebugEditWnd, rc.left, rc.top,rc.right, rc.bottom - 30,TRUE);
4020 	    return FALSE;
4021 		case WM_CLOSE:
4022 					ShowWindow(hDebugWnd, SW_HIDE);
4023           break;
4024     default:
4025       	return FALSE;
4026 	}
4027 	return FALSE;
4028 }
4029 
4030 #if 0
4031 void InitDebugEditWnd(HWND hParentWnd)
4032 {
4033   RECT rc;
4034 	GetClientRect(hParentWnd, &rc);
4035 	hDebugEditWnd = CreateWindowEx(
4036   	WS_EX_CLIENTEDGE|WS_EX_TOOLWINDOW|WS_EX_DLGMODALFRAME,
4037   	"EDIT","",
4038 		WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOHSCROLL | WS_HSCROLL
4039     |ES_READONLY | ES_WANTRETURN | ES_MULTILINE | ES_AUTOVSCROLL ,
4040 //      	0,0,rc.right, rc.bottom - 30,hParentWnd,NULL,hInst,NULL);
4041       	0,0,100,100,hParentWnd,NULL,hInst,NULL);
4042 	SendMessage(hDebugEditWnd, EM_SETLIMITTEXT, (WPARAM)1024*640, 0);
4043 //  SendMessage(hDebugEditWnd, WM_PAINT, 0, 0);
4044 	GetClientRect(hParentWnd, &rc);
4045 	MoveWindow(hDebugEditWnd,rc.left,rc.top,rc.right,rc.bottom-30,TRUE);
4046  	ClearDebugWnd();
4047 	ShowWindow(hDebugEditWnd,SW_SHOW);
4048 	UpdateWindow(hDebugEditWnd);
4049 }
4050 #endif
4051 
PutsDebugWnd(char * str)4052 void PutsDebugWnd(char *str)
4053 {
4054 	if(!IsWindow(hDebugEditWnd) || !DebugWndFlag)
4055 		return;
4056 	PutsEditCtlWnd(hDebugEditWnd,str);
4057 }
4058 
PrintfDebugWnd(char * fmt,...)4059 void PrintfDebugWnd(char *fmt, ...)
4060 {
4061 	va_list ap;
4062 	if(!IsWindow(hDebugEditWnd) || !DebugWndFlag)
4063 		return;
4064 	va_start(ap, fmt);
4065 	VprintfEditCtlWnd(hDebugEditWnd,fmt,ap);
4066 	va_end(ap);
4067 }
4068 
ClearDebugWnd(void)4069 void ClearDebugWnd(void)
4070 {
4071 	if(!IsWindow(hDebugEditWnd))
4072 		return;
4073 	ClearEditCtlWnd(hDebugEditWnd);
4074 }
4075 #endif
4076 
4077 
4078 
4079 
4080 
4081 
4082 
4083 
4084 
4085 
4086 
4087 
4088 
4089 
4090 
4091 
4092 
4093 
4094 
4095 
4096 
4097 
4098 // ****************************************************************************
4099 // Main Thread
4100 
4101 extern HWND hListSearchWnd;
4102 extern void HideListSearch(void);
4103 
4104 #ifndef __BORLANDC__
4105 DWORD volatile dwMainThreadId = 0;
4106 #endif
4107 
MainThread(void * arglist)4108 void WINAPI MainThread(void *arglist)
4109 {
4110 #ifdef __BORLANDC__
4111 	DWORD volatile dwMainThreadId = 0;
4112 #endif
4113     MSG msg;
4114 
4115 	ThreadNumMax++;
4116 
4117 	dwMainThreadId = GetCurrentThreadId ();
4118 #ifdef W32GUI_DEBUG
4119 	PrintfDebugWnd("(*/%d)MainThread : Start.\n",ThreadNumMax);
4120 #endif
4121 #ifdef USE_THREADTIMES
4122 	ThreadTimesAddThread(hMainThread,"MainThread");
4123 #endif
4124 // Thread priority
4125 //	SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_BELOW_NORMAL);
4126 	SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_NORMAL);
4127 //	SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_ABOVE_NORMAL);
4128 
4129 
4130     InitStartWnd(SW_HIDE);
4131 
4132     w32g_wait_for_init = 0;
4133 
4134 // message loop for the application
4135 	while( GetMessage(&msg,NULL,0,0) ){
4136 //		HandleFastSearch(msg);
4137 //PrintfDebugWnd("H%lu M%lu WP%lu LP%lu T%lu x%d y%d\n",
4138 //	msg.hwnd, msg.message, msg.wParam, msg.lParam, msg.time, msg.pt.x, msg.pt.y);
4139 #if 1
4140 		// ESC �ő���‚���B
4141 		if ( msg.message == WM_KEYDOWN && (int)msg.wParam == VK_ESCAPE ) {
4142 			if ( msg.hwnd == hConsoleWnd || IsChild ( hConsoleWnd, msg.hwnd ) ) {
4143 				 ToggleSubWindow(hConsoleWnd);
4144 			} else if ( msg.hwnd == hDocWnd || IsChild ( hDocWnd, msg.hwnd ) ) {
4145 				 ToggleSubWindow(hDocWnd);
4146 			} else if ( msg.hwnd == hWrdWnd || IsChild ( hWrdWnd, msg.hwnd ) ) {
4147 				 ToggleSubWindow(hWrdWnd);
4148 			} else if ( msg.hwnd == hListWnd || IsChild ( hListWnd, msg.hwnd ) ) {
4149 				 ToggleSubWindow(hListWnd);
4150 			} else if ( msg.hwnd == hListSearchWnd || IsChild ( hListSearchWnd, msg.hwnd ) ) {
4151 				HideListSearch();
4152 			} else if ( msg.hwnd == hTracerWnd || IsChild ( hTracerWnd, msg.hwnd ) ) {
4153 				ToggleSubWindow(hTracerWnd);
4154 			}
4155 		}
4156 #endif
4157 		TranslateMessage(&msg);
4158 		DispatchMessage(&msg);
4159 	}
4160 
4161 #ifdef W32GUI_DEBUG
4162 	Sleep(200);
4163 	PrintfDebugWnd("w32gui_main: DebugWndExit\n");
4164 //   MessageBox(NULL, "Exit!","Exit!",MB_OK);
4165 	if(hDebugWnd!=NULL)
4166 		for(;;){
4167 			if(!DebugThreadExit){
4168    			SendMessage(hDebugWnd,WM_COMMAND,(WPARAM)IDC_BUTTON_EXIT,0);
4169 				Sleep(100);
4170          } else
4171          	break;
4172       }
4173 #endif
4174 	if(!w32g_restart_gui_flag)
4175 	{
4176 		OnExitReady();
4177 		w32g_send_rc(RC_QUIT, 0);
4178 	}
4179 	crt_endthread();
4180 }
4181 
4182 
4183 
4184 
4185 // **************************************************************************
4186 // Misc Dialog
4187 #define DialogMaxFileName 16536
4188 static char DialogFileNameBuff[DialogMaxFileName];
DlgFileOpen(HWND hwnd,char * title,char * filter,char * dir)4189 static char *DlgFileOpen(HWND hwnd, char *title, char *filter, char *dir)
4190 {
4191 	OPENFILENAME ofn;
4192     memset(DialogFileNameBuff, 0, sizeof(DialogFileNameBuff));
4193 	memset(&ofn, 0, sizeof(OPENFILENAME));
4194 	ofn.lStructSize = sizeof(OPENFILENAME);
4195 	ofn.hwndOwner = hwnd;
4196 	ofn.hInstance = hInst ;
4197 	ofn.lpstrFilter = filter;
4198 	ofn.lpstrCustomFilter = NULL;
4199 	ofn.nMaxCustFilter = 0;
4200 	ofn.nFilterIndex = 1 ;
4201 	ofn.lpstrFile = DialogFileNameBuff;
4202 	ofn.nMaxFile = sizeof(DialogFileNameBuff);
4203 	ofn.lpstrFileTitle = 0;
4204 	ofn.nMaxFileTitle = 0;
4205 	ofn.lpstrInitialDir	= dir;
4206 	ofn.lpstrTitle = title;
4207 	ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST
4208 		| OFN_ALLOWMULTISELECT | OFN_EXPLORER | OFN_READONLY;
4209 	ofn.lpstrDefExt = 0;
4210 	ofn.lCustData = 0;
4211 	ofn.lpfnHook = 0;
4212 	ofn.lpTemplateName= 0;
4213 
4214 	if(GetOpenFileName(&ofn)==TRUE)
4215 		return DialogFileNameBuff;
4216 	else
4217 		return NULL;
4218 }
4219 
DlgMidiFileOpen(HWND hwnd)4220 static void DlgMidiFileOpen(HWND hwnd)
4221 {
4222     char *dir, *file;
4223     char *filter = "timidity file\0*.mid;*.smf;*.rcp;*.r36;*.g18;*.g36;*.rmi;*.lzh;*.zip;*.gz\0"
4224 		"midi file\0*.mid;*.smf;*.rcp;*.r36;*.g18;*.g36;*.rmi\0"
4225 		"archive file\0*.lzh;*.zip;*.gz\0"
4226 		"playlist file\0*.pls;*.m3u;*.asx\0"
4227 		"all files\0*.*\0"
4228 		"\0\0";
4229 
4230     if(w32g_lock_open_file)
4231 		return;
4232 
4233     if(MidiFileOpenDir[0])
4234 		dir = MidiFileOpenDir;
4235     else
4236 		dir = NULL;
4237 
4238 	if((file = DlgFileOpen(hwnd, NULL, filter, dir)) == NULL)
4239 		return;
4240 
4241     w32g_lock_open_file = 1;
4242     w32g_send_rc(RC_EXT_LOAD_FILE, (ptr_size_t)file);
4243 }
4244 
4245 static volatile LPITEMIDLIST itemidlist_pre = NULL;
DlgDirOpenBrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)4246 int CALLBACK DlgDirOpenBrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
4247 {
4248 	switch(uMsg){
4249 	case BFFM_INITIALIZED:
4250 		if(itemidlist_pre)
4251 			SendMessage(hwnd,BFFM_SETSELECTION,(WPARAM)0,(LPARAM)itemidlist_pre);
4252 		break;
4253 	default:
4254 		break;
4255 	}
4256 	return 0;
4257 }
4258 
DlgDirOpen(HWND hwnd)4259 static void DlgDirOpen(HWND hwnd)
4260 {
4261 	static int initflag = 1;
4262 	static char biBuffer[MAXPATH + 256];
4263 	static char Buffer[MAXPATH + 256];
4264 	BROWSEINFO bi;
4265 	LPITEMIDLIST itemidlist;
4266 
4267 	if(w32g_lock_open_file)
4268 	    return;
4269 
4270 	if(initflag==1){
4271 		biBuffer[0] = '\0';
4272 		initflag = 0;
4273 	}
4274 	memset(&bi, 0, sizeof(bi));
4275 	bi.hwndOwner = NULL;
4276 	bi.pidlRoot = NULL;
4277     bi.pszDisplayName = biBuffer;
4278 	if ( PlayerLanguage == LANGUAGE_JAPANESE )
4279 		bi.lpszTitle = "MIDI �t�@�C���̂���f�B���N�g������I���Ȃ���܂��悤�B";
4280 	else
4281 		bi.lpszTitle = "Select a directory with MIDI files.";
4282 	bi.ulFlags = 0;
4283 	bi.lpfn = DlgDirOpenBrowseCallbackProc;
4284     bi.lParam = 0;
4285     bi.iImage = 0;
4286 	itemidlist = SHBrowseForFolder(&bi);
4287 	if(!itemidlist)
4288 		return; /* Cancel */
4289 	SHGetPathFromIDList(itemidlist, Buffer);
4290 	strncpy(biBuffer, Buffer, sizeof(Buffer) - 1);
4291 	if(itemidlist_pre)
4292 		CoTaskMemFree(itemidlist_pre);
4293 	itemidlist_pre = itemidlist;
4294     w32g_lock_open_file = 1;
4295 	directory_form(Buffer);
4296     w32g_send_rc(RC_EXT_LOAD_FILE, (ptr_size_t)Buffer);
4297 }
4298 
DlgPlaylistOpen(HWND hwnd)4299 static void DlgPlaylistOpen(HWND hwnd)
4300 {
4301     char *dir, *file;
4302     char *filter =
4303 		"playlist file\0*.pls;*.m3u;*.asx\0"
4304 		"all files\0*.*\0"
4305 		"\0\0";
4306 
4307     if(w32g_lock_open_file)
4308 		return;
4309 
4310     if(MidiFileOpenDir[0])
4311 		dir = MidiFileOpenDir;
4312     else
4313 		dir = NULL;
4314 
4315 	if((file = DlgFileOpen(hwnd, NULL, filter, dir)) == NULL)
4316 		return;
4317 
4318     w32g_lock_open_file = 1;
4319     w32g_send_rc(RC_EXT_LOAD_PLAYLIST, (ptr_size_t)file);
4320 }
4321 
4322 #include <sys/stat.h> /* for stat() */
CheckOverWrite(HWND hwnd,char * filename)4323 static int CheckOverWrite(HWND hwnd, char *filename)
4324 {
4325 	char buff[BUFSIZ];
4326 	int exists;
4327 
4328 #if 0
4329 	FILE *fp;
4330     if((fp = fopen(filename, "r")) == NULL)
4331 		exists = 0;
4332 	else
4333 	{
4334 		fclose(fp);
4335 		exists = 1;
4336 	}
4337 #else
4338 	struct stat st;
4339 	exists = (stat(filename, &st) != -1);
4340 #endif
4341 
4342 	if(!exists)
4343 		return 1;
4344 	snprintf(buff, sizeof(buff), "%s exists. Overwrite it?", filename);
4345 	return MessageBox(hwnd, buff, "Warning", MB_YESNO) == IDYES;
4346 }
4347 
DlgPlaylistSave(HWND hwnd)4348 static void DlgPlaylistSave(HWND hwnd)
4349 {
4350 	OPENFILENAME ofn;
4351 	static char *dir;
4352     char *filter =
4353 		"playlist file\0*.pls;*.m3u;*.asx\0"
4354 		"all files\0*.*\0"
4355 		"\0\0";
4356 
4357     if(w32g_lock_open_file)
4358 		return;
4359 
4360     if(MidiFileOpenDir[0])
4361 		dir = MidiFileOpenDir;
4362     else
4363 		dir = NULL;
4364 
4365 	memset(DialogFileNameBuff, 0, sizeof(DialogFileNameBuff));
4366 	memset(&ofn, 0, sizeof(OPENFILENAME));
4367 	ofn.lStructSize = sizeof(OPENFILENAME);
4368 	ofn.hwndOwner = hwnd;
4369 	ofn.hInstance = hInst;
4370 	ofn.lpstrFilter = filter;
4371 	ofn.lpstrCustomFilter = NULL;
4372 	ofn.nMaxCustFilter = 0;
4373 	ofn.nFilterIndex = 1 ;
4374 	ofn.lpstrFile = DialogFileNameBuff;
4375 	ofn.nMaxFile = sizeof(DialogFileNameBuff);
4376 	ofn.lpstrFileTitle = NULL;
4377 	ofn.nMaxFileTitle = 0;
4378 	ofn.lpstrInitialDir	= dir;
4379 	ofn.lpstrTitle	= "Save Playlist File";
4380 	ofn.Flags = OFN_PATHMUSTEXIST | OFN_EXPLORER | OFN_HIDEREADONLY;
4381 // ofn.lpstrDefExt = 0;
4382 	ofn.lpstrDefExt = "pls";
4383 	ofn.lCustData = 0;
4384 	ofn.lpfnHook = 0;
4385 	ofn.lpTemplateName= 0;
4386 
4387 	if(GetSaveFileName(&ofn) != TRUE)
4388 		return;
4389 	if(!CheckOverWrite(hwnd, DialogFileNameBuff))
4390 		return;
4391     w32g_lock_open_file = 1;
4392     w32g_send_rc(RC_EXT_SAVE_PLAYLIST, (ptr_size_t)DialogFileNameBuff);
4393 }
4394 
4395 // ****************************************************************************
4396 // Edit Ctl.
4397 
VprintfEditCtlWnd(HWND hwnd,char * fmt,va_list argList)4398 void VprintfEditCtlWnd(HWND hwnd, char *fmt, va_list argList)
4399 {
4400 	 char buffer[BUFSIZ], out[BUFSIZ];
4401 	 char *in;
4402 	 int i;
4403 
4404 	 if(!IsWindow(hwnd))
4405 		  return;
4406 
4407 	 vsnprintf(buffer, sizeof(buffer), fmt, argList);
4408 	 in = buffer;
4409 	 i = 0;
4410 	 for(;;){
4411 		  if(*in == '\0' || i>sizeof(out)-3){
4412 				out[i] = '\0';
4413 				break;
4414 		  }
4415 		  if(*in=='\n'){
4416 				out[i] = 13;
4417 				out[i+1] = 10;
4418 				in++;
4419 				i += 2;
4420 				continue;
4421 		  }
4422 		  out[i] = *in;
4423 		  in++;
4424 		  i++;
4425 	 }
4426 	 Edit_SetSel(hwnd,-1,-1);
4427 	 Edit_ReplaceSel(hwnd,out);
4428 }
4429 
PrintfEditCtlWnd(HWND hwnd,char * fmt,...)4430 void PrintfEditCtlWnd(HWND hwnd, char *fmt, ...)
4431 {
4432     va_list ap;
4433     va_start(ap, fmt);
4434     VprintfEditCtlWnd(hwnd,fmt,ap);
4435     va_end(ap);
4436 }
4437 
4438 #if 1
PutsEditCtlWnd(HWND hwnd,char * str)4439 void PutsEditCtlWnd(HWND hwnd, char *str)
4440 {
4441 	char *in = str;
4442 	int i;
4443 	char out[BUFSIZ];
4444 	i = 0;
4445 	for(;;){
4446 		if(*in == '\0' || i>sizeof(out)-3){
4447 			out[i] = '\0';
4448 			break;
4449     }
4450   	if(*in=='\n'){
4451     	out[i] = 13;
4452     	out[i+1] = 10;
4453 			in++;
4454       i += 2;
4455       continue;
4456     }
4457     out[i] = *in;
4458 		in++;
4459     i++;
4460   }
4461 	if(IsWindow(hwnd)){
4462 		Edit_SetSel(hwnd,-1,-1);
4463 		Edit_ReplaceSel(hwnd,out);
4464 	}
4465 }
4466 #else
PutsEditCtlWnd(HWND hwnd,char * str)4467 void PutsEditCtlWnd(HWND hwnd, char *str)
4468 {
4469 	if(!IsWindow(hwnd))
4470 		return;
4471 	PrintfEditCtlWnd(hwnd,"%s",str);
4472 }
4473 #endif
4474 
ClearEditCtlWnd(HWND hwnd)4475 void ClearEditCtlWnd(HWND hwnd)
4476 {
4477 	char pszVoid[]="";
4478 	if(!IsWindow(hwnd))
4479 		return;
4480 	if(IsWindow(hwnd)){
4481 //		Edit_SetSel(hwnd,0,-1);
4482 		Edit_SetSel(hwnd,-1,-1);
4483 	}
4484 	Edit_SetText(hwnd,pszVoid);
4485 }
4486 
4487 
4488 // ****************************************************************************
4489 // Misc funciton.
4490 
w32g_msg_box(char * message,char * title,int type)4491 int w32g_msg_box(char *message, char *title, int type)
4492 {
4493     return MessageBox(hMainWnd, message, title, type);
4494 }
4495 
4496 
4497 //#define RC_QUEUE_SIZE 8
4498 #define RC_QUEUE_SIZE 48
4499 static struct
4500 {
4501     int rc;
4502     ptr_size_t value;
4503 } rc_queue[RC_QUEUE_SIZE];
4504 static volatile int rc_queue_len, rc_queue_beg, rc_queue_end;
4505 
4506 static HANDLE w32g_lock_sem = NULL;
4507 static HANDLE w32g_empty_sem = NULL;
4508 
w32g_lock(void)4509 void w32g_lock(void)
4510 {
4511 	if(w32g_lock_sem)
4512 	    WaitForSingleObject(w32g_lock_sem, INFINITE);
4513 }
4514 
w32g_unlock(void)4515 void w32g_unlock(void)
4516 {
4517 	if(w32g_lock_sem)
4518 	    ReleaseSemaphore(w32g_lock_sem, 1, NULL);
4519 }
4520 
w32g_send_rc(int rc,ptr_size_t value)4521 void w32g_send_rc(int rc, ptr_size_t value)
4522 {
4523     w32g_lock();
4524 
4525     if(rc_queue_len == RC_QUEUE_SIZE)
4526     {
4527 	/* Over flow.  Remove the oldest message */
4528 	rc_queue_len--;
4529 	rc_queue_beg = (rc_queue_beg + 1) % RC_QUEUE_SIZE;
4530     }
4531 
4532     rc_queue_len++;
4533     rc_queue[rc_queue_end].rc = rc;
4534     rc_queue[rc_queue_end].value = value;
4535     rc_queue_end = (rc_queue_end + 1) % RC_QUEUE_SIZE;
4536 	if(w32g_empty_sem)
4537 	    ReleaseSemaphore(w32g_empty_sem, 1, NULL);
4538     w32g_unlock();
4539 }
4540 
w32g_get_rc(ptr_size_t * value,int wait_if_empty)4541 int w32g_get_rc(ptr_size_t *value, int wait_if_empty)
4542 {
4543     int rc;
4544 
4545     while(rc_queue_len == 0)
4546     {
4547 	if(!wait_if_empty)
4548 	    return RC_NONE;
4549 	if(w32g_empty_sem)
4550 		WaitForSingleObject(w32g_empty_sem, INFINITE);
4551 	VOLATILE_TOUCH(rc_queue_len);
4552     }
4553 
4554     w32g_lock();
4555     rc = rc_queue[rc_queue_beg].rc;
4556     *value = rc_queue[rc_queue_beg].value;
4557     rc_queue_len--;
4558     rc_queue_beg = (rc_queue_beg + 1) % RC_QUEUE_SIZE;
4559     w32g_unlock();
4560 
4561     return rc;
4562 }
4563 
w32g_open(void)4564 int w32g_open(void)
4565 {
4566     SaveSettingTiMidity(st_current);
4567     memcpy(st_temp, st_current, sizeof(SETTING_TIMIDITY));
4568 
4569     w32g_lock_sem = CreateSemaphore(NULL, 1, 1, "TiMidity Mutex Lock");
4570     w32g_empty_sem = CreateSemaphore(NULL, 0, 8, "TiMidity Empty Lock");
4571 
4572     hPlayerThread = GetCurrentThread();
4573     w32g_wait_for_init = 1;
4574     hMainThread = crt_beginthreadex(NULL, 0,
4575 				    (LPTHREAD_START_ROUTINE)MainThread,
4576 				    NULL, 0, &dwMainThreadID);
4577     while(w32g_wait_for_init)
4578     {
4579 		Sleep(0);
4580 		VOLATILE_TOUCH(w32g_wait_for_init);
4581     }
4582     return 0;
4583 }
4584 
terminate_main_thread(void)4585 static void terminate_main_thread(void)
4586 {
4587 	DWORD status;
4588 
4589 	switch(WaitForSingleObject(hMainThread, 0))
4590 	{
4591 	  case WAIT_OBJECT_0:
4592 		break;
4593 	  case WAIT_TIMEOUT:
4594 		OnQuit();
4595 		status = WaitForSingleObject(hMainThread, 5000);
4596 		if(status == WAIT_TIMEOUT)
4597 			TerminateThread(hMainThread, 0);
4598 		break;
4599 	  default:
4600 		TerminateThread(hMainThread, 0);
4601 		break;
4602 	}
4603 }
4604 
w32g_close(void)4605 void w32g_close(void)
4606 {
4607 	terminate_main_thread();
4608 	if(w32g_lock_sem){
4609 	    CloseHandle(w32g_lock_sem);
4610 		w32g_lock_sem = NULL;
4611 	}
4612 	if(w32g_empty_sem){
4613 	    CloseHandle(w32g_empty_sem);
4614 		w32g_empty_sem = NULL;
4615 	}
4616 }
4617 
w32g_restart(void)4618 void w32g_restart(void)
4619 {
4620 	w32g_restart_gui_flag = 1;
4621 	terminate_main_thread();
4622 	if(w32g_lock_sem){
4623 	    CloseHandle(w32g_lock_sem);
4624 		w32g_lock_sem = NULL;
4625 	}
4626 	if(w32g_empty_sem){
4627 	    CloseHandle(w32g_empty_sem);
4628 		w32g_empty_sem = NULL;
4629 	}
4630 
4631 	/* Reset variable */
4632     hDebugEditWnd = 0;
4633 
4634 	/* Now ready to start */
4635 	w32g_open();
4636 	w32g_restart_gui_flag = 0;
4637 }
4638 
w32g_ctle_play_start(int sec)4639 void w32g_ctle_play_start(int sec)
4640 {
4641     char *title;
4642 
4643     if(sec >= 0)
4644     {
4645 	SetScrollRange(hMainWndScrollbarProgressWnd, SB_CTL, 0, sec, TRUE);
4646 	MainWndScrollbarProgressUpdate(0);
4647     }
4648     else
4649 	MainWndScrollbarProgressUpdate(-1);
4650 
4651     Panel->cur_time_h = MPanel.CurTime_h = 0;
4652     Panel->cur_time_m = MPanel.CurTime_m = 0;
4653     Panel->cur_time_s = MPanel.CurTime_s = 0;
4654     Panel->cur_time_ss = MPanel.CurTime_ss = 0;
4655 
4656     MPanel.TotalTime_h = sec / 60 / 60;
4657     RANGE(MPanel.TotalTime_h, 0, 99);
4658     Panel->total_time_h = MPanel.TotalTime_h;
4659 
4660     sec %= 60 * 60;
4661     Panel->total_time_m = MPanel.TotalTime_m = sec / 60;
4662     Panel->total_time_s = MPanel.TotalTime_s = sec % 60;
4663     Panel->total_time_ss = MPanel.TotalTime_ss = 0;
4664 
4665     MPanel.UpdateFlag |= MP_UPDATE_TIME;
4666 
4667     /* Now, ready to get the title of MIDI */
4668     if((title = get_midi_title(MPanel.File)) != NULL)
4669     {
4670 	strncpy(MPanel.Title, title, MP_TITLE_MAX);
4671 	MPanel.UpdateFlag |= MP_UPDATE_TITLE;
4672     }
4673     MPanelUpdate();
4674 }
4675 
MainWndScrollbarProgressUpdate(int sec)4676 void MainWndScrollbarProgressUpdate(int sec)
4677 {
4678     static int lastsec = -1, enabled = 0;
4679 
4680     if(sec == lastsec)
4681 	return;
4682 
4683     if(sec == -1)
4684     {
4685   	EnableWindow(hMainWndScrollbarProgressWnd, FALSE);
4686 	enabled = 0;
4687 	progress_jump = -1;
4688     }
4689     else
4690     {
4691 	if(!enabled)
4692 	{
4693 	    EnableWindow(hMainWndScrollbarProgressWnd, TRUE);
4694 	    enabled = 1;
4695 	}
4696 	if(progress_jump == -1)
4697 	    SetScrollPos(hMainWndScrollbarProgressWnd, SB_CTL, sec, TRUE);
4698     }
4699     lastsec = sec;
4700 }
4701 
w32g_show_console(void)4702 void w32g_show_console(void)
4703 {
4704 	ShowWindow(hConsoleWnd, SW_SHOW);
4705 	SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND,
4706 					   TB_CHECKBUTTON, IDM_CONSOLE, (LPARAM)MAKELONG(TRUE, 0));
4707 }
4708 
4709 ///////////////////////////////////////////////////////////////////////
4710 // GDI �A�N�Z�X��P��X���b�h�Ɍ��肷�邽�߂̃��b�N�@�\
4711 
4712 static HANDLE volatile hMutexGDI = NULL;
4713 // static int volatile lock_num = 0;
gdi_lock_ex(DWORD timeout)4714 int gdi_lock_ex ( DWORD timeout )
4715 {
4716 // lock_num++;
4717 // ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
4718 // 		  "gdi_lock<%d %d>", GetCurrentThreadId(),lock_num );
4719 	if(hMutexGDI==NULL){
4720 		hMutexGDI = CreateMutex(NULL,FALSE,NULL);
4721 		if(hMutexGDI==NULL)
4722 			return -1;
4723 	}
4724 	if(WaitForSingleObject(hMutexGDI,timeout)==WAIT_FAILED){
4725 		return -1;
4726 	}
4727 	return 0;
4728 }
gdi_lock(void)4729 int gdi_lock(void)
4730 {
4731 	return gdi_lock_ex ( INFINITE );
4732 }
4733 
gdi_unlock(void)4734 extern int gdi_unlock(void)
4735 {
4736 //lock_num--;
4737 //ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
4738 //		  "gdi_unlock<%d %d>", GetCurrentThreadId(),lock_num );
4739 	if(hMutexGDI!=NULL){
4740 		ReleaseMutex(hMutexGDI);
4741 	}
4742 	return 0;
4743 }
4744