NowPlayingPlugin: iTunes quits are handled a little more gracefully now (i.e. iTunes should now quit immediately without lag)

This commit is contained in:
Birunthan Mohanathas 2011-07-17 10:36:04 +00:00
parent 8515877c48
commit a639eb7cc1
4 changed files with 89 additions and 28 deletions

View File

@ -449,7 +449,7 @@ void ExecuteBang(LPCTSTR bang, UINT id)
if (!player->IsInitialized()) if (!player->IsInitialized())
{ {
if (_wcsicmp(bang, L"ClosePlayer") == 0 || _wcsicmp(bang, L"TogglePlayer") == 0) if (_wcsicmp(bang, L"OpenPlayer") == 0 || _wcsicmp(bang, L"TogglePlayer") == 0)
{ {
player->OpenPlayer(parent->playerPath); player->OpenPlayer(parent->playerPath);
} }
@ -478,7 +478,7 @@ void ExecuteBang(LPCTSTR bang, UINT id)
{ {
player->Previous(); player->Previous();
} }
else if (_wcsicmp(bang, L"OpenPlayer") == 0 || _wcsicmp(bang, L"TogglePlayer") == 0) else if (_wcsicmp(bang, L"ClosePlayer") == 0 || _wcsicmp(bang, L"TogglePlayer") == 0)
{ {
player->ClosePlayer(); player->ClosePlayer();
} }

View File

@ -20,6 +20,7 @@
#include "PlayerITunes.h" #include "PlayerITunes.h"
CPlayer* CPlayerITunes::c_Player = NULL; CPlayer* CPlayerITunes::c_Player = NULL;
extern HINSTANCE g_Instance;
/* /*
** CEventHandler ** CEventHandler
@ -99,8 +100,8 @@ HRESULT STDMETHODCALLTYPE CPlayerITunes::CEventHandler::Invoke(DISPID dispidMemb
break; break;
case ITEventAboutToPromptUserToQuit: case ITEventAboutToPromptUserToQuit:
m_Player->m_UserQuitPrompt = true; PostMessage(m_Player->m_CallbackWindow, WM_USER, ITEventAboutToPromptUserToQuit, 0);
m_Player->Uninitialize(); SetTimer(m_Player->m_CallbackWindow, TIMER_CHECKACTIVE, 500, NULL);
break; break;
} }
@ -114,11 +115,30 @@ HRESULT STDMETHODCALLTYPE CPlayerITunes::CEventHandler::Invoke(DISPID dispidMemb
** **
*/ */
CPlayerITunes::CPlayerITunes() : CPlayer(), CPlayerITunes::CPlayerITunes() : CPlayer(),
m_UserQuitPrompt(false), m_CallbackWindow(),
m_iTunesActive(false),
m_iTunes(), m_iTunes(),
m_iTunesEvent() m_iTunesEvent()
{ {
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); // Create windows class
WNDCLASS wc = {0};
wc.hInstance = g_Instance;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = L"NowPlayingITunesClass";
RegisterClass(&wc);
// Create callback window
m_CallbackWindow = CreateWindow(L"NowPlayingITunesClass",
L"CallbackWindow",
WS_DISABLED,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
HWND_MESSAGE,
NULL,
g_Instance,
this);
} }
/* /*
@ -130,8 +150,11 @@ CPlayerITunes::CPlayerITunes() : CPlayer(),
CPlayerITunes::~CPlayerITunes() CPlayerITunes::~CPlayerITunes()
{ {
c_Player = NULL; c_Player = NULL;
DestroyWindow(m_CallbackWindow);
UnregisterClass(L"NowPlayingITunesClass", g_Instance);
Uninitialize(); Uninitialize();
CoUninitialize();
} }
/* /*
@ -179,6 +202,7 @@ void CPlayerITunes::Initialize()
if (m_iTunes) if (m_iTunes)
{ {
//SetTimer(NULL, 0, 1000, QuitCallback);
m_Initialized = true; m_Initialized = true;
// Set up event handler // Set up event handler
@ -229,13 +253,51 @@ void CPlayerITunes::Uninitialize()
if (m_Initialized) if (m_Initialized)
{ {
m_Initialized = false; m_Initialized = false;
if (m_iTunes) ClearData();
{
m_iTunes->Release(); m_iTunes->Release();
delete m_iTunesEvent; delete m_iTunesEvent;
} }
}
ClearData(); /*
** WndProc
**
** Window procedure for the callback window.
**
*/
LRESULT CALLBACK CPlayerITunes::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static CPlayerITunes* player;
switch (msg)
{
case WM_CREATE:
// Get pointer to the CPlayerITunes class from the CreateWindow call
player = (CPlayerITunes*)(((CREATESTRUCT*)lParam)->lpCreateParams);
return 0;
case WM_USER:
if (wParam == ITEventAboutToPromptUserToQuit)
{
// Event handler calls this through a PostMessage when iTunes quits
player->Uninitialize();
}
return 0;
case WM_TIMER:
if (wParam == TIMER_CHECKACTIVE)
{
if (!FindWindow(L"iTunes", L"iTunes"))
{
player->m_iTunesActive = false;
KillTimer(hwnd, TIMER_CHECKACTIVE);
}
}
return 0;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
} }
} }
@ -248,25 +310,19 @@ void CPlayerITunes::Uninitialize()
bool CPlayerITunes::CheckWindow() bool CPlayerITunes::CheckWindow()
{ {
static DWORD oldTime = 0; static DWORD oldTime = 0;
DWORD time = GetTickCount();
DWORD time = GetTickCount();
if (time - oldTime > 5000) if (time - oldTime > 5000)
{ {
oldTime = time; oldTime = time;
HWND wnd = FindWindow(L"iTunes", L"iTunes"); HWND wnd = FindWindow(L"iTunes", L"iTunes");
if (wnd) if (wnd && !m_iTunesActive)
{
if (!m_UserQuitPrompt)
{ {
m_iTunesActive = true;
Initialize(); Initialize();
} }
} }
else if (m_UserQuitPrompt)
{
m_UserQuitPrompt = false;
}
}
return m_Initialized; return m_Initialized;
} }
@ -526,9 +582,9 @@ void CPlayerITunes::SetVolume(int volume)
*/ */
void CPlayerITunes::ClosePlayer() void CPlayerITunes::ClosePlayer()
{ {
m_UserQuitPrompt = true;
m_iTunes->Quit(); m_iTunes->Quit();
Uninitialize(); Uninitialize();
SetTimer(m_CallbackWindow, TIMER_CHECKACTIVE, 500, NULL);
} }
/* /*

View File

@ -33,6 +33,8 @@
#include <atlhost.h> #include <atlhost.h>
#include <atlctl.h> #include <atlctl.h>
const int TIMER_CHECKACTIVE = 1;
class CPlayerITunes : public CPlayer class CPlayerITunes : public CPlayer
{ {
public: public:
@ -88,9 +90,12 @@ private:
void OnVolumeChange(int volume); void OnVolumeChange(int volume);
bool CheckWindow(); bool CheckWindow();
static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
static CPlayer* c_Player; static CPlayer* c_Player;
bool m_UserQuitPrompt; HWND m_CallbackWindow;
bool m_iTunesActive;
IiTunes* m_iTunes; IiTunes* m_iTunes;
CEventHandler* m_iTunesEvent; CEventHandler* m_iTunesEvent;
}; };

View File

@ -12,7 +12,7 @@
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,1,3,0 FILEVERSION 1,1,3,1
PRODUCTVERSION PRODUCTVER PRODUCTVERSION PRODUCTVER
FILEFLAGSMASK 0x17L FILEFLAGSMASK 0x17L
#ifdef _DEBUG #ifdef _DEBUG
@ -29,7 +29,7 @@ BEGIN
BLOCK "040904E4" BLOCK "040904E4"
BEGIN BEGIN
VALUE "FileDescription", "NowPlaying Plugin for Rainmeter" VALUE "FileDescription", "NowPlaying Plugin for Rainmeter"
VALUE "FileVersion", "1.1.3.0" VALUE "FileVersion", "1.1.3.1"
VALUE "InternalName", "NowPlaying" VALUE "InternalName", "NowPlaying"
VALUE "LegalCopyright", "Copyright (C) 2011 - Birunthan Mohanathas" VALUE "LegalCopyright", "Copyright (C) 2011 - Birunthan Mohanathas"
VALUE "OriginalFilename", "NowPlaying.dll" VALUE "OriginalFilename", "NowPlaying.dll"