aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/skin/skin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/api/skin/skin.cpp')
-rw-r--r--Src/Wasabi/api/skin/skin.cpp812
1 files changed, 812 insertions, 0 deletions
diff --git a/Src/Wasabi/api/skin/skin.cpp b/Src/Wasabi/api/skin/skin.cpp
new file mode 100644
index 00000000..9348d4c9
--- /dev/null
+++ b/Src/Wasabi/api/skin/skin.cpp
@@ -0,0 +1,812 @@
+#include <precomp.h>
+#include <api.h>
+#include "skin.h"
+#include <api/skin/skinbmps.h>
+#include <tataki/canvas/bltcanvas.h>
+#include <api/wnd/basewnd.h>
+#include <tataki/bitmap/bitmap.h>
+#include <bfc/parse/pathparse.h>
+#include <bfc/file/readdir.h>
+//#include <api/wac/main.h> // CUT!!
+#include <api/skin/skinparse.h>
+#include <api/wac/compon.h>
+
+#ifdef WASABI_COMPILE_WNDMGR
+#include <api/wndmgr/skinembed.h>
+#endif
+
+#include <api/script/vcpu.h>
+#include <api/skin/skinelem.h>
+#include <api/application/wkc.h>
+#include <api/skin/gammamgr.h>
+#include <api/wnd/wndtrack.h>
+
+#ifdef WASABI_COMPILE_PAINTSETS
+#include <api/wnd/paintset.h>
+#endif
+
+#include <bfc/string/StringW.h>
+
+#ifdef WIN32
+#include "resource.h"
+#include "../Agave/Language/api_language.h"
+#endif
+
+// Version number has now a style of x.yz (same as gen_ff version)
+#define SKIN_LEGACY_VERSION 80.f // oldest supported is 0.8
+#define SKIN_VERSION 136.f // current version is 1.36
+
+Skin *tha = NULL;
+
+
+static wchar_t *loadSkinList = NULL, skName[64];
+
+Skin::Skin()
+{
+ if (deferedskinset == NULL)
+ {
+ deferedskinset = new SkinTimer();
+ }
+ base = NULL;
+ scaled = NULL;
+ scale_x = 0;
+ scale_y = 0;
+ validRgn = NULL;
+ resizing = FALSE;
+}
+
+Skin::~Skin()
+{
+ if (this == tha)
+ {
+ delete deferedskinset;
+ deferedskinset = NULL;
+ }
+ delete validRgn;
+ validRgn = NULL;
+ delete base;
+ delete scaled;
+ if (this == tha)
+ {
+ if (loadSkinList)
+ {
+ FREE(loadSkinList);
+ loadSkinList = NULL;
+ }
+ }
+}
+
+Skin *Skin::getCurSkin()
+{
+ return tha;
+}
+
+void Skin::setSkinName(const wchar_t *newskinname, const wchar_t *skinpath)
+{
+ if (newskinname)
+ skinName = newskinname;
+ else
+ skinName = WASABI_API_LNGSTRINGW_BUF(IDS_NO_SKIN_LOADED_,skName,64);
+
+ if (skinpath == NULL)
+ {
+ skinPath = WASABI_API_SKIN->getSkinsPath();
+ skinPath.AppendFolder(newskinname);
+ }
+ else
+ {
+ skinPath = skinpath;
+ skinPath.AddBackslash();
+ }
+}
+
+const wchar_t *Skin::getSkinName()
+{
+ return skinName.getValue();
+}
+
+const wchar_t *Skin::getSkinPath()
+{
+ return skinPath.getValue();
+}
+
+const wchar_t *Skin::getDefaultSkinPath()
+{
+ defSkinPath = WASABI_API_SKIN->getSkinsPath();
+ defSkinPath.AppendFolder(L"Default");
+ return defSkinPath;
+}
+
+void Skin::setBaseTexture(const wchar_t *b)
+{
+ if (b == NULL)
+ {
+ delete base;
+ base = NULL;
+ return ;
+ }
+ base = new AutoSkinBitmap();
+ base->setBitmap(b);
+}
+
+void Skin::rescaleBaseTexture(int w, int h)
+{
+ /* if (scaled != NULL && scale_x == w && scale_y == h)
+ return;
+ if ((resizing && (w > m_x || h > m_y)) || (!resizing && (w != m_x || h != m_y)))
+ {
+ delete scaled;
+ int lw = resizing ? maxw : w;
+ int lh = resizing ? maxh : h;
+ scaled = new BltCanvas(lw , lh);
+ m_x = lw; m_y = lh;
+ api_region *reg = new api_region(0,0,lw,lh);
+ scaled->selectClipRgn(reg);
+ delete reg;
+ lastw = w;
+ lasth = h;
+ }
+ // Empty valid region
+ if (validRgn)
+ validRgn->empty();
+ else
+ validRgn = new api_region();
+ scale_x = w;
+ scale_y = h;*/
+}
+
+void Skin::invalidateBaseTexture(Skin *s)
+{ //FG
+ if (!s) s = tha;
+ if (s) s->_invalidateBaseTexture();
+}
+
+void Skin::invalidateAllBaseTextures()
+{ //FG
+ tha->_invalidateBaseTexture();
+ for (int i = 0;i < skinList.getNumItems();i++)
+ {
+ Skin *s = skinList.enumItem(i);
+ s->_invalidateBaseTexture();
+ }
+}
+
+void Skin::unloadAllBaseTextures()
+{
+ if (tha) tha->_unloadBaseTexture();
+ for (int i = 0;i < skinList.getNumItems();i++)
+ {
+ Skin *s = skinList.enumItem(i);
+ s->_unloadBaseTexture();
+ }
+}
+
+void Skin::reloadAllBaseTextures()
+{
+ if (tha) tha->_reloadBaseTexture();
+ for (int i = 0;i < skinList.getNumItems();i++)
+ {
+ Skin *s = skinList.enumItem(i);
+ s->_reloadBaseTexture();
+ }
+ invalidateAllBaseTextures();
+}
+
+void Skin::_unloadBaseTexture()
+{
+ if (base)
+ base->reset();
+}
+
+void Skin::_reloadBaseTexture()
+{
+ if (!tha) return ;
+
+ if (base)
+ base->reload();
+}
+
+void Skin::_invalidateBaseTexture(void)
+{ //FG
+ if (validRgn)
+ validRgn->empty();
+}
+
+void Skin::registerBaseSkin(Skin *s, ifc_window *b)
+{
+ skinList.addItem(s);
+ baseList.addItem(b);
+}
+
+Skin *Skin::unregisterBaseSkin(ifc_window *b)
+{
+ for (int i = 0;i < baseList.getNumItems();i++)
+ {
+ if (baseList.enumItem(i) == b)
+ {
+ Skin *s = skinList.enumItem(i);
+ baseList.delByPos(i);
+ skinList.delByPos(i);
+ if (baseList.getNumItems() == 0)
+ baseList.removeAll();
+ if (skinList.getNumItems() == 0)
+ skinList.removeAll();
+ return s;
+ }
+ }
+ return NULL;
+}
+
+Skin *Skin::baseToSkin(ifc_window *b)
+{
+ if (b == NULL) return NULL;
+ for (int i = 0;i < baseList.getNumItems();i++)
+ if (baseList.enumItem(i) == b)
+ return skinList.enumItem(i);
+ return NULL;
+}
+
+void Skin::renderBaseTexture(ifc_window *base, ifc_canvas *c, const RECT &r, ifc_window *dest, int alpha)
+{
+ renderBaseTexture(base, baseToSkin(base), c, r, dest, alpha);
+}
+
+void Skin::renderBaseTexture(ifc_window *base, Skin *s, ifc_canvas *c, const RECT &r, ifc_window *dest, int alpha)
+{
+ ASSERT(tha != NULL);
+ if (!s)
+ {
+ DebugStringW(L"Warning, base texture from main wnd?!\n");
+ s = tha;
+ }
+
+ s->_renderBaseTexture(base, c, r, dest, alpha);
+}
+
+void Skin::validateBaseTextureRect(RECT *r)
+{
+ /* if (!base) {
+ ASSERT(!(tha && this == tha));
+ if (origbase)
+ base = new SkinBitmap(origbase, origbase->getWidth(), origbase->getHeight());
+ else
+ base = new SkinBitmap(tha->base, tha->base->getWidth(), tha->base->getHeight());
+ if (!base) return;
+ }
+
+ // make a region with the rect we have to draw
+ api_region *newregion = new api_region(r);
+
+ // check if newregion is enclosed in validRgn, put whatever is outside back into newregion
+ if (newregion->enclosed(validRgn, newregion)) {
+ delete newregion;
+ return;
+ }
+ // compute projected coordinates
+ RECT destRect, srcRect;
+ newregion->getRgnBox(&destRect);
+ srcRect.left = (int)(((float)destRect.left / scale_x) * base->getWidth());
+ srcRect.right = (int)(((float)destRect.right / scale_x) * base->getWidth());
+ srcRect.top = (int)(((float)destRect.top / scale_y) * base->getHeight());
+ srcRect.bottom = (int)(((float)destRect.bottom / scale_y) * base->getHeight());
+
+ // stretch the relevant portion of the image
+ base->stretchRectToRect(scaled, &srcRect, &destRect);
+
+ #if 0 //FG> debug purpose
+ HDC dc = GetDC(NULL);
+ BitBlt(dc, 0, 0, scale_x, scale_y, scaled->getHDC(), 0, 0, SRCCOPY);
+ ReleaseDC(NULL, dc);
+ #endif
+
+ // add this region to the valid region
+ validRgn->add(newregion);
+ delete newregion;*/
+}
+
+#define SAFEROUND(d) ((float)(int)d == d) ? (int)d : (d - (float)(int)d > 0) ? ((int)d)+1 : ((int)d)-1
+
+// FG> Please change this only if you REALLY know what you are doing. this needs to account for basewnd
+// coordinates (start from 0,0), as well as virtualwnd (relative to parent), at any depth (group holding
+// texture as 2nd group of the tree, and rendering the base texture in a basewnd in a virtual in the group),
+// and should handle resized textures and scaled windows. ooch
+
+void Skin::_renderBaseTexture(ifc_window *wndbase, ifc_canvas *c, const RECT &r, ifc_window *dest, int alpha)
+{
+ // pick our basetexture
+ AutoSkinBitmap *b = base ? base : tha->base;
+
+ if (!b) return ;
+
+ // srcRect is the source rectangle in the basetexture
+ RECT srcRect;
+ // destProjectedRect is the basetexture rectangle projected to dest coordinates
+ RECT destProjectedRect;
+
+ ifc_window *p = dest;
+ POINT pt;
+ int sx = 0, sy = 0;
+ while (p && p != wndbase)
+ {
+ if (!p->isVirtual())
+ {
+ p->getPosition(&pt);
+ sx += pt.x;
+ sy += pt.y;
+ }
+ p = p->getParent();
+ }
+ ASSERT(p);
+
+ wndbase->getNonClientRect(&destProjectedRect);
+ destProjectedRect.left -= sx;
+ destProjectedRect.top -= sy;
+ destProjectedRect.right -= sx;
+ destProjectedRect.bottom -= sy;
+
+ srcRect.left = 0;
+ srcRect.top = 0;
+ srcRect.right = b->getBitmap()->getWidth();
+ srcRect.bottom = b->getBitmap()->getHeight();
+
+#if 0//CUT
+ // NONPORTABLE
+ HDC hdc = c->getHDC();
+ HRGN oldRgn = CreateRectRgn(0, 0, 0, 0);
+ HRGN newRgn = CreateRectRgnIndirect(&r);
+
+ int cs = GetClipRgn(hdc, oldRgn);
+
+ ExtSelectClipRgn(hdc, newRgn, (cs != 1) ? RGN_COPY : RGN_AND);
+
+ b->getBitmap()->stretchToRectAlpha(c, &srcRect, &destProjectedRect, alpha);
+
+ SelectClipRgn(hdc, cs ? oldRgn : NULL);
+
+ DeleteObject(oldRgn);
+ DeleteObject(newRgn);
+#endif
+ BaseCloneCanvas clone(c);
+ RegionI oldRgn, newRgn(&r);
+#ifdef _WIN32
+ int cs = clone.getClipRgn(&oldRgn);
+ if (cs) newRgn.andRegion(&oldRgn);
+ clone.selectClipRgn(&newRgn);
+ b->getBitmap()->stretchToRectAlpha(&clone, &srcRect, &destProjectedRect, alpha);
+ clone.selectClipRgn(cs ? &oldRgn : NULL);
+#else
+#warning port me
+ b->getBitmap()->stretchToRectAlpha(&clone, &srcRect, &destProjectedRect, alpha);
+#endif
+}
+
+wchar_t *Skin::enumLoadableSkins(int refresh)
+{
+ static size_t loadSkinListSize = 1024;
+
+ if (loadSkinList)
+ {
+ if (!refresh)
+ return loadSkinList;
+ FREE(loadSkinList);
+ }
+
+ loadSkinList = WMALLOC(loadSkinListSize);
+ loadSkinList[0] = 0;
+
+ int first = 1;
+ ReadDir skins(L"skins");
+
+ while (skins.next())
+ {
+ const wchar_t *filename = skins.getFilename();
+
+ wchar_t *ext = const_cast<wchar_t *>(Wasabi::Std::extension(filename));
+
+ if (skins.isDir() || !WCSICMP(ext, L"wal") ||
+ !WCSICMP(ext, L"wsz") || !WCSICMP(ext, L"zip"))
+ {
+ if (!skins.isDotDir() && !skins.isDotDotDir())
+ {
+ if (!skins.isDir() )
+ {
+ if (ext && *ext) *(ext - 1) = 0;
+ }
+
+ // check loadSkinList size
+ if ((wcslen(loadSkinList) + wcslen(filename) + 2) > loadSkinListSize)
+ {
+ loadSkinListSize *= 2;
+ loadSkinList = (wchar_t *)REALLOC(loadSkinList, sizeof(wchar_t) * loadSkinListSize);
+ }
+
+ if (!first)
+ wcscat(loadSkinList, L"/");
+ wcscat(loadSkinList, filename);
+ first = 0;
+ }
+ }
+ }
+
+ return loadSkinList;
+}
+
+int Skin::loadSkinPart(const wchar_t *xmlfile)
+{
+#ifdef WASABI_COMPILE_COMPONENTS
+ WasabiKernelController *wkc = Main::getKernelController();
+ if (wkc && !wkc->testSkinFile(xmlfile)) return -1;
+#endif
+
+ int id = WASABI_API_PALETTE->newSkinPart();
+ SkinElementsMgr::onBeforeLoadingScriptElements(xmlfile, id);
+ SkinParser::loadScriptXml(xmlfile, id);
+ SkinElementsMgr::onAfterLoadingScriptElements();
+#ifdef WASABI_COMPILE_WNDMGR
+ SkinParser::startupContainers(id);
+#endif
+ return id;
+}
+
+void Skin::unloadSkinPart(int skinpartid)
+{
+ SkinElementsMgr::unloadScriptElements(skinpartid);
+ SkinParser::cleanupScript(skinpartid);
+}
+
+int Skin::checkSkin(const wchar_t *skinname)
+{
+ OSFILETYPE fh = WFOPEN(StringPathCombine(WASABI_API_SKIN->getSkinPath(), L"skin.xml"), WF_READONLY_BINARY);
+ if (fh != OPEN_FAILED)
+ {
+ FCLOSE(fh);
+ // ok it's a wa3 skin, now check the skin version number in the xml file
+ SkinVersionXmlReader r(skinname);
+ if (!r.getWalVersion()) return CHKSKIN_ISWA3OLD;
+ #ifndef LC_NUMERIC
+ #define LC_NUMERIC 4
+ #endif
+ float v = (float)(WTOF(r.getWalVersion()) * 100); // Since wa5.51 we will do a check for x.yz style
+ if (v < (SKIN_LEGACY_VERSION-0.5f)) return CHKSKIN_ISWA3OLD;
+ if (v > (SKIN_VERSION+0.5f)) return CHKSKIN_ISWA3FUTURE;
+ return CHKSKIN_ISWA3;
+ }
+ fh = WFOPEN(StringPathCombine(WASABI_API_SKIN->getSkinPath(), L"Main.bmp"), WF_READONLY_BINARY);
+ if (fh != OPEN_FAILED)
+ {
+ FCLOSE(fh);
+ return CHKSKIN_ISWA2;
+ }
+ return CHKSKIN_UNKNOWN;
+}
+
+void Skin::toggleSkin(const wchar_t *skin_name, const wchar_t *skin_path, int deferred)
+{
+ StringW skinName = skin_name;
+
+ if (sendAbortCallback(skinName)) return ;
+
+ enable_group_reload = 0;
+
+ StringW oldSkinPath = skinPath;
+ char title[32] = {0};
+ setSkinName(skinName, skin_path);
+ int skinType = checkSkin(skinName);
+ skinPath = oldSkinPath;
+
+#ifdef WASABI_COMPILE_COMPONENTS
+ WasabiKernelController *wkc = Main::getKernelController();
+ if (wkc && !wkc->testSkin(skinName)) skinType = CHKSKIN_DISALLOWED;
+#endif
+
+ switch (skinType)
+ {
+ case CHKSKIN_ISWA3OLD:
+ {
+#ifdef WIN32
+ WASABI_API_WND->appdeactivation_setbypass(1);
+ int ret = MessageBoxA(GetActiveWindow(), WASABI_API_LNGSTRING(IDS_SKIN_LOAD_FORMAT_OLD),
+ WASABI_API_LNGSTRING_BUF(IDS_SKIN_LOAD_WARNING,title,32),
+ MB_ICONWARNING | MB_YESNO);
+ WASABI_API_WND->appdeactivation_setbypass(0);
+ if (ret == IDNO) return ;
+#else
+ DebugString( "The skin you are trying to load is meant for an older Winamp3 version.\n" );
+#endif
+ break;
+ }
+ case CHKSKIN_ISWA3FUTURE:
+ {
+#ifdef WIN32
+ WASABI_API_WND->appdeactivation_setbypass(1);
+ int ret = MessageBoxA(GetActiveWindow(), WASABI_API_LNGSTRING(IDS_SKIN_LOAD_FORMAT_TOO_RECENT),
+ WASABI_API_LNGSTRING_BUF(IDS_SKIN_LOAD_WARNING,title,32),
+ MB_ICONWARNING | MB_YESNO);
+ WASABI_API_WND->appdeactivation_setbypass(0);
+ if (ret == IDNO) return ;
+#else
+ DebugString( "The skin you are trying to load is meant for an older Winamp3 version.\n" );
+#endif
+ break;
+ }
+ case CHKSKIN_UNKNOWN:
+#ifdef WIN32
+ WASABI_API_WND->appdeactivation_setbypass(1);
+ MessageBoxA(GetActiveWindow(), WASABI_API_LNGSTRING(IDS_SKIN_LOAD_NOT_SUPPORTED),
+ WASABI_API_LNGSTRING_BUF(IDS_ERROR,title,32), MB_ICONERROR);
+ WASABI_API_WND->appdeactivation_setbypass(0);
+#else
+ DebugString( "The skin you are trying to load is meant for an older Winamp3 version.\n" );
+#endif
+ return ;
+
+ case CHKSKIN_DISALLOWED:
+
+ // kernel controller should output its own error message
+
+ return ;
+
+ case CHKSKIN_ISWA2: break;
+ }
+
+ WASABI_API_COLORTHEMES->StartTransaction();
+ if (skin_loaded)
+ {
+ sendUnloadingCallback();
+ }
+
+ loading = 1;
+
+ if (skin_loaded)
+ {
+ //ComponentManager::detachAllTemporary();
+ //ComponentManager::destroyAllCompContainer();
+
+#ifdef WASABI_COMPILE_WNDMGR
+ #ifdef WASABI_COMPILE_CONFIG
+ #ifndef WASABI_WNDMGR_NORESPAWN
+ skinEmbedder->saveState();
+#endif
+ #endif
+ #endif
+
+ // unload current skin
+ SkinParser::cleanUp();
+
+ delete(tha);
+ tha = NULL;
+ //delete(VCPU::scriptManager);
+
+ unloadResources();
+
+ // TODO: benski> unload WAC files inside skin.
+ // we should have saved a list of WacComponent * when loading
+ // add a new method ComponentManager::unload(WacComponent *);
+
+ Skin::sendResetCallback();
+
+ // VCPU::scriptManager = new ScriptObjectManager();
+ Skin *n = new Skin;
+ tha = n;
+ }
+
+ setSkinName(skinName, skin_path);
+
+ if (skin_loaded)
+ {
+ SkinElementsMgr::resetSkinElements();
+ //SkinElementsMgr::loadSkinElements(skinName); // only loads element definitions, not actual bitmaps
+
+ sendReloadCallback();
+
+ reloadResources();
+ }
+
+ // TODO: benski> load WAC files inside skin. save list of WacComponent * to a list to unload later
+ // make ComponentManager::load() return the WacComponent to allow this
+
+#ifdef WASABI_COMPILE_WNDMGR
+ int ncont = SkinParser::loadContainers(skinName); //sends guiloaded cb
+#endif
+
+ GammaMgr::loadDefault();
+
+#ifdef WASABI_COMPILE_WNDMGR
+ SkinParser::startupContainers();
+#ifdef WASABI_COMPILE_CONFIG
+#ifndef WASABI_WNDMGR_NORESPAWN
+ skinEmbedder->restoreSavedState();
+#endif
+#endif
+#endif
+
+ enable_group_reload = 1;
+
+ sendLoadedCallback();
+
+#ifdef WASABI_COMPILE_WNDMGR
+ SkinParser::centerSkin();
+#endif
+
+ loading = 0;
+
+#ifdef WASABI_COMPILE_WNDMGR
+#ifdef WA3COMPATIBILITY
+ if (ncont == 0)
+ SkinParser::emmergencyReloadDefaultSkin();
+#endif
+#endif
+ skin_loaded = 1;
+ WASABI_API_COLORTHEMES->EndTransaction();
+}
+
+void Skin::unloadSkin()
+{
+ if (!skin_loaded) return ;
+
+ sendUnloadingCallback();
+
+ loading = -1;
+
+#ifdef WASABI_COMPILE_WNDMGR
+ #ifdef WASABI_COMPILE_CONFIG
+ #ifndef WASABI_WNDMGR_NORESPAWN
+ skinEmbedder->saveState();
+#endif
+ #endif
+ #endif
+
+ // unload current skin
+ SkinParser::cleanUp();
+
+ delete(tha);
+ tha = NULL;
+ //delete(VCPU::scriptManager);
+
+ unloadResources();
+
+ Skin::sendResetCallback();
+
+ // VCPU::scriptManager = new ScriptObjectManager();
+ Skin *n = new Skin;
+ tha = n;
+
+ setSkinName(WASABI_API_LNGSTRINGW_BUF(IDS_NO_SKIN_LOADED_,skName,64));
+
+ SkinElementsMgr::resetSkinElements();
+ //SkinElementsMgr::loadSkinElements(skinName); // only loads element definitions, not actual bitmaps
+
+ sendReloadCallback();
+
+ reloadResources();
+ loading = 0;
+ skin_loaded = 0;
+}
+
+void Skin::sendUnloadingCallback()
+{
+#if defined(WASABI_COMPILE_COMPONENTS) | defined(GEN_FF) // MULTIAPI-FIXME!!
+ ComponentManager::broadcastNotify(WAC_NOTIFY_SKINUNLOADING, WASABI_API_PALETTE->getSkinPartIterator());
+#endif
+ WASABI_API_SYSCB->syscb_issueCallback(SysCallback::SKINCB, SkinCallback::UNLOADING);
+}
+
+int Skin::sendAbortCallback(const wchar_t *skinname)
+{
+ int a = 0;
+ WASABI_API_SYSCB->syscb_issueCallback(SysCallback::SKINCB, SkinCallback::CHECKPREVENTSWITCH, (intptr_t)skinname, (intptr_t)&a);
+ return a;
+}
+
+void Skin::sendResetCallback()
+{
+ WASABI_API_SYSCB->syscb_issueCallback(SysCallback::SKINCB, SkinCallback::RESET);
+}
+
+void Skin::sendReloadCallback()
+{
+#if defined(WASABI_COMPILE_COMPONENTS) | defined(GEN_FF) // MULTIAPI-FIXME!!
+ ComponentManager::broadcastNotify(WAC_NOTIFY_SWITCHINGSKIN, WASABI_API_PALETTE->getSkinPartIterator()); // this msg primilarily here to insert stuff between unloading of the old skin and reloading of the new one
+#endif
+ WASABI_API_SYSCB->syscb_issueCallback(SysCallback::SKINCB, SkinCallback::RELOAD);
+}
+
+void Skin::sendBeforeLoadingElementsCallback()
+{
+#if defined(WASABI_COMPILE_COMPONENTS) | defined(GEN_FF) // MULTIAPI-FIXME!!
+ ComponentManager::broadcastNotify(WAC_NOTIFY_BEFORELOADINGSKINELEMENTS, WASABI_API_PALETTE->getSkinPartIterator()); // this msg primilarily here to insert stuff between unloading of the old skin and reloading of the new one
+#endif
+ WASABI_API_SYSCB->syscb_issueCallback(SysCallback::SKINCB, SkinCallback::BEFORELOADINGELEMENTS);
+}
+
+void Skin::sendGuiLoadedCallback()
+{
+ WASABI_API_SYSCB->syscb_issueCallback(SysCallback::SKINCB, SkinCallback::GUILOADED);
+}
+
+void Skin::sendLoadedCallback()
+{
+#if defined(WASABI_COMPILE_COMPONENTS) | defined(GEN_FF) // MULTIAPI-FIXME!!
+ ComponentManager::broadcastNotify(WAC_NOTIFY_SKINLOADED, WASABI_API_PALETTE->getSkinPartIterator());
+#endif
+ WASABI_API_SYSCB->syscb_issueCallback(SysCallback::SKINCB, SkinCallback::LOADED);
+}
+
+void Skin::setSkinReady(int i)
+{
+ loading = !i;
+}
+
+void Skin::main_notifySkinLoaded()
+{
+ skin_loaded = 1;
+}
+
+int Skin::isSkinReady()
+{
+ return !loading;
+}
+
+int Skin::unloadResources()
+{
+ if (windowTracker)
+ {
+ for (int i = 0;i < windowTracker->getNumAllWindows();i++)
+ {
+ ifc_window *w = windowTracker->enumAllWindows(i);
+#ifdef _WIN32
+ if (w) w->wndProc(w->gethWnd(), WM_WA_RELOAD, 0, 0);
+#else
+#warning port me
+#endif
+ }
+ Skin::unloadAllBaseTextures();
+#ifdef WASABI_COMPILE_PAINTSETS
+ paintset_reset();
+#endif
+
+ }
+
+ sendResetCallback();
+
+ return 1;
+}
+
+int Skin::reloadResources()
+{
+ if (windowTracker)
+ {
+ for (int i = 0;i < windowTracker->getNumAllWindows();i++)
+ {
+ ifc_window *w = windowTracker->enumAllWindows(i);
+#ifdef _WIN32
+ if (w) w->wndProc(w->gethWnd(), WM_WA_RELOAD, 1, 0);
+#else
+#warning port me
+#endif
+ }
+ Skin::reloadAllBaseTextures();
+ }
+
+ sendReloadCallback();
+
+ return 1;
+}
+
+bool Skin::isLoaded()
+{
+ return !!skin_loaded;
+}
+
+PtrList<Skin> Skin::skinList;
+PtrList<ifc_window> Skin::baseList;
+StringW Skin::skinName;
+StringW Skin::skinPath;
+int Skin::isDefaultSkin = 0;
+int Skin::loading = 0;
+int Skin::highest_id = 0;
+int Skin::reloadingskin = 0;
+int Skin::enable_group_reload = 0;
+StringW Skin::defSkinPath;
+SkinTimer *Skin::deferedskinset = NULL;
+int Skin::skin_loaded = 0; \ No newline at end of file