diff options
Diffstat (limited to 'Src/Wasabi/api/wndmgr/snappnt.cpp')
-rw-r--r-- | Src/Wasabi/api/wndmgr/snappnt.cpp | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/Src/Wasabi/api/wndmgr/snappnt.cpp b/Src/Wasabi/api/wndmgr/snappnt.cpp new file mode 100644 index 00000000..93ad3df9 --- /dev/null +++ b/Src/Wasabi/api/wndmgr/snappnt.cpp @@ -0,0 +1,181 @@ +#include <precomp.h> +#include "snappnt.h" +#include <api/wndmgr/layout.h> +#include <api/wnd/wndtrack.h> +#include <api/config/items/cfgitem.h> + +SnapPoint::SnapPoint(Layout *l, Container *c) +{ + points.addItem(this); + setParentLayout(l); + setParentContainer(c); +} + +SnapPoint::~SnapPoint() +{ + points.removeItem(this); +} + +void SnapPoint::removeAll() +{ + points.deleteAllSafe(); +} + +int SnapPoint::setXmlParam(const wchar_t *paramname, const wchar_t *strvalue) +{ + if (!WCSICMP(paramname, L"id")) id = strvalue; + else if (!WCSICMP(paramname, L"x")) x = WTOI(strvalue); + else if (!WCSICMP(paramname, L"y")) y = WTOI(strvalue); + else if (!WCSICMP(paramname, L"relatx")) relatx = WTOI(strvalue); + else if (!WCSICMP(paramname, L"relaty")) relaty = WTOI(strvalue); + else return 0; + return 1; +} + +void SnapPoint::setParentLayout(Layout *l) +{ + playout = l; +} + +void SnapPoint::setParentContainer(Container *c) +{ + pcontainer = c; +} + +Container *SnapPoint::getParentContainer() +{ + return pcontainer; +} + +Layout *SnapPoint::getParentLayout() +{ + return playout; +} + +const wchar_t *SnapPoint::getId() +{ + return id; +} + +int SnapPoint::getX() +{ + if (getParentLayout()) + return (int)((double)x * getParentLayout()->getRenderRatio()); + return x; +} + +int SnapPoint::getY() +{ + if (getParentLayout()) + return (int)((double)y * getParentLayout()->getRenderRatio()); + return y; +} + +PtrList<SnapPoint> SnapPoint::points; + +int SnapPoint::match(ifc_window *master, RECT *z, ifc_window *slave, int flag, int *donex, int *doney, int w, int h) +{ + SnapPoint *pmast; + SnapPoint *pslav; + + for (int i = 0;i < points.getNumItems();i++) + if (points.enumItem(i)->getParentLayout() == master) + { + pmast = points.enumItem(i); + for (int j = 0;j < points.getNumItems();j++) + if (points.enumItem(j)->getParentLayout() == slave) + { + pslav = points.enumItem(j); + int r = do_match(pmast, pslav, z, flag, donex, doney, w, h); + if (r) + return 1; + } + } + return 0; +} + +int SnapPoint::do_match(SnapPoint *pmast, SnapPoint *pslav, RECT *z, int mask, int *donex, int *doney, int w, int h) +{ + //#if 0//BU> lone needs to make this work again + //fg> maybe it would have been a good idea to tell me about it... especially since it *works fine* + + ASSERT(pmast); + ASSERT(pslav); + int f = 0; + + if (((mask & KEEPSIZE) == 0) && !z) + { + ASSERTPR(0, "match resize with no rect"); + } + + if (!z) + { // just testing if docked + + if (!WCSICMP(pmast->getId(), pslav->getId())) + { + BaseWnd *wm = pmast->getParentLayout(); + BaseWnd *ws = pslav->getParentLayout(); + if (ws && ws) + { + RECT pmr, psr; + wm->getWindowRect(&pmr); + ws->getWindowRect(&psr); + pmr.left += pmast->relatx ? pmast->getX() : (pmr.right - pmr.left + pmast->getX()); + pmr.top += pmast->relaty ? pmast->getY() : (pmr.bottom - pmr.top + pmast->getY()); + psr.left += pmast->relatx ? pslav->getX() : (psr.right - psr.left + pslav->getX()); + psr.top += pmast->relaty ? pslav->getY() : (psr.bottom - psr.top + pslav->getY()); + if (pmr.left == psr.left && pmr.top == psr.top) + { + if (donex) *donex = 1; + if (doney) *doney = 1; + return 1; + } + } + } + } + else + { + + ASSERT(donex); + ASSERT(doney); + + if (!WCSICMP(pmast->getId(), pslav->getId())) + { + //CUT: BaseWnd *wm = pmast->getParentLayout(); + BaseWnd *ws = pslav->getParentLayout(); + if (ws && ws) + { + RECT pmr, psr, osr, omr; + pmr = omr = *z; + ws->getWindowRect(&psr); + osr = psr; + pmr.left += pmast->relatx ? pmast->getX() : (pmr.right - pmr.left + pmast->getX()); + pmr.top += pmast->relaty ? pmast->getY() : (pmr.bottom - pmr.top + pmast->getY()); + psr.left += pmast->relatx ? pslav->getX() : (psr.right - psr.left + pslav->getX()); + psr.top += pmast->relaty ? pslav->getY() : (psr.bottom - psr.top + pslav->getY()); + if (pmr.left > psr.left - 10 && pmr.left < psr.left + 10 && (mask & LEFT) && ! *donex) + { + *donex = 1; + z->left = omr.left - (pmr.left - psr.left); + if (mask & KEEPSIZE) + z->right = z->left + w; + f++; + } + if (pmr.top > psr.top - 10 && pmr.top < psr.top + 10 && (mask & TOP) && ! *doney) + { + z->top = omr.top - (pmr.top - psr.top); + *doney = 1; + if (mask & KEEPSIZE) + z->bottom = z->top + h; + f++; + } + } + } + + return f > 0; + } + return 0; +} + + + |