mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-12-23 22:04:50 +01:00
1750 lines
57 KiB
C++
1750 lines
57 KiB
C++
/*
|
|
LICENSE
|
|
-------
|
|
Copyright 2005 Nullsoft, Inc.
|
|
All rights reserved.
|
|
|
|
Redistribution and use in source and binary forms, with or without modification,
|
|
are permitted provided that the following conditions are met:
|
|
|
|
* Redistributions of source code must retain the above copyright notice,
|
|
this list of conditions and the following disclaimer.
|
|
|
|
* Redistributions in binary form must reproduce the above copyright notice,
|
|
this list of conditions and the following disclaimer in the documentation
|
|
and/or other materials provided with the distribution.
|
|
|
|
* Neither the name of Nullsoft nor the names of its contributors may be used to
|
|
endorse or promote products derived from this software without specific prior written permission.
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
|
|
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
|
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
|
OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
|
#include <stdio.h>
|
|
#include <windows.h>
|
|
#include <windowsx.h>
|
|
#include "vis.h"
|
|
#include "draw.h"
|
|
#include "wnd.h"
|
|
#include "cfgwnd.h"
|
|
#include "r_defs.h"
|
|
#include "resource.h"
|
|
#include "render.h"
|
|
#include "undo.h"
|
|
#include <multimon.h>
|
|
|
|
#include "avs_eelif.h"
|
|
|
|
#define WINAMP_NEXT_WINDOW 40063
|
|
#include "wa_ipc.h"
|
|
#include "ff_ipc.h"
|
|
#include "../Agave/Language/api_language.h"
|
|
|
|
#ifndef WS_EX_LAYERED
|
|
#define WS_EX_LAYERED 0x80000
|
|
#endif
|
|
|
|
#ifndef LWA_ALPHA
|
|
#define LWA_ALPHA 2
|
|
#endif
|
|
|
|
#define ID_VIS_NEXT 40382
|
|
#define ID_VIS_PREV 40383
|
|
#define ID_VIS_RANDOM 40384
|
|
|
|
struct winampVisModule *g_mod;
|
|
extern volatile int g_ThreadQuit;
|
|
extern int /*g_preset_dirty,*/ config_prompt_save_preset, config_reuseonresize;
|
|
int g_saved_preset_dirty;
|
|
extern int cfg_cancelfs_on_deactivate;
|
|
|
|
extern char g_noeffectstr[];
|
|
#ifndef WA2_EMBED
|
|
static int cfg_x=100, cfg_y=100, cfg_w=400, cfg_h=300;
|
|
#endif
|
|
|
|
#ifndef WA2_EMBED
|
|
static HDC hFrameDC;
|
|
static HBITMAP hFrameBitmap, hFrameBitmap_old;
|
|
#else
|
|
embedWindowState myWindowState;
|
|
HWND g_hWA2ParentWindow;
|
|
#endif
|
|
|
|
int g_reset_vars_on_recompile=1; // fucko: add config for this
|
|
|
|
|
|
// Wharf integration
|
|
int inWharf=0;
|
|
int need_redock=0;
|
|
|
|
extern int cfg_fs_use_overlay;
|
|
extern int g_config_seh;
|
|
|
|
|
|
void toggleWharfAmpDock(HWND hwnd);
|
|
|
|
//-
|
|
|
|
int g_in_destroy=0,g_minimized=0,g_fakeinit=0;
|
|
|
|
int g_rnd_cnt;
|
|
char g_skin_name[MAX_PATH];
|
|
|
|
int debug_reg[8];
|
|
|
|
void GetClientRect_adj(HWND hwnd, RECT *r)
|
|
{
|
|
GetClientRect(hwnd,r);
|
|
#ifndef WA2_EMBED
|
|
if (!inWharf)
|
|
{
|
|
r->right-=7+6;
|
|
r->bottom-=15+5;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
HWND g_hwnd;
|
|
|
|
HWND hwnd_WinampParent;
|
|
extern HWND g_hwndDlg;
|
|
extern char last_preset[2048];
|
|
char *scanstr_back(char *str, char *toscan, char *defval)
|
|
{
|
|
char *s=str+strlen(str)-1;
|
|
if (strlen(str) < 1) return defval;
|
|
if (strlen(toscan) < 1) return defval;
|
|
while (1)
|
|
{
|
|
char *t=toscan;
|
|
while (*t)
|
|
if (*t++ == *s) return s;
|
|
t=CharPrev(str,s);
|
|
if (t==s) return defval;
|
|
s=t;
|
|
}
|
|
}
|
|
|
|
int LoadPreset(int preset)
|
|
{
|
|
char temp[MAX_PATH];
|
|
wsprintf(temp,"%s\\PRESET%02d.APH",g_path,preset);
|
|
if (g_render_transition->LoadPreset(temp,1))
|
|
return 0;
|
|
if (preset < 12) wsprintf(last_preset,"\\F%d.aph",preset+1);
|
|
else if (preset < 22) wsprintf(last_preset,"\\%d.aph",preset-12);
|
|
else if (preset < 32) wsprintf(last_preset,"\\Shift-%d.aph",preset-22);
|
|
return 1;
|
|
}
|
|
|
|
void WritePreset(int preset)
|
|
{
|
|
char temp[MAX_PATH];
|
|
wsprintf(temp,"%s\\PRESET%02d.APH",g_path,preset);
|
|
g_render_effects->__SavePreset(temp);
|
|
}
|
|
|
|
void my_getViewport( RECT *r, RECT *sr )
|
|
{
|
|
if ( sr )
|
|
{
|
|
HINSTANCE h = LoadLibraryW( L"user32.dll" );
|
|
if ( h )
|
|
{
|
|
HMONITOR( WINAPI * Mfr )( LPCRECT lpcr, DWORD dwFlags ) = ( HMONITOR( WINAPI * )( LPCRECT, DWORD ) ) GetProcAddress( h, "MonitorFromRect" );
|
|
BOOL( WINAPI * Gmi )( HMONITOR mon, LPMONITORINFO lpmi ) = ( BOOL( WINAPI * )( HMONITOR, LPMONITORINFO ) ) GetProcAddress( h, "GetMonitorInfoW" );
|
|
if ( Mfr && Gmi )
|
|
{
|
|
HMONITOR hm;
|
|
hm = Mfr( sr, MONITOR_DEFAULTTONULL );
|
|
if ( hm )
|
|
{
|
|
MONITORINFOEXW mi;
|
|
memset( &mi, 0, sizeof( mi ) );
|
|
mi.cbSize = sizeof( mi );
|
|
|
|
if ( Gmi( hm, &mi ) )
|
|
{
|
|
*r = mi.rcWork;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
FreeLibrary( h );
|
|
}
|
|
}
|
|
SystemParametersInfoW( SPI_GETWORKAREA, 0, r, 0 );
|
|
}
|
|
|
|
|
|
void SetTransparency(HWND hWnd, int enable, int amount)
|
|
{
|
|
#ifdef WA2_EMBED
|
|
// disable transparency if hosted in gen_ff
|
|
HWND w = myWindowState.me;
|
|
while (GetWindowLong(w, GWL_STYLE) & WS_CHILD) w = GetParent(w);
|
|
char classname[256];
|
|
GetClassName(w, classname, 255); classname[255] = 0;
|
|
if (!stricmp(classname, "BaseWindow_RootWnd")) return;
|
|
// --
|
|
#endif
|
|
|
|
DWORD dwLong;
|
|
HINSTANCE h;
|
|
void (__stdcall *a)(HWND h, int a, int b, int c);
|
|
|
|
hWnd=GetParent(hWnd);
|
|
|
|
dwLong = GetWindowLong(hWnd, GWL_EXSTYLE);
|
|
if(amount==255||!enable) {
|
|
if(dwLong&WS_EX_LAYERED)
|
|
SetWindowLong(hWnd, GWL_EXSTYLE, dwLong & ~WS_EX_LAYERED);
|
|
} else {
|
|
if(!(dwLong&WS_EX_LAYERED))
|
|
SetWindowLong(hWnd, GWL_EXSTYLE, dwLong | WS_EX_LAYERED);
|
|
h=LoadLibrary("USER32.DLL");
|
|
if(h!=NULL) {
|
|
a=(void (__stdcall *)(HWND,int,int,int))GetProcAddress(h,"SetLayeredWindowAttributes");
|
|
if(a!=NULL)
|
|
a(hWnd, RGB(0,0,0), amount, LWA_ALPHA);
|
|
FreeLibrary(h);
|
|
}
|
|
}
|
|
}
|
|
|
|
int readyToLoadPreset(HWND parent, int isnew)
|
|
{
|
|
if (config_prompt_save_preset && C_UndoStack::isdirty())
|
|
{
|
|
static int here;
|
|
if (here) return 0;
|
|
here=1;
|
|
|
|
// strange bugfix, ick
|
|
void Wnd_GoWindowed(HWND hwnd);
|
|
if (DDraw_IsFullScreen()) Wnd_GoWindowed(g_hwnd);
|
|
|
|
char title[48];
|
|
int ret=MessageBox(parent,
|
|
WASABI_API_LNGSTRING(!isnew?IDS_CURRENT_PRESET_EDITED_SAVE_BEFORE_LOAD:
|
|
IDS_CURRENT_PRESET_EDITED_SAVE_BEFORE_NEW),
|
|
WASABI_API_LNGSTRING_BUF(IDS_AVS_PRESET_MODIFIED,title,48),MB_YESNOCANCEL);
|
|
here=0;
|
|
|
|
if (ret == IDCANCEL)
|
|
{
|
|
return 0;
|
|
}
|
|
if (ret == IDYES)
|
|
{
|
|
int dosavePreset(HWND hwndDlg);
|
|
int r=1;
|
|
// if (last_preset[0])
|
|
// r=g_render_effects->SavePreset(last_preset);
|
|
|
|
if (r)
|
|
{
|
|
if (dosavePreset(parent)) return 0;
|
|
}
|
|
}
|
|
}
|
|
//C_UndoStack::clear();
|
|
// g_preset_dirty=0;
|
|
return 1;
|
|
}
|
|
|
|
char *extension(char *fn)
|
|
{
|
|
char *s = fn + strlen(fn);
|
|
while (s >= fn && *s != '.' && *s != '\\') s--;
|
|
if (s < fn) return fn;
|
|
if (*s == '\\') return fn;
|
|
return (s+1);
|
|
}
|
|
|
|
static int last_windowed_w, last_windowed_h;
|
|
void Wnd_GoWindowed(HWND hwnd)
|
|
{
|
|
if (DDraw_IsFullScreen())
|
|
{
|
|
#ifdef WA2_EMBED
|
|
SendMessage(g_mod->hwndParent,WM_WA_IPC,0,IPC_SET_VIS_FS_FLAG);
|
|
#endif
|
|
#if !defined(WA2_EMBED)
|
|
DDraw_SetFullScreen(0,cfg_w-7-6,cfg_h-15-5,cfg_fs_d&2,0);
|
|
#else
|
|
SetParent(hwnd,myWindowState.me);
|
|
SetWindowLong(hwnd,GWL_STYLE,WS_VISIBLE|WS_CHILDWINDOW|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_OVERLAPPED);
|
|
DDraw_SetFullScreen(0,last_windowed_w,last_windowed_h,cfg_fs_d&2,0);
|
|
HWND w = myWindowState.me;
|
|
while (GetWindowLong(w, GWL_STYLE) & WS_CHILD) w = GetParent(w);
|
|
ShowWindow(w,SW_SHOWNA);
|
|
#endif
|
|
|
|
if (cfg_cancelfs_on_deactivate) ShowCursor(TRUE);
|
|
int tm=(GetWindowLong(g_mod->hwndParent,GWL_EXSTYLE)&WS_EX_TOPMOST)==WS_EX_TOPMOST;
|
|
|
|
#if !defined(WA2_EMBED)
|
|
SetWindowPos(hwnd,tm?HWND_TOPMOST:HWND_NOTOPMOST,cfg_x,cfg_y,cfg_w,cfg_h,SWP_NOACTIVATE);
|
|
#else
|
|
PostMessage(GetParent(hwnd),WM_SIZE,0,0);
|
|
#endif
|
|
|
|
SetTransparency(hwnd,cfg_trans,cfg_trans_amount);
|
|
|
|
SetTimer(hwnd,88,100,NULL);
|
|
}
|
|
}
|
|
|
|
void Wnd_GoFullScreen(HWND hwnd)
|
|
{
|
|
if (!DDraw_IsFullScreen())
|
|
{
|
|
|
|
#if 1
|
|
#ifdef WA2_EMBED
|
|
if (SendMessage(g_mod->hwndParent,WM_WA_IPC,0,IPC_IS_PLAYING_VIDEO)>1)
|
|
{
|
|
PostMessage(hwnd,WM_USER+1667,1,2);
|
|
return;
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
extern int cfg_fs_use_overlay;
|
|
#ifdef WA2_EMBED
|
|
RECT r;
|
|
GetClientRect(hwnd,&r);
|
|
last_windowed_w=r.right;
|
|
last_windowed_h=r.bottom;
|
|
#endif
|
|
|
|
if (!DDraw_IsMode(cfg_fs_w,cfg_fs_h,cfg_fs_bpp))
|
|
{
|
|
int DDraw_PickMode(int *w, int *h, int *bpp);
|
|
if (!DDraw_PickMode(&cfg_fs_w,&cfg_fs_h,&cfg_fs_bpp))
|
|
return;
|
|
}
|
|
|
|
{
|
|
#ifdef WA2_EMBED
|
|
SendMessage(g_mod->hwndParent,WM_WA_IPC,1,IPC_SET_VIS_FS_FLAG);
|
|
#endif
|
|
RECT tr;
|
|
if (inWharf)
|
|
{
|
|
need_redock=1;
|
|
toggleWharfAmpDock(hwnd);
|
|
}
|
|
SetTransparency(hwnd,0,0);
|
|
if (cfg_cancelfs_on_deactivate) ShowCursor(FALSE);
|
|
GetWindowRect(hwnd,&tr);
|
|
if (cfg_cfgwnd_open) ShowWindow(g_hwndDlg,SW_HIDE);
|
|
if (!cfg_fs_use_overlay)
|
|
{
|
|
#if defined(WA2_EMBED)
|
|
SetWindowLong(hwnd,GWL_STYLE,WS_VISIBLE);
|
|
SetParent(hwnd,NULL);
|
|
HWND w = myWindowState.me;
|
|
while (GetWindowLong(w, GWL_STYLE) & WS_CHILD) w = GetParent(w);
|
|
ShowWindow(w,SW_HIDE);
|
|
#endif
|
|
DDraw_SetFullScreen(1,cfg_fs_w,cfg_fs_h,cfg_fs_d&1,cfg_fs_bpp);
|
|
RECT r;
|
|
my_getViewport(&r,&tr);
|
|
SetWindowPos(hwnd,HWND_TOPMOST,r.left,r.top,cfg_fs_w,cfg_fs_h,0);
|
|
SetForegroundWindow(hwnd);
|
|
}
|
|
else
|
|
{
|
|
#if defined(WA2_EMBED)
|
|
SetWindowLong(hwnd,GWL_STYLE,WS_VISIBLE);
|
|
SetParent(hwnd,NULL);
|
|
HWND w = myWindowState.me;
|
|
while (GetWindowLong(w, GWL_STYLE) & WS_CHILD) w = GetParent(w);
|
|
ShowWindow(w,SW_HIDE);
|
|
#endif
|
|
DDraw_SetFullScreen(1,cfg_fs_w,cfg_fs_h,cfg_fs_d&1,0);
|
|
}
|
|
}
|
|
#if 0
|
|
else
|
|
{
|
|
if (!cfg_cfgwnd_open)
|
|
{
|
|
ShowWindow(g_hwndDlg,SW_SHOWNA);
|
|
CfgWnd_RePopIfNeeded();
|
|
cfg_cfgwnd_open=1;
|
|
}
|
|
SendMessage(g_hwndDlg,WM_COMMAND,IDM_FULLSCREEN,0);
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
|
|
int g_config_smp_mt=2,g_config_smp=0;
|
|
static char *INI_FILE;
|
|
|
|
static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
|
|
|
|
int cfg_fs_dblclk=1;
|
|
|
|
int Wnd_Init(struct winampVisModule *this_mod)
|
|
{
|
|
WNDCLASS wc={0,};
|
|
g_mod=this_mod;
|
|
wc.style = CS_DBLCLKS|CS_VREDRAW|CS_HREDRAW;
|
|
wc.lpfnWndProc = WndProc;
|
|
wc.hInstance = this_mod->hDllInstance;
|
|
wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
|
|
wc.lpszClassName = "avswnd";
|
|
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
|
|
|
|
hwnd_WinampParent=this_mod->hwndParent;
|
|
|
|
|
|
if (!RegisterClass(&wc))
|
|
{
|
|
// MessageBox(this_mod->hwndParent,"Error registering window class","Error",MB_OK);
|
|
// return 1;
|
|
}
|
|
{
|
|
#ifndef REAPLAY_PLUGIN
|
|
INI_FILE = (char*)SendMessage(this_mod->hwndParent,WM_WA_IPC,0,IPC_GETINIFILE);
|
|
#else
|
|
extern const char *(*get_ini_file)();
|
|
INI_FILE = (char *)get_ini_file();
|
|
#endif
|
|
#define AVS_SECTION "AVS"
|
|
#ifdef LASER
|
|
#undef AVS_SECTION
|
|
#define AVS_SECTION "AVS_L"
|
|
extern int g_laser_nomessage,g_laser_zones;
|
|
g_laser_nomessage=GetPrivateProfileInt(AVS_SECTION,"laser_nomessage",0,INI_FILE);
|
|
g_laser_zones=GetPrivateProfileInt(AVS_SECTION,"laser_zones",1,INI_FILE);
|
|
#else
|
|
g_config_smp=GetPrivateProfileInt(AVS_SECTION,"smp",0,INI_FILE);
|
|
g_config_smp_mt=GetPrivateProfileInt(AVS_SECTION,"smp_mt",2,INI_FILE);
|
|
#endif
|
|
need_redock=GetPrivateProfileInt(AVS_SECTION,"cfg_docked",0,INI_FILE);
|
|
cfg_cfgwnd_x=GetPrivateProfileInt(AVS_SECTION,"cfg_cfgwnd_x",cfg_cfgwnd_x,INI_FILE);
|
|
cfg_cfgwnd_y=GetPrivateProfileInt(AVS_SECTION,"cfg_cfgwnd_y",cfg_cfgwnd_y,INI_FILE);
|
|
cfg_cfgwnd_open=GetPrivateProfileInt(AVS_SECTION,"cfg_cfgwnd_open",cfg_cfgwnd_open,INI_FILE);
|
|
cfg_fs_w=GetPrivateProfileInt(AVS_SECTION,"cfg_fs_w",cfg_fs_w,INI_FILE);
|
|
cfg_fs_h=GetPrivateProfileInt(AVS_SECTION,"cfg_fs_h",cfg_fs_h,INI_FILE);
|
|
cfg_fs_bpp=GetPrivateProfileInt(AVS_SECTION,"cfg_fs_bpp",cfg_fs_bpp,INI_FILE);
|
|
cfg_fs_d=GetPrivateProfileInt(AVS_SECTION,"cfg_fs_d",cfg_fs_d,INI_FILE);
|
|
cfg_fs_fps=GetPrivateProfileInt(AVS_SECTION,"cfg_fs_fps",6,INI_FILE);
|
|
cfg_fs_rnd=GetPrivateProfileInt(AVS_SECTION,"cfg_fs_rnd",cfg_fs_rnd,INI_FILE);
|
|
cfg_fs_rnd_time=GetPrivateProfileInt(AVS_SECTION,"cfg_fs_rnd_time",cfg_fs_rnd_time,INI_FILE);
|
|
cfg_fs_dblclk=GetPrivateProfileInt(AVS_SECTION,"cfg_fs_dblclk",cfg_fs_dblclk,INI_FILE);
|
|
cfg_fs_flip=GetPrivateProfileInt(AVS_SECTION,"cfg_fs_flip",cfg_fs_flip,INI_FILE);
|
|
cfg_fs_height=GetPrivateProfileInt(AVS_SECTION,"cfg_fs_height",cfg_fs_height,INI_FILE);
|
|
cfg_fs_use_overlay=GetPrivateProfileInt(AVS_SECTION,"cfg_fs_use_overlay",cfg_fs_use_overlay,INI_FILE);
|
|
cfg_cancelfs_on_deactivate=GetPrivateProfileInt(AVS_SECTION,"cfg_fs_cancelondeactivate",cfg_cancelfs_on_deactivate,INI_FILE);
|
|
cfg_speed=GetPrivateProfileInt(AVS_SECTION,"cfg_speed",cfg_speed,INI_FILE);
|
|
cfg_trans=GetPrivateProfileInt(AVS_SECTION,"cfg_trans",cfg_trans,INI_FILE);
|
|
cfg_dont_min_avs=GetPrivateProfileInt(AVS_SECTION,"cfg_dont_min_avs",cfg_dont_min_avs,INI_FILE);
|
|
cfg_smartbeat=GetPrivateProfileInt(AVS_SECTION,"cfg_smartbeat",cfg_smartbeat,INI_FILE);
|
|
cfg_smartbeatsticky=GetPrivateProfileInt(AVS_SECTION,"cfg_smartbeatsticky",cfg_smartbeatsticky,INI_FILE);
|
|
cfg_smartbeatresetnewsong=GetPrivateProfileInt(AVS_SECTION,"cfg_smartbeatresetnewsong",cfg_smartbeatresetnewsong,INI_FILE);
|
|
cfg_smartbeatonlysticky=GetPrivateProfileInt(AVS_SECTION,"cfg_smartbeatonlysticky",cfg_smartbeatonlysticky,INI_FILE);
|
|
GetPrivateProfileString( AVS_SECTION,"config_pres_subdir","",config_pres_subdir,sizeof(config_pres_subdir),INI_FILE);
|
|
GetPrivateProfileString( AVS_SECTION,"last_preset_name","",last_preset,sizeof(last_preset),INI_FILE);
|
|
cfg_transitions=GetPrivateProfileInt(AVS_SECTION,"cfg_transitions_en",cfg_transitions,INI_FILE);
|
|
cfg_transitions2=GetPrivateProfileInt(AVS_SECTION,"cfg_transitions_preinit",cfg_transitions2,INI_FILE);
|
|
cfg_transitions_speed=GetPrivateProfileInt(AVS_SECTION,"cfg_transitions_speed",cfg_transitions_speed,INI_FILE);
|
|
cfg_transition_mode=GetPrivateProfileInt(AVS_SECTION,"cfg_transitions_mode",cfg_transition_mode,INI_FILE);
|
|
cfg_bkgnd_render=GetPrivateProfileInt(AVS_SECTION,"cfg_bkgnd_render",cfg_bkgnd_render,INI_FILE);
|
|
cfg_bkgnd_render_color=GetPrivateProfileInt(AVS_SECTION,"cfg_bkgnd_render_color",cfg_bkgnd_render_color,INI_FILE);
|
|
cfg_render_prio=GetPrivateProfileInt(AVS_SECTION,"cfg_render_prio",cfg_render_prio,INI_FILE);
|
|
g_saved_preset_dirty=GetPrivateProfileInt(AVS_SECTION,"g_preset_dirty",C_UndoStack::isdirty(),INI_FILE);
|
|
config_prompt_save_preset=GetPrivateProfileInt(AVS_SECTION,"cfg_prompt_save_preset",config_prompt_save_preset,INI_FILE);
|
|
config_reuseonresize=GetPrivateProfileInt(AVS_SECTION,"cfg_reuseonresize",config_reuseonresize,INI_FILE);
|
|
g_log_errors=GetPrivateProfileInt(AVS_SECTION,"cfg_log_errors",g_log_errors,INI_FILE);
|
|
g_reset_vars_on_recompile=GetPrivateProfileInt(AVS_SECTION,"cfg_reset_vars",g_reset_vars_on_recompile,INI_FILE);
|
|
g_config_seh=GetPrivateProfileInt(AVS_SECTION,"cfg_seh",g_config_seh,INI_FILE);
|
|
|
|
|
|
#ifdef WA2_EMBED
|
|
memset(&myWindowState,0,sizeof(myWindowState));
|
|
myWindowState.r.left=GetPrivateProfileInt(AVS_SECTION,"wx",32,INI_FILE);
|
|
myWindowState.r.top=GetPrivateProfileInt(AVS_SECTION,"wy",32,INI_FILE);
|
|
myWindowState.r.right = GetPrivateProfileInt(AVS_SECTION,"ww",320,INI_FILE)+myWindowState.r.left;
|
|
myWindowState.r.bottom = GetPrivateProfileInt(AVS_SECTION,"wh",240,INI_FILE)+myWindowState.r.top;
|
|
#else
|
|
cfg_x=GetPrivateProfileInt(AVS_SECTION,"cfg_x",cfg_x,INI_FILE);
|
|
cfg_y=GetPrivateProfileInt(AVS_SECTION,"cfg_y",cfg_y,INI_FILE);
|
|
cfg_w=GetPrivateProfileInt(AVS_SECTION,"cfg_w",cfg_w,INI_FILE);
|
|
cfg_h=GetPrivateProfileInt(AVS_SECTION,"cfg_h",cfg_h,INI_FILE);
|
|
#endif
|
|
|
|
int x;
|
|
for (x = 0; x < 8; x ++)
|
|
{
|
|
char debugreg[32];
|
|
wsprintf(debugreg,"debugreg_%d",x);
|
|
debug_reg[x]=GetPrivateProfileInt(AVS_SECTION,debugreg,x,INI_FILE);
|
|
}
|
|
|
|
}
|
|
#ifdef LASER
|
|
cfg_transitions=0;
|
|
cfg_transition_mode=0;
|
|
cfg_transitions2=0;
|
|
#endif
|
|
|
|
g_in_destroy=0;
|
|
#ifndef WA2_EMBED
|
|
{
|
|
RECT ir={cfg_x,cfg_y,cfg_w+cfg_x,cfg_y+cfg_h};
|
|
RECT or;
|
|
my_getViewport(&or,&ir);
|
|
if (cfg_x < or.left) cfg_x=or.left;
|
|
if (cfg_y < or.top) cfg_y=or.top;
|
|
if (cfg_x > or.right-16) cfg_x=or.right-16;
|
|
if (cfg_y > or.bottom-16) cfg_y=or.bottom-16;
|
|
// determine bounding rectangle for window
|
|
}
|
|
#endif
|
|
#ifndef WA2_EMBED
|
|
int styles=WS_VISIBLE;
|
|
HWND par = g_minimized?NULL:this_mod->hwndParent;
|
|
#else
|
|
int styles=WS_CHILDWINDOW|WS_OVERLAPPED|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
|
|
HWND (*e)(embedWindowState *v) = NULL;
|
|
#ifndef REAPLAY_PLUGIN
|
|
*(void**)&e = (void *)SendMessage(this_mod->hwndParent,WM_WA_IPC,(LPARAM)0,IPC_GET_EMBEDIF);
|
|
HWND par=0;
|
|
if (e) par=e(&myWindowState);
|
|
if (par) SetWindowText(par,"AVS");
|
|
#else
|
|
HWND par = this_mod->hwndParent;
|
|
#endif
|
|
g_hWA2ParentWindow=par;
|
|
#endif
|
|
|
|
#ifndef WA2_EMBED
|
|
|
|
CreateWindowEx(WS_EX_ACCEPTFILES,"avswnd","Winamp AVS Display",
|
|
styles,cfg_x,cfg_y,cfg_w,cfg_h,par,NULL,
|
|
this_mod->hDllInstance,0);
|
|
#else
|
|
CreateWindowEx(WS_EX_ACCEPTFILES,"avswnd","avs",
|
|
styles,0,0,100,100,par,NULL, this_mod->hDllInstance,0);
|
|
SendMessage(this_mod->hwndParent, WM_WA_IPC, (int)g_hwnd, IPC_SETVISWND);
|
|
#endif
|
|
if (!g_hwnd)
|
|
{
|
|
char title[32];
|
|
MessageBox(this_mod->hwndParent,WASABI_API_LNGSTRING(IDS_ERROR_CREATING_WINDOW),
|
|
WASABI_API_LNGSTRING_BUF(IDS_AVS_ERROR,title,32),MB_OK);
|
|
return 1;
|
|
}
|
|
#ifndef REAPLAY_PLUGIN
|
|
#ifdef WA2_EMBED
|
|
ShowWindow(g_hwnd,SW_SHOWNA);
|
|
ShowWindow(par,SW_SHOWNA);
|
|
#endif
|
|
#endif
|
|
SetTransparency(g_hwnd,cfg_trans,cfg_trans_amount);
|
|
return 0;
|
|
}
|
|
|
|
static void WriteInt(char *name, int value)
|
|
{
|
|
char str[128];
|
|
wsprintf(str,"%d",value);
|
|
WritePrivateProfileString(AVS_SECTION,name,str,INI_FILE);
|
|
}
|
|
|
|
void Wnd_Quit(void)
|
|
{
|
|
extern HWND g_hwndDlg;
|
|
g_in_destroy=1;
|
|
#ifdef WA2_EMBED
|
|
SendMessage(g_mod->hwndParent, WM_WA_IPC, 0, IPC_SETVISWND);
|
|
if (myWindowState.me)
|
|
{
|
|
SetForegroundWindow(g_mod->hwndParent);
|
|
DestroyWindow(myWindowState.me);
|
|
}
|
|
else
|
|
#endif
|
|
if (g_hwnd && IsWindow(g_hwnd)) DestroyWindow(g_hwnd);
|
|
g_hwnd=NULL;
|
|
UnregisterClass("avswnd",g_mod->hDllInstance);
|
|
{
|
|
#ifdef LASER
|
|
extern int g_laser_zones,g_laser_nomessage;
|
|
wsprintf(str,"%d",g_laser_zones);
|
|
WriteInt("laser_zones",g_laser_zones);
|
|
WriteInt("laser_nomessage",g_laser_nomessage);
|
|
#else
|
|
WriteInt("smp",g_config_smp);
|
|
WriteInt("smp_mt",g_config_smp_mt);
|
|
#endif
|
|
#ifdef WA2_EMBED
|
|
WriteInt("wx",myWindowState.r.left);
|
|
WriteInt("wy",myWindowState.r.top);
|
|
WriteInt("ww",myWindowState.r.right-myWindowState.r.left);
|
|
WriteInt("wh",myWindowState.r.bottom-myWindowState.r.top);
|
|
#else
|
|
WriteInt("cfg_x",cfg_x);
|
|
WriteInt("cfg_y",cfg_y);
|
|
WriteInt("cfg_w",cfg_w);
|
|
WriteInt("cfg_h",cfg_h);
|
|
#endif
|
|
WritePrivateProfileString(AVS_SECTION,"config_pres_subdir",config_pres_subdir,INI_FILE);
|
|
|
|
WriteInt("cfg_docked",inWharf?1:0);
|
|
WriteInt("cfg_cfgwnd_open",cfg_cfgwnd_open);
|
|
WriteInt("cfg_cfgwnd_x",cfg_cfgwnd_x);
|
|
WriteInt("cfg_cfgwnd_y",cfg_cfgwnd_y);
|
|
WriteInt("cfg_fs_w",cfg_fs_w);
|
|
WriteInt("cfg_fs_h",cfg_fs_h);
|
|
WriteInt("cfg_fs_d",cfg_fs_d);
|
|
WriteInt("cfg_fs_bpp",cfg_fs_bpp);
|
|
WriteInt("cfg_fs_fps",cfg_fs_fps);
|
|
WriteInt("cfg_fs_rnd",cfg_fs_rnd);
|
|
WriteInt("cfg_fs_rnd_time",cfg_fs_rnd_time);
|
|
WriteInt("cfg_fs_dblclk",cfg_fs_dblclk);
|
|
WriteInt("cfg_fs_flip",cfg_fs_flip);
|
|
WriteInt("cfg_fs_height",cfg_fs_height);
|
|
WriteInt("cfg_fs_use_overlay",cfg_fs_use_overlay);
|
|
WriteInt("cfg_fs_cancelondeactivate",cfg_cancelfs_on_deactivate);
|
|
WriteInt("cfg_speed",cfg_speed);
|
|
WriteInt("cfg_trans",cfg_trans);
|
|
WriteInt("cfg_dont_min_avs",cfg_dont_min_avs);
|
|
WriteInt("cfg_smartbeat",cfg_smartbeat);
|
|
WriteInt("cfg_smartbeatsticky",cfg_smartbeatsticky);
|
|
WriteInt("cfg_smartbeatresetnewsong",cfg_smartbeatresetnewsong);
|
|
WriteInt("cfg_smartbeatonlysticky",cfg_smartbeatonlysticky);
|
|
WriteInt("cfg_transitions_en",cfg_transitions);
|
|
WriteInt("cfg_transitions_preinit",cfg_transitions2);
|
|
WriteInt("cfg_transitions_speed",cfg_transitions_speed);
|
|
WriteInt("cfg_transitions_mode",cfg_transition_mode);
|
|
WriteInt("cfg_bkgnd_render",cfg_bkgnd_render);
|
|
WriteInt("cfg_bkgnd_render_color",cfg_bkgnd_render_color);
|
|
WriteInt("cfg_render_prio",cfg_render_prio);
|
|
WriteInt("g_preset_dirty",C_UndoStack::isdirty());
|
|
WriteInt("cfg_prompt_save_preset",config_prompt_save_preset);
|
|
WritePrivateProfileString(AVS_SECTION,"last_preset_name",last_preset,INI_FILE);
|
|
WriteInt("cfg_reuseonresize",config_reuseonresize);
|
|
WriteInt("cfg_log_errors",g_log_errors);
|
|
WriteInt("cfg_reset_vars",g_reset_vars_on_recompile);
|
|
WriteInt("cfg_seh",g_config_seh);
|
|
|
|
int x;
|
|
for (x = 0; x < 8; x ++)
|
|
{
|
|
char debugreg[32];
|
|
wsprintf(debugreg,"debugreg_%d",x);
|
|
WriteInt(debugreg,debug_reg[x]);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void toggleWharfAmpDock(HWND hwnd)
|
|
{
|
|
if (DDraw_IsFullScreen()) return;
|
|
HWND Wharf=g_hwndDlg?GetDlgItem(g_hwndDlg,IDC_RRECT):NULL;
|
|
if (!Wharf) return;
|
|
|
|
if (!inWharf)
|
|
{
|
|
RECT r,r2;
|
|
|
|
// show IDC_RRECT, resize IDC_TREE1 down
|
|
GetWindowRect(GetDlgItem(g_hwndDlg,IDC_RRECT),&r);
|
|
GetWindowRect(GetDlgItem(g_hwndDlg,IDC_TREE1),&r2);
|
|
SetWindowPos(GetDlgItem(g_hwndDlg,IDC_TREE1),NULL,0,0,r2.right-r2.left,r.top - 4 - r2.top,SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE);
|
|
ShowWindow(GetDlgItem(g_hwndDlg,IDC_RRECT),SW_SHOWNA);
|
|
|
|
#ifdef WA2_EMBED
|
|
GetClientRect(hwnd,&r);
|
|
last_windowed_w=r.right;
|
|
last_windowed_h=r.bottom;
|
|
#endif
|
|
inWharf=1;
|
|
GetWindowRect(Wharf, &r);
|
|
SetParent(hwnd, Wharf);
|
|
#ifndef WA2_EMBED
|
|
SetWindowLong(hwnd, GWL_STYLE, (GetWindowLong(hwnd,GWL_STYLE)&(~WS_POPUP))|WS_CHILD);
|
|
#else
|
|
HWND w = g_hWA2ParentWindow;
|
|
while (GetWindowLong(w, GWL_STYLE) & WS_CHILD)
|
|
{
|
|
w = GetParent(w);
|
|
}
|
|
if (!SendMessage(g_mod->hwndParent, WM_WA_IPC, (int)w, IPC_FF_ISMAINWND)) ShowWindow(w,SW_HIDE);
|
|
else ShowWindow(g_hWA2ParentWindow,SW_HIDE);
|
|
#endif
|
|
SetWindowPos(hwnd, NULL, 0, 0, r.right-r.left, r.bottom-r.top, SWP_NOZORDER|SWP_NOACTIVATE);
|
|
DDraw_Resize(r.right-r.left, r.bottom-r.top,cfg_fs_d&2);
|
|
}
|
|
else
|
|
{
|
|
|
|
RECT r,r2;
|
|
// hide IDC_RRECT, resize IDC_TREE1 up
|
|
GetWindowRect(GetDlgItem(g_hwndDlg,IDC_RRECT),&r);
|
|
GetWindowRect(GetDlgItem(g_hwndDlg,IDC_TREE1),&r2);
|
|
ShowWindow(GetDlgItem(g_hwndDlg,IDC_RRECT),SW_HIDE);
|
|
SetWindowPos(GetDlgItem(g_hwndDlg,IDC_TREE1),NULL,0,0,r2.right-r2.left,r.bottom - r2.top - 2,SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE);
|
|
|
|
#ifndef WA2_EMBED
|
|
SetWindowLong(hwnd, GWL_STYLE, (GetWindowLong(hwnd,GWL_STYLE)&(~(WS_CHILD|WS_VISIBLE)))|WS_POPUP);
|
|
SetParent(hwnd, NULL);
|
|
SetWindowPos(hwnd, NULL, cfg_x, cfg_y, cfg_w,cfg_h, SWP_NOZORDER|SWP_NOACTIVATE);
|
|
DDraw_Resize(cfg_w-7-6,cfg_h-15-5,cfg_fs_d&2);
|
|
ShowWindow(hwnd,SW_SHOWNA);
|
|
#else
|
|
SetParent(hwnd, g_hWA2ParentWindow);
|
|
DDraw_Resize(last_windowed_w,last_windowed_h,cfg_fs_d&2);
|
|
|
|
HWND w = g_hWA2ParentWindow;
|
|
while (GetWindowLong(w, GWL_STYLE) & WS_CHILD)
|
|
{
|
|
w = GetParent(w);
|
|
}
|
|
if (SendMessage(g_mod->hwndParent, WM_WA_IPC, (int)w, IPC_FF_ISMAINWND))
|
|
w=g_hWA2ParentWindow;
|
|
|
|
PostMessage(GetParent(hwnd),WM_SIZE,0,0);
|
|
|
|
ShowWindow(w,SW_SHOWNA);
|
|
|
|
//SetWindowPos(hwnd,0,0,0,cfg_w,cfg_h,SWP_NOACTIVATE|SWP_NOZORDER);
|
|
//SetTimer(hwnd,66,500,NULL);
|
|
#endif
|
|
InvalidateRect(Wharf,NULL,TRUE);
|
|
inWharf=0;
|
|
}
|
|
}
|
|
|
|
int findInMenu(HMENU parent, HMENU sub, UINT id, char *buf, int buf_len)
|
|
{
|
|
int x,l=GetMenuItemCount(parent);
|
|
char *bufadd=buf+strlen(buf);
|
|
bufadd[0]='\\';
|
|
for (x = 0; x < l; x ++)
|
|
{
|
|
MENUITEMINFO mi={sizeof(mi),MIIM_SUBMENU|MIIM_TYPE|MIIM_ID,};
|
|
mi.dwTypeData=bufadd+1;
|
|
mi.cch=buf_len - (bufadd-buf+2);
|
|
GetMenuItemInfo(parent,x,TRUE,&mi);
|
|
if (mi.hSubMenu)
|
|
{
|
|
if (sub && mi.hSubMenu == sub)
|
|
return 1;
|
|
if (findInMenu(mi.hSubMenu,sub,id,buf,buf_len))
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
if (!sub && id && mi.wID == id)
|
|
return 1;
|
|
}
|
|
}
|
|
bufadd[0]=0;
|
|
return 0;
|
|
}
|
|
|
|
static int find_preset(char *parent_path, int dir, char *lastpreset, char *newpreset, int *state)
|
|
{
|
|
HANDLE h;
|
|
WIN32_FIND_DATA d;
|
|
char dirmask[4096];
|
|
wsprintf(dirmask,"%s\\*.avs",parent_path);
|
|
h = FindFirstFile(dirmask,&d);
|
|
if (h != INVALID_HANDLE_VALUE)
|
|
{
|
|
do
|
|
{
|
|
if (!(d.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
|
{
|
|
wsprintf(dirmask,"%s\\%s",parent_path,d.cFileName);
|
|
|
|
if (lastpreset)
|
|
{
|
|
if (*state)
|
|
{
|
|
strcpy(newpreset,dirmask);
|
|
FindClose(h);
|
|
return 1;
|
|
}
|
|
if (dir > 0)
|
|
{
|
|
if (!newpreset[0]) // save the first one we find, in case we fail (wrap)
|
|
strcpy(newpreset,dirmask);
|
|
|
|
if (!stricmp(dirmask,lastpreset)) *state=1;
|
|
}
|
|
if (dir < 0)
|
|
{
|
|
if (!stricmp(dirmask,lastpreset))
|
|
{
|
|
if (newpreset[0]) { // if we find it first, skip it so we can go to the end :)
|
|
FindClose(h);
|
|
return 1;
|
|
}
|
|
}
|
|
strcpy(newpreset,dirmask);
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
int cnt=++(*state);
|
|
if (cnt < 1) cnt=1;
|
|
int r=((rand()&1023)<<10)|(rand()&1023);
|
|
if (r < (1024*1024)/cnt)
|
|
{
|
|
strcpy(newpreset,dirmask);
|
|
}
|
|
}
|
|
}
|
|
} while (FindNextFile(h,&d));
|
|
FindClose(h);
|
|
}
|
|
wsprintf(dirmask,"%s\\*.*",parent_path);
|
|
h = FindFirstFile(dirmask,&d);
|
|
if (h != INVALID_HANDLE_VALUE)
|
|
{
|
|
do
|
|
{
|
|
if (d.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && d.cFileName[0] != '.')
|
|
{
|
|
wsprintf(dirmask,"%s\\%s",parent_path,d.cFileName);
|
|
if (find_preset(dirmask,dir,lastpreset,newpreset,state)) {
|
|
FindClose(h);
|
|
return 1;
|
|
}
|
|
}
|
|
} while (FindNextFile(h,&d));
|
|
FindClose(h);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void next_preset(HWND hwnd) {
|
|
g_rnd_cnt=0;
|
|
|
|
if (readyToLoadPreset(hwnd,0))
|
|
{
|
|
char dirmask[2048];
|
|
char i_path[1024];
|
|
if (config_pres_subdir[0]) wsprintf(i_path,"%s\\%s",g_path,config_pres_subdir);
|
|
else strcpy(i_path,g_path);
|
|
|
|
dirmask[0]=0;
|
|
|
|
int state=0;
|
|
find_preset(i_path,1,last_preset,dirmask,&state);
|
|
|
|
if (dirmask[0] && stricmp(last_preset,dirmask))
|
|
{
|
|
if (g_render_transition->LoadPreset(dirmask,2) != 2)
|
|
lstrcpyn(last_preset,dirmask,sizeof(last_preset));
|
|
}
|
|
}
|
|
}
|
|
|
|
void random_preset(HWND hwnd) {
|
|
g_rnd_cnt=0;
|
|
if (readyToLoadPreset(hwnd,0))
|
|
{
|
|
char dirmask[2048];
|
|
char i_path[1024];
|
|
if (config_pres_subdir[0]) wsprintf(i_path,"%s\\%s",g_path,config_pres_subdir);
|
|
else strcpy(i_path,g_path);
|
|
|
|
dirmask[0]=0;
|
|
|
|
int state=0;
|
|
find_preset(i_path,0,NULL,dirmask,&state);
|
|
|
|
if (dirmask[0])
|
|
{
|
|
if (g_render_transition->LoadPreset(dirmask,4) != 2)
|
|
lstrcpyn(last_preset,dirmask,sizeof(last_preset));
|
|
}
|
|
}
|
|
}
|
|
|
|
void previous_preset(HWND hwnd) {
|
|
g_rnd_cnt=0;
|
|
if (readyToLoadPreset(hwnd,0))
|
|
{
|
|
char dirmask[2048];
|
|
char i_path[1024];
|
|
if (config_pres_subdir[0]) wsprintf(i_path,"%s\\%s",g_path,config_pres_subdir);
|
|
else strcpy(i_path,g_path);
|
|
|
|
dirmask[0]=0;
|
|
|
|
int state=0;
|
|
find_preset(i_path,-1,last_preset,dirmask,&state);
|
|
|
|
if (dirmask[0] && stricmp(last_preset,dirmask))
|
|
{
|
|
if (g_render_transition->LoadPreset(dirmask,2) != 2)
|
|
lstrcpyn(last_preset,dirmask,sizeof(last_preset));
|
|
}
|
|
}
|
|
}
|
|
|
|
static HMENU presetTreeMenu;
|
|
static int presetTreeCount;
|
|
|
|
void DoPopupMenu() {
|
|
// Winamp3 Bug#331: Don't let the popupmenu pop when in fullscreen.
|
|
if (!DDraw_IsFullScreen())
|
|
{
|
|
void DDraw_NoUpdateScreen(int r);
|
|
HANDLE h;
|
|
WIN32_FIND_DATA d;
|
|
char dirmask[1024];
|
|
|
|
if (presetTreeMenu) DestroyMenu(presetTreeMenu);
|
|
|
|
POINT p;
|
|
int x;
|
|
int insert_pos=0, directory_pos=0;
|
|
presetTreeMenu=CreatePopupMenu();
|
|
|
|
{
|
|
MENUITEMINFO i={sizeof(i),};
|
|
i.fMask=MIIM_TYPE|MIIM_DATA|MIIM_ID;
|
|
i.fType=MFT_STRING;
|
|
i.dwItemData=0;
|
|
|
|
i.wID = 1024;
|
|
i.dwTypeData=WASABI_API_LNGSTRING(IDS_FULLSCREEN);
|
|
i.cch=strlen(i.dwTypeData);
|
|
InsertMenuItem(presetTreeMenu,insert_pos++,TRUE,&i);
|
|
|
|
if (!inWharf)
|
|
{
|
|
i.wID = 256;
|
|
i.dwTypeData=WASABI_API_LNGSTRING(IDS_AVS_EDITOR);
|
|
i.cch=strlen(i.dwTypeData);
|
|
InsertMenuItem(presetTreeMenu,insert_pos++,TRUE,&i);
|
|
}
|
|
|
|
if (!DDraw_IsFullScreen())
|
|
{
|
|
i.wID = 512;
|
|
i.dwTypeData=WASABI_API_LNGSTRING(IDS_DOCK_IN_AVS_EDITOR);
|
|
i.cch=strlen(i.dwTypeData);
|
|
InsertMenuItem(presetTreeMenu,insert_pos++,TRUE,&i);
|
|
}
|
|
|
|
i.wID=0;
|
|
i.fType=MFT_SEPARATOR;
|
|
InsertMenuItem(presetTreeMenu,insert_pos++,TRUE,&i);
|
|
}
|
|
|
|
GetCursorPos(&p);
|
|
if (DDraw_IsFullScreen())
|
|
{
|
|
CheckMenuItem(presetTreeMenu,1024,MF_CHECKED);
|
|
}
|
|
if (IsWindowVisible(g_hwndDlg)) CheckMenuItem(presetTreeMenu,256,MF_CHECKED);
|
|
if (inWharf) CheckMenuItem(presetTreeMenu,512,MF_CHECKED);
|
|
|
|
wsprintf(dirmask,"%s\\*.*",g_path);
|
|
|
|
directory_pos=insert_pos;
|
|
|
|
presetTreeCount=1025;
|
|
h = FindFirstFile(dirmask,&d);
|
|
if (h != INVALID_HANDLE_VALUE)
|
|
{
|
|
do
|
|
{
|
|
if (d.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && d.cFileName[0] != '.')
|
|
{
|
|
MENUITEMINFO mi={sizeof(mi),MIIM_SUBMENU|MIIM_TYPE,MFT_STRING,MFS_DEFAULT
|
|
};
|
|
mi.hSubMenu=CreatePopupMenu();
|
|
mi.dwTypeData=d.cFileName;
|
|
mi.cch = strlen(d.cFileName);
|
|
InsertMenuItem(presetTreeMenu,directory_pos++,TRUE,&mi);
|
|
insert_pos++;
|
|
}
|
|
else if (!stricmp(extension(d.cFileName),"avs"))
|
|
{
|
|
extension(d.cFileName)[-1]=0;
|
|
MENUITEMINFO i={sizeof(i),MIIM_TYPE|MIIM_ID,MFT_STRING,MFS_DEFAULT };
|
|
i.dwTypeData = d.cFileName;
|
|
i.cch = strlen(d.cFileName);
|
|
i.wID=presetTreeCount++;
|
|
InsertMenuItem(presetTreeMenu,insert_pos++,TRUE,&i);
|
|
}
|
|
} while (FindNextFile(h,&d));
|
|
FindClose(h);
|
|
}
|
|
|
|
x=TrackPopupMenu(presetTreeMenu,TPM_LEFTALIGN|TPM_TOPALIGN|TPM_RETURNCMD|TPM_RIGHTBUTTON|TPM_LEFTBUTTON,p.x,p.y,0,g_hwnd,NULL);
|
|
if (x == 1024)
|
|
{
|
|
if (DDraw_IsFullScreen())
|
|
{
|
|
if (!cfg_fs_use_overlay) Wnd_GoWindowed(g_hwnd);
|
|
}
|
|
else
|
|
Wnd_GoFullScreen(g_hwnd);
|
|
}
|
|
else if (x == 512)
|
|
{
|
|
if (!inWharf && !cfg_cfgwnd_open)
|
|
{
|
|
cfg_cfgwnd_open=1;
|
|
ShowWindow(g_hwndDlg,SW_SHOWNA);
|
|
CfgWnd_RePopIfNeeded();
|
|
}
|
|
toggleWharfAmpDock(g_hwnd);
|
|
}
|
|
else if (x == 256)
|
|
{
|
|
SendMessage(g_hwnd,WM_USER+33,0,0);
|
|
}
|
|
else if (x >= 1025)
|
|
{
|
|
char buf[2048];
|
|
buf[0]=0;
|
|
if (readyToLoadPreset(g_hwnd,0))
|
|
{
|
|
if (findInMenu(presetTreeMenu,0,x,buf,2048))
|
|
{
|
|
char temp[4096];
|
|
wsprintf(temp,"%s%s.avs",g_path,buf);
|
|
if (g_render_transition->LoadPreset(temp,1) != 2)
|
|
lstrcpyn(last_preset,temp,sizeof(last_preset));
|
|
}
|
|
else
|
|
{
|
|
// g_render_transition->LoadPreset
|
|
// wsprintf(temp,"%s\\%s",g_path,curfilename);
|
|
}
|
|
}
|
|
}
|
|
|
|
DestroyMenu(presetTreeMenu);
|
|
presetTreeMenu=0;
|
|
|
|
}
|
|
}
|
|
|
|
static LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
if ( DDraw_IsFullScreen() &&
|
|
!cfg_fs_use_overlay &&
|
|
( ( message == WM_KEYDOWN && wParam == VK_ESCAPE ) ||
|
|
message == WM_LBUTTONUP ||
|
|
( message == WM_NCACTIVATE && !wParam ) ||
|
|
message == WM_KILLFOCUS
|
|
)
|
|
)
|
|
{
|
|
Wnd_GoWindowed( hwnd );
|
|
return 0;
|
|
}
|
|
else if ( message == WM_LBUTTONUP )
|
|
{
|
|
if ( !DDraw_IsFullScreen() )
|
|
{
|
|
#ifndef WA2_EMBED
|
|
int x = GET_X_LPARAM( lParam );
|
|
int y = GET_Y_LPARAM( lParam );
|
|
RECT r;
|
|
GetClientRect( hwnd, &r );
|
|
if ( x > r.right - 12 && x < r.right - 3 && y > r.top + 3 && y < r.top + 13 )
|
|
{
|
|
g_in_destroy = 1;
|
|
DestroyWindow( hwnd );
|
|
}
|
|
#endif
|
|
/*
|
|
else
|
|
{
|
|
static int lastdblclk;
|
|
if (lastdblclk && GetTickCount()-lastdblclk > 1000 && !inWharf)
|
|
DDraw_SetStatusText("double-click for configuration",600);
|
|
lastdblclk=GetTickCount();
|
|
}
|
|
*/
|
|
}
|
|
}
|
|
if ( message == WM_LBUTTONDOWN )
|
|
{
|
|
SetFocus( g_hwnd );
|
|
if ( inWharf ) SetFocus( hwnd );
|
|
SetCapture( hwnd );
|
|
return 0;
|
|
}
|
|
if ( message == WM_LBUTTONUP )
|
|
{
|
|
POINT p;
|
|
RECT r;
|
|
p.x = GET_X_LPARAM( lParam );
|
|
p.y = GET_Y_LPARAM( lParam );
|
|
ClientToScreen( hwnd, &p );
|
|
if ( inWharf )
|
|
{
|
|
GetWindowRect( g_hwndDlg, &r );
|
|
if ( !PtInRect( &r, p ) )
|
|
{
|
|
toggleWharfAmpDock( hwnd );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
RECT r2;
|
|
GetWindowRect( GetDlgItem( g_hwndDlg, IDC_TREE1 ), &r );
|
|
GetWindowRect( hwnd, &r2 );
|
|
if ( PtInRect( &r, p ) && cfg_cfgwnd_open && !PtInRect( &r2, p ) )
|
|
{
|
|
toggleWharfAmpDock( hwnd );
|
|
}
|
|
}
|
|
ReleaseCapture();
|
|
return 0;
|
|
}
|
|
if ( message == WM_LBUTTONDBLCLK && !DDraw_IsFullScreen() )
|
|
{
|
|
if ( cfg_fs_dblclk )
|
|
{
|
|
if ( DDraw_IsFullScreen() )
|
|
{
|
|
if ( !cfg_fs_use_overlay ) Wnd_GoWindowed( hwnd );
|
|
}
|
|
else
|
|
Wnd_GoFullScreen( hwnd );
|
|
}
|
|
else
|
|
{
|
|
if ( inWharf )
|
|
{
|
|
toggleWharfAmpDock( hwnd );
|
|
}
|
|
else if ( IsWindowVisible( g_hwndDlg ) )
|
|
{
|
|
cfg_cfgwnd_open = 0;
|
|
ShowWindow( g_hwndDlg, SW_HIDE );
|
|
}
|
|
else
|
|
{
|
|
cfg_cfgwnd_open = 1;
|
|
ShowWindow( g_hwndDlg, SW_SHOWNA );
|
|
CfgWnd_RePopIfNeeded();
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
switch ( message )
|
|
{
|
|
case WM_USER + 1667:
|
|
if ( wParam == 1 && lParam == 2 )
|
|
{
|
|
char title[ 32 ];
|
|
MessageBox( hwnd, WASABI_API_LNGSTRING( IDS_CANNOT_GO_FULLSCREEN_WHEN_VIDEO_PLAYING ),
|
|
WASABI_API_LNGSTRING_BUF( IDS_AVS_FULLSCREEN, title, 32 ),
|
|
MB_OK | MB_ICONINFORMATION );
|
|
}
|
|
return 0;
|
|
case WM_USER + 1666:
|
|
if ( wParam == 1 && lParam == 15 )
|
|
{
|
|
if ( DDraw_IsFullScreen() )
|
|
{
|
|
if ( cfg_fs_use_overlay ) SetFocus( hwnd ); // kill overlay window
|
|
else Wnd_GoWindowed( hwnd );
|
|
}
|
|
}
|
|
return 0;
|
|
case WM_INITMENUPOPUP:
|
|
if ( HIWORD( lParam ) == 0 && presetTreeMenu && !GetMenuItemCount( (HMENU) wParam ) )
|
|
{
|
|
char buf[ 2048 ];
|
|
buf[ 0 ] = 0;
|
|
if ( findInMenu( presetTreeMenu, (HMENU) wParam, 0, buf, 2048 ) )
|
|
{
|
|
HANDLE h;
|
|
WIN32_FIND_DATA d;
|
|
char dirmask[ 4096 ];
|
|
wsprintf( dirmask, "%s%s\\*.*", g_path, buf );
|
|
int directory_pos = 0, insert_pos = 0;
|
|
// build menu
|
|
h = FindFirstFile( dirmask, &d );
|
|
if ( h != INVALID_HANDLE_VALUE )
|
|
{
|
|
do
|
|
{
|
|
if ( d.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && d.cFileName[ 0 ] != '.' )
|
|
{
|
|
MENUITEMINFO mi = { sizeof( mi ),MIIM_SUBMENU | MIIM_TYPE,MFT_STRING,MFS_DEFAULT };
|
|
mi.hSubMenu = CreatePopupMenu();
|
|
mi.dwTypeData = d.cFileName;
|
|
mi.cch = strlen( d.cFileName );
|
|
InsertMenuItem( (HMENU) wParam, directory_pos++, TRUE, &mi );
|
|
insert_pos++;
|
|
}
|
|
else if ( !stricmp( extension( d.cFileName ), "avs" ) )
|
|
{
|
|
extension( d.cFileName )[ -1 ] = 0;
|
|
MENUITEMINFO i = { sizeof( i ),MIIM_TYPE | MIIM_ID,MFT_STRING,MFS_DEFAULT };
|
|
i.dwTypeData = d.cFileName;
|
|
i.cch = strlen( d.cFileName );
|
|
i.wID = presetTreeCount++;
|
|
InsertMenuItem( (HMENU) wParam, insert_pos++, TRUE, &i );
|
|
}
|
|
} while ( FindNextFile( h, &d ) );
|
|
FindClose( h );
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
case WM_RBUTTONUP:
|
|
DoPopupMenu();
|
|
return 0;
|
|
case WM_USER + 33:
|
|
DDraw_SetStatusText( "", 100 );
|
|
if ( inWharf )
|
|
{
|
|
toggleWharfAmpDock( hwnd );
|
|
}
|
|
else if ( IsWindowVisible( g_hwndDlg ) )
|
|
{
|
|
cfg_cfgwnd_open = 0;
|
|
ShowWindow( g_hwndDlg, SW_HIDE );
|
|
}
|
|
else
|
|
{
|
|
cfg_cfgwnd_open = 1;
|
|
ShowWindow( g_hwndDlg, SW_SHOWNA );
|
|
CfgWnd_RePopIfNeeded();
|
|
}
|
|
return 0;
|
|
case WM_USER + 32:
|
|
Wnd_GoFullScreen( hwnd );
|
|
return 0;
|
|
case WM_SYSKEYDOWN:
|
|
case WM_KEYDOWN:
|
|
if ( ( GetAsyncKeyState( VK_CONTROL ) & 0x8000 ) && wParam == VK_F4 )
|
|
{
|
|
SendMessage( hwnd, WM_CLOSE, 0, 0 );
|
|
return 0;
|
|
}
|
|
if ( ( GetAsyncKeyState( VK_MENU ) & 0x8000 ) && wParam == VK_F4 )
|
|
{
|
|
PostMessage( hwnd_WinampParent, message, wParam, lParam );
|
|
break;
|
|
}
|
|
|
|
if ( wParam == VK_SPACE )
|
|
{
|
|
do_random:
|
|
random_preset( hwnd );
|
|
}
|
|
else if ( wParam == 0x55 )
|
|
{
|
|
next_preset( hwnd );
|
|
}
|
|
else if ( wParam == 0x59 )
|
|
{
|
|
previous_preset( hwnd );
|
|
}
|
|
else if ( wParam == VK_RETURN )
|
|
{
|
|
if ( GetAsyncKeyState( VK_MENU ) & 0x8000 )
|
|
{
|
|
if ( DDraw_IsFullScreen() )
|
|
{
|
|
if ( !cfg_fs_use_overlay ) Wnd_GoWindowed( hwnd );
|
|
}
|
|
else
|
|
Wnd_GoFullScreen( hwnd );
|
|
}
|
|
}
|
|
else if ( wParam == /* VK_T */ 0x54 )
|
|
{
|
|
extern int draw_title_p;
|
|
draw_title_p = 2;
|
|
}
|
|
else if ( wParam == /* VK_F */ 0x52 + 'F' - 'R' )
|
|
{
|
|
cfg_fs_fps ^= 1;
|
|
DDraw_SetStatusText( WASABI_API_LNGSTRING( cfg_fs_fps & 1 ? IDS_FULLSCREEN_FPS_ON : IDS_FULLSCREEN_FPS_OFF ) );
|
|
}
|
|
else if ( wParam == /* VK_R */ 0x52 )
|
|
{
|
|
cfg_fs_rnd = !cfg_fs_rnd;
|
|
g_rnd_cnt = 0;
|
|
DDraw_SetStatusText( WASABI_API_LNGSTRING( cfg_fs_rnd ? IDS_RANDOM_PRESETS_ON : IDS_RANDOM_PRESETS_OFF ) );
|
|
}
|
|
else if ( wParam >= VK_F1 && wParam <= VK_F12 )
|
|
{
|
|
char s[ 128 ], *st, stBuf[ 48 ];
|
|
if ( GetAsyncKeyState( VK_CONTROL ) & ( 1 << 15 ) )
|
|
{
|
|
st = WASABI_API_LNGSTRING_BUF( IDS_SAVED_TO, stBuf, 48 );
|
|
WritePreset( wParam - VK_F1 );
|
|
}
|
|
else
|
|
{
|
|
if ( !readyToLoadPreset( hwnd, 0 ) ) return 0;
|
|
|
|
if ( LoadPreset( wParam - VK_F1 ) ) st = WASABI_API_LNGSTRING_BUF( IDS_LOADED_FROM, stBuf, 48 );
|
|
else st = WASABI_API_LNGSTRING_BUF( IDS_ERROR_LOADING_FROM, stBuf, 48 );
|
|
}
|
|
wsprintf( s, "%s F%d", st, wParam - VK_F1 + 1 );
|
|
DDraw_SetStatusText( s );
|
|
}
|
|
else if ( wParam >= '0' && wParam <= '9' )
|
|
{
|
|
int n = 0;
|
|
char s[ 128 ], *st, stBuf[ 48 ];
|
|
if ( GetAsyncKeyState( VK_SHIFT ) & ( 1 << 15 ) )
|
|
n = 10;
|
|
if ( GetAsyncKeyState( VK_CONTROL ) & ( 1 << 15 ) )
|
|
{
|
|
st = WASABI_API_LNGSTRING_BUF( IDS_SAVED_TO, stBuf, 48 );
|
|
WritePreset( wParam - '0' + 12 + n );
|
|
}
|
|
else
|
|
{
|
|
if ( !readyToLoadPreset( hwnd, 0 ) ) return 0;
|
|
if ( LoadPreset( wParam - '0' + 12 + n ) ) st = WASABI_API_LNGSTRING_BUF( IDS_LOADED_FROM, stBuf, 48 );
|
|
else st = WASABI_API_LNGSTRING_BUF( IDS_ERROR_LOADING_FROM, stBuf, 48 );
|
|
}
|
|
wsprintf( s, "%s %s%d", st, n ? WASABI_API_LNGSTRING( IDS_SHIFT_ ) : "", wParam - '0' );
|
|
DDraw_SetStatusText( s );
|
|
}
|
|
else
|
|
{
|
|
if ( wParam == 0x4B && DDraw_IsFullScreen() )
|
|
{
|
|
if ( !cfg_fs_use_overlay ) Wnd_GoWindowed( hwnd );
|
|
}
|
|
else PostMessage( hwnd_WinampParent, message, wParam, lParam );
|
|
}
|
|
return 0;
|
|
case WM_TIMER:
|
|
#ifndef WA2_EMBED
|
|
if ( wParam == 66 )
|
|
{
|
|
KillTimer( hwnd, 66 );
|
|
SetWindowPos( hwnd, 0, 0, 0, cfg_w, cfg_h, SWP_NOACTIVATE | SWP_NOZORDER );
|
|
}
|
|
#endif
|
|
if ( wParam == 88 )
|
|
{
|
|
KillTimer( hwnd, 88 );
|
|
if ( cfg_cfgwnd_open )
|
|
{
|
|
ShowWindow( g_hwndDlg, SW_SHOWNA );
|
|
UpdateWindow( g_hwndDlg );
|
|
CfgWnd_RePopIfNeeded();
|
|
}
|
|
|
|
if ( need_redock && g_hwndDlg )
|
|
{
|
|
need_redock = 0;
|
|
toggleWharfAmpDock( hwnd );
|
|
}
|
|
}
|
|
if ( wParam == 32 )
|
|
{
|
|
DWORD a;
|
|
|
|
#ifndef REAPLAY_PLUGIN
|
|
if ( SendMessageTimeout( hwnd_WinampParent, WM_USER, (WPARAM) 0, 201, SMTO_BLOCK, 1000, &a ) && a )
|
|
{
|
|
if ( strcmp( g_skin_name, (char *) a ) )
|
|
{
|
|
lstrcpyn( g_skin_name, (char *) a, sizeof( g_skin_name ) );
|
|
PostMessage( hwnd, WM_DISPLAYCHANGE, 0, 0 );
|
|
}
|
|
}
|
|
#endif
|
|
|
|
if ( g_rnd_cnt >= 0 && g_rnd_cnt++ >= max( cfg_fs_rnd_time, 1 ) )
|
|
{
|
|
g_rnd_cnt = 0;
|
|
if ( ( !IsWindowVisible( g_hwndDlg ) || DDraw_IsFullScreen() ) && cfg_fs_rnd )
|
|
goto do_random;
|
|
}
|
|
}
|
|
if ( wParam == 30 )
|
|
{
|
|
KillTimer( hwnd, 30 );
|
|
if ( !DDraw_IsFullScreen() && !inWharf )
|
|
{
|
|
InvalidateRect( hwnd, NULL, FALSE );
|
|
int tm = ( GetWindowLong( g_mod->hwndParent, GWL_EXSTYLE ) & WS_EX_TOPMOST ) == WS_EX_TOPMOST;
|
|
SetWindowPos( hwnd, tm ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE );
|
|
RECT r;
|
|
GetClientRect_adj( hwnd, &r );
|
|
DDraw_Resize( r.right - r.left, r.bottom - r.top, cfg_fs_d & 2 );
|
|
}
|
|
}
|
|
#ifndef WA2_EMBED
|
|
if ( wParam == 29 )
|
|
{
|
|
if ( !IsIconic( hwnd_WinampParent ) )
|
|
{
|
|
KillTimer( hwnd, 29 );
|
|
g_mod->Quit( g_mod );
|
|
g_minimized = 0;
|
|
g_fakeinit = 1;
|
|
g_mod->Init( g_mod );
|
|
g_fakeinit = 0;
|
|
SetActiveWindow( g_mod->hwndParent );
|
|
}
|
|
}
|
|
#endif
|
|
return 0;
|
|
case WM_DROPFILES:
|
|
{
|
|
char temp[ MAX_PATH ];
|
|
HDROP hdrop = (HDROP) wParam;
|
|
DragQueryFile( hdrop, 0, temp, sizeof( temp ) );
|
|
if ( readyToLoadPreset( hwnd, 0 ) )
|
|
{
|
|
if ( !stricmp( extension( temp ), "avs" ) )
|
|
{
|
|
if ( g_render_transition->LoadPreset( temp, 1 ) != 2 )
|
|
lstrcpyn( last_preset, temp, sizeof( last_preset ) );
|
|
}
|
|
}
|
|
DragFinish( hdrop );
|
|
}
|
|
return 0;
|
|
case WM_DISPLAYCHANGE:
|
|
#ifndef WA2_EMBED
|
|
SelectObject( hFrameDC, hFrameBitmap_old );
|
|
DeleteObject( hFrameBitmap );
|
|
hFrameBitmap = NULL;
|
|
{
|
|
char buf[ MAX_PATH ];
|
|
if ( SendMessage( hwnd_WinampParent, WM_USER, (WPARAM) buf, 201 ) )
|
|
{
|
|
strcat( buf, "\\avs.bmp" );
|
|
hFrameBitmap = (HBITMAP) LoadImage( g_hInstance, buf, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE );
|
|
}
|
|
if ( !hFrameBitmap )
|
|
hFrameBitmap = (HBITMAP) LoadImage( g_hInstance, MAKEINTRESOURCE( IDB_BITMAP1 ), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
|
|
}
|
|
hFrameBitmap_old = (HBITMAP) SelectObject( hFrameDC, hFrameBitmap );
|
|
#endif
|
|
InvalidateRect( hwnd, NULL, FALSE );
|
|
return 0;
|
|
case WM_CREATE:
|
|
g_hwnd = hwnd;
|
|
|
|
if ( DDraw_Init() )
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
#ifndef WA2_EMBED
|
|
|
|
{
|
|
char buf[ MAX_PATH ];
|
|
int a;
|
|
if ( ( a = SendMessage( hwnd_WinampParent, WM_USER, (WPARAM) buf, 201 ) ) )
|
|
{
|
|
lstrcpyn( g_skin_name, (char *) a, sizeof( g_skin_name ) );
|
|
strcat( buf, "\\avs.bmp" );
|
|
hFrameBitmap = (HBITMAP) LoadImage( g_hInstance, buf, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE );
|
|
}
|
|
if ( !hFrameBitmap )
|
|
hFrameBitmap = (HBITMAP) LoadImage( g_hInstance, MAKEINTRESOURCE( IDB_BITMAP1 ), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
|
|
}
|
|
hFrameDC = (HDC) CreateCompatibleDC( NULL );
|
|
hFrameBitmap_old = (HBITMAP) SelectObject( hFrameDC, hFrameBitmap );
|
|
#endif
|
|
//FG> This totally fucks up a child layered window painting in wa3, i'm not even sure that's a good thing for wa2... basically the child window gets excluded from the layered update and ends up updating behind the layer, on top of the desktop
|
|
#ifndef WA2_EMBED
|
|
SetWindowLong( hwnd, GWL_STYLE, 0 );
|
|
SetWindowPos( hwnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_DRAWFRAME | SWP_NOACTIVATE );
|
|
#endif
|
|
SetTimer( hwnd, 32, 1000, NULL );
|
|
return 0;
|
|
#ifndef WA2_EMBED
|
|
case WM_NCHITTEST:
|
|
{
|
|
int x = GET_X_LPARAM( lParam );
|
|
int y = GET_Y_LPARAM( lParam );
|
|
RECT r;
|
|
GetWindowRect( hwnd, &r );
|
|
if ( inWharf )
|
|
return HTCLIENT;
|
|
if ( DDraw_IsFullScreen() || ( x > r.right - 12 && x < r.right - 3 && y > r.top + 3 && y < r.top + 13 ) )
|
|
return HTCLIENT;
|
|
if ( x < r.left + 6 && y > r.bottom - 6 ) return HTBOTTOMLEFT;
|
|
if ( x > r.right - 6 && y > r.bottom - 6 ) return HTBOTTOMRIGHT;
|
|
if ( x < r.left + 6 && y < r.top + 6 ) return HTTOPLEFT;
|
|
if ( x > r.right - 6 && y < r.top + 6 ) return HTTOPRIGHT;
|
|
if ( y < r.top + 6 ) return HTTOP;
|
|
if ( y > r.bottom - 6 ) return HTBOTTOM;
|
|
if ( x < r.left + 6 ) return HTLEFT;
|
|
if ( x > r.right - 6 ) return HTRIGHT;
|
|
if ( y < r.top + 15 ) return HTCAPTION;
|
|
}
|
|
return HTCLIENT;
|
|
#endif
|
|
case WM_CLOSE:
|
|
#ifndef WA2_EMBED
|
|
g_in_destroy = 1;
|
|
DestroyWindow( hwnd );
|
|
#else
|
|
g_in_destroy = 1;
|
|
SetForegroundWindow( g_mod->hwndParent );
|
|
DestroyWindow( myWindowState.me );
|
|
#endif
|
|
return 0;
|
|
case WM_DESTROY:
|
|
#ifndef WA2_EMBED
|
|
SelectObject( hFrameDC, hFrameBitmap_old );
|
|
DeleteObject( hFrameDC );
|
|
DeleteObject( hFrameBitmap );
|
|
#endif
|
|
g_ThreadQuit = 1;
|
|
if ( !g_minimized )
|
|
{
|
|
PostQuitMessage( 0 );
|
|
}
|
|
return 0;
|
|
case WM_MOVE:
|
|
if ( !DDraw_IsFullScreen() && !inWharf )
|
|
{
|
|
#ifndef WA2_EMBED
|
|
int w;
|
|
RECT r;
|
|
RECT r2;
|
|
int xPos, yPos, f = 0;
|
|
xPos = (int) (short) LOWORD( lParam ); // horizontal position
|
|
yPos = (int) (short) HIWORD( lParam ); // vertical position
|
|
GetClientRect( hwnd, &r2 );
|
|
|
|
for ( w = 0; w < 5; w++ )
|
|
{
|
|
HWND hw;
|
|
if ( w == 0 )
|
|
{
|
|
RECT r2;
|
|
GetWindowRect( hwnd, &r2 );
|
|
my_getViewport( &r, &r2 );
|
|
}
|
|
else if ( w == 1 && IsWindowVisible( hwnd_WinampParent ) )
|
|
GetWindowRect( hwnd_WinampParent, &r );
|
|
else if ( w == 2 && ( hw = FindWindowEx( NULL, NULL, "Winamp EQ", NULL ) )
|
|
&& IsWindowVisible( hw ) )
|
|
GetWindowRect( hw, &r );
|
|
else if ( w == 3 && ( hw = FindWindowEx( NULL, NULL, "Winamp PE", NULL ) )
|
|
&& IsWindowVisible( hw ) )
|
|
GetWindowRect( hw, &r );
|
|
else if ( w == 4 && ( hw = FindWindowEx( NULL, NULL, "Winamp MB", NULL ) )
|
|
&& IsWindowVisible( hw ) )
|
|
GetWindowRect( hw, &r );
|
|
else continue;
|
|
|
|
#define intersect(x1,x2,y1,y2) \
|
|
(((x1)>(y1)&&(x1)<(y2))||((x2)>(y1)&&(x2)<(y2))||((y1)>(x1)&&(y1)<(x2))||((y2)>(x1)&&(y2)<(x2)))
|
|
|
|
if ( xPos > r.left - 10 && xPos < r.left + 10 && intersect( yPos, yPos + r2.bottom, r.top, r.bottom ) )
|
|
{
|
|
xPos = r.left;
|
|
f++;
|
|
}
|
|
if ( yPos > r.top - 10 && yPos < r.top + 10 && intersect( xPos, xPos + r2.right, r.left, r.right ) )
|
|
{
|
|
yPos = r.top;
|
|
f++;
|
|
}
|
|
if ( xPos + r2.right > r.right - 10 && xPos + r2.right < r.right + 10 && intersect( yPos, yPos + r2.bottom, r.top, r.bottom ) )
|
|
{
|
|
xPos = r.right - r2.right;
|
|
f++;
|
|
}
|
|
if ( yPos + r2.bottom > r.bottom - 10 && yPos + r2.bottom < r.bottom + 10 && intersect( xPos, xPos + r2.right, r.left, r.right ) )
|
|
{
|
|
yPos = r.bottom - r2.bottom;
|
|
f++;
|
|
}
|
|
|
|
|
|
|
|
if ( xPos + r2.right > r.left - 10 && xPos + r2.right < r.left + 10 && intersect( yPos, yPos + r2.bottom, r.top, r.bottom ) )
|
|
{
|
|
xPos = r.left - r2.right;
|
|
f++;
|
|
}
|
|
if ( yPos + r2.bottom > r.top - 10 && yPos + r2.bottom < r.top + 10 && intersect( xPos, xPos + r2.right, r.left, r.right ) )
|
|
{
|
|
yPos = r.top - r2.bottom;
|
|
f++;
|
|
}
|
|
if ( xPos > r.right - 10 && xPos < r.right + 10 && intersect( yPos, yPos + r2.bottom, r.top, r.bottom ) )
|
|
{
|
|
xPos = r.right;
|
|
f++;
|
|
}
|
|
if ( yPos > r.bottom - 10 && yPos < r.bottom + 10 && intersect( xPos, xPos + r2.right, r.left, r.right ) )
|
|
{
|
|
yPos = r.bottom;
|
|
f++;
|
|
}
|
|
}
|
|
|
|
if ( f )
|
|
{
|
|
SetWindowPos( hwnd, NULL, xPos, yPos, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE );
|
|
}
|
|
{
|
|
RECT r;
|
|
GetWindowRect( hwnd, &r );
|
|
cfg_x = r.left;
|
|
cfg_y = r.top;
|
|
cfg_w = r.right - r.left;
|
|
cfg_h = r.bottom - r.top;
|
|
}
|
|
#endif
|
|
}
|
|
return 0;
|
|
case WM_GETMINMAXINFO:
|
|
{
|
|
LPMINMAXINFO mmi = (LPMINMAXINFO) lParam;
|
|
mmi->ptMinTrackSize.x = 80;
|
|
mmi->ptMinTrackSize.y = 40;
|
|
}
|
|
return 0;
|
|
case WM_SETCURSOR:
|
|
if ( DDraw_IsFullScreen() )
|
|
{
|
|
SetCursor( NULL );
|
|
return TRUE;
|
|
}
|
|
break;
|
|
case WM_SIZE:
|
|
if ( wParam != SIZE_MINIMIZED )
|
|
{
|
|
if ( !DDraw_IsFullScreen() )
|
|
{
|
|
if ( !inWharf )
|
|
{
|
|
#ifndef WA2_EMBED
|
|
RECT r;
|
|
GetWindowRect( hwnd, &r );
|
|
cfg_x = r.left;
|
|
cfg_y = r.top;
|
|
cfg_w = r.right - r.left;
|
|
cfg_h = r.bottom - r.top;
|
|
#endif
|
|
DDraw_BeginResize();
|
|
KillTimer( hwnd, 30 );
|
|
SetTimer( hwnd, 30, 33, NULL );
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case WM_WINDOWPOSCHANGING:
|
|
{
|
|
LPWINDOWPOS lpwp = (LPWINDOWPOS) lParam;
|
|
if ( cfg_dont_min_avs && !g_in_destroy && lpwp->flags & SWP_HIDEWINDOW && !g_minimized && !inWharf )
|
|
{
|
|
#ifndef WA2_EMBED
|
|
g_minimized = 1;
|
|
g_mod->Quit( g_mod );
|
|
g_fakeinit = 1;
|
|
g_mod->Init( g_mod );
|
|
g_fakeinit = 0;
|
|
if ( ( GetWindowLong( g_mod->hwndParent, GWL_EXSTYLE ) & WS_EX_TOPMOST ) == WS_EX_TOPMOST )
|
|
SetWindowPos( g_hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE );
|
|
SetTimer( g_hwnd, 29, 500, NULL );
|
|
#endif
|
|
}
|
|
}
|
|
return 0;
|
|
case WM_PAINT:
|
|
if ( !DDraw_IsFullScreen() )
|
|
{
|
|
PAINTSTRUCT ps;
|
|
HDC hdc = BeginPaint( hwnd, &ps );
|
|
#ifndef WA2_EMBED
|
|
RECT r;
|
|
HDC tempdc = CreateCompatibleDC( hdc );
|
|
GetClientRect( hwnd, &r );
|
|
HBITMAP oldbm, tempbm = CreateCompatibleBitmap( hdc, 7, r.bottom - 20 );
|
|
oldbm = (HBITMAP) SelectObject( tempdc, tempbm );
|
|
if ( !inWharf )
|
|
{ // draw window frame
|
|
SetStretchBltMode( hdc, COLORONCOLOR );
|
|
SetStretchBltMode( tempdc, COLORONCOLOR );
|
|
BitBlt( hdc, 0, 0, 50, 15, hFrameDC, 15, 0, SRCCOPY ); // top left
|
|
StretchBlt( hdc, 50, 0, r.right - 50 - 16, 15, hFrameDC, 66, 0, 14, 15, SRCCOPY ); // top middle
|
|
BitBlt( hdc, r.right - 16, 0, 16, 15, hFrameDC, 81, 0, SRCCOPY ); // top right
|
|
|
|
StretchBlt( tempdc, 0, 0, 7, r.bottom - 15 - 5, hFrameDC, 0, 16, 7, 172, SRCCOPY ); // left middle
|
|
BitBlt( hdc, 0, 15, 7, r.bottom - 15 - 5, tempdc, 0, 0, SRCCOPY );
|
|
StretchBlt( tempdc, 0, 0, 6, r.bottom - 15 - 5, hFrameDC, 8, 16, 6, 172, SRCCOPY ); // right middle
|
|
BitBlt( hdc, r.right - 6, 15, 6, r.bottom - 15 - 5, tempdc, 0, 0, SRCCOPY );
|
|
|
|
BitBlt( hdc, 0, r.bottom - 5, 50, 15, hFrameDC, 15, 16, SRCCOPY ); // bottom left
|
|
StretchBlt( hdc, 50, r.bottom - 5, r.right - 50 - 16, 5, hFrameDC, 66, 16, 14, 5, SRCCOPY ); // bottom middle
|
|
BitBlt( hdc, r.right - 16, r.bottom - 5, 16, 5, hFrameDC, 81, 16, SRCCOPY ); // bottom right
|
|
}
|
|
SelectObject( tempdc, oldbm );
|
|
DeleteObject( tempbm );
|
|
DeleteObject( tempdc );
|
|
#endif
|
|
EndPaint( hwnd, &ps );
|
|
return 0;
|
|
}
|
|
break;
|
|
#ifdef WA2_EMBED
|
|
case WM_COMMAND:
|
|
{
|
|
int id = LOWORD( wParam );
|
|
switch ( id )
|
|
{
|
|
case ID_VIS_NEXT: next_preset( hwnd ); break;
|
|
case ID_VIS_PREV: previous_preset( hwnd ); break;
|
|
case ID_VIS_RANDOM:
|
|
{
|
|
int v = HIWORD( wParam ) ? 1 : 0;
|
|
if ( wParam >> 16 == 0xFFFF )
|
|
{
|
|
SendMessage( g_mod->hwndParent, WM_WA_IPC, cfg_fs_rnd, IPC_CB_VISRANDOM );
|
|
break;
|
|
}
|
|
cfg_fs_rnd = v;
|
|
if ( cfg_fs_rnd ) random_preset( hwnd );
|
|
DDraw_SetStatusText( WASABI_API_LNGSTRING( cfg_fs_rnd ? IDS_RANDOM_PRESETS_ON : IDS_RANDOM_PRESETS_OFF ) );
|
|
break;
|
|
}
|
|
case ID_VIS_FS: Wnd_GoFullScreen( hwnd ); break;
|
|
case ID_VIS_CFG: SendMessage( hwnd, WM_USER + 33, 0, 0 ); break;
|
|
case ID_VIS_MENU: DoPopupMenu(); break;
|
|
}
|
|
break;
|
|
}
|
|
#endif
|
|
}
|
|
return DefWindowProc( hwnd, message, wParam, lParam );
|
|
}
|