winamp/Src/nsv/nsvplay/wndmenu.h
2024-09-24 14:54:57 +02:00

388 lines
12 KiB
C

#ifndef _WNDMENU_H_
#define _WNDMENU_H_
//need to define WNDMENU_CAPTION to the caption
// you can define these to remove menu functionality
//WNDMENU_NOABOUT // no about header
//WNDMENU_NOVOLUME // no volume submenu
//WNDMENU_NOINFO // no info submenu
//WNDMENU_NOZOOM // no zoom 50/100/200/400
//WNDMENU_NOZOOMFS // no zoom fullscreen
//WNDMENU_NOOPTIONS // no options submenu
//WNDMENU_NOPOSITIONSAVE // disables saving of position
//WNDMENU_NOSUBTITLES // no subtitles submenu
#ifndef ABS
#define ABS(x) ((x)<0?-(x):(x))
#endif
static void _ReadConfigItemInt(char *name, int *value)
{
HKEY hKey;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\Nullsoft\\NSVPlay",0,KEY_READ,&hKey) == ERROR_SUCCESS)
{
DWORD t,l=4;
int a;
if (RegQueryValueEx(hKey,name,NULL,&t,(unsigned char *)&a,&l ) == ERROR_SUCCESS && t == REG_DWORD)
*value=a;
RegCloseKey(hKey);
}
}
static void _WriteConfigItemInt(char *name, int value)
{
HKEY hKey;
if (RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\Nullsoft\\NSVPlay",&hKey) == ERROR_SUCCESS)
{
RegSetValueEx(hKey,name,0,REG_DWORD,(unsigned char*)&value,4);
RegCloseKey(hKey);
}
}
static void _InsertString(HMENU hMenu, int pos, char *string, int id, int checked=0, int disabled=0)
{
MENUITEMINFO inf={sizeof(inf),MIIM_ID|MIIM_STATE|MIIM_TYPE,MFT_STRING,
(checked?MFS_CHECKED:0) | (disabled?MFS_DISABLED:MFS_ENABLED), id,
};
inf.dwTypeData = string;
InsertMenuItem(hMenu,pos,TRUE,&inf);
}
static void _InsertSep(HMENU hMenu, int pos)
{
MENUITEMINFO inf={sizeof(inf),MIIM_TYPE,MFT_SEPARATOR };
InsertMenuItem(hMenu,pos,TRUE,&inf);
}
static HMENU _InsertSub(HMENU hMenu, int pos, char *string)
{
MENUITEMINFO inf={sizeof(inf),MIIM_TYPE|MIIM_SUBMENU,MFT_STRING };
inf.dwTypeData = string;
inf.hSubMenu=CreatePopupMenu();
InsertMenuItem(hMenu,pos,TRUE,&inf);
return inf.hSubMenu;
}
#define MENUITEM_ABOUT 1
#define MENUITEM_INFOBASE 10
#define MENUITEM_VOLUMEBASE 100
#define MENUITEM_VSYNC 120
#define MENUITEM_ASPECTADJ 121
#define MENUITEM_VOVERLAYS 122
#define MENUITEM_VDDRAW 123
#define MENUITEM_SOFTVOLMIX 124
#define MENUITEM_ENABLESUBTITLES 125
#define MENUITEM_SUBSIZEBASE 126 // 5 sizes
#define MENUITEM_ZOOM50 112
#define MENUITEM_ZOOM100 113
#define MENUITEM_ZOOM200 114
#define MENUITEM_ZOOM400 115
#define MENUITEM_ZOOMFS 116
#define MENUITEM_CLOSE 200
#define MENUITEM_SUBSLANGBASE 300
extern int g_audio_use_mixer;
LRESULT my_wndcallback(void *token, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (token)
{
parms *parm=(parms*)token;
#ifndef WNDMENU_NOPOSITIONSAVE
if (uMsg == WM_MOVE)
{
if (!parm->vidOut->is_fullscreen())
{
RECT r;
GetWindowRect(hwnd,&r);
_WriteConfigItemInt("xpos",r.left);
_WriteConfigItemInt("ypos",r.top);
}
}
#endif
if(uMsg==WM_SETCURSOR && parm->vidOut->is_fullscreen()) {
SetCursor(NULL);
return TRUE;
}
if (uMsg == WM_RBUTTONUP && !parm->vidOut->is_fullscreen())
{
int pos=0;
HMENU hMenu=CreatePopupMenu();
#ifndef WNDMENU_NOABOUT
_InsertString(hMenu,pos++,WNDMENU_CAPTION,MENUITEM_ABOUT);
_InsertSep(hMenu,pos++);
#endif
#ifndef WNDMENU_NOINFO
if (parm->decode)
{
char buf[1024];
int subpos=0;
int tmpid=MENUITEM_INFOBASE;
HMENU sub=_InsertSub(hMenu,pos++,"Info");
{ // title
char *v=parm->decode->getTitle();
if (v && *v)
{
char *tmp=(char*)malloc(strlen(v)+32);
wsprintf(tmp,"Title: %s",v);
char *p=tmp;
while (*p)
{
if (*p == '_') *p=' ';
p++;
}
_InsertString(sub,subpos++,tmp,tmpid++);
free(tmp);
}
}
{ // length
int lenms=parm->decode->getlen();
if (lenms != ~0)
{
wsprintf(buf,"Length: %d:%02d",lenms/60000,(lenms/1000)%60);
_InsertString(sub,subpos++,buf,tmpid++);
}
}
{ // codecs
int a=(parm->decode->getBitrate()+500)/1000;
unsigned int a2=parm->decode->getFileSize();
if (a)
{
wsprintf(buf,"Bitrate: %dkbps",a);
if (a2 && a2 != ~0)
wsprintf(buf+strlen(buf)," (Total %u bytes)",a2);
_InsertString(sub,subpos++,buf,tmpid++);
}
else if (a2 && a2 != ~0)
{
wsprintf(buf,"Size: %u bytes",a2);
_InsertString(sub,subpos++,buf,tmpid++);
}
lstrcpy(buf,"Video: ");
char *p=buf+strlen(buf);
parm->decode->getVideoDesc(p);
if (*p) _InsertString(sub,subpos++,buf,tmpid++);
lstrcpy(buf,"Audio: ");
p=buf+strlen(buf);
parm->decode->getAudioDesc(p);
if (*p) _InsertString(sub,subpos++,buf,tmpid++);
}
{
const char *p=parm->decode->getServerHeader("Server");
if (p && *p)
{
lstrcpy(buf,"Server: ");
lstrcpyn(buf+strlen(buf),p,sizeof(buf)-strlen(buf)-2);
_InsertString(sub,subpos++,buf,tmpid++);
}
}
}
#endif //WNDMENU_NOINFO
#ifndef WNDMENU_NOVOLUME
if (parm->decode)
{
HMENU sub=_InsertSub(hMenu,pos++,"Volume");
int cv=(parm->decode->getvolume()*100)/255;
int x;
for (x=0;x<=10;x++)
{
char buf[64];
int a=100-x*10;
wsprintf(buf,"%d%%",a);
_InsertString(sub,x,buf,MENUITEM_VOLUMEBASE+x,cv >= a-5 && cv < a+5);
}
}
#endif//WNDMENU_NOVOLUME
#ifndef WNDMENU_NOOPTIONS
if (parm->vidOut)
{
HMENU sub=_InsertSub(hMenu,pos++,"Options");
int subpos=0;
_InsertString(sub,subpos++,"Synchronize video to refresh",MENUITEM_VSYNC,!!parm->vidOut->vid_vsync);
_InsertString(sub,subpos++,"Maintain video aspect ratio",MENUITEM_ASPECTADJ,!!parm->vidOut->vid_aspectadj);
_InsertString(sub,subpos++,"Allow video overlay",MENUITEM_VOVERLAYS,!!parm->vidOut->vid_overlays);
//_InsertString(sub,subpos++,"Allow DirectDraw acceleration",MENUITEM_VDDRAW,!!parm->vidOut->vid_ddraw);
_InsertString(sub,subpos++,"Use software volume mixing",MENUITEM_SOFTVOLMIX,!g_audio_use_mixer);
}
#endif//WNDMENU_NOOPTIONS
#if !defined(WNDMENU_NOZOOM) || !defined(WNDMENU_NOZOOMFS)
if (parm->decode && parm->vidOut)
{
HMENU sub=_InsertSub(hMenu,pos++,"Zoom");
int subpos=0;
#ifndef WNDMENU_NOZOOM
int ow,oh;
int w=parm->decode->getWidth();
int h=parm->decode->getHeight();
parm->vidOut->getOutputSize(&ow,&oh);
_InsertString(sub,subpos++,"50%",MENUITEM_ZOOM50,ABS(w/2-ow)<4);
_InsertString(sub,subpos++,"100%",MENUITEM_ZOOM100,ABS(w-ow)<4);
_InsertString(sub,subpos++,"200%",MENUITEM_ZOOM200,ABS(w*2-ow)<4);
_InsertString(sub,subpos++,"400%",MENUITEM_ZOOM400,ABS(w/4-ow)<4);
#ifndef WNDMENU_NOZOOMFS
_InsertSep(sub,subpos++);
#endif
#endif
#ifndef WNDMENU_NOZOOMFS
_InsertString(sub,subpos++,"Fullscreen",MENUITEM_ZOOMFS,!!parm->vidOut->is_fullscreen());
#endif//WNDMENU_NOZOOMFS
}
#endif//WNDMENU_NOZOOM||WNDMENU_NOZOOMFS
#ifndef WNDMENU_NOSUBTITLES
if(parm->decode)
{
HMENU sub=_InsertSub(hMenu,pos++,"Subtitles");
int subpos=0;
_InsertString(sub,subpos++,"Enabled",MENUITEM_ENABLESUBTITLES,parm->decode->subsEnabled());
_InsertSep(sub,subpos++);
HMENU sizesub=_InsertSub(sub,subpos++,"Font size");
int sizesubpos=0;
int fontsize=parm->decode->getSubsFontSize();
_InsertString(sizesub,sizesubpos++,"Largest",MENUITEM_SUBSIZEBASE,fontsize==20);
_InsertString(sizesub,sizesubpos++,"Larger",MENUITEM_SUBSIZEBASE+1,fontsize==10);
_InsertString(sizesub,sizesubpos++,"Medium",MENUITEM_SUBSIZEBASE+2,fontsize==0);
_InsertString(sizesub,sizesubpos++,"Smaller",MENUITEM_SUBSIZEBASE+3,fontsize==-4);
_InsertString(sizesub,sizesubpos++,"Smallest",MENUITEM_SUBSIZEBASE+4,fontsize==-8);
HMENU langsub=_InsertSub(sub,subpos++,"Language");
int langsubpos=0;
for(int i=0;;i++) {
const char *lang=parm->decode->getSubLanguage(i);
if(!lang) break;
_InsertString(langsub,langsubpos++,(char *)lang,MENUITEM_SUBSLANGBASE+i,i==parm->decode->getCurSubLanguage());
}
}
#endif//WNDMENU_NOSUBTITLES
#ifndef WNDMENU_NOCLOSE
_InsertSep(hMenu,pos++);
_InsertString(hMenu,pos++,"E&xit\tAlt+F4",MENUITEM_CLOSE);
#endif//WNDMENU_NOCLOSE
POINT p;
GetCursorPos(&p);
int x=TrackPopupMenu(hMenu,TPM_RETURNCMD|TPM_RIGHTBUTTON|TPM_LEFTBUTTON|TPM_NONOTIFY,p.x,p.y,0,hwnd,NULL);
DestroyMenu(hMenu);
switch (x)
{
#ifndef WNDMENU_NOABOUT
case MENUITEM_ABOUT:
#ifdef _ABOUT_H_ // dont display the about box if do_about isn't there anyway
do_about(hwnd);
#endif
break;
#endif//WNDMENU_NOABOUT
#ifndef WNDMENU_NOOPTIONS
case MENUITEM_VOVERLAYS:
_WriteConfigItemInt("overlays",parm->vidOut->vid_overlays=!parm->vidOut->vid_overlays);
PostMessage(hwnd,WM_USER+0x1,0,0); //renegotiate surface
break;
case MENUITEM_VDDRAW:
_WriteConfigItemInt("ddraw",parm->vidOut->vid_ddraw=!parm->vidOut->vid_ddraw);
PostMessage(hwnd,WM_USER+0x1,0,0); //renegotiate surface
break;
case MENUITEM_ASPECTADJ:
_WriteConfigItemInt("aspectadj",parm->vidOut->vid_aspectadj=!parm->vidOut->vid_aspectadj);
PostMessage(hwnd,WM_TIMER,1,0);
break;
case MENUITEM_VSYNC:
_WriteConfigItemInt("vsync",parm->vidOut->vid_vsync=!parm->vidOut->vid_vsync);
break;
case MENUITEM_SOFTVOLMIX:
_WriteConfigItemInt("use_mixer",g_audio_use_mixer=!g_audio_use_mixer);
parm->decode->setvolume(parm->decode->getvolume());
break;
#endif//WNDMENU_NOOPTIONS
#ifndef WNDMENU_NOZOOM
case MENUITEM_ZOOM50:
case MENUITEM_ZOOM100:
case MENUITEM_ZOOM200:
case MENUITEM_ZOOM400:
if (parm->vidOut->is_fullscreen()) parm->vidOut->remove_fullscreen();
{
int w=parm->decode->getWidth();
int h=parm->decode->getHeight();
if (x == MENUITEM_ZOOM50) { w/=2; h/=2; }
else if (x == MENUITEM_ZOOM200) { w*=2; h*=2; }
else if (x == MENUITEM_ZOOM400) { w*=4; h*=4; }
parm->vidOut->setOutputSize(w,h);
}
break;
#endif//WNDMENU_NOZOOM
#ifndef WNDMENU_NOZOOMFS
case MENUITEM_ZOOMFS:
if (parm->vidOut->is_fullscreen()) parm->vidOut->remove_fullscreen();
else parm->vidOut->fullscreen();
break;
#endif//WNDMENU_NOZOOMFS
#ifndef WNDMENU_NOCLOSE
case MENUITEM_CLOSE:
SendMessage(hwnd,WM_CLOSE,0,0);
break;
#endif//WNDMENU_NOCLOSE
#ifndef WNDMENU_NOSUBTITLES
case MENUITEM_ENABLESUBTITLES:
if(parm->decode) parm->decode->enableSubs(!parm->decode->subsEnabled());
_WriteConfigItemInt("subtitles",parm->decode->subsEnabled());
break;
case MENUITEM_SUBSIZEBASE:
case MENUITEM_SUBSIZEBASE+1:
case MENUITEM_SUBSIZEBASE+2:
case MENUITEM_SUBSIZEBASE+3:
case MENUITEM_SUBSIZEBASE+4:
if(parm->decode) {
int sizes[]={20,10,0,-4,-8};
int s=x-MENUITEM_SUBSIZEBASE;
parm->decode->setSubsFontSize(sizes[s]);
_WriteConfigItemInt("subtitles_size",parm->decode->getSubsFontSize());
}
break;
#endif//WNDMENU_NOSUBTITLES
default:
#ifndef WNDMENU_NOVOLUME
if (x >= MENUITEM_VOLUMEBASE && x <= MENUITEM_VOLUMEBASE+10)
{
int v=10-(x-MENUITEM_VOLUMEBASE);
parm->decode->setvolume((v*255)/10);
_WriteConfigItemInt("volume",parm->decode->getvolume());
}
#endif
break;
#ifndef WNDMENU_NOCLOSE
case WM_CLOSE:
DestroyWindow(hwnd);
return 0;
#endif
}
#ifndef WNDMENU_NOSUBTITLES
if(x>=MENUITEM_SUBSLANGBASE && x<=MENUITEM_SUBSLANGBASE+64) {
parm->decode->setSubLanguage(x-MENUITEM_SUBSLANGBASE);
}
#endif
}
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
#endif//_WNDMENU_H_