aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/script/objects/compoobj.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Wasabi/api/script/objects/compoobj.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-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.cpp361
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;
+}
+
+