winamp/Src/Plugins/General/gen_ff/fsmonitor.cpp
2024-09-24 14:54:57 +02:00

175 lines
4.5 KiB
C++

#include "precomp__gen_ff.h"
#include "fsmonitor.h"
#define tag L"wa5_fsmonitorclass"
LRESULT CALLBACK fsMonitorWndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
extern HINSTANCE hInstance;
//------------------------------------------------------------------------
FullScreenMonitor::FullScreenMonitor()
{
m_go_fs_timer_set = 0;
m_cancel_fs_timer_set = 0;
m_fs = 0;
WNDCLASSW wc;
if (!GetClassInfoW( hInstance, tag, &wc ))
{
MEMSET( &wc, 0, sizeof( wc ) );
wc.lpfnWndProc = fsMonitorWndProc;
wc.hInstance = hInstance; // hInstance of DLL
wc.lpszClassName = tag; // our window class name
wc.style = 0;
int _r = RegisterClassW( &wc );
ASSERTPR( _r, "cannot create fsmonitor wndclass" );
}
hWnd = CreateWindowExW( 0, tag, L"", 0, 0, 0, 1, 1, NULL, NULL, hInstance, NULL );
ASSERT( hWnd );
SetWindowLongPtrW( hWnd, GWLP_USERDATA, (LONG_PTR) this );
APPBARDATA abd;
abd.cbSize = sizeof( APPBARDATA );
abd.hWnd = hWnd;
abd.uCallbackMessage = APPBAR_CALLBACK;
SHAppBarMessage( ABM_NEW, &abd );
}
//------------------------------------------------------------------------
FullScreenMonitor::~FullScreenMonitor()
{
APPBARDATA abd;
abd.cbSize = sizeof( APPBARDATA );
abd.hWnd = hWnd;
SHAppBarMessage( ABM_REMOVE, &abd );
if (IsWindow( hWnd ))
DestroyWindow( hWnd );
}
//------------------------------------------------------------------------
void FullScreenMonitor::registerCallback( FSCallback *cb )
{
if (m_callbacks.haveItem( cb )) return;
m_callbacks.addItem( cb );
}
//------------------------------------------------------------------------
void FullScreenMonitor::unregisterCallback( FSCallback *cb )
{
m_callbacks.removeItem( cb );
}
//------------------------------------------------------------------------
void FullScreenMonitor::onGoFullscreen()
{
if (m_cancel_fs_timer_set)
{
timerclient_killTimer( 2 );
m_cancel_fs_timer_set = 0;
}
else
{
timerclient_setTimer( 1, 250 );
m_go_fs_timer_set = 1;
}
}
//------------------------------------------------------------------------
void FullScreenMonitor::onCancelFullscreen()
{
if (m_go_fs_timer_set)
{
timerclient_killTimer( 1 );
m_go_fs_timer_set = 0;
}
else
{
timerclient_setTimer( 2, 250 );
m_cancel_fs_timer_set = 1;
}
}
//------------------------------------------------------------------------
void FullScreenMonitor::sendGoFSCallbacks()
{
foreach( m_callbacks );
m_callbacks.getfor()->onGoFullscreen();
endfor;
}
//------------------------------------------------------------------------
void FullScreenMonitor::sendCancelFSCallbacks()
{
foreach( m_callbacks );
m_callbacks.getfor()->onCancelFullscreen();
endfor;
}
//------------------------------------------------------------------------
void FullScreenMonitor::timerclient_timerCallback( int id )
{
if (id == 1)
{
timerclient_killTimer( 1 );
m_go_fs_timer_set = 0;
sendGoFSCallbacks();
}
else if (id == 2)
{
timerclient_killTimer( 2 );
m_cancel_fs_timer_set = 0;
sendCancelFSCallbacks();
}
}
//------------------------------------------------------------------------
int FullScreenMonitor::wndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch (uMsg)
{
case APPBAR_CALLBACK:
{
switch (wParam)
{
case ABN_FULLSCREENAPP:
//DebugString("ABN_FULLSCREENAPP\n");
if (lParam && !m_fs)
{
m_fs = 1;
onGoFullscreen();
}
else if (!lParam && m_fs)
{
m_fs = 0;
onCancelFullscreen();
}
break;
}
}
}
return DefWindowProc( hwnd, uMsg, wParam, lParam );
}
//------------------------------------------------------------------------
LRESULT CALLBACK fsMonitorWndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
#ifdef WIN32
FullScreenMonitor *gThis = (FullScreenMonitor *) GetWindowLongPtrW( hwnd, GWLP_USERDATA );
if (!gThis)
return DefWindowProc( hwnd, uMsg, wParam, lParam );
else
return gThis->wndProc( hwnd, uMsg, wParam, lParam );
#else
return 0;
#endif
}