322 lines
10 KiB
C++
322 lines
10 KiB
C++
|
/** (c) Nullsoft, Inc. C O N F I D E N T I A L
|
||
|
** Filename:
|
||
|
** Project:
|
||
|
** Description:
|
||
|
** Author:
|
||
|
** Created:
|
||
|
**/
|
||
|
#include "Main.h"
|
||
|
#include "menuv5.h"
|
||
|
#include "resource.h"
|
||
|
|
||
|
extern "C"
|
||
|
{
|
||
|
int g_main_created = 0;
|
||
|
}
|
||
|
|
||
|
static INT_PTR CALLBACK tmpProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
BOOL InitApplication(HINSTANCE hInstance) // register Winamp's window class, returns TRUE on success
|
||
|
{
|
||
|
HICON hIcon;
|
||
|
WNDCLASSW wc = {0, };
|
||
|
|
||
|
wc.style = CS_DBLCLKS;
|
||
|
wc.hInstance = hInstance;
|
||
|
hIcon = wc.hIcon = LoadIconW(hInstance, MAKEINTRESOURCE(ICON_XP));
|
||
|
wc.hCursor = NULL;
|
||
|
|
||
|
//wc.lpfnWndProc = Main_WndProc;
|
||
|
//wc.lpszClassName = L"Winamp";;
|
||
|
//if (!RegisterClassW( &wc ))
|
||
|
// return 0;
|
||
|
|
||
|
wc.lpfnWndProc = VIS_WndProc;
|
||
|
wc.lpszClassName = L"WinampVis";
|
||
|
if (!RegisterClassW(&wc))
|
||
|
return 0;
|
||
|
|
||
|
|
||
|
wc.lpfnWndProc = video_WndProc;
|
||
|
wc.lpszClassName = L"Winamp Video";
|
||
|
if (!RegisterClassW(&wc))
|
||
|
return 0;
|
||
|
|
||
|
#ifdef WA2
|
||
|
#ifndef NETSCAPE
|
||
|
wc.style = CS_DBLCLKS;
|
||
|
wc.lpfnWndProc = MB_WndProc;
|
||
|
wc.lpszClassName = "Winamp MB";
|
||
|
if (!RegisterClassW(&wc))
|
||
|
return 0;
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
/* now register unicode windows */
|
||
|
WNDCLASSW wcW = {0, };
|
||
|
|
||
|
wcW.style = CS_DBLCLKS;
|
||
|
wcW.hInstance = hInstance;
|
||
|
hIcon = wcW.hIcon = LoadIconW(hInstance, MAKEINTRESOURCE(ICON_XP));
|
||
|
wcW.hCursor = NULL;
|
||
|
|
||
|
wcW.lpfnWndProc = emb_WndProc;
|
||
|
wcW.lpszClassName = L"Winamp Gen";
|
||
|
if (!RegisterClassW(&wcW))
|
||
|
return 0;
|
||
|
|
||
|
wcW.style |= CS_VREDRAW | CS_HREDRAW;
|
||
|
wcW.lpfnWndProc = EQ_WndProc;
|
||
|
wcW.lpszClassName = L"Winamp EQ";
|
||
|
if (!RegisterClassW(&wcW))
|
||
|
return 0;
|
||
|
|
||
|
wcW.lpfnWndProc = PE_WndProc;
|
||
|
wcW.lpszClassName = L"Winamp PE";
|
||
|
if (!RegisterClassW(&wcW))
|
||
|
return 0;
|
||
|
|
||
|
// make other people's dialogs show the winamp icon
|
||
|
HWND h = CreateDialogW(hMainInstance, MAKEINTRESOURCE(IDD_OPENLOC), NULL, tmpProc);
|
||
|
SetClassLongPtrW(h, GCLP_HICON, (LONG_PTR)hIcon);
|
||
|
DestroyWindow(h);
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
void ConvertRatingMenuStar(HMENU menu, UINT menu_id)
|
||
|
{
|
||
|
MENUITEMINFOW mi = {sizeof(mi), MIIM_DATA | MIIM_TYPE, MFT_STRING};
|
||
|
wchar_t rateBuf[32], *rateStr = rateBuf;
|
||
|
mi.dwTypeData = rateBuf;
|
||
|
mi.cch = 32;
|
||
|
if(GetMenuItemInfoW(menu, menu_id, FALSE, &mi))
|
||
|
{
|
||
|
while(rateStr && *rateStr)
|
||
|
{
|
||
|
if(*rateStr == L'*') *rateStr = L'\u2605';
|
||
|
rateStr=CharNextW(rateStr);
|
||
|
}
|
||
|
SetMenuItemInfoW(menu, menu_id, FALSE, &mi);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void main_Create()
|
||
|
{
|
||
|
static int t = 0;
|
||
|
|
||
|
g_main_created = 1;
|
||
|
SetWindowTextW(hMainWindow, caption);
|
||
|
|
||
|
hVisWindow = CreateWindowExW(0, L"WinampVis", L"", WS_CHILD, 0, 0, 0, 0,
|
||
|
hMainWindow, NULL, hMainInstance, NULL);
|
||
|
ShowWindow(hVisWindow, SW_SHOWNA);
|
||
|
|
||
|
SetWindowLong(hMainWindow, GWLP_USERDATA, (config_keeponscreen&2) ? 0x49474541 : 0);
|
||
|
hTooltipWindow = CreateWindowW(TOOLTIPS_CLASSW, (LPCWSTR)NULL, TTS_ALWAYSTIP | TTS_NOPREFIX,
|
||
|
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
|
||
|
hMainWindow, NULL, hMainInstance, NULL);
|
||
|
SendMessageW(hTooltipWindow, TTM_SETDELAYTIME, TTDT_INITIAL, 375);
|
||
|
SendMessageW(hTooltipWindow, TTM_SETDELAYTIME, TTDT_AUTOPOP, 2000);
|
||
|
SendMessageW(hTooltipWindow, TTM_SETDELAYTIME, TTDT_RESHOW, 1000);
|
||
|
|
||
|
hEQTooltipWindow = CreateWindowW(TOOLTIPS_CLASSW, (LPCWSTR)NULL, TTS_ALWAYSTIP | TTS_NOPREFIX,
|
||
|
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
|
||
|
hEQWindow, NULL, hMainInstance, NULL);
|
||
|
SendMessageW(hEQTooltipWindow, TTM_SETDELAYTIME, TTDT_INITIAL, 125);
|
||
|
SendMessageW(hEQTooltipWindow, TTM_SETDELAYTIME, TTDT_AUTOPOP, 2000);
|
||
|
SendMessageW(hEQTooltipWindow, TTM_SETDELAYTIME, TTDT_RESHOW, 1000);
|
||
|
|
||
|
|
||
|
hVideoTooltipWindow = CreateWindowW(TOOLTIPS_CLASSW, (LPCWSTR)NULL, TTS_ALWAYSTIP | TTS_NOPREFIX,
|
||
|
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
|
||
|
hVideoWindow, NULL, hMainInstance, NULL);
|
||
|
SendMessageW(hVideoTooltipWindow, TTM_SETDELAYTIME, TTDT_INITIAL, 125);
|
||
|
SendMessageW(hVideoTooltipWindow, TTM_SETDELAYTIME, TTDT_AUTOPOP, 2000);
|
||
|
SendMessageW(hVideoTooltipWindow, TTM_SETDELAYTIME, TTDT_RESHOW, 1000);
|
||
|
|
||
|
hPLTooltipWindow = CreateWindowW(TOOLTIPS_CLASSW, (LPCWSTR)NULL, TTS_ALWAYSTIP | TTS_NOPREFIX,
|
||
|
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
|
||
|
hPLWindow, NULL, hMainInstance, NULL);
|
||
|
SendMessageW(hPLTooltipWindow, TTM_SETDELAYTIME, TTDT_INITIAL, 125);
|
||
|
SendMessageW(hPLTooltipWindow, TTM_SETDELAYTIME, TTDT_AUTOPOP, 2000);
|
||
|
SendMessageW(hPLTooltipWindow, TTM_SETDELAYTIME, TTDT_RESHOW, 1000);
|
||
|
|
||
|
/*hPL2TooltipWindow = CreateWindowW(TOOLTIPS_CLASSW, (LPCWSTR)NULL, TTS_ALWAYSTIP | TTS_NOPREFIX,
|
||
|
0, 0, 0, 0, hPLWindow, NULL, hMainInstance, NULL);*/
|
||
|
// TODO attempt to make this more like the listview timings
|
||
|
/*SendMessageW(hPL2TooltipWindow, TTM_SETDELAYTIME, TTDT_INITIAL, 125);
|
||
|
SendMessageW(hPL2TooltipWindow, TTM_SETDELAYTIME, TTDT_AUTOPOP, 2000);
|
||
|
SendMessageW(hPL2TooltipWindow, TTM_SETDELAYTIME, TTDT_RESHOW, 1000);*/
|
||
|
|
||
|
SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
|
||
|
|
||
|
top_menu = LPLoadMenu(WINAMP_MAIN);
|
||
|
|
||
|
#ifdef NETSCAPE
|
||
|
EnableMenuItem(top_menu, WINAMP_OPTIONS_MINIBROWSER, MF_BYCOMMAND | MF_GRAYED);
|
||
|
#endif
|
||
|
main_menu = GetSubMenu(top_menu, 0);
|
||
|
|
||
|
g_submenus_play = GetSubMenu(main_menu, 2);
|
||
|
g_submenus_bookmarks1 = GetSubMenu(main_menu, 4);
|
||
|
g_submenus_bookmarks2 = GetSubMenu(GetSubMenu(main_menu, 2), 4 + (g_audiocdletters ? g_audiocdletters + 1 : 0));
|
||
|
g_submenus_skins1 = GetSubMenu(main_menu, MAINMENU_OPTIONS_BASE + 3);
|
||
|
g_submenus_skins2 = GetSubMenu(GetSubMenu(main_menu, MAINMENU_OPTIONS_BASE), 1);
|
||
|
g_submenus_vis = GetSubMenu(main_menu, MAINMENU_OPTIONS_BASE + 2);
|
||
|
g_submenus_options = GetSubMenu(main_menu, MAINMENU_OPTIONS_BASE);
|
||
|
|
||
|
if (config_wlz_menu)
|
||
|
{
|
||
|
MENUITEMINFOW mii = {sizeof(mii), MIIM_SUBMENU | MIIM_TYPE | MIIM_ID, MFT_STRING, };
|
||
|
mii.hSubMenu = g_submenus_lang = CreatePopupMenu();
|
||
|
mii.dwTypeData = getStringW(IDS_LANGUAGEPACKS_MENU, NULL, 0);
|
||
|
mii.cch = (UINT)wcslen(mii.dwTypeData);
|
||
|
g_submenus_lang_id = mii.wID = unique_loword_command++;
|
||
|
InsertMenuItemW(main_menu, MAINMENU_OPTIONS_BASE+4, TRUE, &mii);
|
||
|
}
|
||
|
|
||
|
HMENU rating_menu = GetSubMenu(GetSubMenu(GetSubMenu(top_menu,2),5),10);
|
||
|
ConvertRatingMenuStar(rating_menu, ID_PL_RATING5);
|
||
|
ConvertRatingMenuStar(rating_menu, ID_PL_RATING4);
|
||
|
ConvertRatingMenuStar(rating_menu, ID_PL_RATING3);
|
||
|
ConvertRatingMenuStar(rating_menu, ID_PL_RATING2);
|
||
|
ConvertRatingMenuStar(rating_menu, ID_PL_RATING1);
|
||
|
|
||
|
rating_menu = GetSubMenu(GetSubMenu(GetSubMenu(top_menu,3),0),5);
|
||
|
ConvertRatingMenuStar(rating_menu, ID_RATING5);
|
||
|
ConvertRatingMenuStar(rating_menu, ID_RATING4);
|
||
|
ConvertRatingMenuStar(rating_menu, ID_RATING3);
|
||
|
ConvertRatingMenuStar(rating_menu, ID_RATING2);
|
||
|
ConvertRatingMenuStar(rating_menu, ID_RATING1);
|
||
|
|
||
|
Skin_Random();
|
||
|
Skin_Load();
|
||
|
|
||
|
g_skinloadedmanually = 0;
|
||
|
set_aot(0);
|
||
|
set_taskbar();
|
||
|
CheckMenuItem(main_menu, WINAMP_OPTIONS_EASYMOVE, config_easymove ? MF_CHECKED : MF_UNCHECKED);
|
||
|
CheckMenuItem(main_menu, WINAMP_FILE_SHUFFLE, config_shuffle ? MF_CHECKED : MF_UNCHECKED);
|
||
|
CheckMenuItem(main_menu, WINAMP_FILE_REPEAT, config_repeat ? MF_CHECKED : MF_UNCHECKED);
|
||
|
CheckMenuItem(GetSubMenu(GetSubMenu(top_menu, 3), 13), ID_VIDEOWND_VERTICALLYFLIP, (config_video_fliprgb ? MF_CHECKED: MF_UNCHECKED));
|
||
|
if (!config_timeleftmode)
|
||
|
CheckMenuItem(main_menu, WINAMP_OPTIONS_ELAPSED, MF_CHECKED);
|
||
|
else
|
||
|
CheckMenuItem(main_menu, WINAMP_OPTIONS_REMAINING, MF_CHECKED);
|
||
|
draw_setnoupdate(1);
|
||
|
draw_init();
|
||
|
draw_shuffle(config_shuffle, 0);
|
||
|
draw_eqplbut(config_eq_open, 0, config_pe_open, 0);
|
||
|
draw_repeat(config_repeat, 0);
|
||
|
draw_eject(0);
|
||
|
draw_buttonbar( -1);
|
||
|
draw_volumebar(config_volume, 0);
|
||
|
draw_panbar(config_pan, 0);
|
||
|
draw_songname(L"", &t, 0);
|
||
|
draw_playicon(2);
|
||
|
draw_clutterbar(0);
|
||
|
draw_monostereo(0);
|
||
|
draw_tbar(1, config_windowshade, 0);
|
||
|
draw_setnoupdate(0);
|
||
|
InsertMenuW(GetSystemMenu(hMainWindow, FALSE), 0, MF_POPUP | MF_BYPOSITION, (UINT_PTR) main_menu, L"Winamp");
|
||
|
InsertMenu(GetSystemMenu(hMainWindow, FALSE), 1, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
|
||
|
if (config_autoscrollname) SetTimer(hMainWindow, UPDATE_DISPLAY_TIMER + 1, 200, NULL);
|
||
|
|
||
|
if (config_shuffle) PlayList_randpos( -BIGINT);
|
||
|
dsp_init();
|
||
|
|
||
|
newversioncheck();
|
||
|
|
||
|
SetTimer(hMainWindow, STATS_TIMER, 1000, NULL);
|
||
|
}
|
||
|
|
||
|
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) // create the main Winamp window
|
||
|
{
|
||
|
int sc = config_minimized; // config_minimized gets trashed in WM_CREATE
|
||
|
deferring_show = 1;
|
||
|
|
||
|
main_Create();
|
||
|
out_setwnd();
|
||
|
|
||
|
if (!CreateWindowExW(0, L"Winamp EQ", getStringW(IDS_EQCAPTION, NULL, 0), WS_OVERLAPPED,
|
||
|
config_eq_wx, config_eq_wy, 0, 0, // WM_CREATE will size it
|
||
|
hMainWindow, NULL, hInstance, NULL)) return FALSE;
|
||
|
|
||
|
if (!CreateWindowExW(WS_EX_ACCEPTFILES, L"Winamp PE", getStringW(IDS_PECAPTION, NULL, 0), WS_OVERLAPPED,
|
||
|
config_pe_wx, config_pe_wy, 0, 0, // WM_CREATE will size it
|
||
|
hMainWindow, NULL, hInstance, NULL)) return FALSE;
|
||
|
|
||
|
if (!video_Create())
|
||
|
return FALSE;
|
||
|
|
||
|
hPLVisWindow = CreateWindowExW(0, L"WinampVis", L"", WS_CHILD,
|
||
|
0, 0, 0, 0,
|
||
|
hPLWindow, NULL, hMainInstance, NULL);
|
||
|
ShowWindow(hPLVisWindow, SW_SHOWNA);
|
||
|
|
||
|
eq_startuphack = pe_startuphack = 1;
|
||
|
|
||
|
if (config_eq_open)
|
||
|
{
|
||
|
config_eq_open = 0;
|
||
|
eq_dialog(hMainWindow,sc);
|
||
|
}
|
||
|
// MessageBox(NULL,"p4","0",0);
|
||
|
if (config_pe_open)
|
||
|
{
|
||
|
config_pe_open = 0;
|
||
|
pleditDlg(hMainWindow,sc);
|
||
|
}
|
||
|
if (config_video_open)
|
||
|
{
|
||
|
config_video_open = 0;
|
||
|
ShowVideoWindow(sc);
|
||
|
}
|
||
|
// MessageBox(NULL,"p5","0",0);
|
||
|
if (!config_mw_open)
|
||
|
{
|
||
|
MoveOffscreen(hMainWindow);
|
||
|
Ipc_WindowToggle(IPC_CB_WND_MAIN, config_mw_open);
|
||
|
//config_mw_open=1;
|
||
|
//SendMessageW(hMainWindow,WM_COMMAND,WINAMP_MAIN_WINDOW,0);
|
||
|
}
|
||
|
else
|
||
|
CheckMenuItem(main_menu, WINAMP_MAIN_WINDOW, MF_CHECKED);
|
||
|
|
||
|
eq_startuphack = pe_startuphack = 0;
|
||
|
|
||
|
/*
|
||
|
Browser_init();
|
||
|
if (config_si_open)
|
||
|
OpenBrowser();
|
||
|
*/
|
||
|
if (sc)
|
||
|
g_showcode = SW_SHOWMINIMIZED;
|
||
|
else if (nCmdShow == SW_SHOWMAXIMIZED || nCmdShow == SW_MAXIMIZE)
|
||
|
g_showcode = SW_SHOWNORMAL;
|
||
|
else
|
||
|
g_showcode = nCmdShow;
|
||
|
|
||
|
v5_top_menu = LPLoadMenu(WINAMP5_MENUBAR);
|
||
|
|
||
|
if (config_wlz_menu)
|
||
|
{
|
||
|
MENUITEMINFOW mii = {sizeof(mii), MIIM_SUBMENU | MIIM_TYPE | MIIM_ID, MFT_STRING, };
|
||
|
mii.hSubMenu = g_submenus_lang;
|
||
|
mii.dwTypeData = getStringW(IDS_LANGUAGEPACKS_MENU, NULL, 0);
|
||
|
mii.cch = (UINT)wcslen(mii.dwTypeData);
|
||
|
mii.wID = g_submenus_lang_id;
|
||
|
InsertMenuItemW(GetSubMenu(v5_top_menu, 2), 1, TRUE, &mii);
|
||
|
g_mm_ffoptionsbase_adj++;
|
||
|
}
|
||
|
|
||
|
SetTimer(hMainWindow, 200, 5, NULL); // defer main window showing
|
||
|
|
||
|
BeginFullscreenAppMonitor();
|
||
|
|
||
|
return TRUE;
|
||
|
}
|