aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/script/objects/svcwnd.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/svcwnd.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Wasabi/api/script/objects/svcwnd.cpp')
-rw-r--r--Src/Wasabi/api/script/objects/svcwnd.cpp239
1 files changed, 239 insertions, 0 deletions
diff --git a/Src/Wasabi/api/script/objects/svcwnd.cpp b/Src/Wasabi/api/script/objects/svcwnd.cpp
new file mode 100644
index 00000000..2ab301e9
--- /dev/null
+++ b/Src/Wasabi/api/script/objects/svcwnd.cpp
@@ -0,0 +1,239 @@
+#include "precomp.h"
+#include "../../bfc/std.h"
+#include "script.h"
+#include "scriptmgr.h"
+#include "../../bfc/notifmsg.h"
+#include "../../common/script/scriptobj.h"
+#include "compoobj.h"
+#include "../api.h"
+#include "vcpu.h"
+#include "../smap.h"
+#include "../skinparse.h"
+#include "svcwnd.h"
+#include "../services/services.h"
+#include "../services/servicei.h"
+#include "../svcmgr.h"
+#include "../services/svc_wndcreate.h"
+
+char svcWndXuiObjectStr[] = "SvcWnd"; // This is the xml tag
+char svcWndXuiSvcName[] = "SvcWnd xui object"; // this is the name of the xuiservice
+
+
+SvcWndScriptController _svcWndController;
+SvcWndScriptController *svcWndController = &_svcWndController;
+
+// -- Functions table -------------------------------------
+function_descriptor_struct SvcWndScriptController::exportedFunction[] = {
+ {"getGUID", 1, (void*)SvcWnd::script_vcpu_getGUID },
+ {"getWac", 0, (void*)SvcWnd::script_vcpu_getWac },
+};
+// --------------------------------------------------------
+
+const wchar_t *SvcWndScriptController::getClassName() {
+ return L"SvcGuiObject";
+}
+
+const wchar_t *SvcWndScriptController::getAncestorClassName() {
+ return "GuiObject";
+}
+
+int SvcWndScriptController::getNumFunctions() {
+ return sizeof(exportedFunction) / sizeof(function_descriptor_struct);
+}
+
+const function_descriptor_struct *SvcWndScriptController::getExportedFunctions() {
+ return exportedFunction;
+}
+
+GUID SvcWndScriptController::getClassGuid() {
+ return svcWndGuid;
+}
+
+ScriptObject *SvcWndScriptController::instantiate() {
+ SvcWnd *sv = new SvcWnd();
+ ASSERT(sv != NULL);
+ return sv->getScriptObject();
+}
+
+void SvcWndScriptController::destroy(ScriptObject *o) {
+ SvcWnd *obj = static_cast<SvcWnd*>(o->vcpu_getInterface(svcWndGuid));
+ ASSERT(obj != NULL);
+ delete obj;
+}
+
+void *SvcWndScriptController::encapsulate(ScriptObject *o) {
+ return NULL; // no encapsulation for svcwnd yet
+}
+
+void SvcWndScriptController::deencapsulate(void *o) {
+}
+
+char SvcWndParams[][] =
+{
+ "DBLCLICKACTION", //SVCWND_DBLCLKACTION
+ "GUID" // SVCWND_GUID
+};
+SvcWnd::SvcWnd() {
+ getScriptObject()->vcpu_setInterface(svcWndGuid, (void *)static_cast<SvcWnd*>(this));
+ getScriptObject()->vcpu_setClassName("SvcGuiObject");
+ getScriptObject()->vcpu_setController(svcWndController);
+ myGUID = INVALID_GUID;
+ svcwnd = NULL;
+ svc = NULL;
+ forwarded = 0;
+ xuihandle = newXuiHandle();
+
+ addParam(xuihandle, SvcWndParams[0], SVCWND_DBLCLKACTION, XUI_ATTRIBUTE_IMPLIED);
+ addParam(xuihandle, SvcWndParams[1], SVCWND_GUID, XUI_ATTRIBUTE_IMPLIED);
+
+}
+
+// servicewnd to svcwnd
+
+int SvcWnd::childNotify(api_window *child, int msg, intptr_t param1, intptr_t param2) {
+ if (child == svcwnd) {
+ switch (msg) {
+ case ChildNotify::SVCWND_LBUTTONDOWN:
+ onLeftButtonDown(param1, param2);
+ break;
+ case ChildNotify::SVCWND_RBUTTONDOWN:
+ onRightButtonDown(param1, param2);
+ break;
+ case ChildNotify::SVCWND_LBUTTONUP:
+ onLeftButtonUp(param1, param2);
+ break;
+ case ChildNotify::SVCWND_RBUTTONUP:
+ onRightButtonUp(param1, param2);
+ break;
+ case ChildNotify::SVCWND_LBUTTONDBLCLK:
+ onLeftButtonDblClk(param1, param2);
+ break;
+ case ChildNotify::SVCWND_RBUTTONDBLCLK:
+ onRightButtonDblClk(param1, param2);
+ break;
+ case ChildNotify::SVCWND_MOUSEMOVE:
+ onMouseMove(param1, param2);
+ break;
+ }
+ forwarded = 0;
+ } else
+ return SVCWND_PARENT::childNotify(child, msg, param1, param2);
+ return 1;
+}
+
+// virtualwnd to guiobject bridging
+
+int SvcWnd::onLeftButtonDblClk(int x, int y) {
+ if(!dblClickAction.isempty()) {
+ const char *toCheck="SWITCH;";
+ if(!STRNINCMP(dblClickAction,toCheck)) {
+ onLeftButtonUp(x,y);
+ getGuiObject()->guiobject_getParentGroup()->getParentContainer()->switchToLayout(dblClickAction.getValue()+STRLEN(toCheck));
+ }
+ }
+ return SVCWND_PARENT::onLeftButtonDblClk(x, y);
+}
+
+int SvcWnd::onResize() {
+ SVCWND_PARENT::onResize();
+ RECT r = clientRect();
+ if (svcwnd)
+ svcwnd->resize(r.left, r.top, r.right-r.left, r.bottom-r.top);
+ return 1;
+}
+
+void SvcWnd::onSetVisible(int v) {
+ if (svcwnd) svcwnd->setVisible(v);
+ SVCWND_PARENT::onSetVisible(v);
+}
+
+int SvcWnd::setXuiParam(int _xuihandle, int xmlattributeid, const wchar_t *xmlattributename, const wchar_t *value) {
+ if (_xuihandle == xuihandle) {
+ switch (xmlattributeid) {
+ case SVCWND_GUID: {
+ GUID *g;
+ g = SkinParser::getComponentGuid(value);
+ if (g)
+ setGUID(*g);
+ return 1;
+ }
+ case SVCWND_DBLCLKACTION:
+ dblClickAction = value;
+ return 1;
+ }
+ }
+ return SVCWND_PARENT::setXuiParam(_xuihandle,xmlattributeid,xmlattributename,value);
+}
+
+int SvcWnd::onUnknownXuiParam(const wchar_t *param, const wchar_t *value) {
+ params.addItem(new String(param));
+ params.addItem(new String(value));
+ return 0;
+}
+
+int SvcWnd::onInit() {
+ int r = SVCWND_PARENT::onInit();
+ WindowCreateByGuidEnum wce(getGUID());
+ for (;;) {
+ if (!svc)
+ svc = wce.getNext();
+ if (!svc) return 0;
+ svcwnd = svc->createWindowByGuid(getGUID(), this);
+ if (svcwnd != NULL) break;
+ SvcEnum::release(svc); svc = NULL;
+ }
+ if (svcwnd != NULL)
+ {
+ svcwnd->setStartHidden(1);
+ if (!svcwnd->isInited())
+ r &= svcwnd->init(this);
+ if (params.getNumItems() > 0) {
+ for (int i=0;i<params.getNumItems();i+=2) {
+ svcwnd->getGuiObject()->guiobject_setXmlParam(params[i]->getValue(), params[i+1]->getValue());
+ }
+ }
+ }
+ params.deleteAll();
+ return r;
+}
+
+SvcWnd::~SvcWnd() {
+ if (svc) {
+ svc->destroyWindow(svcwnd);
+ ServiceManager::release(svc);
+ }
+}
+
+int SvcWnd::handleRatio() {
+ return 1; // todo: ask window
+}
+
+void SvcWnd::setGUID(GUID g) {
+ myGUID = g;
+}
+
+GUID SvcWnd::getGUID(void) {
+ return myGUID;
+}
+
+int SvcWnd::getPreferences(int what) {
+ if (svcwnd) return svcwnd->getPreferences(what);
+ return SVCWND_PARENT::getPreferences(what);
+}
+
+scriptVar SvcWnd::script_vcpu_getGUID(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) {
+ SCRIPT_FUNCTION_INIT;
+ SvcWnd *s = static_cast<SvcWnd *>(o->vcpu_getInterface(svcWndGuid));
+ if (s)
+ return MAKE_SCRIPT_STRING(StringPrintf(s->myGUID));
+ else
+ return MAKE_SCRIPT_STRING("");
+}
+
+scriptVar SvcWnd::script_vcpu_getWac(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) {
+ SCRIPT_FUNCTION_INIT;
+ SvcWnd *s = static_cast<SvcWnd *>(o->vcpu_getInterface(svcWndGuid));
+ if (s) return MAKE_SCRIPT_OBJECT(SOM::getWACObject(s->getGUID())->getScriptObject());
+ RETURN_SCRIPT_VOID;
+}
+