aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/wndmgr/layout.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/wndmgr/layout.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Wasabi/api/wndmgr/layout.cpp')
-rw-r--r--Src/Wasabi/api/wndmgr/layout.cpp2586
1 files changed, 2586 insertions, 0 deletions
diff --git a/Src/Wasabi/api/wndmgr/layout.cpp b/Src/Wasabi/api/wndmgr/layout.cpp
new file mode 100644
index 00000000..006a953d
--- /dev/null
+++ b/Src/Wasabi/api/wndmgr/layout.cpp
@@ -0,0 +1,2586 @@
+#include <precomp.h>
+#include <api/skin/widgets/mb/scriptbrowser.h>
+#include <tataki/bitmap/bitmap.h>
+#include <api/wnd/popup.h>
+#include <api/wndmgr/msgbox.h>
+#include <api/skin/widgets/group.h>
+#include "layout.h"
+#include <api/skin/skinparse.h>
+#include <api/skin/widgets/button.h>
+#include <api/core/buttons.h>
+#include <api/wnd/wndtrack.h>
+//#include <api/wac/main.h> //CUT!
+#include <api/skin/widgets/compbuck2.h>
+#include <api/wac/compon.h>
+#include <api/skin/skin.h>
+#include <api/wnd/notifmsg.h>
+#include <api/config/items/intarray.h>
+#include <api/config/items/cfgitem.h>
+#include <api/config/options.h>
+#include <api/script/script.h>
+#include <api/script/scriptmgr.h>
+#include <bfc/parse/pathparse.h>
+#include <api/skin/groupmgr.h>
+#include <api/wndmgr/skinembed.h>
+#include <api/skin/skinparse.h>
+#include <api/service/svcs/svc_action.h>
+#include <api/config/items/attrbool.h>
+#include <api/config/items/attrint.h>
+#include <api/wndmgr/alphamgr.h>
+#include <bfc/wasabi_std_wnd.h>
+#include <api/wnd/PaintCanvas.h>
+#ifdef _WIN32
+#include <windowsx.h> // for SetWindowRedraw
+#endif
+
+#ifdef WASABINOMAINAPI
+#include <api/wndmgr/gc.h>
+#include <api/syscb/callbacks/gccb.h>
+#endif
+
+#ifndef WM_MOUSEWHEEL
+#define WM_MOUSEWHEEL 0x20A
+#endif
+
+#define TIMER_SETTINGCHANGED 0x8791
+#define TIMER_AUTOOPACIFY 0x8792
+#define TIMER_AUTOOPACIFY2 0x8793
+#define TIMER_OFFSCREENCHECK 0x8794
+#define TIMER_TRANSPARENCY_AUTOON 0x8795
+#define TIMER_SAVE_POSITION 0x8796
+#define TIMER_SAVE_ALL_POSITIONS 0x8797
+
+#ifdef WASABI_COMPILE_CONFIG
+extern _bool cfg_uioptions_linkallalpha;
+extern _bool cfg_uioptions_linkallratio;
+extern _int cfg_uioptions_autoopacitylinked;
+extern _int cfg_uioptions_autoopacitytime;
+extern _int cfg_uioptions_extendautoopacity;
+extern _int cfg_uioptions_autoopacityfadein;
+extern _int cfg_uioptions_autoopacityfadeout;
+extern _int cfg_uioptions_linkedalpha;
+extern _bool cfg_options_appbarondrag;
+#endif
+
+AlphaMgr *alphaMgr = NULL;
+XMLParamPair Layout::params[] =
+ {
+ {LAYOUT_SETALPHA, L"ALPHA"},
+ {LAYOUT_SETALPHABACKGROUND, L"ALPHABACKGROUND"},
+ {LAYOUT_SETDESKTOPALPHA, L"DESKTOPALPHA"},
+ {LAYOUT_FORCEALPHA, L"FORCEALPHA"},
+ {LAYOUT_SETINDESKTOP, L"INDESKTOP"},
+ {LAYOUT_SETLINKHEIGHT, L"LINKHEIGHT"},
+ {LAYOUT_SETLINKWIDTH, L"LINKWIDTH"},
+ {LAYOUT_SETLOCKTO, L"LOCKTO"},
+ {LAYOUT_SETNOACTIVATION, L"NOACTIVATION"},
+ {LAYOUT_NODOCK, L"NODOCK"},
+ {LAYOUT_NOOFFSCREENCHECK, L"NOOFFSCREENCHECK"},
+ {LAYOUT_NOPARENT, L"NOPARENT"},
+ {LAYOUT_SETONTOP, L"ONTOP"},
+ {LAYOUT_SETOSFRAME, L"OSFRAME"},
+ {LAYOUT_SETOWNER, L"OWNER"},
+ {LAYOUT_SNAPADJUSTBOTTOM, L"SNAPADJUSTBOTTOM"},
+ {LAYOUT_SNAPADJUSTLEFT, L"SNAPADJUSTLEFT"},
+ {LAYOUT_SNAPADJUSTRIGHT, L"SNAPADJUSTRIGHT"},
+ {LAYOUT_SNAPADJUSTTOP, L"SNAPADJUSTTOP"},
+ {LAYOUT_UNLINKED, L"UNLINKED"},
+ {LAYOUT_RESIZABLE, L"RESIZABLE"},
+ {LAYOUT_SCALABLE, L"SCALABLE"},
+ };
+
+Layout::Layout()
+{
+ getScriptObject()->vcpu_setInterface(layoutGuid, (void *)static_cast<Layout *>(this));
+ getScriptObject()->vcpu_setInterface(guiResizableGuid, (void *)static_cast<GuiResizable *>(this));
+ getScriptObject()->vcpu_setClassName(L"Layout");
+ getScriptObject()->vcpu_setController(layoutController);
+#ifdef _WIN32
+ forwardMsgWnd = INVALIDOSWINDOWHANDLE;
+#endif
+ transparency_reenabled_at = 0;
+ transparency_autooff = 0;
+ captured = 0; resizing = 0;
+ m_forceunlink = 0;
+ inresize = 0;
+ autoopacify = 0;
+ x = 0; y = 0;
+#ifdef USEAPPBAR
+ appbar_want_autohide = 1;
+ appbar_want_alwaysontop = 1;
+ m_allowsavedock = 0;
+#endif
+ size_w = 0; size_h = 0;
+ reg = NULL;
+ //subregionlayers = new PtrList<Layer>;
+ setStartHidden(TRUE);
+ moving = 0;
+ setVirtual(0);
+ indesktop = 0;
+ p_container = NULL;
+ alpha = 255;
+ linkedheight = NULL;
+ linkedwidth = NULL;
+ inlinkwidth = 0;
+ inlinkheight = 0;
+ wantactiv = 1;
+ wantdesktopalpha = 0;
+ alllayouts.addItem(this);
+ galphadisabled = 0;
+ lockedto = NULL;
+ osframe = 0;
+ scalelocked = 0;
+ initontop = 0;
+ wantredrawonresize = 1;
+ getGuiObject()->guiobject_setMover(1);
+ snap_adjust_left = snap_adjust_right = snap_adjust_top = snap_adjust_bottom = 0;
+ disable_auto_alpha = 0;
+ unlinked = 0;
+ scaling = 0;
+ transparencyoverride = -1;
+ noparent = 0;
+ forcealpha = 0;
+ nodock = 0;
+ resizable = 1;
+ scalable = 1;
+ nooffscreencheck = 0;
+ m_w = m_h = m_endmovesize = 0;
+
+ xuihandle = newXuiHandle();
+ CreateXMLParameters(xuihandle);
+
+ if (!alphaMgr)
+ {
+ alphaMgr = new AlphaMgr();
+ #ifdef WASABI_COMPILE_CONFIG
+ alphaMgr->setAllLinked(cfg_uioptions_linkallalpha.getValueAsInt());
+ alphaMgr->setAutoOpacify(cfg_uioptions_autoopacitylinked.getValueAsInt());
+ alphaMgr->setGlobalAlpha(cfg_uioptions_linkedalpha.getValueAsInt());
+ alphaMgr->setHoldTime(cfg_uioptions_autoopacitytime.getValueAsInt());
+ alphaMgr->setFadeInTime(cfg_uioptions_autoopacityfadein.getValueAsInt());
+ alphaMgr->setFadeOutTime(cfg_uioptions_autoopacityfadeout.getValueAsInt());
+ alphaMgr->setExtendAutoOpacity(cfg_uioptions_extendautoopacity.getValueAsInt());
+#endif
+ }
+ alphaMgr->addLayout(this);
+}
+
+void Layout::CreateXMLParameters(int master_handle)
+{
+ //LAYOUT_SCRIPTPARENT::CreateXMLParameters(master_handle);
+ int numParams = sizeof(params) / sizeof(params[0]);
+ hintNumberOfParams(xuihandle, numParams);
+ for (int i = 0;i < numParams;i++)
+ addParam(xuihandle, params[i], XUI_ATTRIBUTE_IMPLIED);
+}
+
+Layout::~Layout()
+{
+ if (transparency_reenabled_at) killTimer(TIMER_TRANSPARENCY_AUTOON);
+ alphaMgr->removeLayout(this);
+ killTimer(TIMER_OFFSCREENCHECK);
+ if (lockedto) lockedto->removeLockedLayout(this);
+ WASABI_API_WNDMGR->wndTrackRemove(this);
+ if (reg) delete reg;
+ alllayouts.removeItem(this);
+}
+
+int Layout::setXuiParam(int _xuihandle, int attrid, const wchar_t *paramname, const wchar_t *strvalue)
+{
+ if (xuihandle != _xuihandle) return LAYOUT_PARENT::setXuiParam(_xuihandle, attrid, paramname, strvalue);
+ switch (attrid)
+ {
+ case LAYOUT_SETDESKTOPALPHA:
+ setWantDesktopAlpha(WTOI(strvalue));
+ break;
+ case LAYOUT_SETINDESKTOP:
+ setInDesktop(WTOI(strvalue));
+ break;
+ case LAYOUT_SETALPHA:
+ setAlpha(WTOI(strvalue));
+ break;
+ case LAYOUT_SETLINKWIDTH:
+ setLinkWidth(strvalue);
+ if (*strvalue && isPostOnInit() && isVisible()) onResize();
+ break;
+ case LAYOUT_SETLINKHEIGHT:
+ setLinkHeight(strvalue);
+ if (*strvalue && isPostOnInit() && isVisible()) onResize();
+ break;
+ case LAYOUT_SETOWNER:
+ owner = strvalue;
+ break;
+ case LAYOUT_NOPARENT:
+ setNoParent(WTOI(strvalue));
+ break;
+ case LAYOUT_FORCEALPHA:
+ forcealpha = WTOI(strvalue);
+ break;
+ case LAYOUT_SETLOCKTO:
+ lockto = strvalue;
+ break;
+ case LAYOUT_SETOSFRAME:
+ osframe = WTOI(strvalue);
+ break;
+ case LAYOUT_SETALPHABACKGROUND:
+ setAlphaBackground(strvalue);
+ setWantDesktopAlpha(1);
+ setDrawBackground(1);
+ break;
+ case LAYOUT_SETNOACTIVATION:
+ wantactiv = WTOI(strvalue) ? 0 : 1;
+ break;
+ case LAYOUT_SETONTOP:
+ initontop = WTOI(strvalue);
+ if (isPostOnInit()) updateOnTop();
+ break;
+ case LAYOUT_SNAPADJUSTLEFT:
+ snap_adjust_left = WTOI(strvalue);
+ script_vcpu_onSnapAdjustChanged(SCRIPT_CALL, getScriptObject());
+#ifdef USEAPPBAR
+ if (appbar_isDocked()) appbar_posChanged();
+#endif
+ break;
+ case LAYOUT_SNAPADJUSTTOP:
+ snap_adjust_top = WTOI(strvalue);
+ script_vcpu_onSnapAdjustChanged(SCRIPT_CALL, getScriptObject());
+ #ifdef USEAPPBAR
+ if (appbar_isDocked()) appbar_posChanged();
+#endif
+ break;
+ case LAYOUT_SNAPADJUSTRIGHT:
+ snap_adjust_right = WTOI(strvalue);
+ script_vcpu_onSnapAdjustChanged(SCRIPT_CALL, getScriptObject());
+ #ifdef USEAPPBAR
+ if (appbar_isDocked()) appbar_posChanged();
+#endif
+ break;
+ case LAYOUT_SNAPADJUSTBOTTOM:
+ snap_adjust_bottom = WTOI(strvalue);
+ script_vcpu_onSnapAdjustChanged(SCRIPT_CALL, getScriptObject());
+ #ifdef USEAPPBAR
+ if (appbar_isDocked()) appbar_posChanged();
+#endif
+ break;
+ case LAYOUT_UNLINKED:
+ unlinked = WTOI(strvalue);
+ if (!unlinked && isPostOnInit() && isVisible()) onResize();
+ break;
+ case LAYOUT_NODOCK:
+ setNoDock(WTOI(strvalue));
+ break;
+ case LAYOUT_NOOFFSCREENCHECK:
+ setNoOffscreenCheck(WTOI(strvalue));
+ break;
+ case LAYOUT_RESIZABLE:
+ resizable = WTOI(strvalue);
+ break;
+ case LAYOUT_SCALABLE:
+ scalable = WTOI(strvalue);
+ break;
+ default:
+ return 0;
+ }
+ return 1;
+}
+
+void Layout::setLinkHeight(const wchar_t *layoutid)
+{
+ linkedheight = layoutid;
+}
+
+void Layout::setLinkWidth(const wchar_t *layoutid)
+{
+ linkedwidth = layoutid;
+}
+
+int Layout::onPostedMove()
+{
+ updateLockedLayouts();
+ int r = LAYOUT_PARENT::onPostedMove();
+ Container *c = getParentContainer();
+ if (isVisible() && c && c->isMainContainer())
+ {
+#ifdef WASABI_ON_MAIN_MOVE
+ WASABI_ON_MAIN_MOVE(gethWnd());
+#endif
+
+ }
+ return r;
+}
+
+void Layout::cancelCapture()
+{
+ if (getCapture())
+ endCapture();
+ captured = 0;
+}
+
+int Layout::isOffscreen(ifc_window *w)
+{
+ if (!w->isVisible()) return 0;
+ if (nooffscreencheck) return 0;
+#ifdef USEAPPBAR
+ if (appbar_isDocked()) return 0;
+#endif
+ if (lockedto) return 0;
+ RECT wr;
+ w->getWindowRect(&wr);
+ windowTracker->snapAdjustWindowRect(w, &wr);
+ RECT r;
+
+ int isontop = 0;
+ if (w->getGuiObject())
+ {
+ isontop = WTOI(w->getGuiObject()->guiobject_getXmlParam(L"ontop"));
+#ifndef EXPERIMENTAL_INDEPENDENT_AOT
+ if (WTOI(w->getGuiObject()->guiobject_getXmlParam(L"noparent")) == 0)
+ isontop = 0;
+#endif
+
+ }
+ if (!isontop)
+ {
+#ifdef WASABI_COMPILE_CONFIG
+ extern _bool cfg_options_alwaysontop;
+ isontop |= cfg_options_alwaysontop.getValueAsInt();
+#endif
+ }
+ Wasabi::Std::getViewport(&r, NULL, &wr, NULL, isontop);
+ if (wr.right < r.left + 10 ||
+ wr.bottom < r.top + 10 ||
+ wr.left > r.right - 10 ||
+ wr.top > r.bottom - 10)
+ {
+ return 1;
+ } //////TO CONTINUE
+ return 0;
+}
+
+void Layout::offscreenCheck()
+{
+ int disabled = 0;
+#ifdef WASABI_CHECK_OFFSCREENCHECK_DISABLE
+ WASABI_CHECK_OFFSCREENCHECK_DISABLE(disabled);
+#endif
+ if (disabled) return ;
+ if (!isVisible()) return ;
+ if (moving || scaling || resizing) return ;
+ if (isOffscreen(this))
+ {
+ windowTracker->startCooperativeMove(this);
+ for (int i = 0;i < windowTracker->getNumDocked();i++)
+ {
+ ifc_window *w = windowTracker->enumDocked(i);
+ Layout *l = static_cast<Layout*>(w->getInterface(layoutGuid));
+ if (l != NULL)
+ {
+ if (l->getParentContainer() && l->getParentContainer()->isMainContainer())
+ {
+ if (!isOffscreen(l))
+ {
+ windowTracker->endCooperativeMove();
+ return ;
+ }
+ }
+ }
+ }
+ windowTracker->endCooperativeMove();
+ RECT wr;
+ getWindowRect(&wr);
+ RECT nr = windowTracker->findOpenRect(wr);
+ move(nr.left, nr.top);
+ }
+}
+
+/**
+ * This one only prevents UI resizings from layers!
+ */
+int Layout::getResizable ()
+{
+ return this->resizable;
+}
+
+/**
+ * This one only prevents UI scalings from layers!
+ */
+int Layout::getScalable ()
+{
+ return this->scalable;
+}
+
+void Layout::setTransparencyOverride(int v)
+{
+ transparencyoverride = v;
+ if (v != -1) setTransparency(v); else updateTransparency();
+}
+
+#ifndef PI
+#define PI 3.1415926536
+#endif
+
+void Layout::timerCallback(int id)
+{
+ if (id == TIMER_TRANSPARENCY_AUTOON)
+ {
+ if (!isTransparencySafe(1))
+ {
+ transparency_reenabled_at = 0;
+ return ;
+ }
+ int n = Wasabi::Std::getTickCount() - transparency_reenabled_at;
+ if (n < 1000) return ;
+ else
+ {
+ killTimer(TIMER_TRANSPARENCY_AUTOON);
+ transparency_autooff = 0;
+ updateTransparency();
+ transparency_reenabled_at = 0;
+ }
+ return ;
+ }
+ else if (id == TIMER_OFFSCREENCHECK)
+ {
+ offscreenCheck();
+ return ;
+ }
+ else if (id == TIMER_SETTINGCHANGED)
+ {
+ killTimer(TIMER_SETTINGCHANGED);
+#ifdef _WIN32
+ HWND parent;
+ webserver = INVALIDOSWINDOWHANDLE;
+ listview = INVALIDOSWINDOWHANDLE;
+ getExplorerWindows(&parent, &listview, &webserver);
+ if (!webserver) // active desktop now off, reposition this window zorder otherwise it will be behind the icons
+#ifdef WIN32
+ SetWindowPos(gethWnd(), HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_DEFERERASE);
+#else
+ bringToFront();
+#endif
+#endif
+ }
+ else if (id == TIMER_SAVE_ALL_POSITIONS)
+ {
+ killTimer(TIMER_SAVE_ALL_POSITIONS);
+ saveAllPositions();
+ // TODO: benski> not 100% sure we want to call into the script on the timer (maybe do it in endMove)
+ //script_vcpu_onEndMove(SCRIPT_CALL, getScriptObject());
+ return;
+ }
+ else if (id == TIMER_SAVE_POSITION)
+ {
+ killTimer(TIMER_SAVE_POSITION);
+ savePosition();
+ // TODO: benski> not 100% sure we want to call into the script on the timer (maybe do it in endMove)
+ //script_vcpu_onEndMove(SCRIPT_CALL, getScriptObject());
+ return;
+ }
+ else LAYOUT_PARENT::timerCallback(id);
+}
+
+void Layout::onMouseEnterLayout()
+{
+ script_vcpu_onMouseEnterLayout(SCRIPT_CALL, getScriptObject());
+}
+
+void Layout::onMouseLeaveLayout()
+{
+ script_vcpu_onMouseLeaveLayout(SCRIPT_CALL, getScriptObject());
+}
+
+void Layout::beginMove()
+{
+ moving = 1;
+}
+
+void Layout::beginScale()
+{
+ scaling = 1;
+}
+
+void Layout::beginResize()
+{
+ resizing = 1;
+}
+
+void Layout::endMove()
+{
+ if (m_endmovesize)
+ {
+ m_endmovesize = 0;
+ RECT r;
+ guiresizable_getRootWnd()->getWindowRect(&r);
+ r.right = r.left + m_w;
+ r.bottom = r.top + m_h;
+ guiresizable_getRootWnd()->resizeToRect(&r);
+ }
+ moving = 0;
+ // TODO: benski> do this on a resetable timer so it doesn't go so slowly
+ if (WASABI_API_WNDMGR->wndTrackWasCooperative())
+ setTimer(TIMER_SAVE_ALL_POSITIONS, 1000);
+// saveAllPositions();
+ else
+ setTimer(TIMER_SAVE_POSITION, 1000);
+ //savePosition();
+ // TODO: benski> not 100% sure we want to call into the script on the timer (maybe do it in endMove)
+ script_vcpu_onEndMove(SCRIPT_CALL, getScriptObject());
+}
+
+void Layout::endScale()
+{
+ scaling = 0;
+ savePosition();
+ fixPosition();
+}
+
+void Layout::endResize()
+{
+ resizing = 0;
+ RECT r;
+ getClientRect(&r);
+ RECT wr;
+ getWindowRect(&wr);
+ script_vcpu_onUserResize(SCRIPT_CALL, getScriptObject(), MAKE_SCRIPT_INT(wr.left), MAKE_SCRIPT_INT(wr.top), MAKE_SCRIPT_INT(r.right - r.left), MAKE_SCRIPT_INT(r.bottom - r.top));
+ savePosition();
+}
+
+void Layout::onMove()
+{
+ script_vcpu_onMove(SCRIPT_CALL, getScriptObject());
+}
+
+void Layout::setAutoOpacify(int a)
+{
+ if (autoopacify == a) return ;
+ autoopacify = a != -1 ? a : autoopacify;
+ if (getParentContainer() && !getParentContainer()->isTranscient())
+ {
+ StringW tmp;
+ tmp.printf(L"Skin:%s/Container:%s/Layout:%s/autoopacify", WASABI_API_SKIN->getSkinName(), getParentContainer()->getDescriptor(), getGuiObject()->guiobject_getId());
+ IntArray::write(tmp, autoopacify);
+ }
+ updateTransparency();
+}
+
+void Layout::controlMenu()
+{
+ PopupMenu pop;
+ int x = 1;
+#ifdef WASABI_CHECK_CAN_EXIT
+ WASABI_CHECK_CAN_EXIT(x)
+#endif
+ if (getParentContainer() && getParentContainer()->isMainContainer())
+ {
+ if (x)
+ {
+ pop.addCommand(StringPrintfW(L"Exit %s", WASABI_API_APP->main_getAppName()), ACTION_CLOSE);
+ pop.addSeparator();
+ }
+ }
+ else
+ {
+ if (!getParentContainer() || getParentContainer()->canClose())
+ {
+ pop.addCommand(L"Close window", ACTION_CLOSE_WINDOW);
+ pop.addSeparator();
+ }
+ }
+ PopupMenu *scalemenu = new PopupMenu();
+ scalemenu->addCommand(L"50%", ACTION_SCALE_50);
+ scalemenu->addCommand(L"75%", ACTION_SCALE_75, FALSE, FALSE);
+ scalemenu->addCommand(L"100%", ACTION_SCALE_100);
+ scalemenu->addCommand(L"125%", ACTION_SCALE_125);
+ scalemenu->addCommand(L"150%", ACTION_SCALE_150);
+ scalemenu->addCommand(L"200%", ACTION_SCALE_200);
+ scalemenu->addCommand(L"400%", ACTION_SCALE_400, FALSE, FALSE);
+ pop.addSubMenu(scalemenu, L"Scale");
+
+ PopupMenu *opaqmenu = new PopupMenu();
+ opaqmenu->addCommand(L"Auto-fade", ACTION_AUTOOPACIFY, getAutoOpacify(), FALSE);
+ opaqmenu->addSeparator();
+ opaqmenu->addCommand(L"100%", ACTION_ALPHA_100, FALSE, FALSE);
+ opaqmenu->addCommand(L"90%", ACTION_ALPHA_90, FALSE, FALSE);
+ opaqmenu->addCommand(L"80%", ACTION_ALPHA_80, FALSE, FALSE);
+ opaqmenu->addCommand(L"70%", ACTION_ALPHA_70, FALSE, FALSE);
+ opaqmenu->addCommand(L"60%", ACTION_ALPHA_60, FALSE, FALSE);
+ opaqmenu->addCommand(L"50%", ACTION_ALPHA_50, FALSE, FALSE);
+ opaqmenu->addCommand(L"40%", ACTION_ALPHA_40, FALSE, FALSE);
+ opaqmenu->addCommand(L"30%", ACTION_ALPHA_30, FALSE, FALSE);
+ opaqmenu->addCommand(L"20%", ACTION_ALPHA_20, FALSE, FALSE);
+ opaqmenu->addCommand(L"10%", ACTION_ALPHA_10, FALSE, FALSE);
+
+ pop.addSubMenu(opaqmenu, L"Opacity", !isTransparencySafe());
+
+#ifdef EXPERIMENTAL_INDEPENDENT_AOT
+ pop.addCommand(L"Always on top", ACTION_AOT, getAlwaysOnTop());
+#endif
+
+ int r = pop.popAtMouse();
+ if (r < 0) return ;
+ onActionNotify(r, 0);
+}
+
+void Layout::fixPosition()
+{
+ RECT r;
+ getWindowRect(&r);
+ RECT orig_r = r;
+
+ RECT vr;
+ RegionI reg;
+
+ int i = 0;
+ while (Wasabi::Std::enumViewports(i, &vr))
+ {
+ reg.addRect(&vr);
+ i++;
+ }
+
+ RECT full;
+ reg.getBox(&full);
+
+
+ int dif = r.bottom - full.bottom;
+ if (dif > 0) r.top -= dif;
+ dif = r.right - full.right;
+ if (dif > 0) r.left -= dif;
+ dif = full.top - r.top;
+ if (dif > 0) r.top += dif;
+ dif = full.left - r.left;
+ if (dif > 0) r.left += dif;
+
+ if (orig_r.left != r.left || orig_r.top != r.top)
+ resize(r.left, r.top, NOCHANGE, NOCHANGE);
+}
+
+void Layout::saveAllPositions()
+{
+ // The positions are saved from the lastest to the first one
+ // The 'Player' windows and the 'Main' windows are using the same prefix
+ // In saving in decreasing order we are sure the lastest saved is the one for the Player
+
+ for (int i = 0;i < SkinParser::script_getNumContainers();i++)
+ {
+ Container *c = SkinParser::script_enumContainer(i);
+ for (int j = c->getNumLayouts() - 1;j >= 0 ;--j)
+ {
+ Layout *l = c->enumLayout(j);
+ l->savePosition();
+ }
+ }
+}
+
+int Layout::forceTransparencyFlag()
+{
+ return alphaMgr->needForcedTransparencyFlag(this);
+}
+
+void Layout::savePosition()
+{
+#ifdef WASABI_COMPILE_CONFIG
+ if (!getParentContainer() || getParentContainer()->isTranscient())
+ return ;
+
+ if (!Wasabi::Std::Wnd::isValidWnd(getOsWindowHandle()))
+ return ;
+
+
+ StringW prefix = MakePrefix();
+ StringPrintfW tmp( L"%s/odim", prefix.v() );
+
+ SkinBitmap *baseTexture = getBaseTexture();
+
+ if ( baseTexture )
+ {
+ IntArray::write( tmp, baseTexture->getWidth(), baseTexture->getHeight() );
+ }
+ else
+ {
+ IntArray::write( tmp, -2, -2 );
+ }
+
+ RECT r, rs;
+ getClientRect(&r); // unscaled
+ //DebugStringW( L"\nLayout::savePosition() - x = %d, y = %d, w = %d, h = %d \n", r.left, r.top, r.right - r.left, r.bottom - r.top );
+
+ if (r.left == 0 && r.top == 0 && r.right == 0 && r.bottom == 0)
+ return ;
+
+ getWindowRect(&rs); // screen scaled (for x/y)
+ tmp.printf(L"%s/rect", prefix.v());
+ IntArray::write(tmp, rs.left, rs.top, r.right - r.left, r.bottom - r.top);
+ //DebugStringW( L"Layout::savePosition() rect - x = %d, y = %d, w = %d, h = %d \n", rs.left, rs.top, r.right - r.left, r.bottom - r.top );
+
+ getRestoredRect(&rs);
+ tmp.printf(L"%s/restoredrect", prefix.v());
+ IntArray::write(tmp, rs.left, rs.top, rs.right - rs.left, rs.bottom - rs.top);
+
+ //DebugStringW( L"Layout::savePosition() restoredrect - x = %d, y = %d, w = %d, h = %d \n", rs.left, rs.top, rs.right - rs.left, rs.bottom - rs.top );
+
+ tmp.printf(L"%s/maximized", prefix.v());
+ // DebugString("isMaximized = %d\n", isMaximized());
+ WASABI_API_CONFIG->setIntPrivate(tmp, isMaximized());
+
+ tmp.printf(L"%s/r", prefix.v());
+ WASABI_API_CONFIG->setStringPrivate(tmp, StringPrintfW(getRenderRatio()));
+
+ tmp.printf(L"%s/sm", prefix.v());
+ TextInfoCanvas textInfoCanvas(this);
+ WASABI_API_CONFIG->setStringPrivate(tmp, StringPrintfW(textInfoCanvas.getSystemFontScale()));
+
+ tmp.printf(L"%s/sl", prefix.v());
+ WASABI_API_CONFIG->setStringPrivate(tmp, StringPrintfW(scalelocked));
+
+ tmp.printf(L"%s/autoopacify", prefix.v());
+ IntArray::write(tmp, autoopacify);
+
+#ifdef USEAPPBAR
+ saveAppBarPosition();
+#endif
+
+#endif
+}
+#ifdef USEAPPBAR
+void Layout::saveAppBarPosition()
+{
+ if (m_allowsavedock)
+ {
+ StringW prefix = MakePrefix();
+ StringW wtmp = StringPrintfW(L"%s/appbar", prefix.v());
+ WASABI_API_CONFIG->setIntPrivate(wtmp, appbar_getSide());
+ wtmp.printf(L"%s/appbarontop", prefix.v());
+ WASABI_API_CONFIG->setIntPrivate(wtmp, appbar_wantAlwaysOnTop());
+ wtmp.printf(L"%s/appbarhidden", prefix.v());
+ WASABI_API_CONFIG->setIntPrivate(wtmp, appbar_isHiding());
+ wtmp.printf(L"%s/appbarisautohide", prefix.v());
+ WASABI_API_CONFIG->setIntPrivate(wtmp, appbar_isAutoHiding());
+ wtmp.printf(L"%s/appbarwantautohide", prefix.v());
+ WASABI_API_CONFIG->setIntPrivate(wtmp, appbar_wantAutoHide());
+ }
+}
+#endif
+void Layout::lockScale(int locked)
+{
+ scalelocked = locked;
+ StringW tmp;
+ StringW prefix = MakePrefix();
+ tmp.printf(L"%s/sl", prefix.v());
+ WASABI_API_CONFIG->setStringPrivate(tmp, StringPrintfW(scalelocked));
+}
+
+void Layout::resize(int x, int y, int w, int h, int wantcb)
+{
+ if (inresize) return ;
+ inresize = 1;
+ LAYOUT_PARENT::resize(x, y, w, h, wantcb);
+ if (!lockedto)
+ getGuiObject()->guiobject_setGuiPosition(&x, &y, &w, &h, NULL, NULL, NULL, NULL);
+ inresize = 0;
+}
+
+void Layout::move(int x, int y)
+{
+ //DebugStringW( L"Layout::move( x = %d, y = %d )\n", x, y );
+
+ LAYOUT_PARENT::move(x, y);
+ getGuiObject()->guiobject_setGuiPosition(&x, &y, NULL, NULL, NULL, NULL, NULL, NULL);
+}
+
+#define DC_CHECKLASTRESIZE 0x109
+#ifdef USEAPPBAR
+#define DC_LOADSAVEDDOCK 0x10A
+#endif
+#define DC_INVALIDATE 0x10B
+
+int Layout::onResize()
+{
+ LAYOUT_PARENT::onResize();
+ if (!abortSaving()) savePosition();
+ RECT r;
+ getClientRect(&r);
+ if (!linkedwidth.isempty())
+ {
+ if (!inlinkwidth)
+ {
+ inlinkwidth = 1;
+ RECT cr;
+ Layout *l = getParentContainer() ? getParentContainer()->getLayout(linkedwidth) : NULL;
+ if (l)
+ {
+ int _unlinked = l->isUnlinked();
+ _unlinked |= isUnlinked();
+ if (!_unlinked)
+ {
+ l->getClientRect(&cr);
+ POINT pt;
+ l->getPosition(&pt);
+ l->resize(pt.x, pt.y, r.right - r.left, cr.bottom - cr.top);
+ }
+ }
+ inlinkwidth = 0;
+ }
+ }
+ if (!linkedheight.isempty())
+ {
+ if (!inlinkheight)
+ {
+ inlinkheight = 1;
+ RECT cr;
+ Layout *l = getParentContainer() ? getParentContainer()->getLayout(linkedheight) : NULL;
+ if (l)
+ {
+ int _unlinked = l->isUnlinked();
+ _unlinked |= isUnlinked();
+ if (!_unlinked)
+ {
+ l->getClientRect(&cr);
+ POINT pt;
+ l->getPosition(&pt);
+ l->resize(pt.x, pt.y, cr.right - cr.left, r.bottom - r.top);
+ }
+ }
+ }
+ inlinkheight = 0;
+ }
+ updateLockedLayouts();
+
+ postDeferredCallback(DC_CHECKLASTRESIZE);
+
+ return 1;
+}
+
+int Layout::onDeferredCallback(intptr_t p1, intptr_t p2)
+{
+ /* if (p1 == DC_CHECKLASTRESIZE) {
+ RECT vr;
+ RECT r;
+ RECT wr;
+ Std::getViewport(&vr, NULL, NULL, gethWnd(), 1);
+ if (renderRatioActive())
+ divRatio(&vr);
+ getClientRect(&r);
+ r.bottom -= snap_adjust_bottom;
+ r.top += snap_adjust_top;
+ r.right -= snap_adjust_right;
+ r.left += snap_adjust_left;
+ getWindowRect(&wr);
+ int n = 0;
+ if (r.right-r.left > vr.right-vr.left) { r.right = r.left + vr.right-vr.left; n++; }
+ if (r.bottom-r.top > vr.bottom-vr.top) { r.bottom = r.top + vr.bottom-vr.top; n++; }
+ if (n) resize(wr.left, wr.top, r.right-r.left+snap_adjust_left+snap_adjust_right, r.bottom-r.top+snap_adjust_top+snap_adjust_bottom);
+ } else */
+#ifdef USEAPPBAR
+ if (p1 == DC_LOADSAVEDDOCK)
+ {}
+#endif
+
+ if (p1 == DC_INVALIDATE)
+ {
+ invalidate();
+ }
+ return LAYOUT_PARENT::onDeferredCallback(p1, p2);
+ // return 1;
+}
+
+void Layout::updateLockedLayouts()
+{
+ for (int i = 0;i < getNumLockedLayouts();i++)
+ {
+ Layout *l = enumLockedLayout(i);
+
+ if (l->getRenderRatio() != getRenderRatio())
+ l->setRenderRatio(getRenderRatio());
+
+ int x, y, w, h;
+ l->getGuiObject()->guiobject_getGuiPosition(&x, &y, &w, &h, NULL, NULL, NULL, NULL);
+ RECT r;
+ l->getClientRect(&r);
+ if (w == AUTOWH) w = r.right - r.left;
+ if (h == AUTOWH) h = r.bottom - r.top;
+ POINT pt;
+ l->getPosition(&pt);
+ if (x == AUTOWH) x = pt.x; else clientToScreen(&x, NULL);
+ if (y == AUTOWH) y = pt.y; else clientToScreen(NULL, &y);
+ RECT cr;
+ l->getWindowRect(&cr);
+ if (cr.left != x || cr.top != y || cr.right != cr.left + w || cr.bottom != cr.top + h)
+ l->Group::resize(x, y, w, h);
+ }
+}
+
+int Layout::isClickThrough()
+{
+ return 0;
+}
+#ifdef _WIN32
+LRESULT Layout::wndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+
+#ifdef ON_CUSTOM_ALTF4
+ if (uMsg == WM_KEYDOWN || uMsg == WM_SYSKEYDOWN)
+ if (wParam == VK_F4)
+ if (GetAsyncKeyState(VK_MENU)&0x8000) ON_CUSTOM_ALTF4;
+#endif
+
+ if (uMsg == WM_KILLFOCUS || uMsg == WM_SETFOCUS)
+ {
+ alphaMgr->hoverCheck(this);
+ }
+
+ if (forwardMsgWnd != INVALIDOSWINDOWHANDLE)
+ {
+ switch (uMsg)
+ {
+ case WM_MOUSEWHEEL:
+ return (SendMessageW(forwardMsgWnd, uMsg, wParam, 0x31337)); // 0x31337 avoid main window callback
+ //case WM_DESTROY: //FG> commented out, makes wa quit when layout is destroyed
+ case WM_CLOSE:
+ return (SendMessageW(forwardMsgWnd, uMsg, wParam, lParam));
+
+ case WM_SETTINGCHANGE:
+ {
+ if (!indesktop) break;
+ setTimer(TIMER_SETTINGCHANGED, 1000);
+ }
+ break; //BU think this should be here eh
+
+#ifdef WIN32
+ case 0x0319:
+ { // hehe --BU
+ if (lParam & 0x20000)
+ FireAction(L"NEXT", NULL, 0, 0, NULL, 0, NULL, FALSE);
+ else
+ FireAction(L"PREV", NULL, 0, 0, NULL, 0, NULL, FALSE);
+ }
+ break;
+#endif
+ /*
+ WIP: This won't work anymore. What should we do about it? -- mig
+
+ childNotify(NULL, CHILD_NOTIFY_LEFTPUSH, ACTION_NEXT);
+ break;
+ */
+ }
+ }
+ return LAYOUT_PARENT::wndProc(hWnd, uMsg, wParam, lParam);
+}
+#else
+OSStatus Layout::eventHandler(EventHandlerCallRef inHandlerCallRef, EventRef inEvent, void *inUserData)
+{
+ return LAYOUT_PARENT::eventHandler(inHandlerCallRef, inEvent, inUserData);
+}
+#warning port me
+#endif
+
+/*int Layout::onRightButtonDown(int x, int y) {
+ LAYOUT_PARENT::onRightButtonDown(x, y);
+// Main::appContextMenu(this, TRUE, isTransparencySafe());
+ return 1;
+}*/
+
+ifc_window *Layout::getCustomOwner()
+{
+ if (noparent) return NULL;
+ if (owner.isempty()) return NULL;
+ return SkinParser::getLayout(owner);
+}
+
+void Layout::addLockedLayout(Layout *l)
+{
+ locked.addItem(l);
+ updateLockedLayouts();
+}
+
+void Layout::removeLockedLayout(Layout *l)
+{
+ locked.removeItem(l);
+}
+
+int Layout::getNumLockedLayouts()
+{
+ return locked.getNumItems();
+}
+
+Layout *Layout::enumLockedLayout(int n)
+{
+ return locked.enumItem(n);
+}
+
+int Layout::isLocked()
+{
+ return (!lockto.isempty()
+ #ifdef USEAPPBAR
+ || cfg_options_appbarondrag == 0 && appbar_isDocked()
+#endif
+ );
+}
+
+void Layout::lockTo(Layout *t)
+{
+ if (t == NULL) return ;
+ if (lockedto) lockedto->removeLockedLayout(this);
+ lockedto = t;
+ t->addLockedLayout(this);
+}
+
+Layout *Layout::getLockedTo()
+{
+ return lockedto;
+}
+
+int Layout::reinit(OSMODULEHANDLE inst, OSWINDOWHANDLE parent, int nochild)
+{
+ StringW osname = getOSWndName();
+ ASSERTPR(!indesktop, "in desktop reinit failed");
+ if (noparent)
+ parent = NULL;
+ int r = LAYOUT_PARENT::reinit(inst, parent, nochild);
+ setOSWndName(osname);
+ return r;
+}
+
+int Layout::init(OSMODULEHANDLE inst, OSWINDOWHANDLE parent, int nochild)
+{
+ if (noparent) parent = NULL;
+ if (!indesktop) return LAYOUT_PARENT::init(inst, parent, nochild);
+
+#ifdef _WIN32
+ webserver = INVALIDOSWINDOWHANDLE;
+ listview = INVALIDOSWINDOWHANDLE;
+
+ getExplorerWindows(&parent, &listview, &webserver);
+
+ if (!parent)
+ {
+ indesktop = 0;
+ return LAYOUT_PARENT::init(inst, parent, nochild);
+ }
+#endif
+ nochild = 0;
+
+#ifdef _WIN32
+ // if active desktop is off, that's all we can do, we'll be on top of the icons
+ // if active desktop is on, but listview is not, we'll be on top of active desktop
+ if (!webserver || !listview) return LAYOUT_PARENT::init(inst, parent, nochild);
+#endif
+
+#ifdef WIN32
+ // find who we're gonna sit on top of
+ HWND behind = listview;
+ if (GetWindow(listview, GW_HWNDPREV))
+ behind = GetWindow(listview, GW_HWNDPREV);
+#else
+ DebugString( "portme -- Layout::init\n" );
+#endif
+
+ int r = LAYOUT_PARENT::init(inst, parent, nochild);
+#ifdef WIN32
+ SetWindowPos(gethWnd(), behind, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_DEFERERASE);
+#endif
+
+ return r;
+}
+
+#ifdef WIN32
+void Layout::getExplorerWindows(OSWINDOWHANDLE *parent, OSWINDOWHANDLE *listview, OSWINDOWHANDLE *webserver)
+{
+ *parent = NULL;
+ *listview = NULL;
+ *webserver = NULL;
+
+ char classname[256] = "";
+ HWND w;
+
+ // find explorer window. todo: litestep support ?
+ *parent = FindWindowA(NULL, "Program Manager");
+ if (!*parent) return ;
+
+ // find its first child for parenting
+ *parent = GetWindow(*parent, GW_CHILD);
+ if (!*parent) return ;
+
+ // find the children
+ w = GetWindow(*parent, GW_CHILD);
+
+ while (w)
+ {
+ GetClassNameA(w, classname, 255);
+ if (!*webserver && STRCASEEQL("Internet Explorer_Server", classname))
+ *webserver = w;
+ if (!*listview && STRCASEEQL("SysListView32", classname))
+ *listview = w;
+ w = GetWindow(w, GW_HWNDNEXT);
+ }
+}
+#endif
+
+int Layout::onInit()
+{
+ LAYOUT_PARENT::onInit();
+
+ Container *c = getParentContainer();
+ if (c != NULL)
+ {
+ const wchar_t *s = c->getName();
+ if (s != NULL)
+ {
+ setOSWndName(s);
+ }
+ }
+
+ loadSavedState();
+
+#ifdef WA3COMPATIBILITY
+ setIcon(WASABI_API_APP->main_getIcon(TRUE), TRUE);
+ setIcon(WASABI_API_APP->main_getIcon(FALSE), FALSE);
+#endif
+
+ WASABI_API_WNDMGR->wndTrackAdd(this);
+
+ if (wantDesktopAlpha() && isDesktopAlphaSafe())
+ desktopAlpha_autoTurnOn();
+
+ if (getBaseTexture())
+ {
+ //RECT r = {0, 0, getBaseTexture()->getWidth(), getBaseTexture()->getHeight()};
+ delete reg;
+#ifdef _WIN32
+ reg = new RegionI(getBaseTexture(), NULL, 0, 0, 0, 0, 0, 0, getDesktopAlpha() ? 1 : 255);
+ setRegion(reg);
+#else
+#warning port me
+#endif
+ }
+
+ SystemObject::onCreateLayout(this);
+
+ if (!lockto.isempty()) lockTo(SkinParser::getLayout(lockto));
+
+ updateOnTop();
+
+ setNoOffscreenCheck( -1);
+
+ return 1;
+}
+
+void Layout::updateOnTop()
+{
+ #ifdef USEAPPBAR
+ if (!appbar_isDocked())
+#endif
+ {
+#ifdef EXPERIMENTAL_INDEPENDENT_AOT
+ setAlwaysOnTop(initontop);
+#else
+ if (noparent)
+ {
+ int disable = 0;
+#ifdef WASABI_GET_TEMPDISABLE_AOT
+ WASABI_GET_TEMPDISABLE_AOT(disable);
+#endif
+#ifdef _WIN32
+ if (initontop && !disable) SetWindowPos(getOsWindowHandle(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOOWNERZORDER | SWP_NOACTIVATE);
+ else SetWindowPos(getOsWindowHandle(), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOOWNERZORDER | SWP_NOACTIVATE);
+#else
+#warning port me
+#endif
+ }
+#endif
+
+ }
+}
+
+void Layout::loadSavedState()
+{
+#ifdef WASABI_COMPILE_CONFIG
+ StringW tmp;
+#endif
+ wchar_t t[64] = L"";
+
+ int ow = -1;
+ int oh = -1;
+ int ra = -1;
+
+#ifdef WASABI_COMPILE_CONFIG
+ if (getParentContainer() && !getParentContainer()->isTranscient())
+ {
+ StringW prefix = MakePrefix();
+ tmp.printf(L"%s/odim", prefix.v());
+ IntArray::read(tmp, &ow, &oh);
+
+ tmp.printf(L"%s/alpha", prefix.v());
+ IntArray::read(tmp, &ra);
+
+ tmp.printf(L"%s/autoopacify", prefix.v());
+ IntArray::read(tmp, &autoopacify);
+
+ }
+#endif
+
+ int from_scratch = 0;
+ if (Std::keyModifier(STDKEY_SHIFT) && Std::keyModifier(STDKEY_ALT) && Std::keyModifier(STDKEY_CONTROL)) from_scratch = 1;
+#ifdef WASABI_COMPILE_CONFIG
+ if (getParentContainer() && !getParentContainer()->isTranscient())
+ {
+ StringW prefix = MakePrefix();
+ tmp.printf(L"%s/sl", prefix.v());
+ WASABI_API_CONFIG->getStringPrivate(tmp, t, 63, L"0");
+ lockScale(WTOI(t));
+ }
+#endif
+
+ *t = 0;
+#ifdef WASABI_COMPILE_CONFIG
+ if (getParentContainer() && !getParentContainer()->isTranscient())
+ {
+ StringW prefix = MakePrefix();
+ tmp.printf(L"%s/sm", prefix.v());
+ }
+
+ WASABI_API_CONFIG->getStringPrivate(tmp, t, 63, L"1.");
+ //double sm = (float)WTOF(t);
+#else
+ //double sm = 1.0;
+#endif
+ /*if (ABS(sm - Canvas::getSystemFontScale()) > 0.001)
+ from_scratch = 1;*/
+
+ if (Group::getBaseTexture() && alphabackground.getBitmap() != NULL)
+ {
+ if (Group::getBaseTexture()->getWidth() != alphabackground.getWidth() || Group::getBaseTexture()->getHeight() != alphabackground.getHeight())
+ {
+ ASSERTPR(0, StringPrintf("layout %S should have same size for background and alphabackground", getGuiObject()->guiobject_getParentLayout()->getGuiObject()->guiobject_getId()));
+ }
+ }
+
+ if ((ow != -2 && oh != -2) && (ow == -1 || oh == -1 || (getBaseTexture() && (ow != getBaseTexture()->getWidth() || oh != getBaseTexture()->getHeight()))))
+ from_scratch = 1;
+
+ int w = 0, h = 0;
+ int findrect = 0;
+
+ if (from_scratch || (getParentContainer() && getParentContainer()->isTranscient()))
+ {
+ if (getParentContainer())
+ {
+ int _x = getParentContainer()->getDefaultPositionX();
+ int _y = getParentContainer()->getDefaultPositionY();
+ x = _x == -1 ? x : _x;
+ y = _y == -1 ? y : _y;
+ if (x == -1 && y == -1) findrect = 1;
+ }
+ else
+ {
+ int _x, _y;
+ getGuiObject()->guiobject_getGuiPosition(&_x, &_y, NULL, NULL, NULL, NULL, NULL, NULL);
+ if (_x != AUTOWH && _x != NOCHANGE) x = _x;
+ if (_y != AUTOWH && _y != NOCHANGE) y = _y;
+ }
+ getGuiObject()->guiobject_getGuiPosition(NULL, NULL, &w, &h, NULL, NULL, NULL, NULL);
+ if (w == AUTOWH || h == AUTOWH)
+ {
+ w = getPreferences(SUGGESTED_W);
+ h = getPreferences(SUGGESTED_H);
+ int _minx = getPreferences(MINIMUM_W);
+ int _maxx = getPreferences(MAXIMUM_W);
+ int _miny = getPreferences(MINIMUM_H);
+ int _maxy = getPreferences(MAXIMUM_H);
+ if (_minx != AUTOWH && _maxx != AUTOWH && _minx > _maxx) _minx = _maxx;
+ if (_miny != AUTOWH && _maxy != AUTOWH && _miny > _maxy) _miny = _maxy;
+ if (w == AUTOWH && _minx != AUTOWH) w = _minx;
+ if (h == AUTOWH && _miny != AUTOWH) h = _miny;
+ TextInfoCanvas textInfoCanvas(this);
+ double fontScale = textInfoCanvas.getSystemFontScale();
+ if (w != AUTOWH && getGuiObject()->guiobject_getAutoSysMetricsW())
+ w = (int)((float)w * fontScale);
+ if (h != AUTOWH && getGuiObject()->guiobject_getAutoSysMetricsH())
+ h = (int)((float)h * fontScale);
+ }
+ }
+ else
+ {
+ if (getParentContainer())
+ {
+
+ if (getParentContainer()->isMainContainer()) //FG> could be a new component installed
+ SkinParser::noCenterSkin();
+
+#ifdef WASABI_COMPILE_CONFIG
+ StringW prefix = MakePrefix();
+
+ tmp.printf(L"%s/rect", prefix.v());
+ IntArray::read(tmp, &x, &y, &w, &h);
+
+ RECT rr;
+ tmp.printf(L"%s/restoredrect", prefix.v());
+ IntArray::read(tmp, (int*)&rr.left, (int*)&rr.top, (int*)&rr.right, (int*)&rr.bottom);
+ rr.right += rr.left;
+ rr.bottom += rr.top;
+
+ tmp.printf(L"%s/maximized", prefix.v());
+ if (WASABI_API_CONFIG->getIntPrivate(tmp, 0)) setRestoredRect(&rr);
+
+#endif
+
+ }
+ }
+
+ *t = 0;
+ double ratio = 1.0;
+
+ if (!from_scratch)
+ {
+ if (getParentContainer())
+ {
+#ifdef WASABI_COMPILE_CONFIG
+ StringW prefix = MakePrefix();
+ tmp.printf(L"%s/r", prefix.v());
+
+ WASABI_API_CONFIG->getStringPrivate(tmp, t, 63, L"1.");
+ ratio = WTOF(t);
+#else
+ ratio = 1.0f;
+#endif
+
+ }
+ }
+
+#ifdef ON_TWEAK_RENDER_RATIO
+ if (!scalelocked) ON_TWEAK_RENDER_RATIO(ratio);
+#endif
+
+ if (w == 0 || h == 0 || from_scratch)
+ {
+ int _w = getPreferences(SUGGESTED_W);
+ w = _w == AUTOWH ? w : _w;
+ int _h = getPreferences(SUGGESTED_H);
+ h = _h == AUTOWH ? h : _h;
+
+ TextInfoCanvas textInfoCanvas(this);
+ double fontScale = textInfoCanvas.getSystemFontScale();
+
+ if (getGuiObject()->guiobject_getAutoSysMetricsW())
+ w = (int)((float)w * fontScale);
+ if (getGuiObject()->guiobject_getAutoSysMetricsH())
+ h = (int)((float)h * fontScale);
+ if (w == 0 || h == 0)
+ {
+ w = getBaseTexture()->getWidth();
+ h = getBaseTexture()->getHeight();
+ }
+ RECT sr = {x, y, x + w, y + h};
+ if (findrect)
+ sr = windowTracker->findOpenRect(Wasabi::Std::makeRect(0, 0, (int)((float)w * getRenderRatio()), (int)((float)h * getRenderRatio())), this);
+ sr.right = sr.left + w;
+ sr.bottom = sr.top + h;
+ BaseWnd::resize(&sr);
+ }
+ else
+ {
+ RECT cr;
+ getClientRect(&cr);
+ RECT r = {x, y, x + w, y + h};
+ BaseWnd::resize(&r);
+ }
+
+ setAlpha(from_scratch || ra == -1 ? alpha : ((ra < 254) ? ra : 255));
+
+ Layout *main = SkinParser::getMainLayout();
+ if (main != this && main
+ #ifdef WASABI_COMPILE_CONFIG
+ && cfg_uioptions_linkallratio.getValueAsInt()
+#endif
+ && !noparent)
+ {
+ setRenderRatio(main->getRenderRatio());
+ }
+ else setRenderRatio(ratio);
+
+ setAutoOpacify(autoopacify);
+
+#ifdef USEAPPBAR
+ postDeferredCallback(DC_LOADSAVEDDOCK);
+
+ if (getParentContainer() && !getParentContainer()->isTranscient())
+ {
+ StringW prefix = MakePrefix();
+ StringW tmp = StringPrintfW(L"%s/appbar", prefix.v());
+ int side = WASABI_API_CONFIG->getIntPrivate(tmp, APPBAR_NOTDOCKED);
+ tmp.printf(L"%s/appbarisautohide", prefix.v());
+ int is_autohide = WASABI_API_CONFIG->getIntPrivate(tmp, 0);
+ tmp.printf(L"%s/appbarwantautohide", prefix.v());
+ appbar_want_autohide = is_autohide || WASABI_API_CONFIG->getIntPrivate(tmp, 1);
+ tmp.printf(L"%s/appbarontop", prefix.v());
+ appbar_want_alwaysontop = WASABI_API_CONFIG->getIntPrivate(tmp, 1);
+ tmp.printf(L"%s/appbarhidden",prefix.v());
+ int curside = appbar_getSide();
+ if (side != curside)
+ {
+ if (side == APPBAR_NOTDOCKED)
+ // starting up docked ??
+ appbar_dock(side);
+ else
+ {
+ setNoParent(2);
+ BaseWnd::reinit();
+ appbar_dock(side);
+ }
+ }
+ }
+ m_allowsavedock = 1;
+
+#endif
+}
+
+void Layout::setBaseTexture(const wchar_t *b, int regis)
+{
+ LAYOUT_PARENT::setBaseTexture(b, 0); // 0, not regis!
+ if (!getDesktopAlpha() || ((wantDesktopAlpha()) && alphabackground.getBitmap() == NULL))
+ {
+ if (regis) WASABI_API_WND->skin_unregisterBaseTextureWindow(this);
+ if (getBaseTexture())
+ {
+ //RECT r = {0, 0, getBaseTexture()->getWidth(), getBaseTexture()->getHeight()};
+ delete reg;
+#ifdef _WIN32
+ reg = new RegionI(getBaseTexture(), NULL, 0, 0, 0, 0, 0, 0, getDesktopAlpha() ? 1 : 255);
+ setRegion(reg);
+#else
+#warning port me
+#endif
+ }
+ if (regis)
+ WASABI_API_WND->skin_registerBaseTextureWindow(this, getBackgroundStr());
+ }
+}
+
+void Layout::setWantDesktopAlpha(int want)
+{
+ if (want && !Wasabi::Std::Wnd::isDesktopAlphaAvailable())
+ {
+ // WASABI_API_WNDMGR->messageBox("Desktop Alpha Blending is only available for Win2000/WinXP and above", "Sorry", MSGBOX_OK, NULL, NULL);
+ return ;
+ }
+ wantdesktopalpha = want;
+ if (wantdesktopalpha && isInited() && isDesktopAlphaSafe())
+ desktopAlpha_autoTurnOn();
+ else if (!wantdesktopalpha && getDesktopAlpha())
+ desktopAlpha_autoTurnOff();
+}
+
+int Layout::wantDesktopAlpha()
+{
+ return wantdesktopalpha;
+}
+
+int Layout::handleDesktopAlpha()
+{
+ return 1;
+}
+
+void Layout::onGuiObjectSetVisible(GuiObject *o, int visible)
+{
+ if (disable_auto_alpha) return ;
+ if (!o || !o->guiobject_getRootWnd()) return ;
+ if (visible)
+ {
+ if (getDesktopAlpha())
+ {
+ if (!o->guiobject_getRootWnd()->handleDesktopAlpha())
+ {
+ desktopAlpha_autoTurnOff();
+ }
+ }
+ if (!transparency_autooff)
+ {
+ if (!o->guiobject_getRootWnd()->handleTransparency())
+ {
+ transparency_autoTurnOff();
+ }
+ }
+ }
+ else
+ { // !visible
+ if (!getDesktopAlpha() && wantDesktopAlpha())
+ {
+ if (isDesktopAlphaSafe())
+ desktopAlpha_autoTurnOn();
+ }
+ if (transparency_autooff)
+ {
+ if (isTransparencySafe(1))
+ transparency_autoTurnOn();
+ }
+ }
+}
+
+void Layout::desktopAlpha_autoTurnOn()
+{
+
+ setDesktopAlpha(1);
+
+ WASABI_API_WND->skin_unregisterBaseTextureWindow(this);
+
+ if (getBaseTexture())
+ {
+ //RECT r = {0, 0, getBaseTexture()->getWidth(), getBaseTexture()->getHeight()};
+ delete reg;
+#ifdef _WIN32
+ reg = new RegionI(getBaseTexture(), NULL, 0, 0, 0, 0, 0, 0, 1);
+ setRegion(reg);
+#else
+#warning port me
+#endif
+ }
+
+ WASABI_API_WND->skin_registerBaseTextureWindow(this, alphabackground.getBitmap() ? alphabackgroundstr.getValue() : getBackgroundStr());
+
+ invalidate();
+}
+
+void Layout::desktopAlpha_autoTurnOff()
+{
+#ifdef WIN32
+ SetWindowRedraw(gethWnd(), FALSE);//LockWindowUpdate(gethWnd());
+ setDesktopAlpha(0);
+
+ WASABI_API_WND->skin_unregisterBaseTextureWindow(this);
+
+ if (getBaseTexture())
+ {
+ //RECT r = {0, 0, getBaseTexture()->getWidth(), getBaseTexture()->getHeight()};
+ delete reg;
+ reg = new RegionI(getBaseTexture(), NULL, 0, 0, 0, 0, 0, 0, 255);
+ setRegion(reg);
+ }
+
+ WASABI_API_WND->skin_registerBaseTextureWindow(this, getBackgroundStr());
+ SetWindowRedraw(gethWnd(), TRUE);//LockWindowUpdate(NULL);
+
+ invalidate();
+#else
+ DebugString( "portme -- Layout::init\n" );
+#endif
+}
+
+void Layout::transparency_autoTurnOn()
+{
+ transparency_reenabled_at = Wasabi::Std::getTickCount();
+ setTimer(TIMER_TRANSPARENCY_AUTOON, 500);
+}
+
+void Layout::transparency_autoTurnOff()
+{
+ transparency_autooff = 1;
+ killTimer(TIMER_TRANSPARENCY_AUTOON);
+ updateTransparency();
+}
+
+void Layout::onGlobalEnableDesktopAlpha(int enabled)
+{
+ foreach(alllayouts)
+ alllayouts.getfor()->globalEnableDesktopAlpha(enabled);
+ endfor
+#ifdef ON_TOGGLE_DESKTOPALPHA
+ ON_TOGGLE_DESKTOPALPHA(enabled);
+#endif
+}
+
+void Layout::globalEnableDesktopAlpha(int enabled)
+{
+ if (enabled)
+ {
+ galphadisabled = 0;
+ setWantDesktopAlpha(wantdesktopalpha);
+ }
+ else
+ {
+ galphadisabled = 1;
+ if (getDesktopAlpha())
+ desktopAlpha_autoTurnOff();
+ }
+}
+
+void Layout::setWantRedrawOnResize(int v)
+{
+ if (wantredrawonresize == v) return ;
+ wantredrawonresize = v;
+}
+
+PtrList<Layout> Layout::alllayouts;
+
+int Layout::onPaint(Canvas *canvas)
+{
+ PaintCanvas paintcanvas;
+ if (canvas == NULL)
+ {
+ if (!paintcanvas.beginPaint(this)) return 0;
+ canvas = &paintcanvas;
+ }
+
+ RECT r;
+
+ if (!canvas->getClipBox(&r))
+ getClientRect(&r);
+
+ canvas->fillRect(&r, 0);
+
+ LAYOUT_PARENT::onPaint(canvas);
+
+ return 1;
+}
+
+/*WndHolder *Layout::getHolder() {
+ return this;
+}*/
+
+SkinBitmap *Layout::getBaseTexture()
+{
+#ifdef WASABI_COMPILE_CONFIG
+ // {9149C445-3C30-4e04-8433-5A518ED0FDDE}
+ const GUID uioptions_guid =
+ { 0x9149c445, 0x3c30, 0x4e04, { 0x84, 0x33, 0x5a, 0x51, 0x8e, 0xd0, 0xfd, 0xde } };
+ int alphaenabled = _intVal(WASABI_API_CONFIG->config_getCfgItemByGuid(uioptions_guid), L"Enable desktop alpha");
+#else
+ int alphaenabled = WASABI_WNDMGR_DESKTOPALPHA;
+#endif
+ if (!alphabackground.getBitmap() || !getDesktopAlpha() || !alphaenabled) return LAYOUT_PARENT::getBaseTexture();
+ return alphabackground.getBitmap();
+}
+
+int Layout::runAction(int actionid, const wchar_t *param)
+{
+ switch (actionid)
+ {
+ case ACTION_SWITCH:
+ if (getParentContainer())
+ {
+ getParentContainer()->switchToLayout(param);
+ }
+ break;
+ case ACTION_TOGGLE:
+ SkinParser::toggleContainer(param);
+ break;
+#ifdef WA3COMPATIBILITY
+ case ACTION_MENU:
+ Main::doMenu(param);
+ break;
+#endif
+ case ACTION_ENDMODAL:
+ endModal(WTOI(param));
+ break;
+ case ACTION_CLOSE:
+ onActionNotify(ACTION_CLOSE);
+ break;
+#ifdef WA3COMPATIBILITY
+ default:
+ if (actionid != 0)
+ Main::doAction(actionid);
+ break;
+#else
+ case ACTION_MINIMIZE:
+#ifdef _WIN32
+ ShowWindow(WASABI_API_WND->main_getRootWnd()->gethWnd(), SW_MINIMIZE);
+#endif
+ break;
+#endif
+
+ }
+ return 0;
+}
+
+int Layout::childNotify(ifc_window *child, int msg, intptr_t param1, intptr_t param2)
+{
+ if (msg == ACTION_ENFORCEMINMAX)
+ {
+ loadSavedState();
+ return 0;
+ }
+ if (child != NULL)
+ {
+ int objId = child->getNotifyId();
+ if (msg == ChildNotify::BUTTON_LEFTPUSH)
+ {
+ switch (objId)
+ {
+ case ACTION_SWITCH:
+ case ACTION_TOGGLE:
+ case ACTION_MENU:
+ runAction(objId, ((Wasabi::Button *)child)->getParam());
+ break;
+ case ACTION_ENDMODAL:
+ {
+ StringPrintfW s(L"%d", (static_cast<ButtonWnd *>(child))->getModalRetCode());
+ runAction(ACTION_ENDMODAL, s);
+ }
+ break;
+ case ACTION_CLOSE:
+ runAction(ACTION_CLOSE);
+ break;
+ /*
+ #ifdef WA3COMPATIBILITY
+ case ACTION_EJECT:
+ runAction(ACTION_EJECT, "0");
+ break;
+ #endif
+ */
+ default:
+ runAction(objId);
+ break;
+ }
+ return 0;
+ }
+ if (msg == ChildNotify::BUTTON_RIGHTPUSH)
+ {
+ //FUCKO child->abortTip();
+ // POINT pt;
+ // Std::getMousePos(&pt);
+ // screenToClient(&pt);
+ // onRightButtonDown(pt.x, pt.y);
+#pragma warning (disable: 4060)
+ switch (objId)
+ {
+ /*
+ #ifdef WA3COMPATIBILITY
+ case ACTION_EJECT: {
+ runAction(ACTION_EJECT, "1");
+ }
+ break;
+ #endif
+ */
+ }
+#pragma warning (default: 4060)
+ return 0;
+ }
+ }
+ return LAYOUT_PARENT::childNotify(child, msg, param1, param2);
+}
+
+int Layout::onActionNotify(int action, intptr_t param)
+{
+ switch (action)
+ {
+#ifdef WA3COMPATIBILITY
+ case ACTION_SYSMENU:
+ Main::appContextMenu(this, TRUE, isDesktopAlphaSafe());
+ break;
+ case ACTION_CONTROLMENU:
+ controlMenu();
+ break;
+ case ACTION_WINDOWMENU:
+ Main::thingerContextMenu(this);
+ break;
+#elif defined(WASABI_CUSTOM_CONTEXTMENUS)
+ case ACTION_SYSMENU:
+ extern void appContextMenu(ifc_window *w);
+ appContextMenu(this);
+ break;
+ case ACTION_CONTROLMENU:
+ extern void appControlMenu(ifc_window *w);
+ appControlMenu(this);
+ break;
+#endif
+ case ACTION_SCALE_50: scaleTo(50); break;
+ case ACTION_SCALE_75: scaleTo(75); break;
+ case ACTION_SCALE_100: scaleTo(100); break;
+ case ACTION_SCALE_125: scaleTo(125); break;
+ case ACTION_SCALE_150: scaleTo(150); break;
+ case ACTION_SCALE_200: scaleTo(200); break;
+ case ACTION_SCALE_400: scaleTo(400); break;
+ case ACTION_ALPHA_10: setAlpha(25); break;
+ case ACTION_ALPHA_20: setAlpha(51); break;
+ case ACTION_ALPHA_30: setAlpha(76); break;
+ case ACTION_ALPHA_40: setAlpha(102); break;
+ case ACTION_ALPHA_50: setAlpha(127); break;
+ case ACTION_ALPHA_60: setAlpha(153); break;
+ case ACTION_ALPHA_70: setAlpha(178); break;
+ case ACTION_ALPHA_80: setAlpha(204); break;
+ case ACTION_ALPHA_90: setAlpha(229); break;
+ case ACTION_ALPHA_100: setAlpha(255); break;
+ case ACTION_AUTOOPACIFY: setAutoOpacify(!getAutoOpacify()); break;
+#ifdef EXPERIMENTAL_INDEPENDENT_AOT
+ case ACTION_AOT: setAlwaysOnTop(!getAlwaysOnTop()); break;
+#endif
+ case ACTION_CLOSE_WINDOW:
+ case ACTION_CLOSE:
+ if (getParentContainer() && getParentContainer()->isMainContainer())
+ {
+ int x = 1;
+#ifdef WASABI_CHECK_CAN_EXIT
+ WASABI_CHECK_CAN_EXIT(x)
+#endif
+ if (x)
+ {
+ WASABI_API_APP->main_shutdown();
+ }
+ }
+ else if (WASABI_API_WNDMGR->getModalWnd() != this)
+ {
+ if (!getParentContainer() || !getParentContainer()->isDynamic() || !getParentContainer()->canClose())
+ if (getParentContainer()) getParentContainer()->setVisible(FALSE); else setVisible(FALSE);
+ else
+ skinEmbedder->destroyContainer(getParentContainer());
+ }
+ else
+ {
+ endModal(MSGBOX_ABORTED);
+ }
+ break;
+ default: return 0;
+ }
+ return 1;
+}
+
+void Layout::containerToggled(const wchar_t *id, int visible)
+{
+ #ifdef _WIN32
+ sendNotifyToAllChildren(WM_WA_CONTAINER_TOGGLED, (intptr_t)id, visible);
+#else
+#warning port me
+#endif
+}
+
+void Layout::componentToggled(GUID *guid, int visible)
+{
+#ifdef _WIN32
+ sendNotifyToAllChildren(WM_WA_COMPONENT_TOGGLED, (intptr_t)guid, visible);
+#else
+#warning port me
+#endif
+}
+
+void Layout::setAlphaBackground(const wchar_t *b)
+{
+ alphabackgroundstr = b;
+ alphabackground.setBitmap(b);
+#ifdef _WIN32
+ RegionI r(alphabackground.getBitmap());
+ setRegion(&r);
+#else
+#warning port me
+#endif
+}
+
+/*void Layout::setWindowRegion(api_region *reg) {
+ LAYOUT_PARENT::setWindowRegion(reg);
+ if (getDesktopAlpha()) {
+ SetWindowRgn(gethWnd(), NULL, FALSE);
+ return;
+ }
+ if (!isInited()) return;
+ api_region *_r = getRegion();
+ if (getRenderRatio() != 1.0 && reg) {
+ api_region *clone = _r->clone();
+ clone->scale(getRenderRatio());
+ SetWindowRgn(gethWnd(), clone->makeWindowRegion(), TRUE);
+ _r->disposeClone(clone);
+ } else {
+ SetWindowRgn(gethWnd(), _r ? _r->makeWindowRegion() : NULL, TRUE);
+ }
+}*/
+
+void Layout::onSetDesktopAlpha(int a)
+{
+ invalidateWindowRegion();
+}
+
+void Layout::onShow(void)
+{
+ savePosition();
+ if (!WASABI_API_MAKI->vcpu_getComplete()) SystemObject::onShowLayout(this);
+}
+
+void Layout::onHide(void)
+{
+ savePosition();
+ if (!WASABI_API_MAKI->vcpu_getComplete()) SystemObject::onHideLayout(this);
+#ifndef WASABINOMAINAPI
+ api->hintGarbageCollect();
+#else
+ WASABI_API_SYSCB->syscb_issueCallback(SysCallback::GC, GarbageCollectCallback::GARBAGECOLLECT);
+#endif
+ if (getParentContainer() && getParentContainer()->wantRefocusApp()) SkinParser::focusFirst();
+}
+
+#ifdef _WIN32
+LPARAM Layout::wndHolder_getParentParam(int i)
+{
+ switch (i)
+ {
+ case 0: return (LPARAM)gethWnd();
+ case 1: return (LPARAM)static_cast<BaseWnd*>(this);
+ }
+ return 0;
+}
+#endif
+
+void Layout::onSetVisible( int show )
+{
+ disable_auto_alpha = 1;
+ LAYOUT_PARENT::onSetVisible( show );
+
+ if ( show )
+ onShow();
+ else
+ onHide();
+
+ Container *p = getParentContainer();
+
+ if ( p )
+ p->onChildSetLayoutVisible( this, show );
+
+ disable_auto_alpha = 0;
+
+ if ( wantDesktopAlpha() && isDesktopAlphaSafe() )
+ desktopAlpha_autoTurnOn();
+}
+
+void Layout::scaleTo(int s)
+{
+ beginScale();
+ setRenderRatio((double)s / 100.0);
+ endScale();
+}
+
+void Layout::setRenderRatio(double s)
+{
+ if (isPostOnInit()
+ #ifdef WASABI_COMPILE_CONFIG
+ && cfg_uioptions_linkallratio.getValueAsInt() == 1
+#endif
+ && !broadcasting)
+ {
+ broadcasting = 1;
+ SkinParser::setAllLayoutsRatio(s);
+ broadcasting = 0;
+ return ;
+ }
+ if (getRenderRatio() == s) return ;
+ LAYOUT_PARENT::setRenderRatio(s);
+ if (reg) invalidateWindowRegion();
+ invalidate();
+ foreach(locked)
+ locked.getfor()->setRenderRatio(s);
+ endfor;
+ if (lockedto && lockedto->getRenderRatio() != getRenderRatio())
+ lockedto->setRenderRatio(getRenderRatio());
+ script_vcpu_onScale(SCRIPT_CALL, getScriptObject(), MAKE_SCRIPT_DOUBLE(s));
+ if (!abortSaving()) savePosition();
+}
+
+void Layout::setAlpha(int a)
+{
+ int old = alpha;
+ alpha = a;
+ updateTransparency();
+#ifdef WASABI_COMPILE_CONFIG
+ if (old != alpha && getParentContainer())
+ {
+ StringPrintfW tmp(L"Skin:%s/Container:%s/Layout:%s/alpha", WASABI_API_SKIN->getSkinName(), getParentContainer()->getDescriptor(), getGuiObject()->guiobject_getId());
+ IntArray::write(tmp, alpha);
+ }
+#endif
+}
+
+int Layout::getAlpha()
+{
+ return alpha;
+}
+
+void Layout::setPaintingAlpha(int activealpha, int inactivealpha)
+{ // from basewnd, called by gui object
+ LAYOUT_PARENT::setAlpha(activealpha, inactivealpha);
+ updateTransparency();
+}
+
+int Layout::getPaintingAlpha()
+{ // from basewnd, called by gui object
+ return getAlpha();
+}
+
+int Layout::onActivate()
+{
+ LAYOUT_PARENT::onActivate();
+ // activateChildren(1);
+ updateTransparency();
+ return 1;
+}
+
+int Layout::onKillFocus()
+{
+ alphaMgr->hoverCheck(this);
+ int r = LAYOUT_PARENT::onKillFocus();
+ return r;
+}
+
+int Layout::onGetFocus()
+{
+ alphaMgr->hoverCheck(this);
+ int r = LAYOUT_PARENT::onGetFocus();
+ return r;
+}
+
+int Layout::onDeactivate()
+{
+ LAYOUT_PARENT::onDeactivate();
+ // activateChildren(0);
+ updateTransparency();
+ return 1;
+}
+
+void Layout::updateTransparency()
+{
+ alphaMgr->updateTransparency(this);
+}
+
+/*
+void Layout::activateChildren(int act) {
+ for (int i=0;i<gui_objects.getNumItems();i++) {
+ GuiObject *o = gui_objects.enumItem(i);
+ BaseWnd *b = NULL;
+ if (o)
+ b = o->getBaseWnd();
+ else
+ ASSERT(0);
+ if (b) {
+ if (act)
+ b->onActivate();
+ else
+ b->onDeactivate();
+ }
+ }
+}*/
+
+void Layout::center()
+{
+ RECT r;
+ getNonClientRect(&r);
+ RECT vw;
+ Wasabi::Std::getViewport(&vw, NULL, NULL, gethWnd());
+ int x = ((vw.right - vw.left) - (r.right - r.left)) / 2;
+ int y = ((vw.bottom - vw.top) - (r.bottom - r.top)) / 2;
+ move(x, y);
+}
+
+void Layout::setParentContainer(Container *c)
+{
+ p_container = c;
+}
+
+Container *Layout::getParentContainer()
+{
+ return p_container;
+}
+
+int Layout::isLayout()
+{
+ return 1;
+}
+
+void Layout::setInDesktop(int a)
+{
+ ASSERTPR(!isInited(), "cannot change indesktop after init");
+ indesktop = a;
+}
+
+int Layout::getInDesktop()
+{
+ return indesktop;
+}
+
+int Layout::isDesktopAlphaSafe()
+{
+#ifdef WASABI_COMPILE_CONFIG
+ if (galphadisabled) return 0;
+ // {9149C445-3C30-4e04-8433-5A518ED0FDDE}
+ const GUID uioptions_guid =
+ { 0x9149c445, 0x3c30, 0x4e04, { 0x84, 0x33, 0x5a, 0x51, 0x8e, 0xd0, 0xfd, 0xde } };
+ if (!_intVal(WASABI_API_CONFIG->config_getCfgItemByGuid(uioptions_guid), L"Enable desktop alpha")) return 0;
+#else
+ if (!WASABI_WNDMGR_DESKTOPALPHA) return 0;
+#endif
+ return LAYOUT_PARENT::isDesktopAlphaSafe();
+}
+
+void Layout::setStatusText(const wchar_t *txt, int overlay)
+{
+ foreach(statuscbs)
+ statuscbs.getfor()->onSetStatusText(txt, overlay);
+ endfor;
+}
+
+void Layout::addAppCmds(AppCmds *commands)
+{
+ foreach(statuscbs)
+ statuscbs.getfor()->onAddAppCmds(commands);
+ endfor;
+}
+
+void Layout::removeAppCmds(AppCmds *commands)
+{
+ foreach(statuscbs)
+ statuscbs.getfor()->onRemoveAppCmds(commands);
+ endfor;
+}
+
+void Layout::pushCompleted(int max)
+{
+ foreach(statuscbs)
+ statuscbs.getfor()->pushCompleted(max);
+ endfor;
+}
+void Layout::incCompleted(int add)
+{
+ foreach(statuscbs)
+ statuscbs.getfor()->incCompleted(add);
+ endfor;
+}
+void Layout::setCompleted(int pos)
+{
+ foreach(statuscbs)
+ statuscbs.getfor()->setCompleted(pos);
+ endfor;
+}
+void Layout::popCompleted()
+{
+ foreach(statuscbs)
+ statuscbs.getfor()->popCompleted();
+ endfor;
+}
+
+void Layout::registerStatusCallback(GuiStatusCallback *lcb)
+{
+ statuscbs.addItem(lcb);
+ viewer_addViewItem(lcb->status_getDependencyPtr());
+}
+
+int Layout::viewer_onItemDeleted(api_dependent *item)
+{
+ for (int i = 0;i < statuscbs.getNumItems();i++)
+ if (statuscbs.enumItem(i)->status_getDependencyPtr() == item)
+ {
+ statuscbs.removeByPos(i--);
+ }
+ return 1;
+}
+
+void Layout::snapAdjust(int left, int right, int top, int bottom)
+{
+ snap_adjust_left = left;
+ snap_adjust_top = top;
+ snap_adjust_right = right;
+ snap_adjust_bottom = bottom;
+ script_vcpu_onSnapAdjustChanged(SCRIPT_CALL, getScriptObject());
+ #ifdef USEAPPBAR
+ if (appbar_isDocked()) appbar_posChanged();
+#endif
+ if (forceTransparencyFlag() || getAlpha() < 255) postDeferredCallback(DC_INVALIDATE);
+}
+
+void Layout::getSnapAdjust(RECT *r)
+{
+ if (!r) return ;
+ r->left = snap_adjust_left;
+ r->top = snap_adjust_top;
+ r->right = snap_adjust_right;
+ r->bottom = snap_adjust_bottom;
+}
+
+int Layout::abortSaving()
+{
+ GuiObject *o = getGuiObject();
+ if (o->guiobject_movingToTarget()) return 1;
+ return 0;
+}
+
+void Layout::setNoOffscreenCheck(int nocheck)
+{
+ killTimer(TIMER_OFFSCREENCHECK);
+
+ if (nocheck != -1) nooffscreencheck = nocheck;
+
+ setTimer(TIMER_OFFSCREENCHECK, 2500);
+}
+
+#ifdef USEAPPBAR
+
+void Layout::onDock(int side)
+{
+ script_vcpu_onDock(SCRIPT_CALL, getScriptObject(), MAKE_SCRIPT_INT(side));
+}
+
+void Layout::onUnDock()
+{
+ script_vcpu_onUndock(SCRIPT_CALL, getScriptObject());
+}
+
+void Layout::appbar_onDock(int side)
+{
+ onDock(side);
+ savePosition();
+}
+
+void Layout::appbar_onUnDock()
+{
+ onUnDock();
+ savePosition();
+}
+
+void Layout::appbar_onSlide()
+{
+ savePosition();
+}
+
+int Layout::getAppBarAutoHide()
+{
+ return appbar_want_autohide;
+}
+
+void Layout::setAppBarAutoHide(int ah)
+{
+ appbar_want_autohide = ah;
+ if (appbar_isDocked()) appbar_updateAutoHide();
+ savePosition();
+}
+
+int Layout::getAppBarAlwaysOnTop()
+{
+ return appbar_want_alwaysontop;
+}
+
+void Layout::setAppBarAlwaysOnTop(int aot)
+{
+ appbar_want_alwaysontop = aot;
+ if (appbar_isDocked()) appbar_updateAlwaysOnTop();
+ savePosition();
+}
+#endif
+
+
+// ------------------------------------------------------------------------
+
+LayoutScriptController _layoutController;
+LayoutScriptController *layoutController = &_layoutController;
+
+// -- Functions table -------------------------------------
+function_descriptor_struct LayoutScriptController::exportedFunction[] = {
+ {L"onDock", 1, (void*)Layout::script_vcpu_onDock },
+ {L"onUndock", 0, (void*)Layout::script_vcpu_onUndock },
+ {L"getScale", 0, (void*)Layout::script_vcpu_getScale },
+ {L"setScale", 1, (void*)Layout::script_vcpu_setScale },
+ {L"onScale", 1, (void*)Layout::script_vcpu_onScale },
+ {L"setDesktopAlpha", 1, (void*)Layout::script_vcpu_setDesktopAlpha },
+ {L"getDesktopAlpha", 0, (void*)Layout::script_vcpu_getDesktopAlpha },
+ {L"isTransparencySafe", 0, (void*)Layout::script_vcpu_isTransparencySafe},
+ {L"isLayoutAnimationSafe", 0, (void*)Layout::script_vcpu_isLayoutAnimationSafe},
+ {L"getContainer", 0, (void*)Layout::script_vcpu_getContainer },
+ {L"center", 0, (void*)Layout::script_vcpu_center},
+ {L"onMove", 0, (void*)Layout::script_vcpu_onMove},
+ {L"onEndMove", 0, (void*)Layout::script_vcpu_onEndMove},
+ {L"snapAdjust", 4, (void*)Layout::script_vcpu_snapAdjust},
+ {L"getSnapAdjustTop", 0, (void*)Layout::script_vcpu_getSnapAdjustTop},
+ {L"getSnapAdjustLeft", 0, (void*)Layout::script_vcpu_getSnapAdjustLeft},
+ {L"getSnapAdjustRight", 0, (void*)Layout::script_vcpu_getSnapAdjustRight},
+ {L"getSnapAdjustBottom", 0, (void*)Layout::script_vcpu_getSnapAdjustBottom},
+ {L"onUserResize", 4, (void*)Layout::script_vcpu_onUserResize},
+ {L"setRedrawOnResize", 1, (void*)Layout::script_vcpu_setRedrawOnResize},
+ {L"beforeRedock", 0, (void*)Layout::script_vcpu_beforeRedock},
+ {L"redock", 0, (void*)Layout::script_vcpu_redock},
+ {L"onMouseEnterLayout", 0, (void*)Layout::script_vcpu_onMouseEnterLayout},
+ {L"onMouseLeaveLayout", 0, (void*)Layout::script_vcpu_onMouseLeaveLayout},
+ {L"onSnapAdjustChanged", 0, (void*)Layout::script_vcpu_onSnapAdjustChanged},
+ };
+// --------------------------------------------------------
+
+
+const wchar_t *LayoutScriptController::getClassName()
+{
+ return L"Layout";
+}
+
+const wchar_t *LayoutScriptController::getAncestorClassName()
+{
+ return L"Group";
+}
+
+int LayoutScriptController::getInstantiable()
+{
+ return 1;
+}
+
+ScriptObject *LayoutScriptController::instantiate()
+{
+ Layout *l = new Layout;
+ return l->getScriptObject();
+}
+
+void LayoutScriptController::destroy(ScriptObject *o)
+{
+ Group *g = static_cast<Group *>(o->vcpu_getInterface(groupGuid));
+ if (g && GroupMgr::hasGroup(g))
+ {
+ GroupMgr::destroy(g);
+ return ;
+ }
+ ASSERTALWAYS("you cannot destroy a static layout");
+}
+
+void *LayoutScriptController::encapsulate(ScriptObject *o)
+{
+ return NULL;
+}
+
+void LayoutScriptController::deencapsulate(void *o)
+{}
+
+int LayoutScriptController::getNumFunctions()
+{
+ return sizeof(exportedFunction) / sizeof(function_descriptor_struct);
+}
+
+const function_descriptor_struct *LayoutScriptController::getExportedFunctions()
+{
+ return exportedFunction;
+}
+
+GUID LayoutScriptController::getClassGuid()
+{
+ return layoutGuid;
+}
+
+// -------------------------------------------------------------------------
+
+scriptVar Layout::script_vcpu_onDock(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar side)
+{
+ SCRIPT_FUNCTION_INIT;
+ PROCESS_HOOKS1(o, layoutController, side);
+ SCRIPT_FUNCTION_CHECKABORTEVENT;
+ SCRIPT_EXEC_EVENT1(o, side);
+}
+
+scriptVar Layout::script_vcpu_onUndock(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT;
+ PROCESS_HOOKS0(o, layoutController);
+ SCRIPT_FUNCTION_CHECKABORTEVENT;
+ SCRIPT_EXEC_EVENT0(o);
+}
+
+scriptVar Layout::script_vcpu_getScale(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ double r = 0;
+ Layout *l = static_cast<Layout *>(o->vcpu_getInterface(layoutGuid));
+ if (l) r = l->getRenderRatio();
+ return MAKE_SCRIPT_DOUBLE(r);
+}
+
+scriptVar Layout::script_vcpu_setScale(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar s)
+{
+ SCRIPT_FUNCTION_INIT
+ double a = GET_SCRIPT_DOUBLE(s);
+ Layout *l = static_cast<Layout *>(o->vcpu_getInterface(layoutGuid));
+ if (l) l->setRenderRatio(a);
+ RETURN_SCRIPT_VOID;
+}
+
+scriptVar Layout::script_vcpu_onScale(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar s)
+{
+ SCRIPT_FUNCTION_INIT;
+ PROCESS_HOOKS1(o, layoutController, s);
+ SCRIPT_FUNCTION_CHECKABORTEVENT;
+ SCRIPT_EXEC_EVENT1(o, s);
+}
+
+scriptVar Layout::script_vcpu_setDesktopAlpha(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar s)
+{
+ SCRIPT_FUNCTION_INIT
+ bool a = GET_SCRIPT_BOOLEAN(s);
+ Layout *l = static_cast<Layout *>(o->vcpu_getInterface(layoutGuid));
+ if (l) l->setWantDesktopAlpha(a);
+ RETURN_SCRIPT_VOID;
+}
+
+scriptVar Layout::script_vcpu_getDesktopAlpha(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ Layout *l = static_cast<Layout *>(o->vcpu_getInterface(layoutGuid));
+ if (l) return MAKE_SCRIPT_BOOLEAN(l->wantDesktopAlpha() && l->isDesktopAlphaSafe());
+ RETURN_SCRIPT_ZERO;
+}
+
+scriptVar Layout::script_vcpu_isTransparencySafe(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ Layout *l = static_cast<Layout *>(o->vcpu_getInterface(layoutGuid));
+ if (l) return MAKE_SCRIPT_BOOLEAN(l->isTransparencySafe());
+ RETURN_SCRIPT_ZERO;
+}
+
+scriptVar Layout::script_vcpu_isLayoutAnimationSafe(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ Layout *l = static_cast<Layout *>(o->vcpu_getInterface(layoutGuid));
+ if (l) return MAKE_SCRIPT_BOOLEAN(!l->forceTransparencyFlag() && (l->getAlphaMgr()->getAlpha(l) == 255));
+ RETURN_SCRIPT_ZERO;
+}
+
+scriptVar Layout::script_vcpu_getContainer(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ Layout *l = static_cast<Layout *>(o->vcpu_getInterface(layoutGuid));
+ if (l)
+ {
+ Container *c = l->getParentContainer();
+ return MAKE_SCRIPT_OBJECT(c ? c->getScriptObject() : NULL);
+ }
+ return MAKE_SCRIPT_OBJECT(NULL);
+}
+
+scriptVar Layout::script_vcpu_center(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ Layout *l = static_cast<Layout *>(o->vcpu_getInterface(layoutGuid));
+ if (l) l->center();
+ RETURN_SCRIPT_VOID;
+}
+
+scriptVar Layout::script_vcpu_setRedrawOnResize(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar v)
+{
+ SCRIPT_FUNCTION_INIT
+ Layout *l = static_cast<Layout *>(o->vcpu_getInterface(layoutGuid));
+ if (l) l->setWantRedrawOnResize(GET_SCRIPT_INT(v));
+ RETURN_SCRIPT_VOID;
+}
+
+scriptVar Layout::script_vcpu_beforeRedock(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ Layout *l = static_cast<Layout *>(o->vcpu_getInterface(layoutGuid));
+ if (l) windowTracker->beforeRedock(l, &l->redock);
+ RETURN_SCRIPT_VOID;
+}
+
+scriptVar Layout::script_vcpu_redock(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ Layout *l = static_cast<Layout *>(o->vcpu_getInterface(layoutGuid));
+ if (l) windowTracker->afterRedock(l, &l->redock);
+ RETURN_SCRIPT_VOID;
+}
+
+scriptVar Layout::script_vcpu_onEndMove(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT;
+ PROCESS_HOOKS0(o, layoutController);
+ SCRIPT_FUNCTION_CHECKABORTEVENT;
+ SCRIPT_EXEC_EVENT0(o);
+}
+
+scriptVar Layout::script_vcpu_onMouseEnterLayout(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT;
+ PROCESS_HOOKS0(o, layoutController);
+ SCRIPT_FUNCTION_CHECKABORTEVENT;
+ SCRIPT_EXEC_EVENT0(o);
+}
+
+scriptVar Layout::script_vcpu_onMouseLeaveLayout(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT;
+ PROCESS_HOOKS0(o, layoutController);
+ SCRIPT_FUNCTION_CHECKABORTEVENT;
+ SCRIPT_EXEC_EVENT0(o);
+}
+
+scriptVar Layout::script_vcpu_onSnapAdjustChanged(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT;
+ PROCESS_HOOKS0(o, layoutController);
+ SCRIPT_FUNCTION_CHECKABORTEVENT;
+ SCRIPT_EXEC_EVENT0(o);
+}
+
+scriptVar Layout::script_vcpu_onUserResize(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar x, scriptVar y, scriptVar w, scriptVar h)
+{
+ SCRIPT_FUNCTION_INIT;
+ PROCESS_HOOKS4(o, layoutController, x, y, w, h);
+ SCRIPT_FUNCTION_CHECKABORTEVENT;
+ SCRIPT_EXEC_EVENT4(o, x, y, w, h);
+}
+
+scriptVar Layout::script_vcpu_onMove(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT;
+ PROCESS_HOOKS0(o, layoutController);
+ SCRIPT_FUNCTION_CHECKABORTEVENT;
+ SCRIPT_EXEC_EVENT0(o);
+}
+
+scriptVar Layout::script_vcpu_snapAdjust(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar left, scriptVar top, scriptVar right, scriptVar bottom)
+{
+ SCRIPT_FUNCTION_INIT
+ Layout *l = static_cast<Layout *>(o->vcpu_getInterface(layoutGuid));
+ if (l) l->snapAdjust(GET_SCRIPT_INT(left), GET_SCRIPT_INT(top), GET_SCRIPT_INT(right), GET_SCRIPT_INT(bottom));
+ RETURN_SCRIPT_VOID;
+}
+
+scriptVar Layout::script_vcpu_getSnapAdjustLeft(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ Layout *l = static_cast<Layout *>(o->vcpu_getInterface(layoutGuid));
+ if (l)
+ {
+ RECT r;
+ l->getSnapAdjust(&r);
+ return MAKE_SCRIPT_INT(r.left);
+ }
+ RETURN_SCRIPT_VOID;
+}
+
+scriptVar Layout::script_vcpu_getSnapAdjustTop(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ Layout *l = static_cast<Layout *>(o->vcpu_getInterface(layoutGuid));
+ if (l)
+ {
+ RECT r;
+ l->getSnapAdjust(&r);
+ return MAKE_SCRIPT_INT(r.top);
+ }
+ RETURN_SCRIPT_VOID;
+}
+
+scriptVar Layout::script_vcpu_getSnapAdjustRight(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ Layout *l = static_cast<Layout *>(o->vcpu_getInterface(layoutGuid));
+ if (l)
+ {
+ RECT r;
+ l->getSnapAdjust(&r);
+ return MAKE_SCRIPT_INT(r.right);
+ }
+ RETURN_SCRIPT_VOID;
+}
+
+scriptVar Layout::script_vcpu_getSnapAdjustBottom(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT
+ Layout *l = static_cast<Layout *>(o->vcpu_getInterface(layoutGuid));
+ if (l)
+ {
+ RECT r;
+ l->getSnapAdjust(&r);
+ return MAKE_SCRIPT_INT(r.bottom);
+ }
+ RETURN_SCRIPT_VOID;
+}
+
+int Layout::broadcasting = 0;
+
+StringW Layout::MakePrefix()
+{
+ return StringPrintfW(L"Skin:%s/Container:%s/Layout:%s", WASABI_API_SKIN->getSkinName(), getParentContainer()->getDescriptor(), getGuiObject()->guiobject_getId());
+} \ No newline at end of file