aboutsummaryrefslogtreecommitdiff
path: root/Src/nsv/nsvplay/wndmenu.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/nsv/nsvplay/wndmenu.h')
-rw-r--r--Src/nsv/nsvplay/wndmenu.h388
1 files changed, 388 insertions, 0 deletions
diff --git a/Src/nsv/nsvplay/wndmenu.h b/Src/nsv/nsvplay/wndmenu.h
new file mode 100644
index 00000000..17677901
--- /dev/null
+++ b/Src/nsv/nsvplay/wndmenu.h
@@ -0,0 +1,388 @@
+#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_ \ No newline at end of file