388 lines
12 KiB
C
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_
|