📄 w32g_i.c
字号:
/* TiMidity++ -- MIDI to WAVE converter and player Copyright (C) 1999-2004 Masanao Izumo <iz@onicos.co.jp> Copyright (C) 1995 Tuukka Toivonen <tt@cgs.fi> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA w32g_main.c: Written by Daisuke Aoki <dai@y7.net> Modified by Masanao Izumo <iz@onicos.co.jp>*/#ifdef HAVE_CONFIG_H#include "config.h"#endif /* HAVE_CONFIG_H */#include <stdio.h>#include <stdlib.h>#include <process.h>#include <stddef.h>#include <windows.h>#undef RC_NONE#include <shlobj.h>// #include <prsht.h>#if defined(__CYGWIN32__) || defined(__MINGW32__)#ifndef HAVE_NEW_MMSYSTEM#include <commdlg.h>#ifndef TPM_TOPALIGN#define TPM_TOPALIGN 0x0000L /* for old version of cygwin */#endif#define TIME_ONESHOT 0#define TIME_PERIODIC 1int WINAPI timeSetEvent(UINT uDelay, UINT uResolution, void *fptc, DWORD dwUser, UINT fuEvent);int WINAPI timeKillEvent(UINT uTimerID);#endif#else#include <commctrl.h>#endif /* __CYGWIN32__ */#include <commctrl.h>#ifndef NO_STRING_H#include <string.h>#else#include <strings.h>#endif#include <shlobj.h>#include <windowsx.h> /* There is no <windowsx.h> on CYGWIN. * Edit_* and ListBox_* are defined in * <windowsx.h> */#include "timidity.h"#include "common.h"#include "instrum.h"#include "playmidi.h"#include "readmidi.h"#include "output.h"#include "controls.h"#include "wrd.h"#include "w32g.h"#include "w32g_res.h"#include "w32g_utl.h"#include "w32g_ut2.h"#include "w32g_pref.h"#include "w32g_subwin.h"#if defined(__CYGWIN32__) || defined(__MINGW32__)#define WIN32GCCWINAPI void InitCommonControls(void);#endif#if 0#define GDI_LOCK() { \ ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "GDI_LOCK(%s: %d)", __FILE__, __LINE__ ); \ gdi_lock(); \}#define GDI_UNLOCK() { \ ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "GDI_UNLOCK(%s: %d)", __FILE__, __LINE__ ); \ gdi_unlock(); \}#else#define GDI_LOCK() { gdi_lock(); }#define GDI_UNLOCK() { gdi_unlock(); }#endifstatic void InitMainWnd(HWND hStartWnd);static void ConsoleWndVerbosityApplyIncDec(int num);void ConsoleWndVerbosityApply(void);void CanvasPaintAll(void);void CanvasReset(void);void CanvasClear(void);void CanvasUpdate(int flag);void CanvasReadPanelInfo(int flag);void CanvasChange(int mode);void MPanelPaintAll(void);void MPanelReadPanelInfo(int flag);void MPanelReset(void);void MPanelUpdateAll(void);void ClearConsoleWnd(void);void InitListWnd(HWND hParentWnd);void InitTracerWnd(HWND hParentWnd);void InitWrdWnd(HWND hParentWnd);void InitDocWnd(HWND hParentWnd);void InitListSearchWnd(HWND hParentWnd);void PutsDocWnd(char *str);void ClearDocWnd(void);static void DlgPlaylistSave(HWND hwnd);static void DlgPlaylistOpen(HWND hwnd);static void DlgDirOpen(HWND hwnd);static void DlgMidiFileOpen(HWND hwnd);void VprintfEditCtlWnd(HWND hwnd, char *fmt, va_list argList);void PutsEditCtlWnd(HWND hwnd, char *str);void ClearEditCtlWnd(HWND hwnd);int w32gSaveDefaultPlaylist(void);#ifndef CLR_INVALID#define CLR_INVALID 0xffffffff#endif /* CLR_INVALID */extern int optind;HINSTANCE hInst;static int progress_jump = -1;static HWND hMainWndScrollbarProgressWnd;static HWND hMainWndScrollbarVolumeWnd;// #define W32G_VOLUME_MAX 200#define W32G_VOLUME_MAX MAX_AMPLIFICATION// HWNDHWND hMainWnd = 0;HWND hDebugWnd = 0;HWND hConsoleWnd = 0;HWND hTracerWnd = 0;HWND hDocWnd = 0;HWND hListWnd = 0;HWND hWrdWnd = 0;HWND hSoundSpecWnd = 0;HWND hDebugEditWnd = 0;HWND hDocEditWnd = 0;// Process.HANDLE hProcess = 0;// Main Thread.HANDLE hMainThread = 0;HANDLE hPlayerThread = 0;HANDLE hMainThreadInfo = 0;DWORD dwMainThreadID = 0;static volatile int wait_thread_flag = 1;typedef struct MAINTHREAD_ARGS_ { int *pArgc; char ***pArgv;} MAINTHREAD_ARGS;void WINAPI MainThread(void *arglist);// Window ThreadHANDLE hWindowThread = 0;HANDLE hWindowThreadInfo = 0;// Threadvolatile int ThreadNumMax = 0;// Debug Threadvolatile int DebugThreadExit = 1;volatile HANDLE hDebugThread = 0;void DebugThreadInit(void);void PrintfDebugWnd(char *fmt, ...);void ClearDebugWnd(void);void InitDebugWnd(HWND hParentWnd);// Flagsint InitMinimizeFlag = 0;int DebugWndStartFlag = 1;int ConsoleWndStartFlag = 0;int ListWndStartFlag = 0;int TracerWndStartFlag = 0;int DocWndStartFlag = 0;int WrdWndStartFlag = 0;int DebugWndFlag = 1;int ConsoleWndFlag = 1;int ListWndFlag = 1;int TracerWndFlag = 0;int DocWndFlag = 1;int WrdWndFlag = 0;int SoundSpecWndFlag = 0;int WrdGraphicFlag;int TraceGraphicFlag;char *IniFile;char *ConfigFile;char *PlaylistFile;char *PlaylistHistoryFile;char *MidiFileOpenDir;char *ConfigFileOpenDir;char *PlaylistFileOpenDir;// Priorityint PlayerThreadPriority;int MidiPlayerThreadPriority;int MainThreadPriority;int GUIThreadPriority;int TracerThreadPriority;int WrdThreadPriority;// dirint SeachDirRecursive = 0; // 嵞婣揑僨傿儗僋僩儕専嶕 // Ini Fileint IniFileAutoSave = 1; // INI 僼傽僀儖偺帺摦僙乕僽// miscint DocMaxSize;char *DocFileExt;int AutoloadPlaylist = 0;int AutosavePlaylist = 0;int volatile save_playlist_once_before_exit_flag = 1;static volatile int w32g_wait_for_init;void w32g_send_rc(int rc, int32 value);int w32g_lock_open_file = 0;void TiMidityHeapCheck(void);volatile DWORD dwWindowThreadID = -1;void w32g_i_init(void){ ThreadNumMax++; hProcess = GetCurrentProcess(); hWindowThread = GetCurrentThread(); dwWindowThreadID = GetCurrentThreadId(); InitCommonControls();#ifdef W32GUI_DEBUG DebugThreadInit();#endif}int PlayerLanguage = LANGUAGE_ENGLISH;//int PlayerLanguage = LANGUAGE_JAPANESE;#define PInfoOK 1long SetValue(int32 value, int32 min, int32 max){ int32 v = value; if(v < min) v = min; else if( v > max) v = max; return v;}int w32gSecondTiMidity(int opt, int argc, char **argv);int w32gSecondTiMidityExit(void);int SecondMode = 0;void FirstLoadIniFile(void);#ifndef WIN32GCCextern void CmdLineToArgv(LPSTR lpCmdLine, int *argc, CHAR ***argv);extern int win_main(int argc, char **argv); /* timidity.c */int WINAPIWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow){ int argc; CHAR **argv = NULL; CmdLineToArgv(lpCmdLine,&argc,&argv);#if 0 FirstLoadIniFile(); if(w32gSecondTiMidity(SecondMode,argc,argv)==TRUE){ int res = win_main(argc, argv); w32gSecondTiMidityExit(); return res; } else return -1;#else wrdt=wrdt_list[0]; return win_main(argc, argv);#endif}#endif /* WIN32GCC */// ***************************************************************************// System Functionvoid CALLBACK KillProcess(UINT IDEvent, UINT uReserved, DWORD dwUser, DWORD dwReserved1, DWORD dwReserved2){ exit(0); // ExitProcess(0);}void OnExit(void){#ifdef W32GUI_DEBUG PrintfDebugWnd("PostQuitMessage\n"); Sleep(200);#endif PostQuitMessage(0);}static int OnExitReadyWait = 200;void OnExitReady(void){ int i;#ifdef W32GUI_DEBUG PrintfDebugWnd("OnExitReady: Start.\n");#endif w32g_send_rc(RC_STOP, 0); /* Exit after 10 sec. */ timeSetEvent(10000, 1000, KillProcess, 0, TIME_ONESHOT); /* Wait really stopping to play */ i = 1000/OnExitReadyWait; /* 1 sec. */ while(w32g_play_active && i-- > 0) { Sleep(OnExitReadyWait); VOLATILE_TOUCH(w32g_play_active); }#ifdef W32GUI_DEBUG PrintfDebugWnd("OnExitReady: End.\n");#endif}void OnQuit(void){ SendMessage(hMainWnd, WM_CLOSE, 0, 0);}// ***************************************************************************// Start Window// 戝尦偺僂傿儞僪僂偺抧埵偼Main Window偵忳傝丄崱偱偼偨偩偺弶婜壔娭悢void InitStartWnd(int nCmdShow){ InitMainWnd(NULL); InitConsoleWnd(hMainWnd); InitListWnd(hMainWnd); InitTracerWnd(hMainWnd); InitDocWnd(hMainWnd); InitWrdWnd(hMainWnd); InitSoundSpecWnd(hMainWnd); hMainWndScrollbarProgressWnd = GetDlgItem(hMainWnd, IDC_SCROLLBAR_PROGRESS); hMainWndScrollbarVolumeWnd = GetDlgItem(hMainWnd, IDC_SCROLLBAR_VOLUME); EnableScrollBar(hMainWndScrollbarVolumeWnd, SB_CTL,ESB_ENABLE_BOTH); SetScrollRange(hMainWndScrollbarVolumeWnd, SB_CTL, 0, W32G_VOLUME_MAX, TRUE); SetScrollPos(hMainWndScrollbarVolumeWnd, SB_CTL, W32G_VOLUME_MAX - amplification, TRUE);}/*****************************************************************************/// Main Window#define SWS_EXIST 0x0001#define SWS_ICON 0x0002#define SWS_HIDE 0x0004typedef struct SUBWINDOW_ { HWND *hwnd; int status;} SUBWINDOW;SUBWINDOW subwindow[] ={ {&hConsoleWnd,0}, {&hListWnd,0}, {&hTracerWnd,0}, {&hDocWnd,0}, {&hWrdWnd,0}, {&hSoundSpecWnd,0}, {NULL,0}};int SubWindowMax = 5;SUBWINDOW SubWindowHistory[] ={ {&hConsoleWnd,0}, {&hListWnd,0}, {&hTracerWnd,0}, {&hDocWnd,0}, {&hWrdWnd,0}, {&hSoundSpecWnd,0}, {NULL,0}};MAINWNDINFO MainWndInfo;BOOL CALLBACK MainProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam);void update_subwindow(void);void OnShow(void);void OnHide(void);static int MainWndInfoReset(HWND hwnd);static int MainWndInfoApply(void);extern void reload_cfg(void);// OUTPUT MENU#define IDM_OUTPUT 0x4000static HMENU outputMenu;static void InitOutputMenu(HWND hWnd){ HMENU hMenu; MENUITEMINFO mii; int i; hMenu = GetMenu(hWnd); if (outputMenu != NULL) {DestroyMenu (outputMenu);} outputMenu = CreateMenu(); mii.cbSize = sizeof (MENUITEMINFO); mii.fMask = MIIM_TYPE | MIIM_SUBMENU; mii.fType = MFT_STRING; mii.hSubMenu = outputMenu; if (PlayerLanguage == LANGUAGE_JAPANESE) { mii.dwTypeData = TEXT("弌椡(&O)"); } else { mii.dwTypeData = TEXT("Output(&O)"); } InsertMenuItem(hMenu, GetMenuItemCount(hMenu) - 1, TRUE, &mii); for (i = 0; play_mode_list[i] != 0; i++) { mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE; mii.wID = IDM_OUTPUT + i; mii.fType = MFT_STRING; if (st_temp->opt_playmode[0] == play_mode_list[i]->id_character) { mii.fState = MFS_CHECKED; } else { mii.fState = MFS_UNCHECKED; } mii.dwTypeData = play_mode_list[i]->id_name; InsertMenuItem(outputMenu, i, TRUE, &mii); } SetMenu(hWnd , hMenu);}static void UpdateOutputMenu(HWND hWnd, UINT wId){ MENUITEMINFO mii; int i, num = -1, oldnum; for (i = 0; play_mode_list[i] != 0; i++) { mii.cbSize = sizeof (MENUITEMINFO); mii.fMask = MIIM_STATE | MIIM_ID; GetMenuItemInfo(outputMenu, i, TRUE, &mii); if (wId == mii.wID) { mii.fState = MFS_CHECKED; num = i; } else {mii.fState = MFS_UNCHECKED;} SetMenuItemInfo(outputMenu, i, TRUE, &mii); if (st_temp->opt_playmode[0] == play_mode_list[i]->id_character) { oldnum = i; } } if (!w32g_play_active && num != oldnum) { if (num >= 0) {st_temp->opt_playmode[0] = play_mode_list[num]->id_character;} else {st_temp->opt_playmode[0] = 'd';} PrefSettingApplyReally(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -