123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586 |
- #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());
- }
|