123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858 |
- #include <windowsx.h>
- #include "main.h"
- #include <ddraw.h>
- #include <multimon.h>
- #include "api.h"
- #include "vid_overlay.h"
- #include "vid_ddraw.h"
- #include "vid_subs.h"
- #include "vid_none.h"
- #include "VideoOutput.h"
- #include "Browser.h"
- #include "video.h"
- #include "../nu/AutoWide.h"
- #include "WinampAttributes.h"
- #include "resource.h"
- #define WM_VIDEO_UPDATE_STATUS_TEXT WM_USER+0x874
- #define WM_VIDEO_OPEN WM_USER+0x875
- #define WM_VIDEO_CLOSE WM_USER+0x876
- #define WM_VIDEO_RESIZE WM_USER+0x877
- #define WM_VIDEO_CREATE WM_USER+0x900
- #define VIDEO_GENFF_SIZEREQUEST (WM_USER+2048)
- #undef GetSystemMetrics
- #define INIT_DIRECTDRAW_STRUCT(x) (ZeroMemory(&x, sizeof(x)), x.dwSize=sizeof(x))
- VideoOutput *m_videooutput = NULL;
- static int VW_OnLButtonUp(HWND hwnd, int x, int y, UINT flags);
- static int VW_OnRButtonUp(HWND hwnd, int x, int y, UINT flags);
- static int VW_OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags);
- static int VW_OnMouseMove(HWND hwnd, int x, int y, UINT keyFlags);
- static int VW_OnLButtonDblClk(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags);
- static BOOL VW_OnNCActivate(HWND hwnd, BOOL fActive, HWND hwndActDeact, BOOL fMinimized);
- extern "C" int g_video_numaudiotracks;
- extern "C" int is_fullscreen_video = 0;
- extern "C" int no_notify_play;
- extern "C" int last_no_notify_play;
- #undef GetSystemMetrics
- bool sizeOnOpen = false;
- int widthOnOpen, heightOnOpen;
- #define VideoClassicWidth() 19
- #define VideoClassicHeight() 58
- static void VideoClose();
- /* Resizes the windows (parent and children) based on what the size of the video should be */
- static void SetVideoSize(int width, int height)
- {
- if (m_videooutput && m_videooutput->is_fullscreen()) // fullscreen
- {
- m_videooutput->SetVideoPosition(0, 0, config_video_width, config_video_height);
- }
- else // not fullscreen
- {
- // send out ideal video size message (in case anyone wants it)
- PostMessageW(hMainWindow, WM_WA_IPC, (((width) & 0xFFFF) << 16) | ((height) & 0xFFFF), IPC_SETIDEALVIDEOSIZE);
- if (GetParent(hVideoWindow)) // if gen_ff owns the window, then signal it about the video size
- PostMessageW(GetParent(hVideoWindow), VIDEO_GENFF_SIZEREQUEST, width, height);
- else // classic skin
- SetWindowPos(hVideoWindow, 0, 0, 0, width + VideoClassicWidth(), height + VideoClassicHeight(), SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
- }
- }
- /* Resizes the windows (parent and children) based on what the size of the parent should be */
- void SetExteriorSize(int width, int height)
- {
- // calculate interior size
- width -= VideoClassicWidth();
- height -= VideoClassicHeight();
- // pass our calculated value onto the size routine
- SetVideoSize(width, height);
- }
- /* lays out children (video and ad) based on a given parent window size */
- static void LayoutChildren(int width, int height)
- {
- if (m_videooutput && m_videooutput->is_fullscreen()) // fullscreen
- {
- m_videooutput->SetVideoPosition(0, 0, config_video_width, config_video_height);
- }
- else // not fullscreen
- {
- // calculate interior size
- width -= VideoClassicWidth();
- height -= VideoClassicHeight();
- // size the video
- if (m_videooutput)
- {
- m_videooutput->SetVideoPosition(11, 20, width, height);
- InvalidateRect(m_videooutput->getHwnd(), 0, TRUE); // force repaint of video
- }
- InvalidateRect(hVideoWindow, 0, TRUE); // force repaint of parent window
- }
- }
- /* Resizes the windows (parent and children) based on what the size of the parent should be
- Sets the position of the parent window */
- static void SetExteriorSizeAndPosition(int x, int y, int width, int height)
- {
- config_video_wx = x;
- config_video_wy = y;
- SetExteriorSize(width, height);
- }
- void updateTrackSubmenu()
- {
- HMENU menu = GetSubMenu(GetSubMenu(top_menu, 3), 13);
- HMENU audiomenu = GetSubMenu(menu, 6);
- HMENU videomenu = GetSubMenu(menu, 7);
- static int audioadded = 0;
- static int videoadded = 0;
- static int first = 1;
- if (first)
- {
- RemoveMenu(audiomenu, ID_VID_AUDIO0, MF_BYCOMMAND);
- RemoveMenu(videomenu, ID_VID_VIDEO0, MF_BYCOMMAND);
- first = 1;
- }
- if (audioadded)
- {
- for (int i = 0;i < 16;i++)
- {
- RemoveMenu(audiomenu, ID_VID_AUDIO0 + i, MF_BYCOMMAND);
- }
- audioadded = 0;
- }
- if (videoadded)
- {
- for (int i = 0;i < 16;i++)
- {
- RemoveMenu(videomenu, ID_VID_VIDEO0 + i, MF_BYCOMMAND);
- }
- videoadded = 0;
- }
- VideoOutput *out = (VideoOutput *)video_getIVideoOutput();
- if (!out || !out->getTrackSelector())
- {
- EnableMenuItem(menu, 8, MF_GRAYED | MF_BYPOSITION);
- EnableMenuItem(menu, 9, MF_GRAYED | MF_BYPOSITION);
- return ;
- }
- ITrackSelector *sel = out->getTrackSelector();
- int numaudiotracks = sel->getNumAudioTracks();
- if (numaudiotracks < 2)
- {
- EnableMenuItem(menu, 8, MF_GRAYED | MF_BYPOSITION);
- }
- else
- {
- audioadded = 1;
- int curtrack = sel->getCurAudioTrack();
- for (int i = 0;i < numaudiotracks;i++)
- {
- char t[256] = {0};
- sel->enumAudioTrackName(i, t, 255);
- InsertMenuA(audiomenu, i, MF_BYPOSITION, ID_VID_AUDIO0 + i, t);
- CheckMenuItem(audiomenu, ID_VID_AUDIO0 + i, ((i == curtrack) ? MF_CHECKED : MF_UNCHECKED) | MF_BYCOMMAND);
- }
- EnableMenuItem(menu, 8, MF_ENABLED | MF_BYPOSITION);
- }
- int numvideotracks = sel->getNumVideoTracks();
- if (numvideotracks < 2)
- {
- EnableMenuItem(menu, 9, MF_GRAYED | MF_BYPOSITION);
- }
- else
- {
- videoadded = 1;
- int curtrack = sel->getCurVideoTrack();
- for (int i = 0;i < numvideotracks;i++)
- {
- char t[256] = {0};
- sel->enumVideoTrackName(i, t, 255);
- InsertMenuA(videomenu, i, MF_BYPOSITION, ID_VID_VIDEO0 + i, t);
- CheckMenuItem(videomenu, ID_VID_VIDEO0 + i, ((i == curtrack) ? MF_CHECKED : MF_UNCHECKED) | MF_BYCOMMAND);
- }
- EnableMenuItem(menu, 9, MF_ENABLED | MF_BYPOSITION);
- }
- }
- int ShowVideoWindow(int init_state)
- {
- sizeOnOpen = false;
- if (config_video_open // if we're already open
- || !hVideoWindow // or we havn't made the video window yet
- || !g_has_video_plugin // or we're configured to not have video
- || !Ipc_WindowToggle(IPC_CB_WND_VIDEO, 1)) // or some plugin doesn't want us to open the video window
- return 0; // then bail out
- CheckMenuItem(main_menu, WINAMP_OPTIONS_VIDEO, MF_CHECKED);
- if(!init_state && !config_minimized) ShowWindow(hVideoWindow, SW_SHOWNA);
- //ad->show(true);
- config_video_open = 1;
- set_aot(1);
- return 1;
- }
- void HideVideoWindow(int autoStop)
- {
- sizeOnOpen = false;
- if (!config_video_open // if we're not even open
- || !hVideoWindow // or we havn't made the video window yet
- // || !g_has_video_plugin // or we're configured to not have video
- || !Ipc_WindowToggle(IPC_CB_WND_VIDEO, !config_video_open)) // or some plugin doesn't want us to close the video window
- return ; // then bail out
- if (GetForegroundWindow() == hVideoWindow || IsChild(hVideoWindow, GetForegroundWindow()))
- {
- SendMessageW(hMainWindow, WM_COMMAND, WINAMP_NEXT_WINDOW, 0);
- }
- CheckMenuItem(main_menu, WINAMP_OPTIONS_VIDEO, MF_UNCHECKED);
- ShowWindow(hVideoWindow, SW_HIDE);
- config_video_open = 0;
- if (autoStop && config_video_stopclose && !(GetAsyncKeyState(VK_SHIFT)&0x8000) && video_isVideoPlaying())
- {
- PostMessageW(hMainWindow, WM_COMMAND, WINAMP_BUTTON4, 0);
- }
- }
- HMENU BuildPopupMenu();
- void Vid_Cmd(windowCommand *wc)
- {
- switch (wc->cmd)
- {
- case VIDCMD_FULLSCREEN:
- videoGoFullscreen();
- break;
- case VIDCMD_1X:
- SendMessageW(videoGetHwnd(), WM_COMMAND, ID_VIDEOWND_ZOOM100, 0);
- break;
- case VIDCMD_2X:
- SendMessageW(videoGetHwnd(), WM_COMMAND, ID_VIDEOWND_ZOOM200, 0);
- break;
- case VIDCMD_LIB:
- SendMessageW(videoGetHwnd(), WM_COMMAND, WINAMP_VIDEO_TVBUTTON, 0);
- break;
- case VIDPOPUP_MISC:
- DoTrackPopup(BuildPopupMenu(), wc->align, wc->x, wc->y, videoGetHwnd());
- break;
- case VIDCMD_EXIT_FS:
- videoForceFullscreenOff();
- break;
- }
- }
- static int VW_OnRButtonUp(HWND hwnd, int x, int y, UINT flags)
- {
- POINT p;
- extern HMENU top_menu;
- GetCursorPos(&p);
- DoTrackPopup(main_menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, p.x, p.y, hMainWindow);
- return 1;
- }
- static int VW_OnLButtonUp(HWND hwnd, int x, int y, UINT flags)
- {
- ReleaseCapture();
- videoui_handlemouseevent(x, y, -1, flags);
- return 1;
- }
- static int VW_OnLButtonDown( HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags )
- {
- SetCapture( hwnd );
- videoui_handlemouseevent( x, y, 1, keyFlags );
- SetFocus( hwnd );
- return 1;
- }
- static int VW_OnMouseMove(HWND hwnd, int x, int y, UINT keyFlags)
- {
- videoui_handlemouseevent(x, y, 0, keyFlags);
- return 1;
- }
- static BOOL VW_OnNCActivate( HWND hwnd, BOOL fActive, HWND hwndActDeact, BOOL fMinimized )
- {
- if ( !m_videooutput || ( m_videooutput && !m_videooutput->is_fullscreen() ) )
- {
- if ( fActive == FALSE )
- draw_vw_tbar( config_hilite ? 0 : 1 );
- else
- draw_vw_tbar( 1 );
- }
- return TRUE;
- }
- static int VW_OnLButtonDblClk(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)
- {
- return 1;
- }
- /*Turns off and on the screensaver*/
- VOID CALLBACK ResetScreenSaver(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
- {
- // benski> this seems less hackish. only win2k and up
- if (config_video_noss && video_isVideoPlaying())
- SetThreadExecutionState(ES_DISPLAY_REQUIRED);
- // TODO: maybe we should do the same thing with ES_SYSTEM_REQUIRED to keep the system from snoozing
- // benski> old code was here
- /*
- BOOL b;
- if (config_video_noss && video_isVideoPlaying() && SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &b, 0) && b)
- {
- SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, 0, 0); // turn off
- SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, 0, 0); // turn back on
- // this is just a hack
- // basically by toggling off and on we reset the timeout count
- }
- */
- }
- static void VideoOpen(HWND hwnd, int width, int height)
- {
- sizeOnOpen=false;
- // check if we appear to be doing a resume from a tag edit
- // and if so then we need to ignore the show window option
- if (config_video_autoopen &&
- ((no_notify_play != last_no_notify_play && !last_no_notify_play) || (no_notify_play == last_no_notify_play)))
- ShowVideoWindow(0);
- last_no_notify_play = no_notify_play;
- HWND skinVidWindow = GetParent(hwnd) ? GetParent(hwnd) : hwnd;
- if (m_videooutput->is_fullscreen() || config_video_auto_fs) // go fullscreen
- {
- videoGoFullscreen();
- InvalidateRect(m_videooutput->getHwnd(), 0, TRUE);
- }
- else // not fullscreen
- {
- if (config_video_updsize)
- {
- widthOnOpen = width;
- heightOnOpen = height;
- sizeOnOpen = true;
- SetVideoSize(width, height);
- }
- LayoutChildren(config_video_width, config_video_height);
- if (!IsIconic(skinVidWindow))
- BringWindowToTop(skinVidWindow);
- InvalidateRect(hwnd, 0, TRUE);
- }
- }
- LRESULT CALLBACK video_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- if (uMsg == g_scrollMsg) { wParam <<= 16; uMsg = WM_MOUSEWHEEL; }
- if (uMsg == WM_LBUTTONUP || uMsg == WM_LBUTTONDOWN || uMsg == WM_RBUTTONUP || uMsg == WM_MOUSEMOVE)
- if (!m_videooutput || !m_videooutput->is_fullscreen())
- {
- switch (uMsg)
- {
- HANDLE_MSG(hwnd, WM_LBUTTONUP, VW_OnLButtonUp);
- HANDLE_MSG(hwnd, WM_LBUTTONDOWN, VW_OnLButtonDown);
- HANDLE_MSG(hwnd, WM_MOUSEMOVE, VW_OnMouseMove);
- HANDLE_MSG(hwnd, WM_RBUTTONUP, VW_OnRButtonUp);
- }
- }
- switch (uMsg)
- {
- case WM_USER + 1:
- if (m_videooutput)
- SendMessageW(m_videooutput->getHwnd(), uMsg, wParam, lParam);
- break;
- case WM_USER + 2:
- if (sizeOnOpen)
- {
- // sizeOnOpen=false;
- PostMessageW(hwnd, WM_VIDEO_RESIZE, widthOnOpen, heightOnOpen);
- }
- if (m_videooutput)
- SendMessageW(m_videooutput->getHwnd(), uMsg, wParam, lParam);
- break;
- case WM_USER + 0x100:
- if (wParam == 1 && lParam)
- {
- config_video_wx = ((POINT *)lParam)->x;
- config_video_wy = ((POINT *)lParam)->y;
- if ((!!config_snap) ^ (!!(GetKeyState(VK_SHIFT) & 0x8000)))
- {
- RECT outrc;
- EstVidWindowRect(&outrc);
- SnapWindowToAllWindows(&outrc, hVideoWindow);
- SetVidWindowRect(&outrc);
- }
- SetWindowPos(hVideoWindow, 0, config_video_wx, config_video_wy, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
- }
- return 0;
- case WM_TIMER:
- switch (wParam)
- {
- case 12345: // signal from elsewhere
- if (m_videooutput)
- SendMessageW(m_videooutput->getHwnd(), WM_TIMER, 0, 0);
- break;
- }
- return 0;
- case WM_WINDOWPOSCHANGING:
- case WM_WINDOWPOSCHANGED: // we trap both windowposchanging and windowposchanged incase someone uses SetWindowPos(..., SWP_NOSENDCHANGING)
- {
- LPWINDOWPOS windowPos = (LPWINDOWPOS) lParam;
- if (windowPos->flags & SWP_NOSIZE)
- {
- break;
- }
- if (uMsg == WM_WINDOWPOSCHANGED)
- {
- config_video_width = windowPos->cx;
- config_video_height = windowPos->cy;
- LayoutChildren(config_video_width, config_video_height);
- // update the position of the tooltips on window resize
- set_vid_wnd_tooltip();
- }
- }
- break;
- case WM_NOTIFY:
- {
- LPTOOLTIPTEXT tt = (LPTOOLTIPTEXT)lParam;
- if(tt->hdr.hwndFrom = hVideoTooltipWindow)
- {
- switch (tt->hdr.code)
- {
- case TTN_SHOW:
- SetWindowPos(tt->hdr.hwndFrom,HWND_TOPMOST,0,0,0,0,SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE);
- break;
- }
- }
- }
- break;
- case WM_GETMINMAXINFO:
- {
- MINMAXINFO *p = (MINMAXINFO *)lParam;
- p->ptMaxTrackSize.x = 16384;
- p->ptMaxTrackSize.y = 16384;
- }
- return 0;
- case WM_VIDEO_RESIZE:
- //ReplyMessage(0); // if IVideoOutput::open() was called on a different thread, this will unblock it.
- {
- int width = wParam;
- int height = lParam;
- // idealWidth = wParam;
- SetVideoSize(width, height);
- LayoutChildren(config_video_width, config_video_height);
- }
- return 0;
- case WM_DESTROY:
- if (NULL != WASABI_API_APP) WASABI_API_APP->app_unregisterGlobalWindow(hwnd);
- if (vw_init)
- draw_vw_kill();
- break;
- case WM_DISPLAYCHANGE:
- InvalidateRect(hwnd, NULL, TRUE);
- break;
- case WM_VIDEO_OPEN:
- VideoOpen(hwnd, wParam, lParam);
- // set_aot(1);
- return 0;
- break;
- case WM_VIDEO_CREATE:
- m_videooutput->mainthread_Create();
- break;
- case WM_VIDEO_CLOSE:
- VideoClose();
- InvalidateRect(hwnd, NULL, TRUE); //repaint
- return 0;
- case WM_VIDEO_UPDATE_STATUS_TEXT:
- if (m_videooutput && !m_videooutput->is_fullscreen())
- draw_vw_info((wchar_t*)wParam, 1);
- videoTextFeed->UpdateText((const wchar_t*)wParam, 1024);
- return 0;
- case WM_MOUSEWHEEL:
- return SendMessageW(hMainWindow, uMsg, wParam, lParam);
- HANDLE_MSG(hwnd, WM_QUERYNEWPALETTE, Main_OnQueryNewPalette);
- HANDLE_MSG(hwnd, WM_PALETTECHANGED, Main_OnPaletteChanged);
- HANDLE_MSG(hwnd, WM_NCACTIVATE, VW_OnNCActivate);
- HANDLE_MSG(hwnd, WM_LBUTTONDBLCLK, VW_OnLButtonDblClk);
- case WM_CONTEXTMENU:
- {
- if (lParam == MAKELONG(-1, -1))
- {
- extern HMENU top_menu;
- RECT r;
- GetWindowRect(videoGetHwnd(), &r);
- DoTrackPopup(BuildPopupMenu(), TPM_LEFTALIGN | TPM_RIGHTBUTTON, r.left, r.top, videoGetHwnd());
- }
- }
- return 0;
- case WM_KEYDOWN: case WM_KEYUP: case WM_SYSKEYDOWN: case WM_SYSKEYUP:
- if ((GetAsyncKeyState(VK_CONTROL)&0x8000) && wParam == VK_F4)
- {
- if (uMsg == WM_KEYDOWN || uMsg == WM_SYSKEYDOWN)
- SendMessageW(hMainWindow, WM_COMMAND, WINAMP_OPTIONS_VIDEO, 0);
- }
- /* else if(uMsg==WM_SYSKEYDOWN && (LPARAM&(1<<29)) && wParam == VK_RETURN)
- {
- if (m_videooutput)
- {
- if(!m_videooutput->is_fullscreen()) m_videooutput->fullscreen();
- else m_videooutput->remove_fullscreen();
- }
- }*/
- else
- {
- if (SendMessageW(m_videooutput->getHwnd(), uMsg, wParam, lParam)) return 0;
- if (wParam != VK_RETURN && m_videooutput->is_fullscreen() && ((GetAsyncKeyState(VK_CONTROL) | GetAsyncKeyState(VK_MENU))&0x8000)) return 0;
- {
- MSG winmsg;
- winmsg.message = uMsg;
- winmsg.hwnd = hMainWindow;
- winmsg.wParam = wParam;
- winmsg.lParam = lParam;
- if (WASABI_API_APP->app_translateAccelerators(&winmsg)) return 0;
- //if (transAccel(hwnd,uMsg,wParam,lParam)) return 0;
- //transAccelStruct tas = {hwnd, uMsg, wParam, lParam};
- //if (SendMessageW(hMainWindow, WM_WA_IPC, (WPARAM)&tas, IPC_TRANSLATEACCELERATOR)) return 0;
- }
- }
- break;
- case WM_DROPFILES:
- return SendMessageW(hMainWindow, uMsg, wParam, lParam);
- case WM_SHOWWINDOW:
- if (wParam == TRUE) // showing
- {
- if (sizeOnOpen)
- {
- //sizeOnOpen=false;
- PostMessageW(hwnd, WM_VIDEO_RESIZE, widthOnOpen, heightOnOpen);
- }
- if (!IsIconic(hwnd))
- BringWindowToTop(hwnd);
- LayoutChildren(config_video_width, config_video_height);
- }
- RefreshIconicThumbnail();
- /*
- {
- // if extra_data[EMBED_STATE_EXTRA_REPARENTING] is set, we are being reparented by the freeform lib, so we should
- // just ignore this message because our visibility will not change once the freeform
- // takeover/restoration is complete
- embedWindowState *ws = (embedWindowState *)GetWindowLongW(hwnd, GWL_USERDATA);
- if (ws != NULL && ws->extra_data[EMBED_STATE_EXTRA_REPARENTING])
- {
- }
- }
- */
- break;
- case WM_CLOSE:
- if (!m_videooutput || !m_videooutput->is_fullscreen())
- WASABI_API_APP->main_shutdown();
- else
- m_videooutput->remove_fullscreen();
- return 0;
- case WM_PAINT:
- if (!m_videooutput || !m_videooutput->is_fullscreen())
- {
- draw_paint_vw(hwnd);
- return 0;
- }
- break;
- case WM_CREATE:
- hVideoWindow = hwnd;
- SetTimer(hwnd, 32, 15000, ResetScreenSaver);
- SetWindowLongPtrW(hwnd, GWLP_USERDATA, (config_keeponscreen&2) ? 0x49474541 : 0);
- SetWindowLongW(hwnd, GWL_STYLE, GetWindowLongW(hwnd, GWL_STYLE)&~(WS_CAPTION));
- SetWindowPos(hVideoWindow, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
- //ad->CreateHWND(hwnd);
- m_videooutput = new VideoOutput(hwnd);
- if (!config_minimized)
- ShowWindow(m_videooutput->getHwnd(), SW_SHOWNA);
- SetExteriorSizeAndPosition(config_video_wx, config_video_wy, config_video_width, config_video_height);
- LayoutChildren(config_video_width, config_video_height);
-
- if (NULL != WASABI_API_APP) WASABI_API_APP->app_registerGlobalWindow(hwnd);
-
- return 0;
- case WM_COMMAND:
- return SendMessageW(hMainWindow, uMsg, wParam, lParam);
- case WM_MOVE:
- if (m_videooutput)
- SendMessageW(m_videooutput->getHwnd(), WM_MOVE, 0, 0);
- return 0;
- case WM_SETCURSOR:
- if (config_usecursors && !disable_skin_cursors)
- {
- #define inreg(x,y,x2,y2) \
- ((mouse_x <= ( x2 ) && mouse_x >= ( x ) && \
- mouse_y <= ( y2 ) && mouse_y >= ( y )))
- if (((HWND)wParam == hVideoWindow || IsChild(hVideoWindow, (HWND)wParam)) && HIWORD(lParam) == WM_MOUSEMOVE)
- {
- int mouse_x, mouse_y;
- POINT p;
- static RECT b[] =
- {
- { -(275 - 264), 3, -(275 - 272), 12}, //close
- {0, 0, -1, 13}, // titelbar
- { -20, -20, -1, -1},
- };
- int iconoffs[] = {15 + 1, 15 + 2, 15 + 4, 15 + 5};
- int b_len = 3;
- int x;
- GetCursorPos(&p);
- ScreenToClient(hVideoWindow, &p);
- mouse_x = p.x;
- mouse_y = p.y;
- for (x = 0; x < b_len; x ++)
- {
- int l, r, t, bo;
- l = b[x].left;r = b[x].right;t = b[x].top;bo = b[x].bottom;
- if (l < 0) l += config_video_width;
- if (r < 0) r += config_video_width;
- if (t < 0) t += config_video_height;
- if (bo < 0) bo += config_video_height;
- if (inreg(l, t, r, bo)) break;
- }
- if (Skin_Cursors[iconoffs[x]]) SetCursor(Skin_Cursors[iconoffs[x]]);
- else SetCursor(LoadCursorW(NULL, IDC_ARROW));
- }
- return TRUE;
- }
- else SetCursor(LoadCursorW(NULL, IDC_ARROW));
- return TRUE;
- case WM_SYSCOMMAND:
- // eat screen saver message when fullscreen
- if (((wParam & 0xfff0) == SC_SCREENSAVE || (wParam & 0xfff0) == SC_MONITORPOWER) && config_video_noss &&
- video_isVideoPlaying())
- {
- return -1;
- }
- break;
- }
- if (FALSE != IsDirectMouseWheelMessage(uMsg))
- {
- SendMessageW(hwnd, WM_MOUSEWHEEL, wParam, lParam);
- return TRUE;
- }
- return DefWindowProcW(hwnd, uMsg, wParam, lParam);
- }
- static void VideoClose()
- {
- sizeOnOpen=false;
- if (!g_has_video_plugin)
- return ;
- if (m_videooutput && m_videooutput->is_fullscreen() && config_video_remove_fs_on_stop)
- videoForceFullscreenOff();
- if ((!m_videooutput && (bool)config_video_autoclose)
- || (m_videooutput && !m_videooutput->is_fullscreen() && (bool)config_video_autoclose))
- HideVideoWindow(false);
- }
- extern "C"
- {
- void videoAdSizeChanged()
- {
- LayoutChildren(config_video_width, config_video_height);
- }
- void *video_getIVideoOutput()
- {
- return (void *)m_videooutput;
- }
- int video_isVideoPlaying()
- {
- if (!m_videooutput) return 0;
- return m_videooutput->isVideoPlaying();
- }
- void videoGoFullscreen()
- {
- if (m_videooutput)
- {
- m_videooutput->fullscreen();
- }
- }
- int videoIsFullscreen()
- {
- if (m_videooutput) return !!m_videooutput->is_fullscreen();
- return 0;
- }
- void videoReinit()
- {
- if (m_videooutput)
- PostMessageW(m_videooutput->getHwnd(), WM_USER + 0x1, 0, 0);
- }
- void videoForceFullscreenOff()
- {
- if (m_videooutput)
- {
- m_videooutput->remove_fullscreen();
- LayoutChildren(config_video_width, config_video_height);
- }
- }
- void videoToggleFullscreen()
- {
- if (m_videooutput)
- {
- if (!m_videooutput->is_fullscreen())
- videoGoFullscreen();
- else
- videoForceFullscreenOff();
- }
- }
- void videoSetFlip(int on)
- {
- if (m_videooutput)
- {
- m_videooutput->extended(VIDUSER_SET_VFLIP, on, 0);
- }
- // for consistency we need to update the state on the prefs page
- if(prefs_last_page == 24 && IsWindow(prefs_hwnd))
- {
- SendMessageW(prefs_hwnd, WM_USER + 33, IDC_PREFS_VIDEO_FLIPRGB, on);
- }
- CheckMenuItem(GetSubMenu(GetSubMenu(top_menu, 3), 13), ID_VIDEOWND_VERTICALLYFLIP, (on ? MF_CHECKED: MF_UNCHECKED));
- }
- DWORD videoGetWidthHeightDWORD()
- {
- if (!m_videooutput) return 0;
- return m_videooutput->GetWidthHeightDWORD();
- }
- HWND videoGetHwnd()
- {
- if (m_videooutput) return m_videooutput->getHwnd();
- return NULL;
- }
- int video_getNumAudioTracks()
- {
- VideoOutput *vid = (VideoOutput *)video_getIVideoOutput();
- if (!vid) return 1;
- ITrackSelector *sel = vid->getTrackSelector();
- if (!sel) return 1;
- return sel->getNumAudioTracks();
- }
- int video_getNumVideoTracks()
- {
- VideoOutput *vid = (VideoOutput *)video_getIVideoOutput();
- if (!vid) return 1;
- ITrackSelector *sel = vid->getTrackSelector();
- if (!sel) return 1;
- return sel->getNumVideoTracks();
- }
- int video_getCurAudioTrack()
- {
- VideoOutput *vid = (VideoOutput *)video_getIVideoOutput();
- if (!vid) return 0;
- ITrackSelector *sel = vid->getTrackSelector();
- if (!sel) return 0;
- return sel->getCurAudioTrack();
- }
- int video_getCurVideoTrack()
- {
- VideoOutput *vid = (VideoOutput *)video_getIVideoOutput();
- if (!vid) return 0;
- ITrackSelector *sel = vid->getTrackSelector();
- if (!sel) return 0;
- return sel->getCurVideoTrack();
- }
- int video_setCurAudioTrack(int track)
- {
- VideoOutput *vid = (VideoOutput *)video_getIVideoOutput();
- if (!vid) return 0;
- ITrackSelector *sel = vid->getTrackSelector();
- if (!sel) return 0;
- sel->setAudioTrack(track);
- return sel->getCurAudioTrack();
- }
- int video_setCurVideoTrack(int track)
- {
- VideoOutput *vid = (VideoOutput *)video_getIVideoOutput();
- if (!vid) return 0;
- ITrackSelector *sel = vid->getTrackSelector();
- if (!sel) return 0;
- sel->setVideoTrack(track);
- return sel->getCurVideoTrack();
- }
- HWND video_Create()
- {
- return CreateWindowExW(WS_EX_ACCEPTFILES, L"Winamp Video", getStringW(IDS_VIDEOCAPTION, NULL, 0), (WS_OVERLAPPED | WS_CLIPCHILDREN)&(~WS_CAPTION),
- config_video_wx, config_video_wy, config_video_width, config_video_height,
- hMainWindow, NULL, GetModuleHandle(NULL), NULL);
- }
- }
|