PLUGIN_EXPORT void Initialize(void** data, void* rm) { ChildMeasure* child = new ChildMeasure; *data = child; void* skin = RmGetSkin(rm); LPCWSTR parentName = RmReadString(rm, L"ParentName", L""); if (!*parentName) { child->parent = new ParentMeasure; child->parent->name = RmGetMeasureName(rm); child->parent->skin = skin; child->parent->ownerChild = child; g_ParentMeasures.push_back(child->parent); } else { // Find parent using name AND the skin handle to be sure that it's the right one std::vector<ParentMeasure*>::const_iterator iter = g_ParentMeasures.begin(); for ( ; iter != g_ParentMeasures.end(); ++iter) { if (_wcsicmp((*iter)->name, parentName) == 0 && (*iter)->skin == skin) { child->parent = (*iter); return; } } RmLog(LOG_ERROR, L"ParentChild.dll: Invalid ParentName="); } }
PLUGIN_EXPORT void Initialize(void** data, void* rm) { MeasureData* measure = new MeasureData(RmGetMeasureName(rm)); *data = measure; g_Measures.push_back(measure); void* skin = RmGetSkin(rm); LPCWSTR str = RmReadString(rm, L"Folder", L"", FALSE); if (*str == L'[') { int len = wcslen(str); for (auto iter = g_Measures.cbegin(); iter != g_Measures.cend(); ++iter) { if ((*iter)->folder && (*iter)->folder->GetSkin() == skin && wcsncmp(&str[1], (*iter)->section, len - 2) == 0) { measure->folder = (*iter)->folder; measure->folder->AddInstance(); return; } } } measure->folder = new CFolderInfo(skin); measure->parent = true; }
PLUGIN_EXPORT void Initialize(void** data, void* rm) { Measure* measure = new Measure; *data = measure; measure->skin = RmGetSkin(rm); measure->rm = rm; }
static PyObject *Rainmeter_RmExecute(RainmeterObject *self, PyObject *args) { PyObject *command; PyArg_ParseTuple(args, "U", &command); wchar_t *commandStr = PyUnicode_AsWideCharString(command, NULL); RmExecute(RmGetSkin(self->rm), commandStr); PyMem_Free(commandStr); Py_INCREF(Py_None); return Py_None; }
PLUGIN_EXPORT double Update(void* data) { Measure* measure = (Measure*)data; Player* player = measure->player; player->UpdateData(); if (player->m_TrackChanged && !measure->trackChangeAction.empty()) RmExecute(RmGetSkin(measure->rm), measure->trackChangeAction.c_str()); if (measure->type == MEASURE_STATUS) return player->GetStatus(); return 0.0; }
PLUGIN_EXPORT void Reload(void* data, void* rm, double* maxValue) { MeasureData* measure = (MeasureData*)data; LPCWSTR value = RmReadString(rm, L"DestAddress", L""); if (*value) { int strLen = (int)wcslen(value) + 1; int bufLen = WideCharToMultiByte(CP_ACP, 0, value, strLen, NULL, 0, NULL, NULL); if (bufLen > 0) { char* buffer = new char[bufLen]; WideCharToMultiByte(CP_ACP, 0, value, strLen, buffer, bufLen, NULL, NULL); measure->destAddr = inet_addr(buffer); if (measure->destAddr == INADDR_NONE) { WSADATA wsaData; if (WSAStartup(0x0101, &wsaData) == 0) { LPHOSTENT pHost = gethostbyname(buffer); if (pHost) { measure->destAddr = *(DWORD*)pHost->h_addr; } else { RmLog(LOG_WARNING, L"PingPlugin.dll: Unable to get host by name"); } WSACleanup(); } else { RmLog(LOG_WARNING, L"PingPlugin.dll: Unable to start WSA"); } } delete [] buffer; } } measure->updateRate = RmReadInt(rm, L"UpdateRate", 32); measure->timeout = RmReadInt(rm, L"Timeout", 30000); measure->timeoutValue = RmReadDouble(rm, L"TimeoutValue", 30000.0); measure->finishAction = RmReadString(rm, L"FinishAction", L"", false); measure->skin = RmGetSkin(rm); }
PLUGIN_EXPORT void Initialize(void** data, void* rm) { MeasureData* measure = new MeasureData; *data = measure; g_Measures.push_back(measure); measure->skin = RmGetSkin(rm); measure->rm = rm; if (g_InstanceCount == 0) { InitializeCriticalSection(&g_CriticalSection); FillCharacterEntityReferences(); SetupGlobalProxySetting(); } SetupProxySetting(measure->proxy, rm); // No support for DynamicVariables ++g_InstanceCount; }
PLUGIN_EXPORT void Initialize(void** data, void* rm) { RmLog(LOG_DEBUG, L"RainFbx.dll: Initialize"); FbxMeasureConf* measureConfig = new FbxMeasureConf; *data = measureConfig; void* skin = RmGetSkin(rm); LPCWSTR fbxAPIConf = RmReadString(rm, L"FbxAPIConf", L""); if (!*fbxAPIConf) { /* [FbxAPIConf] (parent) */ RmLog(LOG_DEBUG, L"RainFbx.dll: Reading [FbxAPIConf] (parent)"); measureConfig->fbxAPIConf = new FbxAPIConf; measureConfig->fbxAPIConf->section = RmGetMeasureName(rm); measureConfig->fbxAPIConf->skin = skin; measureConfig->fbxAPIConf->lastConfig = measureConfig; g_FbxAPIConfs.push_back(measureConfig->fbxAPIConf); fbx.app_token = RmReadString(rm, L"AppToken", L""); if(fbx.app_token == L"") writeAppToken = true; fbx.setHostname(RmReadString(rm, L"Hostname", L"")); } else { /* [FbxMeasureConf] (child) */ RmLog(LOG_DEBUG, L"RainFbx.dll: Reading [FbxMeasureConf] (child)"); // Find parent using name AND the skin handle to be sure that it's the right one std::vector<FbxAPIConf*>::const_iterator iter = g_FbxAPIConfs.begin(); for (; iter != g_FbxAPIConfs.end(); ++iter) { if ( ( (*iter)->section == fbxAPIConf ) && ( (*iter)->skin == skin ) ) { measureConfig->section = RmGetMeasureName(rm); measureConfig->fbxAPIConf = (*iter); return; } } RmLog(LOG_ERROR, L"RainFbx.dll: Invalid FbxAPIConf="); } }
PLUGIN_EXPORT void Reload(void* data, void* rm, double* maxValue) { Measure* measure = (Measure*)data; // Data is stored in two structs: Measure and ParentMeasure. ParentMeasure is created for measures // with PlayerName=someplayer. Measure is created for all measures and points to ParentMeasure as // referenced in PlayerName=[section]. // Read settings from the ini-file void* skin = RmGetSkin(rm); LPCWSTR str = RmReadString(rm, L"PlayerName", L"", FALSE); if (str[0] == L'[') { if (measure->parent) { // Don't let a measure measure change its parent } else { // PlayerName starts with [ so use referenced section ++str; size_t len = wcslen(str); if (len > 0 && str[len - 1] == L']') { --len; std::vector<ParentMeasure*>::iterator iter = g_ParentMeasures.begin(); for ( ; iter != g_ParentMeasures.end(); ++iter) { if (skin == (*iter)->skin && _wcsnicmp(str, (*iter)->ownerName, len) == 0) { // Use same ParentMeasure as referenced section measure->parent = (*iter); ++measure->parent->measureCount; break; } } if (!measure->parent) { // The referenced section doesn't exist std::wstring error = L"NowPlaying.dll: Invalid PlayerName="; error.append(str - 1, len + 2); error += L" in ["; error += RmGetMeasureName(rm); error += L"]"; RmLog(LOG_WARNING, error.c_str()); return; } } } } else { // ParentMeasure is created when PlayerName is an actual player (and not a reference) ParentMeasure* parent = measure->parent; Player* oldPlayer = nullptr; if (parent) { if (parent->data != data) { // Don't let a measure-only measure become a parent measure return; } oldPlayer = parent->player; } else { parent = new ParentMeasure; g_ParentMeasures.push_back(parent); parent->data = data; parent->skin = skin; parent->ownerName = RmGetMeasureName(rm); measure->parent = parent; } if (_wcsicmp(L"AIMP", str) == 0) { parent->player = PlayerAIMP::Create(); } else if (_wcsicmp(L"CAD", str) == 0) { parent->player = PlayerCAD::Create(); } else if (_wcsicmp(L"foobar2000", str) == 0) { HWND fooWindow = FindWindow(L"foo_rainmeter_class", nullptr); if (fooWindow) { const WCHAR* error = L"Your foobar2000 plugin is out of date.\n\nDo you want to update the plugin now?"; if (MessageBox(nullptr, error, L"Rainmeter", MB_YESNO | MB_ICONINFORMATION | MB_TOPMOST) == IDYES) { ShellExecute(nullptr, L"open", L"http://github.com/poiru/foo-cad#readme", nullptr, nullptr, SW_SHOWNORMAL); } } parent->player = PlayerCAD::Create(); } else if (_wcsicmp(L"iTunes", str) == 0) { parent->player = PlayerITunes::Create(); } else if (_wcsicmp(L"MediaMonkey", str) == 0) { parent->player = PlayerWinamp::Create(WA_MEDIAMONKEY); } else if (_wcsicmp(L"Spotify", str) == 0) { parent->player = PlayerSpotify::Create(); } else if (_wcsicmp(L"WinAmp", str) == 0) { parent->player = PlayerWinamp::Create(WA_WINAMP); } else if (_wcsicmp(L"WMP", str) == 0) { parent->player = PlayerWMP::Create(); } else { // Default to WLM parent->player = PlayerWLM::Create(); if (_wcsicmp(L"WLM", str) != 0) { std::wstring error = L"NowPlaying.dll: Invalid PlayerName="; error += str; error += L" in ["; error += parent->ownerName; error += L"]"; RmLog(LOG_ERROR, error.c_str()); } } parent->player->AddInstance(); parent->playerPath = RmReadString(rm, L"PlayerPath", L""); parent->trackChangeAction = RmReadString(rm, L"TrackChangeAction", L"", FALSE); parent->disableLeadingZero = RmReadInt(rm, L"DisableLeadingZero", 0) != 0; if (oldPlayer) { parent->player->SetMeasures(oldPlayer->GetMeasures()); // Remove instance here so that player doesn't have to reinitialize if PlayerName was // not changed. oldPlayer->RemoveInstance(); } } str = RmReadString(rm, L"PlayerType", L""); if (_wcsicmp(L"ARTIST", str) == 0) { measure->type = MEASURE_ARTIST; } else if (_wcsicmp(L"TITLE", str) == 0) { measure->type = MEASURE_TITLE; } else if (_wcsicmp(L"ALBUM", str) == 0) { measure->type = MEASURE_ALBUM; } else if (_wcsicmp(L"COVER", str) == 0) { measure->type = MEASURE_COVER; } else if (_wcsicmp(L"DURATION", str) == 0) { measure->type = MEASURE_DURATION; } else if (_wcsicmp(L"POSITION", str) == 0) { measure->type = MEASURE_POSITION; } else if (_wcsicmp(L"PROGRESS", str) == 0) { measure->type = MEASURE_PROGRESS; *maxValue = 100.0; } else if (_wcsicmp(L"RATING", str) == 0) { measure->type = MEASURE_RATING; *maxValue = 5.0; } else if (_wcsicmp(L"STATE", str) == 0) { measure->type = MEASURE_STATE; } else if (_wcsicmp(L"STATUS", str) == 0) { measure->type = MEASURE_STATUS; } else if (_wcsicmp(L"VOLUME", str) == 0) { measure->type = MEASURE_VOLUME; *maxValue = 100.0; } else if (_wcsicmp(L"SHUFFLE", str) == 0) { measure->type = MEASURE_SHUFFLE; } else if (_wcsicmp(L"REPEAT", str) == 0) { measure->type = MEASURE_REPEAT; } else if (_wcsicmp(L"LYRICS", str) == 0) { RmLog(LOG_WARNING, L"NowPlaying.dll: Using undocumented PlayerType=LYRICS!"); measure->type = MEASURE_LYRICS; } else if (_wcsicmp(L"FILE", str) == 0) { measure->type = MEASURE_FILE; } else if (_wcsicmp(L"NUMBER", str) == 0) { measure->type = MEASURE_NUMBER; } else if (_wcsicmp(L"YEAR", str) == 0) { measure->type = MEASURE_YEAR; } else { std::wstring error = L"NowPlaying.dll: Invalid PlayerType="; error += str; error += L" in ["; error += RmGetMeasureName(rm); error += L"]"; RmLog(LOG_WARNING, error.c_str()); } measure->parent->player->AddMeasure(measure->type); }