/** (c) Nullsoft, Inc. C O N F I D E N T I A L ** Filename: ** Project: ** Description: ** Author: ** Created: **/ #include "Main.h" #include "../Plugins/General/gen_crasher/GetWinVer.h" #include "resource.h" #include "../Plugins/General/gen_ml/ml.h" #include "../nu/AutoWide.h" #include "api.h" #include "ExplorerFindFile.h" #include #include "vis.h" LRESULT sendMlIpc(int msg, WPARAM param); int g_open_ml_item_in_pe = 0; EXTERN_C BOOL eggTyping; void showLibrary() { SendMessageW(hMainWindow, WM_COMMAND, ID_FILE_SHOWLIBRARY, 0); } static void ToggleWindowShade_PL() { if (config_pe_height == 14) { if (config_pe_height_ws < 116) config_pe_height_ws = 116; config_pe_height = config_pe_height_ws; config_pe_height_ws = 0; } else { config_pe_height_ws = config_pe_height; config_pe_height = 14; } set_aot(1); } static void ToggleWindowShade_EQ() { config_eq_ws = !config_eq_ws; set_aot(1); draw_eq_tbar(GetForegroundWindow() == hEQWindow ? 1 : (config_hilite ? 0 : 1)); } static void ToggleWindowShade_Main() { config_windowshade = !config_windowshade; set_aot(1); draw_tbar(1, config_windowshade, eggstat); SendMessageW(hMainWindow, WM_TIMER, UPDATE_DISPLAY_TIMER + 4, 0); sa_setthread(config_sa); } // Big nasty command handler. // it calls Main_OnButtonX() for the button controls LRESULT Main_OnCommand(HWND hwnd, int wID, HWND hwndCtl, UINT codeNotify) { if (codeNotify == THBN_CLICKED && !atti_present) { switch (wID) { case 0: //previous { wID = WINAMP_BUTTON1; } break; case 1: //play { wID = WINAMP_BUTTON2; } break; case 2: //pause { wID = WINAMP_BUTTON3; } break; case 3: //stop { wID = WINAMP_BUTTON4; } break; case 4: //next { wID = WINAMP_BUTTON5; } break; default: return 1; } } if (1 == codeNotify && eggTyping) { BYTE kb[256] = {0}; if(GetKeyboardState(kb)) { for (INT i = 0x30; i < 0x87; i++) { if (0 != (0x80 & kb[i])) SendMessageW(hwnd, WM_KEYDOWN, i, 0L); } if (0 != (0x80 & kb[0x20])) SendMessageW(hwnd, WM_KEYDOWN, 0x20, 0L); } } if (LOWORD(wID) >= 34768 && LOWORD(wID) < g_BookmarkTop) { FILE *fp = _wfopen(BOOKMARKFILE8, L"rt"); if (fp) { int x = 0, id = LOWORD(wID)-34768; for (;;) { char ft[4096] = {0}, fn[MAX_PATH] = {0}; fgets(fn, MAX_PATH, fp); if (feof(fp)) break; fgets(ft, 4096, fp); if (feof(fp)) break; if (ft[0] && fn[0]) { if (fn[lstrlenA(fn) - 1] == '\n') fn[lstrlenA(fn) - 1] = 0; if (ft[lstrlenA(ft) - 1] == '\n') ft[lstrlenA(ft) - 1] = 0; if (ft[0] && fn[0]) { if (x++ == id) { // this will track the gen_ml or main play/enqueue setting // done as something which koopa requested back in 09/2011 // including following 'shift' to invert the default mode. int addtolist, enqplay = 0; if (got_ml) { enqplay = GetPrivateProfileIntW(L"MLEnqPlay", L"enqueuedef", -1, INI_FILE); if (enqplay != -1) { addtolist = (!!enqplay) ^ (!!(GetAsyncKeyState(VK_SHIFT)&0x8000)); } else { addtolist = (!!GetPrivateProfileIntW(L"gen_ml_config", L"enqueuedef", 0, ML_INI_FILE)) ^ (!!(GetAsyncKeyState(VK_SHIFT)&0x8000)); } } else addtolist = (!!config_addtolist) ^ (!!(GetAsyncKeyState(VK_SHIFT)&0x8000)); if(!addtolist) PlayList_delete(); PlayList_appendthing(AutoWideDup(fn, CP_UTF8), 0, 0); if(!addtolist) { if (config_shuffle) PlayList_setposition(PlayList_getNextPosition()); else PlayList_setposition(0); PlayList_getcurrent(FileName, FileTitle, FileTitleNum); } else { if (enqplay == 2) PlayList_setposition(PlayList_getlength()); } plEditRefresh(); if(!addtolist || enqplay == 2) StartPlaying(); break; } } } } fclose(fp); } return 1; } if (LOWORD(wID) >= 32767 && LOWORD(wID) < g_SkinTop) { wchar_t curfilename[MAX_PATH] = {0}; int id = LOWORD(wID); if (id >= 32768) { MENUITEMINFOW mi = {sizeof(mi), MIIM_DATA | MIIM_TYPE, MFT_STRING}; mi.dwTypeData = curfilename; mi.cch = MAX_PATH; GetMenuItemInfoW(main_menu, id, FALSE, &mi); if (mi.dwItemData == 1) StringCchCatW(curfilename, MAX_PATH, L".zip"); else if (mi.dwItemData == 2) StringCchCatW(curfilename, MAX_PATH, L".wsz"); else if (mi.dwItemData == 4) StringCchCatW(curfilename, MAX_PATH, L".wal"); } if (_wcsicmp(config_skin, curfilename)) { StringCchCopyW(config_skin, MAX_PATH, curfilename); SendMessageW(hMainWindow, WM_COMMAND, WINAMP_REFRESHSKIN, 0); if (prefs_last_page == 40 && IsWindow(prefs_hwnd)) { prefs_last_page = 0; prefs_dialog(1); prefs_last_page = 40; prefs_dialog(1); } } return 1; } if (LOWORD(wID) >= 34700 && LOWORD(wID) < g_LangTop && config_wlz_menu) { wchar_t curfilename[MAX_PATH]={0}; int id = LOWORD(wID); if (id >= 34701) { MENUITEMINFOW mi = {sizeof(mi), MIIM_DATA | MIIM_TYPE, MFT_STRING}; mi.dwTypeData = curfilename; mi.cch = MAX_PATH; GetMenuItemInfoW(main_menu, id, FALSE, &mi); if (mi.dwItemData == 1) StringCchCatW(curfilename, MAX_PATH, L".zip"); else if (mi.dwItemData == 2) StringCchCatW(curfilename, MAX_PATH, L".wlz"); } if (_wcsicmp(config_langpack, curfilename)) { LangSwitchToLangPrompt(hMainWindow, curfilename); } return 1; } if (LOWORD(wID) >= 45000 && LOWORD(wID) < 55000) { int id = LOWORD(wID); HWND mlhwnd = (HWND)sendMlIpc(0, 0); if (mlhwnd != NULL) { if (!g_open_ml_item_in_pe && !IsWindowVisible(mlhwnd)) SendMessageW(hMainWindow, WM_COMMAND, ID_FILE_SHOWLIBRARY, 0); // should switching the ml view to the target be disabled if we only want to play the playlist entry in the pe ? if (!g_open_ml_item_in_pe) SendMessageW(mlhwnd, WM_ML_IPC, id - 45000, ML_IPC_SETCURTREEITEM); } return 1; } switch (LOWORD(wID)) { case ID_HELP_HELPTOPICS: myOpenURL(hwnd, L"https://help.winamp.com/hc/sections/8103009633300-Winamp-Desktop-Player-"); break; case ID_HELP_FEEDBACK: { wchar_t url[512] = {0}, winVer[32] = {0}, build[32] = {0}; int nWinVer = 0; GetWinVer(winVer, &nWinVer, build); // May 2022 - this services url is dead and we currently don't have a replacement StringCchPrintfW(url, 512, L"http://services.winamp.com/redirect/support?reason=Feedback&subject=Winamp Feedback&product=Winamp Desktop&v=%s Build %d&platform=%s (%s)", WIDEN(APP_VERSION), BUILD_NUMBER, winVer, build); myOpenURL(hwnd, url); break; } case ID_VIS_NEXT: case ID_VIS_PREV: case ID_VIS_RANDOM: case ID_VIS_FS: case ID_VIS_CFG: case ID_VIS_MENU: if (hExternalVisWindow != NULL) SendMessageW(hExternalVisWindow, WM_COMMAND, LOWORD(wID) | (codeNotify << 16), 0); break; case EQ_ENABLE: case IDM_EQ_LOADPRE: case IDM_EQ_LOADMP3: case IDM_EQ_LOADDEFAULT: case ID_LOAD_EQF: case IDM_EQ_SAVEPRE: case IDM_EQ_SAVEMP3: case IDM_EQ_SAVEDEFAULT: case ID_SAVE_EQF: case IDM_EQ_DELPRE: case IDM_EQ_DELMP3: return SendMessageW(hEQWindow, WM_COMMAND, LOWORD(wID), 0); case ID_POST_PLAY_PLAYLIST: g_open_ml_item_in_pe = 0; return 0; case ID_MAIN_PLAY_AUDIOCD: case ID_MAIN_PLAY_AUDIOCD2: case ID_MAIN_PLAY_AUDIOCD3: case ID_MAIN_PLAY_AUDIOCD4: if (g_audiocdletter[LOWORD(wID) - ID_MAIN_PLAY_AUDIOCD]) { wchar_t s[32] = {0}; StopPlaying(0); StringCchPrintfW(s, 32, L"cda://%c", g_audiocdletter[LOWORD(wID) - ID_MAIN_PLAY_AUDIOCD]); PlayList_delete(); PlayList_appendthing(s, 0, 0); BeginPlayback(); plEditRefresh(); } return 1; case ID_PE_OPEN: { if (!playlist_open(g_dialog_box_parent ? g_dialog_box_parent : hMainWindow)) break; } return 1; case ID_PE_SAVEAS: savepls(DIALOG_PARENT(hMainWindow)); return 1; case WINAMP_EDIT_BOOKMARKS: MessageBoxW(hwnd, getStringW(IDS_ML_MISSING_FOR_BOOKMARKS,NULL,0), L"Winamp", MB_OK); return 1; case WINAMP_MAKECURBOOKMARK: { wchar_t fn[FILENAME_SIZE] = {0}, ft[FILETITLE_SIZE] = {0}; PlayList_getitem2W(PlayList_getPosition(), fn, ft); Bookmark_additem(fn, ft); } return 1; case WINAMP_LIGHTNING_CLICK: about_dialog(); return 1; case WINAMP_NEW_INSTANCE: { char buf[MAX_PATH] = "\""; STARTUPINFO si = {sizeof(si), }; PROCESS_INFORMATION pi; GetModuleFileNameA(NULL, buf + 1, sizeof(buf) - 1); StringCchCatA(buf, MAX_PATH, "\" /NEW"); config_write(1); CreateProcessA(NULL, buf, NULL, NULL, FALSE, 0, NULL, NULL,(LPSTARTUPINFOA)&si, &pi); } return 1; #if 0 case WINAMP_VIS_OPTIONS: { extern int last_classic_skin_page; last_classic_skin_page = 1; prefs_last_page = 22; prefs_dialog(1); } return 1; #endif case WINAMP_REFRESHSKIN: { g_skinloadedmanually = 1; SendMessageW(hwnd, WM_DISPLAYCHANGE, 0, 0); g_skinloadedmanually = 0; } if (config_pe_open) InvalidateRect(hPLWindow, NULL, FALSE); #if 0 if (config_mb_open) { RECT r; r.left = 0;r.top = 0;r.right = 11;r.bottom = config_mb_height; InvalidateRect(hMBWindow, &r, FALSE); r.left = 11;r.top = 0;r.right = config_mb_width;r.bottom = 20; InvalidateRect(hMBWindow, &r, FALSE); r.left = config_mb_width - 8;r.top = 20;r.right = config_mb_width;r.bottom = config_mb_height; InvalidateRect(hMBWindow, &r, FALSE); r.left = 11;r.top = config_mb_height - 38;r.right = config_mb_width - 8;r.bottom = config_mb_height; InvalidateRect(hMBWindow, &r, FALSE); } #endif if (config_eq_open) InvalidateRect(hEQWindow, NULL, FALSE); if (config_video_open) InvalidateRect(hVideoWindow, NULL, FALSE); // plugin wnds get the WM_DISPLAYCHANGE which is all they need return 1; case WINAMP_SELSKIN: prefs_last_page = 40; prefs_dialog(1); return 1; case WINAMP_VISPLUGIN: if (vis_running()) vis_stop(); else vis_start(hMainWindow, NULL); return 1; case WINAMP_PLGSETUP: prefs_last_page = 33; prefs_dialog(1); return 1; case WINAMP_TOGGLE_AUTOSCROLL: config_autoscrollname ^= 1; if (config_autoscrollname == 1) SetTimer(hwnd, UPDATE_DISPLAY_TIMER + 1, 200, NULL); else if (config_autoscrollname == 0) { KillTimer(hwnd, UPDATE_DISPLAY_TIMER + 1); ui_songposition = 0; draw_songname(FileTitle, &ui_songposition, playing ? in_getlength() : PlayList_getcurrentlength()); } return 1; case WINAMP_EDIT_ID3: if (FileName[0]) in_infobox(DIALOG_PARENT(hMainWindow), FileName); return 1; case WINAMP_OPTIONS_WINDOWSHADE_PL: // toggle windowshade ToggleWindowShade_PL(); return 1; case WINAMP_OPTIONS_WINDOWSHADE_EQ: ToggleWindowShade_EQ(); return 1; case WINAMP_OPTIONS_WINDOWSHADE: // toggle windowshade ToggleWindowShade_Main(); return 1; case WINAMP_OPTIONS_WINDOWSHADE_GLOBAL: // toggle windowshade { HWND hFocus = GetForegroundWindow(); if (hFocus == hPLWindow || IsChild(hFocus, hPLWindow)) ToggleWindowShade_PL(); else if (hFocus == hEQWindow || IsChild(hFocus, hEQWindow)) ToggleWindowShade_EQ(); else ToggleWindowShade_Main(); } return 1; case ID_PE_CLOSE: case WINAMP_MAIN_WINDOW: config_mw_open = !config_mw_open; if (config_mw_open) { if (config_pe_open && config_pe_width >= 350 && config_pe_height != 14) { RECT r = {config_pe_width - 150 - 75, config_pe_height - 26, r.left + 77, r.top + 16}; InvalidateRect(hPLWindow, &r, FALSE); } } else { MoveOffscreen(hwnd); } //sa_setthread(-1); CheckMenuItem(main_menu, WINAMP_MAIN_WINDOW, config_mw_open ? MF_CHECKED : MF_UNCHECKED); set_aot(0); Ipc_WindowToggle(IPC_CB_WND_MAIN, config_mw_open); case WINAMP_NEXT_WINDOW: EnterCriticalSection(&embedcs); { embedWindowState *p = embedwndlist; int x; int state = 0; for (x = 0; ; x ++) { HWND dockwnd = NULL; int vis = 0; if ( x == 0 ) { dockwnd = hMainWindow; vis = config_mw_open; } else if ( x == 1 ) { dockwnd = hEQWindow; vis = config_eq_open; } else if ( x == 2 ) { dockwnd = hPLWindow; vis = config_pe_open; } //else if (x == 3) { /*dockwnd = hMBWindow; vis = 0;*/ } // config_mb_open; } else if ( x == 4 ) { dockwnd = hVideoWindow; vis = config_video_open; } else { if ( !p ) { if ( state == 1 ) { p = embedwndlist; x = -1; state = 2; continue; } else break; } dockwnd = p->me; vis = IsWindowVisible( p->me ); } if (!state) { HWND fg = GetForegroundWindow(); if (fg == dockwnd || IsChild(dockwnd, fg)) { state = 1; } } else if (vis) { SetForegroundWindow(dockwnd); break; } // changed for 5.58 to cope with x == 3 as this can otherwise cause // one embedwnd to stay as the active window irrespective of doing // additional ctrl+tab actions as it was not wanting to handle x==3 if (x == 3 || x > 4) p = p->link; } } LeaveCriticalSection(&embedcs); return 1; case WINAMP_HELP_ABOUT: // about box about_dialog(); return 1; case WINAMP_PE_SEARCH: case WINAMP_JUMPFILE: jump_file_dialog(hMainWindow); return 1; case WINAMP_TOGGLE_LIBRARY: sendMlIpc(ML_IPC_TOGGLE_VISIBLE, 0); return 1; case WINAMP_JUMP: if (playing && in_mod && in_mod->is_seekable) { jump_dialog(hMainWindow); } return 1; case WINAMP_FFWD5S: // left and right arrows, fastforward and rewind by 5 seconds case WINAMP_REW5S: { int i; if (!in_mod || !in_mod->is_seekable || PlayList_ishidden(PlayList_getPosition())) return 1; if (LOWORD(wID) == WINAMP_FFWD5S) i = 5000; else i = -5000; if (playing) { int t; t = in_getouttime() + i; if (t < 0) t = 0; if (in_seek(t) < 0) SendMessageW(hwnd, WM_WA_MPEG_EOF, 0, 0); else { ui_drawtime(in_getouttime() / 1000, 0); } } } return 1; case WINAMP_MAINMENU: // alt-f for mainmenu { POINT p = { 6, 13 }; if (config_dsize) { p.x *= 2; p.y *= 2; } ClientToScreen(hwnd, &p); if ( /*p.x > 3000 || */p.y > OFFSCREEN_Y_POS && p.y < (OFFSCREEN_Y_POS + 2000) ) GetCursorPos(&p); DoTrackPopup(main_menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, p.x, p.y, hwnd); } return 1; case WINAMP_PREVSONG: { int s = 1; if (!config_shuffle && PlayList_advance( -1) < 0) { s = 0; if (config_repeat) { s = 1; PlayList_advance(BIGINT); } } if (s) { if (PlayList_getlength()) { if (config_shuffle) { if (PlayList_randpos( -1)) return 1; } PlayList_getcurrent(FileName, FileTitle, FileTitleNum); if (playing) { StopPlaying(0); StartPlaying(); } else StopPlaying(0); } } } return 0; case WINAMP_BUTTON1_SHIFT: // button 1 (previous), sent from either windowshade, case WINAMP_BUTTON1_CTRL: // keyboard shortcut, or normal buttons (ui.c) case WINAMP_BUTTON1: return (Main_OnButton1(hwnd, LOWORD(wID), hwndCtl, codeNotify)); case WINAMP_BUTTON2_SHIFT: // button 2 (play) case WINAMP_BUTTON2_CTRL: case WINAMP_BUTTON2: return (Main_OnButton2(hwnd, LOWORD(wID), hwndCtl, codeNotify)); case WINAMP_BUTTON3: // button 3 (pause) return (Main_OnButton3(hwnd, LOWORD(wID), hwndCtl, codeNotify)); case WINAMP_BUTTON4_CTRL: // button 4 (stop) case WINAMP_BUTTON4_SHIFT: // button 4 (stop) case WINAMP_BUTTON4: return (Main_OnButton4(hwnd, LOWORD(wID), hwndCtl, codeNotify)); case WINAMP_BUTTON5_CTRL: // button 5 (next) case WINAMP_BUTTON5_SHIFT: // button 5 (next) case WINAMP_BUTTON5: return (Main_OnButton5(hwnd, LOWORD(wID), hwndCtl, codeNotify)); case WINAMP_FILE_QUIT: // keyboard Alt-X or menu option if (g_exit_disabled) return 0; SendMessageW(hwnd, WM_CLOSE, 0, 0); return 1; case WINAMP_FILE_LOC: // open location getNewLocation(1, DIALOG_PARENT(hwnd)); plEditRefresh(); return 1; case WINAMP_FILE_PLAY: // open file(s) getNewFile(1, /*NULL*/DIALOG_PARENT(hwnd), 0); plEditRefresh(); return 1; case WINAMP_FILE_DIR: // open directory { BROWSEINFOW bi = {0}; wchar_t name[MAX_PATH] = {0}; bi.hwndOwner = DIALOG_PARENT(hwnd); bi.pszDisplayName = name; bi.lpszTitle = L"__foo"; bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE; bi.lpfn = BrowseCallbackProc; ITEMIDLIST *idlist = SHBrowseForFolderW(&bi); if (idlist) { wchar_t path[MAX_PATH] = {0}; SHGetPathFromIDListW( idlist, path ); Shell_Free(idlist); WASABI_API_APP->path_setWorkingPath(path); PlayList_delete(); PlayList_adddir(path, (config_rofiob&2) ? 0 : 1); if (config_rofiob&1) PlayList_sort(2, 0); BeginPlayback(); plEditRefresh(); } } return 1; case WINAMP_OPTIONS_PREFS: // open preferences prefs_dialog(0); return 1; case WINAMP_OPTIONS_AOT: // toggle always on top config_aot = !config_aot; set_aot(0); return 1; case WINAMP_OPTIONS_DSIZE: // toggle doublesize mode config_dsize = !config_dsize; if (!config_bifont && config_bifont_alt) draw_reinit_plfont(1); set_aot(1); return 1; case WINAMP_OPTIONS_EASYMOVE: // toggle easymove (easy window moving) config_easymove = !config_easymove; CheckMenuItem(main_menu, WINAMP_OPTIONS_EASYMOVE, config_easymove ? MF_CHECKED : MF_UNCHECKED); return 1; case WINAMP_FILE_SHUFFLE: // toggle shuffle (and draw button) config_shuffle = !config_shuffle; CheckMenuItem(main_menu, WINAMP_FILE_SHUFFLE, config_shuffle ? MF_CHECKED : MF_UNCHECKED); draw_shuffle(config_shuffle, 0); if (config_shuffle) PlayList_updaterandpos(); if (config_shuffle && !playing) { PlayList_randpos( -BIGINT); PlayList_getcurrent(FileName, FileTitle, FileTitleNum); //draw_songname(FileTitle, &ui_songposition, playing ? in_getlength() : PlayList_getcurrentlength()); } draw_songname(getStringW((config_shuffle ? IDS_SHUFFLE_ON : IDS_SHUFFLE_OFF), NULL, 0), &ui_songposition, -2); return 1; case WINAMP_FILE_REPEAT: // toggle repeat { config_repeat = !config_repeat; CheckMenuItem(main_menu, WINAMP_FILE_REPEAT, config_repeat ? MF_CHECKED : MF_UNCHECKED); draw_repeat(config_repeat, 0); UINT id = 0; if (!config_repeat) id = IDS_REPEAT_OFF; else if (config_repeat && config_pladv) id = IDS_REPEAT_PL; else if (config_repeat && !config_pladv) id = IDS_REPEAT_TRACK; if (id) draw_songname(getStringW(id, NULL, 0), &ui_songposition, -2); return 1; } case WINAMP_FILE_MANUALPLADVANCE: // toggle manual playlist advance { config_pladv = !config_pladv; UpdateManualAdvanceState(); UINT id = 0; if (!config_repeat) id = (config_pladv ? IDS_MAN_ADV_OFF : IDS_MAN_ADV_ON); else if (config_repeat && config_pladv) id = IDS_REPEAT_PL; else if (config_repeat && !config_pladv) id = IDS_REPEAT_TRACK; if (id) draw_songname(getStringW(id, NULL, 0), &ui_songposition, -2); return 1; } case WINAMP_OPTIONS_EQ: // toggle EQ window eq_dialog(hwnd,0); return 1; case WINAMP_OPTIONS_PLEDIT: // toggle playlist editor // if we get a 2 then it came from gen_ff so that we can work around a docking/position issue pleditDlg(hwnd,codeNotify==2); return 1; case WINAMP_OPTIONS_VIDEO: config_video_open ? HideVideoWindow(1) : ShowVideoWindow(0); return 1; case WINAMP_OPTIONS_TOGTIME: config_timeleftmode = !config_timeleftmode; CheckMenuItem(main_menu, WINAMP_OPTIONS_ELAPSED, config_timeleftmode ? MF_UNCHECKED : MF_CHECKED); CheckMenuItem(main_menu, WINAMP_OPTIONS_REMAINING, config_timeleftmode ? MF_CHECKED : MF_UNCHECKED); SendMessageW(hwnd, WM_TIMER, UPDATE_DISPLAY_TIMER + 4, 0); return 1; case WINAMP_OPTIONS_ELAPSED: // set time mode to elapsed config_timeleftmode = 0; CheckMenuItem(main_menu, WINAMP_OPTIONS_ELAPSED, MF_CHECKED); CheckMenuItem(main_menu, WINAMP_OPTIONS_REMAINING, MF_UNCHECKED); SendMessageW(hwnd, WM_TIMER, UPDATE_DISPLAY_TIMER + 4, 0); return 1; case WINAMP_OPTIONS_REMAINING: // set time mode to remaining config_timeleftmode = 1; CheckMenuItem(main_menu, WINAMP_OPTIONS_ELAPSED, MF_UNCHECKED); CheckMenuItem(main_menu, WINAMP_OPTIONS_REMAINING, MF_CHECKED); SendMessageW(hwnd, WM_TIMER, UPDATE_DISPLAY_TIMER + 4, 0); return 1; case WINAMP_VOLUMEUP: // increase volume by ~2% case WINAMP_VOLUMEDOWN: // decrease volume by ~2% if (LOWORD(wID) == WINAMP_VOLUMEUP) { if (config_volume <= 251) config_volume += 4; else config_volume = 255; } else { if (config_volume > 3) config_volume -= 4; else config_volume = 0; } in_setvol(config_volume); draw_volumebar(config_volume, 0); update_volume_text(-2); return 1; case WINAMP_JUMP10BACK: { int x; int i = playing; if (i) StopPlaying(0); for (x = 0; x < 10; x ++) SendMessageW(hwnd, WM_COMMAND, WINAMP_BUTTON1, 0); if (i) StartPlaying(); } return 1; case WINAMP_JUMP10FWD: { int x; int i = playing; if (i) StopPlaying(0); for (x = 0; x < 10; x ++) SendMessageW(hwnd, WM_COMMAND, WINAMP_BUTTON5, 0); if (i) StartPlaying(); } return 1; case WINAMP_GETMORESKINS: myOpenURLWithFallback(hwnd, L"http://www.google.com/search?q=Winamp+Skins", L"http://www.google.com/search?q=Winamp+Skins"); return 0; case WINAMP_VISCONF: { wchar_t b[MAX_PATH] = {0}; HINSTANCE hLib; PathCombineW(b, VISDIR, config_visplugin_name); hLib = LoadLibraryW(b); if (hLib) { winampVisModule *module = NULL; winampVisGetHeaderType pr = (winampVisGetHeaderType) GetProcAddress(hLib, "winampVisGetHeader"); winampVisHeader* pv = pr(hMainWindow); if (pv) module = pv->getModule(config_visplugin_num); if (module) { module->hDllInstance = hLib; module->hwndParent = hMainWindow; if (!(config_no_visseh&1)) { __try { module->Config(module); } __except(EXCEPTION_EXECUTE_HANDLER) { LPMessageBox(hwnd, IDS_PLUGINERROR, IDS_ERROR, MB_OK | MB_ICONEXCLAMATION); } } else { module->Config(module); } } else { LPMessageBox(hwnd, IDS_ERRORLOADINGPLUGIN, IDS_ERROR, MB_OK); } FreeLibrary(hLib); } } return 1; case WINAMP_MINIMIZE: if (GetAsyncKeyState(VK_SHIFT) >> 15) minimize_hack_winamp = 1; else minimize_hack_winamp = 0; ShowWindow(hMainWindow, SW_MINIMIZE); return 1; case WINAMP_VIDEO_TOGGLE_FS: videoToggleFullscreen(); return 1; case ID_MLFILE_NEWPLAYLIST: { HWND h = (HWND)sendMlIpc(0, 0); HWND fgw = GetForegroundWindow(); if (h && IsWindow(h) && IsWindowVisible(h) && IsChild(fgw, h)) sendMlIpc(ML_IPC_NEWPLAYLIST, (WPARAM)h); else sendMlIpc(ML_IPC_NEWPLAYLIST, (WPARAM)(g_dialog_box_parent ? g_dialog_box_parent : hMainWindow)); showLibrary(); } return 1; case ID_MLFILE_SAVEPLAYLIST: showLibrary(); { HWND h = (HWND)sendMlIpc(0, 0); HWND fgw = GetForegroundWindow(); if (h && IsWindow(h) && IsWindowVisible(h) && IsChild(fgw, h)) sendMlIpc(ML_IPC_SAVEPLAYLIST, (WPARAM)h); else sendMlIpc(ML_IPC_SAVEPLAYLIST, (WPARAM)(g_dialog_box_parent ? g_dialog_box_parent : hMainWindow)); } return 1; case ID_MLFILE_LOADPLAYLIST: { HWND h = (HWND)sendMlIpc(0, 0); HWND fgw = GetForegroundWindow(); if (h && IsWindow(h) && IsWindowVisible(h) && IsChild(fgw, h)) sendMlIpc(ML_IPC_IMPORTPLAYLIST, (WPARAM)h); else sendMlIpc(ML_IPC_IMPORTPLAYLIST, (WPARAM)(g_dialog_box_parent ? g_dialog_box_parent : hMainWindow)); showLibrary(); } return 1; case ID_MLFILE_IMPORTCURRENTPLAYLIST: sendMlIpc(ML_IPC_IMPORTCURRENTPLAYLIST, 0); showLibrary(); return 1; case ID_MLVIEW_MEDIA: #define TREE_LOCALMEDIA 1000 showLibrary(); sendMlIpc(ML_IPC_SETCURTREEITEM, TREE_LOCALMEDIA); return 1; case ID_MLVIEW_PLAYLISTS: #define TREE_PLAYLISTS 3001 showLibrary(); sendMlIpc(ML_IPC_SETCURTREEITEM, TREE_PLAYLISTS); return 1; case ID_MLVIEW_DEVICES: #define TREE_DEVICES 10000 showLibrary(); sendMlIpc(ML_IPC_SETCURTREEITEM, TREE_DEVICES); return 1; case ID_MLVIEW_INTERNETRADIO: #define TREE_INTERNET_RADIO 11000 showLibrary(); sendMlIpc(ML_IPC_SETCURTREEITEM, TREE_INTERNET_RADIO); return 1; case ID_MLVIEW_INTERNETTV: #define TREE_INTERNET_VIDEO 11001 showLibrary(); sendMlIpc(ML_IPC_SETCURTREEITEM, TREE_INTERNET_VIDEO); return 1; case ID_MLVIEW_LIBRARYPREFERENCES: showLibrary(); sendMlIpc(ML_IPC_OPENPREFS, 0); return 1; case ID_PLAY_VOLUMEUP: // increase by ~ 10% { int a = 5; while (a--) SendMessageW(hwnd, WM_COMMAND, WINAMP_VOLUMEUP, 0); } return 1; case ID_PLAY_VOLUMEDOWN: // decrease by ~10% { int a = 5; while (a--) SendMessageW(hwnd, WM_COMMAND, WINAMP_VOLUMEDOWN, 0); } return 1; case ID_RATING5: return setCurrentRating(5); case ID_RATING4: return setCurrentRating(4); case ID_RATING3: return setCurrentRating(3); case ID_RATING2: return setCurrentRating(2); case ID_RATING1: return setCurrentRating(1); case ID_RATING0: return setCurrentRating(0); case ID_PL_RATING5: return setPlRating(5); case ID_PL_RATING4: return setPlRating(4); case ID_PL_RATING3: return setPlRating(3); case ID_PL_RATING2: return setPlRating(2); case ID_PL_RATING1: return setPlRating(1); case ID_PL_RATING0: return setPlRating(0); case ID_PE_FFOD: { wchar_t fn[FILENAME_SIZE] = {0}; if (!PlayList_getitem2W(PlayList_getPosition(), fn, NULL)) { explorerFindFileManager->AddFile(fn); explorerFindFileManager->ShowFiles(); } } return 1; } // switch() return 0; } // Main_OnCommand()