diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Wasabi/api/script/objects/compoobj.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/Wasabi/api/script/objects/compoobj.cpp')
-rw-r--r-- | Src/Wasabi/api/script/objects/compoobj.cpp | 361 |
1 files changed, 361 insertions, 0 deletions
diff --git a/Src/Wasabi/api/script/objects/compoobj.cpp b/Src/Wasabi/api/script/objects/compoobj.cpp new file mode 100644 index 00000000..7b7ba8bb --- /dev/null +++ b/Src/Wasabi/api/script/objects/compoobj.cpp @@ -0,0 +1,361 @@ +#include "precomp.h" +#ifndef _NOSTUDIO + +#include "../../common/std.h" +#include "script.h" +#include "scriptmgr.h" +#include "../../common/script/scriptobj.h" +#include "compoobj.h" +#include "../api.h" +#include "vcpu.h" +#include "../smap.h" +#include "sregion.h" +#include "../skinparse.h" +#include "../compon.h" +#include "../compwnd.h" +#include "../cbmgr.h" +#include "../smap.h" +#include "../../common/wndcb.h" + +#else +#include "compoobj.h" +#endif + +CompoObjScriptController _compoController; +CompoObjScriptController *compoController=&_compoController; + +// -- Functions table ------------------------------------- +function_descriptor_struct CompoObjScriptController::exportedFunction[] = { + {"getGUID", 1, (void*)ComponentObject::script_vcpu_getGUID }, + {"getWac", 0, (void*)ComponentObject::script_vcpu_getWac }, + {"setRegionFromMap", 3, (void*)ComponentObject::script_vcpu_setRegionFromMap }, + {"setRegion", 1, (void*)ComponentObject::script_vcpu_setRegion }, + {"onGetWac", 1, (void*)ComponentObject::script_vcpu_onGetWac }, + {"onGiveUpWac", 1, (void*)ComponentObject::script_vcpu_onGiveUpWac }, + {"setAcceptWac", 1, (void*)ComponentObject::script_vcpu_setAcceptWac }, +}; +// -------------------------------------------------------- + +const char *CompoObjScriptController::getClassName() { + return "Component"; +} + +const wchar_t *CompoObjScriptController::getAncestorClassName() { + return "GuiObject"; +} + +int CompoObjScriptController::getNumFunctions() { + return sizeof(exportedFunction) / sizeof(function_descriptor_struct); +} + +const function_descriptor_struct *CompoObjScriptController::getExportedFunctions() { + return exportedFunction; +} + +GUID CompoObjScriptController::getClassGuid() { + return componentObjectGuid; +} + +ScriptObject *CompoObjScriptController::instantiate() { + ComponentObject *obj = new ComponentObject(); + return obj->getScriptObject(); +} + +void CompoObjScriptController::destroy(ScriptObject *o) { + ComponentObject *obj = static_cast<ComponentObject *>(o->vcpu_getInterface(componentObjectGuid)); + ASSERT(obj != NULL); + delete obj; +} + +void *CompoObjScriptController::encapsulate(ScriptObject *o) { + return NULL; // no encapsulation for componentobject yet +} + +void CompoObjScriptController::deencapsulate(void *) { +} + + +ComponentObject::ComponentObject() { + getScriptObject()->vcpu_setInterface(componentObjectGuid, (void *)static_cast<ComponentObject *>(this)); + getScriptObject()->vcpu_setClassName("Component"); + getScriptObject()->vcpu_setController(compoController); + deleting = 0; + compwnd = NULL; + noshowcmdbar = 0; + noshowbtnbar = 0; + MEMCPY(&myGUID, &INVALID_GUID, sizeof(GUID)); + MEMCPY(&myCompGuid, &INVALID_GUID, sizeof(GUID)); + my_region_clone = NULL; + ComponentManager::registerComponentObject(this); + autoopen = 0; + autoclose = 0; + accept = 1; + denyDesktopAlpha = 0; + denyTransparency = 0; + noanimrects = 0; +} + +int ComponentObject::setXmlParam(const char *name, const char *value) { + if (COMPONENTOBJECT_PARENT::setXmlParam(name, value)) return 1; + else if (STRCASEEQL(name, "param")) { + GUID *g; + g = SkinParser::getComponentGuid(value); + if (g) + setGUID(*g); + } else if (STRCASEEQL(name, "noshowcmdbar")) { + noshowcmdbar = WTOI(value); + } else if (STRCASEEQL(name, "autoopen")) { + autoopen = WTOI(value); + } else if (STRCASEEQL(name, "autoclose")) { + autoclose = WTOI(value); + } else if (STRCASEEQL(name, "disableanimatedrects")) { + noanimrects = WTOI(value); + } else return 0; + return 1; +} + +ComponentObject::~ComponentObject() { + deleting = 1; + ComponentManager::unregisterComponentObject(this, 1); + delete my_region_clone; +} + +int ComponentObject::onResize() { + COMPONENTOBJECT_PARENT::onResize(); + RECT r = clientRect(); + if (compwnd) { + compwnd->resize(&r); + } + return 1; +} + +int ComponentObject::handleRatio() { + return compwnd ? compwnd->handleRatio() : 0; +} + +void ComponentObject::setGUID(GUID g) { + myGUID = g; +} + +void ComponentObject::setCompGUID(GUID g) { + myCompGuid = g; +} + +GUID ComponentObject::getGUID(void) { + if (!MEMCMP(&myCompGuid, &INVALID_GUID, sizeof(GUID))) + return myGUID; + else + return myCompGuid; +} + +void ComponentObject::script_resetRegion() { + HWND h = ComponentManager::getComponentHWnd(myGUID); + if (h) SetWindowRgn(h, NULL, TRUE); + delete my_region_clone; + my_region_clone = NULL; +} + +void ComponentObject::script_setRegionFromMap(SMap *map, int byte, int inv) { + RECT r={map->getBitmap()->getX(), map->getBitmap()->getY(), map->getBitmap()->getWidth(), map->getBitmap()->getHeight()}; + api_region *reg = new api_region(map->getBitmap(), &r, 0, 0, FALSE, 1, (unsigned char)byte, inv); + if (!reg) { script_resetRegion(); return; } + delete my_region_clone; + my_region_clone = new api_region(); + my_region_clone->add(reg); + delete reg; + HWND h = ComponentManager::getComponentHWnd(myGUID); + if (h) { + api_region *clone = my_region_clone->clone(); + clone->scale(getRenderRatio()); + SetWindowRgn(h, clone->makeWindowRegion(), TRUE); + my_region_clone->disposeClone(clone); + } +} + +void ComponentObject::script_setRegion(SRegion *r) { + api_region *reg = r->getRegion(); + if (!reg) { script_resetRegion(); return; } + delete my_region_clone; + my_region_clone = new api_region(); + my_region_clone->add(reg); + HWND h = ComponentManager::getComponentHWnd(myGUID); + if (h) { + api_region *clone = my_region_clone->clone(); + clone->scale(getRenderRatio()); + SetWindowRgn(h, clone->makeWindowRegion(), TRUE); + my_region_clone->disposeClone(clone); + } +} + +void ComponentObject::onSetVisible(int s) { + COMPONENTOBJECT_PARENT::onSetVisible(s); + if (compwnd) { + compwnd->setVisible(s); + onResize(); + } else { + if (s && autoopen && myGUID != INVALID_GUID && myGUID != GENERIC_GUID) + api->setComponentVisible(myGUID, 1); + } +} + +void ComponentObject::deniedComponentCompWnd(CompWnd *c, GUID g) { + if (!deleting) { + Container *_c = getGuiObject()->guiobject_getParentGroup()->getParentContainer(); + if (_c) _c->resetGUID(); + } + compwnd = c; + compwnd->suppressStatusBar(noshowcmdbar); + + CallbackManager::issueCallback(SysCallback::WINDOW, WndCallback::HIDEWINDOW, reinterpret_cast<int>((int *)&g)); + + onReleaseComponent(); + compwnd = NULL; + denyDesktopAlpha = 0; + denyTransparency = 0; + if (!deleting) getGuiObject()->guiobject_getParentLayout()->onGuiObjectSetVisible(getGuiObject(), 0); +} + +void ComponentObject::grantedComponentCompWnd(CompWnd *c, GUID g) { + Container *_c = getGuiObject()->guiobject_getParentGroup()->getParentContainer(); + if (_c) _c->setGUID(g); // tells the container to change its script_id to id:{guid} + compwnd = c; + compwnd->suppressStatusBar(noshowcmdbar); + + onResize(); + + if (isVisible()) + c->setVisible(1); + + CallbackManager::issueCallback(SysCallback::WINDOW, WndCallback::SHOWWINDOW, reinterpret_cast<int>((int *)&g)); + + onGetComponent(g); +} + +void ComponentObject::onReleaseComponent() { + HWND h = ComponentManager::getComponentHWnd(myGUID); + SetWindowRgn(h, NULL, FALSE); +} + +void ComponentObject::onGetComponent(GUID g) { + HWND h = ComponentManager::getComponentHWnd(myGUID); + if (h) { + if (my_region_clone) { + api_region *clone = my_region_clone->clone(); + clone->scale(getRenderRatio()); + SetWindowRgn(h, clone->makeWindowRegion(), TRUE); + my_region_clone->disposeClone(clone); + } else + SetWindowRgn(h, NULL, FALSE); + } +} + +int ComponentObject::wantGUID(GUID *g) { + if (!accept || !getGuiObject()->guiobject_getParentGroup()) return 0; + Container *_c = getGuiObject()->guiobject_getParentGroup()->getParentContainer(); + if (_c && _c->isDynamic() && compwnd) return 0; + if (!MEMCMP(&myGUID, &GENERIC_GUID, sizeof(GUID))) return 1; + return !MEMCMP(&myGUID, g, sizeof(GUID)); +} + +void ComponentObject::onBeforeGetWac(GUID g, CompWnd *c) { +// if (!Std::isXPOrGreater()) + if (!c->handleDesktopAlpha()) + denyDesktopAlpha = 1; + if (!c->handleTransparency()) + denyTransparency = 1; + getGuiObject()->guiobject_getParentLayout()->onGuiObjectSetVisible(getGuiObject(), 1); + WACObject *wo = SOM::getWACObject(g); + script_vcpu_onGetWac(SCRIPT_CALL, getScriptObject(), MAKE_SCRIPT_OBJECT(wo ? wo->getScriptObject() : NULL)); +} + +void ComponentObject::onBeforeGiveUpWac(GUID g, CompWnd *c) { + WACObject *wo = SOM::getWACObject(g); + script_vcpu_onGiveUpWac(SCRIPT_CALL, getScriptObject(), MAKE_SCRIPT_OBJECT(wo ? wo->getScriptObject() : NULL)); +} + +int ComponentObject::getAutoClose() { + return autoclose; +} + +void ComponentObject::setAcceptWac(int a) { + accept = a; +} + +int ComponentObject::handleDesktopAlpha() { + if (denyDesktopAlpha) return 0; + if (!compwnd) return 1; + return 0; +} + +int ComponentObject::handleTransparency() { + if (denyTransparency) return 0; + if (!compwnd) return 1; + return compwnd->handleTransparency(); +} + +int ComponentObject::getPreferences(int what) { + if (compwnd) return compwnd->getPreferences(what); + return COMPONENTOBJECT_PARENT::getPreferences(what); +} + +scriptVar ComponentObject::script_vcpu_getGUID(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) { + SCRIPT_FUNCTION_INIT; + + OLECHAR oguid[256] = {0}; // NONPORTABLE + ComponentObject *co = static_cast<ComponentObject *>(o->vcpu_getInterface(componentObjectGuid)); + if (co) { + static char guid[256]; + StringFromGUID2(((ComponentObject *)o)->myGUID, oguid, 256); + wsprintf(guid, "%$", oguid); + return MAKE_SCRIPT_STRING(guid); + } + return MAKE_SCRIPT_STRING(""); +} + +scriptVar ComponentObject::script_vcpu_getWac(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) { + SCRIPT_FUNCTION_INIT; ; + ComponentObject *co = static_cast<ComponentObject *>(o->vcpu_getInterface(componentObjectGuid)); + return MAKE_SCRIPT_OBJECT(co ? SOM::getWACObject(co->getGUID())->getScriptObject() : NULL); +} + +scriptVar ComponentObject::script_vcpu_setRegionFromMap(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar map, scriptVar byte, scriptVar inv) { + SCRIPT_FUNCTION_INIT; ; + ASSERT(SOM::isNumeric(&byte)); + ASSERT(SOM::isNumeric(&inv)); + ComponentObject *co = static_cast<ComponentObject *>(o->vcpu_getInterface(componentObjectGuid)); + SMap *sm = static_cast<SMap *>(GET_SCRIPT_OBJECT_AS(map, mapGuid)); + co->script_setRegionFromMap(sm, SOM::makeInt(&byte), SOM::makeBoolean(&inv)); + RETURN_SCRIPT_VOID; +} + +scriptVar ComponentObject::script_vcpu_setRegion(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar r) { + SCRIPT_FUNCTION_INIT; ; + ComponentObject *co = static_cast<ComponentObject *>(o->vcpu_getInterface(componentObjectGuid)); + SRegion *reg = static_cast<SRegion *>(GET_SCRIPT_OBJECT_AS(r, regionGuid)); + if (co) co->script_setRegion(reg); + RETURN_SCRIPT_VOID; +} + +scriptVar ComponentObject::script_vcpu_onGetWac(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar wac) { + SCRIPT_FUNCTION_INIT; + PROCESS_HOOKS1(o, compoController, wac); + SCRIPT_FUNCTION_CHECKABORTEVENT; + SCRIPT_EXEC_EVENT1(o, wac); +} + +scriptVar ComponentObject::script_vcpu_onGiveUpWac(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar wac) { + SCRIPT_FUNCTION_INIT; + PROCESS_HOOKS1(o, compoController, wac); + SCRIPT_FUNCTION_CHECKABORTEVENT; + SCRIPT_EXEC_EVENT1(o, wac); +} + +scriptVar ComponentObject::script_vcpu_setAcceptWac(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar on) { + SCRIPT_FUNCTION_INIT; + ASSERT(SOM::isNumeric(&on)); + ComponentObject *co = static_cast<ComponentObject *>(o->vcpu_getInterface(componentObjectGuid)); + if (co) co->setAcceptWac(GET_SCRIPT_BOOLEAN(on)); + RETURN_SCRIPT_VOID; +} + + |