mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-12-28 22:46:06 +00:00
253 lines
6.9 KiB
C++
253 lines
6.9 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 "../nu/ns_wc.h"
|
|
#include "../nu/AutoChar.h"
|
|
#include "../nu/AutoWide.h"
|
|
#include "../nu/AutoWideFn.h"
|
|
#include "./api.h"
|
|
#include "resource.h"
|
|
#include "wintheme.h"
|
|
|
|
// WM_CREATE handler
|
|
LRESULT Main_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
// srand(GetTickCount());
|
|
hMainWindow = hwnd;
|
|
DisableVistaPreview();
|
|
|
|
HACCEL hAccel = LoadAcceleratorsW(language_pack_instance, MAKEINTRESOURCEW(IDR_ACCELERATOR_GLOBAL));
|
|
if (!hAccel && language_pack_instance != hMainInstance) hAccel = LoadAcceleratorsW(hMainInstance, MAKEINTRESOURCEW(IDR_ACCELERATOR_GLOBAL));
|
|
if (hAccel) WASABI_API_APP->app_addAccelerators(hwnd, &hAccel, 1, TRANSLATE_MODE_GLOBAL);
|
|
|
|
hAccel = LoadAcceleratorsW(language_pack_instance, MAKEINTRESOURCEW(IDR_ACCELERATOR_MAIN));
|
|
if (!hAccel && language_pack_instance != hMainInstance) hAccel = LoadAcceleratorsW(hMainInstance, MAKEINTRESOURCEW(IDR_ACCELERATOR_MAIN));
|
|
if (hAccel) WASABI_API_APP->app_addAccelerators(hwnd, &hAccel, 1, TRANSLATE_MODE_NORMAL);
|
|
|
|
WASABI_API_APP->app_registerGlobalWindow(hwnd);
|
|
|
|
return 1;
|
|
} // Main_OnCreate()
|
|
|
|
// Message sent from system notification area
|
|
LRESULT Main_OnWASystray(HWND hwnd, int id)
|
|
{
|
|
POINT p;
|
|
switch (id)
|
|
{
|
|
case WM_LBUTTONUP:
|
|
if (GetAsyncKeyState(VK_CONTROL) & (1 << 15))
|
|
SendMessageW(hwnd, WM_COMMAND, WINAMP_FILE_LOC, 0);
|
|
else if (GetAsyncKeyState(VK_SHIFT) & (1 << 15))
|
|
SendMessageW(hwnd, WM_COMMAND, WINAMP_FILE_PLAY, 0);
|
|
else if (!IsWindowVisible(hwnd))
|
|
{
|
|
ShowWindow(hwnd, SW_RESTORE);
|
|
ShowWindow(hwnd, SW_SHOW);
|
|
}
|
|
else SetForegroundWindow(hwnd);
|
|
|
|
break;
|
|
case WM_RBUTTONUP:
|
|
GetCursorPos(&p);
|
|
SetForegroundWindow(hwnd);
|
|
//DoTrackPopup(main_menu, TPM_RIGHTBUTTON, p.x, p.y, hwnd);
|
|
TrackPopupMenu(main_menu, TPM_RIGHTBUTTON, p.x, p.y, 0, hwnd, NULL);
|
|
break;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
|
|
// WM_SIZE handler, to detect minizations.
|
|
LRESULT Main_OnSize(HWND hwnd, UINT state, int cx, int cy)
|
|
{
|
|
|
|
if (state == SIZE_MINIMIZED)
|
|
{
|
|
int q = GetAsyncKeyState(VK_SHIFT) >> 15;
|
|
if (config_taskbar || q || minimize_hack_winamp) ShowWindow(hwnd, SW_HIDE);
|
|
if (q || minimize_hack_winamp)
|
|
{
|
|
systray_minimize(caption);
|
|
config_minimized = 2;
|
|
}
|
|
else config_minimized = 1;
|
|
if (config_pe_open && hPLWindow){
|
|
HWND parent = GetParent(GetParent(hPLWindow));
|
|
if(IsWindow(parent) && IsWindowVisible(hPLWindow)){}
|
|
else ShowWindow(hPLWindow,SW_HIDE);
|
|
}
|
|
//if (config_mb_open&&hMBWindow) ShowWindow(hMBWindow,SW_HIDE);
|
|
if (config_eq_open && hEQWindow) ShowWindow(hEQWindow,SW_HIDE);
|
|
minimize_hack_winamp = 0;
|
|
}
|
|
else if (state == SIZE_RESTORED)
|
|
{
|
|
|
|
if (config_minimized == 2 && !(config_taskbar == 1 || config_taskbar == 2))
|
|
{
|
|
systray_restore();
|
|
}
|
|
if (g_taskbar_dirty)
|
|
{
|
|
g_taskbar_dirty = 0;
|
|
set_taskbar();
|
|
}
|
|
if (!IsWindowVisible(hwnd) && !deferring_show) ShowWindow(hwnd, SW_SHOWNA);
|
|
if (config_minimized) set_aot(0);
|
|
if (!config_mw_open) MoveOffscreen(hwnd);
|
|
config_minimized = 0;
|
|
SendMessageW(hwnd, WM_TIMER, UPDATE_DISPLAY_TIMER + 4, 0);
|
|
if (!deferring_show) SetForegroundWindow(hwnd);
|
|
if (config_pe_open && hPLWindow) ShowWindow(hPLWindow, SW_SHOWNA);
|
|
//if (config_mb_open&&hMBWindow) ShowWindow(hMBWindow,SW_SHOWNA);
|
|
if (config_eq_open && hEQWindow) ShowWindow(hEQWindow,SW_SHOWNA);
|
|
if (config_video_open && hVideoWindow) ShowWindow(hVideoWindow, SW_SHOWNA);
|
|
set_aot(0);
|
|
// Browser_toggleVisible(1);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
|
|
// Sent by decode thread to let the main program know it's done
|
|
LRESULT Main_OnWAMPEGEOF(HWND hwnd)
|
|
{
|
|
return PlayQueue_OnEOF();
|
|
}
|
|
|
|
// Drag&Drop handler
|
|
LRESULT Main_OnDropFiles(HWND hwnd, HDROP hdrop)
|
|
{
|
|
wchar_t temp[MAX_PATH] = {0};
|
|
int s = (GetAsyncKeyState(VK_SHIFT) & (1 << 15)) ? 0 : 1;
|
|
int y = DragQueryFileW(hdrop, 0xffffffff, temp, MAX_PATH);
|
|
if (s)
|
|
{
|
|
PlayList_delete();
|
|
PlayList_randpos(0);
|
|
}
|
|
for (int x = 0; x < y; x ++)
|
|
{
|
|
DragQueryFileW(hdrop, x, temp, MAX_PATH);
|
|
|
|
PlayList_appendthing(temp, 0, 0);
|
|
}
|
|
if (s)
|
|
BeginPlayback();
|
|
|
|
plEditRefresh();
|
|
|
|
return 1;
|
|
}
|
|
|
|
LRESULT Main_OnCopyData(HWND sendingHWND, COPYDATASTRUCT *cds)
|
|
{
|
|
switch (cds->dwData)
|
|
{
|
|
case IPC_SETSKIN:
|
|
if (cds->lpData && lstrlenA((char *)cds->lpData))
|
|
{
|
|
AutoWide dataW((char*)cds->lpData);
|
|
if (_wcsicmp(config_skin, dataW))
|
|
{
|
|
StringCchCopyW(config_skin, MAX_PATH, dataW);
|
|
}
|
|
SendMessageW(hMainWindow, WM_COMMAND, WINAMP_REFRESHSKIN, 0);
|
|
}
|
|
return TRUE;
|
|
case IPC_SETSKINW:
|
|
if (cds->lpData && lstrlenW((wchar_t*)cds->lpData))
|
|
{
|
|
if (_wcsicmp(config_skin, (wchar_t*)cds->lpData))
|
|
{
|
|
StringCchCopyW(config_skin, MAX_PATH, (wchar_t*)cds->lpData);
|
|
}
|
|
SendMessageW(hMainWindow, WM_COMMAND, WINAMP_REFRESHSKIN, 0);
|
|
}
|
|
return TRUE;
|
|
case IPC_CHDIR:
|
|
SetCurrentDirectoryA((char *) cds->lpData);
|
|
return TRUE;
|
|
case IPC_PLAYFILE:
|
|
{
|
|
char *filename = (char *)cds->lpData;
|
|
PlayList_appendthing(AutoWideFn(filename), 0, 0);
|
|
plEditRefresh();
|
|
}
|
|
return TRUE;
|
|
case IPC_PLAYFILEW:
|
|
{
|
|
wchar_t *filename = (wchar_t *)cds->lpData;
|
|
PlayList_appendthing(filename, 0, 0);
|
|
plEditRefresh();
|
|
}
|
|
return TRUE;
|
|
case IPC_GETMODULENAME:
|
|
{
|
|
char b[512] = {0}, b2[512] = {0};
|
|
GetModuleFileNameA(hMainInstance, b, sizeof(b));
|
|
GetShortPathNameA(b, b2, 511);
|
|
GetShortPathNameA((char *)cds->lpData, b, 511);
|
|
stat_isit = _stricmp(b, b2);
|
|
}
|
|
return TRUE;
|
|
case IPC_ADDBOOKMARK:
|
|
{
|
|
wchar_t* file = AutoWide((char *)cds->lpData);
|
|
Bookmark_additem(file, PlayList_gettitle(file, 1));
|
|
}
|
|
return TRUE;
|
|
case IPC_ADDBOOKMARKW:
|
|
{
|
|
Bookmark_additem((wchar_t *)cds->lpData, PlayList_gettitle((const wchar_t *)cds->lpData, 1));
|
|
}
|
|
return TRUE;
|
|
case IPC_GET_EXTENDED_FILE_INFOW_HOOKABLE:
|
|
{
|
|
wchar_t *filename = (wchar_t *)cds->lpData;
|
|
wchar_t *tagname = filename + wcslen(filename) + 1;
|
|
|
|
extendedFileInfoStructW info;
|
|
info.filename = filename;
|
|
info.metadata = tagname;
|
|
wchar_t ret[1024]=L"";
|
|
info.ret = ret;
|
|
info.retlen = 1024;
|
|
|
|
if (0 == SendMessageW(hMainWindow, WM_WA_IPC, (WPARAM)&info, IPC_GET_EXTENDED_FILE_INFOW_HOOKABLE))
|
|
ret[0] = L'\0';
|
|
|
|
COPYDATASTRUCT answer;
|
|
answer.lpData = info.ret;
|
|
answer.cbData = sizeof(ret);
|
|
answer.dwData = IPC_GET_EXTENDED_FILE_INFOW_HOOKABLE;
|
|
return SendMessageW(sendingHWND, WM_COPYDATA, (WPARAM)hMainWindow, (LPARAM)&answer);
|
|
}
|
|
case IPC_GET_PLAYING_FILENAME:
|
|
{
|
|
COPYDATASTRUCT answer;
|
|
answer.lpData = FileName;
|
|
answer.cbData = (DWORD)(sizeof(wchar_t) * (wcslen(FileName) + 1));
|
|
answer.dwData = IPC_GET_PLAYING_FILENAME;
|
|
return SendMessageW(sendingHWND, WM_COPYDATA, (WPARAM)hMainWindow, (LPARAM)&answer);
|
|
}
|
|
case IPC_OPEN_URL:
|
|
{
|
|
myOpenURL(hMainWindow, (wchar_t *)cds->lpData);
|
|
return TRUE;
|
|
}
|
|
case IPC_HANDLE_URI:
|
|
{
|
|
HandleFilename((wchar_t *)cds->lpData);
|
|
return TRUE;
|
|
}
|
|
}
|
|
return FALSE;
|
|
} |