diff --git a/README b/README index 50f553090..55c159679 100644 --- a/README +++ b/README @@ -17,160 +17,7 @@ those based upon OpenSim plattform. It is directly based upon source code of Ascent Viewer by Balseraph Software Group, which is in turn based upon source code released by Linden Lab, with contributions from various sources. -I, Siana Gearz (Second Life Resident) am the sole maintainer of Singularity -Viewer, and to the best of my knowledge and effort, Singularity is fully -compatible to Second Life/ Linden Lab Terms of Service and Third Party Viewer -Policy and shall stay that way. +As this Readme grows out of date, please refer to -Following features are the focus of my work to distinguish it from Ascent: - -* Ongoing effort to improve stability and performance beyond that of Ascent, and - hopefully also beyond that of any other Second Life viewer. In particular, - base code was upgraded from Snowglobe 1.4 to 1.5, texture fetch and texture - decode reimplemented based on work from Imprudence Viewer project. Several - performance and stability related improvements were implemented from scratch - or backported from more recent Linden Lab codebases. - -* For roleplaying: RLVa system 1.1.3 which supports in-world RLV compatible - wearables. Thanks to Kitty Barnett for contributed implementation! - -* Display names - partial support ported from Phoenix Viewer. Not as complete - as in Phoenix so far, needs further porting, and after that is done, needs - even more work. - -Following features are present in Singularity, distinguishing it from official -Linden Lab viewers. These particular features have already been present in -Ascent Viewer, unless noted otherwise. - -General conveniences: -* Identification of other viewers, avatar idle time -* Double-click local teleport (partial support) -* Pressing Esc to reset camera won't force to stand up -* Phantom Avatar lets you avoid physical push when you're being harassed -* Avatar Radar -* Alpha Skins and Tattoo Layers -* Enhanced Friend and Groups panels -* Script counting to check yourself and those around you for your impact on the - simulator performance -* Sound and animation explorers -* Multiple attachments per attachment point. Incompatible with Emerald system, - but compatible to Viewer 2.1 and more recent. Nonetheless, Emerald-compatible - attachments on other avatars can be displayed too. [NEW] in Singularity: - the worn items are managed in Viewer 2.2 compatible manner -* Vertical IM tabs -* Quick settings for performance and windlight in lower right -* Command line from Emerald for common operations -* Area search -* Windlight editor -* Built in pose stand - -Improvements for content creators: -* Free texture upload for testing textures and sculpties -* Preview animations on yourself upon upload -* Copy and Paste in build panel -* Embedded Animation Override editor -* Rez Objects As Land Group option -* Math expressions in build panel, from Imprudence -* Alignment tool, by Qarl Fizz -* Measure distance between any 2 prims -* UUID display for various things - full perm textures, prims, avatars -* Enhanced inspection floater - -Roleplaying: -* Fake away status -* Mu style posing, auto close OOC brackets -* Bouncy Breast physics effect -* Emerald-style privacy controls - -And possibly some or many that i forgot. - -System requierements: Dualcore CPU with SSE2 support, NVidia or ATI/AMD graphics -chip, 2GB RAM, Windows XP or newer, Ubuntu Linux 10.4 or newer. -Other systems support pending. - -Thanks go to following people: -* Linden Lab for publishing viewer source code -* All the various TPV developers and Snowglobe contributors for creating a - huge body of code to borrow from and compare against -* Hazim for developing Inertia on which Ascent is based. A really fine dude, - although his viewer is not TOS compliant -* Shyotl Kuhr who did many of the oprimizations incorportated in Ascent and - some new for Singularity -* Beeks and Charbi for Ascent. Ascent was started as a project to bring - Inertia to TOS compliance, and went on further to incorporate more features -* Robin Cornelius and Thickbrick Sleaford from Imprudence - have been a constant - help with general issues and tech -* Henri Beauchamp and Lance Corrimal for being a great source to borrow from - .oO(if Henri just wasn't such an unapproachable arse who doesn't respond - to IMs or contact me when he bugfixes my patches?) -* Kitty Barnett for contributing RLVa, Inventory Links and Current Outfit Folder -* Tonya Souther and Wolfspirit Magic from Phoenix - -Time for some FAQ! The questions are anonymized. - -Q: I heard your viewer is malicious! I hate you! -A: This was not a question. Also the person who came up with the rumor is - malicious, whoever they might be. - -Q: You are only 6 months old, thus you can't code! -A: And you don't have a life. - -Q: You are only 6 months old, thus you must be a griefer alt! -A: Still not a question. And no, i'm really a young angel kitty -.- - -Q: You are only 6 months old, thus you cannot know what Residents need! -A: Even if i was 1000, i'd still only know either what i myself need, or - whatever needs any Residents have expressed to me. Go ahead, get in touch. - -Q: But all TPVs are shady! -A: You are shady. Still, not a question. - -Q: Why isn't your viewer listed on Linden TPVD? -A: Oh thanks, a first real question! Because i haven't applied for it. - If there is a demand by real userbase someday, TPVD application will be - considered. It shouldn't be a problem because i check all of the code which - i commit, and borrow basically only from well known viewers from TPVD. - And oh besides, that the viewer is on TPVD doesn't mean it's safe. It is not - an unreasonable guess that it is, but there is quite a bit outside anyone's - control, unless Lindens set up a build farm which builds TPVs automatically - from publically released source, you just can't know that it matches up. - -Q: I like your viewer! How can i help? (QUESTION HYPOTHETICAL) -A: If you are able to, fork my viewer source on GitHub, work your magic there, - ping me on it, and i'll see whether i want your changes back in my viewer. - Or build my viewer from source and find bugs. - If you don't have necessary skills for that, your bug reports are somewhat - unlikely to be processed because of lack of time on my hands. - At the very least, precise reproduction steps are needed! - Oh, and position of localization manager might be open. - Also needed: someone to build from source on Mac OS X. - -Contact information: - Chat: http://webchat.freenode.net/?channels=SingularityViewer - (or freenode #SingularityViewer) - e-Mail: siana.gearz@googlemail.com - inSL: Siana Gearz - ONLY WHEN VISIBLE ONLINE!!! - - - - - -TO-DO LIST: - * Integrate, test, fix, test, test, fix and test OpenJPEG v2, - inline interleaved operations. - * Unified, high performance memory manager for all 3 plattforms. jemalloc wins on - memory use, google tcmalloc wins in every other regard, including use for - debugging, possibility of manual full collect on e.g. teleport, clean cross - platform integration. Either are better at what Windows and Linux offer. - * Bug: if window is resized during teleport, HUDs don't adjust to new window ratio. - * Bug: focusing from minimap is defunct. - * Bug: foot shadows show even if avatar below ground, and sink into prims. - * Fairer sculpty boosting - * Complete Display names, better login mask for new Residents - * Purge FMOD, force OpenAL on all plattforms, improve OpenAL denorm performance, - implement embedded ShoutCast player, OR just borrow VLC from Impru - * One-handed camera control and walking - * Stereoscopic rendering, mirror effects, better deferred mode - * More early culling - * Coalesced Drawables layer - puuuuuh -.- + http://www.singularityviewer.org/about diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index 5d53e7ec0..337d005be 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -35,8 +35,8 @@ const S32 LL_VERSION_MAJOR = 1; const S32 LL_VERSION_MINOR = 5; -const S32 LL_VERSION_PATCH = 4; -const S32 LL_VERSION_BUILD = 2; +const S32 LL_VERSION_PATCH = 5; +const S32 LL_VERSION_BUILD = 0; const char * const LL_CHANNEL = "Singularity"; diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 0531b1575..f14b9a8ad 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -101,8 +101,8 @@ const U32 SEPARATOR_HEIGHT_PIXELS = 8; const S32 TEAROFF_SEPARATOR_HEIGHT_PIXELS = 10; const S32 MENU_ITEM_PADDING = 4; -const std::string BOOLEAN_TRUE_PREFIX( "X" ); -const std::string BRANCH_SUFFIX( ">" ); +const std::string BOOLEAN_TRUE_PREFIX( "\xe2\x9c\x93" ); // U+2714 -- MC +const std::string BRANCH_SUFFIX( "\xE2\x96\xB6" ); // U+25B6 BLACK RIGHT-POINTING TRIANGLE const std::string ARROW_UP ("^^^^^^^"); const std::string ARROW_DOWN("vvvvvvv"); diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 2f3cb3ec3..d10ceb0d8 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -6110,7 +6110,7 @@ Type String Value - Ubuntu-R.ttf + DroidSans.ttf FontSansSerifBundledFallback @@ -6132,7 +6132,7 @@ Type String Value - Ubuntu-B.ttf + DroidSans-Bold.ttf FontSansSerifFallback @@ -6154,7 +6154,7 @@ Type F32 Value - 0.95 + 1.00 FontScreenDPI @@ -6176,7 +6176,7 @@ Type F32 Value - 16.0 + 14.0 FontSizeLarge @@ -6187,7 +6187,7 @@ Type F32 Value - 11.5 + 11.0 FontSizeMedium diff --git a/indra/newview/app_settings/static_data.db2 b/indra/newview/app_settings/static_data.db2 index 052ff9f1e..f85aa8160 100644 Binary files a/indra/newview/app_settings/static_data.db2 and b/indra/newview/app_settings/static_data.db2 differ diff --git a/indra/newview/app_settings/static_index.db2 b/indra/newview/app_settings/static_index.db2 index e0b737533..a5440f96f 100644 Binary files a/indra/newview/app_settings/static_index.db2 and b/indra/newview/app_settings/static_index.db2 differ diff --git a/indra/newview/fonts/DroidSans-Bold.ttf b/indra/newview/fonts/DroidSans-Bold.ttf new file mode 100644 index 000000000..7ac04b6f0 Binary files /dev/null and b/indra/newview/fonts/DroidSans-Bold.ttf differ diff --git a/indra/newview/fonts/DroidSans.ttf b/indra/newview/fonts/DroidSans.ttf new file mode 100644 index 000000000..2537cc3ae Binary files /dev/null and b/indra/newview/fonts/DroidSans.ttf differ diff --git a/indra/newview/fonts/Ubuntu-B.ttf b/indra/newview/fonts/Ubuntu-B.ttf deleted file mode 100644 index 28bae1f12..000000000 Binary files a/indra/newview/fonts/Ubuntu-B.ttf and /dev/null differ diff --git a/indra/newview/fonts/Ubuntu-R.ttf b/indra/newview/fonts/Ubuntu-R.ttf deleted file mode 100644 index 9388194f1..000000000 Binary files a/indra/newview/fonts/Ubuntu-R.ttf and /dev/null differ diff --git a/indra/newview/llfloaterteleporthistory.cpp b/indra/newview/llfloaterteleporthistory.cpp index 63b8ba378..41d4b091d 100644 --- a/indra/newview/llfloaterteleporthistory.cpp +++ b/indra/newview/llfloaterteleporthistory.cpp @@ -39,25 +39,24 @@ #include "lleventpoll.h" #include "llagent.h" //mk +#include "llappviewer.h" #include "llfloaterteleporthistory.h" #include "llfloaterworldmap.h" #include "lltimer.h" #include "lluictrlfactory.h" #include "llurldispatcher.h" #include "llurlsimstring.h" -#include "llviewercontrol.h" // gSavedSettings +#include "llviewercontrol.h" #include "llviewerwindow.h" #include "llweb.h" -#include "apr_time.h" - // globals LLFloaterTeleportHistory* gFloaterTeleportHistory; LLFloaterTeleportHistory::LLFloaterTeleportHistory() : LLFloater(std::string("teleporthistory")), mPlacesList(NULL), - id(0) + mID(0) { LLUICtrlFactory::getInstance()->buildFloater(this, "floater_teleport_history.xml", NULL); } @@ -71,7 +70,7 @@ LLFloaterTeleportHistory::~LLFloaterTeleportHistory() void LLFloaterTeleportHistory::onFocusReceived() { // take care to enable or disable buttons depending on the selection in the places list - if(mPlacesList->getFirstSelected()) + if (mPlacesList->getFirstSelected()) { setButtonsEnabled(TRUE); } @@ -86,7 +85,7 @@ BOOL LLFloaterTeleportHistory::postBuild() { // make sure the cached pointer to the scroll list is valid mPlacesList=getChild("places_list"); - if(!mPlacesList) + if (!mPlacesList) { llwarns << "coud not get pointer to places list" << llendl; return FALSE; @@ -102,7 +101,7 @@ BOOL LLFloaterTeleportHistory::postBuild() return TRUE; } -void LLFloaterTeleportHistory::addEntry(std::string regionName, S16 x, S16 y, S16 z) +void LLFloaterTeleportHistory::addPendingEntry(std::string regionName, S16 x, S16 y, S16 z) { #ifdef LL_RRINTERFACE_H //MK if (gRRenabled && gAgent.mRRInterface.mContainsShowloc) @@ -110,51 +109,79 @@ void LLFloaterTeleportHistory::addEntry(std::string regionName, S16 x, S16 y, S1 return; } #endif //mk - // only if the cached scroll list pointer is valid - if(mPlacesList) + + // Set pending entry timestamp + U32 utc_time; + utc_time = time_corrected(); + struct tm* internal_time; + internal_time = utc_to_pacific_time(utc_time, gPacificDaylightTime); + // check if we are in daylight savings time + std::string timeZone = " PST"; + if (gPacificDaylightTime) { - // prepare display of position - std::string position=llformat("%d, %d, %d", x, y, z); - // prepare simstring for later parsing - std::string simString = regionName + llformat("/%d/%d/%d", x, y, z); - simString = LLWeb::escapeURL(simString); + timeZone = " PDT"; + } +#ifdef LOCALIZED_TIME + timeStructToFormattedString(internal_time, gSavedSettings.getString("LongTimeFormat"), mPendingTimeString); + mPendingTimeString += timeZone; +#else + mPendingTimeString = llformat("%02d:%02d:%02d", internal_time->tm_hour, internal_time->tm_min, internal_time->tm_sec) + timeZone; +#endif - // check if we are in daylight savings time - std::string timeZone = "PST"; - if(is_daylight_savings()) timeZone = "PDT"; + // Set pending region name + mPendingRegionName = regionName; - // do all time related stuff as closely together as possible, because every other operation - // might change the internal tm* buffer - struct tm* internal_time; - internal_time = utc_to_pacific_time(time_corrected(), is_daylight_savings()); - std::string timeString=llformat("%02d:%02d:%02d ", internal_time->tm_hour, internal_time->tm_min, internal_time->tm_sec)+timeZone; + // Set pending position + mPendingPosition = llformat("%d, %d, %d", x, y, z); + // prepare simstring for later parsing + mPendingSimString = regionName + llformat("/%d/%d/%d", x, y, z); + mPendingSimString = LLWeb::escapeURL(mPendingSimString); + + // Prepare the SLURL + mPendingSLURL = LLURLDispatcher::buildSLURL(regionName, x, y, z); +} + +void LLFloaterTeleportHistory::addEntry(std::string parcelName) +{ + if (mPendingRegionName.empty()) + { + return; + } + + // only if the cached scroll list pointer is valid + if (mPlacesList) + { // build the list entry LLSD value; - value["id"] = id; - value["columns"][0]["column"] = "region"; - value["columns"][0]["value"] = regionName; - value["columns"][1]["column"] = "position"; - value["columns"][1]["value"] = position; - value["columns"][2]["column"] = "visited"; - value["columns"][2]["value"] = timeString; + value["id"] = mID; + value["columns"][LIST_PARCEL]["column"] = "parcel"; + value["columns"][LIST_PARCEL]["value"] = parcelName; + value["columns"][LIST_REGION]["column"] = "region"; + value["columns"][LIST_REGION]["value"] = mPendingRegionName; + value["columns"][LIST_POSITION]["column"] = "position"; + value["columns"][LIST_POSITION]["value"] = mPendingPosition; + value["columns"][LIST_VISITED]["column"] = "visited"; + value["columns"][LIST_VISITED]["value"] = mPendingTimeString; // these columns are hidden and serve as data storage for simstring and SLURL - value["columns"][3]["column"] = "slurl"; - value["columns"][3]["value"] = LLURLDispatcher::buildSLURL(regionName, x, y, z); - value["columns"][4]["column"] = "simstring"; - value["columns"][4]["value"] = simString; + value["columns"][LIST_SLURL]["column"] = "slurl"; + value["columns"][LIST_SLURL]["value"] = mPendingSLURL; + value["columns"][LIST_SIMSTRING]["column"] = "simstring"; + value["columns"][LIST_SIMSTRING]["value"] = mPendingSimString; // add the new list entry on top of the list, deselect all and disable the buttons mPlacesList->addElement(value, ADD_TOP); mPlacesList->deselectAllItems(TRUE); setButtonsEnabled(FALSE); - id++; + mID++; } else { llwarns << "pointer to places list is NULL" << llendl; } + + mPendingRegionName.clear(); } void LLFloaterTeleportHistory::setButtonsEnabled(BOOL on) @@ -185,7 +212,7 @@ void LLFloaterTeleportHistory::onPlacesSelected(LLUICtrl* /* ctrl */, void* data LLFloaterTeleportHistory* self = (LLFloaterTeleportHistory*) data; // on selection change check if we need to enable or disable buttons - if(self->mPlacesList->getFirstSelected()) + if (self->mPlacesList->getFirstSelected()) { self->setButtonsEnabled(TRUE); } @@ -201,7 +228,7 @@ void LLFloaterTeleportHistory::onTeleport(void* data) LLFloaterTeleportHistory* self = (LLFloaterTeleportHistory*) data; // build secondlife::/app link from simstring for instant teleport to destination - std::string slapp="secondlife:///app/teleport/" + self->mPlacesList->getFirstSelected()->getColumn(4)->getValue().asString(); + std::string slapp = "secondlife:///app/teleport/" + self->mPlacesList->getFirstSelected()->getColumn(LIST_SIMSTRING)->getValue().asString(); LLMediaCtrl* web = NULL; LLURLDispatcher::dispatch(slapp, web, TRUE); } @@ -212,7 +239,7 @@ void LLFloaterTeleportHistory::onShowOnMap(void* data) LLFloaterTeleportHistory* self = (LLFloaterTeleportHistory*) data; // get simstring from selected entry and parse it for its components - std::string simString = self->mPlacesList->getFirstSelected()->getColumn(4)->getValue().asString(); + std::string simString = self->mPlacesList->getFirstSelected()->getColumn(LIST_SIMSTRING)->getValue().asString(); std::string region = ""; S32 x = 128; S32 y = 128; @@ -231,6 +258,6 @@ void LLFloaterTeleportHistory::onCopySLURL(void* data) LLFloaterTeleportHistory* self = (LLFloaterTeleportHistory*) data; // get SLURL of the selected entry and copy it to the clipboard - std::string SLURL=self->mPlacesList->getFirstSelected()->getColumn(3)->getValue().asString(); + std::string SLURL = self->mPlacesList->getFirstSelected()->getColumn(LIST_SLURL)->getValue().asString(); gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(SLURL)); } diff --git a/indra/newview/llfloaterteleporthistory.h b/indra/newview/llfloaterteleporthistory.h index ba15700f0..06e4b75ad 100644 --- a/indra/newview/llfloaterteleporthistory.h +++ b/indra/newview/llfloaterteleporthistory.h @@ -45,39 +45,54 @@ class LLFloaterTeleportHistory : public LLFloater { - public: - LLFloaterTeleportHistory(); - virtual ~LLFloaterTeleportHistory(); +public: + LLFloaterTeleportHistory(); + virtual ~LLFloaterTeleportHistory(); - /// @brief: reimplemented to check for selection changes in the places list scrolllist - virtual void onFocusReceived(); + /// @brief: reimplemented to check for selection changes in the places list scrolllist + virtual void onFocusReceived(); - /// @brief: reimplemented to make the menu toggle work - virtual void onClose(bool app_quitting); + /// @brief: reimplemented to make the menu toggle work + virtual void onClose(bool app_quitting); - /// @brief: reimplemented to prevent this floater from closing while the viewer is shutting down - virtual BOOL canClose(); + /// @brief: reimplemented to prevent this floater from closing while the viewer is shutting down + virtual BOOL canClose(); - BOOL postBuild(); + BOOL postBuild(); - /// @brief: adds a teleport destination to the list of visited places - void addEntry(std::string regionName, S16 x, S16 y, S16 z); + /// @brief: adds the pending teleport destination + void addPendingEntry(std::string regionName, S16 x, S16 y, S16 z); + /// @brief: adds the destination to the list of visited places + void addEntry(std::string parcelName); - protected: - static void onPlacesSelected(LLUICtrl* ctrl, void* data); - static void onTeleport(void* data); - static void onShowOnMap(void* data); - static void onCopySLURL(void* data); +private: + enum HISTORY_COLUMN_ORDER + { + LIST_PARCEL, + LIST_REGION, + LIST_POSITION, + LIST_VISITED, + LIST_SLURL, + LIST_SIMSTRING + }; - /// @brief: enables or disables the "Teleport", "Show On Map" and "Copy To SLURL" buttons **/ - void setButtonsEnabled(BOOL on); + static void onPlacesSelected(LLUICtrl* ctrl, void* data); + static void onTeleport(void* data); + static void onShowOnMap(void* data); + static void onCopySLURL(void* data); - LLScrollListCtrl* mPlacesList; + /// @brief: enables or disables the "Teleport", "Show On Map" and "Copy To SLURL" buttons **/ + void setButtonsEnabled(BOOL on); - S32 id; + LLScrollListCtrl* mPlacesList; - /// @brief: to see if this was the first time setVisible() was called (at program startup) - BOOL firstRun; + S32 mID; + + std::string mPendingRegionName; + std::string mPendingPosition; + std::string mPendingSimString; + std::string mPendingTimeString; + std::string mPendingSLURL; }; // globals diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 350f7200b..3c0e6524f 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -3748,7 +3748,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) } // add teleport destination to the list of visited places - gFloaterTeleportHistory->addEntry(regionp->getName(),(S16)agent_pos.mV[0],(S16)agent_pos.mV[1],(S16)agent_pos.mV[2]); + gFloaterTeleportHistory->addPendingEntry(regionp->getName(), (S16)agent_pos.mV[VX], (S16)agent_pos.mV[VY], (S16)agent_pos.mV[VZ]); } else { diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index e7184fe24..7d40cae4a 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -53,6 +53,7 @@ #include "llfloatergroups.h" //#include "llfloaterhtml.h" #include "llfloatersellland.h" +#include "llfloaterteleporthistory.h" #include "llfloatertools.h" #include "llnotify.h" #include "llparcelselection.h" @@ -1518,6 +1519,9 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use } } + // Add any pending entry to the TP history now that we got the *new* parcel name. + gFloaterTeleportHistory->addEntry(LLViewerParcelMgr::getInstance()->getAgentParcelName()); + // Handle updating selections, if necessary. if (sequence_id == SELECTED_PARCEL_SEQ_ID) { diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 2e1899f25..14e796e6e 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1949,6 +1949,7 @@ BOOL LLVOAvatar::buildSkeleton(const LLVOAvatarSkeletonInfo *info) LLVector3 scale(1.f, aspect, 1.f); mScreenp->setScale(scale); mScreenp->setWorldPosition(LLVector3::zero); + mScreenp->mUpdateXform = TRUE; } return TRUE; diff --git a/indra/newview/skins/default/xui/en-us/floater_teleport_history.xml b/indra/newview/skins/default/xui/en-us/floater_teleport_history.xml index b3be9790a..1f4827f79 100644 --- a/indra/newview/skins/default/xui/en-us/floater_teleport_history.xml +++ b/indra/newview/skins/default/xui/en-us/floater_teleport_history.xml @@ -1,46 +1,28 @@ - - - - - - - - - - - - - - - - - - - - - - - -