From e5c0a362d763e14dc9d59a75ae2a043895c983f7 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Fri, 26 Jun 2015 04:54:22 -0400 Subject: [PATCH 01/17] Clean up stupidity in floatertools --- indra/newview/llfloatertools.cpp | 14 ++++---------- indra/newview/llfloatertools.h | 1 + 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 8b52de9c5..5087b89e8 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -112,7 +112,6 @@ const std::string PANEL_NAMES[LLFloaterTools::PANEL_COUNT] = // Local prototypes void commit_grid_mode(LLUICtrl *ctrl); -void commit_select_component(void *data); void click_show_more(void*); void click_popup_info(void*); void click_popup_done(void*); @@ -444,7 +443,7 @@ LLFloaterTools::LLFloaterTools() mCommitCallbackRegistrar.add("BuildTool.commitRadioEdit", boost::bind(&commit_radio_group_edit,_1)); mCommitCallbackRegistrar.add("BuildTool.gridMode", boost::bind(&commit_grid_mode,_1)); - mCommitCallbackRegistrar.add("BuildTool.selectComponent", boost::bind(&commit_select_component, this)); + mCommitCallbackRegistrar.add("BuildTool.selectComponent", boost::bind(&LLFloaterTools::commitSelectComponent, this, _2)); mCommitCallbackRegistrar.add("BuildTool.gridOptions", boost::bind(&LLFloaterTools::onClickGridOptions,this)); mCommitCallbackRegistrar.add("BuildTool.applyToSelection", boost::bind(&click_apply_to_selection, this)); mCommitCallbackRegistrar.add("BuildTool.commitRadioLand", boost::bind(&commit_radio_group_land,_1)); @@ -1155,19 +1154,14 @@ void commit_radio_group_land(LLUICtrl* ctrl) } } -void commit_select_component(void *data) +void LLFloaterTools::commitSelectComponent(bool select_individuals) { - LLFloaterTools* floaterp = (LLFloaterTools*)data; - //forfeit focus - if (gFocusMgr.childHasKeyboardFocus(floaterp)) + if (gFocusMgr.childHasKeyboardFocus(this)) { gFocusMgr.setKeyboardFocus(NULL); } - - BOOL select_individuals = floaterp->mCheckSelectIndividual->get(); - gSavedSettings.setBOOL("EditLinkedParts", select_individuals); - floaterp->dirty(); + dirty(); if (select_individuals) { diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h index 73c13f558..9029ba17c 100644 --- a/indra/newview/llfloatertools.h +++ b/indra/newview/llfloatertools.h @@ -122,6 +122,7 @@ private: void updateMediaSettings(); static bool deleteMediaConfirm(const LLSD& notification, const LLSD& response); static bool multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response); + void commitSelectComponent(bool select_individuals); static void setObjectType( LLPCode pcode ); void onClickGridOptions(); From c6672b33472433ab013100dc0a4b1611d81cb1ee Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Fri, 26 Jun 2015 21:38:34 -0400 Subject: [PATCH 02/17] Address Issue 1954: OnlineStatus in groups general tab (with OpenSimulator) --- indra/newview/llgroupmgr.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 7bde0c67e..028060358 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -952,6 +952,8 @@ static void formatDateString(std::string &date_string) using namespace boost; cmatch result; const regex expression("([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})"); + try + { if (regex_match(date_string.c_str(), result, expression)) { // convert matches to integers so that we can pad them with zeroes on Linux @@ -962,6 +964,11 @@ static void formatDateString(std::string &date_string) // ISO 8601 date format date_string = llformat("%04d-%02d-%02dT00:00:00Z", year, month, day); } + } + catch(...) + { + LL_ERRS() << "Decode of non-compliant DateTime format from [GroupMembersReply.GroupData.MemberData.OnlineStatus]. Please notify grid operators of this defect." << LL_ENDL; + } } const std::string& localized_online() From d8389e6fa7cfdfb9f29eb27282a9bd11f26f41d2 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Sun, 28 Jun 2015 10:04:06 -0400 Subject: [PATCH 03/17] Don't be retarded, LL. Thanks to Drake Arconis for pointing this out. --- indra/newview/llpanelobject.cpp | 41 ------------------------------ indra/newview/llpanelobject.h | 1 - indra/newview/llpanelvolume.cpp | 45 --------------------------------- indra/newview/llpanelvolume.h | 1 - 4 files changed, 88 deletions(-) diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index 7bf6f9bc0..83eef9a2c 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -2257,47 +2257,6 @@ void LLPanelObject::draw() LLPanel::draw(); } -// virtual -void LLPanelObject::clearCtrls() -{ - LLPanel::clearCtrls(); - - mCheckLock ->set(FALSE); - mCheckLock ->setEnabled( FALSE ); - mCheckPhysics ->set(FALSE); - mCheckPhysics ->setEnabled( FALSE ); - mCheckTemporary ->set(FALSE); - mCheckTemporary ->setEnabled( FALSE ); - mCheckPhantom ->set(FALSE); - mCheckPhantom ->setEnabled( FALSE ); - mComboMaterial ->setEnabled( FALSE ); - mLabelMaterial ->setEnabled( FALSE ); - // Disable text labels - mLabelPosition ->setEnabled( FALSE ); - mLabelSize ->setEnabled( FALSE ); - mLabelRotation ->setEnabled( FALSE ); - mLabelBaseType ->setEnabled( FALSE ); - mLabelCut ->setEnabled( FALSE ); - mLabelHollow ->setEnabled( FALSE ); - mLabelHoleType ->setEnabled( FALSE ); - mLabelTwist ->setEnabled( FALSE ); - mLabelSkew ->setEnabled( FALSE ); - mLabelShear ->setEnabled( FALSE ); - mLabelTaper ->setEnabled( FALSE ); - mLabelRadiusOffset->setEnabled( FALSE ); - mLabelRevolutions->setEnabled( FALSE ); - - childSetVisible("select_single", FALSE); - childSetVisible("edit_object", TRUE); - childSetEnabled("edit_object", FALSE); - - childSetEnabled("scale_hole", FALSE); - childSetEnabled("scale_taper", FALSE); - childSetEnabled("advanced_cut", FALSE); - childSetEnabled("advanced_dimple", FALSE); - childSetVisible("advanced_slice", FALSE); -} - // // Static functions // diff --git a/indra/newview/llpanelobject.h b/indra/newview/llpanelobject.h index 675a93053..e98808747 100644 --- a/indra/newview/llpanelobject.h +++ b/indra/newview/llpanelobject.h @@ -63,7 +63,6 @@ public: virtual BOOL postBuild(); virtual void draw(); - virtual void clearCtrls(); void refresh(); diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp index b5fade37a..ab3feb724 100644 --- a/indra/newview/llpanelvolume.cpp +++ b/indra/newview/llpanelvolume.cpp @@ -512,51 +512,6 @@ void LLPanelVolume::draw() LLPanel::draw(); } -// virtual -void LLPanelVolume::clearCtrls() -{ - LLPanel::clearCtrls(); - - getChildView("select_single")->setEnabled(false); - getChildView("select_single")->setVisible(true); - getChildView("edit_object")->setEnabled(false); - getChildView("edit_object")->setVisible(false); - getChildView("Light Checkbox Ctrl")->setEnabled(false); - getChildView("label color")->setEnabled(false); - LLColorSwatchCtrl* LightColorSwatch = getChild("colorswatch"); - if(LightColorSwatch) - { - LightColorSwatch->setEnabled( FALSE ); - LightColorSwatch->setValid( FALSE ); - } - childSetEnabled("label texture",false); - LLTextureCtrl* LightTextureCtrl = getChild("light texture control"); - if(LightTextureCtrl) - { - LightTextureCtrl->setEnabled( FALSE ); - LightTextureCtrl->setValid( FALSE ); - } - - getChildView("Light Intensity")->setEnabled(false); - getChildView("Light Radius")->setEnabled(false); - getChildView("Light Falloff")->setEnabled(false); - - getChildView("Flexible1D Checkbox Ctrl")->setEnabled(false); - getChildView("FlexNumSections")->setEnabled(false); - getChildView("FlexGravity")->setEnabled(false); - getChildView("FlexTension")->setEnabled(false); - getChildView("FlexFriction")->setEnabled(false); - getChildView("FlexWind")->setEnabled(false); - getChildView("FlexForceX")->setEnabled(false); - getChildView("FlexForceY")->setEnabled(false); - getChildView("FlexForceZ")->setEnabled(false); - - mSpinPhysicsGravity->setEnabled(FALSE); - mSpinPhysicsFriction->setEnabled(FALSE); - mSpinPhysicsDensity->setEnabled(FALSE); - mSpinPhysicsRestitution->setEnabled(FALSE); -} - // // Static functions // diff --git a/indra/newview/llpanelvolume.h b/indra/newview/llpanelvolume.h index b82fc3916..e81f43052 100644 --- a/indra/newview/llpanelvolume.h +++ b/indra/newview/llpanelvolume.h @@ -53,7 +53,6 @@ public: virtual ~LLPanelVolume(); virtual void draw(); - virtual void clearCtrls(); virtual BOOL postBuild(); From 5e71af2ed7093b5ef9342bb12643033639bde3ff Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Mon, 29 Jun 2015 08:34:24 -0400 Subject: [PATCH 04/17] control_name here caused the server to be spammed and throttle us. --- .../skins/default/xui/en-us/wlfPanel_AdvSettings_expanded.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en-us/wlfPanel_AdvSettings_expanded.xml b/indra/newview/skins/default/xui/en-us/wlfPanel_AdvSettings_expanded.xml index 8e4c2d3f9..4f63d8917 100644 --- a/indra/newview/skins/default/xui/en-us/wlfPanel_AdvSettings_expanded.xml +++ b/indra/newview/skins/default/xui/en-us/wlfPanel_AdvSettings_expanded.xml @@ -12,7 +12,7 @@ - + From a4e732da5f5890fb1e3f30a41feb46be7177431c Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Wed, 15 Jul 2015 21:51:48 -0400 Subject: [PATCH 05/17] [Radar] Stylistic opts. --- indra/newview/llfloateravatarlist.cpp | 57 ++++++++----------- .../skins/default/xui/en-us/floater_radar.xml | 2 +- 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/indra/newview/llfloateravatarlist.cpp b/indra/newview/llfloateravatarlist.cpp index 738a260de..45fe720cd 100644 --- a/indra/newview/llfloateravatarlist.cpp +++ b/indra/newview/llfloateravatarlist.cpp @@ -88,22 +88,22 @@ namespace static LLCachedControl radar_alert_chat_range(gSavedSettings, "RadarAlertChatRange"); static LLCachedControl radar_alert_age(gSavedSettings, "RadarAlertAge"); - LLFloaterAvatarList* self = LLFloaterAvatarList::getInstance(); + LLFloaterAvatarList& inst(LLFloaterAvatarList::instance()); LLStringUtil::format_map_t args; LLChat chat; switch(type) { - case STAT_TYPE_SIM: if (radar_alert_sim) args["[RANGE]"] = self->getString("the_sim"); break; - case STAT_TYPE_DRAW: if (radar_alert_draw) args["[RANGE]"] = self->getString("draw_distance"); break; - case STAT_TYPE_SHOUTRANGE: if (radar_alert_shout_range) args["[RANGE]"] = self->getString("shout_range"); break; - case STAT_TYPE_CHATRANGE: if (radar_alert_chat_range) args["[RANGE]"] = self->getString("chat_range"); break; - case STAT_TYPE_AGE: if (radar_alert_age) chat.mText = name + " " + self->getString("has_triggered_your_avatar_age_alert") + "."; break; + case STAT_TYPE_SIM: if (radar_alert_sim) args["[RANGE]"] = inst.getString("the_sim"); break; + case STAT_TYPE_DRAW: if (radar_alert_draw) args["[RANGE]"] = inst.getString("draw_distance"); break; + case STAT_TYPE_SHOUTRANGE: if (radar_alert_shout_range) args["[RANGE]"] = inst.getString("shout_range"); break; + case STAT_TYPE_CHATRANGE: if (radar_alert_chat_range) args["[RANGE]"] = inst.getString("chat_range"); break; + case STAT_TYPE_AGE: if (radar_alert_age) chat.mText = name + " " + inst.getString("has_triggered_your_avatar_age_alert") + "."; break; default: llassert(type); break; } args["[NAME]"] = name; - args["[ACTION]"] = self->getString(entering ? "has_entered" : "has_left"); + args["[ACTION]"] = inst.getString(entering ? "has_entered" : "has_left"); if (args.find("[RANGE]") != args.end()) - chat.mText = self->getString("template", args); + chat.mText = inst.getString("template", args); else if (chat.mText.empty()) return; if (entering) // Note: If we decide to make this for leaving as well, change this check to dist != F32_MIN { @@ -138,13 +138,14 @@ LLAvatarListEntry::LLAvatarListEntry(const LLUUID& id, const std::string& name, mActivityType(ACTIVITY_NEW), mActivityTimer(), mIsInList(false), mAge(-1), mTime(time(NULL)) { - LLAvatarPropertiesProcessor::getInstance()->addObserver(mID, this); - LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesRequest(mID); + LLAvatarPropertiesProcessor& inst(LLAvatarPropertiesProcessor::instance()); + inst.addObserver(mID, this); + inst.sendAvatarPropertiesRequest(mID); } LLAvatarListEntry::~LLAvatarListEntry() { - LLAvatarPropertiesProcessor::getInstance()->removeObserver(mID, this); + LLAvatarPropertiesProcessor::instance().removeObserver(mID, this); } // virtual @@ -152,7 +153,8 @@ void LLAvatarListEntry::processProperties(void* data, EAvatarProcessorType type) { if (type == APT_PROPERTIES) { - LLAvatarPropertiesProcessor::getInstance()->removeObserver(mID, this); + LLAvatarPropertiesProcessor& inst(LLAvatarPropertiesProcessor::instance()); + inst.removeObserver(mID, this); const LLAvatarData* pAvatarData = static_cast(data); if (pAvatarData && (pAvatarData->avatar_id != LLUUID::null)) { @@ -166,8 +168,8 @@ void LLAvatarListEntry::processProperties(void* data, EAvatarProcessorType type) catch(const std::exception&) { LL_WARNS() << "Failed to extract age from APT_PROPERTIES for " << mID << ", received \"" << pAvatarData->born_on << "\". Requesting properties again." << LL_ENDL; - LLAvatarPropertiesProcessor::getInstance()->addObserver(mID, this); - LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesRequest(mID); + inst.addObserver(mID, this); + inst.sendAvatarPropertiesRequest(mID); return; } if (!mStats[STAT_TYPE_AGE] && mAge >= 0) //Only announce age once per entry. @@ -210,7 +212,7 @@ void LLAvatarListEntry::resetName(const bool& hide_tags, const bool& anon_names, const F32 ACTIVITY_TIMEOUT = 1.0f; void LLAvatarListEntry::setActivity(ACTIVITY_TYPE activity) { - if ( activity >= mActivityType || mActivityTimer.getElapsedTimeF32() > ACTIVITY_TIMEOUT ) + if (activity >= mActivityType || mActivityTimer.getElapsedTimeF32() > ACTIVITY_TIMEOUT) { mActivityType = activity; mActivityTimer.start(); @@ -266,20 +268,14 @@ void LLFloaterAvatarList::draw() void LLFloaterAvatarList::onOpen() { - gSavedSettings.setBOOL("ShowRadar", true); } void LLFloaterAvatarList::onClose(bool app_quitting) { - setVisible(false); - if (!app_quitting) - { - gSavedSettings.setBOOL("ShowRadar", false); - } - if (!gSavedSettings.getBOOL("RadarKeepOpen") || app_quitting) - { + if (app_quitting || !gSavedSettings.getBOOL("RadarKeepOpen")) destroy(); - } + else + setVisible(false); } BOOL LLFloaterAvatarList::handleRightMouseDown(S32 x, S32 y, MASK mask) @@ -906,8 +902,8 @@ void LLFloaterAvatarList::refreshAvatarList() agep.column = "age"; agep.type = "text"; color = sDefaultListText; - std::string age = boost::lexical_cast(entry->mAge); - if (entry->mAge > -1) + bool age_set(entry->mAge > -1); + if (age_set) { static const LLCachedControl sAvatarAgeAlertDays(gSavedSettings, "AvatarAgeAlertDays"); if ((U32)entry->mAge < sAvatarAgeAlertDays) @@ -916,11 +912,7 @@ void LLFloaterAvatarList::refreshAvatarList() color = sRadarTextYoung; } } - else - { - age = "?"; - } - agep.value = age; + agep.value = age_set ? boost::lexical_cast(entry->mAge) : "?"; agep.color = color; element.columns.add(agep); } @@ -981,7 +973,6 @@ void LLFloaterAvatarList::refreshAvatarList() mDirtyAvatarSorting = true; // LL_INFOS() << "radar refresh: done" << LL_ENDL; - } void LLFloaterAvatarList::resetAvatarNames() @@ -1042,7 +1033,7 @@ void LLFloaterAvatarList::onClickTrack() mTracking = true; mTrackedAvatar = agent_id; // trackAvatar only works for friends allowing you to see them on map... -// LLTracker::trackAvatar(agent_id, self->mAvatars[agent_id].getName()); +// LLTracker::trackAvatar(agent_id, mAvatars[agent_id].getName()); trackAvatar(getAvatarEntry(mTrackedAvatar)); } } diff --git a/indra/newview/skins/default/xui/en-us/floater_radar.xml b/indra/newview/skins/default/xui/en-us/floater_radar.xml index 0a930677b..79a4eb07f 100644 --- a/indra/newview/skins/default/xui/en-us/floater_radar.xml +++ b/indra/newview/skins/default/xui/en-us/floater_radar.xml @@ -1,5 +1,5 @@ - Radar From 0843505fae0e777720cc1b73c38bbeae454ee16e Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Wed, 15 Jul 2015 22:06:10 -0400 Subject: [PATCH 06/17] [Radar] When opening, refresh the avatar list gui Normally we cut back on refreshAvatarList calls to avoid work when not visible. When we reopen, there needs to be a call to refreshAvatarList so the user isn't waiting for position updates to see correct data. --- indra/newview/llfloateravatarlist.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/newview/llfloateravatarlist.cpp b/indra/newview/llfloateravatarlist.cpp index 45fe720cd..31205a3f8 100644 --- a/indra/newview/llfloateravatarlist.cpp +++ b/indra/newview/llfloateravatarlist.cpp @@ -268,6 +268,7 @@ void LLFloaterAvatarList::draw() void LLFloaterAvatarList::onOpen() { + if (mAvatars.size()) refreshAvatarList(); } void LLFloaterAvatarList::onClose(bool app_quitting) From 770f46157b48d19835761f0dc1ee5554fa5c5a65 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Wed, 15 Jul 2015 23:00:44 -0400 Subject: [PATCH 07/17] [Radar] Correct a flaw in which initialization of the avatar list would just be a refresh of the gui Without first populating the list, this was pretty much nothing doing, now the list will populate initially. Previously, it could be that opening and closing the radar (when not in announce even when closed mode) would yield an empty radar should the sim have been stingy or the connection been rather latent. --- indra/newview/llfloateravatarlist.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/indra/newview/llfloateravatarlist.cpp b/indra/newview/llfloateravatarlist.cpp index 31205a3f8..a4b1685a7 100644 --- a/indra/newview/llfloateravatarlist.cpp +++ b/indra/newview/llfloateravatarlist.cpp @@ -411,7 +411,10 @@ BOOL LLFloaterAvatarList::postBuild() mAvatarList->setCommitCallback(boost::bind(&LLFloaterAvatarList::onSelectName,this)); mAvatarList->setDoubleClickCallback(boost::bind(&LLFloaterAvatarList::onClickFocus,this)); mAvatarList->setSortChangedCallback(boost::bind(&LLFloaterAvatarList::onAvatarSortingChanged,this)); - refreshAvatarList(); + BOOST_FOREACH(LLViewerRegion* region, LLWorld::instance().getRegionList()) + { + updateAvatarList(region); + } assessColumns(); From f2e57d72ef67bb8c6e3e93fbe04c98718d01e759 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Wed, 15 Jul 2015 23:22:25 -0400 Subject: [PATCH 08/17] Change llavatarname.h to unicode to kill linker warnings when using Japanese codepage. Yeah, I've been playing those anime games lately... --- indra/llmessage/llavatarname.h | Bin 5387 -> 11078 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/indra/llmessage/llavatarname.h b/indra/llmessage/llavatarname.h index 5902d34d860b82188e095080f54fc0e75f0ad4ea..bf951dad083d21fcdd239f33bf3d2fe2104e9e4b 100644 GIT binary patch literal 11078 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 G>;C{eWdxi6 literal 5387 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 B`iB4j From 7ee66bebe2ab7a54b9e4e0c83cfe04ebc4ae8725 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Thu, 16 Jul 2015 15:16:46 -0400 Subject: [PATCH 09/17] More unicodification to fix JP --- indra/newview/chatbar_as_cmdline.cpp | Bin 23902 -> 49190 bytes indra/newview/chatbar_as_cmdline.h | Bin 1739 -> 3476 bytes indra/newview/jcfloaterareasearch.h | Bin 3138 -> 6274 bytes indra/newview/scriptcounter.cpp | Bin 7025 -> 14466 bytes indra/newview/scriptcounter.h | Bin 2663 -> 5324 bytes indra/newview/wlfPanel_AdvSettings.cpp | Bin 17211 -> 35462 bytes indra/newview/wlfPanel_AdvSettings.h | Bin 3221 -> 6440 bytes 7 files changed, 0 insertions(+), 0 deletions(-) diff --git a/indra/newview/chatbar_as_cmdline.cpp b/indra/newview/chatbar_as_cmdline.cpp index 025f4fa1f415ab85df3b7c1b3a7f3e68386de286..a81f6e66b70c5283885412395b5ceaef96a49e67 100644 GIT binary patch literal 49190 zcmeI5`Ep&yamMezOjX_if-4dv(V#@xDKD~9AV^wtxETN`%Zdv{5g^5g3yOe5leF^= zdEQhd`F``E(KBbc_W&RerIKQiy!YH$dhec|o;m;ZpOi2#9eL4F<|L)9Ik4B6cmS!8}mnUU3dVix?4)p(v*>jEXK>zOO z|L@B!a7sB$1zWE8W(SJ#Qzb*ZM2r9iO&^#CQ6OM;^ z3Z{%{+@W90_)Pr|X1_XWpZ%89>Qm8mJ{=kBg>dRpj#+^hyrD4Ag5!Z^Hl+jh2jUC( z(UxAV1hw!0(~_`xQE-7rP>+$|@{%ZEZU;Z7P-y+w-i9YaJV+F*fs&#(X81Y{!D?Vf*%rWqYWRZT&nq)(FbHDs$T6 zVT02O?hAX{tmIBYur>Q)c0>LGpK)h)eYQ3GQr==?c1=(G{I0&;ncdg7t9p7>&#%nB z(!aO#^y=*1>}F|C|F86SOKonI@z!RyOY3#DyRGLN8sUoCZ|VC+Y4Ov4XI^Ick53Y! z=*R!eb8Ys=88BQ^JKEEmUbpo0rv5ifhI&J=Fc(iZi(R{+@9S!JPq6U$cjc+!Skm`9 zYQ0p(xuxHM9t?r;VkI+B$rM>UD-d4S7`N18Lvw#|2-BLdzfoq|DtHB+*UP-O3&h}e z{Sd=7eZE_03qI>dlukI78L@`U|b#95CM0 zpT%4?^~ZRcuw5w-!5{FxS-vG^<}7f+*L6XG4+6fSXY2X}*#lbOr0u5grYGb3337t$ zAr(;KtI`g56Dq?Ewf-R5c|?z}q#4%KdrcC8>=1RGMt0yGdIR6U5iXe8NJm1nso$?? zK6t#P&q&~sV7Q|{R|_1bI52M%EnL^9&DpQj>Sp1*bpnaIr{~uS*5CrIpp^R?8q1n{ z`#GAhSunMJC1hX^G#mPJPuKtb#}Vg_3Yplhv=`G6E+sah>ae{rec39dhpFL_>Ky6+ET(`7{xPfKjQD=&oa!$NAZ&jQU*TEgl8f9tb){ z!m~!q!Rmn->M_P}qwQ0*o;F(xclH?@{ee~*j^d8f7ML7SKd9hZJjeH<+?08eV$dm~ z%bIUvbFs<_Nk9%B>pQEb#k0ODvCLEPcX8X@5?>Mf0$Z#t7Ri()m35wD=f(5x zvk*<0V~hK;1_m4A`91YIIFvY6K>_I)6^}!UY)eGDH(~Tgg6lHjJUBW=^6s7D|o|BHHKZCDQw86OV@IQ(3)F{KyuOD$R419*_7 zokH=)>dpFsZ>-lB_lK&iDUf+Edo8JVe&FeZ-b4I3PJi-5*m1b?OgcS}#vRzO5oDHFeb(M-TYP0D2*+YBa(P%o zXLI;>N13BvmG5r*c=o7NL%FQwu{~JnsmF!Exg&) z@4wMs*2{b&zPLX7Oqs?dwZU$EukoJB?_wp;Dptwv^OJg0Vf*w2`Ykcg>75%+^NTU_uQI8ii^PKZ3)g2d#5x*P^(96&F59NKz z=+pQR9LkX|%`PccPM@-S+2i zNBZHcF454^?Dtwb{7DdEy|F02(%(Ie@r|$|PtS^s3_$45mYzCdV@}I%-QJn>3!QPh zddzI!%|0(<&zHZDkdJ1+6)ac-_r=<^wgrmwdu<1a+?*R^+oC;@T_>VhKC+37M4QCK+MVCct!NimxmA3NHs)PJo+>aX@b5j_?rL?*A7+4N#J#AX(9tqxd{Gd_IpJ@`t=zagYA_GVYReY@ZuX(#s0@kH}p%`1$&(?o)?d1 zzgRSH@z`Xt$-0rd+1A|7tc9ygibKb{5;J^x;9XX*xZ{YlOuOOJ8Hrg>9OrItxpm^sz0uC5~s-rLJti z=2G8)okIT}E6YCCHmP}`#8SlDNMmh(H`P1hFz2i?w#SZn-R-F8rDmjm-RG7dcv-Al zSeEe7WK4I9l}QU)_w;N?6Th<`N!ILn=}|+DpJJ`{-WksB$P-w8J^NUHJYz^NmaXQH zc~s+aTUH9Wzz?%;%V+avMbBci7Aq)O$8a@Q7^n7p9xFypde(gmy=5ARFUab6Rf`Q} zjX`9(BP!M-=U6w7T7`FL;bkqfqW)NiUHKSWQe-hb`%1CbIam6L;eJW?n$}%vUl^Iy z_Lg-dtN#|u);~jy*2YKPAy>qvF{={R9aPgetFS!#2R->q_3v_Ljgd6mJfySbepO@K zpM9;rf1LgK*nPe_L7zXVPapFsc5RqC#77(AcC7l|Kk^X~CB-lOS#71D4f67;W2df* zy3DyEN%BrN`?2iGZa4NRVy;EwlLNhSCI5fpN&7){*kuEOO@GcEEB@?0N^X3T|yLcq$ zecH59^nTHaouV69RqCwpqOC7Zi(Fgfn%BqGjH{XheSFjCNFUmy1T*}EH19<{44aG_2~D)Qozssf}S+H~RUiqD}mo_X5d)rnWkII;mCOI-G+&)7(WiHZl9@ zd2+Xm&dTsWYkuT_JnltR-oD$hZ)@adB|3kp(c9I&>2y+Cb5>rX9{0E&t>x5jVqcX8GNIr#iA;wR%f6mQ4aj96zKaxV`J|3UJ*s~M?ZX2s~p z{B425eyqE4xlwwdO@c z;t3RYeH*h<_x3_#?yLU?8i6W$Ltx&#){{JY!Z*`3<|6kLvq5#&#M|>`{k?aQ*fEPb z_75t!J}44mXnqj?*ncx_j)SO32P#gqP2P8B(MxN|g)d*V}hrI|!H9eu6 zcbuRS*3Gb(0-TDWwfFxG7c}6cN#fJm<{>y)ArL?1nV+a{XH57GT;6*KDz&su+!Dsj z6`QBbKt%&QL@(jZBgqF(pGr~;!B&={(0C=PxblPwkQe$ElxaB)4*eYd@>9_*vjn_9G-skPEma$eZOey(p{mUBtjzJ2AsplTn+Rn5GA zXtgb?_+9)u6-Vfs{csmTuQ?7>U$R-%nDl$5gjhb(gBq)C!OgtLBDTYM%9Np6E_`|p zowWaeKh6k%8>b1}e@nFI{0#W|Q%g_A^xE&C+E^EDnej@k&G=mUh zp;`=`1O65HkWGz?)bHpMQLNXQkJSeVm&N_D-gR}r@!%V#)gox`3M(R(MKI5Y+M}E| z?B11rC7*9Uz$)1LGpEC5Y~1t0Z%Z;m3`Xq&US~`Hv-)^;Vm^(JcwRV#cGx0!mnFJ<92%uO02YafxUf?|E8G>aornk1xcJSnHe?k9w^0#-ppb zUr2L^6;6xO*tqA7pELh=W$*CB5xJZeyWvsK8#iiB_losCEj~HY$#Iw(zvNt4R=m*E z7@>`8#>P201}BSf@SL3bIxP=kob!f%OZ2~dYUn-6dBeV5;uzLL5tE;u3q(fsh-ZV- zW{Kt>Yn|Ih_iM_ZaNEE%JQj^|zOZ8z;}jn&l+$9-AMbqep*Hm9DLLUW&IWGivo9*M zDxq?gYI#1DjCjA{#>LrK{~eeMb`ZdH0T`-P+p7@e=8cFgCvov+HVYWPf{?wHgi zvf_uHres^cHr&hA(~Dr4#|=jsKVC3|3uziB$-DPagS!zIjKp{v}U1sca)l~F2W#p4%hlkGEe znUL{m7>4|xjhQQ;Li+q8E<)7Ui_{$BrDe~yzG*kdYryLRmK7HKRO*y=*7 z1=x7@t2i6;KsGq?lP%VUIPFxob*pRb3~+8d$LyV1cG9txS?}sSb*h$#$H}+v9qtG8 z=WbzbCB?Z&R~aFJ5B0t#>b%UysanqgweLX z-Owq;YwCkdL$*h9!2qDv9sBF zaOd1xY`gZX_Hk}M-=ZN`BfQMc|Q9)w9u1FiPJpN|**qeJ_Pum^X z7V4o`@LkO7>>Qd5jJ_e0m|@XgG%#|<2y(y)c7 zo#n@;CG8H(JPjGPyp~w<*+^KeD^%h{goD)J<8I4maq}M*WJ&dopX=Xc`R7~mDbzDv zE1r*=$UZ5*M4N7`6Fuo2ZQw(|5&LcNo9E|lw5x)ov6_)`SjR5kar~tWzEg1 zEHODtY`xN`EgiX*y(8P#(#96Yrw*eJI!iSRH=^wx^<%A(^sj9UIMy??GKPe_?ZhWP zrdSEP5EVpxiVO)pVo!3*NzUJhcfXf+Bo_89IPd96my(N4h7!@a7CY9@?P-+y6ls6# zwu<{Wr?obP3EVu8W^jkbu5@$J`0w^aN`0bc`uT}m!Miq}dd7Sft9pJLidT@kq}lXY zsd4F^*&3d?-*Pb=$2;wFL-NKh;(UGuZu8HG1n;Ac2p_v5?f!*E_o;!UqNVLhqEADl zDRhL@7dkU^MzED_W=nmVkI(UFv{hu=k_ z|Fcew`q-92$WDKx)2`&w`@1%ooinf9mJaIyvy!fh*|aLUA*j!Cop;jsua48|&u6#t zi*-s}Inw&Zw~b#UhPf{piRw}^jhW^2dM!Lh-wt-ybJ?OVS@%ljt{xrPjO^<89Ca&3 z9nUhhl01Z&eUkOou-Dm4KWX!bU0TGi&K)wxm$H?<-7?ok*idX#WH175{2=EYxJPeS zeVrw(cYJCJcISqVi*P)<{BC#dJ>k*MBL8p6-nP~fEA+1Nw(xjS#`b(|K`meNY(eY{ z4ebck`$6o{)E>LFC_}prwbon9#`WF5kL~8P^3QD+><852*Y;w3mbz7Fr|m*_@1i^7 zdDs;wym;R8)Aj%Tdo^dL?^9!gTIcJ}XCDh}b*x)dK+dxT^XU~M^u7F#&-$V1Zxn&H z^^x;%4?D>(?Zx^JuVDH)4K>{^Q-9~ZKg zaUSJ^vcNx77qVKs^m9dxa0Th}siro!HPq^3wd54M&oX&EN@j%{vlxp?m2OQ*p3L+8 zO?Vmd-TAg5TCf_Wr|-s$F&~s?>|SzqjB|!RRbGcxGhSv_>!3v*bW`!6YpdA*iuYVws?{mae>=hKpxkxlAGJeF(ky!WGx z6|L!cGl$CDkP<2DJkJTj<#n$%W=00JcXC7V&?r3$KcXg4yiVBoz zboIQ`=J4HKC!M29eO9Ugy>9>uJ%*nC<2a<%YiM+@tY|qE95pMfZM&-^c9r|JE%cvn zpRhmuv-?z8khQ`pxpoL|z-^pZnoE){&aGeSL2*g_KGf}eeF^BowyD06MMNUfvbFSx zZ$CaS%04W$tUwM;)`ib&(F>nKb?igQI5!Gm+ul@K+iGx}WAN?3ocwn7xz)Oef}jF^ z1Dj~w540q{+Hcn~YHaE!*W1c+XUqvE|CiT9$V)$J$lE~9!@_qZvHL!k=S7$Md)=)> zPm#&G$GeikMQ5qzNg->ksOa97_m5jos1)TKl=YfQ8CHTTs)^x!s5cd-w6@{LhP&6y z^Dqy;c6Rz#`-@ihsaYAiwaT_Lat&V9&x^j?A}sErs4Ld}E$1BH#11wVai_!Ev{n4Z z%{l#g9z#M5@_reir93{MO99WjR$?0O-_`39?q%VfQJi3Ur7WNCH*%CfhK@CS7mukK z+twEV+xXgudzXm6zf-kHu9{ev^8Sr347GMogQo6r*7jgSo+eh#KIPbQspZg*T|daV zaNeK#8n2Ph!&3xR-V-I)4%cVA?ZkUbHHBG;vZqZB>YDx{&OKf)I>MQ#e5cn+heGJ5-`Bh)%g$SxdB^Z}lX;>|X0p2y4t!H= zJ?(1Q=6ia2vU^dPFm}h4@8`*tJ>KW%CEK$s{68((fvyE`%>T7&kp3(zxJM03v8`Ai zthkZO`Ao7}#P?uQTj^Lee68`@5qwwGlo4thzONh;=P)dpwZu>XG+YzInT^21eJv~G zUbhQAye)tl(2xM|7{=nWGI!lBw=@8!T7#+fpknTp{*puXia)4X z>+~J@C@Rffs%>qNIK|vPsp~S4NpfRPq@}SYrskxD(WiNVjT1ciPSYVsGlxJ83RD6I z-{0o@pPaXB>DT2*tG83Mz3$O^F|wX*T!JpZ+r_70*^R_fv}dQWm!Toq!urfvrf-FH z^0oD8k^4gTqiri&Vc(x<4xcuz+qOB6c5F_9<;k?@xyNb6A zhu^8&P)S(BQ~yR}-RE=YL_4x~z3OKX?bNb7Exs{McN#4qzGELSPHDtx?2kmPq4pmM z@*0}1v|cE-oQ&~se{5$+!wvBZyTjaAWH=L9@)jm`V_bvqT5Z^OjxlP9S`|+md;5(? z=$Y$y&7qTx=@C+PfYA37_!lH9-fz^(6n3MPZCjGzRcYQv3f*I+2oBZ*-^uJOE4NAd zzEor8_aXIpaiPOo=MA}S7jGN7$eu3NEJyX*hd52*+n?iIaDAx-qb^&VP=1&t+i(RV;Jh1?}ovDY_h{%}|~VN#}${%OiBYu7rtJtsHe_=;Z5^ z7$2z`TA^%ewQ@(A#_#zCxh`+cgYt{xmNiKy(H0T=y6i*VfZD(H3D1;1y`?AG*2a9X z*2B(6j@)`S-Zo=GVnJ&_+y+Xo&5<)NmVlV0hO#SJ&Y#piY3op?t_gQ6CpPpW>51!c z{GHq)J3jHd@re1d8XTOxrs%&3cW54>9Zm_7*~B7#q2AUH_EfnAH|IoOTDgBWxNK`Z z0AAcKO>B>J|4-mo?`Q=aLpaal3!EUP^xb0iHYu@Kzj?ifD6x3NDK@jUy0zxFk>$7r z#dfyuznEt~`>p%5m;$#UJ??uI?4PG%wj-Hi1waLv-@GsnGpxY6bQF6)8 zzfUn%1>-l#_oLXD!>4D6tnx%!&|&qEo@fiVg?PsLtss2};c0sU+&6B;j=1rUZ_A3@ z{qEqnf8P}-UUd`iFY9-o0)H%zN?cEl1P~|;%@o)o%^O9i6_pbeK?6bL$o6cg>=5Yp42W3cgC{l5rn;+&h(f`dQKFv48U48RsE?)J z`hsT0`WqX^+5+gvJ^M{1SaWRfQ+Ni8FRC0*R8pu1{6N9gEkI*J=$^3bK38&RoN%vmiIfDrQeDe zB5|BYAy#CzzqHS|s?Iifwa`+s>whEX=$uctt+n00B=SJ9iVKeB&OY?6@x3W20=jFG zBDnRs+#$x8{x-Ji92x_BZ2|J+>^0>aJcA>`rP)78a)9D`qkmJ!1JBrnt@|YWem6Ik z7z>egEE$PD5WiCrjbUP(E7IGN1L6nMHu|@*Ievj`$b(|rb~T^-NlUlh9TeFkw+D1O|8~b60?Rq z8uq1dGOWAD^d72vrEi61`A(*;7wFcm4a1BdL^8~)*3Q>(SdP2`Grzm@jalFHI_*qB z1Lv3EhDTp5_JG|HR;)-%&@!!6e{S>OplBJ=-rY-M51D+jqYI*aDwx_FNX@5!E;uyJ zB89$Xq`&nDu*FoDdqqqBbNo)Bdewd9;q`a$E_Ck|6%t+MFT z{Bu2KdY*cm+CS3Tx|q<$`ZE1sz}Bus7jr8|NJzSzYJEhUPM^vjcHpxn<>Va7HI{jm zmUrChVngb)zPuR5%+&{IdEDV2Aih*;y4hQRf z+`H8BHZay+$GJhR-fv$MhwDn#cGP!sZ(5EScY7^6Q9Cec94}K;c z{-y4J!TYAS>BEZEDrU^|Ekx2SY}!u z$I61$8K)QSSG21oi>%f-U7??)J>eem`4NY(0*=_c)pG917(S;DT|QCP^sdSNAEX&!f2i7H$C4A8tnYa4Ct;Vn&qGFHloi<+^ThY%bDuD`>61sMB7W`AAN28s zuIz_CILu)Ml;(*uy(=ZYA}gCwR2}z)U5iM{Z_?&eiF3Dg^cN9SR+r*4+e%VLRE~kX z2F@B3*Qez>1UWDEMkCa#;EZweO)_v5XkuT=aEwQ(-Vgcgke|Vaphtf+Y9-D6PYbVo z+O|Jqwuv#@wG+9v{^)p;Pmg4Z$hhBzRbIC7=;mVA#uIhMiG|PRdYw(R1Bdj)ZC_i0 zPc$zw--W6F1js|e`Zte;G|%&c8yyWntGn7UZ;lrJ`7=?gw^{U&oe0n5m62`3I3~xP zg_Y~hv1Z_Y+Ii4lDZY_-Vqf|XCf>m^9&x|zr*rwSXbz8S*l%c_8)c>BohD0|tr(Px z8MEGP9+wu)Y_1T!F?L2DeVK|JuZUd9M@7IPSO?+W(svn6|;tB_dx zZ3y}}!A6z5Bfrd$rxnAearS3um#m*N%-tBTn)`K<{nKW);96gO~J}t+SCk2d}dplm5`hAN}Oq3mzN?|{Yrm{Q*RyRr_#=H3u*gqC%^g3nMO{d zk(2+X*eLSe&@bx=foMa&{UD53WnUK^eQy%B3W{PiYxvzd_A&NHdXO)#^ZHP%-RlYZ z0jF0z@q`*KQ#2@;oJI!h{T~Xh481_C#YG*MP_Pi4VFlO&Vffqm_dg zA1cO)yr7IJ7yZJQ)jhTZFDuBlrEg0aY8PX?3tCR692DDjArU% zkzx;}-rqGx@gMuTafmDrcf#2t!yn$<$o?DgOWeK{zvt;Or1XQszki+mRi8XUx5dAx z)dxiff|{X8HN?#1{?s!Oong7~UI;N;p%>U02rf zE+1Emq}7^&y>?sl06Xp)lDs)*Onz%htRLD_Mt)s9foV~D9L@)m5up+f&l6b3`0wf0 zwrU_OUG95h%e^+aEsqtyx86M>hZ??+@aQqL8+e@Ahi9~P!rlO9zFTO%@34=sKjQP) zDDRKbXP7FCwSAcRpn{2=@T^B*CHcBUJiH;rUOOY7+_Q+ak=HSAk9MzW>b8ES{-sOz R#lFY&f+zRn0l7W;e*-8+$=Cn@ literal 23902 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 diff --git a/indra/newview/chatbar_as_cmdline.h b/indra/newview/chatbar_as_cmdline.h index 3a7de8140d4fbf2af196495c10e5ffe3d807bcd3..f011c6c9d2c6733907f67233021202879b8a2bf1 100644 GIT binary patch literal 3476 zcmcJS-A-Fq5QXPDPjQsqBvBgD^s4EV{|HFfCbkLX3V{ucC2SBjC3%cKZ>6T|o5l7C zHYt&+%CgTnbN0-vS@W~Ezx=%wFQST8T*g&=j_a7l@9{B~l0A!YJlFM2yw>NJc%u6k zcfVD1r7?+{xQG*JRWX$ILV9O0)3u6*-dyNfTSR)T_X~Zm;}88#;?+_J|#HSCU*RzNwxp!58|Kz8_N$Jn(awSmxrqpcqR= zlvs4!@K*fIq`i!{YphjT@sqf$;@|kg&ZVMRXAF-ZC1RKbC($kC)eINZC&~wru@J-5AEl~{;>~w4<47N_ znssKJVXEIXSMb&RY;v*5SEW4v-~4Ript9EaDxFl~m!8$P>8~xVpzFa; zMRPyP8s~nhyNk^8dM|9^se7^Z{&4@_&+5;a)t-F2myMy=mg?0QBpcb+=%j zC)emQ|Y){~Q& z#+;d@UH8={yUfOOS-ce=o>+zNGUXOI!^X1fIcLvI9$2|ekDhJJ+IrqC6uIY9$xHD* zik;Zie!!m4kL?)6p>~5obR@BSUr+t`pr^K^ZONN)q~ETj?Kp_NT#x>dz9X&aroBe= za&=4VdXf)hp{eyFJr8olkALD9FMqvew_+c%4p)41;pHW6tqTEieJ*{?h+jsFbWMe;BC7RZXP5Abl5>p)vD88b}17jL#_{Yv&5(ru_R$N{IQ|57t#jb0&RL`VkA zG<8w%4E44tZ{&8Qd+M$dg1$cOL}9K$JjlLl>24UmYSmum+?_zB9Z25Eh=~NAV9EN% z;u^EI<<$Q$<8<8>Ttp6*fj$R{1blQZr^+4O9qJvmLkG6x$-e2BQqQdR6TR!s!6#4d zj8YkOH-Psrd(7+I-@O%Eb;UJS6$5un6Dr94d%weK4m@jE^-yN%iH?{D6&1j=AQ$F| z=|Jxfgpa=Jh>5}#m4*z?-bsUN9Xa#JF_YaAdzmEW?Q1EPHs>!m9sm>%9lK3osnmghvJv~i?oNPIhv(L|@ajbiLJznWN z)1J4~ySMsq$8OBo-REUa{QS2;mp%NGe$9C6&gV$~Mc6?(3Ha{0deHp%RKPC$4^Qh8 AB>(^b literal 1739 zcmb7F!EWO=5WV{=2D_JJVI5fD!>B&* z>pFB45b3BX2G{wb?oV4d;fz}x%g^?I81?rnN*z`U1kPxS#(nTqizdh5xE4S3tmvDU zLf4-YX0V7I405!$scPijiF4FTCEcWBtUDCS|!btR2n6DtkT7lfI(?yDN!qB zk!G_g1KA~be5j;sPAjRSC4j_CCCYBbmUCrOZZ}6iL2IF{ikLGat#iH3j3k~cRwhb> zTFLkd9MG5KtxPSMrAU$wg97Y)P6nGv5EZjTzO}-nvC=ZKJkt9qf^;C5Ov$Wer1&6z zNK7O2W(rLh3CKqNnIjKzip5GSq@j!dR)+Tyw$q zB+Yk9GG4-*awDf`VgPo){e1MYNgis+NvzQq-Ayob)bPjHLo?MEFHIt z0vyp1q)+fl!*6x%0yTA#-0sJsazy#A=5}Qr;LH_l#!PV zCA0#?1uu-Pbtljnra^Z$3Anu-&m0W7u~t%Z67elyKz!7S^Wg=f4%PvL$)n{#eSR6P zCzH>9*H&&vD{~K@*_qJMDo&u${c`dd0pH?9|CbmF+p^x{!u?d&CGPQU(Oo@$noPDK z)KoUreT~w4j$HIZb#udiDeVJp=4X%B{(f+O4ImyNZeO2pHR9*;JNV!-@VkEiWv~#j diff --git a/indra/newview/jcfloaterareasearch.h b/indra/newview/jcfloaterareasearch.h index 413dbab998c09959316f7a2b2818cdc3500f174a..339763cd1b6be40607aca865e9ca2a31f01c2a20 100644 GIT binary patch literal 6274 zcmcJTYi}Dx6o%((`YTqgghEt$;}fM+a-6s+a^m1iONCIB*iIVojo4{g5c~&zFB0%R z=j3>IeZfTtt?b>MIhXfbXJ-HU^I_UaS*oUSnxqfuDqW_F^ft{jww=1^Q{A7WN4ma9 zcl5k-`=6ylarDx48l+QkWvM0ZsrdS7sQUwrR5UlxJ(oGPx4!248hxk#o+!(5n>KoB zvfw4MiXQ9L%U|C9faGnO@r9z!EYu^7*S6YFNu>K+c%r-}!b zK?_$oXTk!|_%#v@RuCDyh8$v>$#RczAX;a&$2;^ddo43hO{IZMyp#pRBeKd-JozZk zxTUMJX3;YqVe;Q|F7W04S@y-UzcR)7|Mt%^4l--eUr|Y6M^CuAvJP*KEDs_VqrM)B zg1QGk8O`(1a-8Q&Jq;|*i?y(fC$Gg^`|A2HNA+`y>XCGNEjxygF%kmMZ|YPY1JEyW z=GB6H-aJQVW}o*Zd@!9?Ze+cCg06FB2)tX-8D{cVrZKYGc|qu&bWhQ9=p)fZJjYx= zHHvS&bJEl3GeeW>b+znWdgHky-pC)`vBKZc<)+rdx{~XC&Nb6{@XC#8^xj6V&HLR{ zmV1ASxPO={&lCLPzSyi2 zd^Jfp6h~8<4{i}vWcN$c(>ANZ%9?3C617`byS1+(8OP>Ttf|g@95FlANK+II@qsPk zg_SL{xS}Ue>{;DmyW5LLU+G6Yh!_a#x;97CJ-;rNfo#|C5E*Q)+gomx#}t%Av?>g& zGoV{FR@Dp{2Ubu*+mh9ABHu^I5HgN@zz=VX4zz*EG2^LkU7#xqY1cZ<(E*cYzDb!P3;#ktN`xa@kiN=;^iQ$Q>%MDow7N ziiv!N+TW;MuN-vp=9LkdkyitFUt5hiz1R2A+*^6ZRpuFk@8~9Ekk@ay!g3#YuYqb+ zWT}aLc^*_`0NsLExS!|_)P7U=sH=T>B78-rF^11xh=Y4>IsM3OCc0sJbQ1SlaTH0* z{TC~uTG2qfE6NZ$F=+67F|R_t_XV((yN*YI?4vW4bANGF@DqctGVF@M!ivU9dZ8=E z*j2LIU{C$CjmDmXUCL0izPt9F^_lJN4@5Vzm5P<5ueFYy8GCN%GueqAKg&GUX(q5e zl=ttXdy;!@YjR)rEPX9&PQ*iHPyxit`(eer#54Au=m$4euy&4g|F_((eI&F4VfJ14 zT|EyZk<$UE23GwCvgYnB)>YKk;^w@uiH_Ypdk9V(n`qfz_%6!hQN(e_5T9xfFqO^p z`?hetm-Jnsey`55Owke#vBSE$Fo30Mcm^x!Ux}u#9SC|k*IekGvk|h((ur8DBuqG^d64-O=qJ>4ihv#cpgT7}`ckpH4zQ3I#B zt&imARE|DBrQ!FMs`e9M?pdy!s-xhaEjxc+3Ej2E2b%xwqcyk$Wbk!>b8IeWM`P3& zD@)xxH8w1}mVX1G*q$R;$Nf$gkgM#d$#K31Y%3;XT_8P`cc|L0^gB27P=sBZrQ)B4 zB+wHAje8{Yk{eSY9>_n_In9Y$RF&(Ue0Xv z@LfgQ_d_SD4Pw<1iX+KlC1MZ6Zf47JaZ7jBE7m~fi@ZnbeC#;!YPJZa+$9-cO3T=iiBl^oeCBJ%n@6 z>RikvlXETW1(QNPmFLk(PbC-LuBEC9?a=aPrl|O;;#t&DjG|wXH+++#m(m~UTI)K) zJEOZ69aQD`uFDP1svoR|qVDqg#DbrcY1lCnrgQncuZz`-`X}Q%y4Y)Ty3MQQ#OgjI z`Zt?=1u6FXVvS)d`-7Q0+&6ovJaiSQqSA};CMtVE;2pm&?|I+i8m+WpyRc5 zU(~ot3q5SCoT{uq81z&Pekre#Uj0P;T1e40jU*8p&)?Nl7n&!I zlM{Uxs{dQS`?278(9>JNec&S&-t@z3fAmUKNM;zjEEU tZ2X){_qaF?kkynGtd;nnrF(dIn!b}At5=S^8-H);qaWX!TY0YN{tb?4+1&sD literal 3138 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 literal 7025 zcmbVR>vG%175+^=#af+lNQshC=T{L&9f*V^WI#X#Ks%mHhXVmC3N|hb08(W$=}WW^ z-0z$PK!8+iCmdTMuxHQZJJ(%Zo{DL{-WBocsS=}bEZ%(k?cavt6#v9Lk2XnA2ya(b zGA)IkB!US`QOHsjTNz!{q^^wOvMS<-O%>;v2(n0QN-5$@l=-FzCBJ!yv!K|C$Gk|( ziFl5yCy^H4d@I4T28IOiC(Eli zloQazrAS~gG3ttj-96O=U)l2+geOexS zy~s%W|7?zS0y2;Vks}mR#F=5#Dk=;0>-(JS%g)I2qLA@yh5-rV%Q%+TLhKB$=aC`5Oc$;(C#9Vm;^Qr@J>T>fz9DWMXU33whWpN(8s7K9a>xlc zV&NGR2=R3iPh5Z)mht_1;hBUT@iJ}SaNWhdZ#wo^+&S-o4lvNMo7_4Rj?LbMa~$^r z@g*?W4HNPH&cJ*4+pf*?U7djO5GYgfZ%YZOh#S9Stgww+%e*!0sX;n9#OS^08DnCl zyCzh;C5KUHz1JZbK?CU&B+yNL?L;u(hFgVsBlOujuz})?711LWJhKiRu<#bsyBd8; zhRfmbFL4$o8`RB{B-zIDSr+R;hIzV<6B#|p0Qpy5Je_n2%dm*oRhVxwl#+wBBnh@b z6%u1(L(6*S=xoKQc#N}XspKrF1TFK2 zkI-=>K*VS{{Cq0ZdqMlj_HrGBa`@|Tpfq5tB9DP9olJ2bS(eAzE~+@uH0q^6wM>Kc zvO?oqp|2`EElbhc;QLwx+a(DY4+r2rAiAGVY<+H={8RkUEMBZ+WqU+Ffm{Wi1xw4AIUO@fKN}UiF^=?(|89 zpXR|DsPsrRt@k*3$nykUYZ)N|Dm3Mn(H#%9fn}NSU66$m285qv@wUf_wvuXBBju3u zD;Q|bM&t2tGKlgS^B=X6=k*TnP`XInJRyohBvqG!d1E#&7y{<4u}g%}%E#RhJe z49a~zFbSeQ{6qw_n7W%R!^56KI?uDbd4vyoa2*s?sZyo4U(;%1%^oIDIerwR z?fF$))}cHelj7#1h^ucfwqb1K1e)Mk78p4oy2v-HCl*LULQqvG4>Y8dDv}%LAc`L` zo=8UGJ9QUk*fT!lcMH=HzWucXR! zO;ZSgF6IP2ze@EMn|tPS@qlufA(cV$ijw>#8VpfHadsA?G;nQTH#M2`BXQa@KJB0d zvGMs;iK?GPv{!BB-LLlQawfeCk{DvfJl4h8Mk2AX;p+u8GSQw2uT@i&qPbj8qbpd+a_kcAq0{A^gZN40-@6er=)uL7X;J zgX1*0$&03@Q2j;q9XxK6=%1RlC4Vf7Jg@eM zP#B@JFwuO4sz4R6u9>4TyRqd!&mA89IQx@KS`;}DYYde{8wa#gQL<|E9h#mhs?S5c z-@)oD7^tRG?0pe_piTwrRa0RQy+;$l7y2P8&Iz}{effv(s!mZI{+$|&CPJr5iAvWD z2y~q0bJ0_bf`pMI{o2w?G1X*qKNwNxhl8^-6*1gd5OfDYx$B2ypAoW()LGIo7{kZ@ z0Y)mWjQf;`3Q3h{*jBdA6x3&PP}%lO_bJKcth3My9oR$#y2Bq=1B@C)4K!e{@|%7m zLWMw!pxSg48;k;PX=j>_>-w#cy@v5G#$ClGK%0cGzNSmEj6=m0itMP%OUqiC_Ko9> z#^UW;apJZk1v;6UK6Vr~C$!pupT-z^h3$qtvtS;I{k}EhxgnFA|+rwOlB)!`zkX-eBVeosj+%%>ZfYinFbWY* zRC4((1Lg15IE#oMs5R+COD{A{_m`GuEq&uBU+p3U@HsnEz;O%#VEPclwuGx!HT9tH zB=*o=G>Dn6*N$Temd>UC40_WCO!1$H);~3CAW;(Dly~@s zlSS_=ik|5vukTO71ctW<}Xv&MVHk0qeg{RQBRm1 z1zx`vue##sx#8MY`p;hf0GaxF$D6w5z3=f2kGij-5GnW94xAS1D#*G15f`+FvJiIScw^0bxH!9bfa`sizeA79^-$i}VrS5`Mxi}G8^O`}b-|p|fU`9L1 Ka6Zv}*#806=ggV_ diff --git a/indra/newview/scriptcounter.h b/indra/newview/scriptcounter.h index 78fd32058af0b58ea34013204dc01ca7556a048a..6d37063835cfd9fabc5433831f5bdcede246ad8f 100644 GIT binary patch literal 5324 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 diff --git a/indra/newview/wlfPanel_AdvSettings.cpp b/indra/newview/wlfPanel_AdvSettings.cpp index fa0a1b693b13971ced46eaab6ef5c22ca75756c4..45f5cdf58614ff3c955de6e3b0ea6daff94d0448 100644 GIT binary patch literal 35462 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 diff --git a/indra/newview/wlfPanel_AdvSettings.h b/indra/newview/wlfPanel_AdvSettings.h index 1bf1b9691d945994da7c7394b182b2e4272927e7..ae47745794e153a95c43f6b80cae614373383ea6 100644 GIT binary patch literal 6440 zcmcJTYi|=*5QfiJ_!TRVDjFfu(r*+Y*^Wa{olEVQ6jc=pb_h`&C$b%f2+=>${@%9l zGvo2@dN-GXD$DlnIWu$KdFOJ@?mvI8r?r%&Rys@P=_*aqNjgp+(oAEI(ja}S|EKA@ z^u50Kb-lLu&C<3shUp@W(xJ4n)RXp9dPnJ0|5<8iW~BezBBK+{PxYOoxqgS~$%@sk zjh>h#G~a23nf}kxSlWmB9qRwWY-Ac|bgJ14SsX|=mw9KiV7t=jd&x`;*<;;ZYHlVk zGaGfk@=>he|EXq&l6j%Qpz+UGGI&8`U=2IOHk0Qb<3Mzs*BOii@{d3YiZh(~0V zqj-8JX57>ItXXBoBTV*t&IP`lpDGtszB0x6|K_KPgUnjxD=I1c7z)=w-ofVB@*r|C z>T6vRR6Y2~Xs%B!$GJYy)yU$!S_@S?c`fFv*VlhJsy|p%ceJ+GvSSDvV<7L|&wH`K*UGHl_ z-%aJY_os+UtiGSN(ktx;>25c@*4>6iH#FW%Z}hvZ(T&tk z9g|1@jlTPm**1HPv}4jO$?a&oD+^7@@9Vy65`RjQm09PnWn@B+f7WTIUlJJFl0q77 zbhb6x(Z6GI)LmI*Ek=9R#a`*YCAq$^aQ)Io9Y?17T}fwVXIt~2$3rkaULt}c=i~M@ z!M7<3+tTQ2<*fyxhJ1fz>+G9X;pL{Sx?_0pZgb&ZL)Ux8EZ(%1JV)I2G}4vCuKWaB z#0)Qc=5a$;pxCh5!*}-=Mqld-Pecub9er+(s55_EJOf$N@DLe%?$}-KmB$p6M6@Lg z>@}dP8*6EXtOF}3k?qNAG_mg^WC&SDKET5plLKvFa?CLGvv_lRuAj+%L%I!R206n? z>T7a_s8KIO3=fHbGfiFuo}Ol#T8-H5>zcgFgkV>n4MX8vgScz8*V0ul{V1u9#oQ}_ zOzUgBZ64zZJi(IdI~LC|*Y~tP-ps| z#O!aiYd(;@kvQQg0{%wwol~x33`^@Zw(gskheA7Du+_3N1Lydrz8_WpRhgbv@TZrF zqKbzjlPgQ!HFBAJo_+uL0==f{Xjjq2H_w-*I5-gpL-mcYKGz&v^CUA-d@q-CtewwZ$jVUjoDRFP zF;~`bPUaaIo19Xwmbyhvm~)M$bjcx}O*!AS78!M{@kiE^uv?bm$(l23Q?heid;f5I zL=eoU>PJ_?M@1ejuiZnupjQ0(c_4{;pIY+4^E9|A`;QmMkUzf*>qo8U)zFmn@wJ{8 zeQZg?pAZk#aX1h2E@CEK`bb~BEwX)0I0u>`^YPfv{{C!?Y)^gi8;yg(8K}n75qr(T z@PR(XRd*I>c+Y}t)%si#BjwCdO}136cfQ(s5eFTDcNBO@o)sDAtp-sl^YTge{@#F` z;c4NtqQz>FRhZe$yg<4NB75A zJDKl6#U2&8K@E{d>_74B8E^3DEaU;!d5$ixO4p=+(-+8)gT?=(l;_hWp6DCJ-nVL_ zr`~aOtG;`aXX2_AXSF3uymvaf)n0C?$WTP3xZ8#gWhSWgVvZMkTK!&v2Ky&(^qfEX z{id+OCG|-xvB?{(c&AX!kG^$9?{(-zmA#eDu%;^&{cB5tU1>{k#}+jz_^Ije_K?aXhH>)c zG)^D)H$pG0_ruCqpW@7Pai%Jxs9S|KR<-f#`Z|C&b`;q7yg08u)asm=dAsF(>dT%P F{sp@-4qN~L literal 3221 zcmb7G(Qe~57JZJt;$j9UG6N%Nr*BCyfGjhyu(ITea@?R;1hPfPL?zK6WoL|{{fXT# z>X-Fg$(HR&I*SbgLn1HFJ@?!rlGh)}H|w3%&#Rg)7a!=;_dk5!qmTHfvB@_@W=ZZ` ztx88;QBV`;$SSAoR^?aw&_w0h)mG0pwKf%HRZbhHNLS>{#x7JdGS^jRceFINbbWf! z^@@z;MEqzrHI*jUOTEY#qfePtv{ts%b**w*TeHBm&&qK0QvNq43eHmb0C9)^9_{i_;f5fUi5$S=`fDGxJjHNH;YZF zs=861`*m$B8O&HJvszi56|U<-htqViS$@+0eW^cQQKZmXAaF#LmFktJDkM2fHf_9W3Y8 zYQdhvVhyMl%WkV$-#G_A9UPvH0!cEyOJ`mp2+xxweh7wQNP|Zj$HQspB_tnZD#nt$ zXh?n>rAaWDrg0+aum5-wi~jmAm&3DO^hn~DNg|}AIH6!X2?JmOJn^D55VB7}KLU_92*MzJY*O9@X~gO7kk6xum!yHu ztQl!CO(wAv#I+3r>4#o07Q-uWKwc6LB1%b)yfA!KD!@)FWw3z&QEw26HWexz28r-f zF6sE>Lp%@+`y?mA5BNd+B2bN&JocdpBLP{8pQnh!JPp0EcP}Jeep?ytj6Y4pm`TTX zj3cK5nFi@J6?7lR!$xu`l83+-@|MDwn{Y={Df&o~dYqn7pctm{JebOWwPUOxN=1@P zCutBzA7~WMpbj+fu$tRCq&RB2i{`}1Bjd6dO&j_&8wre~-_gFjH1Sv%39Ii|Md{n1{1{v57*z4v-q%-P5S| z9@Dx~--rN6wJ0{&e%}?vnjx-M?~a2%&5d#O^}4oCydPj|RB)I5&vnkk-&; zu+c@{gl~<`DYw}Rzx6Jf*UdV|mYo#a2krD+7rNdZV@-vLfm&r-?07zedRCX>IJB{( z2CJ=wKQK7SY*wbbwIap8O$x_n#DY#T`K;+lepC6-=Qr^MZOsRDb(*}*=;JW3*@W*A z^<@}N1C|}fIDY%Q|Kn&4Lpl78)=Yq9Y0?3>Av~M4OC!Kso`!F;V#6%I3J?ERc#8qc z72lC|EpY{b_gsGG+rh?GR34^o>5pCyCr+&vxSpV&4Zr!JEggZWQ;B-UL2~#uzD<{9 zo6REir9RWF9Yzt`*Tdo4(OmL*bferb+oiaUyvbru+Nve`vI_B?aZ~9UUr_6)_GC7= z2sGzD&SE}&)zTe|w>E2B8EZA;8$+wPW1J)FLxlWo_w_u|G$I~CK-J$Z3iWl|iSf9U z_Os;-o#?INtyNCG5;Q@V%+J_6m7$-?C2FDguF&Z*od$57ZCduE^Ug}G00NiH5$=Xo zRN1^>gK*a4X7cgkqCBa+*<)bF^MJ1O!!!y%k2tUV5QYz;+o3qovG^v%`DDX#r1)OX z6xrD)=50q@eRIS6EAOc7c6)Q<^mB!q-X}cao~d%)d@Fby4*pD~-@Q2GY Date: Thu, 16 Jul 2015 17:14:05 -0400 Subject: [PATCH 10/17] Fix Issue 1960: Wrong positon display in mouselook --- indra/newview/llviewerwindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 1297f76f3..4a896285f 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -5082,14 +5082,14 @@ void LLViewerWindow::drawMouselookInstructions() LLFontGL::HCENTER, LLFontGL::TOP, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT); font->renderUTF8( - llformat("Y: %.2f", vec.mV[VX]), 0, + llformat("Y: %.2f", vec.mV[VY]), 0, text_pos_start + 100, INSTRUCTIONS_PAD, LLColor4(0.5f, 1.0f, 0.5f, 0.5), LLFontGL::HCENTER, LLFontGL::TOP, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT); font->renderUTF8( - llformat("Z: %.2f", vec.mV[VX]), 0, + llformat("Z: %.2f", vec.mV[VZ]), 0, text_pos_start + 200, INSTRUCTIONS_PAD, LLColor4(0.5f, 0.5f, 1.0f, 0.5), From 3d1d1380741d04c96fe96c5829dcf04c287d0ed9 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Fri, 17 Jul 2015 22:06:30 -0400 Subject: [PATCH 11/17] [RLVa] includes cleanup by kitty --- indra/newview/rlvcommon.cpp | 1 - indra/newview/rlvextensions.cpp | 1 - indra/newview/rlvhandler.cpp | 1 + indra/newview/rlvhelper.cpp | 4 ---- indra/newview/rlvhelper.h | 1 - indra/newview/rlvinventory.cpp | 7 ------- indra/newview/rlvinventory.h | 2 -- indra/newview/rlvlocks.cpp | 1 - 8 files changed, 1 insertion(+), 17 deletions(-) diff --git a/indra/newview/rlvcommon.cpp b/indra/newview/rlvcommon.cpp index 3c527118d..42451f406 100644 --- a/indra/newview/rlvcommon.cpp +++ b/indra/newview/rlvcommon.cpp @@ -26,7 +26,6 @@ #include "llviewerparcelmgr.h" #include "llviewermenu.h" #include "llviewerregion.h" -#include "llviewerstats.h" #include "llworld.h" #include "rlvactions.h" diff --git a/indra/newview/rlvextensions.cpp b/indra/newview/rlvextensions.cpp index fccd0fb5e..44e581826 100644 --- a/indra/newview/rlvextensions.cpp +++ b/indra/newview/rlvextensions.cpp @@ -18,7 +18,6 @@ #include "llagent.h" #include "llagentcamera.h" #include "lldaycyclemanager.h" -#include "llviewercontrol.h" #include "llvoavatarself.h" #include "llwlparammanager.h" diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index b09117d5f..692e4675a 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -28,6 +28,7 @@ #include "llviewerregion.h" #include "rlvhandler.h" +#include "rlvhelper.h" #include "rlvinventory.h" #include "rlvlocks.h" #include "rlvui.h" diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp index 05f2a93f6..4077f54f8 100644 --- a/indra/newview/rlvhelper.cpp +++ b/indra/newview/rlvhelper.cpp @@ -15,15 +15,11 @@ */ #include "llviewerprecompiledheaders.h" -#include "llagent.h" -#include "llagentwearables.h" #include "llappearancemgr.h" #include "llattachmentsmgr.h" #include "llgesturemgr.h" #include "llnotificationsutil.h" -#include "llviewerobject.h" #include "llviewerobjectlist.h" -#include "llwlparammanager.h" #include "rlvhelper.h" #include "rlvhandler.h" diff --git a/indra/newview/rlvhelper.h b/indra/newview/rlvhelper.h index 165c455c8..ef1135e45 100644 --- a/indra/newview/rlvhelper.h +++ b/indra/newview/rlvhelper.h @@ -21,7 +21,6 @@ #include "llinventorymodel.h" #include "llviewerinventory.h" #include "llwearabletype.h" -#include "llwlparamset.h" #include "rlvdefines.h" #include "rlvcommon.h" diff --git a/indra/newview/rlvinventory.cpp b/indra/newview/rlvinventory.cpp index b2c2c5bce..ec0c7c74a 100644 --- a/indra/newview/rlvinventory.cpp +++ b/indra/newview/rlvinventory.cpp @@ -17,17 +17,10 @@ #include "llviewerprecompiledheaders.h" #include "llagent.h" #include "llappearancemgr.h" -#include "llinventoryobserver.h" #include "llstartup.h" #include "llviewerfoldertype.h" -#include "llviewerobject.h" -#include "llvoavatarself.h" -#include "rlvdefines.h" -#include "rlvcommon.h" -#include "rlvlocks.h" #include "rlvinventory.h" -#include "rlvhandler.h" #include "boost/algorithm/string.hpp" diff --git a/indra/newview/rlvinventory.h b/indra/newview/rlvinventory.h index 0e1d06155..35154fc32 100644 --- a/indra/newview/rlvinventory.h +++ b/indra/newview/rlvinventory.h @@ -18,10 +18,8 @@ #define RLV_INVENTORY_H #include "llinventoryfunctions.h" -#include "llinventorymodel.h" #include "llinventoryobserver.h" #include "llsingleton.h" -#include "llviewerinventory.h" #include "rlvhelper.h" #include "rlvlocks.h" diff --git a/indra/newview/rlvlocks.cpp b/indra/newview/rlvlocks.cpp index 6e496018b..df4037821 100644 --- a/indra/newview/rlvlocks.cpp +++ b/indra/newview/rlvlocks.cpp @@ -18,7 +18,6 @@ #include "llagent.h" #include "llappearancemgr.h" #include "llattachmentsmgr.h" -#include "llinventoryobserver.h" #include "lloutfitobserver.h" #include "llviewerobjectlist.h" #include "pipeline.h" From 0b70603a0ced6c2fb9bca222cb9358773d8eedc9 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Fri, 17 Jul 2015 22:07:35 -0400 Subject: [PATCH 12/17] Tweak removeWord code to make it work for text editors and make more sense --- indra/llui/lllineeditor.cpp | 6 +++--- indra/llui/lltexteditor.cpp | 24 ++++++++++-------------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 57cdb8462..66b8d64ec 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -867,10 +867,10 @@ void LLLineEditor::removeChar() // Remove a word (set of characters up to next space/punctuation) from the text void LLLineEditor::removeWord(bool prev) { - const U32 pos(getCursor()); - if (prev ? pos > 0 : static_cast(pos) < getLength()) + const S32& pos(mCursorPos); + if (prev ? pos > 0 : pos < getLength()) { - U32 new_pos(prev ? prevWordPos(pos) : nextWordPos(pos)); + S32 new_pos(prev ? prevWordPos(pos) : nextWordPos(pos)); if (new_pos == pos) // Other character we don't jump over new_pos = prev ? prevWordPos(new_pos-1) : nextWordPos(new_pos+1); diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 83912db9c..0412c302e 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -1817,10 +1817,10 @@ void LLTextEditor::removeChar() // Remove a word (set of characters up to next space/punctuation) from the text void LLTextEditor::removeWord(bool prev) { - const U32 pos(mCursorPos); - if (prev ? pos > 0 : static_cast(pos) < getLength()) + const S32& pos(mCursorPos); + if (prev ? pos > 0 : pos < getLength()) { - U32 new_pos(prev ? prevWordPos(pos) : nextWordPos(pos)); + S32 new_pos(prev ? prevWordPos(pos) : nextWordPos(pos)); if (new_pos == pos) // Other character we don't jump over new_pos = prev ? prevWordPos(new_pos-1) : nextWordPos(new_pos+1); @@ -2368,6 +2368,13 @@ BOOL LLTextEditor::handleControlKey(const KEY key, const MASK mask) } break; + case KEY_DELETE: + if (getEnabled()) + removeWord(false); + else + handled = false; + break; + default: handled = FALSE; break; @@ -2485,17 +2492,6 @@ BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK mask, BOOL* return } break; - case KEY_DELETE: - if (getEnabled() && mask == MASK_CONTROL) - { - removeWord(false); - } - else - { - handled = false; - } - break; - case KEY_RETURN: if (mask == MASK_NONE) { From defb530e8bab83e3294bfdb126b73a303f270072 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Tue, 21 Jul 2015 03:55:39 -0400 Subject: [PATCH 13/17] Revert "Change llavatarname.h to unicode to kill linker warnings when using Japanese codepage." This reverts commit f2e57d72ef67bb8c6e3e93fbe04c98718d01e759. --- indra/llmessage/llavatarname.h | Bin 11078 -> 5387 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/indra/llmessage/llavatarname.h b/indra/llmessage/llavatarname.h index bf951dad083d21fcdd239f33bf3d2fe2104e9e4b..5902d34d860b82188e095080f54fc0e75f0ad4ea 100644 GIT binary patch literal 5387 zcmbtY+j1K>5`8AWqL)soD2KXGcD6QB9EX-fn<-g#iKJbAa)C1#5!TFr1q?|uu6*$R z#hz}=kTa6jo2@*!ERsN@FQ-o*;OOa7YSUBtEitL4G*v5AD3_~DAI|0bnKL?}8@+Ja z>%8#9za2Q8szS#UV>Kn#k;*A-?U7$bb5fp)xn>JXuf^Wc_-b@P-OkL;d}fMy|KwSR zu(R_82K`}b@>u7ceOQWlE5*hyQng_dd?a@M&I{?>+Pls^zUE(kxH6H>y&mO>Jxz@B z#YQXl;^er0yqAWbUaX8>YnR?G(jR!sSVtB|T$x1E2l|z=mGoNY+NqS@FK395cb7Tf zoG{ka>wrrkm{%d@@Fk&*foHMrz zjXzYuL99)h(oA#dlV#fDqYyKF98KQ5n@(tO{fRyfZf*wGlTT+@T+A(g)hpze3vaST zY7haE=Tu&7;2K+adwFyI23rQNMpvWBCx*^&G`YSUk7@Ysh6eP0a5EX5Pp<|y^nQBt z{@wWUkWg)QOA`_(sd_Aj+XOO@GwXmoT_}_KZ2~@_f*xL`G0oLVqmq#}EBL4=0$8f# z{k1BkHoujq;n)s0XJit}ZPBB(Gr&h-#qUP_ID%aX0|tBaQ=f)N)EzpA#s%sP8$**6 za~h`Bx*olQO9%ahppP3Rq`;9Mj*4;nD@2T=0hQ=4Q4+9~yYb4wAV>-Naa{XU8fFK|HX=m>0)SN(%pF>58x zX5s>MBNYL3!l}R%+7?TJ8oz)6z0W?3FVL_2Uw3P^wX!Byk?$)n#ut0!V-Av!oqE8I zyOTRF)we3zFnwrR&&&QPi8HWfq!wysQiC=E)_^ZsIJ+`2jFet^d=SfU6oFWDi(4D7 zDRLSd4~Qej3oG2VQYkzHJhQ|0&Rc*EMJluAi}>_3lx>gD{i&3y@_wuffweHYoqf>} zK3i}_WI^#JFAvD6qrWZ;64rs6NJPw}itOfgT^{UpaT%6$hyQ#|W1jJ#ijiNtvFU4aaCGJwjZ)mM#m;?YA} zFeg*-yM}g)s<;NBs%7R-(K2B|9koJn>|E>(q712tsf%t?%M=Xl!*? zlo*Wvz=h^OCApdU`gxfnJ17XxmKStLd{%ThD9BzX zem-2b^JNI@xpf(aEc@VlWq_Va2~vuIZe6+TcO;IF+=X!fO4v=%0Q`-brAS>!m8UOD z&{@MA_Sbrck$Y}233Z{R4pJCUJRm9+NK^{&H5e)6@Sc}JW7R|#YZ$bAUUWpb%~W)U zNgI1{A8oh*EK0`U(M*A4S>N1g?gj`YMpw2h(DbtD>EzwTyHmPMO=fbY44G?as6?%h zN=O*=iJ)DG>p`4X!eSC-Goa4z*8iI@aDdN0LLfl{h5~eYG@T3&{zYh6Fknp6-0&ab z)I{AuEY^f%=$u`TqvM&kqX?R)I1CyNXafSlt-Me0Cz7Td{bD!B8qhQ%Q;<2+5i>7J zyj8$q(wt)MJJYuhz{ zz2Xu9SOwxre1ChU3V}(AC2}UL@_on6Z;Ymbz85^Xm`jS{^SV-`JUIG#ET@JcFS@3-8VvhT<&?eAZhdRF zS{}WLYgV_m3CNM3T9E>n`gB_H@_j1dk<|*TP8zEkNZT!X)>zc&)*r#|kC7?8q)rFh zI=HsckCfFc<6~#P1L~haU);$l)nKZ7Tt9{vVNjG+xX`oZEwGCIt%P@&hov%zm)T<1 zC{j31wU;|sG*|hp#w8WiVT_|ncUmvdmEb`(Co+n&iu*_4L@3LG$_WWwz#1$!U#T#- z2eT+S&aM&G-B(9lFNusceR>L@uF-HMB8;`yUr{ zaPIg(Sl|&d&$cZS8s_g1IP^6xVYv@)3%0M%-vkT*XAl2z`OQAkriN)tJ9$ z=%fwBOJ=z+o3wG;fh0O_D_9#iE%o*gCpPDFulyVazWiPruNX>=42nxgi$D#mm@P4+ z*by17C0~7a#sZQinu{GgyMWGsn>0SaQwLsb7%;3>QMkV~hO^LbLw-WxZuwsH<@A+9 z9}9mgFl2?t4P4DEZq1-d!VL>A4l2cvu5)pD{1sZQcKQfH5Q4BrGu%oVRTT*$4@!92 z(GW}gCc+O=+>mmts%C+_3dwqDWKLKwh?z!N>4BOP#q}t=RaY^2tI^IOF217}4h;>9 zsmhoGcC~}Z10Q9ZPT9kd01#E;p_H!lLztHVyiV;5B3JH1cmQBr^5la4 zhF;~zx4=iG{Hdf&Xh8`<9=_zYMHU*%nApHEf8wMk8nGws{{Zj2 B`iB4j literal 11078 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 G>;C{eWdxi6 From 47d9c6d0b5078b7779cc0c26268ea6e4cb7aa81f Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Tue, 21 Jul 2015 03:58:27 -0400 Subject: [PATCH 14/17] Revert "More unicodification to fix JP" This reverts commit 7ee66bebe2ab7a54b9e4e0c83cfe04ebc4ae8725. Damn thing breaks diffing. --- indra/newview/chatbar_as_cmdline.cpp | Bin 49190 -> 23902 bytes indra/newview/chatbar_as_cmdline.h | Bin 3476 -> 1739 bytes indra/newview/jcfloaterareasearch.h | Bin 6274 -> 3138 bytes indra/newview/scriptcounter.cpp | Bin 14466 -> 7025 bytes indra/newview/scriptcounter.h | Bin 5324 -> 2663 bytes indra/newview/wlfPanel_AdvSettings.cpp | Bin 35462 -> 17211 bytes indra/newview/wlfPanel_AdvSettings.h | Bin 6440 -> 3221 bytes 7 files changed, 0 insertions(+), 0 deletions(-) diff --git a/indra/newview/chatbar_as_cmdline.cpp b/indra/newview/chatbar_as_cmdline.cpp index a81f6e66b70c5283885412395b5ceaef96a49e67..025f4fa1f415ab85df3b7c1b3a7f3e68386de286 100644 GIT binary patch literal 23902 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 literal 49190 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 R#lFY&f+zRn0l7W;e*-8+$=Cn@ diff --git a/indra/newview/chatbar_as_cmdline.h b/indra/newview/chatbar_as_cmdline.h index f011c6c9d2c6733907f67233021202879b8a2bf1..3a7de8140d4fbf2af196495c10e5ffe3d807bcd3 100644 GIT binary patch literal 1739 zcmb7F!EWO=5WV{=2D_JJVI5fD!>B&* z>pFB45b3BX2G{wb?oV4d;fz}x%g^?I81?rnN*z`U1kPxS#(nTqizdh5xE4S3tmvDU zLf4-YX0V7I405!$scPijiF4FTCEcWBtUDCS|!btR2n6DtkT7lfI(?yDN!qB zk!G_g1KA~be5j;sPAjRSC4j_CCCYBbmUCrOZZ}6iL2IF{ikLGat#iH3j3k~cRwhb> zTFLkd9MG5KtxPSMrAU$wg97Y)P6nGv5EZjTzO}-nvC=ZKJkt9qf^;C5Ov$Wer1&6z zNK7O2W(rLh3CKqNnIjKzip5GSq@j!dR)+Tyw$q zB+Yk9GG4-*awDf`VgPo){e1MYNgis+NvzQq-Ayob)bPjHLo?MEFHIt z0vyp1q)+fl!*6x%0yTA#-0sJsazy#A=5}Qr;LH_l#!PV zCA0#?1uu-Pbtljnra^Z$3Anu-&m0W7u~t%Z67elyKz!7S^Wg=f4%PvL$)n{#eSR6P zCzH>9*H&&vD{~K@*_qJMDo&u${c`dd0pH?9|CbmF+p^x{!u?d&CGPQU(Oo@$noPDK z)KoUreT~w4j$HIZb#udiDeVJp=4X%B{(f+O4ImyNZeO2pHR9*;JNV!-@VkEiWv~#j literal 3476 zcmcJS-A-Fq5QXPDPjQsqBvBgD^s4EV{|HFfCbkLX3V{ucC2SBjC3%cKZ>6T|o5l7C zHYt&+%CgTnbN0-vS@W~Ezx=%wFQST8T*g&=j_a7l@9{B~l0A!YJlFM2yw>NJc%u6k zcfVD1r7?+{xQG*JRWX$ILV9O0)3u6*-dyNfTSR)T_X~Zm;}88#;?+_J|#HSCU*RzNwxp!58|Kz8_N$Jn(awSmxrqpcqR= zlvs4!@K*fIq`i!{YphjT@sqf$;@|kg&ZVMRXAF-ZC1RKbC($kC)eINZC&~wru@J-5AEl~{;>~w4<47N_ znssKJVXEIXSMb&RY;v*5SEW4v-~4Ript9EaDxFl~m!8$P>8~xVpzFa; zMRPyP8s~nhyNk^8dM|9^se7^Z{&4@_&+5;a)t-F2myMy=mg?0QBpcb+=%j zC)emQ|Y){~Q& z#+;d@UH8={yUfOOS-ce=o>+zNGUXOI!^X1fIcLvI9$2|ekDhJJ+IrqC6uIY9$xHD* zik;Zie!!m4kL?)6p>~5obR@BSUr+t`pr^K^ZONN)q~ETj?Kp_NT#x>dz9X&aroBe= za&=4VdXf)hp{eyFJr8olkALD9FMqvew_+c%4p)41;pHW6tqTEieJ*{?h+jsFbWMe;BC7RZXP5Abl5>p)vD88b}17jL#_{Yv&5(ru_R$N{IQ|57t#jb0&RL`VkA zG<8w%4E44tZ{&8Qd+M$dg1$cOL}9K$JjlLl>24UmYSmum+?_zB9Z25Eh=~NAV9EN% z;u^EI<<$Q$<8<8>Ttp6*fj$R{1blQZr^+4O9qJvmLkG6x$-e2BQqQdR6TR!s!6#4d zj8YkOH-Psrd(7+I-@O%Eb;UJS6$5un6Dr94d%weK4m@jE^-yN%iH?{D6&1j=AQ$F| z=|Jxfgpa=Jh>5}#m4*z?-bsUN9Xa#JF_YaAdzmEW?Q1EPHs>!m9sm>%9lK3osnmghvJv~i?oNPIhv(L|@ajbiLJznWN z)1J4~ySMsq$8OBo-REUa{QS2;mp%NGe$9C6&gV$~Mc6?(3Ha{0deHp%RKPC$4^Qh8 AB>(^b diff --git a/indra/newview/jcfloaterareasearch.h b/indra/newview/jcfloaterareasearch.h index 339763cd1b6be40607aca865e9ca2a31f01c2a20..413dbab998c09959316f7a2b2818cdc3500f174a 100644 GIT binary patch literal 3138 zcmb7Ge{ZD75&e7k6s21!@>(N%@A6md%Sj9{9##y@(O{nyMHT}+gM#U z%p>WRGx4YH4OO~OJC$dQF{iAR)X26{#>j%2RzIl%ALcPL_)h|-EcLUh_Y9Hix=_5X z8`f3QTur4BeSbk;*VmEW9SX~JA*t#+gPu%=f*Cs7>L&@zi5X5X{HwK5xtt?LbyT8b z20BfRzP~DsKuca`s*){J1&|-UEe1(Xs5umahKnA|9qTz(ajc8}?|P0HuXXW|I7gxL zzLK>W*ynj&>XtM-EmfJ3t;)*oIE5q5FvVf{$^55Q|9C;6#At!Q5p`C{x1vG^ug+mC z%5===s3qNY$4piBLR-nQ0>_$UUBD}$ATFxX24Wc)!}Fz{vu7HSkS+0fi?f;X4q$k_vHPui9I1GipgJZ0v||#j_okKSpmpi_<^6?4=I;^5^}mF^4YYp>&82QGlKH$zTf)h1!e28&jcE*N;6X z;g(*%98iY>gE@(f=lJ~L{o!B(XU?qku8E@x4fe&)hMVA0}QL zr<=r&!jH6y?!XQ>u(6uQ>QWRA)5UP2_?~f@jA0COx?6d$W8UG^UJ~0(jDS!ap6@Xd zS)rTcq*)5Ro4~*ELdWBpA_ltih4+!6?AS+%H#{(w)}4*a5Dl`kNKo7Od7@y@jj@uy zB-_0O3<@8(;&^C5_>*)1AyQ{Gv47YMxEio&WHHB9+xGiCf9b}kO8o=dj!%D8@qvvW z+ZS5Nx>dB0S)V^YJIk>yyOo)cS(`u76*c{~#JLj$lXL!! zMWDb^8eRYR4#H2?Z`KHLWzF94pWzV2{S*Yk{R0)5$v$3NvnSP>J}c>;?=3)pHM=~Y zV$LsV5k&ztx-*MjmBkqYoVuU1Dkv{?C(pK8my|UP{h4;SCgi)Jx{exIGYkshwRlAI zrRfIXj_;kE20N6K%dU&If0Mb{v>J~9qhz%O9B@fqjPgA)bmI(&#?*Nd&$Z`N!U_#%0jyrI4J(8j0v8@uZX z=dCTe3%&TQ@g|Pa&0C`rrD0;ten0k}Kg#^esFRUByoz%9ke86hDT@Okx)w$^15eZM zSnj~y25_TN2}UbYElB^BzS-5d2qr69Ms{Gv2I&f6041;XO`OkaZ?)AehlG z_)qsRR&&TIeZfTtt?b>MIhXfbXJ-HU^I_UaS*oUSnxqfuDqW_F^ft{jww=1^Q{A7WN4ma9 zcl5k-`=6ylarDx48l+QkWvM0ZsrdS7sQUwrR5UlxJ(oGPx4!248hxk#o+!(5n>KoB zvfw4MiXQ9L%U|C9faGnO@r9z!EYu^7*S6YFNu>K+c%r-}!b zK?_$oXTk!|_%#v@RuCDyh8$v>$#RczAX;a&$2;^ddo43hO{IZMyp#pRBeKd-JozZk zxTUMJX3;YqVe;Q|F7W04S@y-UzcR)7|Mt%^4l--eUr|Y6M^CuAvJP*KEDs_VqrM)B zg1QGk8O`(1a-8Q&Jq;|*i?y(fC$Gg^`|A2HNA+`y>XCGNEjxygF%kmMZ|YPY1JEyW z=GB6H-aJQVW}o*Zd@!9?Ze+cCg06FB2)tX-8D{cVrZKYGc|qu&bWhQ9=p)fZJjYx= zHHvS&bJEl3GeeW>b+znWdgHky-pC)`vBKZc<)+rdx{~XC&Nb6{@XC#8^xj6V&HLR{ zmV1ASxPO={&lCLPzSyi2 zd^Jfp6h~8<4{i}vWcN$c(>ANZ%9?3C617`byS1+(8OP>Ttf|g@95FlANK+II@qsPk zg_SL{xS}Ue>{;DmyW5LLU+G6Yh!_a#x;97CJ-;rNfo#|C5E*Q)+gomx#}t%Av?>g& zGoV{FR@Dp{2Ubu*+mh9ABHu^I5HgN@zz=VX4zz*EG2^LkU7#xqY1cZ<(E*cYzDb!P3;#ktN`xa@kiN=;^iQ$Q>%MDow7N ziiv!N+TW;MuN-vp=9LkdkyitFUt5hiz1R2A+*^6ZRpuFk@8~9Ekk@ay!g3#YuYqb+ zWT}aLc^*_`0NsLExS!|_)P7U=sH=T>B78-rF^11xh=Y4>IsM3OCc0sJbQ1SlaTH0* z{TC~uTG2qfE6NZ$F=+67F|R_t_XV((yN*YI?4vW4bANGF@DqctGVF@M!ivU9dZ8=E z*j2LIU{C$CjmDmXUCL0izPt9F^_lJN4@5Vzm5P<5ueFYy8GCN%GueqAKg&GUX(q5e zl=ttXdy;!@YjR)rEPX9&PQ*iHPyxit`(eer#54Au=m$4euy&4g|F_((eI&F4VfJ14 zT|EyZk<$UE23GwCvgYnB)>YKk;^w@uiH_Ypdk9V(n`qfz_%6!hQN(e_5T9xfFqO^p z`?hetm-Jnsey`55Owke#vBSE$Fo30Mcm^x!Ux}u#9SC|k*IekGvk|h((ur8DBuqG^d64-O=qJ>4ihv#cpgT7}`ckpH4zQ3I#B zt&imARE|DBrQ!FMs`e9M?pdy!s-xhaEjxc+3Ej2E2b%xwqcyk$Wbk!>b8IeWM`P3& zD@)xxH8w1}mVX1G*q$R;$Nf$gkgM#d$#K31Y%3;XT_8P`cc|L0^gB27P=sBZrQ)B4 zB+wHAje8{Yk{eSY9>_n_In9Y$RF&(Ue0Xv z@LfgQ_d_SD4Pw<1iX+KlC1MZ6Zf47JaZ7jBE7m~fi@ZnbeC#;!YPJZa+$9-cO3T=iiBl^oeCBJ%n@6 z>RikvlXETW1(QNPmFLk(PbC-LuBEC9?a=aPrl|O;;#t&DjG|wXH+++#m(m~UTI)K) zJEOZ69aQD`uFDP1svoR|qVDqg#DbrcY1lCnrgQncuZz`-`X}Q%y4Y)Ty3MQQ#OgjI z`Zt?=1u6FXVvS)d`-7Q0+&6ovJaiSQqSA};CMtVE;2pm&?|I+i8m+WpyRc5 zU(~ot3q5SCoT{uq81z&Pekre#Uj0P;T1e40jU*8p&)?Nl7n&!I zlM{Uxs{dQS`?278(9>JNec&S&-t@z3fAmUKNM;zjEEU tZ2X){_qaF?kkynGtd;nnrF(dIn!b}At5=S^8-H);qaWX!TY0YN{tb?4+1&sD diff --git a/indra/newview/scriptcounter.cpp b/indra/newview/scriptcounter.cpp index 4ca774a573d0994ef1e6909acc857fc43e8e6c7b..62c7b75bb9bd28790db4a14f09e89adcaad46e6e 100644 GIT binary patch literal 7025 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 Ka6Zv}*#806=ggV_ literal 14466 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 diff --git a/indra/newview/scriptcounter.h b/indra/newview/scriptcounter.h index 6d37063835cfd9fabc5433831f5bdcede246ad8f..78fd32058af0b58ea34013204dc01ca7556a048a 100644 GIT binary patch literal 2663 zcmb7GU2oe)5PXh)#UgpJ1;I*_r#L|Xnxd=&C{pEz9X}Zqd9tn{dFmZ$LoM1r(f;7h zl9X)6Nq`!LMc>`d&dv^3Hyx9!cYCAmwhf)+r}Xaa+Yciex)m2A!j zYDB-B(Q|&5^yWY;*M+32wGC=&G7x6yY_0DlFb82cLHASZM&)vXGs;qliW%r>YSjIV z8bOx4%v2=}O9ha3FUcV36KM`)P;k*gxg(z=iz6@k-+Yc3kG!}^oTJcrTgkfV)aQOp zwIPiiLsiyDqq5Q-yKuzmy4Zz3>Hkpb`!fn8S_=d|QD>EW;i(!)4x3$DRAX7u-b>op zW2P$G(^|5vps^-d7uc0>5RF2r z#6_BfQB40hF=GDZVtCI9Zpizxio7_cFe0&B`2t9Qj+`J7UOXWYxPCel!R3U2K|z?1 zFP0*~u_T-@P_h7z7m*asY3W7o0zl4%@I`XdrJRc-;B<53b7_;pgHu|B z*H8x&qi#b6yk#HqU&)aRFBI(nlvbs;wtyOCHWZkVzrw~NsmEUH?*SVusemo4V(>$1Gp zs=mjV(PqyBRMwb`+t;HJrlhqL=SJ-sSGP4L4xQ7kU6*({eP7hJ$?9AtCdWkjEeLjQ$+;c;};6&*D$kT9+7rw}mWagZb|JS4uue6Rv-gc{3*6 zeV%?Cz54rkAeKh2rsI2Mnl>xPQ$l$KChAb3yUpr5S)65+_Hb!9%_eEp+ z=F-|*+qLl4v~`W|=366oJN$X zX*wl$EAy|UHUt|gyOqU+|FL>PxLxdU!QgvI0p*O|pP_L>+h<+ZA?~+r+GvecRX4|u zLh50qZ&l}1taM02TTu0Irk5gTH)90`#_fS@Q=Fey+3r*CSv2^m=f|JPc4aKHT~`x6 zyW2{4$l@Ci@RW0*_<|cmo>scn{S|9Z4_lRQLAZZkdivdY=EW)nZMDYB#aE!`pu=0Y k-gn=b-#}DDTMiYoD%BEshlRgjz&9`h1fNd7oeZP@0JnctZU6uP literal 5324 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 literal 35462 zcmeI5Yi}G!c82>a1LQx96~Li)ZTgn%2gh+hQKTg-bqOh1>s>4env`V4A|;U2El%<$ zlHZ%;ed?XVQ{B@u(?gCZCu+d@KmYw{^P6VWY&6fC7tPz|qaFPhJq&-MG)&0p!=Z_fXZn%io1*t~3>HT!BgYIfDbsoFkjj`V-j ztm~6!`k%dW^+cba>i491rN4*G+If#L!l>CPpFAzS(fS9Ca;E>!n`8B`ufK=-|FZNm z(siz$>eH9%^+0X&o*&Am(DznXAM2izLfyxD_gbHwX||(sHAj!@^am%7^!cIgeXQRD zjUJTH2R$?13;m^MdV~Ye_d-{mYnD&-&Q}ug>q!b|c;Ox%fJpkM#9ibLw)AQK6T4!(pgpj%OO#oDSOeB^Tz$y|ij; zP@5iT8fiAq%UqBV+@mL?JQ4>i?VxGe+%5T_V3K>I!mm@&gH}G(9FR-unCbXp5O+M= zehun!$Fjy6tbaja@~Dp=lU%zB9`#XzmUX!nmKAe3l=KcXLwI^z^da;z?Cn$C0TLi( z^qbd5MdNw>RIi>DX?HE7kD{=`v=!5MR(h%tp)1`li*)a3eA~C_h*=zq3T7}LztC1@ z&~2HPL;t+9w$_x<^7Py`t#$qjKft0N3Ju0E(Be#^jdTqScWY=g1?Cqx1hxdSSldhi z77K@ssURKLb5#1ZjrH*u%zUgqUyCN=Sa3bC@3bJ>fqFLjd2G-K&b%&T8u7s3M8Q+d z-k6orNeb>aH=A4X7x;|3%~o^2c_?qO(`@RBuiw+VyUllccSBci==$~Md;Ptwt2del z&33t;_TTIGzV5kQ`de@Al)E={-yL1wQ4iO3|9!pRDR=y*S~4=@{8uHRXvu#@+HC&N zK*gr+<9^!H>b9%XZo-8<@&(YU%>knNV@r1y7q_o(!9Tc1Ne zbA-x|E1KYwc`|=gDBMyXx7A`tW8WOpw66KzDkI%5^NM+Hm2vMBikaWmc!ukGeXnqr z`D~o?I;D3{*LHNzUCkBhLUPP>x6FE7ub|^bu|($YIm6ZO^b4<$9W-w1XTDs`{b^E7 z+O8LhkPq|TF7I+?mMnB4*9}pD7lOXNYa99m?SoqAGP;B8upH#Z9Fc;#jdmnOyZZdP#zV&U^%@Nv ziH5uSxl!ma$Dw(r*x`m=?Kc0QyS9tuZ4+qR16|)Nvt};v3QoDbsj;rPwXb6dyJe=f zucVCGL(PtU9%wdDh%FO~-qfpy`V1Yy8aFhSN5^_Xv$@;vuw&a0qw>x+68e#L0mToC zwfTPA`kjhnse9|^ngjnp7&OV&+_tvlgYk#E`s9msY>NBPg&u$%$iut>E5LyrQHX_Y ziWkW*bdIa=?OV0sf6g9!^1P98%s+6&ysNL$(&;C@@bVg#cE z)U{E_azG0~sRyhc(`$+)o|WkOk^B(e4=?$s_~IkIeyUH2 zx`{*fOB+1$n%-ZV+3Rbydn~;p%Xp;Mdz$H?#@W?7JRNjA8PpT>IZna1A6H{fo6Sr0 zexNZ<3Jv?^HJ7Xp2)(}*NC(5n;u9xY5an3Js; z`)tt2b*pI{MiV~O58gAZmi*vlv3KVv%pR+u7Vx%Q-_lI5y?grqNOvPOWI}e^M#5Ej zt!-UPyW0@;AOn>p?D0_V;@U@wAfPBmL_SGb-4FF8=QGrzxX;xHk9VW_Q2isZXYz-` zd)?AZ(Zpw>i5a?PGjs%KAL=2#QgvqNy{jd@`ARc7l0SV@w1G?z54I})J9Bf3Bai-g}Q) zJlrT$;`8uaKdGfH5UF7o*gc+@8C_E>WBY<0umNPChrk$Xo@aQiM3ne|=c0(J*H;<^ zInvjMgSkvQ^k~SK#5`pF@Rrwms;T+^7vfg(i_Cacb0Zen8_xwa$71%zw9?0B(K^cr zs_6r5TG7uF@rw303n!xWnpz>>>-r0iKsVPo@9X~){V+#N0wEr(C0sy#looDv(x zrGGz{wJ0-$vDqXx82p+e$iC zL>1l(-Fc+wl{gfcnO@^~efK2djGBKG*PaN~(K;}wjroj>y`r0BjN2Oh+Sm&FqvdZaPcJy)hpG0@?EZa@XHul8rwpUow`y=t@n)<gyBzqG@R9PepH_%qvJ=>eJ7f z-{~*!(e8^`Np1JWr}TelI5pX~h4R{hLeoCz@vo!i-}EyQMqCcXu`Kd{L=Pxf8RPLY zjX(s&iU7808~Z@q@5g>H_Ou84SI2zc(`Pru{~dW5a&T%Ucl18cXhkvzo456LJer#zT4hh?K8uWO8XNan?vjRhv2hJM39n|-HlMrn1kRB0&YI=?p8EN@D;s+&Ef~s6-+y&{++G?Vw+Hd@ zNH*XVzdDOpOhYc~!_nyZQPZllweK#l1C+Qf%YCKS;B(xGk8pN*Us7kKg*)T5W65sR zlRbep_;h3TbnIYNJ>x3VI1OKGzYsp*)A0!D6~MrYqdl0)S{4ZPqx?-BvDNsF@3xiT zxw6u5M=f8MOc6XFLO&AX!ezKIyVW$0?|B>BJ@1Hah(d|Ea?OyK#T6`8{HS^{lX~v~ zeipnTKJpr=d%%-9I*m1PVlmdV86|v(k;-`jQCU*u*yW|}CH{L`bcvNkR&H4(XSK18 zQDQBV-pMWA>T@_rRlw`^{C}h$XQi=X`7gzb&}Um#$pfgv1^ghNXeviyG@Mc9V z`lUAMsY4U4i@!vV&oomi5tE$Ah=cwoWxA}s(V-*BVY<|pGm?GFie}3$h(}{vO&(g8 zcgyFtmRf)C4Op1%w{7>aQzNykMw>u|Wk{)wqLBsm%l?iyiY8&N%adh41(Vt_ZS-YI zyPuY>CiPPi+F4F=lbDwgO61;nlVNLCcr-8yze3!Y6%42dO*Fow*T-VXXHSZy zrX&M#x_L8oU$Fi}RN2q6cLYyDZs;+;F21+Uw!bMDP-nR{(vZ!#$BgG}m9F2u%PJVv zC2CbaDZHAS=rr3RpxY6e6**jeF<1sdotqP;3lv4R4eFmbqI=C>!$H6A~N&Lym}~o>_;&w z=Fy_AT@9h*edub|X30P6*d=giD3>QOH92uH4o~(ti@TF|=lJiNv)h;8tZjX0#IZQ1 zZ%AWnxliZuVwAjJo_A-ps5YZJS@-q2Fc}k7X>!ZGl4m+UTGgH8jgF#nErp2ui9Yjc z+!ykuU#abZdL|z~R3E(Vj^Y*4O9jmE)_*L^_8P3$@#rho&Ai*hD{sqM z18QeA?=k^b`#KUe)KQ+C!qnJNl_g!zcf@1##`d$ZjLaio&9S~mb*{h5PwsraD^vU-IrziT@CC~ zTwBKU`Pa3wl}lB6CR@*vL*`2$5`4ede6pX2#4W?9>(ejx_^SAdti*d?jo0@3BKOJ6 zr@dP6KH~GtbD)LFDJvIUWU)jSomp^+2s+W#@!VBra2XT7TFT7om5KK~v+bqItX{o& z|1&e%Op{sIW`D*vX={$fyi);B?)6FINqar*@-qkRw^TvM9iNfq6HhqHcO3bn?s?sb zr7kz4j2f-0Ygafd$G&=5H&gGs=Y8N%MvnHUL065kylz)M zK-=LJ!tUKeR`EhQ_HOk)JWiC<5og@#Oozys6ChuzQsc8>5u2_`x99I4a!acJ^_caD zt^%gliK?SLisK=)hxI(pgWN7Frt9KhoZez@#GckAH}xsIB{;RPDGwJ_xISM-^^*(` z%69aM$hGae>a~l>+Gtk!V?Aee94QQ^cuOPu6x-r7d*z0;f~%(b+d?%bcNVAmTXC5k zjxQFVI`q++n>&d|r8XJ}8+RR5dyQ{OuJQTB@Fz#B`>OG(i$nb_5{Yh$qT|-O80Q1; zh?ksw^0}wI=8w|dw1{bQs(am6ELUqRC(izG$zJPul99OH{6Nwho|8~5NuJa__V3f~ z$Hw^_sC(X2rH0jR_VryX0=+7#mrY&nsGsCxScvV2st7#tneC^|zsgp;n?Fw1)Mt#1 z#jIKz-DpQ;Dpwvaa;{*SRBPQgwdmZTFxopOPRn`?yA;^xfvkMq!F%(VN78#x)pBzG zMD9!_dP52zDcJO^SdsT>cn^kGyXrdvOVaz@E3~XD&cthS^5RUsvAy;YYpLzg@IUKi z--pkoq^;al_WyXy?>`p2On>(Ccx@Ta#)wHhm=G}~s~XO|b|tTqi5r0GvXPwP1%r9F9c{QDhomN|@?ul2*e*fvLVHw#aXKo;z9;WgSa zjMve($7SE;4N;JYoNKh*SS+w7MG=rUDDBC&9@;v zhBmJky+M=KL@%c}rc*N<{}(^IF@03DDpn8M73tI>WUvr(D+IO>O)tQldtGUbbDEiOMMWo}| zugcbv`=I!#atjb0uR^qhCZXfx(w~*roKjgVtM+M>MMnC3&`5pRu*aH3Uw<|l^07?r zOIJ9vVLc*>wI=c2uZRrV^#(iyS;RrnC}M}uq43x3`#-o)eS$Ms?bUJs(2(U|i^ z>FeV^+A@p6AytTF(%3KU*)$HRIrPzJ-65tYuP~ypXZlpWkJy3CA~gv;iIc6i;3tYT z;T`r@+b^sB*+c!wJ!x51*J}M*Ci>6cr8V!YH2Znm*be@?R@+|ZWR2-{*+qdpbywkI z|HBZ9UKI&2vT=>QU1V!i?v4wtfu}<%lCi6j%yeFWbAn8*ZK*6i6`jtcDK48kI_YzY`-Sn@hp}& zkq2J%`N_Z}^d#3TF1}xY_~o?3wvIG*MF%--QbrWf_4&)t(wh3(T65%grH46kt&0(Z zbo1w*&npDrnE8*db9@Beu}_zr2zp)FYv)0KD-N53USGfHX_~ch?>ibTa@(9stzVAT zFN-7DcNm&%(-Cl zFryptO`G?9WWl@g$9IJuo2n`CtTW=v?H-()9INf!=*!U&QFhn6QDd8iQ>OJ@VbtWl znJ!nZ#!vp=#3plZ`MA_4m8-*~$tWhIvm89)L<1)%>YYXK5DyZ*Xm`Ad?A(goM@Eog zXUifFsn1DacdP@vDG^}ADZg!gTcRC*5?3PzX^#$qEi(Qs#Tmpr8;THJ=Vz7?Yxrp* z9@lgG>^yoJHj0sJLw)CIFiz6dGtC)9Y-T_0+E~_hrpJ}TXfel$t>R1{@j_iEVdm!V z^0mm``&E(b`_Q84`a8qR zyzAAq+CppV42xJ13N4C5!^ZB{o9Q}PW6-=2ma93_BGdV&ecvbc1l5aR&pf^k_g)vp zonaL8>rSA{G|ZXT_g}8oq_=JF_gg&sa=nq*VZYQIdDeUEc%a6`N(S$#Mcez#%TK8F z;6cbtyq?1;$XQjFxI6aDI<^Vzh)>r<$$E#PwGxMQDW|<#o8ql;1n7!WfBu+zX=yzY zhO$<%rnQp4*E(m?!c+O8pKo*z--wZ(`R8*F?R(JdXq&N$<2CrxKPT&TSF)?x@B6#v z??j#ZjycZjt={3edM+78cD$F8IX&lF(t5E~}n*L0`I;qeZl2EWd%fP&y_-sQ>@mS| zh(FGxOQt?;VwhCD3uIN#d37&+_5*5lb*x?$iOA{Kr=obD)gn(tvF*>U?D8!4%+G4h z*YRoBqU;yEhCliAqTB&9Oiw_`$Pl~p%lccpb~bNi$QIm>R$;AROxWkLsu^8fo{W5E zVddoA?c8BLPR{e`U`cKDd$M@1Jnl&bMpm9m%Qr6ZgkR8juhpW9r?Vr1AxOG?KGMCi z`eUydQUX(_(-QLQ;_I^bun6`}r*a++&uTdwljmvAuXvm*NL~Y*^lS5YI18&LtFfV- zfiCYCi!U>`%i-|k$YI^HG1xiHaw1np;X|I&POual_E`s_&UvhmO+V{1Xjq;vpXk)CWFQSjru-`prmKc3U6{(L_o^rx@ z4{UcNUH4wVT7s9Sl&CcJB09^-j4)`Nq`Iv+)_kwG{8F{2Yn}6SXY&4EmgaQh-#Vjs z*SVafADX-98ubIA zzg*=%cRH#ToAUj3H=7?}3y?&%XL5^Pg9Dot&M~}JDB{< zfpt%TrPKv-H*$Rj&NAc7C)zVvDMWj}(-`c6X64~aafa`djgyJ1V?82LwMOxZ(-(Ym z36%-HWy0EETKmsCe_XyJv+u-mM3|hkgPOf^UYhUx{B0!T0C7n$mvyTKAkQrwpUtdiHGkqKQVQarv>Ys;5F}GR8PuDi>S|iuC{oc zoUlEmRVBu;2PFHd5i8FI&s&>nBil6FuuRt^ zb=Eqtd*TzKcjvLR_Y>w{7pyl8i46Ys6t9fHSX@xGJq*+-KN( zF6uLoadI!P!5-u<%kup6X=0DiJ)e5N3~Dda66@21ak7yUKt7|0^szsmR;EUR#yh6> z*}yo(XbVUyPFomy8kf2V9-`ih-#%yFjcct*PeqZxgST$UiBRffv8z8~ri?VA##Fbe zJw(JO?Or}Cr&Q`|j)2$!!M7;Hy6Kk2<~2DFD8nc`>5H8cAV_~iQ%Cljx{I~V^q8CC zPTy($$qF!QXq+YFy8)92lMz(?X-0B9kzujfa8m4DJOdVeSezQr2Ty^9@|tf?T>fg@ z#b}#E`UmBE-+Vr~mIrI`hvTR>GPzu-_vwK+k;#fZ8W!6AZneLyRp^Z~zM2BQy&fIs zJa6BuCUx<0x_?>ZS#T5`9zxd_u^IYmD tNKHqXX-`c_X-Fg$(HR&I*SbgLn1HFJ@?!rlGh)}H|w3%&#Rg)7a!=;_dk5!qmTHfvB@_@W=ZZ` ztx88;QBV`;$SSAoR^?aw&_w0h)mG0pwKf%HRZbhHNLS>{#x7JdGS^jRceFINbbWf! z^@@z;MEqzrHI*jUOTEY#qfePtv{ts%b**w*TeHBm&&qK0QvNq43eHmb0C9)^9_{i_;f5fUi5$S=`fDGxJjHNH;YZF zs=861`*m$B8O&HJvszi56|U<-htqViS$@+0eW^cQQKZmXAaF#LmFktJDkM2fHf_9W3Y8 zYQdhvVhyMl%WkV$-#G_A9UPvH0!cEyOJ`mp2+xxweh7wQNP|Zj$HQspB_tnZD#nt$ zXh?n>rAaWDrg0+aum5-wi~jmAm&3DO^hn~DNg|}AIH6!X2?JmOJn^D55VB7}KLU_92*MzJY*O9@X~gO7kk6xum!yHu ztQl!CO(wAv#I+3r>4#o07Q-uWKwc6LB1%b)yfA!KD!@)FWw3z&QEw26HWexz28r-f zF6sE>Lp%@+`y?mA5BNd+B2bN&JocdpBLP{8pQnh!JPp0EcP}Jeep?ytj6Y4pm`TTX zj3cK5nFi@J6?7lR!$xu`l83+-@|MDwn{Y={Df&o~dYqn7pctm{JebOWwPUOxN=1@P zCutBzA7~WMpbj+fu$tRCq&RB2i{`}1Bjd6dO&j_&8wre~-_gFjH1Sv%39Ii|Md{n1{1{v57*z4v-q%-P5S| z9@Dx~--rN6wJ0{&e%}?vnjx-M?~a2%&5d#O^}4oCydPj|RB)I5&vnkk-&; zu+c@{gl~<`DYw}Rzx6Jf*UdV|mYo#a2krD+7rNdZV@-vLfm&r-?07zedRCX>IJB{( z2CJ=wKQK7SY*wbbwIap8O$x_n#DY#T`K;+lepC6-=Qr^MZOsRDb(*}*=;JW3*@W*A z^<@}N1C|}fIDY%Q|Kn&4Lpl78)=Yq9Y0?3>Av~M4OC!Kso`!F;V#6%I3J?ERc#8qc z72lC|EpY{b_gsGG+rh?GR34^o>5pCyCr+&vxSpV&4Zr!JEggZWQ;B-UL2~#uzD<{9 zo6REir9RWF9Yzt`*Tdo4(OmL*bferb+oiaUyvbru+Nve`vI_B?aZ~9UUr_6)_GC7= z2sGzD&SE}&)zTe|w>E2B8EZA;8$+wPW1J)FLxlWo_w_u|G$I~CK-J$Z3iWl|iSf9U z_Os;-o#?INtyNCG5;Q@V%+J_6m7$-?C2FDguF&Z*od$57ZCduE^Ug}G00NiH5$=Xo zRN1^>gK*a4X7cgkqCBa+*<)bF^MJ1O!!!y%k2tUV5QYz;+o3qovG^v%`DDX#r1)OX z6xrD)=50q@eRIS6EAOc7c6)Q<^mB!q-X}cao~d%)d@Fby4*pD~-@Q2GY${@%9l zGvo2@dN-GXD$DlnIWu$KdFOJ@?mvI8r?r%&Rys@P=_*aqNjgp+(oAEI(ja}S|EKA@ z^u50Kb-lLu&C<3shUp@W(xJ4n)RXp9dPnJ0|5<8iW~BezBBK+{PxYOoxqgS~$%@sk zjh>h#G~a23nf}kxSlWmB9qRwWY-Ac|bgJ14SsX|=mw9KiV7t=jd&x`;*<;;ZYHlVk zGaGfk@=>he|EXq&l6j%Qpz+UGGI&8`U=2IOHk0Qb<3Mzs*BOii@{d3YiZh(~0V zqj-8JX57>ItXXBoBTV*t&IP`lpDGtszB0x6|K_KPgUnjxD=I1c7z)=w-ofVB@*r|C z>T6vRR6Y2~Xs%B!$GJYy)yU$!S_@S?c`fFv*VlhJsy|p%ceJ+GvSSDvV<7L|&wH`K*UGHl_ z-%aJY_os+UtiGSN(ktx;>25c@*4>6iH#FW%Z}hvZ(T&tk z9g|1@jlTPm**1HPv}4jO$?a&oD+^7@@9Vy65`RjQm09PnWn@B+f7WTIUlJJFl0q77 zbhb6x(Z6GI)LmI*Ek=9R#a`*YCAq$^aQ)Io9Y?17T}fwVXIt~2$3rkaULt}c=i~M@ z!M7<3+tTQ2<*fyxhJ1fz>+G9X;pL{Sx?_0pZgb&ZL)Ux8EZ(%1JV)I2G}4vCuKWaB z#0)Qc=5a$;pxCh5!*}-=Mqld-Pecub9er+(s55_EJOf$N@DLe%?$}-KmB$p6M6@Lg z>@}dP8*6EXtOF}3k?qNAG_mg^WC&SDKET5plLKvFa?CLGvv_lRuAj+%L%I!R206n? z>T7a_s8KIO3=fHbGfiFuo}Ol#T8-H5>zcgFgkV>n4MX8vgScz8*V0ul{V1u9#oQ}_ zOzUgBZ64zZJi(IdI~LC|*Y~tP-ps| z#O!aiYd(;@kvQQg0{%wwol~x33`^@Zw(gskheA7Du+_3N1Lydrz8_WpRhgbv@TZrF zqKbzjlPgQ!HFBAJo_+uL0==f{Xjjq2H_w-*I5-gpL-mcYKGz&v^CUA-d@q-CtewwZ$jVUjoDRFP zF;~`bPUaaIo19Xwmbyhvm~)M$bjcx}O*!AS78!M{@kiE^uv?bm$(l23Q?heid;f5I zL=eoU>PJ_?M@1ejuiZnupjQ0(c_4{;pIY+4^E9|A`;QmMkUzf*>qo8U)zFmn@wJ{8 zeQZg?pAZk#aX1h2E@CEK`bb~BEwX)0I0u>`^YPfv{{C!?Y)^gi8;yg(8K}n75qr(T z@PR(XRd*I>c+Y}t)%si#BjwCdO}136cfQ(s5eFTDcNBO@o)sDAtp-sl^YTge{@#F` z;c4NtqQz>FRhZe$yg<4NB75A zJDKl6#U2&8K@E{d>_74B8E^3DEaU;!d5$ixO4p=+(-+8)gT?=(l;_hWp6DCJ-nVL_ zr`~aOtG;`aXX2_AXSF3uymvaf)n0C?$WTP3xZ8#gWhSWgVvZMkTK!&v2Ky&(^qfEX z{id+OCG|-xvB?{(c&AX!kG^$9?{(-zmA#eDu%;^&{cB5tU1>{k#}+jz_^Ije_K?aXhH>)c zG)^D)H$pG0_ruCqpW@7Pai%Jxs9S|KR<-f#`Z|C&b`;q7yg08u)asm=dAsF(>dT%P F{sp@-4qN~L From 8d76b798c96913efe8dc65cf28008a0a49d5c9c7 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Tue, 21 Jul 2015 03:59:31 -0400 Subject: [PATCH 15/17] Fix a crash that was possible when teleporting without quick settings having been opened. --- indra/newview/wlfPanel_AdvSettings.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/indra/newview/wlfPanel_AdvSettings.cpp b/indra/newview/wlfPanel_AdvSettings.cpp index fa0a1b693..b105d22a2 100644 --- a/indra/newview/wlfPanel_AdvSettings.cpp +++ b/indra/newview/wlfPanel_AdvSettings.cpp @@ -222,6 +222,10 @@ BOOL wlfPanel_AdvSettings::postBuild() // Set up based on initial region. onRegionChanged(); } + else + { + mHoverHeight = NULL; + } return TRUE; } @@ -513,7 +517,7 @@ void wlfPanel_AdvSettings::updateEditHoverEnabled() { const LLViewerRegion* region = gAgent.getRegion(); bool enabled = region && region->avatarHoverHeightEnabled(); - mHoverHeight->setEnabled(enabled); + if (mHoverHeight) mHoverHeight->setEnabled(enabled); if (enabled) { syncFromPreferenceSetting(mHoverHeight); From 4c0038a8ecea6856582ea5610adbd47473fb314e Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Wed, 22 Jul 2015 01:49:18 -0400 Subject: [PATCH 16/17] Hi xuiparser! --- indra/llui/CMakeLists.txt | 2 + indra/llui/llxuiparser.cpp | 1785 ++++++++++++++++++++++++++++++++++++ indra/llui/llxuiparser.h | 254 +++++ indra/llxml/llxmlnode.cpp | 28 +- indra/llxml/llxmlnode.h | 16 +- 5 files changed, 2072 insertions(+), 13 deletions(-) create mode 100644 indra/llui/llxuiparser.cpp create mode 100644 indra/llui/llxuiparser.h diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index 057e7d0ca..cb9a4e4a3 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -91,6 +91,7 @@ set(llui_SOURCE_FILES llviewborder.cpp llviewmodel.cpp llviewquery.cpp + llxuiparser.cpp ) set(llui_HEADER_FILES @@ -172,6 +173,7 @@ set(llui_HEADER_FILES llviewborder.h llviewmodel.h llviewquery.h + llxuiparser.h ) set_source_files_properties(${llui_HEADER_FILES} diff --git a/indra/llui/llxuiparser.cpp b/indra/llui/llxuiparser.cpp new file mode 100644 index 000000000..9cf5bb03e --- /dev/null +++ b/indra/llui/llxuiparser.cpp @@ -0,0 +1,1785 @@ +/** + * @file llxuiparser.cpp + * @brief Utility functions for handling XUI structures in XML + * + * $LicenseInfo:firstyear=2003&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "linden_common.h" + +#include "llxuiparser.h" + +#include "llxmlnode.h" +#include "llfasttimer.h" +#ifdef LL_STANDALONE //LL_USESYSTEMLIBS +#include +#else +#include "expat/expat.h" +#endif + +#include +#include +#include +//#include +#include + +#include "lluicolor.h" +#include "v3math.h" +using namespace BOOST_SPIRIT_CLASSIC_NS; + +const S32 MAX_STRING_ATTRIBUTE_SIZE = 40; + +static LLInitParam::Parser::parser_read_func_map_t sXSDReadFuncs; +static LLInitParam::Parser::parser_write_func_map_t sXSDWriteFuncs; +static LLInitParam::Parser::parser_inspect_func_map_t sXSDInspectFuncs; + +static LLInitParam::Parser::parser_read_func_map_t sSimpleXUIReadFuncs; +static LLInitParam::Parser::parser_write_func_map_t sSimpleXUIWriteFuncs; +static LLInitParam::Parser::parser_inspect_func_map_t sSimpleXUIInspectFuncs; + +const char* NO_VALUE_MARKER = "no_value"; + +#ifdef LL_WINDOWS +const S32 LINE_NUMBER_HERE = 0; +#endif + +struct MaxOccursValues : public LLInitParam::TypeValuesHelper +{ + static void declareValues() + { + declare("unbounded", U32_MAX); + } +}; + +struct Occurs : public LLInitParam::Block +{ + Optional minOccurs; + Optional maxOccurs; + + Occurs() + : minOccurs("minOccurs", 0), + maxOccurs("maxOccurs", U32_MAX) + + {} +}; + +typedef enum +{ + USE_REQUIRED, + USE_OPTIONAL +} EUse; + +namespace LLInitParam +{ + template<> + struct TypeValues : public TypeValuesHelper + { + static void declareValues() + { + declare("required", USE_REQUIRED); + declare("optional", USE_OPTIONAL); + } + }; +} + +struct Element; +struct Group; +struct Sequence; + +struct All : public LLInitParam::Block +{ + Multiple< Lazy > elements; + + All() + : elements("element") + { + maxOccurs = 1; + } +}; + +struct Attribute : public LLInitParam::Block +{ + Mandatory name, + type; + Mandatory use; + + Attribute() + : name("name"), + type("type"), + use("use") + {} +}; + +struct Any : public LLInitParam::Block +{ + Optional _namespace; + + Any() + : _namespace("namespace") + {} +}; + +struct Choice : public LLInitParam::ChoiceBlock +{ + Alternative< Lazy > element; + Alternative< Lazy > group; + Alternative< Lazy > choice; + Alternative< Lazy > sequence; + Alternative< Lazy > any; + + Choice() + : element("element"), + group("group"), + choice("choice"), + sequence("sequence"), + any("any") + {} + +}; + +struct Sequence : public LLInitParam::ChoiceBlock +{ + Alternative< Lazy > element; + Alternative< Lazy > group; + Alternative< Lazy > choice; + Alternative< Lazy > sequence; + Alternative< Lazy > any; +}; + +struct GroupContents : public LLInitParam::ChoiceBlock +{ + Alternative all; + Alternative choice; + Alternative sequence; + + GroupContents() + : all("all"), + choice("choice"), + sequence("sequence") + {} +}; + +struct Group : public LLInitParam::Block +{ + Optional name, + ref; + + Group() + : name("name"), + ref("ref") + {} +}; + +struct Restriction : public LLInitParam::Block +{ +}; + +struct Extension : public LLInitParam::Block +{ +}; + +struct SimpleContent : public LLInitParam::ChoiceBlock +{ + Alternative restriction; + Alternative extension; + + SimpleContent() + : restriction("restriction"), + extension("extension") + {} +}; + +struct SimpleType : public LLInitParam::Block +{ + // TODO +}; + +struct ComplexContent : public LLInitParam::Block +{ + Optional mixed; + + ComplexContent() + : mixed("mixed", true) + {} +}; + +struct ComplexTypeContents : public LLInitParam::ChoiceBlock +{ + Alternative simple_content; + Alternative complex_content; + Alternative group; + Alternative all; + Alternative choice; + Alternative sequence; + + ComplexTypeContents() + : simple_content("simpleContent"), + complex_content("complexContent"), + group("group"), + all("all"), + choice("choice"), + sequence("sequence") + {} +}; + +struct ComplexType : public LLInitParam::Block +{ + Optional name; + Optional mixed; + + Multiple attribute; + Multiple< Lazy > elements; + + ComplexType() + : name("name"), + attribute("xs:attribute"), + elements("xs:element"), + mixed("mixed") + { + } +}; + +struct ElementContents : public LLInitParam::ChoiceBlock +{ + Alternative simpleType; + Alternative complexType; + + ElementContents() + : simpleType("simpleType"), + complexType("complexType") + {} +}; + +struct Element : public LLInitParam::Block +{ + Optional name, + ref, + type; + + Element() + : name("xs:name"), + ref("xs:ref"), + type("xs:type") + {} +}; + +struct Schema : public LLInitParam::Block +{ +private: + Mandatory targetNamespace, + xmlns, + xs; + +public: + Optional attributeFormDefault, + elementFormDefault; + + Mandatory root_element; + + void setNameSpace(const std::string& ns) {targetNamespace = ns; xmlns = ns;} + + Schema(const std::string& ns = LLStringUtil::null) + : attributeFormDefault("attributeFormDefault"), + elementFormDefault("elementFormDefault"), + xs("xmlns:xs"), + targetNamespace("targetNamespace"), + xmlns("xmlns"), + root_element("xs:element") + { + attributeFormDefault = "unqualified"; + elementFormDefault = "qualified"; + xs = "http://www.w3.org/2001/XMLSchema"; + if (!ns.empty()) + { + setNameSpace(ns); + }; + } +}; + +// +// LLXSDWriter +// +LLXSDWriter::LLXSDWriter() +: Parser(sXSDReadFuncs, sXSDWriteFuncs, sXSDInspectFuncs) +{ + registerInspectFunc(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:boolean", _1, _2, _3, _4)); + registerInspectFunc(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:string", _1, _2, _3, _4)); + registerInspectFunc(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:unsignedByte", _1, _2, _3, _4)); + registerInspectFunc(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:signedByte", _1, _2, _3, _4)); + registerInspectFunc(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:unsignedShort", _1, _2, _3, _4)); + registerInspectFunc(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:signedShort", _1, _2, _3, _4)); + registerInspectFunc(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:unsignedInt", _1, _2, _3, _4)); + registerInspectFunc(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:integer", _1, _2, _3, _4)); + registerInspectFunc(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:float", _1, _2, _3, _4)); + registerInspectFunc(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:double", _1, _2, _3, _4)); + registerInspectFunc(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:string", _1, _2, _3, _4)); + registerInspectFunc(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:string", _1, _2, _3, _4)); + registerInspectFunc(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:string", _1, _2, _3, _4)); + registerInspectFunc(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:string", _1, _2, _3, _4)); +} + +LLXSDWriter::~LLXSDWriter() {} + +void LLXSDWriter::writeXSD(const std::string& type_name, LLXMLNodePtr node, const LLInitParam::BaseBlock& block, const std::string& xml_namespace) +{ + Schema schema(xml_namespace); + + schema.root_element.name = type_name; + Choice& choice = schema.root_element.complexType.choice; + + choice.minOccurs = 0; + choice.maxOccurs = "unbounded"; + + mSchemaNode = node; + //node->setName("xs:schema"); + //node->createChild("attributeFormDefault", true)->setStringValue("unqualified"); + //node->createChild("elementFormDefault", true)->setStringValue("qualified"); + //node->createChild("targetNamespace", true)->setStringValue(xml_namespace); + //node->createChild("xmlns:xs", true)->setStringValue("http://www.w3.org/2001/XMLSchema"); + //node->createChild("xmlns", true)->setStringValue(xml_namespace); + + //node = node->createChild("xs:complexType", false); + //node->createChild("name", true)->setStringValue(type_name); + //node->createChild("mixed", true)->setStringValue("true"); + + //mAttributeNode = node; + //mElementNode = node->createChild("xs:choice", false); + //mElementNode->createChild("minOccurs", true)->setStringValue("0"); + //mElementNode->createChild("maxOccurs", true)->setStringValue("unbounded"); + block.inspectBlock(*this); + + // duplicate element choices + LLXMLNodeList children; + mElementNode->getChildren("xs:element", children, FALSE); + for (LLXMLNodeList::iterator child_it = children.begin(); child_it != children.end(); ++child_it) + { + LLXMLNodePtr child_copy = child_it->second->deepCopy(); + std::string child_name; + child_copy->getAttributeString("name", child_name); + child_copy->setAttributeString("name", type_name + "." + child_name); + mElementNode->addChild(child_copy); + } + + LLXMLNodePtr element_declaration_node = mSchemaNode->createChild("xs:element", false); + element_declaration_node->createChild("name", true)->setStringValue(type_name); + element_declaration_node->createChild("type", true)->setStringValue(type_name); +} + +void LLXSDWriter::writeAttribute(const std::string& type, const Parser::name_stack_t& stack, S32 min_count, S32 max_count, const std::vector* possible_values) +{ + name_stack_t non_empty_names; + std::string attribute_name; + for (name_stack_t::const_iterator it = stack.begin(); + it != stack.end(); + ++it) + { + const std::string& name = it->first; + if (!name.empty()) + { + non_empty_names.push_back(*it); + } + } + + for (name_stack_t::const_iterator it = non_empty_names.begin(); + it != non_empty_names.end(); + ++it) + { + if (!attribute_name.empty()) + { + attribute_name += "."; + } + attribute_name += it->first; + } + + // only flag non-nested attributes as mandatory, nested attributes have variant syntax + // that can't be properly constrained in XSD + // e.g. vs + bool attribute_mandatory = min_count == 1 && max_count == 1 && non_empty_names.size() == 1; + + // don't bother supporting "Multiple" params as xml attributes + if (max_count <= 1) + { + // add compound attribute to root node + addAttributeToSchema(mAttributeNode, attribute_name, type, attribute_mandatory, possible_values); + } + + // now generated nested elements for compound attributes + if (non_empty_names.size() > 1 && !attribute_mandatory) + { + std::string element_name; + + // traverse all but last element, leaving that as an attribute name + name_stack_t::const_iterator end_it = non_empty_names.end(); + end_it--; + + for (name_stack_t::const_iterator it = non_empty_names.begin(); + it != end_it; + ++it) + { + if (it != non_empty_names.begin()) + { + element_name += "."; + } + element_name += it->first; + } + + std::string short_attribute_name = non_empty_names.back().first; + + LLXMLNodePtr complex_type_node; + + // find existing element node here, starting at tail of child list + if (mElementNode->mChildren.notNull()) + { + for(LLXMLNodePtr element = mElementNode->mChildren->tail; + element.notNull(); + element = element->mPrev) + { + std::string name; + if(element->getAttributeString("name", name) && name == element_name) + { + complex_type_node = element->mChildren->head; + break; + } + } + } + //create complex_type node + // + // + // + // + // + if(complex_type_node.isNull()) + { + complex_type_node = mElementNode->createChild("xs:element", false); + + complex_type_node->createChild("minOccurs", true)->setIntValue(min_count); + complex_type_node->createChild("maxOccurs", true)->setIntValue(max_count); + complex_type_node->createChild("name", true)->setStringValue(element_name); + complex_type_node = complex_type_node->createChild("xs:complexType", false); + } + + addAttributeToSchema(complex_type_node, short_attribute_name, type, false, possible_values); + } +} + +void LLXSDWriter::addAttributeToSchema(LLXMLNodePtr type_declaration_node, const std::string& attribute_name, const std::string& type, bool mandatory, const std::vector* possible_values) +{ + if (!attribute_name.empty()) + { + LLXMLNodePtr new_enum_type_node; + if (possible_values != NULL) + { + // custom attribute type, for example + // + // + // + // + // + // + new_enum_type_node = new LLXMLNode("xs:simpleType", false); + + LLXMLNodePtr restriction_node = new_enum_type_node->createChild("xs:restriction", false); + restriction_node->createChild("base", true)->setStringValue("xs:string"); + + for (std::vector::const_iterator it = possible_values->begin(); + it != possible_values->end(); + ++it) + { + LLXMLNodePtr enum_node = restriction_node->createChild("xs:enumeration", false); + enum_node->createChild("value", true)->setStringValue(*it); + } + } + + string_set_t& attributes_written = mAttributesWritten[type_declaration_node]; + + string_set_t::iterator found_it = attributes_written.lower_bound(attribute_name); + + // attribute not yet declared + if (found_it == attributes_written.end() || attributes_written.key_comp()(attribute_name, *found_it)) + { + attributes_written.insert(found_it, attribute_name); + + LLXMLNodePtr attribute_node = type_declaration_node->createChild("xs:attribute", false); + + // attribute name + attribute_node->createChild("name", true)->setStringValue(attribute_name); + + if (new_enum_type_node.notNull()) + { + attribute_node->addChild(new_enum_type_node); + } + else + { + // simple attribute type + attribute_node->createChild("type", true)->setStringValue(type); + } + + // required or optional + attribute_node->createChild("use", true)->setStringValue(mandatory ? "required" : "optional"); + } + // attribute exists...handle collision of same name attributes with potentially different types + else + { + LLXMLNodePtr attribute_declaration; + if (type_declaration_node.notNull()) + { + for(LLXMLNodePtr node = type_declaration_node->mChildren->tail; + node.notNull(); + node = node->mPrev) + { + std::string name; + if (node->getAttributeString("name", name) && name == attribute_name) + { + attribute_declaration = node; + break; + } + } + } + + bool new_type_is_enum = new_enum_type_node.notNull(); + bool existing_type_is_enum = !attribute_declaration->hasAttribute("type"); + + // either type is enum, revert to string in collision + // don't bother to check for enum equivalence + if (new_type_is_enum || existing_type_is_enum) + { + if (attribute_declaration->hasAttribute("type")) + { + attribute_declaration->setAttributeString("type", "xs:string"); + } + else + { + attribute_declaration->createChild("type", true)->setStringValue("xs:string"); + } + attribute_declaration->deleteChildren("xs:simpleType"); + } + else + { + // check for collision of different standard types + std::string existing_type; + attribute_declaration->getAttributeString("type", existing_type); + // if current type is not the same as the new type, revert to strnig + if (existing_type != type) + { + // ...than use most general type, string + attribute_declaration->setAttributeString("type", "string"); + } + } + } + } +} + +// +// LLXUIXSDWriter +// +void LLXUIXSDWriter::writeXSD(const std::string& type_name, const std::string& path, const LLInitParam::BaseBlock& block) +{ + std::string file_name(path); + file_name += type_name + ".xsd"; + LLXMLNodePtr root_nodep = new LLXMLNode(); + + LLXSDWriter::writeXSD(type_name, root_nodep, block, "http://www.lindenlab.com/xui"); + + // add includes for all possible children + const std::type_info* type = *LLWidgetTypeRegistry::instance().getValue(type_name); + const widget_registry_t* widget_registryp = LLChildRegistryRegistry::instance().getValue(type); + + // add choices for valid children + if (widget_registryp) + { + // add include declarations for all valid children + for (widget_registry_t::Registrar::registry_map_t::const_iterator it = widget_registryp->currentRegistrar().beginItems(); + it != widget_registryp->currentRegistrar().endItems(); + ++it) + { + std::string widget_name = it->first; + if (widget_name == type_name) + { + continue; + } + LLXMLNodePtr nodep = new LLXMLNode("xs:include", false); + nodep->createChild("schemaLocation", true)->setStringValue(widget_name + ".xsd"); + + // add to front of schema + mSchemaNode->addChild(nodep); + } + + for (widget_registry_t::Registrar::registry_map_t::const_iterator it = widget_registryp->currentRegistrar().beginItems(); + it != widget_registryp->currentRegistrar().endItems(); + ++it) + { + std::string widget_name = it->first; + // + LLXMLNodePtr widget_node = mElementNode->createChild("xs:element", false); + widget_node->createChild("name", true)->setStringValue(widget_name); + widget_node->createChild("type", true)->setStringValue(widget_name); + } + } + + LLFILE* xsd_file = LLFile::fopen(file_name.c_str(), "w"); + LLXMLNode::writeHeaderToFile(xsd_file); + root_nodep->writeToFile(xsd_file); + fclose(xsd_file); +} + +static LLInitParam::Parser::parser_read_func_map_t sXUIReadFuncs; +static LLInitParam::Parser::parser_write_func_map_t sXUIWriteFuncs; +static LLInitParam::Parser::parser_inspect_func_map_t sXUIInspectFuncs; + +// +// LLXUIParser +// +LLXUIParser::LLXUIParser() +: Parser(sXUIReadFuncs, sXUIWriteFuncs, sXUIInspectFuncs), + mCurReadDepth(0) +{ + if (sXUIReadFuncs.empty()) + { + registerParserFuncs(readFlag, writeFlag); + registerParserFuncs(readBoolValue, writeBoolValue); + registerParserFuncs(readStringValue, writeStringValue); + registerParserFuncs(readU8Value, writeU8Value); + registerParserFuncs(readS8Value, writeS8Value); + registerParserFuncs(readU16Value, writeU16Value); + registerParserFuncs(readS16Value, writeS16Value); + registerParserFuncs(readU32Value, writeU32Value); + registerParserFuncs(readS32Value, writeS32Value); + registerParserFuncs(readF32Value, writeF32Value); + registerParserFuncs(readF64Value, writeF64Value); + registerParserFuncs(readVector3Value, writeVector3Value); + registerParserFuncs(readColor4Value, writeColor4Value); + registerParserFuncs(readUIColorValue, writeUIColorValue); + registerParserFuncs(readUUIDValue, writeUUIDValue); + registerParserFuncs(readSDValue, writeSDValue); + } +} + +LLFastTimer::DeclareTimer FTM_PARSE_XUI("XUI Parsing"); +const LLXMLNodePtr DUMMY_NODE = new LLXMLNode(); + +void LLXUIParser::readXUI(LLXMLNodePtr node, LLInitParam::BaseBlock& block, const std::string& filename, bool silent) +{ + LLFastTimer ft(FTM_PARSE_XUI); + mNameStack.clear(); + mRootNodeName = node->getName()->mString; + mCurFileName = filename; + mCurReadDepth = 0; + setParseSilently(silent); + + if (node.isNull()) + { + parserWarning("Invalid node"); + } + else + { + readXUIImpl(node, block); + } +} + +bool LLXUIParser::readXUIImpl(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block) +{ + typedef boost::tokenizer > tokenizer; + boost::char_separator sep("."); + + bool values_parsed = false; + bool silent = mCurReadDepth > 0; + + if (nodep->getFirstChild().isNull() + && nodep->mAttributes.empty() + && nodep->getSanitizedValue().empty()) + { + // empty node, just parse as flag + mCurReadNode = DUMMY_NODE; + return block.submitValue(mNameStack, *this, silent); + } + + // submit attributes for current node + values_parsed |= readAttributes(nodep, block); + + // treat text contents of xml node as "value" parameter + std::string text_contents = nodep->getSanitizedValue(); + if (!text_contents.empty()) + { + mCurReadNode = nodep; + mNameStack.push_back(std::make_pair(std::string("value"), true)); + // child nodes are not necessarily valid parameters (could be a child widget) + // so don't complain once we've recursed + if (!block.submitValue(mNameStack, *this, true)) + { + mNameStack.pop_back(); + block.submitValue(mNameStack, *this, silent); + } + else + { + mNameStack.pop_back(); + } + } + + // then traverse children + // child node must start with last name of parent node (our "scope") + // for example: "" + // which equates to the following nesting: + // button + // param + // nested_param1 + // nested_param2 + // nested_param3 + mCurReadDepth++; + for(LLXMLNodePtr childp = nodep->getFirstChild(); childp.notNull();) + { + std::string child_name(childp->getName()->mString); + S32 num_tokens_pushed = 0; + + // for non "dotted" child nodes check to see if child node maps to another widget type + // and if not, treat as a child element of the current node + // e.g. will interpret as "button.rect" + // since there is no widget named "rect" + if (child_name.find(".") == std::string::npos) + { + mNameStack.push_back(std::make_pair(child_name, true)); + num_tokens_pushed++; + } + else + { + // parse out "dotted" name into individual tokens + tokenizer name_tokens(child_name, sep); + + tokenizer::iterator name_token_it = name_tokens.begin(); + if(name_token_it == name_tokens.end()) + { + childp = childp->getNextSibling(); + continue; + } + + // check for proper nesting + if (mNameStack.empty()) + { + if (*name_token_it != mRootNodeName) + { + childp = childp->getNextSibling(); + continue; + } + } + else if(mNameStack.back().first != *name_token_it) + { + childp = childp->getNextSibling(); + continue; + } + + // now ignore first token + ++name_token_it; + + // copy remaining tokens on to our running token list + for(tokenizer::iterator token_to_push = name_token_it; token_to_push != name_tokens.end(); ++token_to_push) + { + mNameStack.push_back(std::make_pair(*token_to_push, true)); + num_tokens_pushed++; + } + } + + // recurse and visit children XML nodes + if(readXUIImpl(childp, block)) + { + // child node successfully parsed, remove from DOM + + values_parsed = true; + LLXMLNodePtr node_to_remove = childp; + childp = childp->getNextSibling(); + + nodep->deleteChild(node_to_remove); + } + else + { + childp = childp->getNextSibling(); + } + + while(num_tokens_pushed-- > 0) + { + mNameStack.pop_back(); + } + } + mCurReadDepth--; + return values_parsed; +} + +bool LLXUIParser::readAttributes(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block) +{ + typedef boost::tokenizer > tokenizer; + boost::char_separator sep("."); + + bool any_parsed = false; + bool silent = mCurReadDepth > 0; + + for(LLXMLAttribList::const_iterator attribute_it = nodep->mAttributes.begin(); + attribute_it != nodep->mAttributes.end(); + ++attribute_it) + { + S32 num_tokens_pushed = 0; + std::string attribute_name(attribute_it->first->mString); + mCurReadNode = attribute_it->second; + + tokenizer name_tokens(attribute_name, sep); + // copy remaining tokens on to our running token list + for(tokenizer::iterator token_to_push = name_tokens.begin(); token_to_push != name_tokens.end(); ++token_to_push) + { + mNameStack.push_back(std::make_pair(*token_to_push, true)); + num_tokens_pushed++; + } + + // child nodes are not necessarily valid attributes, so don't complain once we've recursed + any_parsed |= block.submitValue(mNameStack, *this, silent); + + while(num_tokens_pushed-- > 0) + { + mNameStack.pop_back(); + } + } + + return any_parsed; +} + +void LLXUIParser::writeXUIImpl(LLXMLNodePtr node, const LLInitParam::BaseBlock &block, const LLInitParam::predicate_rule_t rules, const LLInitParam::BaseBlock* diff_block) +{ + mWriteRootNode = node; + name_stack_t name_stack = Parser::name_stack_t(); + block.serializeBlock(*this, name_stack, rules, diff_block); + mOutNodes.clear(); +} + +// go from a stack of names to a specific XML node +LLXMLNodePtr LLXUIParser::getNode(name_stack_t& stack) +{ + LLXMLNodePtr out_node = mWriteRootNode; + + name_stack_t::iterator next_it = stack.begin(); + for (name_stack_t::iterator it = stack.begin(); + it != stack.end(); + it = next_it) + { + ++next_it; + bool force_new_node = false; + + if (it->first.empty()) + { + it->second = false; + continue; + } + + if (next_it != stack.end() && next_it->first.empty() && next_it->second) + { + force_new_node = true; + } + + + out_nodes_t::iterator found_it = mOutNodes.find(it->first); + + // node with this name not yet written + if (found_it == mOutNodes.end() || it->second || force_new_node) + { + // make an attribute if we are the last element on the name stack + bool is_attribute = next_it == stack.end(); + LLXMLNodePtr new_node = new LLXMLNode(it->first.c_str(), is_attribute); + out_node->addChild(new_node); + mOutNodes[it->first] = new_node; + out_node = new_node; + it->second = false; + } + else + { + out_node = found_it->second; + } + } + + return (out_node == mWriteRootNode ? LLXMLNodePtr(NULL) : out_node); +} + +bool LLXUIParser::readFlag(Parser& parser, void* val_ptr) +{ + LLXUIParser& self = static_cast(parser); + return self.mCurReadNode == DUMMY_NODE; +} + +bool LLXUIParser::writeFlag(Parser& parser, const void* val_ptr, name_stack_t& stack) +{ + // just create node + LLXUIParser& self = static_cast(parser); + LLXMLNodePtr node = self.getNode(stack); + return node.notNull(); +} + +bool LLXUIParser::readBoolValue(Parser& parser, void* val_ptr) +{ + S32 value; + LLXUIParser& self = static_cast(parser); + bool success = self.mCurReadNode->getBoolValue(1, &value); + *((bool*)val_ptr) = (value != FALSE); + return success; +} + +bool LLXUIParser::writeBoolValue(Parser& parser, const void* val_ptr, name_stack_t& stack) +{ + LLXUIParser& self = static_cast(parser); + LLXMLNodePtr node = self.getNode(stack); + if (node.notNull()) + { + node->setBoolValue(*((bool*)val_ptr)); + return true; + } + return false; +} + +bool LLXUIParser::readStringValue(Parser& parser, void* val_ptr) +{ + LLXUIParser& self = static_cast(parser); + *((std::string*)val_ptr) = self.mCurReadNode->getSanitizedValue(); + return true; +} + +bool LLXUIParser::writeStringValue(Parser& parser, const void* val_ptr, name_stack_t& stack) +{ + LLXUIParser& self = static_cast(parser); + LLXMLNodePtr node = self.getNode(stack); + if (node.notNull()) + { + const std::string* string_val = reinterpret_cast(val_ptr); + if (string_val->find('\n') != std::string::npos + || string_val->size() > MAX_STRING_ATTRIBUTE_SIZE) + { + // don't write strings with newlines into attributes + std::string attribute_name = node->getName()->mString; + LLXMLNodePtr parent_node = node->mParent; + parent_node->deleteChild(node); + // write results in text contents of node + if (attribute_name == "value") + { + // "value" is implicit, just write to parent + node = parent_node; + } + else + { + // create a child that is not an attribute, but with same name + node = parent_node->createChild(attribute_name.c_str(), false); + } + } + node->setStringValue(*string_val); + return true; + } + return false; +} + +bool LLXUIParser::readU8Value(Parser& parser, void* val_ptr) +{ + LLXUIParser& self = static_cast(parser); + return self.mCurReadNode->getByteValue(1, (U8*)val_ptr); +} + +bool LLXUIParser::writeU8Value(Parser& parser, const void* val_ptr, name_stack_t& stack) +{ + LLXUIParser& self = static_cast(parser); + LLXMLNodePtr node = self.getNode(stack); + if (node.notNull()) + { + node->setUnsignedValue(*((U8*)val_ptr)); + return true; + } + return false; +} + +bool LLXUIParser::readS8Value(Parser& parser, void* val_ptr) +{ + LLXUIParser& self = static_cast(parser); + S32 value; + if(self.mCurReadNode->getIntValue(1, &value)) + { + *((S8*)val_ptr) = value; + return true; + } + return false; +} + +bool LLXUIParser::writeS8Value(Parser& parser, const void* val_ptr, name_stack_t& stack) +{ + LLXUIParser& self = static_cast(parser); + LLXMLNodePtr node = self.getNode(stack); + if (node.notNull()) + { + node->setIntValue(*((S8*)val_ptr)); + return true; + } + return false; +} + +bool LLXUIParser::readU16Value(Parser& parser, void* val_ptr) +{ + LLXUIParser& self = static_cast(parser); + U32 value; + if(self.mCurReadNode->getUnsignedValue(1, &value)) + { + *((U16*)val_ptr) = value; + return true; + } + return false; +} + +bool LLXUIParser::writeU16Value(Parser& parser, const void* val_ptr, name_stack_t& stack) +{ + LLXUIParser& self = static_cast(parser); + LLXMLNodePtr node = self.getNode(stack); + if (node.notNull()) + { + node->setUnsignedValue(*((U16*)val_ptr)); + return true; + } + return false; +} + +bool LLXUIParser::readS16Value(Parser& parser, void* val_ptr) +{ + LLXUIParser& self = static_cast(parser); + S32 value; + if(self.mCurReadNode->getIntValue(1, &value)) + { + *((S16*)val_ptr) = value; + return true; + } + return false; +} + +bool LLXUIParser::writeS16Value(Parser& parser, const void* val_ptr, name_stack_t& stack) +{ + LLXUIParser& self = static_cast(parser); + LLXMLNodePtr node = self.getNode(stack); + if (node.notNull()) + { + node->setIntValue(*((S16*)val_ptr)); + return true; + } + return false; +} + +bool LLXUIParser::readU32Value(Parser& parser, void* val_ptr) +{ + LLXUIParser& self = static_cast(parser); + return self.mCurReadNode->getUnsignedValue(1, (U32*)val_ptr); +} + +bool LLXUIParser::writeU32Value(Parser& parser, const void* val_ptr, name_stack_t& stack) +{ + LLXUIParser& self = static_cast(parser); + LLXMLNodePtr node = self.getNode(stack); + if (node.notNull()) + { + node->setUnsignedValue(*((U32*)val_ptr)); + return true; + } + return false; +} + +bool LLXUIParser::readS32Value(Parser& parser, void* val_ptr) +{ + LLXUIParser& self = static_cast(parser); + return self.mCurReadNode->getIntValue(1, (S32*)val_ptr); +} + +bool LLXUIParser::writeS32Value(Parser& parser, const void* val_ptr, name_stack_t& stack) +{ + LLXUIParser& self = static_cast(parser); + LLXMLNodePtr node = self.getNode(stack); + if (node.notNull()) + { + node->setIntValue(*((S32*)val_ptr)); + return true; + } + return false; +} + +bool LLXUIParser::readF32Value(Parser& parser, void* val_ptr) +{ + LLXUIParser& self = static_cast(parser); + return self.mCurReadNode->getFloatValue(1, (F32*)val_ptr); +} + +bool LLXUIParser::writeF32Value(Parser& parser, const void* val_ptr, name_stack_t& stack) +{ + LLXUIParser& self = static_cast(parser); + LLXMLNodePtr node = self.getNode(stack); + if (node.notNull()) + { + node->setFloatValue(*((F32*)val_ptr)); + return true; + } + return false; +} + +bool LLXUIParser::readF64Value(Parser& parser, void* val_ptr) +{ + LLXUIParser& self = static_cast(parser); + return self.mCurReadNode->getDoubleValue(1, (F64*)val_ptr); +} + +bool LLXUIParser::writeF64Value(Parser& parser, const void* val_ptr, name_stack_t& stack) +{ + LLXUIParser& self = static_cast(parser); + LLXMLNodePtr node = self.getNode(stack); + if (node.notNull()) + { + node->setDoubleValue(*((F64*)val_ptr)); + return true; + } + return false; +} + +bool LLXUIParser::readVector3Value(Parser& parser, void* val_ptr) +{ + LLXUIParser& self = static_cast(parser); + LLVector3* vecp = (LLVector3*)val_ptr; + if(self.mCurReadNode->getFloatValue(3, vecp->mV) >= 3) + { + return true; + } + + return false; +} + +bool LLXUIParser::writeVector3Value(Parser& parser, const void* val_ptr, name_stack_t& stack) +{ + LLXUIParser& self = static_cast(parser); + LLXMLNodePtr node = self.getNode(stack); + if (node.notNull()) + { + LLVector3 vector = *((LLVector3*)val_ptr); + node->setFloatValue(3, vector.mV); + return true; + } + return false; +} + +bool LLXUIParser::readColor4Value(Parser& parser, void* val_ptr) +{ + LLXUIParser& self = static_cast(parser); + LLColor4* colorp = (LLColor4*)val_ptr; + if(self.mCurReadNode->getFloatValue(4, colorp->mV) >= 3) + { + return true; + } + + return false; +} + +bool LLXUIParser::writeColor4Value(Parser& parser, const void* val_ptr, name_stack_t& stack) +{ + LLXUIParser& self = static_cast(parser); + LLXMLNodePtr node = self.getNode(stack); + if (node.notNull()) + { + LLColor4 color = *((LLColor4*)val_ptr); + node->setFloatValue(4, color.mV); + return true; + } + return false; +} + +bool LLXUIParser::readUIColorValue(Parser& parser, void* val_ptr) +{ + LLXUIParser& self = static_cast(parser); + LLUIColor* param = (LLUIColor*)val_ptr; + LLColor4 color; + bool success = self.mCurReadNode->getFloatValue(4, color.mV) >= 3; + if (success) + { + param->set(color); + return true; + } + return false; +} + +bool LLXUIParser::writeUIColorValue(Parser& parser, const void* val_ptr, name_stack_t& stack) +{ + LLXUIParser& self = static_cast(parser); + LLXMLNodePtr node = self.getNode(stack); + if (node.notNull()) + { + LLUIColor color = *((LLUIColor*)val_ptr); + //RN: don't write out the color that is represented by a function + // rely on param block exporting to get the reference to the color settings + if (color.isReference()) return false; + node->setFloatValue(4, color.get().mV); + return true; + } + return false; +} + +bool LLXUIParser::readUUIDValue(Parser& parser, void* val_ptr) +{ + LLXUIParser& self = static_cast(parser); + LLUUID temp_id; + // LLUUID::set is destructive, so use temporary value + if (temp_id.set(self.mCurReadNode->getSanitizedValue())) + { + *(LLUUID*)(val_ptr) = temp_id; + return true; + } + return false; +} + +bool LLXUIParser::writeUUIDValue(Parser& parser, const void* val_ptr, name_stack_t& stack) +{ + LLXUIParser& self = static_cast(parser); + LLXMLNodePtr node = self.getNode(stack); + if (node.notNull()) + { + node->setStringValue(((LLUUID*)val_ptr)->asString()); + return true; + } + return false; +} + +bool LLXUIParser::readSDValue(Parser& parser, void* val_ptr) +{ + LLXUIParser& self = static_cast(parser); + *((LLSD*)val_ptr) = LLSD(self.mCurReadNode->getSanitizedValue()); + return true; +} + +bool LLXUIParser::writeSDValue(Parser& parser, const void* val_ptr, name_stack_t& stack) +{ + LLXUIParser& self = static_cast(parser); + + LLXMLNodePtr node = self.getNode(stack); + if (node.notNull()) + { + std::string string_val = ((LLSD*)val_ptr)->asString(); + if (string_val.find('\n') != std::string::npos || string_val.size() > MAX_STRING_ATTRIBUTE_SIZE) + { + // don't write strings with newlines into attributes + std::string attribute_name = node->getName()->mString; + LLXMLNodePtr parent_node = node->mParent; + parent_node->deleteChild(node); + // write results in text contents of node + if (attribute_name == "value") + { + // "value" is implicit, just write to parent + node = parent_node; + } + else + { + node = parent_node->createChild(attribute_name.c_str(), false); + } + } + + node->setStringValue(string_val); + return true; + } + return false; +} + +/*virtual*/ std::string LLXUIParser::getCurrentElementName() +{ + std::string full_name; + for (name_stack_t::iterator it = mNameStack.begin(); + it != mNameStack.end(); + ++it) + { + full_name += it->first + "."; // build up dotted names: "button.param.nestedparam." + } + + return full_name; +} + +void LLXUIParser::parserWarning(const std::string& message) +{ +#ifdef LL_WINDOWS + // use Visual Studio friendly formatting of output message for easy access to originating xml + LL_INFOS() << llformat("%s(%d):\t%s", mCurFileName.c_str(), mCurReadNode->getLineNumber(), message.c_str()) << LL_ENDL; +#else + Parser::parserWarning(message); +#endif +} + +void LLXUIParser::parserError(const std::string& message) +{ +#ifdef LL_WINDOWS + // use Visual Studio friendly formatting of output message for easy access to originating xml + LL_INFOS() << llformat("%s(%d):\t%s", mCurFileName.c_str(), mCurReadNode->getLineNumber(), message.c_str()) << LL_ENDL; +#else + Parser::parserError(message); +#endif +} + + +// +// LLSimpleXUIParser +// + +struct ScopedFile +{ + ScopedFile( const std::string& filename, const char* accessmode ) + { + mFile = LLFile::fopen(filename, accessmode); + } + + ~ScopedFile() + { + fclose(mFile); + mFile = NULL; + } + + S32 getRemainingBytes() + { + if (!isOpen()) return 0; + + S32 cur_pos = ftell(mFile); + fseek(mFile, 0L, SEEK_END); + S32 file_size = ftell(mFile); + fseek(mFile, cur_pos, SEEK_SET); + return file_size - cur_pos; + } + + bool isOpen() { return mFile != NULL; } + + LLFILE* mFile; +}; +LLSimpleXUIParser::LLSimpleXUIParser(LLSimpleXUIParser::element_start_callback_t element_cb) +: Parser(sSimpleXUIReadFuncs, sSimpleXUIWriteFuncs, sSimpleXUIInspectFuncs), + mCurReadDepth(0), + mElementCB(element_cb) +{ + if (sSimpleXUIReadFuncs.empty()) + { + registerParserFuncs(readFlag); + registerParserFuncs(readBoolValue); + registerParserFuncs(readStringValue); + registerParserFuncs(readU8Value); + registerParserFuncs(readS8Value); + registerParserFuncs(readU16Value); + registerParserFuncs(readS16Value); + registerParserFuncs(readU32Value); + registerParserFuncs(readS32Value); + registerParserFuncs(readF32Value); + registerParserFuncs(readF64Value); + registerParserFuncs(readColor4Value); + registerParserFuncs(readUIColorValue); + registerParserFuncs(readUUIDValue); + registerParserFuncs(readSDValue); + } +} + +LLSimpleXUIParser::~LLSimpleXUIParser() +{ +} + + +bool LLSimpleXUIParser::readXUI(const std::string& filename, LLInitParam::BaseBlock& block, bool silent) +{ + LLFastTimer ft(FTM_PARSE_XUI); + + mParser = XML_ParserCreate(NULL); + XML_SetUserData(mParser, this); + XML_SetElementHandler( mParser, startElementHandler, endElementHandler); + XML_SetCharacterDataHandler( mParser, characterDataHandler); + + mOutputStack.push_back(std::make_pair(&block, 0)); + mNameStack.clear(); + mCurFileName = filename; + mCurReadDepth = 0; + setParseSilently(silent); + + ScopedFile file(filename, "rb"); + if( !file.isOpen() ) + { + LL_WARNS("ReadXUI") << "Unable to open file " << filename << LL_ENDL; + XML_ParserFree( mParser ); + return false; + } + + S32 bytes_read = 0; + + S32 buffer_size = file.getRemainingBytes(); + void* buffer = XML_GetBuffer(mParser, buffer_size); + if( !buffer ) + { + LL_WARNS("ReadXUI") << "Unable to allocate XML buffer while reading file " << filename << LL_ENDL; + XML_ParserFree( mParser ); + return false; + } + + bytes_read = (S32)fread(buffer, 1, buffer_size, file.mFile); + if( bytes_read <= 0 ) + { + LL_WARNS("ReadXUI") << "Error while reading file " << filename << LL_ENDL; + XML_ParserFree( mParser ); + return false; + } + + mEmptyLeafNode.push_back(false); + + if( !XML_ParseBuffer(mParser, bytes_read, TRUE ) ) + { + LL_WARNS("ReadXUI") << "Error while parsing file " << filename << LL_ENDL; + XML_ParserFree( mParser ); + return false; + } + + mEmptyLeafNode.pop_back(); + + XML_ParserFree( mParser ); + return true; +} + +void LLSimpleXUIParser::startElementHandler(void *userData, const char *name, const char **atts) +{ + LLSimpleXUIParser* self = reinterpret_cast(userData); + self->startElement(name, atts); +} + +void LLSimpleXUIParser::endElementHandler(void *userData, const char *name) +{ + LLSimpleXUIParser* self = reinterpret_cast(userData); + self->endElement(name); +} + +void LLSimpleXUIParser::characterDataHandler(void *userData, const char *s, int len) +{ + LLSimpleXUIParser* self = reinterpret_cast(userData); + self->characterData(s, len); +} + +void LLSimpleXUIParser::characterData(const char *s, int len) +{ + mTextContents += std::string(s, len); +} + +void LLSimpleXUIParser::startElement(const char *name, const char **atts) +{ + processText(); + + typedef boost::tokenizer > tokenizer; + boost::char_separator sep("."); + + if (mElementCB) + { + LLInitParam::BaseBlock* blockp = mElementCB(*this, name); + if (blockp) + { + mOutputStack.push_back(std::make_pair(blockp, 0)); + } + } + + mOutputStack.back().second++; + S32 num_tokens_pushed = 0; + std::string child_name(name); + + if (mOutputStack.back().second == 1) + { // root node for this block + mScope.push_back(child_name); + } + else + { // compound attribute + if (child_name.find(".") == std::string::npos) + { + mNameStack.push_back(std::make_pair(child_name, true)); + num_tokens_pushed++; + mScope.push_back(child_name); + } + else + { + // parse out "dotted" name into individual tokens + tokenizer name_tokens(child_name, sep); + + tokenizer::iterator name_token_it = name_tokens.begin(); + if(name_token_it == name_tokens.end()) + { + return; + } + + // check for proper nesting + if(!mScope.empty() && *name_token_it != mScope.back()) + { + return; + } + + // now ignore first token + ++name_token_it; + + // copy remaining tokens on to our running token list + for(tokenizer::iterator token_to_push = name_token_it; token_to_push != name_tokens.end(); ++token_to_push) + { + mNameStack.push_back(std::make_pair(*token_to_push, true)); + num_tokens_pushed++; + } + mScope.push_back(mNameStack.back().first); + } + } + + // parent node is not empty + mEmptyLeafNode.back() = false; + // we are empty if we have no attributes + mEmptyLeafNode.push_back(atts[0] == NULL); + + mTokenSizeStack.push_back(num_tokens_pushed); + readAttributes(atts); + +} + +void LLSimpleXUIParser::endElement(const char *name) +{ + bool has_text = processText(); + + // no text, attributes, or children + if (!has_text && mEmptyLeafNode.back()) + { + // submit this as a valueless name (even though there might be text contents we haven't seen yet) + mCurAttributeValueBegin = NO_VALUE_MARKER; + mOutputStack.back().first->submitValue(mNameStack, *this, mParseSilently); + } + + if (--mOutputStack.back().second == 0) + { + if (mOutputStack.empty()) + { + LL_ERRS("ReadXUI") << "Parameter block output stack popped while empty." << LL_ENDL; + } + mOutputStack.pop_back(); + } + + S32 num_tokens_to_pop = mTokenSizeStack.back(); + mTokenSizeStack.pop_back(); + while(num_tokens_to_pop-- > 0) + { + mNameStack.pop_back(); + } + mScope.pop_back(); + mEmptyLeafNode.pop_back(); +} + +bool LLSimpleXUIParser::readAttributes(const char **atts) +{ + typedef boost::tokenizer > tokenizer; + boost::char_separator sep("."); + + bool any_parsed = false; + for(S32 i = 0; atts[i] && atts[i+1]; i += 2 ) + { + std::string attribute_name(atts[i]); + mCurAttributeValueBegin = atts[i+1]; + + S32 num_tokens_pushed = 0; + tokenizer name_tokens(attribute_name, sep); + // copy remaining tokens on to our running token list + for(tokenizer::iterator token_to_push = name_tokens.begin(); token_to_push != name_tokens.end(); ++token_to_push) + { + mNameStack.push_back(std::make_pair(*token_to_push, true)); + num_tokens_pushed++; + } + + // child nodes are not necessarily valid attributes, so don't complain once we've recursed + any_parsed |= mOutputStack.back().first->submitValue(mNameStack, *this, mParseSilently); + + while(num_tokens_pushed-- > 0) + { + mNameStack.pop_back(); + } + } + return any_parsed; +} + +bool LLSimpleXUIParser::processText() +{ + if (!mTextContents.empty()) + { + LLStringUtil::trim(mTextContents); + if (!mTextContents.empty()) + { + mNameStack.push_back(std::make_pair(std::string("value"), true)); + mCurAttributeValueBegin = mTextContents.c_str(); + mOutputStack.back().first->submitValue(mNameStack, *this, mParseSilently); + mNameStack.pop_back(); + } + mTextContents.clear(); + return true; + } + return false; +} + +/*virtual*/ std::string LLSimpleXUIParser::getCurrentElementName() +{ + std::string full_name; + for (name_stack_t::iterator it = mNameStack.begin(); + it != mNameStack.end(); + ++it) + { + full_name += it->first + "."; // build up dotted names: "button.param.nestedparam." + } + + return full_name; +} + +void LLSimpleXUIParser::parserWarning(const std::string& message) +{ +#ifdef LL_WINDOWS + // use Visual Studio friendly formatting of output message for easy access to originating xml + LL_INFOS() << llformat("%s(%d):\t%s", mCurFileName.c_str(), LINE_NUMBER_HERE, message.c_str()) << LL_ENDL; +#else + Parser::parserWarning(message); +#endif +} + +void LLSimpleXUIParser::parserError(const std::string& message) +{ +#ifdef LL_WINDOWS + // use Visual Studio friendly formatting of output message for easy access to originating xml + LL_INFOS() << llformat("%s(%d):\t%s", mCurFileName.c_str(), LINE_NUMBER_HERE, message.c_str()) << LL_ENDL; +#else + Parser::parserError(message); +#endif +} + +bool LLSimpleXUIParser::readFlag(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast(parser); + return self.mCurAttributeValueBegin == NO_VALUE_MARKER; +} + +bool LLSimpleXUIParser::readBoolValue(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast(parser); + if (!strcmp(self.mCurAttributeValueBegin, "true")) + { + *((bool*)val_ptr) = true; + return true; + } + else if (!strcmp(self.mCurAttributeValueBegin, "false")) + { + *((bool*)val_ptr) = false; + return true; + } + + return false; +} + +bool LLSimpleXUIParser::readStringValue(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast(parser); + *((std::string*)val_ptr) = self.mCurAttributeValueBegin; + return true; +} + +bool LLSimpleXUIParser::readU8Value(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast(parser); + return parse(self.mCurAttributeValueBegin, uint_p[assign_a(*(U8*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readS8Value(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast(parser); + return parse(self.mCurAttributeValueBegin, int_p[assign_a(*(S8*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readU16Value(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast(parser); + return parse(self.mCurAttributeValueBegin, uint_p[assign_a(*(U16*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readS16Value(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast(parser); + return parse(self.mCurAttributeValueBegin, int_p[assign_a(*(S16*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readU32Value(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast(parser); + return parse(self.mCurAttributeValueBegin, uint_p[assign_a(*(U32*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readS32Value(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast(parser); + return parse(self.mCurAttributeValueBegin, int_p[assign_a(*(S32*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readF32Value(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast(parser); + return parse(self.mCurAttributeValueBegin, real_p[assign_a(*(F32*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readF64Value(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast(parser); + return parse(self.mCurAttributeValueBegin, real_p[assign_a(*(F64*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readColor4Value(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast(parser); + LLColor4 value; + + if (parse(self.mCurAttributeValueBegin, real_p[assign_a(value.mV[0])] >> real_p[assign_a(value.mV[1])] >> real_p[assign_a(value.mV[2])] >> real_p[assign_a(value.mV[3])], space_p).full) + { + *(LLColor4*)(val_ptr) = value; + return true; + } + return false; +} + +bool LLSimpleXUIParser::readUIColorValue(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast(parser); + LLColor4 value; + LLUIColor* colorp = (LLUIColor*)val_ptr; + + if (parse(self.mCurAttributeValueBegin, real_p[assign_a(value.mV[0])] >> real_p[assign_a(value.mV[1])] >> real_p[assign_a(value.mV[2])] >> real_p[assign_a(value.mV[3])], space_p).full) + { + colorp->set(value); + return true; + } + return false; +} + +bool LLSimpleXUIParser::readUUIDValue(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast(parser); + LLUUID temp_id; + // LLUUID::set is destructive, so use temporary value + if (temp_id.set(std::string(self.mCurAttributeValueBegin))) + { + *(LLUUID*)(val_ptr) = temp_id; + return true; + } + return false; +} + +bool LLSimpleXUIParser::readSDValue(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast(parser); + *((LLSD*)val_ptr) = LLSD(self.mCurAttributeValueBegin); + return true; +} diff --git a/indra/llui/llxuiparser.h b/indra/llui/llxuiparser.h new file mode 100644 index 000000000..ad2a39cab --- /dev/null +++ b/indra/llui/llxuiparser.h @@ -0,0 +1,254 @@ +/** + * @file llxuiparser.h + * @brief Utility functions for handling XUI structures in XML + * + * $LicenseInfo:firstyear=2003&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LLXUIPARSER_H +#define LLXUIPARSER_H + +#include "llinitparam.h" +#include "llregistry.h" +#include "llxmlnode.h" + +#include +#include +#include +#include + +class LLView; + +// lookup widget type by name +class LLWidgetTypeRegistry +: public LLRegistrySingleton +{}; + + +// global static instance for registering all widget types +typedef boost::function LLWidgetCreatorFunc; + +typedef LLRegistry widget_registry_t; + +class LLChildRegistryRegistry +: public LLRegistrySingleton +{}; + +class LLXSDWriter : public LLInitParam::Parser +{ + LOG_CLASS(LLXSDWriter); +public: + void writeXSD(const std::string& name, LLXMLNodePtr node, const LLInitParam::BaseBlock& block, const std::string& xml_namespace); + + /*virtual*/ std::string getCurrentElementName() { return LLStringUtil::null; } + + LLXSDWriter(); + ~LLXSDWriter(); + +protected: + void writeAttribute(const std::string& type, const Parser::name_stack_t&, S32 min_count, S32 max_count, const std::vector* possible_values); + void addAttributeToSchema(LLXMLNodePtr nodep, const std::string& attribute_name, const std::string& type, bool mandatory, const std::vector* possible_values); + LLXMLNodePtr mAttributeNode; + LLXMLNodePtr mElementNode; + LLXMLNodePtr mSchemaNode; + + typedef std::set string_set_t; + typedef std::map attributes_map_t; + attributes_map_t mAttributesWritten; +}; + + + +// NOTE: DOES NOT WORK YET +// should support child widgets for XUI +class LLXUIXSDWriter : public LLXSDWriter +{ +public: + void writeXSD(const std::string& name, const std::string& path, const LLInitParam::BaseBlock& block); +}; + + +class LLXUIParserImpl; + +class LLXUIParser : public LLInitParam::Parser +{ +LOG_CLASS(LLXUIParser); + +public: + LLXUIParser(); + typedef LLInitParam::Parser::name_stack_t name_stack_t; + + /*virtual*/ std::string getCurrentElementName(); + /*virtual*/ void parserWarning(const std::string& message); + /*virtual*/ void parserError(const std::string& message); + + void readXUI(LLXMLNodePtr node, LLInitParam::BaseBlock& block, const std::string& filename = LLStringUtil::null, bool silent=false); + template + void writeXUI(LLXMLNodePtr node, + const BLOCK& block, + const LLInitParam::predicate_rule_t rules = LLInitParam::default_parse_rules(), + const LLInitParam::BaseBlock* diff_block = NULL) + { + if (!diff_block + && !rules.isAmbivalent(LLInitParam::HAS_DEFAULT_VALUE)) + { + diff_block = &LLInitParam::defaultValue(); + } + writeXUIImpl(node, block, rules, diff_block); + } + +private: + LLXUIParser(const LLXUIParser& other); // no-copy + void writeXUIImpl(LLXMLNodePtr node, + const LLInitParam::BaseBlock& block, + const LLInitParam::predicate_rule_t rules, + const LLInitParam::BaseBlock* diff_block); + bool readXUIImpl(LLXMLNodePtr node, LLInitParam::BaseBlock& block); + bool readAttributes(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block); + + //reader helper functions + static bool readFlag(Parser& parser, void* val_ptr); + static bool readBoolValue(Parser& parser, void* val_ptr); + static bool readStringValue(Parser& parser, void* val_ptr); + static bool readU8Value(Parser& parser, void* val_ptr); + static bool readS8Value(Parser& parser, void* val_ptr); + static bool readU16Value(Parser& parser, void* val_ptr); + static bool readS16Value(Parser& parser, void* val_ptr); + static bool readU32Value(Parser& parser, void* val_ptr); + static bool readS32Value(Parser& parser, void* val_ptr); + static bool readF32Value(Parser& parser, void* val_ptr); + static bool readF64Value(Parser& parser, void* val_ptr); + static bool readVector3Value(Parser& parser, void* val_ptr); + static bool readColor4Value(Parser& parser, void* val_ptr); + static bool readUIColorValue(Parser& parser, void* val_ptr); + static bool readUUIDValue(Parser& parser, void* val_ptr); + static bool readSDValue(Parser& parser, void* val_ptr); + + //writer helper functions + static bool writeFlag(Parser& parser, const void* val_ptr, name_stack_t&); + static bool writeBoolValue(Parser& parser, const void* val_ptr, name_stack_t&); + static bool writeStringValue(Parser& parser, const void* val_ptr, name_stack_t&); + static bool writeU8Value(Parser& parser, const void* val_ptr, name_stack_t&); + static bool writeS8Value(Parser& parser, const void* val_ptr, name_stack_t&); + static bool writeU16Value(Parser& parser, const void* val_ptr, name_stack_t&); + static bool writeS16Value(Parser& parser, const void* val_ptr, name_stack_t&); + static bool writeU32Value(Parser& parser, const void* val_ptr, name_stack_t&); + static bool writeS32Value(Parser& parser, const void* val_ptr, name_stack_t&); + static bool writeF32Value(Parser& parser, const void* val_ptr, name_stack_t&); + static bool writeF64Value(Parser& parser, const void* val_ptr, name_stack_t&); + static bool writeVector3Value(Parser& parser, const void* val_ptr, name_stack_t&); + static bool writeColor4Value(Parser& parser, const void* val_ptr, name_stack_t&); + static bool writeUIColorValue(Parser& parser, const void* val_ptr, name_stack_t&); + static bool writeUUIDValue(Parser& parser, const void* val_ptr, name_stack_t&); + static bool writeSDValue(Parser& parser, const void* val_ptr, name_stack_t&); + + LLXMLNodePtr getNode(name_stack_t& stack); + +private: + Parser::name_stack_t mNameStack; + LLXMLNodePtr mCurReadNode; + // Root of the widget XML sub-tree, for example, "line_editor" + LLXMLNodePtr mWriteRootNode; + + typedef std::map out_nodes_t; + out_nodes_t mOutNodes; + LLXMLNodePtr mLastWrittenChild; + S32 mCurReadDepth; + std::string mCurFileName; + std::string mRootNodeName; +}; + +// LLSimpleXUIParser is a streamlined SAX-based XUI parser that does not support localization +// or parsing of a tree of independent param blocks, such as child widgets. +// Use this for reading non-localized files that only need a single param block as a result. +// +// NOTE: In order to support nested block parsing, we need callbacks for start element that +// push new blocks contexts on the mScope stack. +// NOTE: To support localization without building a DOM, we need to enforce consistent +// ordering of child elements from base file to localized diff file. Then we can use a pair +// of coroutines to perform matching of xml nodes during parsing. Not sure if the overhead +// of coroutines would offset the gain from SAX parsing +class LLSimpleXUIParserImpl; + +class LLSimpleXUIParser : public LLInitParam::Parser +{ +LOG_CLASS(LLSimpleXUIParser); +public: + typedef LLInitParam::Parser::name_stack_t name_stack_t; + typedef LLInitParam::BaseBlock* (*element_start_callback_t)(LLSimpleXUIParser&, const char* block_name); + + LLSimpleXUIParser(element_start_callback_t element_cb = NULL); + virtual ~LLSimpleXUIParser(); + + /*virtual*/ std::string getCurrentElementName(); + /*virtual*/ void parserWarning(const std::string& message); + /*virtual*/ void parserError(const std::string& message); + + bool readXUI(const std::string& filename, LLInitParam::BaseBlock& block, bool silent=false); + + +private: + //reader helper functions + static bool readFlag(Parser&, void* val_ptr); + static bool readBoolValue(Parser&, void* val_ptr); + static bool readStringValue(Parser&, void* val_ptr); + static bool readU8Value(Parser&, void* val_ptr); + static bool readS8Value(Parser&, void* val_ptr); + static bool readU16Value(Parser&, void* val_ptr); + static bool readS16Value(Parser&, void* val_ptr); + static bool readU32Value(Parser&, void* val_ptr); + static bool readS32Value(Parser&, void* val_ptr); + static bool readF32Value(Parser&, void* val_ptr); + static bool readF64Value(Parser&, void* val_ptr); + static bool readColor4Value(Parser&, void* val_ptr); + static bool readUIColorValue(Parser&, void* val_ptr); + static bool readUUIDValue(Parser&, void* val_ptr); + static bool readSDValue(Parser&, void* val_ptr); + +private: + static void startElementHandler(void *userData, const char *name, const char **atts); + static void endElementHandler(void *userData, const char *name); + static void characterDataHandler(void *userData, const char *s, int len); + + void startElement(const char *name, const char **atts); + void endElement(const char *name); + void characterData(const char *s, int len); + bool readAttributes(const char **atts); + bool processText(); + + Parser::name_stack_t mNameStack; + struct XML_ParserStruct* mParser; + LLXMLNodePtr mLastWrittenChild; + S32 mCurReadDepth; + std::string mCurFileName; + std::string mTextContents; + const char* mCurAttributeValueBegin; + std::vector mTokenSizeStack; + std::vector mScope; + std::vector mEmptyLeafNode; + element_start_callback_t mElementCB; + + std::vector > mOutputStack; +}; + + +#endif //LLXUIPARSER_H diff --git a/indra/llxml/llxmlnode.cpp b/indra/llxml/llxmlnode.cpp index 6611e74e3..bdfd161cd 100644 --- a/indra/llxml/llxmlnode.cpp +++ b/indra/llxml/llxmlnode.cpp @@ -259,7 +259,7 @@ BOOL LLXMLNode::removeChild(LLXMLNode *target_child) return FALSE; } -void LLXMLNode::addChild(LLXMLNodePtr new_child, LLXMLNodePtr after_child) +void LLXMLNode::addChild(LLXMLNodePtr& new_child, LLXMLNodePtr after_child) { if (new_child->mParent != NULL) { @@ -343,8 +343,9 @@ LLXMLNodePtr LLXMLNode::createChild(const char* name, BOOL is_attribute) // virtual LLXMLNodePtr LLXMLNode::createChild(LLStringTableEntry* name, BOOL is_attribute) { - LLXMLNode* ret = new LLXMLNode(name, is_attribute); + LLXMLNodePtr ret(new LLXMLNode(name, is_attribute)); ret->mID.clear(); + addChild(ret); return ret; } @@ -358,11 +359,12 @@ BOOL LLXMLNode::deleteChild(LLXMLNode *child) return FALSE; } -void LLXMLNode::setParent(LLXMLNodePtr new_parent) +void LLXMLNode::setParent(LLXMLNodePtr& new_parent) { if (new_parent.notNull()) { - new_parent->addChild(this); + LLXMLNodePtr this_ptr(this); + new_parent->addChild(this_ptr); } else { @@ -968,6 +970,12 @@ bool LLXMLNode::getLayeredXMLNode(LLXMLNodePtr& root, return true; } +// static +void LLXMLNode::writeHeaderToFile(LLFILE *out_file) +{ + fprintf(out_file, "\n"); +} + void LLXMLNode::writeToFile(LLFILE *out_file, const std::string& indent, bool use_type_decorations) { if (isFullyDefault()) @@ -1233,7 +1241,8 @@ void LLXMLNode::scrubToTree(LLXMLNode *tree) std::vector::iterator itor3; for (itor3=to_delete_list.begin(); itor3!=to_delete_list.end(); ++itor3) { - (*itor3)->setParent(NULL); + LLXMLNodePtr ptr; + (*itor3)->setParent(ptr); } } } @@ -1384,7 +1393,7 @@ BOOL LLXMLNode::getAttributeU8(const char* name, U8& value ) BOOL LLXMLNode::getAttributeS8(const char* name, S8& value ) { LLXMLNodePtr node; - S32 val; + S32 val = 0; if (!(getAttribute(name, node) && node->getIntValue(1, &val))) { return false; @@ -1396,7 +1405,7 @@ BOOL LLXMLNode::getAttributeS8(const char* name, S8& value ) BOOL LLXMLNode::getAttributeU16(const char* name, U16& value ) { LLXMLNodePtr node; - U32 val; + U32 val = 0; if (!(getAttribute(name, node) && node->getUnsignedValue(1, &val))) { return false; @@ -1408,7 +1417,7 @@ BOOL LLXMLNode::getAttributeU16(const char* name, U16& value ) BOOL LLXMLNode::getAttributeS16(const char* name, S16& value ) { LLXMLNodePtr node; - S32 val; + S32 val = 0; if (!(getAttribute(name, node) && node->getIntValue(1, &val))) { return false; @@ -2781,7 +2790,8 @@ void LLXMLNode::setName(LLStringTableEntry* name) mName = name; if (old_parent) { - old_parent->addChild(this); + LLXMLNodePtr this_ptr(this); + old_parent->addChild(this_ptr); } } diff --git a/indra/llxml/llxmlnode.h b/indra/llxml/llxmlnode.h index 5898375e9..b9eb429ff 100644 --- a/indra/llxml/llxmlnode.h +++ b/indra/llxml/llxmlnode.h @@ -50,7 +50,6 @@ #include "llstringtable.h" #include "llfile.h" - class LLVector3; class LLVector3d; class LLQuaternion; @@ -133,8 +132,8 @@ public: BOOL isNull(); BOOL deleteChild(LLXMLNode* child); - void addChild(LLXMLNodePtr new_child, LLXMLNodePtr after_child = LLXMLNodePtr(NULL)); - void setParent(LLXMLNodePtr new_parent); // reparent if necessary + void addChild(LLXMLNodePtr& new_child, LLXMLNodePtr after_child = LLXMLNodePtr(NULL)); + void setParent(LLXMLNodePtr& new_parent); // reparent if necessary // Serialization static bool parseFile( @@ -157,6 +156,11 @@ public: static bool getLayeredXMLNode(LLXMLNodePtr& root, const std::vector& paths); + + // Write standard XML file header: + // + static void writeHeaderToFile(LLFILE *out_file); + // Write XML to file with one attribute per line. // XML escapes values as they are written. void writeToFile(LLFILE *out_file, const std::string& indent = std::string(), bool use_type_decorations=true); @@ -325,7 +329,11 @@ public: protected: LLStringTableEntry *mName; // The name of this node - std::string mValue; // The value of this node (use getters/setters only) + + // The value of this node (use getters/setters only) + // Values are not XML-escaped in memory + // They may contain " (quot) ' (apos) & (amp) < (lt) > (gt) + std::string mValue; LLXMLNodePtr mDefault; // Mirror node in the default tree From 1a6e99a9e337e5d052716347f1405bb47d9c4e76 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Wed, 22 Jul 2015 01:53:42 -0400 Subject: [PATCH 17/17] Sync with Alchemy to go from keys.ini to keys.xml --- indra/newview/app_settings/keys.ini | 387 ------------------------ indra/newview/app_settings/keys.xml | 380 +++++++++++++++++++++++ indra/newview/app_settings/keysZQSD.ini | 387 ------------------------ indra/newview/app_settings/keysZQSD.xml | 380 +++++++++++++++++++++++ indra/newview/llappviewer.cpp | 28 +- indra/newview/llviewerkeyboard.cpp | 100 +++++- indra/newview/llviewerkeyboard.h | 69 +++-- 7 files changed, 915 insertions(+), 816 deletions(-) delete mode 100644 indra/newview/app_settings/keys.ini create mode 100644 indra/newview/app_settings/keys.xml delete mode 100644 indra/newview/app_settings/keysZQSD.ini create mode 100644 indra/newview/app_settings/keysZQSD.xml diff --git a/indra/newview/app_settings/keys.ini b/indra/newview/app_settings/keys.ini deleted file mode 100644 index 50594923b..000000000 --- a/indra/newview/app_settings/keys.ini +++ /dev/null @@ -1,387 +0,0 @@ -# keys.ini -# -# keyboard binding initialization -# -# comments must have # in the first column -# blank lines OK -# -# Format: -# mode key mask function -# -# mode must be one of FIRST_PERSON, THIRD_PERSON, EDIT, EDIT_AVATAR, or CONVERSATION -# key must be upper case, or SPACE, HOME, END, PGUP, PGDN, LEFT, RIGHT, UP, DOWN, -# or one of ,.;'[] -# mask must be NONE, SHIFT, ALT, ALT_SHIFT. -# Control is reserved for user commands. -# function must be a function named in llkeyboard.cpp - -FIRST_PERSON A NONE slide_left -FIRST_PERSON D NONE slide_right -FIRST_PERSON W NONE push_forward -FIRST_PERSON S NONE push_backward -FIRST_PERSON E NONE jump -FIRST_PERSON C NONE push_down -FIRST_PERSON F NONE toggle_fly - -FIRST_PERSON LEFT NONE slide_left -FIRST_PERSON RIGHT NONE slide_right -FIRST_PERSON UP NONE push_forward -FIRST_PERSON DOWN NONE push_backward -FIRST_PERSON PGUP NONE jump -FIRST_PERSON PGDN NONE push_down -FIRST_PERSON HOME NONE toggle_fly - -FIRST_PERSON PAD_LEFT NONE slide_left -FIRST_PERSON PAD_RIGHT NONE slide_right -FIRST_PERSON PAD_UP NONE push_forward -FIRST_PERSON PAD_DOWN NONE push_backward -FIRST_PERSON PAD_PGUP NONE jump -FIRST_PERSON PAD_PGDN NONE push_down -FIRST_PERSON PAD_HOME NONE toggle_fly -FIRST_PERSON PAD_CENTER NONE stop_moving -FIRST_PERSON PAD_ENTER NONE start_chat -FIRST_PERSON PAD_DIVIDE NONE start_gesture - -FIRST_PERSON A SHIFT slide_left -FIRST_PERSON D SHIFT slide_right -FIRST_PERSON W SHIFT push_forward -FIRST_PERSON S SHIFT push_backward -FIRST_PERSON E SHIFT jump -FIRST_PERSON C SHIFT toggle_down -FIRST_PERSON F SHIFT toggle_fly - -FIRST_PERSON SPACE NONE stop_moving -FIRST_PERSON ENTER NONE start_chat -FIRST_PERSON DIVIDE NONE start_gesture -FIRST_PERSON / NONE start_gesture - -FIRST_PERSON LEFT SHIFT slide_left -FIRST_PERSON RIGHT SHIFT slide_right -FIRST_PERSON UP SHIFT push_forward -FIRST_PERSON DOWN SHIFT push_backward -FIRST_PERSON PGUP SHIFT jump -FIRST_PERSON PGDN SHIFT toggle_down - -FIRST_PERSON PAD_LEFT SHIFT slide_left -FIRST_PERSON PAD_RIGHT SHIFT slide_right -FIRST_PERSON PAD_UP SHIFT push_forward -FIRST_PERSON PAD_DOWN SHIFT push_backward -FIRST_PERSON PAD_PGUP SHIFT jump -FIRST_PERSON PAD_PGDN SHIFT toggle_down -FIRST_PERSON PAD_HOME SHIFT toggle_fly -FIRST_PERSON PAD_ENTER SHIFT start_chat -FIRST_PERSON PAD_DIVIDE SHIFT start_gesture - -THIRD_PERSON A NONE turn_left -THIRD_PERSON D NONE turn_right -THIRD_PERSON A SHIFT slide_left -THIRD_PERSON D SHIFT slide_right -THIRD_PERSON W NONE push_forward -THIRD_PERSON S NONE push_backward -THIRD_PERSON W SHIFT push_forward -THIRD_PERSON S SHIFT push_backward -THIRD_PERSON E NONE jump -THIRD_PERSON C NONE push_down -THIRD_PERSON E SHIFT jump -THIRD_PERSON C SHIFT toggle_down - -THIRD_PERSON F NONE toggle_fly -THIRD_PERSON F SHIFT toggle_fly - -THIRD_PERSON SPACE NONE stop_moving -THIRD_PERSON ENTER NONE start_chat -THIRD_PERSON DIVIDE NONE start_gesture -THIRD_PERSON / NONE start_gesture - -THIRD_PERSON LEFT NONE turn_left -THIRD_PERSON LEFT SHIFT slide_left -THIRD_PERSON RIGHT NONE turn_right -THIRD_PERSON RIGHT SHIFT slide_right -THIRD_PERSON UP NONE push_forward -THIRD_PERSON DOWN NONE push_backward -THIRD_PERSON UP SHIFT push_forward -THIRD_PERSON DOWN SHIFT push_backward -THIRD_PERSON PGUP NONE jump -THIRD_PERSON PGDN NONE push_down -THIRD_PERSON PGUP SHIFT jump -THIRD_PERSON PGDN SHIFT toggle_down -THIRD_PERSON HOME SHIFT toggle_fly -THIRD_PERSON HOME NONE toggle_fly - -THIRD_PERSON PAD_LEFT NONE turn_left -THIRD_PERSON PAD_LEFT SHIFT slide_left -THIRD_PERSON PAD_RIGHT NONE turn_right -THIRD_PERSON PAD_RIGHT SHIFT slide_right -THIRD_PERSON PAD_UP NONE push_forward -THIRD_PERSON PAD_DOWN NONE push_backward -THIRD_PERSON PAD_UP SHIFT push_forward -THIRD_PERSON PAD_DOWN SHIFT push_backward -THIRD_PERSON PAD_PGUP NONE jump -THIRD_PERSON PAD_PGDN NONE push_down -THIRD_PERSON PAD_PGUP SHIFT jump -THIRD_PERSON PAD_PGDN SHIFT toggle_down -THIRD_PERSON PAD_HOME NONE toggle_fly -THIRD_PERSON PAD_HOME SHIFT toggle_fly -THIRD_PERSON PAD_CENTER NONE stop_moving -THIRD_PERSON PAD_CENTER SHIFT stop_moving -THIRD_PERSON PAD_ENTER NONE start_chat -THIRD_PERSON PAD_ENTER SHIFT start_chat -THIRD_PERSON PAD_DIVIDE NONE start_gesture -THIRD_PERSON PAD_DIVIDE SHIFT start_gesture - -# Camera controls in third person on Alt -THIRD_PERSON LEFT ALT spin_around_cw -THIRD_PERSON RIGHT ALT spin_around_ccw -THIRD_PERSON UP ALT move_forward -THIRD_PERSON DOWN ALT move_backward -THIRD_PERSON PGUP ALT spin_over -THIRD_PERSON PGDN ALT spin_under - -THIRD_PERSON A ALT spin_around_cw -THIRD_PERSON D ALT spin_around_ccw -THIRD_PERSON W ALT move_forward -THIRD_PERSON S ALT move_backward -THIRD_PERSON E ALT spin_over -THIRD_PERSON C ALT spin_under - -THIRD_PERSON PAD_LEFT ALT spin_around_cw -THIRD_PERSON PAD_RIGHT ALT spin_around_ccw -THIRD_PERSON PAD_UP ALT move_forward -THIRD_PERSON PAD_DOWN ALT move_backward -THIRD_PERSON PAD_PGUP ALT spin_over -THIRD_PERSON PAD_PGDN ALT spin_under -THIRD_PERSON PAD_ENTER ALT start_chat -THIRD_PERSON PAD_DIVIDE ALT start_gesture - -# mimic alt zoom behavior with keyboard only -THIRD_PERSON A CTL_ALT spin_around_cw -THIRD_PERSON D CTL_ALT spin_around_ccw -THIRD_PERSON W CTL_ALT spin_over -THIRD_PERSON S CTL_ALT spin_under -THIRD_PERSON E CTL_ALT spin_over -THIRD_PERSON C CTL_ALT spin_under - -THIRD_PERSON LEFT CTL_ALT spin_around_cw -THIRD_PERSON RIGHT CTL_ALT spin_around_ccw -THIRD_PERSON UP CTL_ALT spin_over -THIRD_PERSON DOWN CTL_ALT spin_under -THIRD_PERSON PGUP CTL_ALT spin_over -THIRD_PERSON PGDN CTL_ALT spin_under - -THIRD_PERSON PAD_LEFT CTL_ALT spin_around_cw -THIRD_PERSON PAD_RIGHT CTL_ALT spin_around_ccw -THIRD_PERSON PAD_UP CTL_ALT spin_over -THIRD_PERSON PAD_DOWN CTL_ALT spin_under -THIRD_PERSON PAD_PGUP CTL_ALT spin_over -THIRD_PERSON PAD_PGDN CTL_ALT spin_under -THIRD_PERSON PAD_ENTER CTL_ALT start_chat -THIRD_PERSON PAD_DIVIDE CTL_ALT start_gesture - -# Therefore pan on Alt-Shift -THIRD_PERSON A CTL_ALT_SHIFT pan_left -THIRD_PERSON D CTL_ALT_SHIFT pan_right -THIRD_PERSON W CTL_ALT_SHIFT pan_up -THIRD_PERSON S CTL_ALT_SHIFT pan_down -THIRD_PERSON E CTL_ALT_SHIFT pan_in -THIRD_PERSON C CTL_ALT_SHIFT pan_out - -THIRD_PERSON LEFT CTL_ALT_SHIFT pan_left -THIRD_PERSON RIGHT CTL_ALT_SHIFT pan_right -THIRD_PERSON UP CTL_ALT_SHIFT pan_up -THIRD_PERSON DOWN CTL_ALT_SHIFT pan_down -THIRD_PERSON PGUP CTL_ALT_SHIFT pan_in -THIRD_PERSON PGDN CTL_ALT_SHIFT pan_out - -THIRD_PERSON PAD_LEFT CTL_ALT_SHIFT pan_left -THIRD_PERSON PAD_RIGHT CTL_ALT_SHIFT pan_right -THIRD_PERSON PAD_UP CTL_ALT_SHIFT pan_up -THIRD_PERSON PAD_DOWN CTL_ALT_SHIFT pan_down -THIRD_PERSON PAD_PGUP CTL_ALT_SHIFT pan_in -THIRD_PERSON PAD_PGDN CTL_ALT_SHIFT pan_out -THIRD_PERSON PAD_ENTER CTL_ALT_SHIFT start_chat -THIRD_PERSON PAD_DIVIDE CTL_ALT_SHIFT start_gesture - -# Basic editing camera control -EDIT A NONE spin_around_cw -EDIT D NONE spin_around_ccw -EDIT W NONE move_forward -EDIT S NONE move_backward -EDIT E NONE spin_over -EDIT C NONE spin_under -EDIT ENTER NONE start_chat -EDIT DIVIDE NONE start_gesture -EDIT / NONE start_gesture -EDIT PAD_ENTER NONE start_chat -EDIT PAD_DIVIDE NONE start_gesture - -EDIT LEFT NONE spin_around_cw -EDIT RIGHT NONE spin_around_ccw -EDIT UP NONE move_forward -EDIT DOWN NONE move_backward -EDIT PGUP NONE spin_over -EDIT PGDN NONE spin_under - -EDIT A SHIFT pan_left -EDIT D SHIFT pan_right -EDIT W SHIFT pan_up -EDIT S SHIFT pan_down - -EDIT LEFT SHIFT pan_left -EDIT RIGHT SHIFT pan_right -EDIT UP SHIFT pan_up -EDIT DOWN SHIFT pan_down - -# Walking works with ALT held down. -EDIT A ALT slide_left -EDIT D ALT slide_right -EDIT W ALT push_forward -EDIT S ALT push_backward -EDIT E ALT jump -EDIT C ALT push_down - -EDIT LEFT ALT slide_left -EDIT RIGHT ALT slide_right -EDIT UP ALT push_forward -EDIT DOWN ALT push_backward -EDIT PGUP ALT jump -EDIT PGDN ALT push_down -EDIT HOME ALT toggle_fly - -EDIT PAD_LEFT ALT slide_left -EDIT PAD_RIGHT ALT slide_right -EDIT PAD_UP ALT push_forward -EDIT PAD_DOWN ALT push_backward -EDIT PAD_PGUP ALT jump -EDIT PAD_PGDN ALT push_down -EDIT PAD_ENTER ALT start_chat -EDIT PAD_DIVIDE ALT start_gesture - -SITTING A ALT spin_around_cw -SITTING D ALT spin_around_ccw -SITTING W ALT move_forward -SITTING S ALT move_backward -SITTING E ALT spin_over_sitting -SITTING C ALT spin_under_sitting - -SITTING LEFT ALT spin_around_cw -SITTING RIGHT ALT spin_around_ccw -SITTING UP ALT move_forward -SITTING DOWN ALT move_backward -SITTING PGUP ALT spin_over -SITTING PGDN ALT spin_under - -SITTING A CTL_ALT spin_around_cw -SITTING D CTL_ALT spin_around_ccw -SITTING W CTL_ALT spin_over -SITTING S CTL_ALT spin_under -SITTING E CTL_ALT spin_over -SITTING C CTL_ALT spin_under - -SITTING LEFT CTL_ALT spin_around_cw -SITTING RIGHT CTL_ALT spin_around_ccw -SITTING UP CTL_ALT spin_over -SITTING DOWN CTL_ALT spin_under -SITTING PGUP CTL_ALT spin_over -SITTING PGDN CTL_ALT spin_under - - -SITTING A NONE spin_around_cw_sitting -SITTING D NONE spin_around_ccw_sitting -SITTING W NONE move_forward_sitting -SITTING S NONE move_backward_sitting -SITTING E NONE spin_over_sitting -SITTING C NONE spin_under_sitting - -SITTING LEFT NONE spin_around_cw_sitting -SITTING RIGHT NONE spin_around_ccw_sitting -SITTING UP NONE move_forward_sitting -SITTING DOWN NONE move_backward_sitting -SITTING PGUP NONE spin_over_sitting -SITTING PGDN NONE spin_under_sitting - -SITTING PAD_LEFT NONE spin_around_cw_sitting -SITTING PAD_RIGHT NONE spin_around_ccw_sitting -SITTING PAD_UP NONE move_forward_sitting -SITTING PAD_DOWN NONE move_backward_sitting -SITTING PAD_PGUP NONE spin_over_sitting -SITTING PAD_PGDN NONE spin_under_sitting -SITTING PAD_CENTER NONE stop_moving -SITTING PAD_ENTER NONE start_chat -SITTING PAD_DIVIDE NONE start_gesture - -# these are for passing controls when sitting on vehicles -SITTING A SHIFT slide_left -SITTING D SHIFT slide_right -SITTING W SHIFT move_forward_sitting -SITTING S SHIFT move_backward_sitting -SITTING E SHIFT spin_over_sitting -SITTING C SHIFT spin_under_sitting - -SITTING LEFT SHIFT slide_left -SITTING RIGHT SHIFT slide_right -SITTING UP SHIFT move_forward_sitting -SITTING DOWN SHIFT move_backward_sitting -SITTING PGUP SHIFT spin_over_sitting -SITTING PGDN SHIFT spin_under_sitting - -SITTING PAD_LEFT SHIFT slide_left -SITTING PAD_RIGHT SHIFT slide_right -SITTING PAD_UP SHIFT move_forward_sitting -SITTING PAD_DOWN SHIFT move_backward_sitting -SITTING PAD_PGUP SHIFT spin_over_sitting -SITTING PAD_PGDN SHIFT spin_under_sitting -SITTING PAD_ENTER SHIFT start_chat -SITTING PAD_DIVIDE SHIFT start_gesture - -# pan on Alt-Shift -SITTING A CTL_ALT_SHIFT pan_left -SITTING D CTL_ALT_SHIFT pan_right -SITTING W CTL_ALT_SHIFT pan_up -SITTING S CTL_ALT_SHIFT pan_down -SITTING E CTL_ALT_SHIFT pan_in -SITTING C CTL_ALT_SHIFT pan_out - -SITTING LEFT CTL_ALT_SHIFT pan_left -SITTING RIGHT CTL_ALT_SHIFT pan_right -SITTING UP CTL_ALT_SHIFT pan_up -SITTING DOWN CTL_ALT_SHIFT pan_down -SITTING PGUP CTL_ALT_SHIFT pan_in -SITTING PGDN CTL_ALT_SHIFT pan_out - -SITTING PAD_LEFT CTL_ALT_SHIFT pan_left -SITTING PAD_RIGHT CTL_ALT_SHIFT pan_right -SITTING PAD_UP CTL_ALT_SHIFT pan_up -SITTING PAD_DOWN CTL_ALT_SHIFT pan_down -SITTING PAD_PGUP CTL_ALT_SHIFT pan_in -SITTING PAD_PGDN CTL_ALT_SHIFT pan_out -SITTING PAD_ENTER CTL_ALT_SHIFT start_chat -SITTING PAD_DIVIDE CTL_ALT_SHIFT start_gesture - -SITTING ENTER NONE start_chat -SITTING DIVIDE NONE start_gesture -SITTING / NONE start_gesture - -# Avatar editing camera controls -EDIT_AVATAR A NONE edit_avatar_spin_cw -EDIT_AVATAR D NONE edit_avatar_spin_ccw -EDIT_AVATAR W NONE edit_avatar_move_forward -EDIT_AVATAR S NONE edit_avatar_move_backward -EDIT_AVATAR E NONE edit_avatar_spin_over -EDIT_AVATAR C NONE edit_avatar_spin_under -EDIT_AVATAR LEFT NONE edit_avatar_spin_cw -EDIT_AVATAR RIGHT NONE edit_avatar_spin_ccw -EDIT_AVATAR UP NONE edit_avatar_move_forward -EDIT_AVATAR DOWN NONE edit_avatar_move_backward -EDIT_AVATAR PGUP NONE edit_avatar_spin_over -EDIT_AVATAR PGDN NONE edit_avatar_spin_under -EDIT_AVATAR ENTER NONE start_chat -EDIT_AVATAR DIVIDE NONE start_gesture -EDIT_AVATAR / NONE start_gesture -EDIT_AVATAR PAD_LEFT NONE edit_avatar_spin_cw -EDIT_AVATAR PAD_RIGHT NONE edit_avatar_spin_ccw -EDIT_AVATAR PAD_UP NONE edit_avatar_move_forward -EDIT_AVATAR PAD_DOWN NONE edit_avatar_move_backward -EDIT_AVATAR PAD_PGUP NONE edit_avatar_spin_over -EDIT_AVATAR PAD_PGDN NONE edit_avatar_spin_under -EDIT_AVATAR PAD_ENTER NONE start_chat -EDIT_AVATAR PAD_DIVIDE NONE start_gesture diff --git a/indra/newview/app_settings/keys.xml b/indra/newview/app_settings/keys.xml new file mode 100644 index 000000000..cb7546aec --- /dev/null +++ b/indra/newview/app_settings/keys.xml @@ -0,0 +1,380 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/app_settings/keysZQSD.ini b/indra/newview/app_settings/keysZQSD.ini deleted file mode 100644 index fd3d4805b..000000000 --- a/indra/newview/app_settings/keysZQSD.ini +++ /dev/null @@ -1,387 +0,0 @@ -# keys.ini -# -# keyboard binding initialization -# -# comments must have # in the first column -# blank lines OK -# -# Format: -# mode key mask function -# -# mode must be one of FIRST_PERSON, THIRD_PERSON, EDIT, EDIT_AVATAR, or CONVERSATION -# key must be upper case, or SPACE, HOME, END, PGUP, PGDN, LEFT, RIGHT, UP, DOWN, -# or one of ,.;'[] -# mask must be NONE, SHIFT, ALT, ALT_SHIFT. -# Control is reserved for user commands. -# function must be a function named in llkeyboard.cpp - -FIRST_PERSON Q NONE slide_left -FIRST_PERSON D NONE slide_right -FIRST_PERSON Z NONE push_forward -FIRST_PERSON S NONE push_backward -FIRST_PERSON E NONE jump -FIRST_PERSON C NONE push_down -FIRST_PERSON F NONE toggle_fly - -FIRST_PERSON LEFT NONE slide_left -FIRST_PERSON RIGHT NONE slide_right -FIRST_PERSON UP NONE push_forward -FIRST_PERSON DOWN NONE push_backward -FIRST_PERSON PGUP NONE jump -FIRST_PERSON PGDN NONE push_down -FIRST_PERSON HOME NONE toggle_fly - -FIRST_PERSON PAD_LEFT NONE slide_left -FIRST_PERSON PAD_RIGHT NONE slide_right -FIRST_PERSON PAD_UP NONE push_forward -FIRST_PERSON PAD_DOWN NONE push_backward -FIRST_PERSON PAD_PGUP NONE jump -FIRST_PERSON PAD_PGDN NONE push_down -FIRST_PERSON PAD_HOME NONE toggle_fly -FIRST_PERSON PAD_CENTER NONE stop_moving -FIRST_PERSON PAD_ENTER NONE start_chat -FIRST_PERSON PAD_DIVIDE NONE start_gesture - -FIRST_PERSON Q SHIFT slide_left -FIRST_PERSON D SHIFT slide_right -FIRST_PERSON Z SHIFT push_forward -FIRST_PERSON S SHIFT push_backward -FIRST_PERSON E SHIFT jump -FIRST_PERSON C SHIFT toggle_down -FIRST_PERSON F SHIFT toggle_fly - -FIRST_PERSON SPACE NONE stop_moving -FIRST_PERSON ENTER NONE start_chat -FIRST_PERSON DIVIDE NONE start_gesture -FIRST_PERSON / NONE start_gesture - -FIRST_PERSON LEFT SHIFT slide_left -FIRST_PERSON RIGHT SHIFT slide_right -FIRST_PERSON UP SHIFT push_forward -FIRST_PERSON DOWN SHIFT push_backward -FIRST_PERSON PGUP SHIFT jump -FIRST_PERSON PGDN SHIFT toggle_down - -FIRST_PERSON PAD_LEFT SHIFT slide_left -FIRST_PERSON PAD_RIGHT SHIFT slide_right -FIRST_PERSON PAD_UP SHIFT push_forward -FIRST_PERSON PAD_DOWN SHIFT push_backward -FIRST_PERSON PAD_PGUP SHIFT jump -FIRST_PERSON PAD_PGDN SHIFT toggle_down -FIRST_PERSON PAD_HOME SHIFT toggle_fly -FIRST_PERSON PAD_ENTER SHIFT start_chat -FIRST_PERSON PAD_DIVIDE SHIFT start_gesture - -THIRD_PERSON Q NONE turn_left -THIRD_PERSON D NONE turn_right -THIRD_PERSON Q SHIFT slide_left -THIRD_PERSON D SHIFT slide_right -THIRD_PERSON Z NONE push_forward -THIRD_PERSON S NONE push_backward -THIRD_PERSON Z SHIFT push_forward -THIRD_PERSON S SHIFT push_backward -THIRD_PERSON E NONE jump -THIRD_PERSON C NONE push_down -THIRD_PERSON E SHIFT jump -THIRD_PERSON C SHIFT toggle_down - -THIRD_PERSON F NONE toggle_fly -THIRD_PERSON F SHIFT toggle_fly - -THIRD_PERSON SPACE NONE stop_moving -THIRD_PERSON ENTER NONE start_chat -THIRD_PERSON DIVIDE NONE start_gesture -THIRD_PERSON / NONE start_gesture - -THIRD_PERSON LEFT NONE turn_left -THIRD_PERSON LEFT SHIFT slide_left -THIRD_PERSON RIGHT NONE turn_right -THIRD_PERSON RIGHT SHIFT slide_right -THIRD_PERSON UP NONE push_forward -THIRD_PERSON DOWN NONE push_backward -THIRD_PERSON UP SHIFT push_forward -THIRD_PERSON DOWN SHIFT push_backward -THIRD_PERSON PGUP NONE jump -THIRD_PERSON PGDN NONE push_down -THIRD_PERSON PGUP SHIFT jump -THIRD_PERSON PGDN SHIFT toggle_down -THIRD_PERSON HOME SHIFT toggle_fly -THIRD_PERSON HOME NONE toggle_fly - -THIRD_PERSON PAD_LEFT NONE turn_left -THIRD_PERSON PAD_LEFT SHIFT slide_left -THIRD_PERSON PAD_RIGHT NONE turn_right -THIRD_PERSON PAD_RIGHT SHIFT slide_right -THIRD_PERSON PAD_UP NONE push_forward -THIRD_PERSON PAD_DOWN NONE push_backward -THIRD_PERSON PAD_UP SHIFT push_forward -THIRD_PERSON PAD_DOWN SHIFT push_backward -THIRD_PERSON PAD_PGUP NONE jump -THIRD_PERSON PAD_PGDN NONE push_down -THIRD_PERSON PAD_PGUP SHIFT jump -THIRD_PERSON PAD_PGDN SHIFT toggle_down -THIRD_PERSON PAD_HOME NONE toggle_fly -THIRD_PERSON PAD_HOME SHIFT toggle_fly -THIRD_PERSON PAD_CENTER NONE stop_moving -THIRD_PERSON PAD_CENTER SHIFT stop_moving -THIRD_PERSON PAD_ENTER NONE start_chat -THIRD_PERSON PAD_ENTER SHIFT start_chat -THIRD_PERSON PAD_DIVIDE NONE start_gesture -THIRD_PERSON PAD_DIVIDE SHIFT start_gesture - -# Camera controls in third person on Alt -THIRD_PERSON LEFT ALT spin_around_cw -THIRD_PERSON RIGHT ALT spin_around_ccw -THIRD_PERSON UP ALT move_forward -THIRD_PERSON DOWN ALT move_backward -THIRD_PERSON PGUP ALT spin_over -THIRD_PERSON PGDN ALT spin_under - -THIRD_PERSON Q ALT spin_around_cw -THIRD_PERSON D ALT spin_around_ccw -THIRD_PERSON Z ALT move_forward -THIRD_PERSON S ALT move_backward -THIRD_PERSON E ALT spin_over -THIRD_PERSON C ALT spin_under - -THIRD_PERSON PAD_LEFT ALT spin_around_cw -THIRD_PERSON PAD_RIGHT ALT spin_around_ccw -THIRD_PERSON PAD_UP ALT move_forward -THIRD_PERSON PAD_DOWN ALT move_backward -THIRD_PERSON PAD_PGUP ALT spin_over -THIRD_PERSON PAD_PGDN ALT spin_under -THIRD_PERSON PAD_ENTER ALT start_chat -THIRD_PERSON PAD_DIVIDE ALT start_gesture - -# mimic alt zoom behavior with keyboard only -THIRD_PERSON Q CTL_ALT spin_around_cw -THIRD_PERSON D CTL_ALT spin_around_ccw -THIRD_PERSON Z CTL_ALT spin_over -THIRD_PERSON S CTL_ALT spin_under -THIRD_PERSON E CTL_ALT spin_over -THIRD_PERSON C CTL_ALT spin_under - -THIRD_PERSON LEFT CTL_ALT spin_around_cw -THIRD_PERSON RIGHT CTL_ALT spin_around_ccw -THIRD_PERSON UP CTL_ALT spin_over -THIRD_PERSON DOWN CTL_ALT spin_under -THIRD_PERSON PGUP CTL_ALT spin_over -THIRD_PERSON PGDN CTL_ALT spin_under - -THIRD_PERSON PAD_LEFT CTL_ALT spin_around_cw -THIRD_PERSON PAD_RIGHT CTL_ALT spin_around_ccw -THIRD_PERSON PAD_UP CTL_ALT spin_over -THIRD_PERSON PAD_DOWN CTL_ALT spin_under -THIRD_PERSON PAD_PGUP CTL_ALT spin_over -THIRD_PERSON PAD_PGDN CTL_ALT spin_under -THIRD_PERSON PAD_ENTER CTL_ALT start_chat -THIRD_PERSON PAD_DIVIDE CTL_ALT start_gesture - -# Therefore pan on Alt-Shift -THIRD_PERSON Q CTL_ALT_SHIFT pan_left -THIRD_PERSON D CTL_ALT_SHIFT pan_right -THIRD_PERSON Z CTL_ALT_SHIFT pan_up -THIRD_PERSON S CTL_ALT_SHIFT pan_down -THIRD_PERSON E CTL_ALT_SHIFT pan_in -THIRD_PERSON C CTL_ALT_SHIFT pan_out - -THIRD_PERSON LEFT CTL_ALT_SHIFT pan_left -THIRD_PERSON RIGHT CTL_ALT_SHIFT pan_right -THIRD_PERSON UP CTL_ALT_SHIFT pan_up -THIRD_PERSON DOWN CTL_ALT_SHIFT pan_down -THIRD_PERSON PGUP CTL_ALT_SHIFT pan_in -THIRD_PERSON PGDN CTL_ALT_SHIFT pan_out - -THIRD_PERSON PAD_LEFT CTL_ALT_SHIFT pan_left -THIRD_PERSON PAD_RIGHT CTL_ALT_SHIFT pan_right -THIRD_PERSON PAD_UP CTL_ALT_SHIFT pan_up -THIRD_PERSON PAD_DOWN CTL_ALT_SHIFT pan_down -THIRD_PERSON PAD_PGUP CTL_ALT_SHIFT pan_in -THIRD_PERSON PAD_PGDN CTL_ALT_SHIFT pan_out -THIRD_PERSON PAD_ENTER CTL_ALT_SHIFT start_chat -THIRD_PERSON PAD_DIVIDE CTL_ALT_SHIFT start_gesture - -# Basic editing camera control -EDIT Q NONE spin_around_cw -EDIT D NONE spin_around_ccw -EDIT Z NONE move_forward -EDIT S NONE move_backward -EDIT E NONE spin_over -EDIT C NONE spin_under -EDIT ENTER NONE start_chat -EDIT DIVIDE NONE start_gesture -EDIT / NONE start_gesture -EDIT PAD_ENTER NONE start_chat -EDIT PAD_DIVIDE NONE start_gesture - -EDIT LEFT NONE spin_around_cw -EDIT RIGHT NONE spin_around_ccw -EDIT UP NONE move_forward -EDIT DOWN NONE move_backward -EDIT PGUP NONE spin_over -EDIT PGDN NONE spin_under - -EDIT Q SHIFT pan_left -EDIT D SHIFT pan_right -EDIT Z SHIFT pan_up -EDIT S SHIFT pan_down - -EDIT LEFT SHIFT pan_left -EDIT RIGHT SHIFT pan_right -EDIT UP SHIFT pan_up -EDIT DOWN SHIFT pan_down - -# Walking works with ALT held down. -EDIT Q ALT slide_left -EDIT D ALT slide_right -EDIT Z ALT push_forward -EDIT S ALT push_backward -EDIT E ALT jump -EDIT C ALT push_down - -EDIT LEFT ALT slide_left -EDIT RIGHT ALT slide_right -EDIT UP ALT push_forward -EDIT DOWN ALT push_backward -EDIT PGUP ALT jump -EDIT PGDN ALT push_down -EDIT HOME ALT toggle_fly - -EDIT PAD_LEFT ALT slide_left -EDIT PAD_RIGHT ALT slide_right -EDIT PAD_UP ALT push_forward -EDIT PAD_DOWN ALT push_backward -EDIT PAD_PGUP ALT jump -EDIT PAD_PGDN ALT push_down -EDIT PAD_ENTER ALT start_chat -EDIT PAD_DIVIDE ALT start_gesture - -SITTING Q ALT spin_around_cw -SITTING D ALT spin_around_ccw -SITTING Z ALT move_forward -SITTING S ALT move_backward -SITTING E ALT spin_over_sitting -SITTING C ALT spin_under_sitting - -SITTING LEFT ALT spin_around_cw -SITTING RIGHT ALT spin_around_ccw -SITTING UP ALT move_forward -SITTING DOWN ALT move_backward -SITTING PGUP ALT spin_over -SITTING PGDN ALT spin_under - -SITTING Q CTL_ALT spin_around_cw -SITTING D CTL_ALT spin_around_ccw -SITTING Z CTL_ALT spin_over -SITTING S CTL_ALT spin_under -SITTING E CTL_ALT spin_over -SITTING C CTL_ALT spin_under - -SITTING LEFT CTL_ALT spin_around_cw -SITTING RIGHT CTL_ALT spin_around_ccw -SITTING UP CTL_ALT spin_over -SITTING DOWN CTL_ALT spin_under -SITTING PGUP CTL_ALT spin_over -SITTING PGDN CTL_ALT spin_under - - -SITTING Q NONE spin_around_cw_sitting -SITTING D NONE spin_around_ccw_sitting -SITTING Z NONE move_forward_sitting -SITTING S NONE move_backward_sitting -SITTING E NONE spin_over_sitting -SITTING C NONE spin_under_sitting - -SITTING LEFT NONE spin_around_cw_sitting -SITTING RIGHT NONE spin_around_ccw_sitting -SITTING UP NONE move_forward_sitting -SITTING DOWN NONE move_backward_sitting -SITTING PGUP NONE spin_over_sitting -SITTING PGDN NONE spin_under_sitting - -SITTING PAD_LEFT NONE spin_around_cw_sitting -SITTING PAD_RIGHT NONE spin_around_ccw_sitting -SITTING PAD_UP NONE move_forward_sitting -SITTING PAD_DOWN NONE move_backward_sitting -SITTING PAD_PGUP NONE spin_over_sitting -SITTING PAD_PGDN NONE spin_under_sitting -SITTING PAD_CENTER NONE stop_moving -SITTING PAD_ENTER NONE start_chat -SITTING PAD_DIVIDE NONE start_gesture - -# these are for passing controls when sitting on vehicles -SITTING Q SHIFT slide_left -SITTING D SHIFT slide_right -SITTING Z SHIFT move_forward_sitting -SITTING S SHIFT move_backward_sitting -SITTING E SHIFT spin_over_sitting -SITTING C SHIFT spin_under_sitting - -SITTING LEFT SHIFT slide_left -SITTING RIGHT SHIFT slide_right -SITTING UP SHIFT move_forward_sitting -SITTING DOWN SHIFT move_backward_sitting -SITTING PGUP SHIFT spin_over_sitting -SITTING PGDN SHIFT spin_under_sitting - -SITTING PAD_LEFT SHIFT slide_left -SITTING PAD_RIGHT SHIFT slide_right -SITTING PAD_UP SHIFT move_forward_sitting -SITTING PAD_DOWN SHIFT move_backward_sitting -SITTING PAD_PGUP SHIFT spin_over_sitting -SITTING PAD_PGDN SHIFT spin_under_sitting -SITTING PAD_ENTER SHIFT start_chat -SITTING PAD_DIVIDE SHIFT start_gesture - -# pan on Alt-Shift -SITTING Q CTL_ALT_SHIFT pan_left -SITTING D CTL_ALT_SHIFT pan_right -SITTING Z CTL_ALT_SHIFT pan_up -SITTING S CTL_ALT_SHIFT pan_down -SITTING E CTL_ALT_SHIFT pan_in -SITTING C CTL_ALT_SHIFT pan_out - -SITTING LEFT CTL_ALT_SHIFT pan_left -SITTING RIGHT CTL_ALT_SHIFT pan_right -SITTING UP CTL_ALT_SHIFT pan_up -SITTING DOWN CTL_ALT_SHIFT pan_down -SITTING PGUP CTL_ALT_SHIFT pan_in -SITTING PGDN CTL_ALT_SHIFT pan_out - -SITTING PAD_LEFT CTL_ALT_SHIFT pan_left -SITTING PAD_RIGHT CTL_ALT_SHIFT pan_right -SITTING PAD_UP CTL_ALT_SHIFT pan_up -SITTING PAD_DOWN CTL_ALT_SHIFT pan_down -SITTING PAD_PGUP CTL_ALT_SHIFT pan_in -SITTING PAD_PGDN CTL_ALT_SHIFT pan_out -SITTING PAD_ENTER CTL_ALT_SHIFT start_chat -SITTING PAD_DIVIDE CTL_ALT_SHIFT start_gesture - -SITTING ENTER NONE start_chat -SITTING DIVIDE NONE start_gesture -SITTING / NONE start_gesture - -# Avatar editing camera controls -EDIT_AVATAR Q NONE edit_avatar_spin_cw -EDIT_AVATAR D NONE edit_avatar_spin_ccw -EDIT_AVATAR Z NONE edit_avatar_move_forward -EDIT_AVATAR S NONE edit_avatar_move_backward -EDIT_AVATAR E NONE edit_avatar_spin_over -EDIT_AVATAR C NONE edit_avatar_spin_under -EDIT_AVATAR LEFT NONE edit_avatar_spin_cw -EDIT_AVATAR RIGHT NONE edit_avatar_spin_ccw -EDIT_AVATAR UP NONE edit_avatar_move_forward -EDIT_AVATAR DOWN NONE edit_avatar_move_backward -EDIT_AVATAR PGUP NONE edit_avatar_spin_over -EDIT_AVATAR PGDN NONE edit_avatar_spin_under -EDIT_AVATAR ENTER NONE start_chat -EDIT_AVATAR DIVIDE NONE start_gesture -EDIT_AVATAR / NONE start_gesture -EDIT_AVATAR PAD_LEFT NONE edit_avatar_spin_cw -EDIT_AVATAR PAD_RIGHT NONE edit_avatar_spin_ccw -EDIT_AVATAR PAD_UP NONE edit_avatar_move_forward -EDIT_AVATAR PAD_DOWN NONE edit_avatar_move_backward -EDIT_AVATAR PAD_PGUP NONE edit_avatar_spin_over -EDIT_AVATAR PAD_PGDN NONE edit_avatar_spin_under -EDIT_AVATAR PAD_ENTER NONE start_chat -EDIT_AVATAR PAD_DIVIDE NONE start_gesture diff --git a/indra/newview/app_settings/keysZQSD.xml b/indra/newview/app_settings/keysZQSD.xml new file mode 100644 index 000000000..c75b935b2 --- /dev/null +++ b/indra/newview/app_settings/keysZQSD.xml @@ -0,0 +1,380 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 97ae0f707..aded2f823 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -592,13 +592,32 @@ public: void load_default_bindings(bool zqsd) { gViewerKeyboard.unloadBindings(); - const std::string keys(zqsd ? "keysZQSD.ini" : "keys.ini"); - if (!gViewerKeyboard.loadBindings(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, keys))) + const std::string key_bindings_file(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, zqsd ? "keysZQSD.xml" : "keys.xml")); + if (!gDirUtilp->fileExists(key_bindings_file) || !gViewerKeyboard.loadBindingsXML(key_bindings_file)) { - LL_ERRS("InitInfo") << "Unable to open " << keys << LL_ENDL; + const std::string key_bindings_file(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, zqsd ? "keysZQSD.ini" : "keys.ini")); + if (!gViewerKeyboard.loadBindings(key_bindings_file)) + { + LL_ERRS("InitInfo") << "Unable to open " << key_bindings_file << LL_ENDL; + } } // Load Custom bindings (override defaults) - gViewerKeyboard.loadBindings(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"custom_keys.ini")); + std::string custom_keys(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "custom_keys.xml")); + if (!gDirUtilp->fileExists(custom_keys) || !gViewerKeyboard.loadBindingsXML(custom_keys)) + { + custom_keys = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "custom_keys.ini"); + if (gDirUtilp->fileExists(custom_keys)) + gViewerKeyboard.loadBindings(custom_keys); + } +} + +namespace { +// With Xcode 6, _exit() is too magical to use with boost::bind(), so provide +// this little helper function. +void fast_exit(int rc) +{ + _exit(rc); +} } bool LLAppViewer::init() @@ -645,7 +664,6 @@ bool LLAppViewer::init() // // OK to write stuff to logs now, we've now crash reported if necessary // - init_default_trans_args(); if (!initConfiguration()) diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index 22ca3dd5d..9b0649070 100644 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -45,6 +45,7 @@ #include "lltoolfocus.h" #include "llviewerwindow.h" #include "llvoavatarself.h" +#include "llxuiparser.h" void handle_reset_view(); @@ -58,7 +59,6 @@ const F32 FLY_FRAMES = 4; const F32 NUDGE_TIME = 0.25f; // in seconds const S32 NUDGE_FRAMES = 2; const F32 ORBIT_NUDGE_RATE = 0.05f; // fraction of normal speed -const F32 YAW_NUDGE_RATE = 0.05f; // fraction of normal speed struct LLKeyboardActionRegistry : public LLRegistrySingleton, LLKeyboardActionRegistry> @@ -86,6 +86,7 @@ void agent_jump( EKeystate s ) gAgent.moveUp(1); } } +// void agent_toggle_down( EKeystate s ) { if (KEYSTATE_UP == s) return; @@ -96,6 +97,7 @@ void agent_toggle_down( EKeystate s ) } gAgent.moveUp(-1); } +// void agent_push_down( EKeystate s ) { @@ -103,22 +105,29 @@ void agent_push_down( EKeystate s ) gAgent.moveUp(-1); } +static void agent_check_temporary_run(LLAgent::EDoubleTapRunMode mode) +{ +// if (gAgent.mDoubleTapRunMode == mode && +// gAgent.getRunning() && +// !gAgent.getAlwaysRun()) +// { +// // Turn off temporary running. +// gAgent.clearRunning(); +// gAgent.sendWalkRun(gAgent.getRunning()); +// } +// [RLVa:KB] - Checked: 2011-05-11 (RLVa-1.3.0i) | Added: RLVa-1.3.0i + if ( (gAgent.mDoubleTapRunMode == mode) && (gAgent.getTempRun()) ) + gAgent.clearTempRun(); +// [/RLVa:KB] +} + static void agent_handle_doubletap_run(EKeystate s, LLAgent::EDoubleTapRunMode mode) { if (KEYSTATE_UP == s) { -// if (gAgent.mDoubleTapRunMode == mode && -// gAgent.getRunning() && -// !gAgent.getAlwaysRun()) -// { -// // Turn off temporary running. -// gAgent.clearRunning(); -// gAgent.sendWalkRun(gAgent.getRunning()); -// } -// [RLVa:KB] - Checked: 2011-05-11 (RLVa-1.3.0i) | Added: RLVa-1.3.0i - if ( (gAgent.mDoubleTapRunMode == mode) && (gAgent.getTempRun()) ) - gAgent.clearTempRun(); -// [/RLVa:KB] + // Note: in case shift is already released, slide left/right run + // will be released in agent_turn_left()/agent_turn_right() + agent_check_temporary_run(mode); } else if (gSavedSettings.getBOOL("AllowTapTapHoldRun") && KEYSTATE_DOWN == s && @@ -208,7 +217,10 @@ void agent_turn_left( EKeystate s ) } else { - if (KEYSTATE_UP == s) return; + if (KEYSTATE_UP == s) + { + return; + } F32 time = gKeyboard->getCurKeyElapsedTime(); gAgent.moveYaw( LLFloaterMove::getYawRate( time ) ); } @@ -223,7 +235,10 @@ void agent_turn_right( EKeystate s ) } else { - if (KEYSTATE_UP == s) return; + if (KEYSTATE_UP == s) + { + return; + } F32 time = gKeyboard->getCurKeyElapsedTime(); gAgent.moveYaw( -LLFloaterMove::getYawRate( time ) ); } @@ -758,6 +773,61 @@ BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, c return TRUE; } +LLViewerKeyboard::KeyBinding::KeyBinding() +: key("key"), + mask("mask"), + command("command") +{} + +LLViewerKeyboard::KeyMode::KeyMode(EKeyboardMode _mode) +: bindings("binding"), + mode(_mode) +{} + +LLViewerKeyboard::Keys::Keys() +: first_person("first_person", KeyMode(MODE_FIRST_PERSON)), + third_person("third_person", KeyMode(MODE_THIRD_PERSON)), + edit("edit", KeyMode(MODE_EDIT)), + sitting("sitting", KeyMode(MODE_SITTING)), + edit_avatar("edit_avatar", KeyMode(MODE_EDIT_AVATAR)) +{} + +S32 LLViewerKeyboard::loadBindingsXML(const std::string& filename) +{ + S32 binding_count = 0; + Keys keys; + LLSimpleXUIParser parser; + + if (parser.readXUI(filename, keys) + && keys.validateBlock()) + { + binding_count += loadBindingMode(keys.first_person); + binding_count += loadBindingMode(keys.third_person); + binding_count += loadBindingMode(keys.edit); + binding_count += loadBindingMode(keys.sitting); + binding_count += loadBindingMode(keys.edit_avatar); + } + return binding_count; +} + +S32 LLViewerKeyboard::loadBindingMode(const LLViewerKeyboard::KeyMode& keymode) +{ + S32 binding_count = 0; + for (LLInitParam::ParamIterator::const_iterator it = keymode.bindings.begin(), + end_it = keymode.bindings.end(); + it != end_it; + ++it) + { + KEY key; + MASK mask; + LLKeyboard::keyFromString(it->key, &key); + LLKeyboard::maskFromString(it->mask, &mask); + bindKey(keymode.mode, key, mask, it->command); + binding_count++; + } + + return binding_count; +} S32 LLViewerKeyboard::loadBindings(const std::string& filename) { diff --git a/indra/newview/llviewerkeyboard.h b/indra/newview/llviewerkeyboard.h index 1893b6aee..29fff6f98 100644 --- a/indra/newview/llviewerkeyboard.h +++ b/indra/newview/llviewerkeyboard.h @@ -2,31 +2,25 @@ * @file llviewerkeyboard.h * @brief LLViewerKeyboard class header file * - * $LicenseInfo:firstyear=2005&license=viewergpl$ - * - * Copyright (c) 2005-2009, Linden Research, Inc. - * + * $LicenseInfo:firstyear=2005&license=viewerlgpl$ * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * Copyright (C) 2010, Linden Research, Inc. * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -34,6 +28,7 @@ #define LL_LLVIEWERKEYBOARD_H #include "llkeyboard.h" // For EKeystate +#include "llinitparam.h" const S32 MAX_NAMED_FUNCTIONS = 100; const S32 MAX_KEY_BINDINGS = 128; // was 60 @@ -64,18 +59,48 @@ void bind_keyboard_functions(); class LLViewerKeyboard { public: + struct KeyBinding : public LLInitParam::Block + { + Mandatory key, + mask, + command; + + KeyBinding(); + }; + + struct KeyMode : public LLInitParam::Block + { + Multiple bindings; + EKeyboardMode mode; + KeyMode(EKeyboardMode mode); + }; + + struct Keys : public LLInitParam::Block + { + Optional first_person, + third_person, + edit, + sitting, + edit_avatar; + + Keys(); + }; + LLViewerKeyboard(); BOOL handleKey(KEY key, MASK mask, BOOL repeated); S32 loadBindings(const std::string& filename); // returns number bound, 0 on error + S32 loadBindingsXML(const std::string& filename); // returns number bound, 0 on error void unloadBindings(); EKeyboardMode getMode(); BOOL modeFromString(const std::string& string, S32 *mode); // False on failure void scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level); -protected: + +private: + S32 loadBindingMode(const LLViewerKeyboard::KeyMode& keymode); BOOL bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name); // Hold all the ugly stuff torn out to make LLKeyboard non-viewer-specific here