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

200 lines
No EOL
4 KiB
C++

#include "precomp__gen_ff.h"
#include "embedwndguid.h"
#include "wa2wndembed.h"
#include "wa2frontend.h"
#include "wa2cfgitems.h"
#include <bfc/string/stringW.h>
extern void initFFApi();
EmbedWndGuidMgr embedWndGuidMgr;
EmbedWndGuid::EmbedWndGuid(embedWindowState *_ws)
{
hwnd = NULL;
guid = INVALID_GUID;
if (_ws == NULL) return ;
ws = _ws;
hwnd = ws->me;
embedWndGuidMgr.getGuid(this);
}
EmbedWndGuid::EmbedWndGuid(EmbedWndGuid *wg)
{
hwnd = NULL;
guid = INVALID_GUID;
if (wg == NULL) return ;
ws = wg->getEmbedWindowState();
hwnd = ws->me;
guid = wg->getGuid();
}
GUID EmbedWndGuidMgr::getGuid(embedWindowState *ws)
{
foreach(table)
EmbedWndGuid *ewg = table.getfor();
if (ewg->getEmbedWindowState() == ws)
{
return ewg->getGuid();
}
endfor;
return INVALID_GUID;
}
GUID EmbedWndGuidMgr::getGuid(EmbedWndGuid *wg)
{
if (wg == NULL) return INVALID_GUID;
// if we aren't loaded yet, init wasabi, otherwise ignore
initFFApi();
int gotit = 0;
int nowrite = 0;
wchar_t windowTitle[256] = L"";
HWND child;
GUID newGuid = INVALID_GUID;
if (wg->getEmbedWindowState()->flags & EMBED_FLAGS_GUID)
{
newGuid = GET_EMBED_GUID(wg->getEmbedWindowState());
nowrite=1;
goto bypass;
}
if (wa2.isVis(wg->getEmbedWindowState()->me))
{
newGuid = avs_guid;
nowrite = 1;
extern int disable_send_visrandom;
extern _bool visrandom;
wa2.pollVisRandom();
goto bypass;
}
child = GetWindow(wg->getEmbedWindowState()->me, GW_CHILD);
if (child == wa2.getMediaLibrary())
{ newGuid = library_guid; nowrite = 1; goto bypass; }
if (!gotit)
{
foreach(table)
EmbedWndGuid *ewg = table.getfor();
if (ewg->getEmbedWindowState() == wg->getEmbedWindowState())
{
wg->setGuid(ewg->getGuid());
gotit = 1;
break;
}
endfor;
}
if (!gotit)
{
// not found, look for window title in saved table
GetWindowTextW(wg->getEmbedWindowState()->me, windowTitle, 256);
if (*windowTitle)
{
wchar_t str[256] = L"";
StringW configString = windowTitle;
configString += L"_guid";
WASABI_API_CONFIG->getStringPrivate(configString, str, 256, L"");
if (*str)
{
wg->setGuid(nsGUID::fromCharW(str));
table.addItem(new EmbedWndGuid(wg));
gotit = 1;
}
}
}
if (!gotit)
{
// not found in saved table, or no title for the window, assign a new guid
if (!_wcsicmp(windowTitle, L"AVS"))
{ newGuid = avs_guid; nowrite = 1; }
else
CoCreateGuid(&newGuid);
bypass:
wg->setGuid(newGuid);
// save a copy of the element
table.addItem(new EmbedWndGuid(wg));
// write the guid in the saved table
if (*windowTitle && !nowrite)
{
wchar_t str[256] = {0};
nsGUID::toCharW(newGuid, str);
StringW configString = windowTitle;
configString += L"_guid";
WASABI_API_CONFIG->setStringPrivate(configString, str);
}
}
return wg->getGuid();
}
embedWindowState *EmbedWndGuidMgr::getEmbedWindowState(GUID g)
{
foreach(table)
EmbedWndGuid *ewg = table.getfor();
if (ewg->getGuid() == g)
{
embedWindowState *ews = ewg->getEmbedWindowState();
if (wa2.isValidEmbedWndState(ews))
return ews;
}
endfor;
return NULL;
}
void EmbedWndGuidMgr::retireEmbedWindowState(embedWindowState *ws)
{
foreach(table)
EmbedWndGuid *ewg = table.getfor();
if (ewg->getEmbedWindowState() == ws)
{
delete table.getfor();
table.removeByPos(foreach_index);
break;
}
endfor;
}
int EmbedWndGuidMgr::testGuid(GUID g)
{
// if (g == library_guid) return 1;
// if (g == avs_guid) return 1;
foreach(table)
EmbedWndGuid *ewg = table.getfor();
if (ewg->getGuid() == g)
{
if (!wa2.isValidEmbedWndState(ewg->getEmbedWindowState())) retireEmbedWindowState(ewg->getEmbedWindowState());
else return 1;
}
endfor;
return 0;
}
int EmbedWndGuidMgr::getNumWindowStates()
{
return table.getNumItems();
}
GUID EmbedWndGuidMgr::enumWindowState(int n, embedWindowState **ws)
{
EmbedWndGuid *ewg = table.enumItem(n);
if (ewg)
{
embedWindowState *ews = ewg->getEmbedWindowState();
if (wa2.isValidEmbedWndState(ews))
{
if (ws) *ws = ews;
return ewg->getGuid();
}
}
return INVALID_GUID;
}