//@{ void* Interface_GUIWindow::create(void* kodiBase, const char* xml_filename, const char* default_skin, bool as_dialog, bool is_media) { CAddonDll* addon = static_cast<CAddonDll*>(kodiBase); if (!addon || !xml_filename || !default_skin) { CLog::Log(LOGERROR, "Interface_GUIWindow::%s - invalid handler data (xml_filename='%p', default_skin='%p') on addon '%s'", __FUNCTION__, xml_filename, default_skin, addon ? addon->ID().c_str() : "unknown"); return nullptr; } if (as_dialog && is_media) { CLog::Log(LOGWARNING, "Interface_GUIWindow::%s: %s/%s - addon tries to create dialog as media window who not allowed, contact Developer '%s' of this addon", __FUNCTION__, CAddonInfo::TranslateType(addon->Type()).c_str(), addon->Name().c_str(), addon->Author().c_str()); } RESOLUTION_INFO res; std::string strSkinPath = g_SkinInfo->GetSkinPath(xml_filename, &res); if (!XFILE::CFile::Exists(strSkinPath)) { std::string str("none"); ADDON::CAddonInfo addonInfo(str, ADDON::ADDON_SKIN); // Check for the matching folder for the skin in the fallback skins folder std::string fallbackPath = URIUtils::AddFileToFolder(addon->Path(), "resources", "skins"); std::string basePath = URIUtils::AddFileToFolder(fallbackPath, g_SkinInfo->ID()); strSkinPath = g_SkinInfo->GetSkinPath(xml_filename, &res, basePath); // Check for the matching folder for the skin in the fallback skins folder (if it exists) if (XFILE::CFile::Exists(basePath)) { addonInfo.SetPath(basePath); ADDON::CSkinInfo skinInfo(addonInfo, res); skinInfo.Start(); strSkinPath = skinInfo.GetSkinPath(xml_filename, &res); } if (!XFILE::CFile::Exists(strSkinPath)) { // Finally fallback to the DefaultSkin as it didn't exist in either the Kodi Skin folder or the fallback skin folder addonInfo.SetPath(URIUtils::AddFileToFolder(fallbackPath, default_skin)); ADDON::CSkinInfo skinInfo(addonInfo, res); skinInfo.Start(); strSkinPath = skinInfo.GetSkinPath(xml_filename, &res); if (!XFILE::CFile::Exists(strSkinPath)) { CLog::Log(LOGERROR, "Interface_GUIWindow::%s: %s/%s - XML File '%s' for Window is missing, contact Developer '%s' of this addon", __FUNCTION__, CAddonInfo::TranslateType(addon->Type()).c_str(), addon->Name().c_str(), strSkinPath.c_str(), addon->Author().c_str()); return nullptr; } } } int id = GetNextAvailableWindowId(); if (id < 0) return nullptr; CGUIWindow *window; if (!as_dialog) window = new CGUIAddonWindow(id, strSkinPath, addon, is_media); else window = new CGUIAddonWindowDialog(id, strSkinPath, addon); Interface_GUIGeneral::lock(); g_windowManager.Add(window); Interface_GUIGeneral::unlock(); if (!dynamic_cast<CGUIWindow*>(g_windowManager.GetWindow(id))) { CLog::Log(LOGERROR, "Interface_GUIWindow::%s - Requested window id '%i' does not exist for addon '%s'", __FUNCTION__, id, addon->ID().c_str()); delete window; return nullptr; } window->SetCoordsRes(res); return window; }