winamp/Src/Winamp/main_wndproc.cpp

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;
}