123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388 |
- #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_
|