summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOz Linden <oz@lindenlab.com>2011-03-17 14:56:01 -0400
committerOz Linden <oz@lindenlab.com>2011-03-17 14:56:01 -0400
commitf64a20ddcff91677b02b7688e08819cffb0989c9 (patch)
tree707b1430e5b7ef2e27f4f34c66822e92dfffd294
parentc077250ff16aeaf0ec4c036154a427c677e85eb3 (diff)
parent17d87b0fa5bdd8d15dbcd98e65c30ebf4e5b94ec (diff)
merge changes for storm-1016
-rw-r--r--.hgtags8
-rw-r--r--BuildParams68
-rw-r--r--doc/contributions.txt13
-rw-r--r--indra/cmake/FindLLQtWebkit.cmake4
-rw-r--r--indra/linux_updater/linux_updater.cpp9
-rw-r--r--indra/llcommon/llavatarname.cpp10
-rw-r--r--indra/llcommon/llprocesslauncher.cpp2
-rw-r--r--indra/llcommon/llversionviewer.h2
-rw-r--r--indra/llinventory/llparcel.cpp13
-rw-r--r--indra/llinventory/llparcel.h6
-rw-r--r--indra/llmath/v3math.h13
-rw-r--r--indra/llplugin/llpluginprocessparent.cpp1
-rw-r--r--indra/llprimitive/lltextureentry.cpp22
-rw-r--r--indra/llrender/llvertexbuffer.cpp13
-rw-r--r--indra/llui/llcombobox.cpp29
-rw-r--r--indra/llui/llcombobox.h3
-rw-r--r--indra/llui/lldockcontrol.cpp6
-rw-r--r--indra/llui/llfloater.cpp10
-rw-r--r--indra/llui/llfloater.h4
-rw-r--r--indra/llui/lllayoutstack.cpp10
-rw-r--r--indra/llui/llnotifications.cpp69
-rw-r--r--indra/llui/llnotifications.h11
-rw-r--r--indra/llui/llradiogroup.cpp2
-rw-r--r--indra/llui/lluictrlfactory.cpp24
-rw-r--r--indra/llui/llview.cpp6
-rw-r--r--indra/llui/llview.h4
-rw-r--r--indra/llvfs/lldir.cpp6
-rw-r--r--indra/llxml/llcontrol.cpp5
-rw-r--r--indra/llxml/llcontrol.h2
-rw-r--r--indra/llxml/llxmlnode.cpp24
-rw-r--r--indra/llxml/llxmlnode.h3
-rw-r--r--indra/llxuixml/lltrans.cpp5
-rw-r--r--indra/llxuixml/lltrans.h2
-rw-r--r--indra/media_plugins/winmmshim/CMakeLists.txt6
-rw-r--r--indra/newview/CMakeLists.txt13
-rw-r--r--indra/newview/app_settings/CA.pem19
-rw-r--r--indra/newview/app_settings/cmd_line.xml18
-rw-r--r--indra/newview/app_settings/settings.xml237
-rw-r--r--indra/newview/app_settings/settings_files.xml212
-rw-r--r--indra/newview/app_settings/settings_minimal.xml406
-rw-r--r--indra/newview/llappearancemgr.cpp3
-rw-r--r--indra/newview/llappviewer.cpp247
-rw-r--r--indra/newview/llappviewer.h2
-rwxr-xr-xindra/newview/llavataractions.cpp21
-rw-r--r--indra/newview/llavataractions.h2
-rw-r--r--indra/newview/llbottomtray.cpp165
-rw-r--r--indra/newview/llbottomtray.h19
-rw-r--r--indra/newview/llchathistory.cpp43
-rw-r--r--indra/newview/llchathistory.h2
-rwxr-xr-xindra/newview/llcommandhandler.cpp2
-rw-r--r--indra/newview/llfirstuse.cpp65
-rw-r--r--indra/newview/llfirstuse.h10
-rw-r--r--indra/newview/llfloaterauction.cpp4
-rw-r--r--indra/newview/llfloatermap.cpp12
-rw-r--r--indra/newview/llfloatersidetraytab.cpp6
-rw-r--r--indra/newview/llfloatersidetraytab.h2
-rwxr-xr-xindra/newview/llfloaterworldmap.cpp12
-rw-r--r--indra/newview/llfriendcard.cpp85
-rw-r--r--indra/newview/llfriendcard.h13
-rw-r--r--indra/newview/llgroupactions.cpp6
-rw-r--r--indra/newview/llhudeffectblob.cpp78
-rw-r--r--indra/newview/llhudeffectblob.h50
-rw-r--r--indra/newview/llhudobject.cpp4
-rw-r--r--indra/newview/llhudobject.h3
-rw-r--r--indra/newview/llinventoryfunctions.cpp3
-rw-r--r--indra/newview/llinventorymodelbackgroundfetch.cpp2
-rw-r--r--indra/newview/lllocationinputctrl.cpp1
-rw-r--r--indra/newview/llnavigationbar.cpp19
-rw-r--r--indra/newview/llnearbychatbar.cpp11
-rw-r--r--indra/newview/llnearbychatbar.h2
-rw-r--r--indra/newview/llnetmap.cpp24
-rw-r--r--indra/newview/llnotificationscripthandler.cpp2
-rw-r--r--indra/newview/llpanellandaudio.cpp15
-rw-r--r--indra/newview/llpanellandmedia.cpp27
-rw-r--r--indra/newview/llpanellogin.cpp50
-rw-r--r--indra/newview/llpanellogin.h2
-rw-r--r--indra/newview/llpanelnearbymedia.cpp22
-rw-r--r--indra/newview/llpanelpeople.cpp29
-rwxr-xr-xindra/newview/llpanelpicks.cpp13
-rwxr-xr-xindra/newview/llpanelprofile.cpp19
-rw-r--r--indra/newview/llshareavatarhandler.cpp8
-rw-r--r--indra/newview/llsidetray.cpp100
-rw-r--r--indra/newview/llsidetray.h6
-rw-r--r--indra/newview/llstartup.cpp6460
-rw-r--r--indra/newview/lltexturecache.cpp19
-rw-r--r--indra/newview/lltoast.cpp7
-rw-r--r--indra/newview/lltoolpie.cpp301
-rw-r--r--indra/newview/lltoolpie.h24
-rw-r--r--indra/newview/llurldispatcher.cpp2
-rw-r--r--indra/newview/llviewermedia.cpp69
-rw-r--r--indra/newview/llviewermenu.cpp121
-rw-r--r--indra/newview/llviewermenu.h2
-rw-r--r--indra/newview/llviewermessage.cpp42
-rw-r--r--indra/newview/llviewernetwork.cpp4
-rw-r--r--indra/newview/llviewerobjectlist.cpp56
-rw-r--r--indra/newview/llviewerobjectlist.h4
-rw-r--r--indra/newview/llviewerregion.cpp14
-rw-r--r--indra/newview/llviewerstats.cpp2
-rw-r--r--indra/newview/llviewertexture.cpp4
-rw-r--r--indra/newview/llviewertexture.h2
-rw-r--r--indra/newview/llviewerwindow.cpp26
-rw-r--r--indra/newview/llvocache.cpp6
-rw-r--r--indra/newview/llvoicecallhandler.cpp8
-rw-r--r--indra/newview/llworld.cpp4
-rw-r--r--indra/newview/pipeline.cpp1
-rw-r--r--indra/newview/skins/default/textures/bottomtray/ChatBarHandle.pngbin0 -> 2808 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml1
-rw-r--r--indra/newview/skins/default/xui/da/floater_about_land.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_about_land.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_about_land.xml19
-rw-r--r--indra/newview/skins/default/xui/en/main_view.xml7
-rw-r--r--indra/newview/skins/default/xui/en/menu_bottomtray.xml12
-rw-r--r--indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml240
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml777
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray.xml35
-rw-r--r--indra/newview/skins/default/xui/en/panel_login.xml41
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml26
-rw-r--r--indra/newview/skins/default/xui/en/panel_places.xml7
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml9
-rw-r--r--indra/newview/skins/default/xui/es/floater_about_land.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about_land.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_about_land.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about_land.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_about_land.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_about_land.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_about_land.xml2
-rw-r--r--indra/newview/skins/minimal/colors.xml6
-rw-r--r--indra/newview/skins/minimal/textures/arrow_keys.pngbin0 -> 6558 bytes
-rw-r--r--indra/newview/skins/minimal/textures/bottomtray/button_separator.pngbin0 -> 153 bytes
-rw-r--r--indra/newview/skins/minimal/textures/bottomtray/close_off.pngbin0 -> 3184 bytes
-rw-r--r--indra/newview/skins/minimal/textures/bottomtray/close_over.pngbin0 -> 3173 bytes
-rw-r--r--indra/newview/skins/minimal/textures/bottomtray/close_press.pngbin0 -> 3259 bytes
-rw-r--r--indra/newview/skins/minimal/textures/textures.xml8
-rw-r--r--indra/newview/skins/minimal/xui/de/floater_camera.xml65
-rw-r--r--indra/newview/skins/minimal/xui/de/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/minimal/xui/de/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/minimal/xui/de/inspect_avatar.xml25
-rw-r--r--indra/newview/skins/minimal/xui/de/inspect_object.xml48
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_avatar_self.xml31
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_cof_clothing.xml8
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_edit.xml12
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_favorites.xml10
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_inspect_avatar_gear.xml17
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_inspect_self_gear.xml10
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_inventory.xml86
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_inventory_add.xml33
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_inventory_gear_default.xml16
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_land.xml9
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_landmark.xml7
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_login.xml25
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_navbar.xml11
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_object.xml29
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_outfit_gear.xml27
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_picks.xml8
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_place.xml7
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_places_gear_folder.xml15
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_slurl.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_url_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_url_http.xml7
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_url_map.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_viewer.xml14
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/de/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/minimal/xui/de/panel_bottomtray.xml39
-rw-r--r--indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml30
-rw-r--r--indra/newview/skins/minimal/xui/de/panel_login.xml40
-rw-r--r--indra/newview/skins/minimal/xui/de/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/minimal/xui/de/panel_people.xml70
-rw-r--r--indra/newview/skins/minimal/xui/de/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/minimal/xui/de/panel_status_bar.xml33
-rw-r--r--indra/newview/skins/minimal/xui/en/floater_camera.xml284
-rw-r--r--indra/newview/skins/minimal/xui/en/floater_help_browser.xml52
-rw-r--r--indra/newview/skins/minimal/xui/en/floater_media_browser.xml242
-rw-r--r--indra/newview/skins/minimal/xui/en/floater_nearby_chat.xml52
-rw-r--r--indra/newview/skins/minimal/xui/en/floater_side_bar_tab.xml10
-rw-r--r--indra/newview/skins/minimal/xui/en/floater_web_content.xml189
-rw-r--r--indra/newview/skins/minimal/xui/en/inspect_avatar.xml206
-rw-r--r--indra/newview/skins/minimal/xui/en/inspect_object.xml144
-rw-r--r--indra/newview/skins/minimal/xui/en/main_view.xml268
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_add_wearable_gear.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_attachment_other.xml76
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_attachment_self.xml26
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_avatar_other.xml75
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_avatar_self.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_bottomtray.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_cof_attachment.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_cof_body_part.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_cof_clothing.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_cof_gear.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_edit.xml90
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_favorites.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_gesture_gear.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_group_plus.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_im_well_button.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml116
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_inspect_object_gear.xml50
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_inspect_self_gear.xml49
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_inventory.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_inventory_add.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_inventory_gear_default.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_land.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_landmark.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_login.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_mini_map.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_navbar.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_notification_well_button.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_object.xml40
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_object_icon.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_outfit_gear.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_outfit_tab.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_participant_list.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_people_friends_view_sort.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_people_groups.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_people_groups_view_sort.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_people_nearby.xml61
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_people_nearby_multiselect.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_people_nearby_view_sort.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_people_recent_view_sort.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_picks.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_picks_plus.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_place.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_place_add_button.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_places_gear_folder.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_places_gear_landmark.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_profile_overflow.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_save_outfit.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_slurl.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_teleport_history_gear.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_teleport_history_item.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_teleport_history_tab.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_text_editor.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_topinfobar.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_url_agent.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_url_group.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_url_http.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_url_inventory.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_url_map.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_url_objectim.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_url_parcel.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_url_slapp.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_url_slurl.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_url_teleport.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_viewer.xml71
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_wearable_list_item.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_wearing_gear.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/menu_wearing_tab.xml2
-rw-r--r--indra/newview/skins/minimal/xui/en/notification_visibility.xml29
-rw-r--r--indra/newview/skins/minimal/xui/en/notifications.xml44
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml46
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_bottomtray.xml483
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_group_control_panel.xml79
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml27
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_login.xml206
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_navigation_bar.xml76
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_people.xml550
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_side_tray_tab_caption.xml11
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_status_bar.xml62
-rw-r--r--indra/newview/skins/minimal/xui/en/panel_volume_pulldown.xml34
-rw-r--r--indra/newview/skins/minimal/xui/en/widgets/location_input.xml131
-rw-r--r--indra/newview/skins/minimal/xui/es/floater_camera.xml65
-rw-r--r--indra/newview/skins/minimal/xui/es/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/minimal/xui/es/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/minimal/xui/es/inspect_avatar.xml24
-rw-r--r--indra/newview/skins/minimal/xui/es/inspect_object.xml41
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_avatar_self.xml31
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_cof_clothing.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_edit.xml12
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_favorites.xml10
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml17
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_inspect_self_gear.xml10
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_inventory.xml86
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_inventory_add.xml33
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_inventory_gear_default.xml16
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_land.xml9
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_landmark.xml7
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_login.xml24
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_navbar.xml11
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_object.xml29
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_outfit_gear.xml27
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_picks.xml8
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_place.xml7
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_places_gear_folder.xml15
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_slurl.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_url_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_url_http.xml7
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_url_map.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_viewer.xml14
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/es/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/minimal/xui/es/panel_bottomtray.xml39
-rw-r--r--indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/minimal/xui/es/panel_login.xml40
-rw-r--r--indra/newview/skins/minimal/xui/es/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/minimal/xui/es/panel_people.xml71
-rw-r--r--indra/newview/skins/minimal/xui/es/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/minimal/xui/es/panel_status_bar.xml33
-rw-r--r--indra/newview/skins/minimal/xui/fr/floater_camera.xml65
-rw-r--r--indra/newview/skins/minimal/xui/fr/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/minimal/xui/fr/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/minimal/xui/fr/inspect_avatar.xml25
-rw-r--r--indra/newview/skins/minimal/xui/fr/inspect_object.xml48
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_avatar_self.xml31
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_cof_clothing.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_edit.xml12
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_favorites.xml10
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_inspect_avatar_gear.xml17
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_inspect_self_gear.xml10
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_inventory.xml86
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_inventory_add.xml33
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_inventory_gear_default.xml16
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_land.xml9
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_landmark.xml7
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_login.xml25
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_navbar.xml11
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_object.xml29
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_outfit_gear.xml27
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_picks.xml8
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_place.xml7
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_places_gear_folder.xml15
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_slurl.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_url_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_url_http.xml7
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_url_map.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_viewer.xml14
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/fr/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml39
-rw-r--r--indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml30
-rw-r--r--indra/newview/skins/minimal/xui/fr/panel_login.xml40
-rw-r--r--indra/newview/skins/minimal/xui/fr/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/minimal/xui/fr/panel_people.xml71
-rw-r--r--indra/newview/skins/minimal/xui/fr/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/minimal/xui/fr/panel_status_bar.xml33
-rw-r--r--indra/newview/skins/minimal/xui/pt/floater_camera.xml65
-rw-r--r--indra/newview/skins/minimal/xui/pt/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/minimal/xui/pt/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pt/inspect_avatar.xml24
-rw-r--r--indra/newview/skins/minimal/xui/pt/inspect_object.xml41
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_avatar_self.xml31
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_cof_clothing.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_edit.xml12
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_favorites.xml10
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_inspect_avatar_gear.xml17
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_inspect_self_gear.xml10
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_inventory.xml86
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_inventory_add.xml33
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_inventory_gear_default.xml16
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_land.xml9
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_landmark.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_login.xml24
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_navbar.xml11
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_object.xml29
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_outfit_gear.xml27
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_picks.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_place.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_places_gear_folder.xml15
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_slurl.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_url_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_url_http.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_url_map.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_viewer.xml14
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/pt/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml39
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_login.xml40
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_people.xml71
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/minimal/xui/pt/panel_status_bar.xml33
-rw-r--r--indra/newview/viewer_manifest.py4
-rw-r--r--install.xml8
581 files changed, 15429 insertions, 4350 deletions
diff --git a/.hgtags b/.hgtags
index 8fa56c75b7..8d5f290ff6 100644
--- a/.hgtags
+++ b/.hgtags
@@ -71,3 +71,11 @@ b723921b5c711bd24dbe77dc76ef488b544dac78 2.5.0-release
b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-31_2.5.0-release
92e58e51776a4f8c29069b1a62ff21454d2085f0 2.6.0-start
63a6aedfce785a6c760377bf685b2dae616797d2 2.5.1-start
+4dede9ae1ec74d41f6887719f6f1de7340d8578d 2.5.1-release
+4dede9ae1ec74d41f6887719f6f1de7340d8578d DRTVWR-37_2.5.1-release
+b53a0576eec80614d7767ed72b40ed67aeff27c9 DRTVWR-38_2.5.2-release
+b53a0576eec80614d7767ed72b40ed67aeff27c9 2.5.2-release
+92e58e51776a4f8c29069b1a62ff21454d2085f0 2.6.0-start
+f1827b441e05bf37c68e2c15ebc6d09e9b03f527 2.6.0-start
+f1827b441e05bf37c68e2c15ebc6d09e9b03f527 2.6.0-start
+4e9eec6a347f89b2b3f295beb72f1cf7837dff66 2.6.0-start
diff --git a/BuildParams b/BuildParams
index 8e036ab56b..3ce41adc3a 100644
--- a/BuildParams
+++ b/BuildParams
@@ -48,6 +48,12 @@ viewer-beta.login_channel = "Second Life Beta Viewer"
viewer-beta.build_debug_release_separately = true
viewer-beta.build_viewer_update_version_manager = true
+viewer-pre-beta.viewer_channel = "Second Life Beta Viewer"
+viewer-pre-beta.login_channel = "Second Life Beta Viewer"
+viewer-pre-beta.build_debug_release_separately = true
+viewer-pre-beta.build_viewer_update_version_manager = true
+
+
# ========================================
# Viewer Release
# ========================================
@@ -57,13 +63,11 @@ viewer-release.build_debug_release_separately = true
viewer-release.build_viewer_update_version_manager = true
viewer-release.release-viewer.jira = DRTVWR-13
-# ========================================
-# aimee
-# ========================================
-
-viewer-development-import.build_debug_release_separately = true
-viewer-development-fixes.build_debug_release_separately = true
-viewer-development-tweaks.build_debug_release_separately = true
+viewer-pre-release.viewer_channel = "Second Life Release"
+viewer-pre-release.login_channel = "Second Life Release"
+viewer-pre-release.build_debug_release_separately = true
+viewer-pre-release.build_viewer_update_version_manager = true
+#viewer-pre-release.release-viewer.jira = DRTVWR-13
# =======================================
# brad
@@ -152,55 +156,7 @@ media.build_viewer_update_version_manager = false
# oz
# ================
-oz_viewer-review1_coverity.coverity_product = viewer
-
-oz_viewer-review1.build_Linux = true
-oz_viewer-review1_debug.build_Linux = false
-oz_viewer-review1_coverity.build_Linux = false
-
-oz_viewer-review1.build_Darwin = true
-oz_viewer-review1_debug.build_Darwin = false
-oz_viewer-review1_coverity.build_Darwin = false
-
-oz_viewer-review1.build_CYGWIN = true
-oz_viewer-review1.build_CYGWIN_Debug = false
-oz_viewer-review1.build_CYGWIN_RelWithDebInfo = false
-oz_viewer-review1.build_CYGWIN_Release = true
-oz_viewer-review1_debug.build_CYGWIN_Debug = true
-oz_viewer-review1_debug.build_CYGWIN_RelWithDebInfo = true
-oz_viewer-review1_debug.build_CYGWIN_Release = false
-oz_viewer-review1_coverity.build_coverity = true
-oz_viewer-review1_coverity.build_CYGWIN_Debug = false
-oz_viewer-review1_coverity.build_CYGWIN_RelWithDebInfo = false
-oz_viewer-review1_coverity.build_CYGWIN_Release = false
-
-oz_viewer-review2_coverity.coverity_product = viewer
-
-oz_viewer-review2.build_Linux = true
-oz_viewer-review2_debug.build_Linux = false
-oz_viewer-review2_coverity.build_Linux = false
-
-oz_viewer-review2.build_Darwin = true
-oz_viewer-review2_debug.build_Darwin = false
-oz_viewer-review2_coverity.build_Darwin = false
-
-oz_viewer-review2.build_CYGWIN = true
-oz_viewer-review2.build_CYGWIN_Debug = false
-oz_viewer-review2.build_CYGWIN_RelWithDebInfo = false
-oz_viewer-review2.build_CYGWIN_Release = true
-oz_viewer-review2_debug.build_CYGWIN_Debug = true
-oz_viewer-review2_debug.build_CYGWIN_RelWithDebInfo = true
-oz_viewer-review2_debug.build_CYGWIN_Release = false
-oz_viewer-review2_coverity.build_coverity = true
-oz_viewer-review2_coverity.build_CYGWIN_Debug = false
-oz_viewer-review2_coverity.build_CYGWIN_RelWithDebInfo = false
-oz_viewer-review2_coverity.build_CYGWIN_Release = false
-
-# ========================================
-# tofu
-# ========================================
-
-tofu_viewer-development-staging.email = tofu.linden@lindenlab.com
+oz_viewer-devreview.build_debug_release_separately = true
# ========================================
# enus
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 26d9b98b95..560bedd518 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -84,10 +84,12 @@ Aleric Inglewood
VWR-24315
VWR-24317
VWR-24320
- VWR-24321
+ VWR-24321
+ VWR-24337
VWR-24354
VWR-24366
VWR-24519
+ VWR-24520
SNOW-84
SNOW-477
SNOW-744
@@ -156,6 +158,7 @@ Ann Congrejo
CT-193
Ardy Lay
VWR-19499
+ VWR-24917
Argent Stonecutter
VWR-68
Armin Weatherwax
@@ -236,6 +239,7 @@ Coaldust Numbers
VWR-1095
Cron Stardust
VWR-10579
+ VWR-25120
Cypren Christenson
STORM-417
Dale Glass
@@ -402,8 +406,13 @@ Jonathan Yap
STORM-977
STORM-979
STORM-980
+ STORM-1040
VWR-17801
VWR-24347
+ STORM-975
+ STORM-990
+ STORM-1020
+ STORM-1064
Kage Pixel
VWR-11
Ken March
@@ -420,6 +429,7 @@ Kitty Barnett
STORM-288
STORM-799
STORM-800
+ STORM-1001
VWR-24217
Kunnis Basiat
VWR-82
@@ -831,6 +841,7 @@ WolfPup Lowenhar
STORM-102
STORM-103
STORM-143
+ STORM-236
STORM-255
STORM-256
STORM-288
diff --git a/indra/cmake/FindLLQtWebkit.cmake b/indra/cmake/FindLLQtWebkit.cmake
index c747ec32a2..4bf5f5cb73 100644
--- a/indra/cmake/FindLLQtWebkit.cmake
+++ b/indra/cmake/FindLLQtWebkit.cmake
@@ -22,9 +22,9 @@ if (PKG_CONFIG_FOUND)
else (LLQtWebkit_FIND_REQUIRED AND LLQtWebkit_FIND_VERSION)
set(_PACKAGE_ARGS libllqtwebkit)
endif (LLQtWebkit_FIND_REQUIRED AND LLQtWebkit_FIND_VERSION)
- if (NOT "${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" VERSION_LESS "2.8")
+ if (NOT "${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}" VERSION_LESS "2.8.2")
# As virtually nobody will have a pkg-config file for this, do this check always quiet.
- # Unfortunately cmake 2.8 or higher is required for pkg_check_modules to have a 'QUIET'.
+ # Unfortunately cmake 2.8.2 or higher is required for pkg_check_modules to have a 'QUIET'.
set(_PACKAGE_ARGS ${_PACKAGE_ARGS} QUIET)
endif ()
pkg_check_modules(LLQTWEBKIT ${_PACKAGE_ARGS})
diff --git a/indra/linux_updater/linux_updater.cpp b/indra/linux_updater/linux_updater.cpp
index d909516bf8..a81de0223c 100644
--- a/indra/linux_updater/linux_updater.cpp
+++ b/indra/linux_updater/linux_updater.cpp
@@ -88,9 +88,16 @@ bool translate_init(std::string comma_delim_path_list,
std::vector<std::string> paths;
LLStringUtil::getTokens(comma_delim_path_list, paths, ","); // split over ','
+ for(std::vector<std::string>::iterator it = paths.begin(), end_it = paths.end();
+ it != end_it;
+ ++it)
+ {
+ (*it) = gDirUtilp->findSkinnedFilename(*it, base_xml_name);
+ }
+
// suck the translation xml files into memory
LLXMLNodePtr root;
- bool success = LLXMLNode::getLayeredXMLNode(base_xml_name, root, paths);
+ bool success = LLXMLNode::getLayeredXMLNode(root, paths);
if (!success)
{
// couldn't load string table XML
diff --git a/indra/llcommon/llavatarname.cpp b/indra/llcommon/llavatarname.cpp
index ad1845d387..ba3dd6d6b4 100644
--- a/indra/llcommon/llavatarname.cpp
+++ b/indra/llcommon/llavatarname.cpp
@@ -90,14 +90,16 @@ void LLAvatarName::fromLLSD(const LLSD& sd)
std::string LLAvatarName::getCompleteName() const
{
std::string name;
- if (!mUsername.empty())
+ if (mUsername.empty() || mIsDisplayNameDefault)
+ // If the display name feature is off
+ // OR this particular display name is defaulted (i.e. based on user name),
+ // then display only the easier to read instance of the person's name.
{
- name = mDisplayName + " (" + mUsername + ")";
+ name = mDisplayName;
}
else
{
- // ...display names are off, legacy name is in mDisplayName
- name = mDisplayName;
+ name = mDisplayName + " (" + mUsername + ")";
}
return name;
}
diff --git a/indra/llcommon/llprocesslauncher.cpp b/indra/llcommon/llprocesslauncher.cpp
index 4b0f6b0251..d46188104f 100644
--- a/indra/llcommon/llprocesslauncher.cpp
+++ b/indra/llcommon/llprocesslauncher.cpp
@@ -103,7 +103,7 @@ int LLProcessLauncher::launch(void)
char *args2 = new char[args.size() + 1];
strcpy(args2, args.c_str());
- if( ! CreateProcessA( NULL, args2, NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo ) )
+ if( ! CreateProcessA( NULL, args2, NULL, NULL, FALSE, 0, NULL, mWorkingDir.c_str(), &sinfo, &pinfo ) )
{
// TODO: do better than returning the OS-specific error code on failure...
result = GetLastError();
diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index 5a134b5009..117d96ffa6 100644
--- a/indra/llcommon/llversionviewer.h
+++ b/indra/llcommon/llversionviewer.h
@@ -28,7 +28,7 @@
#define LL_LLVERSIONVIEWER_H
const S32 LL_VERSION_MAJOR = 2;
-const S32 LL_VERSION_MINOR = 5;
+const S32 LL_VERSION_MINOR = 6;
const S32 LL_VERSION_PATCH = 1;
const S32 LL_VERSION_BUILD = 0;
diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp
index d2409375e3..0a4cd51ea0 100644
--- a/indra/llinventory/llparcel.cpp
+++ b/indra/llinventory/llparcel.cpp
@@ -190,8 +190,6 @@ void LLParcel::init(const LLUUID &owner_id,
mMediaID.setNull();
mMediaAutoScale = 0;
mMediaLoop = TRUE;
- mObscureMedia = 1;
- mObscureMusic = 1;
mMediaWidth = 0;
mMediaHeight = 0;
setMediaCurrentURL(LLStringUtil::null);
@@ -687,8 +685,8 @@ void LLParcel::packMessage(LLSD& msg)
msg["auto_scale"] = getMediaAutoScale();
msg["media_loop"] = getMediaLoop();
msg["media_current_url"] = getMediaCurrentURL();
- msg["obscure_media"] = getObscureMedia();
- msg["obscure_music"] = getObscureMusic();
+ msg["obscure_media"] = false; // OBSOLETE - no longer used
+ msg["obscure_music"] = false; // OBSOLETE - no longer used
msg["media_id"] = getMediaID();
msg["media_allow_navigate"] = getMediaAllowNavigate();
msg["media_prevent_camera_zoom"] = getMediaPreventCameraZoom();
@@ -752,16 +750,13 @@ void LLParcel::unpackMessage(LLMessageSystem* msg)
msg->getS32("MediaData", "MediaWidth", mMediaWidth);
msg->getS32("MediaData", "MediaHeight", mMediaHeight);
msg->getU8 ( "MediaData", "MediaLoop", mMediaLoop );
- msg->getU8 ( "MediaData", "ObscureMedia", mObscureMedia );
- msg->getU8 ( "MediaData", "ObscureMusic", mObscureMusic );
+ // the ObscureMedia and ObscureMusic flags previously set here are no longer used
}
else
{
setMediaType(std::string("video/vnd.secondlife.qt.legacy"));
setMediaDesc(std::string("No Description available without Server Upgrade"));
mMediaLoop = true;
- mObscureMedia = true;
- mObscureMusic = true;
}
if(msg->getNumberOfBlocks("MediaLinkSharing") > 0)
@@ -1227,8 +1222,6 @@ void LLParcel::clearParcel()
setMediaDesc(LLStringUtil::null);
setMediaAutoScale(0);
setMediaLoop(TRUE);
- mObscureMedia = 1;
- mObscureMusic = 1;
mMediaWidth = 0;
mMediaHeight = 0;
setMediaCurrentURL(LLStringUtil::null);
diff --git a/indra/llinventory/llparcel.h b/indra/llinventory/llparcel.h
index 751e2deb84..71b65d99ce 100644
--- a/indra/llinventory/llparcel.h
+++ b/indra/llinventory/llparcel.h
@@ -239,8 +239,6 @@ public:
void setMediaID(const LLUUID& id) { mMediaID = id; }
void setMediaAutoScale ( U8 flagIn ) { mMediaAutoScale = flagIn; }
void setMediaLoop (U8 loop) { mMediaLoop = loop; }
- void setObscureMedia( U8 flagIn ) { mObscureMedia = flagIn; }
- void setObscureMusic( U8 flagIn ) { mObscureMusic = flagIn; }
void setMediaWidth(S32 width);
void setMediaHeight(S32 height);
void setMediaCurrentURL(const std::string& url);
@@ -347,8 +345,6 @@ public:
U8 getMediaAutoScale() const { return mMediaAutoScale; }
U8 getMediaLoop() const { return mMediaLoop; }
const std::string& getMediaCurrentURL() const { return mMediaCurrentURL; }
- U8 getObscureMedia() const { return mObscureMedia; }
- U8 getObscureMusic() const { return mObscureMusic; }
U8 getMediaURLFilterEnable() const { return mMediaURLFilterEnable; }
LLSD getMediaURLFilterList() const { return mMediaURLFilterList; }
U8 getMediaAllowNavigate() const { return mMediaAllowNavigate; }
@@ -637,8 +633,6 @@ protected:
U8 mMediaAutoScale;
U8 mMediaLoop;
std::string mMediaCurrentURL;
- U8 mObscureMedia;
- U8 mObscureMusic;
LLUUID mMediaID;
U8 mMediaURLFilterEnable;
LLSD mMediaURLFilterList;
diff --git a/indra/llmath/v3math.h b/indra/llmath/v3math.h
index dbd38c1c3f..ef002fe9f2 100644
--- a/indra/llmath/v3math.h
+++ b/indra/llmath/v3math.h
@@ -156,6 +156,8 @@ F32 dist_vec(const LLVector3 &a, const LLVector3 &b); // Returns distance betwe
F32 dist_vec_squared(const LLVector3 &a, const LLVector3 &b);// Returns distance squared between a and b
F32 dist_vec_squared2D(const LLVector3 &a, const LLVector3 &b);// Returns distance squared between a and b ignoring Z component
LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b
+LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b (same as projected_vec)
+LLVector3 orthogonal_component(const LLVector3 &a, const LLVector3 &b); // Returns component of vector a not parallel to vector b (same as projected_vec)
LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u); // Returns a vector that is a linear interpolation between a and b
inline LLVector3::LLVector3(void)
@@ -490,6 +492,17 @@ inline LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b)
return project_axis * (a * project_axis);
}
+inline LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b)
+{
+ return projected_vec(a, b);
+}
+
+inline LLVector3 orthogonal_component(const LLVector3 &a, const LLVector3 &b)
+{
+ return a - projected_vec(a, b);
+}
+
+
inline LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u)
{
return LLVector3(
diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp
index db4b8b1316..315096d4fd 100644
--- a/indra/llplugin/llpluginprocessparent.cpp
+++ b/indra/llplugin/llpluginprocessparent.cpp
@@ -160,6 +160,7 @@ void LLPluginProcessParent::errorState(void)
void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_dir, const std::string &plugin_filename, bool debug)
{
mProcess.setExecutable(launcher_filename);
+ mProcess.setWorkingDirectory(plugin_dir);
mPluginFile = plugin_filename;
mPluginDir = plugin_dir;
mCPUUsage = 0.0f;
diff --git a/indra/llprimitive/lltextureentry.cpp b/indra/llprimitive/lltextureentry.cpp
index 861bde5c89..34eff17519 100644
--- a/indra/llprimitive/lltextureentry.cpp
+++ b/indra/llprimitive/lltextureentry.cpp
@@ -423,24 +423,10 @@ S32 LLTextureEntry::setBumpShinyFullbright(U8 bump)
S32 LLTextureEntry::setMediaTexGen(U8 media)
{
- if (mMediaFlags != media)
- {
- mMediaFlags = media;
-
- // Special code for media handling
- if( hasMedia() && mMediaEntry == NULL)
- {
- mMediaEntry = new LLMediaEntry;
- }
- else if ( ! hasMedia() && mMediaEntry != NULL)
- {
- delete mMediaEntry;
- mMediaEntry = NULL;
- }
-
- return TEM_CHANGE_MEDIA;
- }
- return TEM_CHANGE_NONE;
+ S32 result = TEM_CHANGE_NONE;
+ result |= setTexGen(media & TEM_TEX_GEN_MASK);
+ result |= setMediaFlags(media & TEM_MEDIA_MASK);
+ return result;
}
S32 LLTextureEntry::setBumpmap(U8 bump)
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index 7b5907a668..1beb74eca6 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -310,7 +310,18 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
//static
void LLVertexBuffer::initClass(bool use_vbo, bool no_vbo_mapping)
{
- sEnableVBOs = use_vbo;
+ sEnableVBOs = use_vbo && gGLManager.mHasVertexBufferObject ;
+ if(sEnableVBOs)
+ {
+ //llassert_always(glBindBufferARB) ; //double check the extention for VBO is loaded.
+
+ llinfos << "VBO is enabled." << llendl ;
+ }
+ else
+ {
+ llinfos << "VBO is disabled." << llendl ;
+ }
+
sDisableVBOMapping = sEnableVBOs && no_vbo_mapping ;
LLGLNamePool::registerPool(&sDynamicVBOPool);
LLGLNamePool::registerPool(&sDynamicIBOPool);
diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp
index 8b6a73af56..6f9893b07a 100644
--- a/indra/llui/llcombobox.cpp
+++ b/indra/llui/llcombobox.cpp
@@ -316,7 +316,7 @@ void LLComboBox::setValue(const LLSD& value)
LLScrollListItem* item = mList->getFirstSelected();
if (item)
{
- setLabel(getSelectedItemLabel());
+ updateLabel();
}
mLastSelectedIndex = mList->getFirstSelectedIndex();
}
@@ -384,6 +384,23 @@ void LLComboBox::setLabel(const LLStringExplicit& name)
}
}
+void LLComboBox::updateLabel()
+{
+ // Update the combo editor with the selected
+ // item label.
+ if (mTextEntry)
+ {
+ mTextEntry->setText(getSelectedItemLabel());
+ mTextEntry->setTentative(FALSE);
+ }
+
+ // If combo box doesn't allow text entry update
+ // the combo button label.
+ if (!mAllowTextEntry)
+ {
+ mButton->setLabel(getSelectedItemLabel());
+ }
+}
BOOL LLComboBox::remove(const std::string& name)
{
@@ -701,13 +718,13 @@ void LLComboBox::onItemSelected(const LLSD& data)
mLastSelectedIndex = getCurrentIndex();
if (mLastSelectedIndex != -1)
{
- setLabel(getSelectedItemLabel());
+ updateLabel();
if (mAllowTextEntry)
- {
- gFocusMgr.setKeyboardFocus(mTextEntry);
- mTextEntry->selectAll();
- }
+ {
+ gFocusMgr.setKeyboardFocus(mTextEntry);
+ mTextEntry->selectAll();
+ }
}
// hiding the list reasserts the old value stored in the text editor/dropdown button
hideList();
diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h
index 74d64269bd..e9ef9d07e4 100644
--- a/indra/llui/llcombobox.h
+++ b/indra/llui/llcombobox.h
@@ -148,6 +148,9 @@ public:
// This is probably a UI abuse.
void setLabel(const LLStringExplicit& name);
+ // Updates the combobox label to match the selected list item.
+ void updateLabel();
+
BOOL remove(const std::string& name); // remove item "name", return TRUE if found and removed
BOOL setCurrentByIndex( S32 index );
diff --git a/indra/llui/lldockcontrol.cpp b/indra/llui/lldockcontrol.cpp
index f6f5a0beb3..b1c27126d9 100644
--- a/indra/llui/lldockcontrol.cpp
+++ b/indra/llui/lldockcontrol.cpp
@@ -160,8 +160,10 @@ bool LLDockControl::isDockVisible()
case TOP:
{
// check is dock inside parent rect
+ // assume that parent for all dockable flaoters
+ // is the root view
LLRect dockParentRect =
- mDockWidget->getParent()->calcScreenRect();
+ mDockWidget->getRootView()->calcScreenRect();
if (dockRect.mRight <= dockParentRect.mLeft
|| dockRect.mLeft >= dockParentRect.mRight)
{
@@ -297,7 +299,7 @@ void LLDockControl::moveDockable()
break;
}
- S32 max_available_height = rootRect.getHeight() - mDockTongueY - mDockTongue->getHeight();
+ S32 max_available_height = rootRect.getHeight() - (rootRect.mBottom - mDockTongueY) - mDockTongue->getHeight();
// A floater should be shrunk so it doesn't cover a part of its docking tongue and
// there is a space between a dockable floater and a control to which it is docked.
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 556278b139..d19e33ea55 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -2590,9 +2590,13 @@ void LLFloaterView::draw()
LLRect LLFloaterView::getSnapRect() const
{
- LLRect snap_rect = getRect();
- snap_rect.mBottom += mSnapOffsetBottom;
- snap_rect.mRight -= mSnapOffsetRight;
+ LLRect snap_rect = getLocalRect();
+
+ LLView* snap_view = mSnapView.get();
+ if (snap_view)
+ {
+ snap_view->localRectToOtherView(snap_view->getLocalRect(), &snap_rect, this);
+ }
return snap_rect;
}
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 79570720cc..5b7b020881 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -496,10 +496,10 @@ public:
// value is not defined.
S32 getZOrder(LLFloater* child);
- void setSnapOffsetBottom(S32 offset) { mSnapOffsetBottom = offset; }
- void setSnapOffsetRight(S32 offset) { mSnapOffsetRight = offset; }
+ void setFloaterSnapView(LLHandle<LLView> snap_view) {mSnapView = snap_view; }
private:
+ LLHandle<LLView> mSnapView;
BOOL mFocusCycleMode;
S32 mSnapOffsetBottom;
S32 mSnapOffsetRight;
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index 19ac4c58a8..9b6830a816 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -563,7 +563,7 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
}
// update resize bars with new limits
- LLResizeBar* last_resize_bar = NULL;
+ LLLayoutPanel* last_resizeable_panel = NULL;
for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
{
LLPanel* panelp = (*panel_it);
@@ -585,17 +585,17 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
BOOL resize_bar_enabled = panelp->getVisible() && (*panel_it)->mUserResize;
(*panel_it)->mResizeBar->setVisible(resize_bar_enabled);
- if (resize_bar_enabled)
+ if ((*panel_it)->mUserResize || (*panel_it)->mAutoResize)
{
- last_resize_bar = (*panel_it)->mResizeBar;
+ last_resizeable_panel = (*panel_it);
}
}
// hide last resize bar as there is nothing past it
// resize bars need to be in between two resizable panels
- if (last_resize_bar)
+ if (last_resizeable_panel)
{
- last_resize_bar->setVisible(FALSE);
+ last_resizeable_panel->mResizeBar->setVisible(FALSE);
}
// not enough room to fit existing contents
diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index cc9edfcdea..bdac125eb0 100644
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -1195,16 +1195,18 @@ bool LLNotifications::uniqueFilter(LLNotificationPtr pNotif)
bool LLNotifications::uniqueHandler(const LLSD& payload)
{
+ std::string cmd = payload["sigtype"];
+
LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID());
if (pNotif && pNotif->hasUniquenessConstraints())
{
- if (payload["sigtype"].asString() == "add")
+ if (cmd == "add")
{
// not a duplicate according to uniqueness criteria, so we keep it
// and store it for future uniqueness checks
mUniqueNotifications.insert(std::make_pair(pNotif->getName(), pNotif));
}
- else if (payload["sigtype"].asString() == "delete")
+ else if (cmd == "delete")
{
mUniqueNotifications.erase(pNotif->getName());
}
@@ -1217,12 +1219,16 @@ bool LLNotifications::failedUniquenessTest(const LLSD& payload)
{
LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID());
- if (!pNotif || !pNotif->hasUniquenessConstraints())
+ std::string cmd = payload["sigtype"];
+
+ if (!pNotif || cmd != "add")
{
return false;
}
- // checks against existing unique notifications
+ // Update the existing unique notification with the data from this particular instance...
+ // This guarantees that duplicate notifications will be collapsed to the one
+ // most recently triggered
for (LLNotificationMap::iterator existing_it = mUniqueNotifications.find(pNotif->getName());
existing_it != mUniqueNotifications.end();
++existing_it)
@@ -1235,7 +1241,7 @@ bool LLNotifications::failedUniquenessTest(const LLSD& payload)
// of this unique notification and update it
existing_notification->updateFrom(pNotif);
// then delete the new one
- pNotif->cancel();
+ cancel(pNotif);
}
}
@@ -1300,26 +1306,14 @@ void LLNotifications::createDefaultChannels()
// usage LLStopWhenHandled combiner in LLStandardSignal
LLNotifications::instance().getChannel("Unique")->
connectAtFrontChanged(boost::bind(&LLNotifications::uniqueHandler, this, _1));
-// failedUniquenessTest slot isn't necessary
-// LLNotifications::instance().getChannel("Unique")->
-// connectFailedFilter(boost::bind(&LLNotifications::failedUniquenessTest, this, _1));
+ LLNotifications::instance().getChannel("Unique")->
+ connectFailedFilter(boost::bind(&LLNotifications::failedUniquenessTest, this, _1));
LLNotifications::instance().getChannel("Ignore")->
connectFailedFilter(&handleIgnoredNotification);
LLNotifications::instance().getChannel("VisibilityRules")->
connectFailedFilter(&visibilityRuleMached);
}
-bool LLNotifications::addTemplate(const std::string &name,
- LLNotificationTemplatePtr theTemplate)
-{
- if (mTemplates.count(name))
- {
- llwarns << "LLNotifications -- attempted to add template '" << name << "' twice." << llendl;
- return false;
- }
- mTemplates[name] = theTemplate;
- return true;
-}
LLNotificationTemplatePtr LLNotifications::getTemplate(const std::string& name)
{
@@ -1416,27 +1410,45 @@ void replaceFormText(LLNotificationForm::Params& form, const std::string& patter
}
}
+void addPathIfExists(const std::string& new_path, std::vector<std::string>& paths)
+{
+ if (gDirUtilp->fileExists(new_path))
+ {
+ paths.push_back(new_path);
+ }
+}
+
bool LLNotifications::loadTemplates()
{
- const std::string xml_filename = "notifications.xml";
- std::string full_filename = gDirUtilp->findSkinnedFilename(LLUI::getXUIPaths().front(), xml_filename);
+ std::vector<std::string> search_paths;
+
+ std::string skin_relative_path = gDirUtilp->getDirDelimiter() + LLUI::getSkinPath() + gDirUtilp->getDirDelimiter() + "notifications.xml";
+ std::string localized_skin_relative_path = gDirUtilp->getDirDelimiter() + LLUI::getLocalizedSkinPath() + gDirUtilp->getDirDelimiter() + "notifications.xml";
+
+ addPathIfExists(gDirUtilp->getDefaultSkinDir() + skin_relative_path, search_paths);
+ addPathIfExists(gDirUtilp->getDefaultSkinDir() + localized_skin_relative_path, search_paths);
+ addPathIfExists(gDirUtilp->getSkinDir() + skin_relative_path, search_paths);
+ addPathIfExists(gDirUtilp->getSkinDir() + localized_skin_relative_path, search_paths);
+ addPathIfExists(gDirUtilp->getUserSkinDir() + skin_relative_path, search_paths);
+ addPathIfExists(gDirUtilp->getUserSkinDir() + localized_skin_relative_path, search_paths);
+ std::string base_filename = search_paths.front();
LLXMLNodePtr root;
- BOOL success = LLUICtrlFactory::getLayeredXMLNode(xml_filename, root);
+ BOOL success = LLXMLNode::getLayeredXMLNode(root, search_paths);
if (!success || root.isNull() || !root->hasName( "notifications" ))
{
- llerrs << "Problem reading UI Notifications file: " << full_filename << llendl;
+ llerrs << "Problem reading UI Notifications file: " << base_filename << llendl;
return false;
}
LLNotificationTemplate::Notifications params;
LLXUIParser parser;
- parser.readXUI(root, params, full_filename);
+ parser.readXUI(root, params, base_filename);
if(!params.validateBlock())
{
- llerrs << "Problem reading UI Notifications file: " << full_filename << llendl;
+ llerrs << "Problem reading UI Notifications file: " << base_filename << llendl;
return false;
}
@@ -1483,7 +1495,7 @@ bool LLNotifications::loadTemplates()
replaceFormText(it->form_ref.form, "$ignoretext", it->form_ref.form_template.ignore_text);
}
}
- addTemplate(it->name, LLNotificationTemplatePtr(new LLNotificationTemplate(*it)));
+ mTemplates[it->name] = LLNotificationTemplatePtr(new LLNotificationTemplate(*it));
}
return true;
@@ -1578,7 +1590,7 @@ void LLNotifications::add(const LLNotificationPtr pNotif)
void LLNotifications::cancel(LLNotificationPtr pNotif)
{
- if (pNotif == NULL) return;
+ if (pNotif == NULL || pNotif->isCancelled()) return;
LLNotificationSet::iterator it=mItems.find(pNotif);
if (it == mItems.end())
@@ -1680,7 +1692,6 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
for(it = mVisibilityRules.begin(); it != mVisibilityRules.end(); it++)
{
// An empty type/tag/name string will match any notification, so only do the comparison when the string is non-empty in the rule.
-
lldebugs
<< "notification \"" << n->getName() << "\" "
<< "testing against " << ((*it)->mVisible?"show":"hide") << " rule, "
@@ -1728,7 +1739,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
// Response property is empty. Cancel this notification.
lldebugs << "cancelling notification " << n->getName() << llendl;
- n->cancel();
+ cancel(n);
}
else
{
diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h
index 34d3537781..0c4d4fc897 100644
--- a/indra/llui/llnotifications.h
+++ b/indra/llui/llnotifications.h
@@ -863,10 +863,11 @@ class LLNotifications :
friend class LLSingleton<LLNotifications>;
public:
- // load notification descriptions from file;
- // OK to call more than once because it will reload
- bool loadTemplates();
-
+ // load all notification descriptions from file
+ // calling more than once will overwrite existing templates
+ // but never delete a template
+ bool loadTemplates();
+
// load visibility rules from file;
// OK to call more than once because it will reload
bool loadVisibilityRules();
@@ -950,8 +951,6 @@ private:
LLNotificationChannelPtr pHistoryChannel;
LLNotificationChannelPtr pExpirationChannel;
- // put your template in
- bool addTemplate(const std::string& name, LLNotificationTemplatePtr theTemplate);
TemplateMap mTemplates;
VisibilityRuleList mVisibilityRules;
diff --git a/indra/llui/llradiogroup.cpp b/indra/llui/llradiogroup.cpp
index 6e9586369f..3a12debf7e 100644
--- a/indra/llui/llradiogroup.cpp
+++ b/indra/llui/llradiogroup.cpp
@@ -346,7 +346,7 @@ void LLRadioGroup::setValue( const LLSD& value )
}
else
{
- llwarns << "LLRadioGroup::setValue: value not found: " << value.asString() << llendl;
+ setSelectedIndex(-1, TRUE);
}
}
}
diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp
index 5de96f9d48..25e7a31e90 100644
--- a/indra/llui/lluictrlfactory.cpp
+++ b/indra/llui/lluictrlfactory.cpp
@@ -152,7 +152,27 @@ static LLFastTimer::DeclareTimer FTM_XML_PARSE("XML Reading/Parsing");
bool LLUICtrlFactory::getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr& root)
{
LLFastTimer timer(FTM_XML_PARSE);
- return LLXMLNode::getLayeredXMLNode(xui_filename, root, LLUI::getXUIPaths());
+
+ std::vector<std::string> paths;
+ std::string path = gDirUtilp->findSkinnedFilename(LLUI::getSkinPath(), xui_filename);
+ if (!path.empty())
+ {
+ paths.push_back(path);
+ }
+
+ std::string localize_path = gDirUtilp->findSkinnedFilename(LLUI::getLocalizedSkinPath(), xui_filename);
+ if (!localize_path.empty() && localize_path != path)
+ {
+ paths.push_back(localize_path);
+ }
+
+ if (paths.empty())
+ {
+ // sometimes whole path is passed in as filename
+ paths.push_back(xui_filename);
+ }
+
+ return LLXMLNode::getLayeredXMLNode(root, paths);
}
@@ -214,7 +234,7 @@ LLView *LLUICtrlFactory::createFromXML(LLXMLNodePtr node, LLView* parent, const
std::string LLUICtrlFactory::getCurFileName()
{
- return mFileNames.empty() ? "" : gDirUtilp->getWorkingDir() + gDirUtilp->getDirDelimiter() + mFileNames.back();
+ return mFileNames.empty() ? "" : mFileNames.back();
}
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index 267640a226..d73e87129e 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -338,7 +338,7 @@ void LLView::removeChild(LLView* child)
}
else
{
- llerrs << "LLView::removeChild called with non-child" << llendl;
+ llwarns << child->getName() << "is not a child of " << getName() << llendl;
}
updateBoundingRect();
}
@@ -1958,7 +1958,7 @@ void LLView::centerWithin(const LLRect& bounds)
translate( left - getRect().mLeft, bottom - getRect().mBottom );
}
-BOOL LLView::localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, LLView* other_view) const
+BOOL LLView::localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, const LLView* other_view) const
{
const LLView* cur_view = this;
const LLView* root_view = NULL;
@@ -2001,7 +2001,7 @@ BOOL LLView::localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, LL
return FALSE;
}
-BOOL LLView::localRectToOtherView( const LLRect& local, LLRect* other, LLView* other_view ) const
+BOOL LLView::localRectToOtherView( const LLRect& local, LLRect* other, const LLView* other_view ) const
{
LLRect cur_rect = local;
const LLView* cur_view = this;
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index d2bbd663b8..61dc4b8030 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -406,8 +406,8 @@ public:
BOOL blockMouseEvent(S32 x, S32 y) const;
// See LLMouseHandler virtuals for screenPointToLocal and localPointToScreen
- BOOL localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, LLView* other_view) const;
- BOOL localRectToOtherView( const LLRect& local, LLRect* other, LLView* other_view ) const;
+ BOOL localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, const LLView* other_view) const;
+ BOOL localRectToOtherView( const LLRect& local, LLRect* other, const LLView* other_view ) const;
void screenRectToLocal( const LLRect& screen, LLRect* local ) const;
void localRectToScreen( const LLRect& local, LLRect* screen ) const;
diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp
index cb898e385f..341c96f6ea 100644
--- a/indra/llvfs/lldir.cpp
+++ b/indra/llvfs/lldir.cpp
@@ -149,7 +149,11 @@ const std::string LLDir::findFile(const std::string& filename, const std::vector
{
if (!search_path_iter->empty())
{
- std::string filename_and_path = (*search_path_iter) + getDirDelimiter() + filename;
+ std::string filename_and_path = (*search_path_iter);
+ if (!filename.empty())
+ {
+ filename_and_path += getDirDelimiter() + filename;
+ }
if (fileExists(filename_and_path))
{
return filename_and_path;
diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp
index 6c72609122..6e4364a20d 100644
--- a/indra/llxml/llcontrol.cpp
+++ b/indra/llxml/llcontrol.cpp
@@ -835,7 +835,7 @@ U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only
return num_saved;
}
-U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_values)
+U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_values, bool save_values)
{
std::string name;
LLSD settings;
@@ -908,8 +908,7 @@ U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_v
}
else if(existing_control->isPersisted())
{
-
- existing_control->setValue(control_map["Value"]);
+ existing_control->setValue(control_map["Value"], save_values);
}
// *NOTE: If not persisted and not setting defaults,
// the value should not get loaded.
diff --git a/indra/llxml/llcontrol.h b/indra/llxml/llcontrol.h
index 93975579cc..e402061e1f 100644
--- a/indra/llxml/llcontrol.h
+++ b/indra/llxml/llcontrol.h
@@ -289,7 +289,7 @@ public:
// as the given type.
U32 loadFromFileLegacy(const std::string& filename, BOOL require_declaration = TRUE, eControlType declare_as = TYPE_STRING);
U32 saveToFile(const std::string& filename, BOOL nondefault_only);
- U32 loadFromFile(const std::string& filename, bool default_values = false);
+ U32 loadFromFile(const std::string& filename, bool default_values = false, bool save_values = true);
void resetToDefaults();
};
diff --git a/indra/llxml/llxmlnode.cpp b/indra/llxml/llxmlnode.cpp
index 8168f968cd..9f1e249ddd 100644
--- a/indra/llxml/llxmlnode.cpp
+++ b/indra/llxml/llxmlnode.cpp
@@ -859,23 +859,21 @@ BOOL LLXMLNode::isFullyDefault()
}
// static
-bool LLXMLNode::getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr& root,
+bool LLXMLNode::getLayeredXMLNode(LLXMLNodePtr& root,
const std::vector<std::string>& paths)
{
- std::string full_filename = gDirUtilp->findSkinnedFilename(paths.front(), xui_filename);
- if (full_filename.empty())
+ if (paths.empty()) return false;
+
+ std::string filename = paths.front();
+ if (filename.empty())
{
return false;
}
-
- if (!LLXMLNode::parseFile(full_filename, root, NULL))
+
+ if (!LLXMLNode::parseFile(filename, root, NULL))
{
- // try filename as passed in since sometimes we load an xml file from a user-supplied path
- if (!LLXMLNode::parseFile(xui_filename, root, NULL))
- {
- llwarns << "Problem reading UI description file: " << xui_filename << llendl;
- return false;
- }
+ llwarns << "Problem reading UI description file: " << filename << llendl;
+ return false;
}
LLXMLNodePtr updateRoot;
@@ -887,7 +885,7 @@ bool LLXMLNode::getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr&
std::string nodeName;
std::string updateName;
- std::string layer_filename = gDirUtilp->findSkinnedFilename((*itor), xui_filename);
+ std::string layer_filename = *itor;
if(layer_filename.empty())
{
// no localized version of this file, that's ok, keep looking
@@ -896,7 +894,7 @@ bool LLXMLNode::getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr&
if (!LLXMLNode::parseFile(layer_filename, updateRoot, NULL))
{
- llwarns << "Problem reading localized UI description file: " << (*itor) + gDirUtilp->getDirDelimiter() + xui_filename << llendl;
+ llwarns << "Problem reading localized UI description file: " << layer_filename << llendl;
return false;
}
diff --git a/indra/llxml/llxmlnode.h b/indra/llxml/llxmlnode.h
index 9df37ccb6f..e3da7169e7 100644
--- a/indra/llxml/llxmlnode.h
+++ b/indra/llxml/llxmlnode.h
@@ -149,8 +149,7 @@ public:
LLXMLNodePtr& update_node);
static LLXMLNodePtr replaceNode(LLXMLNodePtr node, LLXMLNodePtr replacement_node);
- static bool getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr& root,
- const std::vector<std::string>& paths);
+ static bool getLayeredXMLNode(LLXMLNodePtr& root, const std::vector<std::string>& paths);
// Write standard XML file header:
diff --git a/indra/llxuixml/lltrans.cpp b/indra/llxuixml/lltrans.cpp
index 11127a53f5..e13d73c640 100644
--- a/indra/llxuixml/lltrans.cpp
+++ b/indra/llxuixml/lltrans.cpp
@@ -255,3 +255,8 @@ std::string LLTrans::getCountString(const std::string& language, const std::stri
std::string key = llformat("%s%s", xml_desc.c_str(), form);
return getString(key, args);
}
+
+void LLTrans::setDefaultArg(const std::string& name, const std::string& value)
+{
+ sDefaultArgs[name] = value;
+}
diff --git a/indra/llxuixml/lltrans.h b/indra/llxuixml/lltrans.h
index 42c27b6976..5b127b53cf 100644
--- a/indra/llxuixml/lltrans.h
+++ b/indra/llxuixml/lltrans.h
@@ -110,6 +110,8 @@ public:
return sDefaultArgs;
}
+ static void setDefaultArg(const std::string& name, const std::string& value);
+
// insert default args into an arg list
static void getArgs(LLStringUtil::format_map_t& args)
{
diff --git a/indra/media_plugins/winmmshim/CMakeLists.txt b/indra/media_plugins/winmmshim/CMakeLists.txt
index 387214088f..bf74f81809 100644
--- a/indra/media_plugins/winmmshim/CMakeLists.txt
+++ b/indra/media_plugins/winmmshim/CMakeLists.txt
@@ -3,6 +3,12 @@
project(winmm_shim)
### winmm_shim
+# *HACK - override msvcrt implementation (intialized on 00-Common) to be
+# statically linked for winmm.dll this relies on vc taking the last flag on
+# the command line
+set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
+set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MT")
+set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
set(winmm_shim_SOURCE_FILES
forwarding_api.cpp
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index af6beacdfa..66869288b6 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -246,6 +246,7 @@ set(viewer_SOURCE_FILES
llhudeffectlookat.cpp
llhudeffectpointat.cpp
llhudeffecttrail.cpp
+ llhudeffectblob.cpp
llhudicon.cpp
llhudmanager.cpp
llhudnametag.cpp
@@ -786,6 +787,7 @@ set(viewer_HEADER_FILES
llhudeffectlookat.h
llhudeffectpointat.h
llhudeffecttrail.h
+ llhudeffectblob.h
llhudicon.h
llhudmanager.h
llhudnametag.h
@@ -1298,22 +1300,20 @@ endif (WINDOWS)
set(viewer_XUI_FILES
skins/default/colors.xml
skins/default/textures/textures.xml
+ skins/minimal/colors.xml
+ skins/minimal/textures/textures.xml
)
file(GLOB DEFAULT_XUI_FILE_GLOB_LIST
- ${CMAKE_CURRENT_SOURCE_DIR}/skins/default/xui/en/*.xml)
+ ${CMAKE_CURRENT_SOURCE_DIR}/skins/*/xui/en/*.xml)
list(APPEND viewer_XUI_FILES ${DEFAULT_XUI_FILE_GLOB_LIST})
file(GLOB DEFAULT_WIDGET_FILE_GLOB_LIST
- ${CMAKE_CURRENT_SOURCE_DIR}/skins/default/xui/en/widgets/*.xml)
+ ${CMAKE_CURRENT_SOURCE_DIR}/skins/*/xui/en/widgets/*.xml)
list(APPEND viewer_XUI_FILES ${DEFAULT_WIDGET_FILE_GLOB_LIST})
-file(GLOB SILVER_XUI_FILE_GLOB_LIST
- ${CMAKE_CURRENT_SOURCE_DIR}/skins/silver/xui/en-us/*.xml)
-list(APPEND viewer_XUI_FILES ${SILVER_XUI_FILE_GLOB_LIST})
-
# Cannot append empty lists in CMake, wait until we have files here.
#file(GLOB SILVER_WIDGET_FILE_GLOB_LIST
# ${CMAKE_CURRENT_SOURCE_DIR}/skins/silver/xui/en-us/widgets/*.xml)
@@ -1343,6 +1343,7 @@ set(viewer_APPSETTINGS_FILES
app_settings/settings_crash_behavior.xml
app_settings/settings_files.xml
app_settings/settings_per_account.xml
+ app_settings/settings_minimal.xml
app_settings/std_bump.ini
app_settings/trees.xml
app_settings/ultra_graphics.xml
diff --git a/indra/newview/app_settings/CA.pem b/indra/newview/app_settings/CA.pem
index 11825bf906..7cebbf48b2 100644
--- a/indra/newview/app_settings/CA.pem
+++ b/indra/newview/app_settings/CA.pem
@@ -3895,3 +3895,22 @@ xA39CIJ65Zozs28Eg1aV9/Y+Of7TnWhW+U3J3/wD/GghaAGiKK6vMn9gJBIdBX/9
e6ef37VGyiOEFFjnUIbuk0RWty0orN76q/lI/xjCi15XSA/VSq2j4vmnwfZcPTDu
glmQ1A==
-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
+UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
+dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
+MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
+dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
+BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
+cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
+AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
+MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
+aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
+ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
+IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
+MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
+A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
+7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
+1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
+-----END CERTIFICATE-----
diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml
index e4ac455e7c..89e5949fbe 100644
--- a/indra/newview/app_settings/cmd_line.xml
+++ b/indra/newview/app_settings/cmd_line.xml
@@ -261,6 +261,24 @@
<!-- Special case. Mapped to settings procedurally. -->
</map>
+ <key>sessionsettings</key>
+ <map>
+ <key>desc</key>
+ <string>Specify the filename of a configuration file that contains temporary per-session configuration overrides.</string>
+ <key>count</key>
+ <integer>1</integer>
+ <!-- Special case. Mapped to settings procedurally. -->
+ </map>
+
+ <key>usersessionsettings</key>
+ <map>
+ <key>desc</key>
+ <string>Specify the filename of a configuration file that contains temporary per-session configuration user overrides.</string>
+ <key>count</key>
+ <integer>1</integer>
+ <!-- Special case. Mapped to settings procedurally. -->
+ </map>
+
<key>login</key>
<map>
<key>desc</key>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index a010524091..6a89f5681d 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -617,7 +617,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://interest.secondlife.com/viewer/avatar</string>
+ <string></string>
</map>
<key>AvatarBakedTextureUploadTimeout</key>
<map>
@@ -2566,7 +2566,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://www.secondlife.com</string>
+ <string></string>
</map>
<key>DisableCameraConstraints</key>
<map>
@@ -2810,6 +2810,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>DoubleClickShowWorldMap</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable double-click to show world map from mini map</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>DragAndDropToolTipDelay</key>
<map>
<key>Comment</key>
@@ -3888,6 +3899,17 @@
<key>Value</key>
<string>https://my.secondlife.com/[AGENT_NAME]</string>
</map>
+ <key>WebProfileNonProductionURL</key>
+ <map>
+ <key>Comment</key>
+ <string>URL for Web Profiles on Non-Production grids</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>https://my-demo.secondlife.com/[AGENT_NAME]</string>
+ </map>
<key>HighResSnapshot</key>
<map>
<key>Comment</key>
@@ -11484,7 +11506,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <integer>3.0</integer>
+ <integer>3</integer>
</map>
<key>InterpolationPhaseOut</key>
<map>
@@ -11495,7 +11517,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <integer>1.0</integer>
+ <integer>1</integer>
</map>
<key>VerboseLogs</key>
<map>
@@ -12344,38 +12366,225 @@
<key>Value</key>
<real>1200.0</real>
</map>
- <key>AvatarPickerHintTimeout</key>
+ <key>SidePanelHintTimeout</key>
<map>
<key>Comment</key>
- <string>Number of seconds to wait before telling resident about avatar picker.</string>
+ <string>Number of seconds to wait before telling resident about side panel.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>600.0</real>
+ <real>300.0</real>
+ </map>
+ <key>GroupMembersSortOrder</key>
+ <map>
+ <key>Comment</key>
+ <string>The order by which group members will be sorted (name|donated|online)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>name</string>
</map>
- <key>SidePanelHintTimeout</key>
+ <key>SessionSettingsFile</key>
<map>
<key>Comment</key>
- <string>Number of seconds to wait before telling resident about side panel.</string>
+ <string>Settings that are a applied per session (not saved).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>F32</string>
+ <string>String</string>
<key>Value</key>
- <real>300.0</real>
+ <string></string>
</map>
- <key>GroupMembersSortOrder</key>
+ <key>UserSessionSettingsFile</key>
<map>
<key>Comment</key>
- <string>The order by which group members will be sorted (name|donated|online)</string>
+ <string>User settings that are a applied per session (not saved).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>name</string>
+ <string />
+ </map>
+ <key>OpenSidePanelsInFloaters</key>
+ <map>
+ <key>Comment</key>
+ <string>If true, will always open side panel contents in a floater.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>AvatarInspectorTooltipDelay</key>
+ <map>
+ <key>Comment</key>
+ <string>Seconds before displaying avatar inspector tooltip</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.35</real>
+ </map>
+ <key>ObjectInspectorTooltipDelay</key>
+ <map>
+ <key>Comment</key>
+ <string>Seconds before displaying object inspector tooltip</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.35</real>
+ </map>
+ <key>SLURLTeleportDirectly</key>
+ <map>
+ <key>Comment</key>
+ <string>Clicking on a slurl will teleport you directly instead of opening places panel</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>EnableClassifieds</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable creation of new classified ads from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableGroupInfo</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable viewing and editing of group info from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnablePicks</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable editing of picks from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableWorldMap</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable opening world map from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableAvatarPay</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable paying other avatars from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableVoiceCall</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable voice calls from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableAvatarShare</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable sharing from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>SearchFromAddressBar</key>
+ <map>
+ <key>Comment</key>
+ <string>Can enter search queries into navigation address bar</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>LogInventoryDecline</key>
+ <map>
+ <key>Comment</key>
+ <string>Log in system chat whenever an inventory offer is declined</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>UseHTTPInventory</key>
+ <map>
+ <key>Comment</key>
+ <string>Allow use of http inventory transfers instead of UDP</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ClickToWalk</key>
+ <map>
+ <key>Comment</key>
+ <string>Click in world to walk to location</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowOfferedInventory</key>
+ <map>
+ <key>Comment</key>
+ <string>Show inventory window with last inventory offer selected when receiving inventory from other users.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
</map>
</map>
</llsd>
diff --git a/indra/newview/app_settings/settings_files.xml b/indra/newview/app_settings/settings_files.xml
index aa5b301959..079a54f957 100644
--- a/indra/newview/app_settings/settings_files.xml
+++ b/indra/newview/app_settings/settings_files.xml
@@ -1,148 +1,64 @@
-<llsd>
- <map>
- <key>Locations</key>
- <map>
- <!--
- The Locations LLSD block specifies the usage pattern of
- the settings file types
- Each location is represented by a LLSD containing the following values:
- PathIndex = hard coded path indicies.
- Files = map of files to load
- Each file can have:
- Requirement = level of necessity for loading.
- 0 ( or Req. no key) = do not load
- 1 = required, fail if not found
- NameFromSetting = Use the given setting to specify the name. Not valid for
- "Default"
- -->
- <key>Comment</key>
- <string>List location from which to load files, and the rules about loading those files.</string>
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>LLSD</string>
- <key>Value</key>
- <map>
- <key>Default</key>
- <map>
- <key>PathIndex</key>
- <integer>2</integer>
- <key>Files</key>
- <map>
- <key>Global</key>
- <map>
- <key>Name</key>
- <string>settings.xml</string>
- <key>Requirement</key>
- <integer>1</integer>
- </map>
- <key>PerAccount</key>
- <map>
- <key>Name</key>
- <string>settings_per_account.xml</string>
- <key>Requirement</key>
- <integer>1</integer>
- </map>
- <key>CrashSettings</key>
- <map>
- <key>Name</key>
- <string>settings_crash_behavior.xml</string>
- <key>Requirement</key>
- <integer>1</integer>
- </map>
- <key>Warnings</key>
- <map>
- <key>Name</key>
- <string>ignorable_dialogs.xml</string>
- <key>Requirement</key>
- <integer>1</integer>
- </map>
- </map>
- </map>
- <key>User</key>
- <map>
- <key>PathIndex</key>
- <integer>1</integer>
- <key>Files</key>
- <map>
- <key>Global</key>
- <map>
- <key>Name</key>
- <string>settings.xml</string>
- <key>NameFromSetting</key>
- <string>ClientSettingsFile</string>
- </map>
- <key>CrashSettings</key>
- <map>
- <key>Name</key>
- <string>settings_crash_behavior.xml</string>
- </map>
- <key>Warnings</key>
- <map>
- <key>Name</key>
- <string>ignorable_dialogs.xml</string>
- <key>NameFromSetting</key>
- <string>WarningSettingsFile</string>
- </map>
- </map>
- </map>
- <key>Account</key>
- <map>
- <key>PathIndex</key>
- <integer>3</integer>
- <key>Files</key>
- <map>
- <key>PerAccount</key>
- <map>
- <key>Name</key>
- <string>settings_per_account.xml</string>
- <key>NameFromSetting</key>
- <string>PerAccountSettingsFile</string>
- </map>
- </map>
- </map>
- <key>DefaultSkin</key>
- <map>
- <key>PathIndex</key>
- <integer>17</integer>
- <key>Files</key>
- <map>
- <key>Skinning</key>
- <map>
- <key>Name</key>
- <string>colors.xml</string>
- </map>
- </map>
- </map>
- <key>CurrentSkin</key>
- <map>
- <key>PathIndex</key>
- <integer>10</integer>
- <key>Files</key>
- <map>
- <key>Skinning</key>
- <map>
- <key>Name</key>
- <string>colors.xml</string>
- </map>
- </map>
- </map>
- <key>UserSkin</key>
- <map>
- <key>PathIndex</key>
- <integer>14</integer>
- <key>Files</key>
- <map>
- <key>Skinning</key>
- <map>
- <key>Name</key>
- <string>colors.xml</string>
- <key>NameFromSetting</key>
- <string>SkinningSettingsFile</string>
- </map>
- </map>
- </map>
- </map>
- </map>
- </map>
-</llsd>
+<settings_files>
+ <group name="Default"
+ path_index="2">
+ <file name="Global"
+ file_name="settings.xml"
+ required="true"/>
+ <file name="PerAccount"
+ file_name="settings_per_account.xml"
+ required="true"/>
+ <file name="CrashSettings"
+ file_name="settings_crash_behavior.xml"
+ required="true"/>
+ <file name="Warnings"
+ file_name="ignorable_dialogs.xml"
+ required="true"/>
+ </group>
+ <group name="User"
+ path_index="1">
+ <file name="Global"
+ file_name="settings.xml"
+ file_name_setting="ClientSettingsFile"/>
+ <file name="CrashSettings"
+ file_name="settings_crash_behavior"/>
+ <file name="Warnings"
+ file_name="ignorable_dialogs.xml"
+ file_name_setting="WarningSettingsFile"/>
+ </group>
+ <group name="Account"
+ path_index="3">
+ <file name="PerAccount"
+ file_name="settings_per_account.xml"
+ file_name_setting="PerAccountSettingsFile"/>
+ </group>
+ <group name="Session"
+ path_index="2">
+ <file name="Global"
+ file_name="session.xml"
+ file_name_setting="SessionSettingsFile"
+ persistent="false"/>
+ </group>
+ <group name="UserSession"
+ path_index="1">
+ <file name="Global"
+ file_name="session.xml"
+ file_name_setting="UserSessionSettingsFile"
+ persistent="false"/>
+ </group>
+ <group name="DefaultSkin"
+ path_index="17">
+ <file name="Skinning"
+ file_name="colors.xml"/>
+ </group>
+ <group name="CurrentSkin"
+ path_index="10">
+ <file name="Skinning"
+ file_name="colors.xml"/>
+ </group>
+ <group name="UserSkin"
+ path_index="14">
+ <file name="Skinning"
+ file_name="colors.xml"
+ file_name_setting="SkinningSettingsFile"/>
+ </group>
+</settings_files> \ No newline at end of file
diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml
new file mode 100644
index 0000000000..03656f2a53
--- /dev/null
+++ b/indra/newview/app_settings/settings_minimal.xml
@@ -0,0 +1,406 @@
+<llsd>
+ <map>
+ <key>ChannelBottomPanelMargin</key>
+ <map>
+ <key>Comment</key>
+ <string>Space from a lower toast to the Bottom Tray</string>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>2</integer>
+ </map>
+ <key>ClickActionBuyEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable click to buy actions in tool pie menu</string>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ClickActionPayEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable click to pay actions in tool pie menu</string>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>EnableGrab</key>
+ <map>
+ <key>Comment</key>
+ <string>Use Ctrl+mouse to grab and manipulate objects</string>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>EnableMouselook</key>
+ <map>
+ <key>Comment</key>
+ <string>Allow first person perspective and mouse control of camera</string>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>EnableVoiceChat</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable talking to other residents with a microphone</string>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>HelpURLFormat</key>
+ <map>
+ <key>Comment</key>
+ <string>URL pattern for help page; arguments will be encoded; see llviewerhelp.cpp:buildHelpURL for arguments</string>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/damballah/howto/index.html?topic=[TOPIC]</string>
+ </map>
+ <key>PreferredMaturity</key>
+ <map>
+ <key>Comment</key>
+ <string>Setting for the user&apos;s preferred maturity level (consts in indra_constants.h)</string>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>21</integer>
+ </map>
+ <key>RenderTrackerBeacon</key>
+ <map>
+ <key>Comment</key>
+ <string>Display tracking arrow and beacon to target avatar, teleport destination</string>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowScriptErrors</key>
+ <map>
+ <key>Comment</key>
+ <string>Show script errors</string>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowScriptErrorsLocation</key>
+ <map>
+ <key>Comment</key>
+ <string>Show script error in chat or window</string>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>SkinCurrent</key>
+ <map>
+ <key>Comment</key>
+ <string>The currently selected skin.</string>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>minimal</string>
+ </map>
+ <key>UseExternalBrowser</key>
+ <map>
+ <key>Comment</key>
+ <string>Use default browser when opening web pages instead of in-world browser.</string>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>VoiceCallsRejectAll</key>
+ <map>
+ <key>Comment</key>
+ <string>Silently reject all incoming voice calls.</string>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>VoiceDisableMic</key>
+ <map>
+ <key>Comment</key>
+ <string>Completely disable the ability to open the mic.</string>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ScriptsCanShowUI</key>
+ <map>
+ <key>Comment</key>
+ <string>Allow LSL calls (such as LLMapDestination) to spawn viewer UI</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ChatFontSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Size of chat text in chat console (0 = small, 1 = big, 2 = extra large)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>AvatarPickerHintTimeout</key>
+ <map>
+ <key>Comment</key>
+ <string>Number of seconds to wait before telling resident about avatar picker.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.0</real>
+ </map>
+ <key>RenderShowGroupTitleAll</key>
+ <map>
+ <key>Comment</key>
+ <string>Show group titles in name labels</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>OpenSidePanelsInFloaters</key>
+ <map>
+ <key>Comment</key>
+ <string>If true, will always open side panel contents in a floater.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>AvatarInspectorTooltipDelay</key>
+ <map>
+ <key>Comment</key>
+ <string>Seconds before displaying avatar inspector tooltip</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.1</real>
+ </map>
+ <key>AFKTimeout</key>
+ <map>
+ <key>Comment</key>
+ <string>
+ Time before automatically setting AFK (away from keyboard) mode (seconds, 0=never).
+ Valid values are: 0, 120, 300, 600, 1800
+ </string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <real>0</real>
+ </map>
+ <key>SLURLTeleportDirectly</key>
+ <map>
+ <key>Comment</key>
+ <string>Clicking on a slurl will teleport you directly instead of opening places panel</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableClassifieds</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable creation of new classified ads</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>EnableGroupInfo</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable viewing and editing of group info.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>EnablePicks</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable editing of picks</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>EnableWorldMap</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable opening world map from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>EnableAvatarPay</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable paying other avatars from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>EnableVoiceCall</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable voice calls from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>EnableAvatarShare</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable sharing from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>DoubleClickShowWorldMap</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable double-click to show world map from mini map</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>EnableGroupChatPopups</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable Incoming Group Chat Popups</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>SearchFromAddressBar</key>
+ <map>
+ <key>Comment</key>
+ <string>Can enter search queries into navigation address bar</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>DestinationGuideURL</key>
+ <map>
+ <key>Comment</key>
+ <string>Destination guide contents</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/damballah/guide.html</string>
+ </map>
+ <key>AvatarPickerURL</key>
+ <map>
+ <key>Comment</key>
+ <string>Avatar picker contents</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/damballah/avatars.html</string>
+ </map>
+ <key>LogInventoryDecline</key>
+ <map>
+ <key>Comment</key>
+ <string>Log in system chat whenever an inventory offer is declined</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>UseHTTPInventory</key>
+ <map>
+ <key>Comment</key>
+ <string>Allow use of http inventory transfers instead of UDP</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ClickToWalk</key>
+ <map>
+ <key>Comment</key>
+ <string>Click in world to walk to location</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ShowOfferedInventory</key>
+ <map>
+ <key>Comment</key>
+ <string>Show inventory window with last inventory offer selected when receiving inventory from other users.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ </map>
+</llsd>
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index f40fed5ad3..1cf552e42c 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -2979,6 +2979,9 @@ public:
gAgent.setGenderChosen(TRUE);
}
+ // release avatar picker keyboard focus
+ gFocusMgr.setKeyboardFocus( NULL );
+
return true;
}
};
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index a23f809b71..d0f9cae078 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -1,4 +1,4 @@
-/**
+ /**
* @file llappviewer.cpp
* @brief The LLAppViewer class definitions
*
@@ -337,6 +337,46 @@ void init_default_trans_args()
const char *VFS_DATA_FILE_BASE = "data.db2.x.";
const char *VFS_INDEX_FILE_BASE = "index.db2.x.";
+
+struct SettingsFile : public LLInitParam::Block<SettingsFile>
+{
+ Mandatory<std::string> name;
+ Optional<std::string> file_name;
+ Optional<bool> required,
+ persistent;
+ Optional<std::string> file_name_setting;
+
+ SettingsFile()
+ : name("name"),
+ file_name("file_name"),
+ required("required", false),
+ persistent("persistent", true),
+ file_name_setting("file_name_setting")
+ {}
+};
+
+struct SettingsGroup : public LLInitParam::Block<SettingsGroup>
+{
+ Mandatory<std::string> name;
+ Mandatory<S32> path_index;
+ Multiple<SettingsFile> files;
+
+ SettingsGroup()
+ : name("name"),
+ path_index("path_index"),
+ files("file")
+ {}
+};
+
+struct SettingsFiles : public LLInitParam::Block<SettingsFiles>
+{
+ Multiple<SettingsGroup> groups;
+
+ SettingsFiles()
+ : groups("group")
+ {}
+};
+
static std::string gWindowTitle;
LLAppViewer::LLUpdaterInfo *LLAppViewer::sUpdaterInfo = NULL ;
@@ -594,7 +634,8 @@ LLAppViewer::LLAppViewer() :
mRandomizeFramerate(LLCachedControl<bool>(gSavedSettings,"Randomize Framerate", FALSE)),
mPeriodicSlowFrame(LLCachedControl<bool>(gSavedSettings,"Periodic Slow Frame", FALSE)),
mFastTimerLogThread(NULL),
- mUpdater(new LLUpdaterService())
+ mUpdater(new LLUpdaterService()),
+ mSettingsLocationList(NULL)
{
if(NULL != sInstance)
{
@@ -610,6 +651,8 @@ LLAppViewer::LLAppViewer() :
LLAppViewer::~LLAppViewer()
{
+ delete mSettingsLocationList;
+
LLLoginInstance::instance().setUpdaterService(0);
destroyMainloopTimeout();
@@ -1677,8 +1720,8 @@ bool LLAppViewer::cleanup()
// Delete workers first
// shotdown all worker threads before deleting them in case of co-dependencies
- sTextureCache->shutdown();
sTextureFetch->shutdown();
+ sTextureCache->shutdown();
sImageDecodeThread->shutdown();
sTextureFetch->shutDownTextureCacheThread() ;
@@ -1879,85 +1922,80 @@ bool LLAppViewer::initLogging()
bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
bool set_defaults)
{
- // Find and vet the location key.
- if(!mSettingsLocationList.has(location_key))
- {
- llerrs << "Requested unknown location: " << location_key << llendl;
- return false;
- }
-
- LLSD location = mSettingsLocationList.get(location_key);
-
- if(!location.has("PathIndex"))
- {
- llerrs << "Settings location is missing PathIndex value. Settings cannot be loaded." << llendl;
- return false;
- }
- ELLPath path_index = (ELLPath)(location.get("PathIndex").asInteger());
- if(path_index <= LL_PATH_NONE || path_index >= LL_PATH_LAST)
+ if (!mSettingsLocationList)
{
- llerrs << "Out of range path index in app_settings/settings_files.xml" << llendl;
- return false;
+ llerrs << "Invalid settings location list" << llendl;
}
- // Iterate through the locations list of files.
- LLSD files = location.get("Files");
- for(LLSD::map_iterator itr = files.beginMap(); itr != files.endMap(); ++itr)
+ LLControlGroup* global_settings = LLControlGroup::getInstance(sGlobalSettingsName);
+ for(LLInitParam::ParamIterator<SettingsGroup>::const_iterator it = mSettingsLocationList->groups.begin(), end_it = mSettingsLocationList->groups.end();
+ it != end_it;
+ ++it)
{
- std::string settings_group = (*itr).first;
- llinfos << "Attempting to load settings for the group " << settings_group
- << " - from location " << location_key << llendl;
+ // skip settings groups that aren't the one we requested
+ if (it->name() != location_key) continue;
- if(!LLControlGroup::getInstance(settings_group))
+ ELLPath path_index = (ELLPath)it->path_index();
+ if(path_index <= LL_PATH_NONE || path_index >= LL_PATH_LAST)
{
- llwarns << "No matching settings group for name " << settings_group << llendl;
- continue;
+ llerrs << "Out of range path index in app_settings/settings_files.xml" << llendl;
+ return false;
}
- LLSD file = (*itr).second;
-
- std::string full_settings_path;
- if(file.has("NameFromSetting"))
+ LLInitParam::ParamIterator<SettingsFile>::const_iterator file_it, end_file_it;
+ for (file_it = it->files.begin(), end_file_it = it->files.end();
+ file_it != end_file_it;
+ ++file_it)
{
- std::string custom_name_setting = file.get("NameFromSetting");
- // *NOTE: Regardless of the group currently being lodaed,
- // this setting is always read from the Global settings.
- if(LLControlGroup::getInstance(sGlobalSettingsName)->controlExists(custom_name_setting))
+ llinfos << "Attempting to load settings for the group " << file_it->name()
+ << " - from location " << location_key << llendl;
+
+ LLControlGroup* settings_group = LLControlGroup::getInstance(file_it->name);
+ if(!settings_group)
{
- std::string file_name =
- LLControlGroup::getInstance(sGlobalSettingsName)->getString(custom_name_setting);
- full_settings_path = file_name;
+ llwarns << "No matching settings group for name " << file_it->name() << llendl;
+ continue;
}
- }
- if(full_settings_path.empty())
- {
- std::string file_name = file.get("Name");
- full_settings_path = gDirUtilp->getExpandedFilename(path_index, file_name);
- }
+ std::string full_settings_path;
- int requirement = 0;
- if(file.has("Requirement"))
- {
- requirement = file.get("Requirement").asInteger();
- }
-
- if(!LLControlGroup::getInstance(settings_group)->loadFromFile(full_settings_path, set_defaults))
- {
- if(requirement == 1)
+ if (file_it->file_name_setting.isProvided()
+ && global_settings->controlExists(file_it->file_name_setting))
{
- llwarns << "Error: Cannot load required settings file from: "
- << full_settings_path << llendl;
- return false;
+ // try to find filename stored in file_name_setting control
+ full_settings_path = global_settings->getString(file_it->file_name_setting);
+ if (!gDirUtilp->fileExists(full_settings_path))
+ {
+ // search in default path
+ full_settings_path = gDirUtilp->getExpandedFilename((ELLPath)path_index, full_settings_path);
+ }
}
else
{
- llinfos << "Cannot load " << full_settings_path << " - No settings found." << llendl;
+ // by default, use specified file name
+ full_settings_path = gDirUtilp->getExpandedFilename((ELLPath)path_index, file_it->file_name());
+ }
+
+ if(settings_group->loadFromFile(full_settings_path, set_defaults, file_it->persistent))
+ { // success!
+ llinfos << "Loaded settings file " << full_settings_path << llendl;
+ }
+ else
+ { // failed to load
+ if(file_it->required)
+ {
+ llerrs << "Error: Cannot load required settings file from: " << full_settings_path << llendl;
+ return false;
+ }
+ else
+ {
+ // only complain if we actually have a filename at this point
+ if (!full_settings_path.empty())
+ {
+ llinfos << "Cannot load " << full_settings_path << " - No settings found." << llendl;
+ }
+ }
}
- }
- else
- {
- llinfos << "Loaded settings file " << full_settings_path << llendl;
}
}
@@ -1967,18 +2005,25 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
std::string LLAppViewer::getSettingsFilename(const std::string& location_key,
const std::string& file)
{
- if(mSettingsLocationList.has(location_key))
+ for(LLInitParam::ParamIterator<SettingsGroup>::const_iterator it = mSettingsLocationList->groups.begin(), end_it = mSettingsLocationList->groups.end();
+ it != end_it;
+ ++it)
{
- LLSD location = mSettingsLocationList.get(location_key);
- if(location.has("Files"))
+ if (it->name() == location_key)
{
- LLSD files = location.get("Files");
- if(files.has(file) && files[file].has("Name"))
+ LLInitParam::ParamIterator<SettingsFile>::const_iterator file_it, end_file_it;
+ for (file_it = it->files.begin(), end_file_it = it->files.end();
+ file_it != end_file_it;
+ ++file_it)
{
- return files.get(file).get("Name").asString();
+ if (file_it->name() == file)
+ {
+ return file_it->file_name;
+ }
}
}
}
+
return std::string();
}
@@ -1991,14 +2036,29 @@ bool LLAppViewer::initConfiguration()
{
//Load settings files list
std::string settings_file_list = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "settings_files.xml");
- LLControlGroup settings_control("SettingsFiles");
- llinfos << "Loading settings file list " << settings_file_list << llendl;
- if (0 == settings_control.loadFromFile(settings_file_list))
+ //LLControlGroup settings_control("SettingsFiles");
+ //llinfos << "Loading settings file list " << settings_file_list << llendl;
+ //if (0 == settings_control.loadFromFile(settings_file_list))
+ //{
+ // llerrs << "Cannot load default configuration file " << settings_file_list << llendl;
+ //}
+
+ LLXMLNodePtr root;
+ BOOL success = LLXMLNode::parseFile(settings_file_list, root, NULL);
+ if (!success)
{
llerrs << "Cannot load default configuration file " << settings_file_list << llendl;
}
- mSettingsLocationList = settings_control.getLLSD("Locations");
+ mSettingsLocationList = new SettingsFiles();
+
+ LLXUIParser parser;
+ parser.readXUI(root, *mSettingsLocationList, settings_file_list);
+
+ if (!mSettingsLocationList->validateBlock())
+ {
+ llerrs << "Invalid settings file list " << settings_file_list << llendl;
+ }
// The settings and command line parsing have a fragile
// order-of-operation:
@@ -2107,6 +2167,31 @@ bool LLAppViewer::initConfiguration()
// - load overrides from user_settings
loadSettingsFromDirectory("User");
+
+ if (gSavedSettings.getBOOL("FirstRunThisInstall"))
+ {
+ gSavedSettings.setString("SessionSettingsFile", "settings_minimal.xml");
+ }
+
+ if (clp.hasOption("sessionsettings"))
+ {
+ std::string session_settings_filename = clp.getOption("sessionsettings")[0];
+ gSavedSettings.setString("SessionSettingsFile", session_settings_filename);
+ llinfos << "Using session settings filename: "
+ << session_settings_filename << llendl;
+ }
+ loadSettingsFromDirectory("Session");
+
+ if (clp.hasOption("usersessionsettings"))
+ {
+ std::string user_session_settings_filename = clp.getOption("usersessionsettings")[0];
+ gSavedSettings.setString("UserSessionSettingsFile", user_session_settings_filename);
+ llinfos << "Using user session settings filename: "
+ << user_session_settings_filename << llendl;
+
+ }
+ loadSettingsFromDirectory("UserSession");
+
// - apply command line settings
clp.notify();
@@ -3226,6 +3311,20 @@ static bool finish_quit(const LLSD& notification, const LLSD& response)
}
static LLNotificationFunctorRegistration finish_quit_reg("ConfirmQuit", finish_quit);
+static bool switch_standard_skin_and_quit(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ if (option == 0)
+ {
+ gSavedSettings.setString("SessionSettingsFile", "");
+ LLAppViewer::instance()->requestQuit();
+ }
+ return false;
+}
+
+static LLNotificationFunctorRegistration standard_skin_quit_reg("SwitchToStandardSkinAndQuit", switch_standard_skin_and_quit);
+
void LLAppViewer::userQuit()
{
if (gDisconnected || gViewerWindow->getProgressView()->getVisible())
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index a18e6cbb02..0226211735 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -253,7 +253,7 @@ private:
bool mQuitRequested; // User wants to quit, may have modified documents open.
bool mLogoutRequestSent; // Disconnect message sent to simulator, no longer safe to send messages to the sim.
S32 mYieldTime;
- LLSD mSettingsLocationList;
+ struct SettingsFiles* mSettingsLocationList;
LLWatchdogTimeout* mMainloopTimeout;
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index f3f0cde221..afa8b62c74 100755
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -47,6 +47,7 @@
#include "llfloatergroups.h"
#include "llfloaterreg.h"
#include "llfloaterpay.h"
+#include "llfloaterwebcontent.h"
#include "llfloaterworldmap.h"
#include "llgiveinventory.h"
#include "llinventorybridge.h"
@@ -315,7 +316,7 @@ void LLAvatarActions::showProfile(const LLUUID& id)
std::string agent_name = LLCacheName::buildUsername(full_name);
llinfos << "opening web profile for " << agent_name << llendl;
std::string url = getProfileURL(agent_name);
- LLWeb::loadWebURLInternal(url);
+ LLWeb::loadWebURLInternal(url, "", id.asString());
}
else
{
@@ -336,6 +337,24 @@ void LLAvatarActions::showProfile(const LLUUID& id)
}
}
+//static
+bool LLAvatarActions::profileVisible(const LLUUID& id)
+{
+ LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::findInstance("web_content", id.asString()));
+ return browser && browser->isShown();
+}
+
+
+//static
+void LLAvatarActions::hideProfile(const LLUUID& id)
+{
+ LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::findInstance("web_content", id.asString()));
+ if (browser)
+ {
+ browser->closeFloater();
+ }
+}
+
// static
void LLAvatarActions::showOnMap(const LLUUID& id)
{
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index 2db2918eed..956fed7461 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -93,6 +93,8 @@ public:
* Show avatar profile.
*/
static void showProfile(const LLUUID& id);
+ static void hideProfile(const LLUUID& id);
+ static bool profileVisible(const LLUUID& id);
/**
* Show avatar on world map.
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 35e4548483..1fb83fe567 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -38,12 +38,15 @@
#include "lltexteditor.h"
// newview includes
+#include "llagent.h"
#include "llagentcamera.h"
+#include "llavataractions.h"
#include "llchiclet.h"
#include "llfloatercamera.h"
#include "llhints.h"
#include "llimfloater.h" // for LLIMFloater
#include "llnearbychatbar.h"
+#include "llsidetray.h"
#include "llspeakbutton.h"
#include "llsplitbutton.h"
#include "llsyswellwindow.h"
@@ -67,10 +70,11 @@ BOOL LLBottomtrayButton::handleHover(S32 x, S32 y, MASK mask)
{
if (mCanDrag)
{
- S32 screenX, screenY;
- localPointToScreen(x, y, &screenX, &screenY);
- // pass hover to bottomtray
- LLBottomTray::getInstance()->onDraggableButtonHover(screenX, screenY);
+ // pass hover to bottomtray
+ S32 screenX, screenY;
+ localPointToScreen(x, y, &screenX, &screenY);
+ LLBottomTray::getInstance()->onDraggableButtonHover(screenX, screenY);
+
return TRUE;
}
else
@@ -200,6 +204,7 @@ LLBottomTray::LLBottomTray(const LLSD&)
mSpeakBtn(NULL),
mNearbyChatBar(NULL),
mChatBarContainer(NULL),
+ mNearbyCharResizeHandlePanel(NULL),
mToolbarStack(NULL),
mMovementButton(NULL),
mResizeState(RS_NORESIZE),
@@ -416,10 +421,6 @@ void LLBottomTray::setVisible(BOOL visible)
{
LLPanel::setVisible(visible);
}
- if(visible)
- gFloaterView->setSnapOffsetBottom(getRect().getHeight());
- else
- gFloaterView->setSnapOffsetBottom(0);
}
S32 LLBottomTray::notifyParent(const LLSD& info)
@@ -505,6 +506,23 @@ void LLBottomTray::showSnapshotButton(BOOL visible)
setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, visible);
}
+void LLBottomTray::showSpeakButton(bool visible)
+{
+ // Show/hide the button
+ setTrayButtonVisible(RS_BUTTON_SPEAK, visible);
+
+ // and adjust other panels according to the occupied/freed space.
+ const S32 panel_width = mSpeakPanel->getRect().getWidth();
+ if (visible)
+ {
+ processWidthDecreased(-panel_width);
+ }
+ else
+ {
+ processWidthIncreased(panel_width);
+ }
+}
+
void LLBottomTray::toggleMovementControls()
{
if (mMovementButton)
@@ -533,6 +551,7 @@ BOOL LLBottomTray::postBuild()
LLHints::registerHintTarget("chat_bar", mNearbyChatBar->LLView::getHandle());
mChatBarContainer = getChild<LLLayoutPanel>("chat_bar_layout_panel");
+ mNearbyCharResizeHandlePanel = getChild<LLPanel>("chat_bar_resize_handle_panel");
mToolbarStack = getChild<LLLayoutStack>("toolbar_stack");
mMovementButton = getChild<LLButton>("movement_btn");
@@ -651,12 +670,20 @@ void LLBottomTray::onDraggableButtonHover(S32 x, S32 y)
gViewerWindow->getWindow()->setCursor(UI_CURSOR_NO);
}
}
+ else
+ {
+ // Reset cursor in case you move your mouse from the drag handle to a button.
+ getWindow()->setCursor(UI_CURSOR_ARROW);
+
+ }
}
bool LLBottomTray::isCursorOverDraggableArea(S32 x, S32 y)
{
+ // Draggable area lasts from the nearby chat input resize handle
+ // to the chiclet area (exlusively).
bool result = getRect().pointInRect(x, y);
- result = result && mNearbyChatBar->calcScreenRect().mRight < x;
+ result = result && mNearbyCharResizeHandlePanel->calcScreenRect().mRight < x;
result = result && mChicletPanel->calcScreenRect().mRight > x;
return result;
}
@@ -667,10 +694,7 @@ void LLBottomTray::updateButtonsOrdersAfterDnD()
// (and according to future possible changes in the way button order is saved between sessions).
state_object_map_t::const_iterator it = mStateProcessedObjectMap.begin();
state_object_map_t::const_iterator it_end = mStateProcessedObjectMap.end();
- // Speak button is currently the only draggable button not in mStateProcessedObjectMap,
- // so if dragged_state is not found in that map, it should be RS_BUTTON_SPEAK. Change this code if any other
- // exclusions from mStateProcessedObjectMap will become draggable.
- EResizeState dragged_state = RS_BUTTON_SPEAK;
+ EResizeState dragged_state = RS_NORESIZE;
EResizeState landing_state = RS_NORESIZE;
bool landing_state_found = false;
// Find states for dragged item and landing tab
@@ -686,7 +710,17 @@ void LLBottomTray::updateButtonsOrdersAfterDnD()
landing_state_found = true;
}
}
-
+
+ if (dragged_state == RS_NORESIZE)
+ {
+ llwarns << "Cannot determine what button is being dragged" << llendl;
+ llassert(dragged_state != RS_NORESIZE);
+ return;
+ }
+
+ lldebugs << "Will place " << resizeStateToString(dragged_state)
+ << " before " << resizeStateToString(landing_state) << llendl;
+
// Update order of buttons according to drag'n'drop
mButtonsOrder.erase(std::find(mButtonsOrder.begin(), mButtonsOrder.end(), dragged_state));
if (!landing_state_found && mLandingTab == getChild<LLPanel>(PANEL_CHICLET_NAME))
@@ -695,9 +729,10 @@ void LLBottomTray::updateButtonsOrdersAfterDnD()
}
else
{
- if (!landing_state_found) landing_state = RS_BUTTON_SPEAK;
+ if (!landing_state_found) landing_state = RS_BUTTON_SPEAK; // just a random fallback
mButtonsOrder.insert(std::find(mButtonsOrder.begin(), mButtonsOrder.end(), landing_state), dragged_state);
}
+
// Synchronize button process order with their order
resize_state_vec_t::const_iterator it1 = mButtonsOrder.begin();
const resize_state_vec_t::const_iterator it_end1 = mButtonsOrder.end();
@@ -774,11 +809,12 @@ void LLBottomTray::loadButtonsOrder()
// placing panels in layout stack according to button order which we loaded in previous for
for (resize_state_vec_t::const_reverse_iterator it = mButtonsOrder.rbegin(); it != it_end; ++it, ++i)
{
- LLPanel* panel_to_move = *it == RS_BUTTON_SPEAK ? mSpeakPanel : mStateProcessedObjectMap[*it];
+ LLPanel* panel_to_move = getButtonPanel(*it);
mToolbarStack->movePanel(panel_to_move, NULL, true); // prepend
}
// Nearbychat is not stored in order settings file, but it must be the first of the panels, so moving it
- // manually here
+ // (along with its drag handle) manually here.
+ mToolbarStack->movePanel(getChild<LLLayoutPanel>("chat_bar_resize_handle_panel"), NULL, true);
mToolbarStack->movePanel(mChatBarContainer, NULL, true);
}
@@ -812,6 +848,24 @@ void LLBottomTray::draw()
LLRect rect = mLandingTab->calcScreenRect();
mImageDragIndication->draw(rect.mLeft - w/2, rect.getHeight(), w, h);
}
+ getChild<LLButton>("show_profile_btn")->setToggleState(LLAvatarActions::profileVisible(gAgent.getID()));
+
+ LLPanel* panel = LLSideTray::getInstance()->getPanel("panel_people");
+ if (panel && panel->isInVisibleChain())
+ {
+ getChild<LLButton>("show_people_button")->setToggleState(true);
+ }
+ else
+ {
+ getChild<LLButton>("show_people_button")->setToggleState(false);
+ }
+
+ LLFloater* help_browser = (LLFloaterReg::findInstance("help_browser"));
+ bool help_floater_visible = (help_browser && help_browser->isInVisibleChain());
+
+ getChild<LLButton>("show_help_btn")->setToggleState(help_floater_visible);
+
+
}
bool LLBottomTray::onContextMenuItemEnabled(const LLSD& userdata)
@@ -1178,9 +1232,8 @@ void LLBottomTray::processShowButtons(S32& available_width)
bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32& available_width)
{
lldebugs << "Trying to show object type: " << shown_object_type << llendl;
- llassert(mStateProcessedObjectMap[shown_object_type] != NULL);
- LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
+ LLPanel* panel = getButtonPanel(shown_object_type);
if (NULL == panel)
{
lldebugs << "There is no object to process for state: " << shown_object_type << llendl;
@@ -1226,9 +1279,7 @@ void LLBottomTray::processHideButtons(S32& required_width, S32& buttons_freed_wi
void LLBottomTray::processHideButton(EResizeState processed_object_type, S32& required_width, S32& buttons_freed_width)
{
lldebugs << "Trying to hide object type: " << processed_object_type << llendl;
- llassert(mStateProcessedObjectMap[processed_object_type] != NULL);
-
- LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
+ LLPanel* panel = getButtonPanel(processed_object_type);
if (NULL == panel)
{
lldebugs << "There is no object to process for state: " << processed_object_type << llendl;
@@ -1273,7 +1324,6 @@ void LLBottomTray::processShrinkButtons(S32& required_width, S32& buttons_freed_
// then shrink Speak button
if (required_width < 0)
{
-
S32 panel_min_width = 0;
std::string panel_name = mSpeakPanel->getName();
bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width);
@@ -1309,8 +1359,7 @@ void LLBottomTray::processShrinkButtons(S32& required_width, S32& buttons_freed_
void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32& required_width)
{
- llassert(mStateProcessedObjectMap[processed_object_type] != NULL);
- LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
+ LLPanel* panel = getButtonPanel(processed_object_type);
if (NULL == panel)
{
lldebugs << "There is no object to process for type: " << processed_object_type << llendl;
@@ -1411,8 +1460,7 @@ void LLBottomTray::processExtendButtons(S32& available_width)
void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32& available_width)
{
- llassert(mStateProcessedObjectMap[processed_object_type] != NULL);
- LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
+ LLPanel* panel = getButtonPanel(processed_object_type);
if (NULL == panel)
{
lldebugs << "There is no object to process for type: " << processed_object_type << llendl;
@@ -1480,6 +1528,7 @@ bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const
void LLBottomTray::initResizeStateContainers()
{
// init map with objects should be processed for each type
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPEAK, getChild<LLPanel>("speak_panel")));
mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, getChild<LLPanel>("gesture_panel")));
mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, getChild<LLPanel>("movement_panel")));
mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, getChild<LLPanel>("cam_panel")));
@@ -1512,22 +1561,22 @@ void LLBottomTray::initResizeStateContainers()
{
const EResizeState button_type = *it;
// is there an appropriate object?
- llassert(mStateProcessedObjectMap.count(button_type) > 0);
- if (0 == mStateProcessedObjectMap.count(button_type)) continue;
+ LLPanel* button_panel = getButtonPanel(button_type);
+ if (!button_panel) continue;
// set default width for it.
- mObjectDefaultWidthMap[button_type] = mStateProcessedObjectMap[button_type]->getRect().getWidth();
+ mObjectDefaultWidthMap[button_type] = button_panel->getRect().getWidth();
}
// ... and add Speak button because it also can be shrunk.
mObjectDefaultWidthMap[RS_BUTTON_SPEAK] = mSpeakPanel->getRect().getWidth();
-
}
// this method must be called before restoring of the chat entry field on startup
// because it resets chatbar's width according to resize logic.
void LLBottomTray::initButtonsVisibility()
{
+ setVisibleAndFitWidths(RS_BUTTON_SPEAK, gSavedSettings.getBOOL("EnableVoiceChat"));
setVisibleAndFitWidths(RS_BUTTON_GESTURES, gSavedSettings.getBOOL("ShowGestureButton"));
setVisibleAndFitWidths(RS_BUTTON_MOVEMENT, gSavedSettings.getBOOL("ShowMoveButton"));
setVisibleAndFitWidths(RS_BUTTON_CAMERA, gSavedSettings.getBOOL("ShowCameraButton"));
@@ -1540,6 +1589,7 @@ void LLBottomTray::initButtonsVisibility()
void LLBottomTray::setButtonsControlsAndListeners()
{
+ gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SPEAK, _2));
gSavedSettings.getControl("ShowGestureButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_GESTURES, _2));
gSavedSettings.getControl("ShowMoveButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MOVEMENT, _2));
gSavedSettings.getControl("ShowCameraButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_CAMERA, _2));
@@ -1568,8 +1618,7 @@ bool LLBottomTray::toggleShowButton(LLBottomTray::EResizeState button_type, cons
void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible)
{
- llassert(mStateProcessedObjectMap[shown_object_type] != NULL);
- LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
+ LLPanel* panel = getButtonPanel(shown_object_type);
if (NULL == panel)
{
lldebugs << "There is no object to show for state: " << shown_object_type << llendl;
@@ -1592,7 +1641,15 @@ void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type
bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible)
{
- LLPanel* cur_panel = mStateProcessedObjectMap[object_type];
+ // The Speak button is treated specially: if voice is enabled,
+ // the button should be displayed no matter how much space we've got.
+ if (object_type == RS_BUTTON_SPEAK)
+ {
+ showSpeakButton(visible);
+ return true;
+ }
+
+ LLPanel* cur_panel = getButtonPanel(object_type);
if (NULL == cur_panel)
{
lldebugs << "There is no object to process for state: " << object_type << llendl;
@@ -1637,7 +1694,7 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible
for (; it != it_end; ++it)
{
- LLPanel * cur_panel = mStateProcessedObjectMap[*it];
+ LLPanel* cur_panel = getButtonPanel(*it);
sum_of_min_widths += get_panel_min_width(mToolbarStack, cur_panel);
sum_of_curr_widths += get_curr_width(cur_panel);
}
@@ -1695,6 +1752,19 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible
return is_set;
}
+LLPanel* LLBottomTray::getButtonPanel(EResizeState button_type)
+{
+ // Don't use the operator[] because it inserts a NULL value if the key is not found.
+ if (mStateProcessedObjectMap.count(button_type) == 0)
+ {
+ llwarns << "Cannot find a panel for " << resizeStateToString(button_type) << llendl;
+ llassert(mStateProcessedObjectMap.count(button_type) == 1);
+ return NULL;
+ }
+
+ return mStateProcessedObjectMap[button_type];
+}
+
void LLBottomTray::showWellButton(EResizeState object_type, bool visible)
{
llassert( ((RS_NOTIFICATION_WELL | RS_IM_WELL) & object_type) == object_type );
@@ -1752,4 +1822,29 @@ void LLBottomTray::processChatbarCustomization(S32 new_width)
}
}
+// static
+std::string LLBottomTray::resizeStateToString(EResizeState state)
+{
+ switch (state)
+ {
+ case RS_NORESIZE: return "RS_NORESIZE";
+ case RS_CHICLET_PANEL: return "RS_CHICLET_PANEL";
+ case RS_CHATBAR_INPUT: return "RS_CHATBAR_INPUT";
+ case RS_BUTTON_SNAPSHOT: return "RS_BUTTON_SNAPSHOT";
+ case RS_BUTTON_CAMERA: return "RS_BUTTON_CAMERA";
+ case RS_BUTTON_MOVEMENT: return "RS_BUTTON_MOVEMENT";
+ case RS_BUTTON_GESTURES: return "RS_BUTTON_GESTURES";
+ case RS_BUTTON_SPEAK: return "RS_BUTTON_SPEAK";
+ case RS_IM_WELL: return "RS_IM_WELL";
+ case RS_NOTIFICATION_WELL: return "RS_NOTIFICATION_WELL";
+ case RS_BUTTON_BUILD: return "RS_BUTTON_BUILD";
+ case RS_BUTTON_SEARCH: return "RS_BUTTON_SEARCH";
+ case RS_BUTTON_WORLD_MAP: return "RS_BUTTON_WORLD_MAP";
+ case RS_BUTTON_MINI_MAP: return "RS_BUTTON_MINI_MAP";
+ case RS_BUTTONS_CAN_BE_HIDDEN: return "RS_BUTTONS_CAN_BE_HIDDEN";
+ // No default to track additions.
+ }
+ return "UNKNOWN_BUTTON";
+}
+
//EOF
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index dc98170049..04e5f5e9e0 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -116,6 +116,7 @@ public:
void showMoveButton(BOOL visible);
void showCameraButton(BOOL visible);
void showSnapshotButton(BOOL visible);
+ void showSpeakButton(bool visible);
void toggleMovementControls();
void toggleCameraControls();
@@ -391,6 +392,13 @@ private:
bool setVisibleAndFitWidths(EResizeState object_type, bool visible);
/**
+ * Get panel containing the given button.
+ *
+ * @see mStateProcessedObjectMap
+ */
+ LLPanel* getButtonPanel(EResizeState button_type);
+
+ /**
* Shows/hides panel with specified well button (IM or Notification)
*
* @param[in] object_type - type of well button to be processed.
@@ -409,12 +417,21 @@ private:
*/
void processChatbarCustomization(S32 new_width);
+ /// Get button name for debugging.
+ static std::string resizeStateToString(EResizeState state);
+ /// Buttons automatically hidden due to lack of space.
MASK mResizeState;
+ /**
+ * Mapping of button types to the layout panels the buttons are wrapped in.
+ *
+ * Used by getButtonPanel().
+ */
typedef std::map<EResizeState, LLPanel*> state_object_map_t;
state_object_map_t mStateProcessedObjectMap;
+ /// Default (maximum) widths of the layout panels.
typedef std::map<EResizeState, S32> state_object_width_map_t;
state_object_width_map_t mObjectDefaultWidthMap;
@@ -424,6 +441,7 @@ private:
* Contains order in which child buttons should be processed in show/hide, extend/shrink methods.
*/
resize_state_vec_t mButtonsProcessOrder;
+
/**
* Contains order in which child buttons are shown.
* It traces order of all bottomtray buttons that may change place via drag'n'drop and should
@@ -451,6 +469,7 @@ protected:
LLSpeakButton* mSpeakBtn;
LLNearbyChatBar* mNearbyChatBar;
LLLayoutPanel* mChatBarContainer;
+ LLPanel* mNearbyCharResizeHandlePanel;
LLLayoutStack* mToolbarStack;
LLMenuGL* mBottomTrayContextMenu;
LLButton* mCamButton;
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 5ff22f89ab..d4ec377e03 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -138,10 +138,7 @@ public:
if (level == "profile")
{
- LLSD params;
- params["object_id"] = getAvatarId();
-
- LLFloaterReg::showInstance("inspect_object", params);
+ LLFloaterReg::showInstance("inspect_remote_object", mObjectData);
}
else if (level == "block")
{
@@ -229,7 +226,7 @@ public:
if (mSourceType == CHAT_SOURCE_OBJECT)
{
- LLFloaterReg::showInstance("inspect_object", LLSD().with("object_id", mAvatarID));
+ LLFloaterReg::showInstance("inspect_remote_object", mObjectData);
}
else if (mSourceType == CHAT_SOURCE_AGENT)
{
@@ -251,7 +248,7 @@ public:
const LLUUID& getAvatarId () const { return mAvatarID;}
- void setup(const LLChat& chat,const LLStyle::Params& style_params)
+ void setup(const LLChat& chat, const LLStyle::Params& style_params, const LLSD& args)
{
mAvatarID = chat.mFromID;
mSessionID = chat.mSessionID;
@@ -332,7 +329,8 @@ public:
setTimeField(chat);
-
+
+ // Set up the icon.
LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
if(mSourceType != CHAT_SOURCE_AGENT || mAvatarID.isNull())
@@ -352,6 +350,30 @@ public:
case CHAT_SOURCE_UNKNOWN:
icon->setValue(LLSD("Unknown_Icon"));
}
+
+ // In case the message came from an object, save the object info
+ // to be able properly show its profile.
+ if ( chat.mSourceType == CHAT_SOURCE_OBJECT)
+ {
+ std::string slurl = args["slurl"].asString();
+ if (slurl.empty())
+ {
+ LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent);
+ if(region)
+ {
+ LLSLURL region_slurl(region->getName(), chat.mPosAgent);
+ slurl = region_slurl.getLocationString();
+ }
+ }
+
+ LLSD payload;
+ payload["object_id"] = chat.mFromID;
+ payload["name"] = chat.mFromName;
+ payload["owner_id"] = chat.mOwnerID;
+ payload["slurl"] = LLWeb::escapeURL(slurl);
+
+ mObjectData = payload;
+ }
}
/*virtual*/ void draw()
@@ -540,6 +562,7 @@ protected:
static LLUICtrl* sInfoCtrl;
LLUUID mAvatarID;
+ LLSD mObjectData;
EChatSourceType mSourceType;
std::string mFrom;
LLUUID mSessionID;
@@ -649,10 +672,10 @@ LLView* LLChatHistory::getSeparator()
return separator;
}
-LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style_params)
+LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style_params, const LLSD& args)
{
LLChatHistoryHeader* header = LLChatHistoryHeader::createInstance(mMessageHeaderFilename);
- header->setup(chat,style_params);
+ header->setup(chat, style_params, args);
return header;
}
@@ -834,7 +857,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
}
else
{
- view = getHeader(chat, style_params);
+ view = getHeader(chat, style_params, args);
if (mEditor->getText().size() == 0)
p.top_pad = 0;
else
diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h
index ac48d7bf29..28344e6a10 100644
--- a/indra/newview/llchathistory.h
+++ b/indra/newview/llchathistory.h
@@ -94,7 +94,7 @@ class LLChatHistory : public LLUICtrl
* Builds a message header.
* @return pointer to LLView header object.
*/
- LLView* getHeader(const LLChat& chat,const LLStyle::Params& style_params);
+ LLView* getHeader(const LLChat& chat,const LLStyle::Params& style_params, const LLSD& args);
void onClickMoreText();
diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp
index 360ba080ac..1b6ba02aac 100755
--- a/indra/newview/llcommandhandler.cpp
+++ b/indra/newview/llcommandhandler.cpp
@@ -35,7 +35,7 @@
// system includes
#include <boost/tokenizer.hpp>
-#define THROTTLE_PERIOD 15 // required secs between throttled commands
+#define THROTTLE_PERIOD 5 // required secs between throttled commands
static LLCommandDispatcherListener sCommandDispatcherListener;
diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp
index 4d252dc662..e319418def 100644
--- a/indra/newview/llfirstuse.cpp
+++ b/indra/newview/llfirstuse.cpp
@@ -41,36 +41,35 @@
// static
-//std::set<std::string> LLFirstUse::sConfigVariables;
-std::set<std::string> LLFirstUse::sConfigVariablesEnabled;
+std::set<std::string> LLFirstUse::sConfigVariables;
// static
-//void LLFirstUse::addConfigVariable(const std::string& var)
-//{
-// sConfigVariables.insert(var);
-//}
+void LLFirstUse::addConfigVariable(const std::string& var)
+{
+ sConfigVariables.insert(var);
+}
// static
-//void LLFirstUse::disableFirstUse()
-//{
-// // Set all first-use warnings to disabled
-// for (std::set<std::string>::iterator iter = sConfigVariables.begin();
-// iter != sConfigVariables.end(); ++iter)
-// {
-// gWarningSettings.setBOOL(*iter, FALSE);
-// }
-//}
+void LLFirstUse::disableFirstUse()
+{
+ // Set all first-use warnings to disabled
+ for (std::set<std::string>::iterator iter = sConfigVariables.begin();
+ iter != sConfigVariables.end(); ++iter)
+ {
+ gWarningSettings.setBOOL(*iter, FALSE);
+ }
+}
// static
-//void LLFirstUse::resetFirstUse()
-//{
-// // Set all first-use warnings to disabled
-// for (std::set<std::string>::iterator iter = sConfigVariables.begin();
-// iter != sConfigVariables.end(); ++iter)
-// {
-// gWarningSettings.setBOOL(*iter, TRUE);
-// }
-//}
+void LLFirstUse::resetFirstUse()
+{
+ // Set all first-use warnings to disabled
+ for (std::set<std::string>::iterator iter = sConfigVariables.begin();
+ iter != sConfigVariables.end(); ++iter)
+ {
+ gWarningSettings.setBOOL(*iter, TRUE);
+ }
+}
// static
void LLFirstUse::otherAvatarChatFirst(bool enable)
@@ -104,13 +103,6 @@ void LLFirstUse::notUsingDestinationGuide(bool enable)
firstUseNotification("FirstNotUseDestinationGuide", enable, "HintDestinationGuide", LLSD(), LLSD().with("target", "dest_guide_btn").with("direction", "top"));
}
-void LLFirstUse::notUsingAvatarPicker(bool enable)
-{
- // not doing this yet
- firstUseNotification("FirstNotUseAvatarPicker", enable, "HintAvatarPicker", LLSD(), LLSD().with("target", "avatar_picker_btn").with("direction", "top"));
-}
-
-
// static
void LLFirstUse::notUsingSidePanel(bool enable)
{
@@ -152,21 +144,13 @@ void LLFirstUse::firstUseNotification(const std::string& control_var, bool enabl
if (enable)
{
- if(sConfigVariablesEnabled.find(control_var) != sConfigVariablesEnabled.end())
- {
- return ; //already added
- }
-
if (gSavedSettings.getBOOL("EnableUIHints"))
{
LL_DEBUGS("LLFirstUse") << "Trigger first use notification " << notification_name << LL_ENDL;
// if notification doesn't already exist and this notification hasn't been disabled...
if (gWarningSettings.getBOOL(control_var))
- {
- sConfigVariablesEnabled.insert(control_var) ;
-
- // create new notification
+ { // create new notification
LLNotifications::instance().add(LLNotification::Params().name(notification_name).substitutions(args).payload(payload.with("control_var", control_var)));
}
}
@@ -178,6 +162,7 @@ void LLFirstUse::firstUseNotification(const std::string& control_var, bool enabl
// redundantly clear settings var here, in case there are no notifications to cancel
gWarningSettings.setBOOL(control_var, FALSE);
}
+
}
// static
diff --git a/indra/newview/llfirstuse.h b/indra/newview/llfirstuse.h
index 489f58626a..42b2ec0c60 100644
--- a/indra/newview/llfirstuse.h
+++ b/indra/newview/llfirstuse.h
@@ -78,16 +78,15 @@ class LLFirstUse
public:
// Add a config variable to be reset on resetFirstUse()
- //static void addConfigVariable(const std::string& var);
+ static void addConfigVariable(const std::string& var);
// Sets all controls back to show the dialogs.
- //static void disableFirstUse();
- //static void resetFirstUse();
+ static void disableFirstUse();
+ static void resetFirstUse();
static void otherAvatarChatFirst(bool enable = true);
static void sit(bool enable = true);
static void notUsingDestinationGuide(bool enable = true);
- static void notUsingAvatarPicker(bool enable = true);
static void notUsingSidePanel(bool enable = true);
static void notMoving(bool enable = true);
static void viewPopup(bool enable = true);
@@ -98,8 +97,7 @@ public:
protected:
static void firstUseNotification(const std::string& control_var, bool enable, const std::string& notification_name, LLSD args = LLSD(), LLSD payload = LLSD());
- //static std::set<std::string> sConfigVariables;
- static std::set<std::string> sConfigVariablesEnabled;
+ static std::set<std::string> sConfigVariables;
static void init();
static bool processNotification(const LLSD& notify);
diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp
index 252c7b51ae..c95b046707 100644
--- a/indra/newview/llfloaterauction.cpp
+++ b/indra/newview/llfloaterauction.cpp
@@ -351,8 +351,8 @@ void LLFloaterAuction::doResetParcel()
body["media_height"] = (S32) 0;
body["auto_scale"] = (S32) 0;
body["media_loop"] = (S32) 0;
- body["obscure_media"] = (S32) 0;
- body["obscure_music"] = (S32) 0;
+ body["obscure_media"] = (S32) 0; // OBSOLETE - no longer used
+ body["obscure_music"] = (S32) 0; // OBSOLETE - no longer used
body["media_id"] = LLUUID::null;
body["group_id"] = MAINTENANCE_GROUP_ID; // Use maintenance group
body["pass_price"] = (S32) 10; // Defaults to $10
diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp
index 80920c80d6..45d1cc2b53 100644
--- a/indra/newview/llfloatermap.cpp
+++ b/indra/newview/llfloatermap.cpp
@@ -83,8 +83,14 @@ LLFloaterMap::~LLFloaterMap()
BOOL LLFloaterMap::postBuild()
{
mMap = getChild<LLNetMap>("Net Map");
- mMap->setToolTipMsg(gSavedSettings.getBOOL("DoubleClickTeleport") ?
- getString("AltToolTipMsg") : getString("ToolTipMsg"));
+ if (gSavedSettings.getBOOL("DoubleClickTeleport"))
+ {
+ mMap->setToolTipMsg(getString("AltToolTipMsg"));
+ }
+ else if (gSavedSettings.getBOOL("DoubleClickShowWorldMap"))
+ {
+ mMap->setToolTipMsg(getString("ToolTipMsg"));
+ }
sendChildToBack(mMap);
mTextBoxNorth = getChild<LLTextBox> ("floater_map_north");
@@ -150,7 +156,7 @@ BOOL LLFloaterMap::handleDoubleClick(S32 x, S32 y, MASK mask)
// If DoubleClickTeleport is on, double clicking the minimap will teleport there
gAgent.teleportViaLocationLookAt(pos_global);
}
- else
+ else if (gSavedSettings.getBOOL("DoubleClickShowWorldMap"))
{
LLFloaterReg::showInstance("world_map");
}
diff --git a/indra/newview/llfloatersidetraytab.cpp b/indra/newview/llfloatersidetraytab.cpp
index f13b4db3a0..94407e6da0 100644
--- a/indra/newview/llfloatersidetraytab.cpp
+++ b/indra/newview/llfloatersidetraytab.cpp
@@ -30,6 +30,7 @@
// newview includes
#include "lltransientfloatermgr.h"
+#include "llsidetray.h"
LLFloaterSideTrayTab::LLFloaterSideTrayTab(const LLSD& key, const Params& params)
: LLFloater(key, params)
@@ -43,3 +44,8 @@ LLFloaterSideTrayTab::~LLFloaterSideTrayTab()
{
LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::GLOBAL, this);
}
+
+void LLFloaterSideTrayTab::onClose(bool app_quitting)
+{
+ LLSideTray::getInstance()->setTabDocked(getName(), true);
+}
diff --git a/indra/newview/llfloatersidetraytab.h b/indra/newview/llfloatersidetraytab.h
index e47f82e8ba..89f2444a0e 100644
--- a/indra/newview/llfloatersidetraytab.h
+++ b/indra/newview/llfloatersidetraytab.h
@@ -42,6 +42,8 @@ class LLFloaterSideTrayTab : public LLFloater
public:
LLFloaterSideTrayTab(const LLSD& key, const Params& params = getDefaultParams());
~LLFloaterSideTrayTab();
+
+ void onClose(bool app_quitting);
};
#endif // LL_LLFLOATERSIDETRAYTAB_H
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index 017cd2fc49..03cf0332a9 100755
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -110,6 +110,12 @@ public:
bool handle(const LLSD& params, const LLSD& query_map,
LLMediaCtrl* web)
{
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnableWorldMap"))
+ {
+ LLNotificationsUtil::add("NoWorldMap", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
if (params.size() == 0)
{
// support the secondlife:///app/worldmap SLapp
@@ -142,6 +148,12 @@ public:
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
{
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnableWorldMap"))
+ {
+ LLNotificationsUtil::add("NoWorldMap", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
//Make sure we have some parameters
if (params.size() == 0)
{
diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp
index e9f1e3bc22..70e789f490 100644
--- a/indra/newview/llfriendcard.cpp
+++ b/indra/newview/llfriendcard.cpp
@@ -28,6 +28,7 @@
#include "llfriendcard.h"
+#include "llagent.h"
#include "llavatarnamecache.h"
#include "llinventory.h"
#include "llinventoryfunctions.h"
@@ -290,58 +291,6 @@ void LLFriendCardsManager::syncFriendCardsFolders()
boost::bind(&LLFriendCardsManager::ensureFriendsFolderExists, this));
}
-void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const
-{
- folderBuddiesMap.clear();
-
- static bool syncronize_friends_folders = true;
- if (syncronize_friends_folders)
- {
- // Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" folder,
- // fetches their contents if needed and synchronizes it with buddies list.
- // If the folders are not found they are created.
- LLFriendCardsManager::instance().syncFriendCardsFolders();
- syncronize_friends_folders = false;
- }
-
-
- LLInventoryModel::cat_array_t* listFolders;
- LLInventoryModel::item_array_t* items;
-
- // get folders in the Friend folder. Items should be NULL due to Cards should be in lists.
- gInventory.getDirectDescendentsOf(findFriendFolderUUIDImpl(), listFolders, items);
-
- if (NULL == listFolders)
- return;
-
- LLInventoryModel::cat_array_t::const_iterator itCats; // to iterate Friend Lists (categories)
- LLInventoryModel::item_array_t::const_iterator itBuddy; // to iterate Buddies in each List
- LLInventoryModel::cat_array_t* fakeCatsArg;
- for (itCats = listFolders->begin(); itCats != listFolders->end(); ++itCats)
- {
- if (items)
- items->clear();
-
- // *HACK: Only Friends/All content will be shown for now
- // *TODO: Remove this hack, implement sorting if it will be needded by spec.
- if ((*itCats)->getUUID() != findFriendAllSubfolderUUIDImpl())
- continue;
-
- gInventory.getDirectDescendentsOf((*itCats)->getUUID(), fakeCatsArg, items);
-
- if (NULL == items)
- continue;
-
- uuid_vec_t buddyUUIDs;
- for (itBuddy = items->begin(); itBuddy != items->end(); ++itBuddy)
- {
- buddyUUIDs.push_back((*itBuddy)->getCreatorUUID());
- }
-
- folderBuddiesMap.insert(make_pair((*itCats)->getUUID(), buddyUUIDs));
- }
-}
-
/************************************************************************/
/* Private Methods */
@@ -499,23 +448,43 @@ void LLFriendCardsManager::syncFriendsFolder()
LLAvatarTracker::buddy_map_t all_buddies;
LLAvatarTracker::instance().copyBuddyList(all_buddies);
- // 1. Remove Friend Cards for non-friends
+ // 1. Check if own calling card exists
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
- gInventory.collectDescendents(findFriendAllSubfolderUUIDImpl(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
+ LLUUID friends_all_folder_id = findFriendAllSubfolderUUIDImpl();
+ gInventory.collectDescendents(friends_all_folder_id, cats, items, LLInventoryModel::EXCLUDE_TRASH);
+ bool own_callingcard_found = false;
LLInventoryModel::item_array_t::const_iterator it;
for (it = items.begin(); it != items.end(); ++it)
{
- lldebugs << "Check if buddy is in list: " << (*it)->getName() << " " << (*it)->getCreatorUUID() << llendl;
- if (NULL == get_ptr_in_map(all_buddies, (*it)->getCreatorUUID()))
+ if ((*it)->getCreatorUUID() == gAgentID)
{
- lldebugs << "NONEXISTS, so remove it" << llendl;
- removeFriendCardFromInventory((*it)->getCreatorUUID());
+ own_callingcard_found = true;
+ break;
}
}
+ // Create own calling card if it was not found in Friends/All folder
+ if (!own_callingcard_found)
+ {
+ LLAvatarName av_name;
+ LLAvatarNameCache::get( gAgentID, &av_name );
+
+ create_inventory_item(gAgentID,
+ gAgent.getSessionID(),
+ friends_all_folder_id,
+ LLTransactionID::tnull,
+ av_name.getCompleteName(),
+ gAgentID.asString(),
+ LLAssetType::AT_CALLINGCARD,
+ LLInventoryType::IT_CALLINGCARD,
+ NOT_WEARABLE,
+ PERM_MOVE | PERM_TRANSFER,
+ NULL);
+ }
+
// 2. Add missing Friend Cards for friends
LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
llinfos << "try to build friends, count: " << all_buddies.size() << llendl;
diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h
index b7f0bada14..48a9f70079 100644
--- a/indra/newview/llfriendcard.h
+++ b/indra/newview/llfriendcard.h
@@ -79,19 +79,6 @@ public:
*/
void syncFriendCardsFolders();
- /*!
- * \brief
- * Collects folders' IDs with the buddies' IDs in the Inventory Calling Card/Friends folder.
- *
- * \param folderBuddiesMap
- * map into collected data will be put. It will be cleared before adding new data.
- *
- * Each item in the out map is a pair where first is an LLViewerInventoryCategory UUID,
- * second is a vector with UUID of Avatars from this folder.
- *
- */
- void collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const;
-
private:
typedef boost::function<void()> callback_t;
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index 5393678a6b..7c56e610ce 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -53,6 +53,12 @@ public:
bool handle(const LLSD& tokens, const LLSD& query_map,
LLMediaCtrl* web)
{
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnableGroupInfo"))
+ {
+ LLNotificationsUtil::add("NoGroupInfo", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
if (tokens.size() < 1)
{
return false;
diff --git a/indra/newview/llhudeffectblob.cpp b/indra/newview/llhudeffectblob.cpp
new file mode 100644
index 0000000000..26e8251899
--- /dev/null
+++ b/indra/newview/llhudeffectblob.cpp
@@ -0,0 +1,78 @@
+/**
+ * @file llhudeffecttrail.cpp
+ * @brief LLHUDEffectSpiral class implementation
+ *
+ * $LicenseInfo:firstyear=2002&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 "llviewerprecompiledheaders.h"
+
+#include "llhudeffectblob.h"
+
+#include "llagent.h"
+#include "llviewercamera.h"
+#include "llrendersphere.h"
+
+LLHUDEffectBlob::LLHUDEffectBlob(const U8 type)
+: LLHUDEffect(type),
+ mPixelSize(10)
+{
+ mTimer.start();
+}
+
+LLHUDEffectBlob::~LLHUDEffectBlob()
+{
+}
+
+void LLHUDEffectBlob::render()
+{
+ F32 time = mTimer.getElapsedTimeF32();
+ if (mDuration < time)
+ {
+ markDead();
+ }
+
+ LLVector3 pos_agent = gAgent.getPosAgentFromGlobal(mPositionGlobal);
+
+ LLVector3 pixel_up, pixel_right;
+
+ LLViewerCamera::instance().getPixelVectors(pos_agent, pixel_up, pixel_right);
+
+ LLGLSPipelineAlpha gls_pipeline_alpha;
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
+ LLColor4U color = mColor;
+ color.mV[VALPHA] = (U8)clamp_rescale(time, 0.f, mDuration, 255.f, 0.f);
+ glColor4ubv(color.mV);
+
+ glPushMatrix();
+ glTranslatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]);
+ F32 scale = pixel_up.magVec() * (F32)mPixelSize;
+ glScalef(scale, scale, scale);
+ gSphere.render(0);
+ glPopMatrix();
+}
+
+void LLHUDEffectBlob::renderForTimer()
+{
+}
+
diff --git a/indra/newview/llhudeffectblob.h b/indra/newview/llhudeffectblob.h
new file mode 100644
index 0000000000..5b0703cdaa
--- /dev/null
+++ b/indra/newview/llhudeffectblob.h
@@ -0,0 +1,50 @@
+/**
+ * @file llhudeffectblob.h
+ * @brief LLHUDEffectBlob class definition
+ *
+ * $LicenseInfo:firstyear=2002&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 LL_LLHUDEFFECTBLOB_H
+#define LL_LLHUDEFFECTBLOB_H
+
+#include "llhudeffect.h"
+
+class LLHUDEffectBlob : public LLHUDEffect
+{
+public:
+ friend class LLHUDObject;
+
+ void setPixelSize(S32 pixels) { mPixelSize = pixels; }
+
+protected:
+ LLHUDEffectBlob(const U8 type);
+ ~LLHUDEffectBlob();
+
+ /*virtual*/ void render();
+ /*virtual*/ void renderForTimer();
+private:
+ S32 mPixelSize;
+ LLFrameTimer mTimer;
+};
+
+#endif // LL_LLHUDEFFECTBLOB_H
diff --git a/indra/newview/llhudobject.cpp b/indra/newview/llhudobject.cpp
index 5e762ee037..95d57d08d8 100644
--- a/indra/newview/llhudobject.cpp
+++ b/indra/newview/llhudobject.cpp
@@ -32,6 +32,7 @@
#include "llhudtext.h"
#include "llhudicon.h"
#include "llhudeffectbeam.h"
+#include "llhudeffectblob.h"
#include "llhudeffecttrail.h"
#include "llhudeffectlookat.h"
#include "llhudeffectpointat.h"
@@ -237,6 +238,9 @@ LLHUDEffect *LLHUDObject::addHUDEffect(const U8 type)
case LL_HUD_EFFECT_POINTAT:
hud_objectp = new LLHUDEffectPointAt(type);
break;
+ case LL_HUD_EFFECT_BLOB:
+ hud_objectp = new LLHUDEffectBlob(type);
+ break;
default:
llwarns << "Unknown type of hud effect:" << (U32) type << llendl;
}
diff --git a/indra/newview/llhudobject.h b/indra/newview/llhudobject.h
index 33e6394445..2f7a98c86c 100644
--- a/indra/newview/llhudobject.h
+++ b/indra/newview/llhudobject.h
@@ -95,7 +95,8 @@ public:
LL_HUD_EFFECT_LOOKAT,
LL_HUD_EFFECT_POINTAT,
LL_HUD_EFFECT_VOICE_VISUALIZER, // Ventrella
- LL_HUD_NAME_TAG
+ LL_HUD_NAME_TAG,
+ LL_HUD_EFFECT_BLOB
};
protected:
static void sortObjects();
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 61d0a150b7..ba9bea02b9 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -483,9 +483,6 @@ bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(const LLInventoryIte
switch(item->getType())
{
- case LLAssetType::AT_CALLINGCARD:
- return false;
- break;
case LLAssetType::AT_OBJECT:
case LLAssetType::AT_BODYPART:
case LLAssetType::AT_CLOTHING:
diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp
index 570e48d526..e31360fcbc 100644
--- a/indra/newview/llinventorymodelbackgroundfetch.cpp
+++ b/indra/newview/llinventorymodelbackgroundfetch.cpp
@@ -182,7 +182,7 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()
{
// If we'll be using the capability, we'll be sending batches and the background thing isn't as important.
std::string url = gAgent.getRegion()->getCapability("FetchInventoryDescendents2");
- if (!url.empty())
+ if (gSavedSettings.getBOOL("UseHTTPInventory") && !url.empty())
{
bulkFetch(url);
return;
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 55164f6094..5c65dcec34 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -211,7 +211,6 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
{
// Lets replace default LLLineEditor with LLLocationLineEditor
// to make needed escaping while copying and cutting url
- this->removeChild(mTextEntry);
delete mTextEntry;
// Can't access old mTextEntry fields as they are protected, so lets build new params
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index e4f83ce6b9..3b160ddc8e 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -636,18 +636,19 @@ void LLNavigationBar::onRegionNameResponse(
U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)
{
// Invalid location?
- if (!region_handle)
+ if (region_handle)
+ {
+ // Teleport to the location.
+ LLVector3d region_pos = from_region_handle(region_handle);
+ LLVector3d global_pos = region_pos + (LLVector3d) local_coords;
+
+ llinfos << "Teleporting to: " << LLSLURL(region_name, global_pos).getSLURLString() << llendl;
+ gAgent.teleportViaLocation(global_pos);
+ }
+ else if (gSavedSettings.getBOOL("SearchFromAddressBar"))
{
invokeSearch(typed_location);
- return;
}
-
- // Teleport to the location.
- LLVector3d region_pos = from_region_handle(region_handle);
- LLVector3d global_pos = region_pos + (LLVector3d) local_coords;
-
- llinfos << "Teleporting to: " << LLSLURL(region_name, global_pos).getSLURLString() << llendl;
- gAgent.teleportViaLocation(global_pos);
}
void LLNavigationBar::showTeleportHistoryMenu(LLUICtrl* btn_ctrl)
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index 836ae9a0cf..162e465fef 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -157,6 +157,16 @@ BOOL LLGestureComboList::handleKeyHere(KEY key, MASK mask)
return handled;
}
+void LLGestureComboList::draw()
+{
+ LLUICtrl::draw();
+
+ if(mButton->getToggleState())
+ {
+ showList();
+ }
+}
+
void LLGestureComboList::showList()
{
LLRect rect = mList->getRect();
@@ -180,6 +190,7 @@ void LLGestureComboList::showList()
// Show the list and push the button down
mButton->setToggleState(TRUE);
mList->setVisible(TRUE);
+ sendChildToFront(mList);
LLUI::addPopup(mList);
}
diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h
index 033d1dd5a2..96ab45071b 100644
--- a/indra/newview/llnearbychatbar.h
+++ b/indra/newview/llnearbychatbar.h
@@ -72,6 +72,8 @@ public:
virtual void hideList();
virtual BOOL handleKeyHere(KEY key, MASK mask);
+ virtual void draw();
+
S32 getCurrentIndex() const;
void onItemSelected(const LLSD& data);
void sortByName(bool ascending = true);
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index 93039d935d..e29078c545 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -904,23 +904,29 @@ BOOL LLNetMap::handleClick(S32 x, S32 y, MASK mask)
BOOL LLNetMap::handleDoubleClick(S32 x, S32 y, MASK mask)
{
LLVector3d pos_global = viewPosToGlobal(x, y);
-
- // If we're not tracking a beacon already, double-click will set one
- if (!LLTracker::isTracking(NULL))
+
+ bool double_click_teleport = gSavedSettings.getBOOL("DoubleClickTeleport");
+ bool double_click_show_world_map = gSavedSettings.getBOOL("DoubleClickShowWorldMap");
+
+ if (double_click_teleport || double_click_show_world_map)
{
- LLFloaterWorldMap* world_map = LLFloaterWorldMap::getInstance();
- if (world_map)
+ // If we're not tracking a beacon already, double-click will set one
+ if (!LLTracker::isTracking(NULL))
{
- world_map->trackLocation(pos_global);
+ LLFloaterWorldMap* world_map = LLFloaterWorldMap::getInstance();
+ if (world_map)
+ {
+ world_map->trackLocation(pos_global);
+ }
}
}
-
- if (gSavedSettings.getBOOL("DoubleClickTeleport"))
+
+ if (double_click_teleport)
{
// If DoubleClickTeleport is on, double clicking the minimap will teleport there
gAgent.teleportViaLocationLookAt(pos_global);
}
- else
+ else if (double_click_show_world_map)
{
LLFloaterReg::showInstance("world_map");
}
diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp
index 45590c3cdb..bbb4d03768 100644
--- a/indra/newview/llnotificationscripthandler.cpp
+++ b/indra/newview/llnotificationscripthandler.cpp
@@ -88,7 +88,7 @@ bool LLScriptHandler::processNotification(const LLSD& notify)
initChannel();
}
- if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
+ if(notify["sigtype"].asString() == "add")
{
if (LLHandlerUtil::canLogToIM(notification))
{
diff --git a/indra/newview/llpanellandaudio.cpp b/indra/newview/llpanellandaudio.cpp
index 5a943bc61d..f9730d9b71 100644
--- a/indra/newview/llpanellandaudio.cpp
+++ b/indra/newview/llpanellandaudio.cpp
@@ -91,9 +91,6 @@ BOOL LLPanelLandAudio::postBuild()
mMusicURLEdit = getChild<LLLineEditor>("music_url");
childSetCommitCallback("music_url", onCommitAny, this);
- mMusicUrlCheck = getChild<LLCheckBoxCtrl>("hide_music_url");
- childSetCommitCallback("hide_music_url", onCommitAny, this);
-
return TRUE;
}
@@ -117,9 +114,6 @@ void LLPanelLandAudio::refresh()
mCheckSoundLocal->set( parcel->getSoundLocal() );
mCheckSoundLocal->setEnabled( can_change_media );
- mMusicUrlCheck->set( parcel->getObscureMusic() );
- mMusicUrlCheck->setEnabled( can_change_media );
-
bool allow_voice = parcel->getParcelFlagAllowVoice();
LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
@@ -148,13 +142,6 @@ void LLPanelLandAudio::refresh()
mCheckParcelEnableVoice->set(allow_voice);
mCheckParcelVoiceLocal->set(!parcel->getParcelFlagUseEstateVoiceChannel());
- // don't display urls if you're not able to change it
- // much requested change in forums so people can't 'steal' urls
- // NOTE: bug#2009 means this is still vunerable - however, bug
- // should be closed since this bug opens up major security issues elsewhere.
- bool obscure_music = ! can_change_media && parcel->getObscureMusic();
-
- mMusicURLEdit->setDrawAsterixes(obscure_music);
mMusicURLEdit->setText(parcel->getMusicURL());
mMusicURLEdit->setEnabled( can_change_media );
}
@@ -173,7 +160,6 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
// Extract data from UI
BOOL sound_local = self->mCheckSoundLocal->get();
std::string music_url = self->mMusicURLEdit->getText();
- U8 obscure_music = self->mMusicUrlCheck->get();
BOOL voice_enabled = self->mCheckParcelEnableVoice->get();
BOOL voice_estate_chan = !self->mCheckParcelVoiceLocal->get();
@@ -186,7 +172,6 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
parcel->setParcelFlag(PF_USE_ESTATE_VOICE_CHAN, voice_estate_chan);
parcel->setParcelFlag(PF_SOUND_LOCAL, sound_local);
parcel->setMusicURL(music_url);
- parcel->setObscureMusic(obscure_music);
// Send current parcel data upstream to server
LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
diff --git a/indra/newview/llpanellandmedia.cpp b/indra/newview/llpanellandmedia.cpp
index f17defda55..b3adfac8a2 100644
--- a/indra/newview/llpanellandmedia.cpp
+++ b/indra/newview/llpanellandmedia.cpp
@@ -68,8 +68,7 @@ LLPanelLandMedia::LLPanelLandMedia(LLParcelSelectionHandle& parcel)
mMediaSizeCtrlLabel(NULL),
mMediaTextureCtrl(NULL),
mMediaAutoScaleCheck(NULL),
- mMediaLoopCheck(NULL),
- mMediaUrlCheck(NULL)
+ mMediaLoopCheck(NULL)
{
}
@@ -94,9 +93,6 @@ BOOL LLPanelLandMedia::postBuild()
mMediaLoopCheck = getChild<LLCheckBoxCtrl>("media_loop");
childSetCommitCallback("media_loop", onCommitAny, this );
- mMediaUrlCheck = getChild<LLCheckBoxCtrl>("hide_media_url");
- childSetCommitCallback("hide_media_url", onCommitAny, this );
-
mMediaURLEdit = getChild<LLLineEditor>("media_url");
childSetCommitCallback("media_url", onCommitAny, this );
@@ -153,25 +149,6 @@ void LLPanelLandMedia::refresh()
mMediaTypeCombo->setEnabled( can_change_media );
getChild<LLUICtrl>("mime_type")->setValue(mime_type);
- mMediaUrlCheck->set( parcel->getObscureMedia() );
- mMediaUrlCheck->setEnabled( can_change_media );
-
- // don't display urls if you're not able to change it
- // much requested change in forums so people can't 'steal' urls
- // NOTE: bug#2009 means this is still vunerable - however, bug
- // should be closed since this bug opens up major security issues elsewhere.
- bool obscure_media = ! can_change_media && parcel->getObscureMedia();
-
- // Special code to disable asterixes for html type
- if(mime_type == "text/html")
- {
- obscure_media = false;
- mMediaUrlCheck->set( 0 );
- mMediaUrlCheck->setEnabled( false );
- }
-
- mMediaURLEdit->setDrawAsterixes( obscure_media );
-
mMediaAutoScaleCheck->set( parcel->getMediaAutoScale () );
mMediaAutoScaleCheck->setEnabled ( can_change_media );
@@ -301,7 +278,6 @@ void LLPanelLandMedia::onCommitAny(LLUICtrl*, void *userdata)
std::string mime_type = self->getChild<LLUICtrl>("mime_type")->getValue().asString();
U8 media_auto_scale = self->mMediaAutoScaleCheck->get();
U8 media_loop = self->mMediaLoopCheck->get();
- U8 obscure_media = self->mMediaUrlCheck->get();
S32 media_width = (S32)self->mMediaWidthCtrl->get();
S32 media_height = (S32)self->mMediaHeightCtrl->get();
LLUUID media_id = self->mMediaTextureCtrl->getImageAssetID();
@@ -321,7 +297,6 @@ void LLPanelLandMedia::onCommitAny(LLUICtrl*, void *userdata)
parcel->setMediaID(media_id);
parcel->setMediaAutoScale ( media_auto_scale );
parcel->setMediaLoop ( media_loop );
- parcel->setObscureMedia( obscure_media );
// Send current parcel data upstream to server
LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 3b5830f8e0..903cf4780d 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -81,9 +81,6 @@ const S32 MAX_PASSWORD = 16;
LLPanelLogin *LLPanelLogin::sInstance = NULL;
BOOL LLPanelLogin::sCapslockDidNotification = FALSE;
-// Helper for converting a user name into the canonical "Firstname Lastname" form.
-// For new accounts without a last name "Resident" is added as a last name.
-static std::string canonicalize_username(const std::string& name);
class LLLoginRefreshHandler : public LLCommandHandler
{
@@ -217,6 +214,8 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
}
updateLocationCombo(false);
+ gSavedSettings.getControl("SessionSettingsFile")->getSignal()->connect(boost::bind(&onModeChange));
+
LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo");
server_choice_combo->setCommitCallback(onSelectServer, NULL);
server_choice_combo->setFocusLostCallback(boost::bind(onServerComboLostFocus, _1));
@@ -301,14 +300,7 @@ void LLPanelLogin::addFavoritesToStartLocation()
for (LLSD::map_const_iterator iter = fav_llsd.beginMap();
iter != fav_llsd.endMap(); ++iter)
{
- std::string user_defined_name = getChild<LLComboBox>("username_combo")->getSimple();
-
- // The account name in stored_favorites.xml has Resident last name even if user has
- // a single word account name, so it can be compared case-insensitive with the
- // user defined "firstname lastname".
- S32 res = LLStringUtil::compareInsensitive(canonicalize_username(user_defined_name), iter->first);
- if (res != 0) continue;
-
+ if(iter->first != getChild<LLComboBox>("username_combo")->getSimple()) continue;
combo->addSeparator();
LLSD user_llsd = iter->second;
for (LLSD::array_const_iterator iter1 = user_llsd.beginArray();
@@ -1167,27 +1159,25 @@ void LLPanelLogin::updateLoginPanelLinks()
sInstance->getChildView("forgot_password_text")->setVisible( system_grid);
}
-std::string canonicalize_username(const std::string& name)
+//static
+void LLPanelLogin::onModeChange()
{
- std::string cname = name;
- LLStringUtil::trim(cname);
+ LLNotificationsUtil::add("ModeChange", LLSD(), LLSD(), boost::bind(&onModeChangeConfirm, _1, _2));
+}
- // determine if the username is a first/last form or not.
- size_t separator_index = cname.find_first_of(" ._");
- std::string first = cname.substr(0, separator_index);
- std::string last;
- if (separator_index != cname.npos)
- {
- last = cname.substr(separator_index+1, cname.npos);
- LLStringUtil::trim(last);
- }
- else
+//static
+void LLPanelLogin::onModeChangeConfirm(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ switch (option)
{
- // ...on Linden grids, single username users as considered to have
- // last name "Resident"
- last = "Resident";
+ case 0:
+ LLAppViewer::instance()->requestQuit();
+ break;
+ case 1:
+ // do nothing
+ break;
+ default:
+ break;
}
-
- // Username in traditional "firstname lastname" form.
- return first + ' ' + last;
}
diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h
index 1ef6539ecc..1430bec832 100644
--- a/indra/newview/llpanellogin.h
+++ b/indra/newview/llpanellogin.h
@@ -98,6 +98,8 @@ private:
static void onServerComboLostFocus(LLFocusableElement*);
static void updateServerCombo();
static void updateStartSLURL();
+ static void onModeChange();
+ static void onModeChangeConfirm(const LLSD& notification, const LLSD& response);
static void updateLoginPanelLinks();
diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp
index 14e39f2c48..a7f1ab28fd 100644
--- a/indra/newview/llpanelnearbymedia.cpp
+++ b/indra/newview/llpanelnearbymedia.cpp
@@ -564,16 +564,14 @@ void LLPanelNearByMedia::refreshParcelItems()
if (NULL != mParcelMediaItem)
{
std::string name, url, tooltip;
- if (!LLViewerParcelMgr::getInstance()->getAgentParcel()->getObscureMedia())
+ getNameAndUrlHelper(LLViewerParcelMedia::getParcelMedia(), name, url, "");
+ if (name.empty() || name == url)
{
- getNameAndUrlHelper(LLViewerParcelMedia::getParcelMedia(), name, url, "");
- if (name.empty() || name == url)
- {
- tooltip = url;
- }
- else {
- tooltip = name + " : " + url;
- }
+ tooltip = url;
+ }
+ else
+ {
+ tooltip = name + " : " + url;
}
LLViewerMediaImpl *impl = LLViewerParcelMedia::getParcelMedia();
updateListItem(mParcelMediaItem,
@@ -611,10 +609,8 @@ void LLPanelNearByMedia::refreshParcelItems()
bool is_playing = LLViewerMedia::isParcelAudioPlaying();
std::string url;
- if (!LLViewerParcelMgr::getInstance()->getAgentParcel()->getObscureMusic())
- {
- url = LLViewerMedia::getParcelAudioURL();
- }
+ url = LLViewerMedia::getParcelAudioURL();
+
updateListItem(mParcelAudioItem,
mParcelAudioName,
url,
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index b07a46a222..b52f33ec3b 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -384,6 +384,16 @@ private:
{
lldebugs << "Inventory changed: " << mask << llendl;
+ static bool synchronize_friends_folders = true;
+ if (synchronize_friends_folders)
+ {
+ // Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" folder,
+ // fetches their contents if needed and synchronizes it with buddies list.
+ // If the folders are not found they are created.
+ LLFriendCardsManager::instance().syncFriendCardsFolders();
+ synchronize_friends_folders = false;
+ }
+
// *NOTE: deleting of InventoryItem is performed via moving to Trash.
// That means LLInventoryObserver::STRUCTURE is present in MASK instead of LLInventoryObserver::REMOVE
if ((CALLINGCARD_ADDED & mask) == CALLINGCARD_ADDED)
@@ -750,18 +760,23 @@ void LLPanelPeople::updateFriendList()
all_friendsp.clear();
online_friendsp.clear();
- LLFriendCardsManager::folderid_buddies_map_t listMap;
+ uuid_vec_t buddies_uuids;
+ LLAvatarTracker::buddy_map_t::const_iterator buddies_iter;
+
+ // Fill the avatar list with friends UUIDs
+ for (buddies_iter = all_buddies.begin(); buddies_iter != all_buddies.end(); ++buddies_iter)
+ {
+ buddies_uuids.push_back(buddies_iter->first);
+ }
- // *NOTE: For now collectFriendsLists returns data only for Friends/All folder. EXT-694.
- LLFriendCardsManager::instance().collectFriendsLists(listMap);
- if (listMap.size() > 0)
+ if (buddies_uuids.size() > 0)
{
- lldebugs << "Friends Cards were found, count: " << listMap.begin()->second.size() << llendl;
- all_friendsp = listMap.begin()->second;
+ lldebugs << "Friends added to the list: " << buddies_uuids.size() << llendl;
+ all_friendsp = buddies_uuids;
}
else
{
- lldebugs << "Friends Cards were not found" << llendl;
+ lldebugs << "No friends found" << llendl;
}
LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index c4f3866cad..ddce83c616 100755
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -70,6 +70,7 @@ static const std::string CLASSIFIED_NAME("classified_name");
static LLRegisterPanelClassWrapper<LLPanelPicks> t_panel_picks("panel_picks");
+
class LLPickHandler : public LLCommandHandler,
public LLAvatarPropertiesObserver
{
@@ -83,6 +84,12 @@ public:
bool handle(const LLSD& params, const LLSD& query_map,
LLMediaCtrl* web)
{
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnablePicks"))
+ {
+ LLNotificationsUtil::add("NoPicks", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
// handle app/classified/create urls first
if (params.size() == 1 && params[0].asString() == "create")
{
@@ -189,6 +196,12 @@ public:
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
{
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnableClassifieds"))
+ {
+ LLNotificationsUtil::add("NoClassifieds", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
// handle app/classified/create urls first
if (params.size() == 1 && params[0].asString() == "create")
{
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index 4f13c0c022..fd5c3362bb 100755
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -31,16 +31,27 @@
#include "llavataractions.h"
#include "llfloaterreg.h"
#include "llcommandhandler.h"
+#include "llnotificationsutil.h"
#include "llpanelpicks.h"
#include "lltabcontainer.h"
#include "llviewercontrol.h"
+#include "llviewernetwork.h"
static const std::string PANEL_PICKS = "panel_picks";
static const std::string PANEL_PROFILE = "panel_profile";
std::string getProfileURL(const std::string& agent_name)
{
- std::string url = gSavedSettings.getString("WebProfileURL");
+ std::string url;
+
+ if (LLGridManager::getInstance()->isInProductionGrid())
+ {
+ url = gSavedSettings.getString("WebProfileURL");
+ }
+ else
+ {
+ url = gSavedSettings.getString("WebProfileNonProductionURL");
+ }
LLSD subs;
subs["AGENT_NAME"] = agent_name;
url = LLWeb::expandURLSubstitutions(url,subs);
@@ -105,6 +116,12 @@ public:
if (verb == "pay")
{
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnableAvatarPay"))
+ {
+ LLNotificationsUtil::add("NoAvatarPay", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
LLAvatarActions::pay(avatar_id);
return true;
}
diff --git a/indra/newview/llshareavatarhandler.cpp b/indra/newview/llshareavatarhandler.cpp
index 34194970b8..6b4f1d3dc6 100644
--- a/indra/newview/llshareavatarhandler.cpp
+++ b/indra/newview/llshareavatarhandler.cpp
@@ -27,6 +27,8 @@
#include "llviewerprecompiledheaders.h"
#include "llcommandhandler.h"
#include "llavataractions.h"
+#include "llnotificationsutil.h"
+#include "llui.h"
class LLShareWithAvatarHandler : public LLCommandHandler
{
@@ -38,6 +40,12 @@ public:
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
{
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnableAvatarShare"))
+ {
+ LLNotificationsUtil::add("NoAvatarShare", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
//Make sure we have some parameters
if (params.size() == 0)
{
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index 6267242e28..a9bb01ac70 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -666,8 +666,16 @@ LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel
std::string tab_name = tab->getName();
+ bool tab_attached = isTabAttached(tab_name);
+
+ if (tab_attached && LLUI::sSettingGroups["config"]->getBOOL("OpenSidePanelsInFloaters"))
+ {
+ tab->toggleTabDocked();
+ tab_attached = false;
+ }
+
// Select tab and expand Side Tray only when a tab is attached.
- if (isTabAttached(tab_name))
+ if (tab_attached)
{
selectTabByName(tab_name);
if (mCollapsed)
@@ -678,14 +686,7 @@ LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel
LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
if (!floater_tab) return NULL;
- // Restore the floater if it was minimized.
- if (floater_tab->isMinimized())
- {
- floater_tab->setMinimized(FALSE);
- }
-
- // Send the floater to the front.
- floater_tab->setFrontmost();
+ floater_tab->openFloater(panel_name);
}
LLSideTrayPanelContainer* container = dynamic_cast<LLSideTrayPanelContainer*>(view->getParent());
@@ -1016,16 +1017,7 @@ void LLSideTray::reflectCollapseChange()
{
updateSidetrayVisibility();
- if(mCollapsed)
- {
- gFloaterView->setSnapOffsetRight(0);
- setFocus(FALSE);
- }
- else
- {
- gFloaterView->setSnapOffsetRight(getRect().getWidth());
- setFocus(TRUE);
- }
+ setFocus(!mCollapsed);
gFloaterView->refresh();
}
@@ -1198,23 +1190,43 @@ void LLSideTray::reshape(S32 width, S32 height, BOOL called_from_parent)
*/
LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& params)
{
+ LLPanel* new_panel = NULL;
+
// Look up the tab in the list of detached tabs.
child_vector_const_iter_t child_it;
for ( child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it)
{
- LLPanel* panel = openChildPanel(*child_it, panel_name, params);
- if (panel) return panel;
- }
+ new_panel = openChildPanel(*child_it, panel_name, params);
+ if (new_panel) break;
+ }
// Look up the tab in the list of attached tabs.
for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
- {
- LLPanel* panel = openChildPanel(*child_it, panel_name, params);
- if (panel) return panel;
+ {
+ new_panel = openChildPanel(*child_it, panel_name, params);
+ if (new_panel) break;
+ }
+
+ return new_panel;
+}
+
+void LLSideTray::hidePanel(const std::string& panel_name)
+{
+ LLPanel* panelp = getPanel(panel_name);
+ if (panelp)
+ {
+ if(isTabAttached(panel_name))
+ {
+ collapseSideBar();
+ }
+ else
+ {
+ LLFloaterReg::hideInstance("side_bar_tab", panel_name);
+ }
}
- return NULL;
}
+
void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params)
{
if(!sub_panel)
@@ -1304,6 +1316,42 @@ bool LLSideTray::isPanelActive(const std::string& panel_name)
return (panel->getName() == panel_name);
}
+void LLSideTray::setTabDocked(const std::string& tab_name, bool dock)
+{
+ LLSideTrayTab* tab = getTab(tab_name);
+ if (!tab)
+ { // not a docked tab, look through detached tabs
+ for(child_vector_iter_t tab_it = mDetachedTabs.begin(), tab_end_it = mDetachedTabs.end();
+ tab_it != tab_end_it;
+ ++tab_it)
+ {
+ if ((*tab_it)->getName() == tab_name)
+ {
+ tab = *tab_it;
+ break;
+ }
+ }
+
+ }
+
+ if (tab)
+ {
+ bool tab_attached = isTabAttached(tab_name);
+ LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
+ if (!floater_tab) return;
+
+ if (dock && !tab_attached)
+ {
+ tab->dock(floater_tab);
+ }
+ else if (!dock && tab_attached)
+ {
+ tab->undock(floater_tab);
+ }
+ }
+}
+
+
void LLSideTray::updateSidetrayVisibility()
{
// set visibility of parent container based on collapsed state
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index 184d78845f..2516b5689f 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -97,6 +97,8 @@ public:
*/
LLPanel* showPanel (const std::string& panel_name, const LLSD& params = LLSD());
+ void hidePanel (const std::string& panel_name);
+
/**
* Toggling Side Tray tab which contains "sub_panel" child of "panel_name" panel.
* If "sub_panel" is not visible Side Tray is opened to display it,
@@ -112,6 +114,8 @@ public:
LLPanel* getActivePanel ();
bool isPanelActive (const std::string& panel_name);
+ void setTabDocked(const std::string& tab_name, bool dock);
+
/*
* get the panel of given type T (don't show it or do anything else with it)
*/
@@ -215,7 +219,7 @@ private:
if (LLSideTray::instanceCreated())
LLSideTray::getInstance()->setEnabled(FALSE);
}
-
+
private:
LLPanel* mButtonsPanel;
typedef std::map<std::string,LLButton*> button_map_t;
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 0eac7d5e2a..45159de66e 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -1,3231 +1,3229 @@
-/**
- * @file llstartup.cpp
- * @brief startup routines.
- *
- * $LicenseInfo:firstyear=2004&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 "llviewerprecompiledheaders.h"
-
-#include "llstartup.h"
-
-#if LL_WINDOWS
-# include <process.h> // _spawnl()
-#else
-# include <sys/stat.h> // mkdir()
-#endif
-
-#include "llviewermedia_streamingaudio.h"
-#include "llaudioengine.h"
-
-#ifdef LL_FMOD
-# include "llaudioengine_fmod.h"
-#endif
-
-#ifdef LL_OPENAL
-#include "llaudioengine_openal.h"
-#endif
-
-#include "llares.h"
-#include "llavatarnamecache.h"
-#include "lllandmark.h"
-#include "llcachename.h"
-#include "lldir.h"
-#include "llerrorcontrol.h"
-#include "llfloaterreg.h"
-#include "llfocusmgr.h"
-#include "llhttpsender.h"
-#include "llimfloater.h"
-#include "lllocationhistory.h"
-#include "llimageworker.h"
-
-#include "llloginflags.h"
-#include "llmd5.h"
-#include "llmemorystream.h"
-#include "llmessageconfig.h"
-#include "llmoveview.h"
-#include "llnearbychat.h"
-#include "llnotifications.h"
-#include "llnotificationsutil.h"
-#include "llteleporthistory.h"
-#include "llregionhandle.h"
-#include "llsd.h"
-#include "llsdserialize.h"
-#include "llsdutil_math.h"
-#include "llsecondlifeurls.h"
-#include "llstring.h"
-#include "lluserrelations.h"
-#include "llversioninfo.h"
-#include "llviewercontrol.h"
-#include "llvfs.h"
-#include "llxorcipher.h" // saved password, MAC address
-#include "llwindow.h"
-#include "imageids.h"
-#include "message.h"
-#include "v3math.h"
-
-#include "llagent.h"
-#include "llagentcamera.h"
-#include "llagentpicksinfo.h"
-#include "llagentwearables.h"
-#include "llagentpilot.h"
-#include "llfloateravatarpicker.h"
-#include "llcallbacklist.h"
-#include "llcallingcard.h"
-#include "llconsole.h"
-#include "llcontainerview.h"
-#include "lldebugview.h"
-#include "lldrawable.h"
-#include "lleventnotifier.h"
-#include "llface.h"
-#include "llfeaturemanager.h"
-//#include "llfirstuse.h"
-#include "llfloaterhud.h"
-#include "llfloaterland.h"
-#include "llfloaterpreference.h"
-#include "llfloatertopobjects.h"
-#include "llfloaterworldmap.h"
-#include "llgesturemgr.h"
-#include "llgroupmgr.h"
-#include "llhudeffecttrail.h"
-#include "llhudmanager.h"
-#include "llhttpclient.h"
-#include "llimagebmp.h"
-#include "llinventorybridge.h"
-#include "llinventorymodel.h"
-#include "llinventorymodelbackgroundfetch.h"
-#include "llkeyboard.h"
-#include "llloginhandler.h" // gLoginHandler, SLURL support
-#include "lllogininstance.h" // Host the login module.
-#include "llpanellogin.h"
-#include "llmutelist.h"
-#include "llavatarpropertiesprocessor.h"
-#include "llpanelclassified.h"
-#include "llpanelpick.h"
-#include "llpanelgrouplandmoney.h"
-#include "llpanelgroupnotices.h"
-#include "llpreview.h"
-#include "llpreviewscript.h"
-#include "llproductinforequest.h"
-#include "llsecondlifeurls.h"
-#include "llselectmgr.h"
-#include "llsky.h"
-#include "llsidetray.h"
-#include "llstatview.h"
-#include "llstatusbar.h" // sendMoneyBalanceRequest(), owns L$ balance
-#include "llsurface.h"
-#include "lltexturecache.h"
-#include "lltexturefetch.h"
-#include "lltoolmgr.h"
-#include "lltrans.h"
-#include "llui.h"
-#include "llurldispatcher.h"
-#include "llurlentry.h"
-#include "llslurl.h"
-#include "llurlhistory.h"
-#include "llurlwhitelist.h"
-#include "llvieweraudio.h"
-#include "llviewerassetstorage.h"
-#include "llviewercamera.h"
-#include "llviewerdisplay.h"
-#include "llviewergenericmessage.h"
-#include "llviewergesture.h"
-#include "llviewertexturelist.h"
-#include "llviewermedia.h"
-#include "llviewermenu.h"
-#include "llviewermessage.h"
-#include "llviewernetwork.h"
-#include "llviewerobjectlist.h"
-#include "llviewerparcelmedia.h"
-#include "llviewerparcelmgr.h"
-#include "llviewerregion.h"
-#include "llviewerstats.h"
-#include "llviewerthrottle.h"
-#include "llviewerwindow.h"
-#include "llvoavatar.h"
-#include "llvoavatarself.h"
-#include "llvoclouds.h"
-#include "llweb.h"
-#include "llworld.h"
-#include "llworldmapmessage.h"
-#include "llxfermanager.h"
-#include "pipeline.h"
-#include "llappviewer.h"
-#include "llfasttimerview.h"
-#include "llfloatermap.h"
-#include "llweb.h"
-#include "llvoiceclient.h"
-#include "llnamelistctrl.h"
-#include "llnamebox.h"
-#include "llnameeditor.h"
-#include "llpostprocess.h"
-#include "llwlparammanager.h"
-#include "llwaterparammanager.h"
-#include "llagentlanguage.h"
-#include "llwearable.h"
-#include "llinventorybridge.h"
-#include "llappearancemgr.h"
-#include "llavatariconctrl.h"
-#include "llvoicechannel.h"
-
-#include "lllogin.h"
-#include "llevents.h"
-#include "llstartuplistener.h"
-
-#if LL_WINDOWS
-#include "lldxhardware.h"
-#endif
-
-//
-// exported globals
-//
-bool gAgentMovementCompleted = false;
-S32 gMaxAgentGroups;
-
-std::string SCREEN_HOME_FILENAME = "screen_home.bmp";
-std::string SCREEN_LAST_FILENAME = "screen_last.bmp";
-
-LLPointer<LLViewerTexture> gStartTexture;
-
-//
-// Imported globals
-//
-extern S32 gStartImageWidth;
-extern S32 gStartImageHeight;
-
-//
-// local globals
-//
-static bool gGotUseCircuitCodeAck = false;
-static std::string sInitialOutfit;
-static std::string sInitialOutfitGender; // "male" or "female"
-static boost::signals2::connection sWearablesLoadedCon;
-
-static bool gUseCircuitCallbackCalled = false;
-
-EStartupState LLStartUp::gStartupState = STATE_FIRST;
-LLSLURL LLStartUp::sStartSLURL;
-
-static LLPointer<LLCredential> gUserCredential;
-static std::string gDisplayName;
-static BOOL gRememberPassword = TRUE;
-
-static U64 gFirstSimHandle = 0;
-static LLHost gFirstSim;
-static std::string gFirstSimSeedCap;
-static LLVector3 gAgentStartLookAt(1.0f, 0.f, 0.f);
-static std::string gAgentStartLocation = "safe";
-static bool mLoginStatePastUI = false;
-
-
-boost::scoped_ptr<LLEventPump> LLStartUp::sStateWatcher(new LLEventStream("StartupState"));
-boost::scoped_ptr<LLStartupListener> LLStartUp::sListener(new LLStartupListener());
-
-//
-// local function declaration
-//
-
-void login_show();
-void login_callback(S32 option, void* userdata);
-void show_first_run_dialog();
-bool first_run_dialog_callback(const LLSD& notification, const LLSD& response);
-void set_startup_status(const F32 frac, const std::string& string, const std::string& msg);
-bool login_alert_status(const LLSD& notification, const LLSD& response);
-void login_packet_failed(void**, S32 result);
-void use_circuit_callback(void**, S32 result);
-void register_viewer_callbacks(LLMessageSystem* msg);
-void asset_callback_nothing(LLVFS*, const LLUUID&, LLAssetType::EType, void*, S32);
-bool callback_choose_gender(const LLSD& notification, const LLSD& response);
-void init_start_screen(S32 location_id);
-void release_start_screen();
-void reset_login();
-LLSD transform_cert_args(LLPointer<LLCertificate> cert);
-void general_cert_done(const LLSD& notification, const LLSD& response);
-void trust_cert_done(const LLSD& notification, const LLSD& response);
-void apply_udp_blacklist(const std::string& csv);
-bool process_login_success_response();
-void transition_back_to_login_panel(const std::string& emsg);
-
-void callback_cache_name(const LLUUID& id, const std::string& full_name, bool is_group)
-{
- LLNameBox::refreshAll(id, full_name, is_group);
- LLNameEditor::refreshAll(id, full_name, is_group);
-
- // TODO: Actually be intelligent about the refresh.
- // For now, just brute force refresh the dialogs.
- dialog_refresh_all();
-}
-
-//
-// exported functionality
-//
-
-//
-// local classes
-//
-
-namespace
-{
- class LLNullHTTPSender : public LLHTTPSender
- {
- virtual void send(const LLHost& host,
- const std::string& message, const LLSD& body,
- LLHTTPClient::ResponderPtr response) const
- {
- LL_WARNS("AppInit") << " attemped to send " << message << " to " << host
- << " with null sender" << LL_ENDL;
- }
- };
-}
-
-void update_texture_fetch()
-{
- LLAppViewer::getTextureCache()->update(1); // unpauses the texture cache thread
- LLAppViewer::getImageDecodeThread()->update(1); // unpauses the image thread
- LLAppViewer::getTextureFetch()->update(1); // unpauses the texture fetch thread
- gTextureList.updateImages(0.10f);
-}
-
-// Returns false to skip other idle processing. Should only return
-// true when all initialization done.
-bool idle_startup()
-{
- LLMemType mt1(LLMemType::MTYPE_STARTUP);
-
- const F32 PRECACHING_DELAY = gSavedSettings.getF32("PrecachingDelay");
- static LLTimer timeout;
- static S32 timeout_count = 0;
-
- static LLTimer login_time;
-
- // until this is encapsulated, this little hack for the
- // auth/transform loop will do.
- static F32 progress = 0.10f;
-
- static std::string auth_desc;
- static std::string auth_message;
-
- static LLVector3 initial_sun_direction(1.f, 0.f, 0.f);
- static LLVector3 agent_start_position_region(10.f, 10.f, 10.f); // default for when no space server
-
- // last location by default
- static S32 agent_location_id = START_LOCATION_ID_LAST;
- static S32 location_which = START_LOCATION_ID_LAST;
-
- static bool show_connect_box = true;
-
- //static bool stipend_since_login = false;
-
- // HACK: These are things from the main loop that usually aren't done
- // until initialization is complete, but need to be done here for things
- // to work.
- gIdleCallbacks.callFunctions();
- gViewerWindow->updateUI();
- LLMortician::updateClass();
-
- const std::string delims (" ");
- std::string system;
- int begIdx, endIdx;
- std::string osString = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
-
- begIdx = osString.find_first_not_of (delims);
- endIdx = osString.find_first_of (delims, begIdx);
- system = osString.substr (begIdx, endIdx - begIdx);
- system += "Locale";
-
- LLStringUtil::setLocale (LLTrans::getString(system));
-
- if (!gNoRender)
- {
- //note: Removing this line will cause incorrect button size in the login screen. -- bao.
- gTextureList.updateImages(0.01f) ;
- }
-
- if ( STATE_FIRST == LLStartUp::getStartupState() )
- {
- gViewerWindow->showCursor();
- gViewerWindow->getWindow()->setCursor(UI_CURSOR_WAIT);
-
- /////////////////////////////////////////////////
- //
- // Initialize stuff that doesn't need data from simulators
- //
-
- if (LLFeatureManager::getInstance()->isSafe())
- {
- LLNotificationsUtil::add("DisplaySetToSafe");
- }
- else if ((gSavedSettings.getS32("LastFeatureVersion") < LLFeatureManager::getInstance()->getVersion()) &&
- (gSavedSettings.getS32("LastFeatureVersion") != 0))
- {
- LLNotificationsUtil::add("DisplaySetToRecommended");
- }
- else if ((gSavedSettings.getS32("LastGPUClass") != LLFeatureManager::getInstance()->getGPUClass()) &&
- (gSavedSettings.getS32("LastGPUClass") != -1))
- {
- LLNotificationsUtil::add("DisplaySetToRecommended");
- }
- else if (!gViewerWindow->getInitAlert().empty())
- {
- LLNotificationsUtil::add(gViewerWindow->getInitAlert());
- }
-
- gSavedSettings.setS32("LastFeatureVersion", LLFeatureManager::getInstance()->getVersion());
- gSavedSettings.setS32("LastGPUClass", LLFeatureManager::getInstance()->getGPUClass());
-
- // load dynamic GPU/feature tables from website (S3)
- LLFeatureManager::getInstance()->fetchHTTPTables();
-
- std::string xml_file = LLUI::locateSkin("xui_version.xml");
- LLXMLNodePtr root;
- bool xml_ok = false;
- if (LLXMLNode::parseFile(xml_file, root, NULL))
- {
- if( (root->hasName("xui_version") ) )
- {
- std::string value = root->getValue();
- F32 version = 0.0f;
- LLStringUtil::convertToF32(value, version);
- if (version >= 1.0f)
- {
- xml_ok = true;
- }
- }
- }
- if (!xml_ok)
- {
- // If XML is bad, there's a good possibility that notifications.xml is ALSO bad.
- // If that's so, then we'll get a fatal error on attempting to load it,
- // which will display a nontranslatable error message that says so.
- // Otherwise, we'll display a reasonable error message that IS translatable.
- LLAppViewer::instance()->earlyExit("BadInstallation");
- }
- //
- // Statistics stuff
- //
-
- // Load autopilot and stats stuff
- gAgentPilot.load(gSavedSettings.getString("StatsPilotFile"));
-
- //gErrorStream.setTime(gSavedSettings.getBOOL("LogTimestamps"));
-
- // Load the throttle settings
- gViewerThrottle.load();
-
- if (ll_init_ares() == NULL || !gAres->isInitialized())
- {
- std::string diagnostic = "Could not start address resolution system";
- LL_WARNS("AppInit") << diagnostic << LL_ENDL;
- LLAppViewer::instance()->earlyExit("LoginFailedNoNetwork", LLSD().with("DIAGNOSTIC", diagnostic));
- }
-
- //
- // Initialize messaging system
- //
- LL_DEBUGS("AppInit") << "Initializing messaging system..." << LL_ENDL;
-
- std::string message_template_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"message_template.msg");
-
- LLFILE* found_template = NULL;
- found_template = LLFile::fopen(message_template_path, "r"); /* Flawfinder: ignore */
-
- #if LL_WINDOWS
- // On the windows dev builds, unpackaged, the message_template.msg
- // file will be located in:
- // build-vc**/newview/<config>/app_settings
- if (!found_template)
- {
- message_template_path = gDirUtilp->getExpandedFilename(LL_PATH_EXECUTABLE, "app_settings", "message_template.msg");
- found_template = LLFile::fopen(message_template_path.c_str(), "r"); /* Flawfinder: ignore */
- }
- #elif LL_DARWIN
- // On Mac dev builds, message_template.msg lives in:
- // indra/build-*/newview/<config>/Second Life/Contents/Resources/app_settings
- if (!found_template)
- {
- message_template_path =
- gDirUtilp->getExpandedFilename(LL_PATH_EXECUTABLE,
- "../Resources/app_settings",
- "message_template.msg");
- found_template = LLFile::fopen(message_template_path.c_str(), "r"); /* Flawfinder: ignore */
- }
- #endif
-
- if (found_template)
- {
- fclose(found_template);
-
- U32 port = gSavedSettings.getU32("UserConnectionPort");
-
- if ((NET_USE_OS_ASSIGNED_PORT == port) && // if nothing specified on command line (-port)
- (gSavedSettings.getBOOL("ConnectionPortEnabled")))
- {
- port = gSavedSettings.getU32("ConnectionPort");
- }
-
- LLHTTPSender::setDefaultSender(new LLNullHTTPSender());
-
- // TODO parameterize
- const F32 circuit_heartbeat_interval = 5;
- const F32 circuit_timeout = 100;
-
- const LLUseCircuitCodeResponder* responder = NULL;
- bool failure_is_fatal = true;
-
- if(!start_messaging_system(
- message_template_path,
- port,
- LLVersionInfo::getMajor(),
- LLVersionInfo::getMinor(),
- LLVersionInfo::getPatch(),
- FALSE,
- std::string(),
- responder,
- failure_is_fatal,
- circuit_heartbeat_interval,
- circuit_timeout))
- {
- std::string diagnostic = llformat(" Error: %d", gMessageSystem->getErrorCode());
- LL_WARNS("AppInit") << diagnostic << LL_ENDL;
- LLAppViewer::instance()->earlyExit("LoginFailedNoNetwork", LLSD().with("DIAGNOSTIC", diagnostic));
- }
-
- #if LL_WINDOWS
- // On the windows dev builds, unpackaged, the message.xml file will
- // be located in indra/build-vc**/newview/<config>/app_settings.
- std::string message_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"message.xml");
-
- if (!LLFile::isfile(message_path.c_str()))
- {
- LLMessageConfig::initClass("viewer", gDirUtilp->getExpandedFilename(LL_PATH_EXECUTABLE, "app_settings", ""));
- }
- else
- {
- LLMessageConfig::initClass("viewer", gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
- }
- #else
- LLMessageConfig::initClass("viewer", gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
- #endif
-
- }
- else
- {
- LLAppViewer::instance()->earlyExit("MessageTemplateNotFound", LLSD().with("PATH", message_template_path));
- }
-
- if(gMessageSystem && gMessageSystem->isOK())
- {
- // Initialize all of the callbacks in case of bad message
- // system data
- LLMessageSystem* msg = gMessageSystem;
- msg->setExceptionFunc(MX_UNREGISTERED_MESSAGE,
- invalid_message_callback,
- NULL);
- msg->setExceptionFunc(MX_PACKET_TOO_SHORT,
- invalid_message_callback,
- NULL);
-
- // running off end of a packet is now valid in the case
- // when a reader has a newer message template than
- // the sender
- /*msg->setExceptionFunc(MX_RAN_OFF_END_OF_PACKET,
- invalid_message_callback,
- NULL);*/
- msg->setExceptionFunc(MX_WROTE_PAST_BUFFER_SIZE,
- invalid_message_callback,
- NULL);
-
- if (gSavedSettings.getBOOL("LogMessages"))
- {
- LL_DEBUGS("AppInit") << "Message logging activated!" << LL_ENDL;
- msg->startLogging();
- }
-
- // start the xfer system. by default, choke the downloads
- // a lot...
- const S32 VIEWER_MAX_XFER = 3;
- start_xfer_manager(gVFS);
- gXferManager->setMaxIncomingXfers(VIEWER_MAX_XFER);
- F32 xfer_throttle_bps = gSavedSettings.getF32("XferThrottle");
- if (xfer_throttle_bps > 1.f)
- {
- gXferManager->setUseAckThrottling(TRUE);
- gXferManager->setAckThrottleBPS(xfer_throttle_bps);
- }
- gAssetStorage = new LLViewerAssetStorage(msg, gXferManager, gVFS, gStaticVFS);
-
-
- F32 dropPercent = gSavedSettings.getF32("PacketDropPercentage");
- msg->mPacketRing.setDropPercentage(dropPercent);
-
- F32 inBandwidth = gSavedSettings.getF32("InBandwidth");
- F32 outBandwidth = gSavedSettings.getF32("OutBandwidth");
- if (inBandwidth != 0.f)
- {
- LL_DEBUGS("AppInit") << "Setting packetring incoming bandwidth to " << inBandwidth << LL_ENDL;
- msg->mPacketRing.setUseInThrottle(TRUE);
- msg->mPacketRing.setInBandwidth(inBandwidth);
- }
- if (outBandwidth != 0.f)
- {
- LL_DEBUGS("AppInit") << "Setting packetring outgoing bandwidth to " << outBandwidth << LL_ENDL;
- msg->mPacketRing.setUseOutThrottle(TRUE);
- msg->mPacketRing.setOutBandwidth(outBandwidth);
- }
- }
-
- LL_INFOS("AppInit") << "Message System Initialized." << LL_ENDL;
-
- //-------------------------------------------------
- // Init audio, which may be needed for prefs dialog
- // or audio cues in connection UI.
- //-------------------------------------------------
-
- if (FALSE == gSavedSettings.getBOOL("NoAudio"))
- {
- gAudiop = NULL;
-
-#ifdef LL_OPENAL
- if (!gAudiop
-#if !LL_WINDOWS
- && NULL == getenv("LL_BAD_OPENAL_DRIVER")
-#endif // !LL_WINDOWS
- )
- {
- gAudiop = (LLAudioEngine *) new LLAudioEngine_OpenAL();
- }
-#endif
-
-#ifdef LL_FMOD
- if (!gAudiop
-#if !LL_WINDOWS
- && NULL == getenv("LL_BAD_FMOD_DRIVER")
-#endif // !LL_WINDOWS
- )
- {
- gAudiop = (LLAudioEngine *) new LLAudioEngine_FMOD();
- }
-#endif
-
- if (gAudiop)
- {
-#if LL_WINDOWS
- // FMOD on Windows needs the window handle to stop playing audio
- // when window is minimized. JC
- void* window_handle = (HWND)gViewerWindow->getPlatformWindow();
-#else
- void* window_handle = NULL;
-#endif
- bool init = gAudiop->init(kAUDIO_NUM_SOURCES, window_handle);
- if(init)
- {
- gAudiop->setMuted(TRUE);
- }
- else
- {
- LL_WARNS("AppInit") << "Unable to initialize audio engine" << LL_ENDL;
- delete gAudiop;
- gAudiop = NULL;
- }
-
- if (gAudiop)
- {
- // if the audio engine hasn't set up its own preferred handler for streaming audio then set up the generic streaming audio implementation which uses media plugins
- if (NULL == gAudiop->getStreamingAudioImpl())
- {
- LL_INFOS("AppInit") << "Using media plugins to render streaming audio" << LL_ENDL;
- gAudiop->setStreamingAudioImpl(new LLStreamingAudio_MediaPlugins());
- }
- }
- }
- }
-
- LL_INFOS("AppInit") << "Audio Engine Initialized." << LL_ENDL;
-
- if (LLTimer::knownBadTimer())
- {
- LL_WARNS("AppInit") << "Unreliable timers detected (may be bad PCI chipset)!!" << LL_ENDL;
- }
-
- //
- // Log on to system
- //
- if (gUserCredential.isNull())
- {
- gUserCredential = gLoginHandler.initializeLoginInfo();
- }
- if (gUserCredential.isNull())
- {
- show_connect_box = TRUE;
- }
- else if (gSavedSettings.getBOOL("AutoLogin"))
- {
- gRememberPassword = TRUE;
- gSavedSettings.setBOOL("RememberPassword", TRUE);
- show_connect_box = false;
- }
- else
- {
- gRememberPassword = gSavedSettings.getBOOL("RememberPassword");
- show_connect_box = TRUE;
- }
- // Go to the next startup state
- LLStartUp::setStartupState( STATE_BROWSER_INIT );
- return FALSE;
- }
-
-
- if (STATE_BROWSER_INIT == LLStartUp::getStartupState())
- {
- LL_DEBUGS("AppInit") << "STATE_BROWSER_INIT" << LL_ENDL;
- std::string msg = LLTrans::getString("LoginInitializingBrowser");
- set_startup_status(0.03f, msg.c_str(), gAgent.mMOTD.c_str());
- display_startup();
- // LLViewerMedia::initBrowser();
- LLStartUp::setStartupState( STATE_LOGIN_SHOW );
- return FALSE;
- }
-
-
- if (STATE_LOGIN_SHOW == LLStartUp::getStartupState())
- {
- LL_DEBUGS("AppInit") << "Initializing Window" << LL_ENDL;
-
- // if we've gone backwards in the login state machine, to this state where we show the UI
- // AND the debug setting to exit in this case is true, then go ahead and bail quickly
- if ( mLoginStatePastUI && gSavedSettings.getBOOL("QuitOnLoginActivated") )
- {
- // no requirement for notification here - just exit
- LLAppViewer::instance()->earlyExitNoNotify();
- }
-
- gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW);
-
- timeout_count = 0;
-
- if (show_connect_box)
- {
- // Load all the name information out of the login view
- // NOTE: Hits "Attempted getFields with no login view shown" warning, since we don't
- // show the login view until login_show() is called below.
- if (gUserCredential.isNull())
- {
- gUserCredential = gLoginHandler.initializeLoginInfo();
- }
- if (gNoRender)
- {
- LL_ERRS("AppInit") << "Need to autologin or use command line with norender!" << LL_ENDL;
- }
- // Make sure the process dialog doesn't hide things
- gViewerWindow->setShowProgress(FALSE);
-
- initialize_edit_menu();
-
- // Show the login dialog
- login_show();
- // connect dialog is already shown, so fill in the names
- if (gUserCredential.notNull())
- {
- LLPanelLogin::setFields( gUserCredential, gRememberPassword);
- }
- LLPanelLogin::giveFocus();
-
- gSavedSettings.setBOOL("FirstRunThisInstall", FALSE);
-
- LLStartUp::setStartupState( STATE_LOGIN_WAIT ); // Wait for user input
- }
- else
- {
- // skip directly to message template verification
- LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
- }
-
- // *NOTE: This is where LLViewerParcelMgr::getInstance() used to get allocated before becoming LLViewerParcelMgr::getInstance().
-
- // *NOTE: This is where gHUDManager used to bet allocated before becoming LLHUDManager::getInstance().
-
- // *NOTE: This is where gMuteList used to get allocated before becoming LLMuteList::getInstance().
-
- // Login screen needs menus for preferences, but we can enter
- // this startup phase more than once.
- if (gLoginMenuBarView == NULL)
- {
- init_menus();
- }
-
- gViewerWindow->setNormalControlsVisible( FALSE );
- gLoginMenuBarView->setVisible( TRUE );
- gLoginMenuBarView->setEnabled( TRUE );
-
- // Hide the splash screen
- LLSplashScreen::hide();
-
- // Push our window frontmost
- gViewerWindow->getWindow()->show();
- display_startup();
-
- // DEV-16927. The following code removes errant keystrokes that happen while the window is being
- // first made visible.
-#ifdef _WIN32
- MSG msg;
- while( PeekMessage( &msg, /*All hWnds owned by this thread */ NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE ) );
-#endif
- timeout.reset();
- return FALSE;
- }
-
- if (STATE_LOGIN_WAIT == LLStartUp::getStartupState())
- {
- // when we get to this state, we've already been past the login UI
- // (possiblely automatically) - flag this so we can test in the
- // STATE_LOGIN_SHOW state if we've gone backwards
- mLoginStatePastUI = true;
-
- // Don't do anything. Wait for the login view to call the login_callback,
- // which will push us to the next state.
-
- // Sleep so we don't spin the CPU
- ms_sleep(1);
- return FALSE;
- }
-
- if (STATE_LOGIN_CLEANUP == LLStartUp::getStartupState())
- {
- //reset the values that could have come in from a slurl
- // DEV-42215: Make sure they're not empty -- gUserCredential
- // might already have been set from gSavedSettings, and it's too bad
- // to overwrite valid values with empty strings.
-
- if (show_connect_box)
- {
- // TODO if not use viewer auth
- // Load all the name information out of the login view
- LLPanelLogin::getFields(gUserCredential, gRememberPassword);
- // end TODO
-
- // HACK: Try to make not jump on login
- gKeyboard->resetKeys();
- }
-
- // when we get to this state, we've already been past the login UI
- // (possiblely automatically) - flag this so we can test in the
- // STATE_LOGIN_SHOW state if we've gone backwards
- mLoginStatePastUI = true;
-
- // save the credentials
- std::string userid = "unknown";
- if(gUserCredential.notNull())
- {
- userid = gUserCredential->userID();
- gSecAPIHandler->saveCredential(gUserCredential, gRememberPassword);
- }
- gSavedSettings.setBOOL("RememberPassword", gRememberPassword);
- LL_INFOS("AppInit") << "Attempting login as: " << userid << LL_ENDL;
- gDebugInfo["LoginName"] = userid;
-
- // create necessary directories
- // *FIX: these mkdir's should error check
- gDirUtilp->setLindenUserDir(userid);
- LLFile::mkdir(gDirUtilp->getLindenUserDir());
-
- // Set PerAccountSettingsFile to the default value.
- std::string per_account_settings_file = LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount");
- gSavedSettings.setString("PerAccountSettingsFile",
- gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT,
- LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount")));
-
- // Note: can't store warnings files per account because some come up before login
-
- // Overwrite default user settings with user settings
- LLAppViewer::instance()->loadSettingsFromDirectory("Account");
-
- // Need to set the LastLogoff time here if we don't have one. LastLogoff is used for "Recent Items" calculation
- // and startup time is close enough if we don't have a real value.
- if (gSavedPerAccountSettings.getU32("LastLogoff") == 0)
- {
- gSavedPerAccountSettings.setU32("LastLogoff", time_corrected());
- }
-
- //Default the path if one isn't set.
- // *NOTE: unable to check variable differ from "InstantMessageLogPath" because it was
- // provided in pre 2.0 viewer. See EXT-6661
- if (gSavedPerAccountSettings.getString("InstantMessageLogPath").empty())
- {
- gDirUtilp->setChatLogsDir(gDirUtilp->getOSUserAppDir());
- gSavedPerAccountSettings.setString("InstantMessageLogPath", gDirUtilp->getChatLogsDir());
- }
- else
- {
- gDirUtilp->setChatLogsDir(gSavedPerAccountSettings.getString("InstantMessageLogPath"));
- }
- gDirUtilp->setPerAccountChatLogsDir(userid);
-
- LLFile::mkdir(gDirUtilp->getChatLogsDir());
- LLFile::mkdir(gDirUtilp->getPerAccountChatLogsDir());
-
-
- //good a place as any to create user windlight directories
- std::string user_windlight_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight", ""));
- LLFile::mkdir(user_windlight_path_name.c_str());
-
- std::string user_windlight_skies_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", ""));
- LLFile::mkdir(user_windlight_skies_path_name.c_str());
-
- std::string user_windlight_water_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", ""));
- LLFile::mkdir(user_windlight_water_path_name.c_str());
-
- std::string user_windlight_days_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/days", ""));
- LLFile::mkdir(user_windlight_days_path_name.c_str());
-
-
- if (show_connect_box)
- {
- LLSLURL slurl;
- LLPanelLogin::closePanel();
- }
-
-
- // Load URL History File
- LLURLHistory::loadFile("url_history.xml");
- // Load location history
- LLLocationHistory::getInstance()->load();
-
- // Load Avatars icons cache
- LLAvatarIconIDCache::getInstance()->load();
-
- // Load media plugin cookies
- LLViewerMedia::loadCookieFile();
-
- //-------------------------------------------------
- // Handle startup progress screen
- //-------------------------------------------------
-
- // on startup the user can request to go to their home,
- // their last location, or some URL "-url //sim/x/y[/z]"
- // All accounts have both a home and a last location, and we don't support
- // more locations than that. Choose the appropriate one. JC
- switch (LLStartUp::getStartSLURL().getType())
- {
- case LLSLURL::LOCATION:
- agent_location_id = START_LOCATION_ID_URL;
- location_which = START_LOCATION_ID_LAST;
- break;
- case LLSLURL::LAST_LOCATION:
- agent_location_id = START_LOCATION_ID_LAST;
- location_which = START_LOCATION_ID_LAST;
- break;
- default:
- agent_location_id = START_LOCATION_ID_HOME;
- location_which = START_LOCATION_ID_HOME;
- break;
- }
-
- gViewerWindow->getWindow()->setCursor(UI_CURSOR_WAIT);
-
- if (!gNoRender)
- {
- init_start_screen(agent_location_id);
- }
-
- // Display the startup progress bar.
- gViewerWindow->setShowProgress(TRUE);
- gViewerWindow->setProgressCancelButtonVisible(TRUE, LLTrans::getString("Quit"));
-
- // Poke the VFS, which could potentially block for a while if
- // Windows XP is acting up
- set_startup_status(0.07f, LLTrans::getString("LoginVerifyingCache"), LLStringUtil::null);
- display_startup();
-
- gVFS->pokeFiles();
-
- LLStartUp::setStartupState( STATE_LOGIN_AUTH_INIT );
-
- return FALSE;
- }
-
- if(STATE_LOGIN_AUTH_INIT == LLStartUp::getStartupState())
- {
- gDebugInfo["GridName"] = LLGridManager::getInstance()->getGridLabel();
-
- // Update progress status and the display loop.
- auth_desc = LLTrans::getString("LoginInProgress");
- set_startup_status(progress, auth_desc, auth_message);
- progress += 0.02f;
- display_startup();
-
- // Setting initial values...
- LLLoginInstance* login = LLLoginInstance::getInstance();
- login->setNotificationsInterface(LLNotifications::getInstance());
- if(gNoRender)
- {
- // HACK, skip optional updates if you're running drones
- login->setSkipOptionalUpdate(true);
- }
-
- login->setSerialNumber(LLAppViewer::instance()->getSerialNumber());
- login->setLastExecEvent(gLastExecEvent);
- login->setUpdaterLauncher(boost::bind(&LLAppViewer::launchUpdater, LLAppViewer::instance()));
-
- // This call to LLLoginInstance::connect() starts the
- // authentication process.
- login->connect(gUserCredential);
-
- LLStartUp::setStartupState( STATE_LOGIN_CURL_UNSTUCK );
- return FALSE;
- }
-
- if(STATE_LOGIN_CURL_UNSTUCK == LLStartUp::getStartupState())
- {
- // If we get here we have gotten past the potential stall
- // in curl, so take "may appear frozen" out of progress bar. JC
- auth_desc = LLTrans::getString("LoginInProgressNoFrozen");
- set_startup_status(progress, auth_desc, auth_message);
-
- LLStartUp::setStartupState( STATE_LOGIN_PROCESS_RESPONSE );
- return FALSE;
- }
-
- if(STATE_LOGIN_PROCESS_RESPONSE == LLStartUp::getStartupState())
- {
- std::ostringstream emsg;
- emsg << LLTrans::getString("LoginFailed") << "\n";
- if(LLLoginInstance::getInstance()->authFailure())
- {
- LL_INFOS("LLStartup") << "Login failed, LLLoginInstance::getResponse(): "
- << LLLoginInstance::getInstance()->getResponse() << LL_ENDL;
- LLSD response = LLLoginInstance::getInstance()->getResponse();
- // Still have error conditions that may need some
- // sort of handling.
- std::string reason_response = response["reason"];
- std::string message_response = response["message"];
-
- if(!message_response.empty())
- {
- // XUI: fix translation for strings returned during login
- // We need a generic table for translations
- std::string big_reason = LLAgent::sTeleportErrorMessages[ message_response ];
- if ( big_reason.size() == 0 )
- {
- emsg << message_response;
- }
- else
- {
- emsg << big_reason;
- }
- }
-
- if(reason_response == "key")
- {
- // Couldn't login because user/password is wrong
- // Clear the credential
- gUserCredential->clearAuthenticator();
- }
-
- if(reason_response == "update"
- || reason_response == "optional")
- {
- // In the case of a needed update, quit.
- // Its either downloading or declined.
- // If optional was skipped this case shouldn't
- // be reached.
- LLLoginInstance::getInstance()->disconnect();
- LLAppViewer::instance()->forceQuit();
- }
- else
- {
- if (reason_response != "tos")
- {
- // Don't pop up a notification in the TOS case because
- // LLFloaterTOS::onCancel() already scolded the user.
- std::string error_code;
- if(response.has("errorcode"))
- {
- error_code = response["errorcode"].asString();
- }
- if ((reason_response == "CURLError") &&
- (error_code == "SSL_CACERT" || error_code == "SSL_PEER_CERTIFICATE") &&
- response.has("certificate"))
- {
- // This was a certificate error, so grab the certificate
- // and throw up the appropriate dialog.
- LLPointer<LLCertificate> certificate = gSecAPIHandler->getCertificate(response["certificate"]);
- if(certificate)
- {
- LLSD args = transform_cert_args(certificate);
-
- if(error_code == "SSL_CACERT")
- {
- // if we are handling an untrusted CA, throw up the dialog
- // with the 'trust this CA' button.
- LLNotificationsUtil::add("TrustCertificateError", args, response,
- trust_cert_done);
-
- show_connect_box = true;
- }
- else
- {
- // the certificate exception returns a unique string for each type of exception.
- // we grab this string via the LLUserAuth object, and use that to grab the localized
- // string.
- args["REASON"] = LLTrans::getString(message_response);
-
- LLNotificationsUtil::add("GeneralCertificateError", args, response,
- general_cert_done);
-
- reset_login();
- gSavedSettings.setBOOL("AutoLogin", FALSE);
- show_connect_box = true;
-
- }
-
- }
- }
- else
- {
- // This wasn't a certificate error, so throw up the normal
- // notificatioin message.
- LLSD args;
- args["ERROR_MESSAGE"] = emsg.str();
- LL_INFOS("LLStartup") << "Notification: " << args << LL_ENDL;
- LLNotificationsUtil::add("ErrorMessage", args, LLSD(), login_alert_done);
- }
- }
- //setup map of datetime strings to codes and slt & local time offset from utc
- // *TODO: Does this need to be here?
- LLStringOps::setupDatetimeInfo (false);
- transition_back_to_login_panel(emsg.str());
- show_connect_box = true;
- }
- }
- else if(LLLoginInstance::getInstance()->authSuccess())
- {
- if(process_login_success_response())
- {
- // Pass the user information to the voice chat server interface.
- LLVoiceClient::getInstance()->userAuthorized(gUserCredential->userID(), gAgentID);
- // create the default proximal channel
- LLVoiceChannel::initClass();
- LLGridManager::getInstance()->setFavorite();
- LLStartUp::setStartupState( STATE_WORLD_INIT);
- }
- else
- {
- LLSD args;
- args["ERROR_MESSAGE"] = emsg.str();
- LL_INFOS("LLStartup") << "Notification: " << args << LL_ENDL;
- LLNotificationsUtil::add("ErrorMessage", args, LLSD(), login_alert_done);
- transition_back_to_login_panel(emsg.str());
- show_connect_box = true;
- return FALSE;
- }
- }
- return FALSE;
- }
-
- //---------------------------------------------------------------------
- // World Init
- //---------------------------------------------------------------------
- if (STATE_WORLD_INIT == LLStartUp::getStartupState())
- {
- set_startup_status(0.30f, LLTrans::getString("LoginInitializingWorld"), gAgent.mMOTD);
- display_startup();
- // We should have an agent id by this point.
- llassert(!(gAgentID == LLUUID::null));
-
- // Finish agent initialization. (Requires gSavedSettings, builds camera)
- gAgent.init();
- gAgentCamera.init();
- set_underclothes_menu_options();
-
- // Since we connected, save off the settings so the user doesn't have to
- // type the name/password again if we crash.
- gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);
- LLUIColorTable::instance().saveUserSettings();
-
- //
- // Initialize classes w/graphics stuff.
- //
- gTextureList.doPrefetchImages();
- LLSurface::initClasses();
-
- LLFace::initClass();
-
- LLDrawable::initClass();
-
- // init the shader managers
- LLPostProcess::initClass();
- LLWLParamManager::initClass();
- LLWaterParamManager::initClass();
-
- LLViewerObject::initVOClasses();
-
- // Initialize all our tools. Must be done after saved settings loaded.
- // NOTE: This also is where gToolMgr used to be instantiated before being turned into a singleton.
- LLToolMgr::getInstance()->initTools();
-
- // Pre-load floaters, like the world map, that are slow to spawn
- // due to XML complexity.
- gViewerWindow->initWorldUI();
-
- display_startup();
-
- // This is where we used to initialize gWorldp. Original comment said:
- // World initialization must be done after above window init
-
- // User might have overridden far clip
- LLWorld::getInstance()->setLandFarClip(gAgentCamera.mDrawDistance);
-
- // Before we create the first region, we need to set the agent's mOriginGlobal
- // This is necessary because creating objects before this is set will result in a
- // bad mPositionAgent cache.
-
- gAgent.initOriginGlobal(from_region_handle(gFirstSimHandle));
-
- LLWorld::getInstance()->addRegion(gFirstSimHandle, gFirstSim);
-
- LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(gFirstSimHandle);
- LL_INFOS("AppInit") << "Adding initial simulator " << regionp->getOriginGlobal() << LL_ENDL;
-
- regionp->setSeedCapability(gFirstSimSeedCap);
- LL_DEBUGS("AppInit") << "Waiting for seed grant ...." << LL_ENDL;
-
- // Set agent's initial region to be the one we just created.
- gAgent.setRegion(regionp);
-
- // Set agent's initial position, which will be read by LLVOAvatar when the avatar
- // object is created. I think this must be done after setting the region. JC
- gAgent.setPositionAgent(agent_start_position_region);
-
- display_startup();
- LLStartUp::setStartupState( STATE_MULTIMEDIA_INIT );
-
- return FALSE;
- }
-
-
- //---------------------------------------------------------------------
- // Load QuickTime/GStreamer and other multimedia engines, can be slow.
- // Do it while we're waiting on the network for our seed capability. JC
- //---------------------------------------------------------------------
- if (STATE_MULTIMEDIA_INIT == LLStartUp::getStartupState())
- {
- LLStartUp::multimediaInit();
- LLStartUp::setStartupState( STATE_FONT_INIT );
- return FALSE;
- }
-
- // Loading fonts takes several seconds
- if (STATE_FONT_INIT == LLStartUp::getStartupState())
- {
- LLStartUp::fontInit();
- LLStartUp::setStartupState( STATE_SEED_GRANTED_WAIT );
- return FALSE;
- }
-
- //---------------------------------------------------------------------
- // Wait for Seed Cap Grant
- //---------------------------------------------------------------------
- if(STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())
- {
- return FALSE;
- }
-
-
- //---------------------------------------------------------------------
- // Seed Capability Granted
- // no newMessage calls should happen before this point
- //---------------------------------------------------------------------
- if (STATE_SEED_CAP_GRANTED == LLStartUp::getStartupState())
- {
- update_texture_fetch();
-
- if ( gViewerWindow != NULL)
- { // This isn't the first logon attempt, so show the UI
- gViewerWindow->setNormalControlsVisible( TRUE );
- }
- gLoginMenuBarView->setVisible( FALSE );
- gLoginMenuBarView->setEnabled( FALSE );
-
- if (!gNoRender)
- {
- // direct logging to the debug console's line buffer
- LLError::logToFixedBuffer(gDebugView->mDebugConsolep);
-
- // set initial visibility of debug console
- gDebugView->mDebugConsolep->setVisible(gSavedSettings.getBOOL("ShowDebugConsole"));
- }
-
- //
- // Set message handlers
- //
- LL_INFOS("AppInit") << "Initializing communications..." << LL_ENDL;
-
- // register callbacks for messages. . . do this after initial handshake to make sure that we don't catch any unwanted
- register_viewer_callbacks(gMessageSystem);
-
- // Debugging info parameters
- gMessageSystem->setMaxMessageTime( 0.5f ); // Spam if decoding all msgs takes more than 500 ms
-
- #ifndef LL_RELEASE_FOR_DOWNLOAD
- gMessageSystem->setTimeDecodes( TRUE ); // Time the decode of each msg
- gMessageSystem->setTimeDecodesSpamThreshold( 0.05f ); // Spam if a single msg takes over 50ms to decode
- #endif
-
- gXferManager->registerCallbacks(gMessageSystem);
-
- LLStartUp::initNameCache();
-
- // update the voice settings *after* gCacheName initialization
- // so that we can construct voice UI that relies on the name cache
- LLVoiceClient::getInstance()->updateSettings();
-
- //gCacheName is required for nearby chat history loading
- //so I just moved nearby history loading a few states further
- if (!gNoRender && gSavedPerAccountSettings.getBOOL("LogShowHistory"))
- {
- LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();
- if (nearby_chat) nearby_chat->loadHistory();
- }
-
- // *Note: this is where gWorldMap used to be initialized.
-
- // register null callbacks for audio until the audio system is initialized
- gMessageSystem->setHandlerFuncFast(_PREHASH_SoundTrigger, null_message_callback, NULL);
- gMessageSystem->setHandlerFuncFast(_PREHASH_AttachedSound, null_message_callback, NULL);
-
- //reset statistics
- LLViewerStats::getInstance()->resetStats();
-
- display_startup();
- //
- // Set up region and surface defaults
- //
-
-
- // Sets up the parameters for the first simulator
-
- LL_DEBUGS("AppInit") << "Initializing camera..." << LL_ENDL;
- gFrameTime = totalTime();
- F32 last_time = gFrameTimeSeconds;
- gFrameTimeSeconds = (S64)(gFrameTime - gStartTime)/SEC_TO_MICROSEC;
-
- gFrameIntervalSeconds = gFrameTimeSeconds - last_time;
- if (gFrameIntervalSeconds < 0.f)
- {
- gFrameIntervalSeconds = 0.f;
- }
-
- // Make sure agent knows correct aspect ratio
- // FOV limits depend upon aspect ratio so this needs to happen before initializing the FOV below
- LLViewerCamera::getInstance()->setViewHeightInPixels(gViewerWindow->getWorldViewHeightRaw());
- LLViewerCamera::getInstance()->setAspect(gViewerWindow->getWorldViewAspectRatio());
- // Initialize FOV
- LLViewerCamera::getInstance()->setDefaultFOV(gSavedSettings.getF32("CameraAngle"));
-
- // Move agent to starting location. The position handed to us by
- // the space server is in global coordinates, but the agent frame
- // is in region local coordinates. Therefore, we need to adjust
- // the coordinates handed to us to fit in the local region.
-
- gAgent.setPositionAgent(agent_start_position_region);
- gAgent.resetAxes(gAgentStartLookAt);
- gAgentCamera.stopCameraAnimation();
- gAgentCamera.resetCamera();
-
- // Initialize global class data needed for surfaces (i.e. textures)
- if (!gNoRender)
- {
- LL_DEBUGS("AppInit") << "Initializing sky..." << LL_ENDL;
- // Initialize all of the viewer object classes for the first time (doing things like texture fetches.
- LLGLState::checkStates();
- LLGLState::checkTextureChannels();
-
- gSky.init(initial_sun_direction);
-
- LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- }
-
- LL_DEBUGS("AppInit") << "Decoding images..." << LL_ENDL;
- // For all images pre-loaded into viewer cache, decode them.
- // Need to do this AFTER we init the sky
- const S32 DECODE_TIME_SEC = 2;
- for (int i = 0; i < DECODE_TIME_SEC; i++)
- {
- F32 frac = (F32)i / (F32)DECODE_TIME_SEC;
- set_startup_status(0.45f + frac*0.1f, LLTrans::getString("LoginDecodingImages"), gAgent.mMOTD);
- display_startup();
- gTextureList.decodeAllImages(1.f);
- }
- LLStartUp::setStartupState( STATE_WORLD_WAIT );
-
- // JC - Do this as late as possible to increase likelihood Purify
- // will run.
- LLMessageSystem* msg = gMessageSystem;
- if (!msg->mOurCircuitCode)
- {
- LL_WARNS("AppInit") << "Attempting to connect to simulator with a zero circuit code!" << LL_ENDL;
- }
-
- gUseCircuitCallbackCalled = false;
-
- msg->enableCircuit(gFirstSim, TRUE);
- // now, use the circuit info to tell simulator about us!
- LL_INFOS("AppInit") << "viewer: UserLoginLocationReply() Enabling " << gFirstSim << " with code " << msg->mOurCircuitCode << LL_ENDL;
- msg->newMessageFast(_PREHASH_UseCircuitCode);
- msg->nextBlockFast(_PREHASH_CircuitCode);
- msg->addU32Fast(_PREHASH_Code, msg->mOurCircuitCode);
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->addUUIDFast(_PREHASH_ID, gAgent.getID());
- msg->sendReliable(
- gFirstSim,
- gSavedSettings.getS32("UseCircuitCodeMaxRetries"),
- FALSE,
- gSavedSettings.getF32("UseCircuitCodeTimeout"),
- use_circuit_callback,
- NULL);
-
- timeout.reset();
-
- return FALSE;
- }
-
- //---------------------------------------------------------------------
- // Agent Send
- //---------------------------------------------------------------------
- if(STATE_WORLD_WAIT == LLStartUp::getStartupState())
- {
- LL_DEBUGS("AppInit") << "Waiting for simulator ack...." << LL_ENDL;
- set_startup_status(0.59f, LLTrans::getString("LoginWaitingForRegionHandshake"), gAgent.mMOTD);
- if(gGotUseCircuitCodeAck)
- {
- LLStartUp::setStartupState( STATE_AGENT_SEND );
- }
- LLMessageSystem* msg = gMessageSystem;
- while (msg->checkAllMessages(gFrameCount, gServicePump))
- {
- }
- msg->processAcks();
- return FALSE;
- }
-
- //---------------------------------------------------------------------
- // Agent Send
- //---------------------------------------------------------------------
- if (STATE_AGENT_SEND == LLStartUp::getStartupState())
- {
- LL_DEBUGS("AppInit") << "Connecting to region..." << LL_ENDL;
- set_startup_status(0.60f, LLTrans::getString("LoginConnectingToRegion"), gAgent.mMOTD);
- // register with the message system so it knows we're
- // expecting this message
- LLMessageSystem* msg = gMessageSystem;
- msg->setHandlerFuncFast(
- _PREHASH_AgentMovementComplete,
- process_agent_movement_complete);
- LLViewerRegion* regionp = gAgent.getRegion();
- if(regionp)
- {
- send_complete_agent_movement(regionp->getHost());
- gAssetStorage->setUpstream(regionp->getHost());
- gCacheName->setUpstream(regionp->getHost());
- msg->newMessageFast(_PREHASH_EconomyDataRequest);
- gAgent.sendReliableMessage();
- }
-
- // Create login effect
- // But not on first login, because you can't see your avatar then
- if (!gAgent.isFirstLogin())
- {
- LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE);
- effectp->setPositionGlobal(gAgent.getPositionGlobal());
- effectp->setColor(LLColor4U(gAgent.getEffectColor()));
- LLHUDManager::getInstance()->sendEffects();
- }
-
- LLStartUp::setStartupState( STATE_AGENT_WAIT ); // Go to STATE_AGENT_WAIT
-
- timeout.reset();
- return FALSE;
- }
-
- //---------------------------------------------------------------------
- // Agent Wait
- //---------------------------------------------------------------------
- if (STATE_AGENT_WAIT == LLStartUp::getStartupState())
- {
- LLMessageSystem* msg = gMessageSystem;
- while (msg->checkAllMessages(gFrameCount, gServicePump))
- {
- if (gAgentMovementCompleted)
- {
- // Sometimes we have more than one message in the
- // queue. break out of this loop and continue
- // processing. If we don't, then this could skip one
- // or more login steps.
- break;
- }
- else
- {
- LL_DEBUGS("AppInit") << "Awaiting AvatarInitComplete, got "
- << msg->getMessageName() << LL_ENDL;
- }
- }
- msg->processAcks();
-
- if (gAgentMovementCompleted)
- {
- LLStartUp::setStartupState( STATE_INVENTORY_SEND );
- }
-
- return FALSE;
- }
-
- //---------------------------------------------------------------------
- // Inventory Send
- //---------------------------------------------------------------------
- if (STATE_INVENTORY_SEND == LLStartUp::getStartupState())
- {
- // Inform simulator of our language preference
- LLAgentLanguage::update();
-
- // unpack thin inventory
- LLSD response = LLLoginInstance::getInstance()->getResponse();
- //bool dump_buffer = false;
-
- LLSD inv_lib_root = response["inventory-lib-root"];
- if(inv_lib_root.isDefined())
- {
- // should only be one
- LLSD id = inv_lib_root[0]["folder_id"];
- if(id.isDefined())
- {
- gInventory.setLibraryRootFolderID(id.asUUID());
- }
- }
-
- LLSD inv_lib_owner = response["inventory-lib-owner"];
- if(inv_lib_owner.isDefined())
- {
- // should only be one
- LLSD id = inv_lib_owner[0]["agent_id"];
- if(id.isDefined())
- {
- gInventory.setLibraryOwnerID( LLUUID(id.asUUID()));
- }
- }
-
- LLSD inv_skel_lib = response["inventory-skel-lib"];
- if(inv_skel_lib.isDefined() && gInventory.getLibraryOwnerID().notNull())
- {
- if(!gInventory.loadSkeleton(inv_skel_lib, gInventory.getLibraryOwnerID()))
- {
- LL_WARNS("AppInit") << "Problem loading inventory-skel-lib" << LL_ENDL;
- }
- }
-
- LLSD inv_skeleton = response["inventory-skeleton"];
- if(inv_skeleton.isDefined())
- {
- if(!gInventory.loadSkeleton(inv_skeleton, gAgent.getID()))
- {
- LL_WARNS("AppInit") << "Problem loading inventory-skel-targets" << LL_ENDL;
- }
- }
-
- LLSD buddy_list = response["buddy-list"];
- if(buddy_list.isDefined())
- {
- LLAvatarTracker::buddy_map_t list;
- LLUUID agent_id;
- S32 has_rights = 0, given_rights = 0;
- for(LLSD::array_const_iterator it = buddy_list.beginArray(),
- end = buddy_list.endArray(); it != end; ++it)
- {
- LLSD buddy_id = (*it)["buddy_id"];
- if(buddy_id.isDefined())
- {
- agent_id = buddy_id.asUUID();
- }
-
- LLSD buddy_rights_has = (*it)["buddy_rights_has"];
- if(buddy_rights_has.isDefined())
- {
- has_rights = buddy_rights_has.asInteger();
- }
-
- LLSD buddy_rights_given = (*it)["buddy_rights_given"];
- if(buddy_rights_given.isDefined())
- {
- given_rights = buddy_rights_given.asInteger();
- }
-
- list[agent_id] = new LLRelationship(given_rights, has_rights, false);
- }
- LLAvatarTracker::instance().addBuddyList(list);
- }
-
- bool show_hud = false;
- LLSD tutorial_setting = response["tutorial_setting"];
- if(tutorial_setting.isDefined())
- {
- for(LLSD::array_const_iterator it = tutorial_setting.beginArray(),
- end = tutorial_setting.endArray(); it != end; ++it)
- {
- LLSD tutorial_url = (*it)["tutorial_url"];
- if(tutorial_url.isDefined())
- {
- // Tutorial floater will append language code
- gSavedSettings.setString("TutorialURL", tutorial_url.asString());
- }
-
- // For Viewer 2.0 we are not using the web-based tutorial
- // If we reverse that decision, put this code back and use
- // login.cgi to send a different URL with content that matches
- // the Viewer 2.0 UI.
- //LLSD use_tutorial = (*it)["use_tutorial"];
- //if(use_tutorial.asString() == "true")
- //{
- // show_hud = true;
- //}
- }
- }
- // Either we want to show tutorial because this is the first login
- // to a Linden Help Island or the user quit with the tutorial
- // visible. JC
- if (show_hud || gSavedSettings.getBOOL("ShowTutorial"))
- {
- LLFloaterReg::showInstance("hud", LLSD(), FALSE);
- }
-
- LLSD event_notifications = response["event_notifications"];
- if(event_notifications.isDefined())
- {
- gEventNotifier.load(event_notifications);
- }
-
- LLSD classified_categories = response["classified_categories"];
- if(classified_categories.isDefined())
- {
- LLClassifiedInfo::loadCategories(classified_categories);
- }
-
- // This method MUST be called before gInventory.findCategoryUUIDForType because of
- // gInventory.mIsAgentInvUsable is set to true in the gInventory.buildParentChildMap.
- gInventory.buildParentChildMap();
-
- //all categories loaded. lets create "My Favorites" category
- gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE,true);
-
- // set up callbacks
- llinfos << "Registering Callbacks" << llendl;
- LLMessageSystem* msg = gMessageSystem;
- llinfos << " Inventory" << llendl;
- LLInventoryModel::registerCallbacks(msg);
- llinfos << " AvatarTracker" << llendl;
- LLAvatarTracker::instance().registerCallbacks(msg);
- llinfos << " Landmark" << llendl;
- LLLandmark::registerCallbacks(msg);
-
- // request mute list
- llinfos << "Requesting Mute List" << llendl;
- LLMuteList::getInstance()->requestFromServer(gAgent.getID());
-
- // Get L$ and ownership credit information
- llinfos << "Requesting Money Balance" << llendl;
- LLStatusBar::sendMoneyBalanceRequest();
-
- // request all group information
- llinfos << "Requesting Agent Data" << llendl;
- gAgent.sendAgentDataUpdateRequest();
-
- // Create the inventory views
- llinfos << "Creating Inventory Views" << llendl;
- LLFloaterReg::getInstance("inventory");
-
- LLStartUp::setStartupState( STATE_MISC );
- return FALSE;
- }
-
-
- //---------------------------------------------------------------------
- // Misc
- //---------------------------------------------------------------------
- if (STATE_MISC == LLStartUp::getStartupState())
- {
- // We have a region, and just did a big inventory download.
- // We can estimate the user's connection speed, and set their
- // max bandwidth accordingly. JC
- if (gSavedSettings.getBOOL("FirstLoginThisInstall"))
- {
- // This is actually a pessimistic computation, because TCP may not have enough
- // time to ramp up on the (small) default inventory file to truly measure max
- // bandwidth. JC
- F64 rate_bps = LLLoginInstance::getInstance()->getLastTransferRateBPS();
- const F32 FAST_RATE_BPS = 600.f * 1024.f;
- const F32 FASTER_RATE_BPS = 750.f * 1024.f;
- F32 max_bandwidth = gViewerThrottle.getMaxBandwidth();
- if (rate_bps > FASTER_RATE_BPS
- && rate_bps > max_bandwidth)
- {
- LL_DEBUGS("AppInit") << "Fast network connection, increasing max bandwidth to "
- << FASTER_RATE_BPS/1024.f
- << " kbps" << LL_ENDL;
- gViewerThrottle.setMaxBandwidth(FASTER_RATE_BPS / 1024.f);
- }
- else if (rate_bps > FAST_RATE_BPS
- && rate_bps > max_bandwidth)
- {
- LL_DEBUGS("AppInit") << "Fast network connection, increasing max bandwidth to "
- << FAST_RATE_BPS/1024.f
- << " kbps" << LL_ENDL;
- gViewerThrottle.setMaxBandwidth(FAST_RATE_BPS / 1024.f);
- }
-
- // Set the show start location to true, now that the user has logged
- // on with this install.
- gSavedSettings.setBOOL("ShowStartLocation", TRUE);
-
- LLSideTray::getInstance()->showPanel("panel_home", LLSD());
-
- }
-
- // We're successfully logged in.
- gSavedSettings.setBOOL("FirstLoginThisInstall", FALSE);
-
- LLFloaterReg::showInitialVisibleInstances();
-
- // based on the comments, we've successfully logged in so we can delete the 'forced'
- // URL that the updater set in settings.ini (in a mostly paranoid fashion)
- std::string nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" );
- if ( nextLoginLocation.length() )
- {
- // clear it
- gSavedSettings.setString( "NextLoginLocation", "" );
-
- // and make sure it's saved
- gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile") , TRUE );
- LLUIColorTable::instance().saveUserSettings();
- };
-
- if (!gNoRender)
- {
- // JC: Initializing audio requests many sounds for download.
- init_audio();
-
- // JC: Initialize "active" gestures. This may also trigger
- // many gesture downloads, if this is the user's first
- // time on this machine or -purge has been run.
- LLSD gesture_options
- = LLLoginInstance::getInstance()->getResponse("gestures");
- if (gesture_options.isDefined())
- {
- LL_DEBUGS("AppInit") << "Gesture Manager loading " << gesture_options.size()
- << LL_ENDL;
- uuid_vec_t item_ids;
- for(LLSD::array_const_iterator resp_it = gesture_options.beginArray(),
- end = gesture_options.endArray(); resp_it != end; ++resp_it)
- {
- // If the id is not specifed in the LLSD,
- // the LLSD operator[]() will return a null LLUUID.
- LLUUID item_id = (*resp_it)["item_id"];
- LLUUID asset_id = (*resp_it)["asset_id"];
-
- if (item_id.notNull() && asset_id.notNull())
- {
- // Could schedule and delay these for later.
- const BOOL no_inform_server = FALSE;
- const BOOL no_deactivate_similar = FALSE;
- LLGestureMgr::instance().activateGestureWithAsset(item_id, asset_id,
- no_inform_server,
- no_deactivate_similar);
- // We need to fetch the inventory items for these gestures
- // so we have the names to populate the UI.
- item_ids.push_back(item_id);
- }
- }
- // no need to add gesture to inventory observer, it's already made in constructor
- LLGestureMgr::instance().setFetchIDs(item_ids);
- LLGestureMgr::instance().startFetch();
- }
- }
- gDisplaySwapBuffers = TRUE;
-
- LLMessageSystem* msg = gMessageSystem;
- msg->setHandlerFuncFast(_PREHASH_SoundTrigger, process_sound_trigger);
- msg->setHandlerFuncFast(_PREHASH_PreloadSound, process_preload_sound);
- msg->setHandlerFuncFast(_PREHASH_AttachedSound, process_attached_sound);
- msg->setHandlerFuncFast(_PREHASH_AttachedSoundGainChange, process_attached_sound_gain_change);
-
- LL_DEBUGS("AppInit") << "Initialization complete" << LL_ENDL;
-
- gRenderStartTime.reset();
- gForegroundTime.reset();
-
- // HACK: Inform simulator of window size.
- // Do this here so it's less likely to race with RegisterNewAgent.
- // TODO: Put this into RegisterNewAgent
- // JC - 7/20/2002
- gViewerWindow->sendShapeToSim();
-
-
- // Ignore stipend information for now. Money history is on the web site.
- // if needed, show the L$ history window
- //if (stipend_since_login && !gNoRender)
- //{
- //}
-
- // The reason we show the alert is because we want to
- // reduce confusion for when you log in and your provided
- // location is not your expected location. So, if this is
- // your first login, then you do not have an expectation,
- // thus, do not show this alert.
- if (!gAgent.isFirstLogin())
- {
- llinfos << "gAgentStartLocation : " << gAgentStartLocation << llendl;
- LLSLURL start_slurl = LLStartUp::getStartSLURL();
-
- if (((start_slurl.getType() == LLSLURL::LOCATION) && (gAgentStartLocation == "url")) ||
- ((start_slurl.getType() == LLSLURL::LAST_LOCATION) && (gAgentStartLocation == "last")) ||
- ((start_slurl.getType() == LLSLURL::HOME_LOCATION) && (gAgentStartLocation == "home")))
- {
- // Start location is OK
- // Disabled code to restore camera location and focus if logging in to default location
- static bool samename = false;
- if (samename)
- {
- // restore old camera pos
- gAgentCamera.setFocusOnAvatar(FALSE, FALSE);
- gAgentCamera.setCameraPosAndFocusGlobal(gSavedSettings.getVector3d("CameraPosOnLogout"), gSavedSettings.getVector3d("FocusPosOnLogout"), LLUUID::null);
- BOOL limit_hit = FALSE;
- gAgentCamera.calcCameraPositionTargetGlobal(&limit_hit);
- if (limit_hit)
- {
- gAgentCamera.setFocusOnAvatar(TRUE, FALSE);
- }
- gAgentCamera.stopCameraAnimation();
- }
- }
- else
- {
- std::string msg;
- switch(start_slurl.getType())
- {
- case LLSLURL::LOCATION:
- {
-
- msg = "AvatarMovedDesired";
- break;
- }
- case LLSLURL::HOME_LOCATION:
- {
- msg = "AvatarMovedHome";
- break;
- }
- default:
- {
- msg = "AvatarMovedLast";
- }
- }
- LLNotificationsUtil::add(msg);
- }
- }
-
- //DEV-17797. get null folder. Any items found here moved to Lost and Found
- LLInventoryModelBackgroundFetch::instance().findLostItems();
-
- LLStartUp::setStartupState( STATE_PRECACHE );
- timeout.reset();
- return FALSE;
- }
-
- if (STATE_PRECACHE == LLStartUp::getStartupState())
- {
- F32 timeout_frac = timeout.getElapsedTimeF32()/PRECACHING_DELAY;
-
- // We now have an inventory skeleton, so if this is a user's first
- // login, we can start setting up their clothing and avatar
- // appearance. This helps to avoid the generic "Ruth" avatar in
- // the orientation island tutorial experience. JC
- if (gAgent.isFirstLogin()
- && !sInitialOutfit.empty() // registration set up an outfit
- && !sInitialOutfitGender.empty() // and a gender
- && isAgentAvatarValid() // can't wear clothes without object
- && !gAgent.isGenderChosen() ) // nothing already loading
- {
- // Start loading the wearables, textures, gestures
- LLStartUp::loadInitialOutfit( sInitialOutfit, sInitialOutfitGender );
- }
-
- // wait precache-delay and for agent's avatar or a lot longer.
- if(((timeout_frac > 1.f) && isAgentAvatarValid())
- || (timeout_frac > 3.f))
- {
- LLStartUp::setStartupState( STATE_WEARABLES_WAIT );
- }
- else
- {
- update_texture_fetch();
- set_startup_status(0.60f + 0.30f * timeout_frac,
- LLTrans::getString("LoginPrecaching"),
- gAgent.mMOTD);
- display_startup();
- if (!LLViewerShaderMgr::sInitialized)
- {
- LLViewerShaderMgr::sInitialized = TRUE;
- LLViewerShaderMgr::instance()->setShaders();
- }
- }
-
- return TRUE;
- }
-
- if (STATE_WEARABLES_WAIT == LLStartUp::getStartupState())
- {
- static LLFrameTimer wearables_timer;
-
- const F32 wearables_time = wearables_timer.getElapsedTimeF32();
- const F32 MAX_WEARABLES_TIME = 10.f;
-
- if (!gAgent.isGenderChosen())
- {
- // No point in waiting for clothing, we don't even
- // know what gender we are. Pop a dialog to ask and
- // proceed to draw the world. JC
- //
- // *NOTE: We might hit this case even if we have an
- // initial outfit, but if the load hasn't started
- // already then something is wrong so fall back
- // to generic outfits. JC
- LLNotificationsUtil::add("WelcomeChooseSex", LLSD(), LLSD(),
- callback_choose_gender);
- LLStartUp::setStartupState( STATE_CLEANUP );
- return TRUE;
- }
-
- if (wearables_time > MAX_WEARABLES_TIME)
- {
- LLNotificationsUtil::add("ClothingLoading");
- LLViewerStats::getInstance()->incStat(LLViewerStats::ST_WEARABLES_TOO_LONG);
- LLStartUp::setStartupState( STATE_CLEANUP );
- return TRUE;
- }
-
- if (gAgent.isFirstLogin())
- {
- // wait for avatar to be completely loaded
- if (isAgentAvatarValid()
- && gAgentAvatarp->isFullyLoaded())
- {
- //llinfos << "avatar fully loaded" << llendl;
- LLStartUp::setStartupState( STATE_CLEANUP );
- return TRUE;
- }
- }
- else
- {
- // OK to just get the wearables
- if ( gAgentWearables.areWearablesLoaded() )
- {
- // We have our clothing, proceed.
- //llinfos << "wearables loaded" << llendl;
- LLStartUp::setStartupState( STATE_CLEANUP );
- return TRUE;
- }
- }
-
- update_texture_fetch();
- set_startup_status(0.9f + 0.1f * wearables_time / MAX_WEARABLES_TIME,
- LLTrans::getString("LoginDownloadingClothing").c_str(),
- gAgent.mMOTD.c_str());
- return TRUE;
- }
-
- if (STATE_CLEANUP == LLStartUp::getStartupState())
- {
- set_startup_status(1.0, "", "");
-
- // Let the map know about the inventory.
- LLFloaterWorldMap* floater_world_map = LLFloaterWorldMap::getInstance();
- if(floater_world_map)
- {
- floater_world_map->observeInventory(&gInventory);
- floater_world_map->observeFriends();
- }
- gViewerWindow->showCursor();
- gViewerWindow->getWindow()->resetBusyCount();
- gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW);
- LL_DEBUGS("AppInit") << "Done releasing bitmap" << LL_ENDL;
- gViewerWindow->setShowProgress(FALSE);
- gViewerWindow->setProgressCancelButtonVisible(FALSE);
-
- // We're not away from keyboard, even though login might have taken
- // a while. JC
- gAgent.clearAFK();
-
- // Have the agent start watching the friends list so we can update proxies
- gAgent.observeFriends();
- if (gSavedSettings.getBOOL("LoginAsGod"))
- {
- gAgent.requestEnterGodMode();
- }
-
- // Start automatic replay if the flag is set.
- if (gSavedSettings.getBOOL("StatsAutoRun") || LLAgentPilot::sReplaySession)
- {
- LLUUID id;
- LL_DEBUGS("AppInit") << "Starting automatic playback" << LL_ENDL;
- gAgentPilot.startPlayback();
- }
-
- show_debug_menus(); // Debug menu visiblity and First Use trigger
-
- // If we've got a startup URL, dispatch it
- LLStartUp::dispatchURL();
-
- // Retrieve information about the land data
- // (just accessing this the first time will fetch it,
- // then the data is cached for the viewer's lifetime)
- LLProductInfoRequestManager::instance();
-
- // *FIX:Mani - What do I do here?
- // Need we really clear the Auth response data?
- // Clean up the userauth stuff.
- // LLUserAuth::getInstance()->reset();
-
- LLStartUp::setStartupState( STATE_STARTED );
-
- // Unmute audio if desired and setup volumes.
- // Unmute audio if desired and setup volumes.
- // This is a not-uncommon crash site, so surround it with
- // llinfos output to aid diagnosis.
- LL_INFOS("AppInit") << "Doing first audio_update_volume..." << LL_ENDL;
- audio_update_volume();
- LL_INFOS("AppInit") << "Done first audio_update_volume." << LL_ENDL;
-
- // reset keyboard focus to sane state of pointing at world
- gFocusMgr.setKeyboardFocus(NULL);
-
-#if 0 // sjb: enable for auto-enabling timer display
- gDebugView->mFastTimerView->setVisible(TRUE);
-#endif
-
- LLAppViewer::instance()->handleLoginComplete();
-
- // reset timers now that we are running "logged in" logic
- LLFastTimer::reset();
-
- LLAgentPicksInfo::getInstance()->requestNumberOfPicks();
-
- LLIMFloater::initIMFloater();
-
- return TRUE;
- }
-
- LL_WARNS("AppInit") << "Reached end of idle_startup for state " << LLStartUp::getStartupState() << LL_ENDL;
- return TRUE;
-}
-
-//
-// local function definition
-//
-
-void login_show()
-{
- LL_INFOS("AppInit") << "Initializing Login Screen" << LL_ENDL;
-
-#ifdef LL_RELEASE_FOR_DOWNLOAD
- BOOL bUseDebugLogin = gSavedSettings.getBOOL("UseDebugLogin");
-#else
- BOOL bUseDebugLogin = TRUE;
-#endif
-
- LLPanelLogin::show( gViewerWindow->getWindowRectScaled(),
- bUseDebugLogin || gSavedSettings.getBOOL("SecondLifeEnterprise"),
- login_callback, NULL );
-
-}
-
-// Callback for when login screen is closed. Option 0 = connect, option 1 = quit.
-void login_callback(S32 option, void *userdata)
-{
- const S32 CONNECT_OPTION = 0;
- const S32 QUIT_OPTION = 1;
-
- if (CONNECT_OPTION == option)
- {
- LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
- return;
- }
- else if (QUIT_OPTION == option) // *TODO: THIS CODE SEEMS TO BE UNREACHABLE!!!!! login_callback is never called with option equal to QUIT_OPTION
- {
- if (!gSavedSettings.getBOOL("RememberPassword"))
- {
- // turn off the setting and write out to disk
- gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile") , TRUE );
- LLUIColorTable::instance().saveUserSettings();
- }
-
- // Next iteration through main loop should shut down the app cleanly.
- LLAppViewer::instance()->userQuit();
-
- if (LLAppViewer::instance()->quitRequested())
- {
- LLPanelLogin::closePanel();
- }
- return;
- }
- else
- {
- LL_WARNS("AppInit") << "Unknown login button clicked" << LL_ENDL;
- }
-}
-
-void show_first_run_dialog()
-{
- LLNotificationsUtil::add("FirstRun", LLSD(), LLSD(), first_run_dialog_callback);
-}
-
-bool first_run_dialog_callback(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if (0 == option)
- {
- LL_DEBUGS("AppInit") << "First run dialog cancelling" << LL_ENDL;
- LLWeb::loadURLExternal(LLTrans::getString("create_account_url") );
- }
-
- LLPanelLogin::giveFocus();
- return false;
-}
-
-
-
-void set_startup_status(const F32 frac, const std::string& string, const std::string& msg)
-{
- gViewerWindow->setProgressPercent(frac*100);
- gViewerWindow->setProgressString(string);
-
- gViewerWindow->setProgressMessage(msg);
-}
-
-bool login_alert_status(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- // Buttons
- switch( option )
- {
- case 0: // OK
- break;
- // case 1: // Help
- // LLWeb::loadURL(LLNotifications::instance().getGlobalString("SUPPORT_URL") );
- // break;
- case 2: // Teleport
- // Restart the login process, starting at our home locaton
- LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_HOME));
- LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
- break;
- default:
- LL_WARNS("AppInit") << "Missing case in login_alert_status switch" << LL_ENDL;
- }
-
- LLPanelLogin::giveFocus();
- return false;
-}
-
-
-void use_circuit_callback(void**, S32 result)
-{
- // bail if we're quitting.
- if(LLApp::isExiting()) return;
- if( !gUseCircuitCallbackCalled )
- {
- gUseCircuitCallbackCalled = true;
- if (result)
- {
- // Make sure user knows something bad happened. JC
- LL_WARNS("AppInit") << "Backing up to login screen!" << LL_ENDL;
- LLNotificationsUtil::add("LoginPacketNeverReceived", LLSD(), LLSD(), login_alert_status);
- reset_login();
- }
- else
- {
- gGotUseCircuitCodeAck = true;
- }
- }
-}
-
-void register_viewer_callbacks(LLMessageSystem* msg)
-{
- msg->setHandlerFuncFast(_PREHASH_LayerData, process_layer_data );
- msg->setHandlerFuncFast(_PREHASH_ImageData, LLViewerTextureList::receiveImageHeader );
- msg->setHandlerFuncFast(_PREHASH_ImagePacket, LLViewerTextureList::receiveImagePacket );
- msg->setHandlerFuncFast(_PREHASH_ObjectUpdate, process_object_update );
- msg->setHandlerFunc("ObjectUpdateCompressed", process_compressed_object_update );
- msg->setHandlerFunc("ObjectUpdateCached", process_cached_object_update );
- msg->setHandlerFuncFast(_PREHASH_ImprovedTerseObjectUpdate, process_terse_object_update_improved );
- msg->setHandlerFunc("SimStats", process_sim_stats);
- msg->setHandlerFuncFast(_PREHASH_HealthMessage, process_health_message );
- msg->setHandlerFuncFast(_PREHASH_EconomyData, process_economy_data);
- msg->setHandlerFunc("RegionInfo", LLViewerRegion::processRegionInfo);
-
- msg->setHandlerFuncFast(_PREHASH_ChatFromSimulator, process_chat_from_simulator);
- msg->setHandlerFuncFast(_PREHASH_KillObject, process_kill_object, NULL);
- msg->setHandlerFuncFast(_PREHASH_SimulatorViewerTimeMessage, process_time_synch, NULL);
- msg->setHandlerFuncFast(_PREHASH_EnableSimulator, process_enable_simulator);
- msg->setHandlerFuncFast(_PREHASH_DisableSimulator, process_disable_simulator);
- msg->setHandlerFuncFast(_PREHASH_KickUser, process_kick_user, NULL);
-
- msg->setHandlerFunc("CrossedRegion", process_crossed_region);
- msg->setHandlerFuncFast(_PREHASH_TeleportFinish, process_teleport_finish);
-
- msg->setHandlerFuncFast(_PREHASH_AlertMessage, process_alert_message);
- msg->setHandlerFunc("AgentAlertMessage", process_agent_alert_message);
- msg->setHandlerFuncFast(_PREHASH_MeanCollisionAlert, process_mean_collision_alert_message, NULL);
- msg->setHandlerFunc("ViewerFrozenMessage", process_frozen_message);
-
- msg->setHandlerFuncFast(_PREHASH_NameValuePair, process_name_value);
- msg->setHandlerFuncFast(_PREHASH_RemoveNameValuePair, process_remove_name_value);
- msg->setHandlerFuncFast(_PREHASH_AvatarAnimation, process_avatar_animation);
- msg->setHandlerFuncFast(_PREHASH_AvatarAppearance, process_avatar_appearance);
- msg->setHandlerFunc("AgentCachedTextureResponse", LLAgent::processAgentCachedTextureResponse);
- msg->setHandlerFunc("RebakeAvatarTextures", LLVOAvatarSelf::processRebakeAvatarTextures);
- msg->setHandlerFuncFast(_PREHASH_CameraConstraint, process_camera_constraint);
- msg->setHandlerFuncFast(_PREHASH_AvatarSitResponse, process_avatar_sit_response);
- msg->setHandlerFunc("SetFollowCamProperties", process_set_follow_cam_properties);
- msg->setHandlerFunc("ClearFollowCamProperties", process_clear_follow_cam_properties);
-
- msg->setHandlerFuncFast(_PREHASH_ImprovedInstantMessage, process_improved_im);
- msg->setHandlerFuncFast(_PREHASH_ScriptQuestion, process_script_question);
- msg->setHandlerFuncFast(_PREHASH_ObjectProperties, LLSelectMgr::processObjectProperties, NULL);
- msg->setHandlerFuncFast(_PREHASH_ObjectPropertiesFamily, LLSelectMgr::processObjectPropertiesFamily, NULL);
- msg->setHandlerFunc("ForceObjectSelect", LLSelectMgr::processForceObjectSelect);
-
- msg->setHandlerFuncFast(_PREHASH_MoneyBalanceReply, process_money_balance_reply, NULL);
- msg->setHandlerFuncFast(_PREHASH_CoarseLocationUpdate, LLWorld::processCoarseUpdate, NULL);
- msg->setHandlerFuncFast(_PREHASH_ReplyTaskInventory, LLViewerObject::processTaskInv, NULL);
- msg->setHandlerFuncFast(_PREHASH_DerezContainer, process_derez_container, NULL);
- msg->setHandlerFuncFast(_PREHASH_ScriptRunningReply,
- &LLLiveLSLEditor::processScriptRunningReply);
-
- msg->setHandlerFuncFast(_PREHASH_DeRezAck, process_derez_ack);
-
- msg->setHandlerFunc("LogoutReply", process_logout_reply);
-
- //msg->setHandlerFuncFast(_PREHASH_AddModifyAbility,
- // &LLAgent::processAddModifyAbility);
- //msg->setHandlerFuncFast(_PREHASH_RemoveModifyAbility,
- // &LLAgent::processRemoveModifyAbility);
- msg->setHandlerFuncFast(_PREHASH_AgentDataUpdate,
- &LLAgent::processAgentDataUpdate);
- msg->setHandlerFuncFast(_PREHASH_AgentGroupDataUpdate,
- &LLAgent::processAgentGroupDataUpdate);
- msg->setHandlerFunc("AgentDropGroup",
- &LLAgent::processAgentDropGroup);
- // land ownership messages
- msg->setHandlerFuncFast(_PREHASH_ParcelOverlay,
- LLViewerParcelMgr::processParcelOverlay);
- msg->setHandlerFuncFast(_PREHASH_ParcelProperties,
- LLViewerParcelMgr::processParcelProperties);
- msg->setHandlerFunc("ParcelAccessListReply",
- LLViewerParcelMgr::processParcelAccessListReply);
- msg->setHandlerFunc("ParcelDwellReply",
- LLViewerParcelMgr::processParcelDwellReply);
-
- msg->setHandlerFunc("AvatarPropertiesReply",
- &LLAvatarPropertiesProcessor::processAvatarPropertiesReply);
- msg->setHandlerFunc("AvatarInterestsReply",
- &LLAvatarPropertiesProcessor::processAvatarInterestsReply);
- msg->setHandlerFunc("AvatarGroupsReply",
- &LLAvatarPropertiesProcessor::processAvatarGroupsReply);
- // ratings deprecated
- //msg->setHandlerFuncFast(_PREHASH_AvatarStatisticsReply,
- // LLPanelAvatar::processAvatarStatisticsReply);
- msg->setHandlerFunc("AvatarNotesReply",
- &LLAvatarPropertiesProcessor::processAvatarNotesReply);
- msg->setHandlerFunc("AvatarPicksReply",
- &LLAvatarPropertiesProcessor::processAvatarPicksReply);
- msg->setHandlerFunc("AvatarClassifiedReply",
- &LLAvatarPropertiesProcessor::processAvatarClassifiedsReply);
-
- msg->setHandlerFuncFast(_PREHASH_CreateGroupReply,
- LLGroupMgr::processCreateGroupReply);
- msg->setHandlerFuncFast(_PREHASH_JoinGroupReply,
- LLGroupMgr::processJoinGroupReply);
- msg->setHandlerFuncFast(_PREHASH_EjectGroupMemberReply,
- LLGroupMgr::processEjectGroupMemberReply);
- msg->setHandlerFuncFast(_PREHASH_LeaveGroupReply,
- LLGroupMgr::processLeaveGroupReply);
- msg->setHandlerFuncFast(_PREHASH_GroupProfileReply,
- LLGroupMgr::processGroupPropertiesReply);
-
- // ratings deprecated
- // msg->setHandlerFuncFast(_PREHASH_ReputationIndividualReply,
- // LLFloaterRate::processReputationIndividualReply);
-
- msg->setHandlerFuncFast(_PREHASH_AgentWearablesUpdate,
- LLAgentWearables::processAgentInitialWearablesUpdate );
-
- msg->setHandlerFunc("ScriptControlChange",
- LLAgent::processScriptControlChange );
-
- msg->setHandlerFuncFast(_PREHASH_ViewerEffect, LLHUDManager::processViewerEffect);
-
- msg->setHandlerFuncFast(_PREHASH_GrantGodlikePowers, process_grant_godlike_powers);
-
- msg->setHandlerFuncFast(_PREHASH_GroupAccountSummaryReply,
- LLPanelGroupLandMoney::processGroupAccountSummaryReply);
- msg->setHandlerFuncFast(_PREHASH_GroupAccountDetailsReply,
- LLPanelGroupLandMoney::processGroupAccountDetailsReply);
- msg->setHandlerFuncFast(_PREHASH_GroupAccountTransactionsReply,
- LLPanelGroupLandMoney::processGroupAccountTransactionsReply);
-
- msg->setHandlerFuncFast(_PREHASH_UserInfoReply,
- process_user_info_reply);
-
- msg->setHandlerFunc("RegionHandshake", process_region_handshake, NULL);
-
- msg->setHandlerFunc("TeleportStart", process_teleport_start );
- msg->setHandlerFunc("TeleportProgress", process_teleport_progress);
- msg->setHandlerFunc("TeleportFailed", process_teleport_failed, NULL);
- msg->setHandlerFunc("TeleportLocal", process_teleport_local, NULL);
-
- msg->setHandlerFunc("ImageNotInDatabase", LLViewerTextureList::processImageNotInDatabase, NULL);
-
- msg->setHandlerFuncFast(_PREHASH_GroupMembersReply,
- LLGroupMgr::processGroupMembersReply);
- msg->setHandlerFunc("GroupRoleDataReply",
- LLGroupMgr::processGroupRoleDataReply);
- msg->setHandlerFunc("GroupRoleMembersReply",
- LLGroupMgr::processGroupRoleMembersReply);
- msg->setHandlerFunc("GroupTitlesReply",
- LLGroupMgr::processGroupTitlesReply);
- // Special handler as this message is sometimes used for group land.
- msg->setHandlerFunc("PlacesReply", process_places_reply);
- msg->setHandlerFunc("GroupNoticesListReply", LLPanelGroupNotices::processGroupNoticesListReply);
-
- msg->setHandlerFunc("AvatarPickerReply", LLFloaterAvatarPicker::processAvatarPickerReply);
-
- msg->setHandlerFunc("MapBlockReply", LLWorldMapMessage::processMapBlockReply);
- msg->setHandlerFunc("MapItemReply", LLWorldMapMessage::processMapItemReply);
- msg->setHandlerFunc("EventInfoReply", LLEventNotifier::processEventInfoReply);
-
- msg->setHandlerFunc("PickInfoReply", &LLAvatarPropertiesProcessor::processPickInfoReply);
-// msg->setHandlerFunc("ClassifiedInfoReply", LLPanelClassified::processClassifiedInfoReply);
- msg->setHandlerFunc("ClassifiedInfoReply", LLAvatarPropertiesProcessor::processClassifiedInfoReply);
- msg->setHandlerFunc("ParcelInfoReply", LLRemoteParcelInfoProcessor::processParcelInfoReply);
- msg->setHandlerFunc("ScriptDialog", process_script_dialog);
- msg->setHandlerFunc("LoadURL", process_load_url);
- msg->setHandlerFunc("ScriptTeleportRequest", process_script_teleport_request);
- msg->setHandlerFunc("EstateCovenantReply", process_covenant_reply);
-
- // calling cards
- msg->setHandlerFunc("OfferCallingCard", process_offer_callingcard);
- msg->setHandlerFunc("AcceptCallingCard", process_accept_callingcard);
- msg->setHandlerFunc("DeclineCallingCard", process_decline_callingcard);
-
- msg->setHandlerFunc("ParcelObjectOwnersReply", LLPanelLandObjects::processParcelObjectOwnersReply);
-
- msg->setHandlerFunc("InitiateDownload", process_initiate_download);
- msg->setHandlerFunc("LandStatReply", LLFloaterTopObjects::handle_land_reply);
- msg->setHandlerFunc("GenericMessage", process_generic_message);
-
- msg->setHandlerFuncFast(_PREHASH_FeatureDisabled, process_feature_disabled_message);
-}
-
-void asset_callback_nothing(LLVFS*, const LLUUID&, LLAssetType::EType, void*, S32)
-{
- // nothing
-}
-
-// *HACK: Must match name in Library or agent inventory
-const std::string ROOT_GESTURES_FOLDER = "Gestures";
-const std::string COMMON_GESTURES_FOLDER = "Common Gestures";
-const std::string MALE_GESTURES_FOLDER = "Male Gestures";
-const std::string FEMALE_GESTURES_FOLDER = "Female Gestures";
-const std::string SPEECH_GESTURES_FOLDER = "Speech Gestures";
-const std::string OTHER_GESTURES_FOLDER = "Other Gestures";
-const S32 OPT_CLOSED_WINDOW = -1;
-const S32 OPT_MALE = 0;
-const S32 OPT_FEMALE = 1;
-const S32 OPT_TRUST_CERT = 0;
-const S32 OPT_CANCEL_TRUST = 1;
-
-bool callback_choose_gender(const LLSD& notification, const LLSD& response)
-{
-
- // These defaults are returned from the server on login. They are set in login.xml.
- // If no default is returned from the server, they are retrieved from settings.xml.
-
- S32 option = LLNotification::getSelectedOption(notification, response);
- switch(option)
- {
- case OPT_MALE:
- LLStartUp::loadInitialOutfit( gSavedSettings.getString("DefaultMaleAvatar"), "male" );
- break;
-
- case OPT_FEMALE:
- case OPT_CLOSED_WINDOW:
- default:
- LLStartUp::loadInitialOutfit( gSavedSettings.getString("DefaultFemaleAvatar"), "female" );
- break;
- }
- return false;
-}
-
-void LLStartUp::copyLibraryGestures(const std::string& same_gender_gestures)
-{
- llinfos << "Copying library gestures" << llendl;
-
- // Copy gestures
- LLUUID lib_gesture_cat_id =
- gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE,false,true);
- if (lib_gesture_cat_id.isNull())
- {
- llwarns << "Unable to copy gestures, source category not found" << llendl;
- }
- LLUUID dst_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);
-
- std::vector<std::string> gesture_folders_to_copy;
- gesture_folders_to_copy.push_back(MALE_GESTURES_FOLDER);
- gesture_folders_to_copy.push_back(FEMALE_GESTURES_FOLDER);
- gesture_folders_to_copy.push_back(COMMON_GESTURES_FOLDER);
- gesture_folders_to_copy.push_back(SPEECH_GESTURES_FOLDER);
- gesture_folders_to_copy.push_back(OTHER_GESTURES_FOLDER);
-
- for(std::vector<std::string>::iterator it = gesture_folders_to_copy.begin();
- it != gesture_folders_to_copy.end();
- ++it)
- {
- std::string& folder_name = *it;
-
- LLPointer<LLInventoryCallback> cb(NULL);
-
- if (folder_name == same_gender_gestures ||
- folder_name == COMMON_GESTURES_FOLDER ||
- folder_name == OTHER_GESTURES_FOLDER)
- {
- cb = new ActivateGestureCallback;
- }
-
-
- LLUUID cat_id = findDescendentCategoryIDByName(lib_gesture_cat_id,folder_name);
- if (cat_id.isNull())
- {
- llwarns << "failed to find gesture folder for " << folder_name << llendl;
- }
- else
- {
- llinfos << "initiating fetch and copy for " << folder_name << " cat_id " << cat_id << llendl;
- LLAppearanceMgr* app_mgr = LLAppearanceMgr::getInstance();
- callAfterCategoryFetch(cat_id,
- boost::bind(&LLAppearanceMgr::shallowCopyCategory,
- app_mgr,
- cat_id,
- dst_id,
- cb));
- }
- }
-}
-
-void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
- const std::string& gender_name )
-{
- llinfos << "starting" << llendl;
-
- // Not going through the processAgentInitialWearables path, so need to set this here.
- LLAppearanceMgr::instance().setAttachmentInvLinkEnable(true);
- // Initiate creation of COF, since we're also bypassing that.
- gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
-
- S32 gender = 0;
- std::string same_gender_gestures;
- if (gender_name == "male")
- {
- gender = OPT_MALE;
- same_gender_gestures = MALE_GESTURES_FOLDER;
- }
- else
- {
- gender = OPT_FEMALE;
- same_gender_gestures = FEMALE_GESTURES_FOLDER;
- }
-
- // try to find the outfit - if not there, create some default
- // wearables.
- LLUUID cat_id = findDescendentCategoryIDByName(
- gInventory.getLibraryRootFolderID(),
- outfit_folder_name);
- if (cat_id.isNull())
- {
- gAgentWearables.createStandardWearables(gender);
- }
- else
- {
- sWearablesLoadedCon = gAgentWearables.addLoadedCallback(LLStartUp::saveInitialOutfit);
-
- bool do_copy = true;
- bool do_append = false;
- LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
- LLAppearanceMgr::instance().wearInventoryCategory(cat, do_copy, do_append);
- }
-
- // Copy gestures
- copyLibraryGestures(same_gender_gestures);
-
- // This is really misnamed -- it means we have started loading
- // an outfit/shape that will give the avatar a gender eventually. JC
- gAgent.setGenderChosen(TRUE);
-
-}
-
-//static
-void LLStartUp::saveInitialOutfit()
-{
- if (sInitialOutfit.empty()) return;
-
- if (sWearablesLoadedCon.connected())
- {
- sWearablesLoadedCon.disconnect();
- }
- LLAppearanceMgr::getInstance()->makeNewOutfitLinks(sInitialOutfit,false);
-}
-
-std::string& LLStartUp::getInitialOutfitName()
-{
- return sInitialOutfit;
-}
-
-// Loads a bitmap to display during load
-void init_start_screen(S32 location_id)
-{
- if (gStartTexture.notNull())
- {
- gStartTexture = NULL;
- LL_INFOS("AppInit") << "re-initializing start screen" << LL_ENDL;
- }
-
- LL_DEBUGS("AppInit") << "Loading startup bitmap..." << LL_ENDL;
-
- std::string temp_str = gDirUtilp->getLindenUserDir() + gDirUtilp->getDirDelimiter();
-
- if ((S32)START_LOCATION_ID_LAST == location_id)
- {
- temp_str += SCREEN_LAST_FILENAME;
- }
- else
- {
- temp_str += SCREEN_HOME_FILENAME;
- }
-
- LLPointer<LLImageBMP> start_image_bmp = new LLImageBMP;
-
- // Turn off start screen to get around the occasional readback
- // driver bug
- if(!gSavedSettings.getBOOL("UseStartScreen"))
- {
- LL_INFOS("AppInit") << "Bitmap load disabled" << LL_ENDL;
- return;
- }
- else if(!start_image_bmp->load(temp_str) )
- {
- LL_WARNS("AppInit") << "Bitmap load failed" << LL_ENDL;
- return;
- }
-
- gStartImageWidth = start_image_bmp->getWidth();
- gStartImageHeight = start_image_bmp->getHeight();
-
- LLPointer<LLImageRaw> raw = new LLImageRaw;
- if (!start_image_bmp->decode(raw, 0.0f))
- {
- LL_WARNS("AppInit") << "Bitmap decode failed" << LL_ENDL;
- gStartTexture = NULL;
- return;
- }
-
- raw->expandToPowerOfTwo();
- gStartTexture = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE) ;
-}
-
-
-// frees the bitmap
-void release_start_screen()
-{
- LL_DEBUGS("AppInit") << "Releasing bitmap..." << LL_ENDL;
- gStartTexture = NULL;
-}
-
-
-// static
-std::string LLStartUp::startupStateToString(EStartupState state)
-{
-#define RTNENUM(E) case E: return #E
- switch(state){
- RTNENUM( STATE_FIRST );
- RTNENUM( STATE_BROWSER_INIT );
- RTNENUM( STATE_LOGIN_SHOW );
- RTNENUM( STATE_LOGIN_WAIT );
- RTNENUM( STATE_LOGIN_CLEANUP );
- RTNENUM( STATE_LOGIN_AUTH_INIT );
- RTNENUM( STATE_LOGIN_CURL_UNSTUCK );
- RTNENUM( STATE_LOGIN_PROCESS_RESPONSE );
- RTNENUM( STATE_WORLD_INIT );
- RTNENUM( STATE_MULTIMEDIA_INIT );
- RTNENUM( STATE_FONT_INIT );
- RTNENUM( STATE_SEED_GRANTED_WAIT );
- RTNENUM( STATE_SEED_CAP_GRANTED );
- RTNENUM( STATE_WORLD_WAIT );
- RTNENUM( STATE_AGENT_SEND );
- RTNENUM( STATE_AGENT_WAIT );
- RTNENUM( STATE_INVENTORY_SEND );
- RTNENUM( STATE_MISC );
- RTNENUM( STATE_PRECACHE );
- RTNENUM( STATE_WEARABLES_WAIT );
- RTNENUM( STATE_CLEANUP );
- RTNENUM( STATE_STARTED );
- default:
- return llformat("(state #%d)", state);
- }
-#undef RTNENUM
-}
-
-// static
-void LLStartUp::setStartupState( EStartupState state )
-{
- LL_INFOS("AppInit") << "Startup state changing from " <<
- getStartupStateString() << " to " <<
- startupStateToString(state) << LL_ENDL;
- gStartupState = state;
- postStartupState();
-}
-
-void LLStartUp::postStartupState()
-{
- LLSD stateInfo;
- stateInfo["str"] = getStartupStateString();
- stateInfo["enum"] = gStartupState;
- sStateWatcher->post(stateInfo);
-}
-
-
-void reset_login()
-{
- gAgentWearables.cleanup();
- gAgentCamera.cleanup();
- gAgent.cleanup();
- LLWorld::getInstance()->destroyClass();
-
- LLStartUp::setStartupState( STATE_LOGIN_SHOW );
-
- if ( gViewerWindow )
- { // Hide menus and normal buttons
- gViewerWindow->setNormalControlsVisible( FALSE );
- gLoginMenuBarView->setVisible( TRUE );
- gLoginMenuBarView->setEnabled( TRUE );
- }
-
- // Hide any other stuff
- LLFloaterReg::hideVisibleInstances();
-}
-
-//---------------------------------------------------------------------------
-
-// Initialize all plug-ins except the web browser (which was initialized
-// early, before the login screen). JC
-void LLStartUp::multimediaInit()
-{
- LL_DEBUGS("AppInit") << "Initializing Multimedia...." << LL_ENDL;
- std::string msg = LLTrans::getString("LoginInitializingMultimedia");
- set_startup_status(0.42f, msg.c_str(), gAgent.mMOTD.c_str());
- display_startup();
-
- // LLViewerMedia::initClass();
- LLViewerParcelMedia::initClass();
-}
-
-void LLStartUp::fontInit()
-{
- LL_DEBUGS("AppInit") << "Initializing fonts...." << LL_ENDL;
- std::string msg = LLTrans::getString("LoginInitializingFonts");
- set_startup_status(0.45f, msg.c_str(), gAgent.mMOTD.c_str());
- display_startup();
-
- LLFontGL::loadDefaultFonts();
-}
-
-void LLStartUp::initNameCache()
-{
- // Can be called multiple times
- if ( gCacheName ) return;
-
- gCacheName = new LLCacheName(gMessageSystem);
- gCacheName->addObserver(&callback_cache_name);
- gCacheName->localizeCacheName("waiting", LLTrans::getString("AvatarNameWaiting"));
- gCacheName->localizeCacheName("nobody", LLTrans::getString("AvatarNameNobody"));
- gCacheName->localizeCacheName("none", LLTrans::getString("GroupNameNone"));
- // Load stored cache if possible
- LLAppViewer::instance()->loadNameCache();
-
- // Start cache in not-running state until we figure out if we have
- // capabilities for display name lookup
- LLAvatarNameCache::initClass(false);
- LLAvatarNameCache::setUseDisplayNames(gSavedSettings.getBOOL("UseDisplayNames"));
-}
-
-void LLStartUp::cleanupNameCache()
-{
- LLAvatarNameCache::cleanupClass();
-
- delete gCacheName;
- gCacheName = NULL;
-}
-
-bool LLStartUp::dispatchURL()
-{
- // ok, if we've gotten this far and have a startup URL
- if (!getStartSLURL().isValid())
- {
- return false;
- }
- if(getStartSLURL().getType() != LLSLURL::APP)
- {
-
- // If we started with a location, but we're already
- // at that location, don't pop dialogs open.
- LLVector3 pos = gAgent.getPositionAgent();
- LLVector3 slurlpos = getStartSLURL().getPosition();
- F32 dx = pos.mV[VX] - slurlpos.mV[VX];
- F32 dy = pos.mV[VY] - slurlpos.mV[VY];
- const F32 SLOP = 2.f; // meters
-
- if( getStartSLURL().getRegion() != gAgent.getRegion()->getName()
- || (dx*dx > SLOP*SLOP)
- || (dy*dy > SLOP*SLOP) )
- {
- LLURLDispatcher::dispatch(getStartSLURL().getSLURLString(),
- NULL, false);
- }
- return true;
- }
- return false;
-}
-
-void LLStartUp::setStartSLURL(const LLSLURL& slurl)
-{
- sStartSLURL = slurl;
- switch(slurl.getType())
- {
- case LLSLURL::HOME_LOCATION:
- {
- gSavedSettings.setString("LoginLocation", LLSLURL::SIM_LOCATION_HOME);
- break;
- }
- case LLSLURL::LAST_LOCATION:
- {
- gSavedSettings.setString("LoginLocation", LLSLURL::SIM_LOCATION_LAST);
- break;
- }
- default:
- LLGridManager::getInstance()->setGridChoice(slurl.getGrid());
- break;
- }
-}
-
-bool login_alert_done(const LLSD& notification, const LLSD& response)
-{
- LLPanelLogin::giveFocus();
- return false;
-}
-
-// parse the certificate information into args for the
-// certificate notifications
-LLSD transform_cert_args(LLPointer<LLCertificate> cert)
-{
- LLSD args = LLSD::emptyMap();
- std::string value;
- LLSD cert_info;
- cert->getLLSD(cert_info);
- // convert all of the elements in the cert into
- // args for the xml dialog, so we have flexability to
- // display various parts of the cert by only modifying
- // the cert alert dialog xml.
- for(LLSD::map_iterator iter = cert_info.beginMap();
- iter != cert_info.endMap();
- iter++)
- {
- // key usage and extended key usage
- // are actually arrays, and we want to format them as comma separated
- // strings, so special case those.
- LLSDSerialize::toXML(cert_info[iter->first], std::cout);
- if((iter->first== std::string(CERT_KEY_USAGE)) |
- (iter->first == std::string(CERT_EXTENDED_KEY_USAGE)))
- {
- value = "";
- LLSD usage = cert_info[iter->first];
- for (LLSD::array_iterator usage_iter = usage.beginArray();
- usage_iter != usage.endArray();
- usage_iter++)
- {
-
- if(usage_iter != usage.beginArray())
- {
- value += ", ";
- }
-
- value += (*usage_iter).asString();
- }
-
- }
- else
- {
- value = iter->second.asString();
- }
-
- std::string name = iter->first;
- std::transform(name.begin(), name.end(), name.begin(),
- (int(*)(int))toupper);
- args[name.c_str()] = value;
- }
- return args;
-}
-
-
-// when we handle a cert error, give focus back to the login panel
-void general_cert_done(const LLSD& notification, const LLSD& response)
-{
- LLStartUp::setStartupState( STATE_LOGIN_SHOW );
- LLPanelLogin::giveFocus();
-}
-
-// check to see if the user wants to trust the cert.
-// if they do, add it to the cert store and
-void trust_cert_done(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotification::getSelectedOption(notification, response);
- switch(option)
- {
- case OPT_TRUST_CERT:
- {
- LLPointer<LLCertificate> cert = gSecAPIHandler->getCertificate(notification["payload"]["certificate"]);
- LLPointer<LLCertificateStore> store = gSecAPIHandler->getCertificateStore(gSavedSettings.getString("CertStore"));
- store->add(cert);
- store->save();
- LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
- break;
- }
- case OPT_CANCEL_TRUST:
- reset_login();
- gSavedSettings.setBOOL("AutoLogin", FALSE);
- LLStartUp::setStartupState( STATE_LOGIN_SHOW );
- default:
- LLPanelLogin::giveFocus();
- break;
- }
-
-}
-
-void apply_udp_blacklist(const std::string& csv)
-{
-
- std::string::size_type start = 0;
- std::string::size_type comma = 0;
- do
- {
- comma = csv.find(",", start);
- if (comma == std::string::npos)
- {
- comma = csv.length();
- }
- std::string item(csv, start, comma-start);
-
- lldebugs << "udp_blacklist " << item << llendl;
- gMessageSystem->banUdpMessage(item);
-
- start = comma + 1;
-
- }
- while(comma < csv.length());
-
-}
-
-bool process_login_success_response()
-{
- LLSD response = LLLoginInstance::getInstance()->getResponse();
-
- std::string text(response["udp_blacklist"]);
- if(!text.empty())
- {
- apply_udp_blacklist(text);
- }
-
- // unpack login data needed by the application
- text = response["agent_id"].asString();
- if(!text.empty()) gAgentID.set(text);
- gDebugInfo["AgentID"] = text;
-
- // Agent id needed for parcel info request in LLUrlEntryParcel
- // to resolve parcel name.
- LLUrlEntryParcel::setAgentID(gAgentID);
-
- text = response["session_id"].asString();
- if(!text.empty()) gAgentSessionID.set(text);
- gDebugInfo["SessionID"] = text;
-
- // Session id needed for parcel info request in LLUrlEntryParcel
- // to resolve parcel name.
- LLUrlEntryParcel::setSessionID(gAgentSessionID);
-
- text = response["secure_session_id"].asString();
- if(!text.empty()) gAgent.mSecureSessionID.set(text);
-
- // if the response contains a display name, use that,
- // otherwise if the response contains a first and/or last name,
- // use those. Otherwise use the credential identifier
-
- gDisplayName = "";
- if (response.has("display_name"))
- {
- gDisplayName.assign(response["display_name"].asString());
- if(!gDisplayName.empty())
- {
- // Remove quotes from string. Login.cgi sends these to force
- // names that look like numbers into strings.
- LLStringUtil::replaceChar(gDisplayName, '"', ' ');
- LLStringUtil::trim(gDisplayName);
- }
- }
- if(gDisplayName.empty())
- {
- if(response.has("first_name"))
- {
- gDisplayName.assign(response["first_name"].asString());
- LLStringUtil::replaceChar(gDisplayName, '"', ' ');
- LLStringUtil::trim(gDisplayName);
- }
- if(response.has("last_name"))
- {
- text.assign(response["last_name"].asString());
- LLStringUtil::replaceChar(text, '"', ' ');
- LLStringUtil::trim(text);
- if(!gDisplayName.empty())
- {
- gDisplayName += " ";
- }
- gDisplayName += text;
- }
- }
- if(gDisplayName.empty())
- {
- gDisplayName.assign(gUserCredential->asString());
- }
-
- // this is their actual ability to access content
- text = response["agent_access_max"].asString();
- if (!text.empty())
- {
- // agent_access can be 'A', 'M', and 'PG'.
- gAgent.setMaturity(text[0]);
- }
-
- // this is the value of their preference setting for that content
- // which will always be <= agent_access_max
- text = response["agent_region_access"].asString();
- if (!text.empty())
- {
- U32 preferredMaturity = (U32)LLAgent::convertTextToMaturity(text[0]);
-
- gSavedSettings.setU32("PreferredMaturity", preferredMaturity);
- }
- // During the AO transition, this flag will be true. Then the flag will
- // go away. After the AO transition, this code and all the code that
- // uses it can be deleted.
- text = response["ao_transition"].asString();
- if (!text.empty())
- {
- if (text == "1")
- {
- gAgent.setAOTransition();
- }
- }
-
- text = response["start_location"].asString();
- if(!text.empty())
- {
- gAgentStartLocation.assign(text);
- }
-
- text = response["circuit_code"].asString();
- if(!text.empty())
- {
- gMessageSystem->mOurCircuitCode = strtoul(text.c_str(), NULL, 10);
- }
- std::string sim_ip_str = response["sim_ip"];
- std::string sim_port_str = response["sim_port"];
- if(!sim_ip_str.empty() && !sim_port_str.empty())
- {
- U32 sim_port = strtoul(sim_port_str.c_str(), NULL, 10);
- gFirstSim.set(sim_ip_str, sim_port);
- if (gFirstSim.isOk())
- {
- gMessageSystem->enableCircuit(gFirstSim, TRUE);
- }
- }
- std::string region_x_str = response["region_x"];
- std::string region_y_str = response["region_y"];
- if(!region_x_str.empty() && !region_y_str.empty())
- {
- U32 region_x = strtoul(region_x_str.c_str(), NULL, 10);
- U32 region_y = strtoul(region_y_str.c_str(), NULL, 10);
- gFirstSimHandle = to_region_handle(region_x, region_y);
- }
-
- const std::string look_at_str = response["look_at"];
- if (!look_at_str.empty())
- {
- size_t len = look_at_str.size();
- LLMemoryStream mstr((U8*)look_at_str.c_str(), len);
- LLSD sd = LLSDSerialize::fromNotation(mstr, len);
- gAgentStartLookAt = ll_vector3_from_sd(sd);
- }
-
- text = response["seed_capability"].asString();
- if (!text.empty()) gFirstSimSeedCap = text;
-
- text = response["seconds_since_epoch"].asString();
- if(!text.empty())
- {
- U32 server_utc_time = strtoul(text.c_str(), NULL, 10);
- if(server_utc_time)
- {
- time_t now = time(NULL);
- gUTCOffset = (server_utc_time - now);
- }
- }
-
- // this is the base used to construct help URLs
- text = response["help_url_format"].asString();
- if (!text.empty())
- {
- // replace the default help URL format
- gSavedSettings.setString("HelpURLFormat",text);
-
- // don't fall back to Standalone's pre-connection static help
- gSavedSettings.setBOOL("HelpUseLocal", false);
- }
-
- std::string home_location = response["home"];
- if(!home_location.empty())
- {
- size_t len = home_location.size();
- LLMemoryStream mstr((U8*)home_location.c_str(), len);
- LLSD sd = LLSDSerialize::fromNotation(mstr, len);
- S32 region_x = sd["region_handle"][0].asInteger();
- S32 region_y = sd["region_handle"][1].asInteger();
- U64 region_handle = to_region_handle(region_x, region_y);
- LLVector3 position = ll_vector3_from_sd(sd["position"]);
- gAgent.setHomePosRegion(region_handle, position);
- }
-
- gAgent.mMOTD.assign(response["message"]);
-
- // Options...
- // Each 'option' is an array of submaps.
- // It appears that we only ever use the first element of the array.
- LLUUID inv_root_folder_id = response["inventory-root"][0]["folder_id"];
- if(inv_root_folder_id.notNull())
- {
- gInventory.setRootFolderID(inv_root_folder_id);
- //gInventory.mock(gAgent.getInventoryRootID());
- }
-
- LLSD login_flags = response["login-flags"][0];
- if(login_flags.size())
- {
- std::string flag = login_flags["ever_logged_in"];
- if(!flag.empty())
- {
- gAgent.setFirstLogin((flag == "N") ? TRUE : FALSE);
- }
-
- /* Flag is currently ignored by the viewer.
- flag = login_flags["stipend_since_login"];
- if(flag == "Y")
- {
- stipend_since_login = true;
- }
- */
-
- flag = login_flags["gendered"].asString();
- if(flag == "Y")
- {
- gAgent.setGenderChosen(TRUE);
- }
-
- bool pacific_daylight_time = false;
- flag = login_flags["daylight_savings"].asString();
- if(flag == "Y")
- {
- pacific_daylight_time = (flag == "Y");
- }
-
- //setup map of datetime strings to codes and slt & local time offset from utc
- LLStringOps::setupDatetimeInfo(pacific_daylight_time);
- }
-
- // set up the voice configuration. Ultimately, we should pass this up as part of each voice
- // channel if we need to move to multiple voice servers per grid.
- LLSD voice_config_info = response["voice-config"];
- if(voice_config_info.has("VoiceServerType"))
- {
- gSavedSettings.setString("VoiceServerType", voice_config_info["VoiceServerType"].asString());
- }
-
- // Request the map server url
- std::string map_server_url = response["map-server-url"];
- if(!map_server_url.empty())
- {
- // We got an answer from the grid -> use that for map for the current session
- gSavedSettings.setString("CurrentMapServerURL", map_server_url);
- LL_INFOS("LLStartup") << "map-server-url : we got an answer from the grid : " << map_server_url << LL_ENDL;
- }
- else
- {
- // No answer from the grid -> use the default setting for current session
- map_server_url = gSavedSettings.getString("MapServerURL");
- gSavedSettings.setString("CurrentMapServerURL", map_server_url);
- LL_INFOS("LLStartup") << "map-server-url : no map-server-url answer, we use the default setting for the map : " << map_server_url << LL_ENDL;
- }
-
- // Default male and female avatars allowing the user to choose their avatar on first login.
- // These may be passed up by SLE to allow choice of enterprise avatars instead of the standard
- // "new ruth." Not to be confused with 'initial-outfit' below
- LLSD newuser_config = response["newuser-config"][0];
- if(newuser_config.has("DefaultFemaleAvatar"))
- {
- gSavedSettings.setString("DefaultFemaleAvatar", newuser_config["DefaultFemaleAvatar"].asString());
- }
- if(newuser_config.has("DefaultMaleAvatar"))
- {
- gSavedSettings.setString("DefaultMaleAvatar", newuser_config["DefaultMaleAvatar"].asString());
- }
-
- // Initial outfit for the user.
- // QUESTION: Why can't we simply simply set the users outfit directly
- // from a web page into the user info on the server? - Roxie
- LLSD initial_outfit = response["initial-outfit"][0];
- if(initial_outfit.size())
- {
- std::string flag = initial_outfit["folder_name"];
- if(!flag.empty())
- {
- // Initial outfit is a folder in your inventory,
- // must be an exact folder-name match.
- sInitialOutfit = flag;
- }
-
- flag = initial_outfit["gender"].asString();
- if(!flag.empty())
- {
- sInitialOutfitGender = flag;
- }
- }
-
- LLSD global_textures = response["global-textures"][0];
- if(global_textures.size())
- {
- // Extract sun and moon texture IDs. These are used
- // in the LLVOSky constructor, but I can't figure out
- // how to pass them in. JC
- LLUUID id = global_textures["sun_texture_id"];
- if(id.notNull())
- {
- gSunTextureID = id;
- }
-
- id = global_textures["moon_texture_id"];
- if(id.notNull())
- {
- gMoonTextureID = id;
- }
-
- id = global_textures["cloud_texture_id"];
- if(id.notNull())
- {
- gCloudTextureID = id;
- }
- }
-
- // Set the location of the snapshot sharing config endpoint
- std::string snapshot_config_url = response["snapshot_config_url"];
- if(!snapshot_config_url.empty())
- {
- gSavedSettings.setString("SnapshotConfigURL", snapshot_config_url);
- }
-
- // Start the process of fetching the OpenID session cookie for this user login
- std::string openid_url = response["openid_url"];
- if(!openid_url.empty())
- {
- std::string openid_token = response["openid_token"];
- LLViewerMedia::openIDSetup(openid_url, openid_token);
- }
-
- if(response.has("max-agent-groups")) {
- std::string max_agent_groups(response["max-agent-groups"]);
- gMaxAgentGroups = atoi(max_agent_groups.c_str());
- LL_INFOS("LLStartup") << "gMaxAgentGroups read from login.cgi: "
- << gMaxAgentGroups << LL_ENDL;
- }
- else {
- gMaxAgentGroups = DEFAULT_MAX_AGENT_GROUPS;
- LL_INFOS("LLStartup") << "using gMaxAgentGroups default: "
- << gMaxAgentGroups << LL_ENDL;
- }
-
- bool success = false;
- // JC: gesture loading done below, when we have an asset system
- // in place. Don't delete/clear gUserCredentials until then.
- if(gAgentID.notNull()
- && gAgentSessionID.notNull()
- && gMessageSystem->mOurCircuitCode
- && gFirstSim.isOk()
- && gInventory.getRootFolderID().notNull())
- {
- success = true;
- }
-
- return success;
-}
-
-void transition_back_to_login_panel(const std::string& emsg)
-{
- if (gNoRender)
- {
- LL_WARNS("AppInit") << "Failed to login!" << LL_ENDL;
- LL_WARNS("AppInit") << emsg << LL_ENDL;
- exit(0);
- }
-
- // Bounce back to the login screen.
- reset_login(); // calls LLStartUp::setStartupState( STATE_LOGIN_SHOW );
- gSavedSettings.setBOOL("AutoLogin", FALSE);
-}
+/**
+ * @file llstartup.cpp
+ * @brief startup routines.
+ *
+ * $LicenseInfo:firstyear=2004&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 "llviewerprecompiledheaders.h"
+
+#include "llstartup.h"
+
+#if LL_WINDOWS
+# include <process.h> // _spawnl()
+#else
+# include <sys/stat.h> // mkdir()
+#endif
+
+#include "llviewermedia_streamingaudio.h"
+#include "llaudioengine.h"
+
+#ifdef LL_FMOD
+# include "llaudioengine_fmod.h"
+#endif
+
+#ifdef LL_OPENAL
+#include "llaudioengine_openal.h"
+#endif
+
+#include "llares.h"
+#include "llavatarnamecache.h"
+#include "lllandmark.h"
+#include "llcachename.h"
+#include "lldir.h"
+#include "llerrorcontrol.h"
+#include "llfloaterreg.h"
+#include "llfocusmgr.h"
+#include "llhttpsender.h"
+#include "llimfloater.h"
+#include "lllocationhistory.h"
+#include "llimageworker.h"
+
+#include "llloginflags.h"
+#include "llmd5.h"
+#include "llmemorystream.h"
+#include "llmessageconfig.h"
+#include "llmoveview.h"
+#include "llnearbychat.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
+#include "llteleporthistory.h"
+#include "llregionhandle.h"
+#include "llsd.h"
+#include "llsdserialize.h"
+#include "llsdutil_math.h"
+#include "llsecondlifeurls.h"
+#include "llstring.h"
+#include "lluserrelations.h"
+#include "llversioninfo.h"
+#include "llviewercontrol.h"
+#include "llvfs.h"
+#include "llxorcipher.h" // saved password, MAC address
+#include "llwindow.h"
+#include "imageids.h"
+#include "message.h"
+#include "v3math.h"
+
+#include "llagent.h"
+#include "llagentcamera.h"
+#include "llagentpicksinfo.h"
+#include "llagentwearables.h"
+#include "llagentpilot.h"
+#include "llfloateravatarpicker.h"
+#include "llcallbacklist.h"
+#include "llcallingcard.h"
+#include "llconsole.h"
+#include "llcontainerview.h"
+#include "lldebugview.h"
+#include "lldrawable.h"
+#include "lleventnotifier.h"
+#include "llface.h"
+#include "llfeaturemanager.h"
+//#include "llfirstuse.h"
+#include "llfloaterhud.h"
+#include "llfloaterland.h"
+#include "llfloaterpreference.h"
+#include "llfloatertopobjects.h"
+#include "llfloaterworldmap.h"
+#include "llgesturemgr.h"
+#include "llgroupmgr.h"
+#include "llhudeffecttrail.h"
+#include "llhudmanager.h"
+#include "llhttpclient.h"
+#include "llimagebmp.h"
+#include "llinventorybridge.h"
+#include "llinventorymodel.h"
+#include "llinventorymodelbackgroundfetch.h"
+#include "llkeyboard.h"
+#include "llloginhandler.h" // gLoginHandler, SLURL support
+#include "lllogininstance.h" // Host the login module.
+#include "llpanellogin.h"
+#include "llmutelist.h"
+#include "llavatarpropertiesprocessor.h"
+#include "llpanelclassified.h"
+#include "llpanelpick.h"
+#include "llpanelgrouplandmoney.h"
+#include "llpanelgroupnotices.h"
+#include "llpreview.h"
+#include "llpreviewscript.h"
+#include "llproductinforequest.h"
+#include "llsecondlifeurls.h"
+#include "llselectmgr.h"
+#include "llsky.h"
+#include "llsidetray.h"
+#include "llstatview.h"
+#include "llstatusbar.h" // sendMoneyBalanceRequest(), owns L$ balance
+#include "llsurface.h"
+#include "lltexturecache.h"
+#include "lltexturefetch.h"
+#include "lltoolmgr.h"
+#include "lltrans.h"
+#include "llui.h"
+#include "llurldispatcher.h"
+#include "llurlentry.h"
+#include "llslurl.h"
+#include "llurlhistory.h"
+#include "llurlwhitelist.h"
+#include "llvieweraudio.h"
+#include "llviewerassetstorage.h"
+#include "llviewercamera.h"
+#include "llviewerdisplay.h"
+#include "llviewergenericmessage.h"
+#include "llviewergesture.h"
+#include "llviewertexturelist.h"
+#include "llviewermedia.h"
+#include "llviewermenu.h"
+#include "llviewermessage.h"
+#include "llviewernetwork.h"
+#include "llviewerobjectlist.h"
+#include "llviewerparcelmedia.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+#include "llviewerstats.h"
+#include "llviewerthrottle.h"
+#include "llviewerwindow.h"
+#include "llvoavatar.h"
+#include "llvoavatarself.h"
+#include "llvoclouds.h"
+#include "llweb.h"
+#include "llworld.h"
+#include "llworldmapmessage.h"
+#include "llxfermanager.h"
+#include "pipeline.h"
+#include "llappviewer.h"
+#include "llfasttimerview.h"
+#include "llfloatermap.h"
+#include "llweb.h"
+#include "llvoiceclient.h"
+#include "llnamelistctrl.h"
+#include "llnamebox.h"
+#include "llnameeditor.h"
+#include "llpostprocess.h"
+#include "llwlparammanager.h"
+#include "llwaterparammanager.h"
+#include "llagentlanguage.h"
+#include "llwearable.h"
+#include "llinventorybridge.h"
+#include "llappearancemgr.h"
+#include "llavatariconctrl.h"
+#include "llvoicechannel.h"
+
+#include "lllogin.h"
+#include "llevents.h"
+#include "llstartuplistener.h"
+
+#if LL_WINDOWS
+#include "lldxhardware.h"
+#endif
+
+//
+// exported globals
+//
+bool gAgentMovementCompleted = false;
+S32 gMaxAgentGroups;
+
+std::string SCREEN_HOME_FILENAME = "screen_home.bmp";
+std::string SCREEN_LAST_FILENAME = "screen_last.bmp";
+
+LLPointer<LLViewerTexture> gStartTexture;
+
+//
+// Imported globals
+//
+extern S32 gStartImageWidth;
+extern S32 gStartImageHeight;
+
+//
+// local globals
+//
+static bool gGotUseCircuitCodeAck = false;
+static std::string sInitialOutfit;
+static std::string sInitialOutfitGender; // "male" or "female"
+static boost::signals2::connection sWearablesLoadedCon;
+
+static bool gUseCircuitCallbackCalled = false;
+
+EStartupState LLStartUp::gStartupState = STATE_FIRST;
+LLSLURL LLStartUp::sStartSLURL;
+
+static LLPointer<LLCredential> gUserCredential;
+static std::string gDisplayName;
+static BOOL gRememberPassword = TRUE;
+
+static U64 gFirstSimHandle = 0;
+static LLHost gFirstSim;
+static std::string gFirstSimSeedCap;
+static LLVector3 gAgentStartLookAt(1.0f, 0.f, 0.f);
+static std::string gAgentStartLocation = "safe";
+static bool mLoginStatePastUI = false;
+
+
+boost::scoped_ptr<LLEventPump> LLStartUp::sStateWatcher(new LLEventStream("StartupState"));
+boost::scoped_ptr<LLStartupListener> LLStartUp::sListener(new LLStartupListener());
+
+//
+// local function declaration
+//
+
+void login_show();
+void login_callback(S32 option, void* userdata);
+void show_first_run_dialog();
+bool first_run_dialog_callback(const LLSD& notification, const LLSD& response);
+void set_startup_status(const F32 frac, const std::string& string, const std::string& msg);
+bool login_alert_status(const LLSD& notification, const LLSD& response);
+void login_packet_failed(void**, S32 result);
+void use_circuit_callback(void**, S32 result);
+void register_viewer_callbacks(LLMessageSystem* msg);
+void asset_callback_nothing(LLVFS*, const LLUUID&, LLAssetType::EType, void*, S32);
+bool callback_choose_gender(const LLSD& notification, const LLSD& response);
+void init_start_screen(S32 location_id);
+void release_start_screen();
+void reset_login();
+LLSD transform_cert_args(LLPointer<LLCertificate> cert);
+void general_cert_done(const LLSD& notification, const LLSD& response);
+void trust_cert_done(const LLSD& notification, const LLSD& response);
+void apply_udp_blacklist(const std::string& csv);
+bool process_login_success_response();
+void transition_back_to_login_panel(const std::string& emsg);
+
+void callback_cache_name(const LLUUID& id, const std::string& full_name, bool is_group)
+{
+ LLNameBox::refreshAll(id, full_name, is_group);
+ LLNameEditor::refreshAll(id, full_name, is_group);
+
+ // TODO: Actually be intelligent about the refresh.
+ // For now, just brute force refresh the dialogs.
+ dialog_refresh_all();
+}
+
+//
+// exported functionality
+//
+
+//
+// local classes
+//
+
+namespace
+{
+ class LLNullHTTPSender : public LLHTTPSender
+ {
+ virtual void send(const LLHost& host,
+ const std::string& message, const LLSD& body,
+ LLHTTPClient::ResponderPtr response) const
+ {
+ LL_WARNS("AppInit") << " attemped to send " << message << " to " << host
+ << " with null sender" << LL_ENDL;
+ }
+ };
+}
+
+void update_texture_fetch()
+{
+ LLAppViewer::getTextureCache()->update(1); // unpauses the texture cache thread
+ LLAppViewer::getImageDecodeThread()->update(1); // unpauses the image thread
+ LLAppViewer::getTextureFetch()->update(1); // unpauses the texture fetch thread
+ gTextureList.updateImages(0.10f);
+}
+
+// Returns false to skip other idle processing. Should only return
+// true when all initialization done.
+bool idle_startup()
+{
+ LLMemType mt1(LLMemType::MTYPE_STARTUP);
+
+ const F32 PRECACHING_DELAY = gSavedSettings.getF32("PrecachingDelay");
+ static LLTimer timeout;
+ static S32 timeout_count = 0;
+
+ static LLTimer login_time;
+
+ // until this is encapsulated, this little hack for the
+ // auth/transform loop will do.
+ static F32 progress = 0.10f;
+
+ static std::string auth_desc;
+ static std::string auth_message;
+
+ static LLVector3 initial_sun_direction(1.f, 0.f, 0.f);
+ static LLVector3 agent_start_position_region(10.f, 10.f, 10.f); // default for when no space server
+
+ // last location by default
+ static S32 agent_location_id = START_LOCATION_ID_LAST;
+ static S32 location_which = START_LOCATION_ID_LAST;
+
+ static bool show_connect_box = true;
+
+ //static bool stipend_since_login = false;
+
+ // HACK: These are things from the main loop that usually aren't done
+ // until initialization is complete, but need to be done here for things
+ // to work.
+ gIdleCallbacks.callFunctions();
+ gViewerWindow->updateUI();
+ LLMortician::updateClass();
+
+ const std::string delims (" ");
+ std::string system;
+ int begIdx, endIdx;
+ std::string osString = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
+
+ begIdx = osString.find_first_not_of (delims);
+ endIdx = osString.find_first_of (delims, begIdx);
+ system = osString.substr (begIdx, endIdx - begIdx);
+ system += "Locale";
+
+ LLStringUtil::setLocale (LLTrans::getString(system));
+
+ if (!gNoRender)
+ {
+ //note: Removing this line will cause incorrect button size in the login screen. -- bao.
+ gTextureList.updateImages(0.01f) ;
+ }
+
+ if ( STATE_FIRST == LLStartUp::getStartupState() )
+ {
+ gViewerWindow->showCursor();
+ gViewerWindow->getWindow()->setCursor(UI_CURSOR_WAIT);
+
+ /////////////////////////////////////////////////
+ //
+ // Initialize stuff that doesn't need data from simulators
+ //
+
+ if (LLFeatureManager::getInstance()->isSafe())
+ {
+ LLNotificationsUtil::add("DisplaySetToSafe");
+ }
+ else if ((gSavedSettings.getS32("LastFeatureVersion") < LLFeatureManager::getInstance()->getVersion()) &&
+ (gSavedSettings.getS32("LastFeatureVersion") != 0))
+ {
+ LLNotificationsUtil::add("DisplaySetToRecommended");
+ }
+ else if ((gSavedSettings.getS32("LastGPUClass") != LLFeatureManager::getInstance()->getGPUClass()) &&
+ (gSavedSettings.getS32("LastGPUClass") != -1))
+ {
+ LLNotificationsUtil::add("DisplaySetToRecommended");
+ }
+ else if (!gViewerWindow->getInitAlert().empty())
+ {
+ LLNotificationsUtil::add(gViewerWindow->getInitAlert());
+ }
+
+ gSavedSettings.setS32("LastFeatureVersion", LLFeatureManager::getInstance()->getVersion());
+ gSavedSettings.setS32("LastGPUClass", LLFeatureManager::getInstance()->getGPUClass());
+
+ // load dynamic GPU/feature tables from website (S3)
+ LLFeatureManager::getInstance()->fetchHTTPTables();
+
+ std::string xml_file = LLUI::locateSkin("xui_version.xml");
+ LLXMLNodePtr root;
+ bool xml_ok = false;
+ if (LLXMLNode::parseFile(xml_file, root, NULL))
+ {
+ if( (root->hasName("xui_version") ) )
+ {
+ std::string value = root->getValue();
+ F32 version = 0.0f;
+ LLStringUtil::convertToF32(value, version);
+ if (version >= 1.0f)
+ {
+ xml_ok = true;
+ }
+ }
+ }
+ if (!xml_ok)
+ {
+ // If XML is bad, there's a good possibility that notifications.xml is ALSO bad.
+ // If that's so, then we'll get a fatal error on attempting to load it,
+ // which will display a nontranslatable error message that says so.
+ // Otherwise, we'll display a reasonable error message that IS translatable.
+ LLAppViewer::instance()->earlyExit("BadInstallation");
+ }
+ //
+ // Statistics stuff
+ //
+
+ // Load autopilot and stats stuff
+ gAgentPilot.load(gSavedSettings.getString("StatsPilotFile"));
+
+ //gErrorStream.setTime(gSavedSettings.getBOOL("LogTimestamps"));
+
+ // Load the throttle settings
+ gViewerThrottle.load();
+
+ if (ll_init_ares() == NULL || !gAres->isInitialized())
+ {
+ std::string diagnostic = "Could not start address resolution system";
+ LL_WARNS("AppInit") << diagnostic << LL_ENDL;
+ LLAppViewer::instance()->earlyExit("LoginFailedNoNetwork", LLSD().with("DIAGNOSTIC", diagnostic));
+ }
+
+ //
+ // Initialize messaging system
+ //
+ LL_DEBUGS("AppInit") << "Initializing messaging system..." << LL_ENDL;
+
+ std::string message_template_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"message_template.msg");
+
+ LLFILE* found_template = NULL;
+ found_template = LLFile::fopen(message_template_path, "r"); /* Flawfinder: ignore */
+
+ #if LL_WINDOWS
+ // On the windows dev builds, unpackaged, the message_template.msg
+ // file will be located in:
+ // build-vc**/newview/<config>/app_settings
+ if (!found_template)
+ {
+ message_template_path = gDirUtilp->getExpandedFilename(LL_PATH_EXECUTABLE, "app_settings", "message_template.msg");
+ found_template = LLFile::fopen(message_template_path.c_str(), "r"); /* Flawfinder: ignore */
+ }
+ #elif LL_DARWIN
+ // On Mac dev builds, message_template.msg lives in:
+ // indra/build-*/newview/<config>/Second Life/Contents/Resources/app_settings
+ if (!found_template)
+ {
+ message_template_path =
+ gDirUtilp->getExpandedFilename(LL_PATH_EXECUTABLE,
+ "../Resources/app_settings",
+ "message_template.msg");
+ found_template = LLFile::fopen(message_template_path.c_str(), "r"); /* Flawfinder: ignore */
+ }
+ #endif
+
+ if (found_template)
+ {
+ fclose(found_template);
+
+ U32 port = gSavedSettings.getU32("UserConnectionPort");
+
+ if ((NET_USE_OS_ASSIGNED_PORT == port) && // if nothing specified on command line (-port)
+ (gSavedSettings.getBOOL("ConnectionPortEnabled")))
+ {
+ port = gSavedSettings.getU32("ConnectionPort");
+ }
+
+ LLHTTPSender::setDefaultSender(new LLNullHTTPSender());
+
+ // TODO parameterize
+ const F32 circuit_heartbeat_interval = 5;
+ const F32 circuit_timeout = 100;
+
+ const LLUseCircuitCodeResponder* responder = NULL;
+ bool failure_is_fatal = true;
+
+ if(!start_messaging_system(
+ message_template_path,
+ port,
+ LLVersionInfo::getMajor(),
+ LLVersionInfo::getMinor(),
+ LLVersionInfo::getPatch(),
+ FALSE,
+ std::string(),
+ responder,
+ failure_is_fatal,
+ circuit_heartbeat_interval,
+ circuit_timeout))
+ {
+ std::string diagnostic = llformat(" Error: %d", gMessageSystem->getErrorCode());
+ LL_WARNS("AppInit") << diagnostic << LL_ENDL;
+ LLAppViewer::instance()->earlyExit("LoginFailedNoNetwork", LLSD().with("DIAGNOSTIC", diagnostic));
+ }
+
+ #if LL_WINDOWS
+ // On the windows dev builds, unpackaged, the message.xml file will
+ // be located in indra/build-vc**/newview/<config>/app_settings.
+ std::string message_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"message.xml");
+
+ if (!LLFile::isfile(message_path.c_str()))
+ {
+ LLMessageConfig::initClass("viewer", gDirUtilp->getExpandedFilename(LL_PATH_EXECUTABLE, "app_settings", ""));
+ }
+ else
+ {
+ LLMessageConfig::initClass("viewer", gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
+ }
+ #else
+ LLMessageConfig::initClass("viewer", gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
+ #endif
+
+ }
+ else
+ {
+ LLAppViewer::instance()->earlyExit("MessageTemplateNotFound", LLSD().with("PATH", message_template_path));
+ }
+
+ if(gMessageSystem && gMessageSystem->isOK())
+ {
+ // Initialize all of the callbacks in case of bad message
+ // system data
+ LLMessageSystem* msg = gMessageSystem;
+ msg->setExceptionFunc(MX_UNREGISTERED_MESSAGE,
+ invalid_message_callback,
+ NULL);
+ msg->setExceptionFunc(MX_PACKET_TOO_SHORT,
+ invalid_message_callback,
+ NULL);
+
+ // running off end of a packet is now valid in the case
+ // when a reader has a newer message template than
+ // the sender
+ /*msg->setExceptionFunc(MX_RAN_OFF_END_OF_PACKET,
+ invalid_message_callback,
+ NULL);*/
+ msg->setExceptionFunc(MX_WROTE_PAST_BUFFER_SIZE,
+ invalid_message_callback,
+ NULL);
+
+ if (gSavedSettings.getBOOL("LogMessages"))
+ {
+ LL_DEBUGS("AppInit") << "Message logging activated!" << LL_ENDL;
+ msg->startLogging();
+ }
+
+ // start the xfer system. by default, choke the downloads
+ // a lot...
+ const S32 VIEWER_MAX_XFER = 3;
+ start_xfer_manager(gVFS);
+ gXferManager->setMaxIncomingXfers(VIEWER_MAX_XFER);
+ F32 xfer_throttle_bps = gSavedSettings.getF32("XferThrottle");
+ if (xfer_throttle_bps > 1.f)
+ {
+ gXferManager->setUseAckThrottling(TRUE);
+ gXferManager->setAckThrottleBPS(xfer_throttle_bps);
+ }
+ gAssetStorage = new LLViewerAssetStorage(msg, gXferManager, gVFS, gStaticVFS);
+
+
+ F32 dropPercent = gSavedSettings.getF32("PacketDropPercentage");
+ msg->mPacketRing.setDropPercentage(dropPercent);
+
+ F32 inBandwidth = gSavedSettings.getF32("InBandwidth");
+ F32 outBandwidth = gSavedSettings.getF32("OutBandwidth");
+ if (inBandwidth != 0.f)
+ {
+ LL_DEBUGS("AppInit") << "Setting packetring incoming bandwidth to " << inBandwidth << LL_ENDL;
+ msg->mPacketRing.setUseInThrottle(TRUE);
+ msg->mPacketRing.setInBandwidth(inBandwidth);
+ }
+ if (outBandwidth != 0.f)
+ {
+ LL_DEBUGS("AppInit") << "Setting packetring outgoing bandwidth to " << outBandwidth << LL_ENDL;
+ msg->mPacketRing.setUseOutThrottle(TRUE);
+ msg->mPacketRing.setOutBandwidth(outBandwidth);
+ }
+ }
+
+ LL_INFOS("AppInit") << "Message System Initialized." << LL_ENDL;
+
+ //-------------------------------------------------
+ // Init audio, which may be needed for prefs dialog
+ // or audio cues in connection UI.
+ //-------------------------------------------------
+
+ if (FALSE == gSavedSettings.getBOOL("NoAudio"))
+ {
+ gAudiop = NULL;
+
+#ifdef LL_OPENAL
+ if (!gAudiop
+#if !LL_WINDOWS
+ && NULL == getenv("LL_BAD_OPENAL_DRIVER")
+#endif // !LL_WINDOWS
+ )
+ {
+ gAudiop = (LLAudioEngine *) new LLAudioEngine_OpenAL();
+ }
+#endif
+
+#ifdef LL_FMOD
+ if (!gAudiop
+#if !LL_WINDOWS
+ && NULL == getenv("LL_BAD_FMOD_DRIVER")
+#endif // !LL_WINDOWS
+ )
+ {
+ gAudiop = (LLAudioEngine *) new LLAudioEngine_FMOD();
+ }
+#endif
+
+ if (gAudiop)
+ {
+#if LL_WINDOWS
+ // FMOD on Windows needs the window handle to stop playing audio
+ // when window is minimized. JC
+ void* window_handle = (HWND)gViewerWindow->getPlatformWindow();
+#else
+ void* window_handle = NULL;
+#endif
+ bool init = gAudiop->init(kAUDIO_NUM_SOURCES, window_handle);
+ if(init)
+ {
+ gAudiop->setMuted(TRUE);
+ }
+ else
+ {
+ LL_WARNS("AppInit") << "Unable to initialize audio engine" << LL_ENDL;
+ delete gAudiop;
+ gAudiop = NULL;
+ }
+
+ if (gAudiop)
+ {
+ // if the audio engine hasn't set up its own preferred handler for streaming audio then set up the generic streaming audio implementation which uses media plugins
+ if (NULL == gAudiop->getStreamingAudioImpl())
+ {
+ LL_INFOS("AppInit") << "Using media plugins to render streaming audio" << LL_ENDL;
+ gAudiop->setStreamingAudioImpl(new LLStreamingAudio_MediaPlugins());
+ }
+ }
+ }
+ }
+
+ LL_INFOS("AppInit") << "Audio Engine Initialized." << LL_ENDL;
+
+ if (LLTimer::knownBadTimer())
+ {
+ LL_WARNS("AppInit") << "Unreliable timers detected (may be bad PCI chipset)!!" << LL_ENDL;
+ }
+
+ //
+ // Log on to system
+ //
+ if (gUserCredential.isNull())
+ {
+ gUserCredential = gLoginHandler.initializeLoginInfo();
+ }
+ if (gUserCredential.isNull())
+ {
+ show_connect_box = TRUE;
+ }
+ else if (gSavedSettings.getBOOL("AutoLogin"))
+ {
+ gRememberPassword = TRUE;
+ gSavedSettings.setBOOL("RememberPassword", TRUE);
+ show_connect_box = false;
+ }
+ else
+ {
+ gRememberPassword = gSavedSettings.getBOOL("RememberPassword");
+ show_connect_box = TRUE;
+ }
+ // Go to the next startup state
+ LLStartUp::setStartupState( STATE_BROWSER_INIT );
+ return FALSE;
+ }
+
+
+ if (STATE_BROWSER_INIT == LLStartUp::getStartupState())
+ {
+ LL_DEBUGS("AppInit") << "STATE_BROWSER_INIT" << LL_ENDL;
+ std::string msg = LLTrans::getString("LoginInitializingBrowser");
+ set_startup_status(0.03f, msg.c_str(), gAgent.mMOTD.c_str());
+ display_startup();
+ // LLViewerMedia::initBrowser();
+ LLStartUp::setStartupState( STATE_LOGIN_SHOW );
+ return FALSE;
+ }
+
+
+ if (STATE_LOGIN_SHOW == LLStartUp::getStartupState())
+ {
+ LL_DEBUGS("AppInit") << "Initializing Window" << LL_ENDL;
+
+ // if we've gone backwards in the login state machine, to this state where we show the UI
+ // AND the debug setting to exit in this case is true, then go ahead and bail quickly
+ if ( mLoginStatePastUI && gSavedSettings.getBOOL("QuitOnLoginActivated") )
+ {
+ // no requirement for notification here - just exit
+ LLAppViewer::instance()->earlyExitNoNotify();
+ }
+
+ gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW);
+
+ timeout_count = 0;
+
+ if (show_connect_box)
+ {
+ // Load all the name information out of the login view
+ // NOTE: Hits "Attempted getFields with no login view shown" warning, since we don't
+ // show the login view until login_show() is called below.
+ if (gUserCredential.isNull())
+ {
+ gUserCredential = gLoginHandler.initializeLoginInfo();
+ }
+ if (gNoRender)
+ {
+ LL_ERRS("AppInit") << "Need to autologin or use command line with norender!" << LL_ENDL;
+ }
+ // Make sure the process dialog doesn't hide things
+ gViewerWindow->setShowProgress(FALSE);
+
+ initialize_edit_menu();
+
+ // Show the login dialog
+ login_show();
+ // connect dialog is already shown, so fill in the names
+ if (gUserCredential.notNull())
+ {
+ LLPanelLogin::setFields( gUserCredential, gRememberPassword);
+ }
+ LLPanelLogin::giveFocus();
+
+ gSavedSettings.setBOOL("FirstRunThisInstall", FALSE);
+
+ LLStartUp::setStartupState( STATE_LOGIN_WAIT ); // Wait for user input
+ }
+ else
+ {
+ // skip directly to message template verification
+ LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
+ }
+
+ // *NOTE: This is where LLViewerParcelMgr::getInstance() used to get allocated before becoming LLViewerParcelMgr::getInstance().
+
+ // *NOTE: This is where gHUDManager used to bet allocated before becoming LLHUDManager::getInstance().
+
+ // *NOTE: This is where gMuteList used to get allocated before becoming LLMuteList::getInstance().
+
+ // Login screen needs menus for preferences, but we can enter
+ // this startup phase more than once.
+ if (gLoginMenuBarView == NULL)
+ {
+ init_menus();
+ }
+
+ gViewerWindow->setNormalControlsVisible( FALSE );
+ gLoginMenuBarView->setVisible( TRUE );
+ gLoginMenuBarView->setEnabled( TRUE );
+ show_debug_menus();
+
+ // Hide the splash screen
+ LLSplashScreen::hide();
+
+ // Push our window frontmost
+ gViewerWindow->getWindow()->show();
+ display_startup();
+
+ // DEV-16927. The following code removes errant keystrokes that happen while the window is being
+ // first made visible.
+#ifdef _WIN32
+ MSG msg;
+ while( PeekMessage( &msg, /*All hWnds owned by this thread */ NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE ) );
+#endif
+ timeout.reset();
+ return FALSE;
+ }
+
+ if (STATE_LOGIN_WAIT == LLStartUp::getStartupState())
+ {
+ // when we get to this state, we've already been past the login UI
+ // (possiblely automatically) - flag this so we can test in the
+ // STATE_LOGIN_SHOW state if we've gone backwards
+ mLoginStatePastUI = true;
+
+ // Don't do anything. Wait for the login view to call the login_callback,
+ // which will push us to the next state.
+
+ // Sleep so we don't spin the CPU
+ ms_sleep(1);
+ return FALSE;
+ }
+
+ if (STATE_LOGIN_CLEANUP == LLStartUp::getStartupState())
+ {
+ //reset the values that could have come in from a slurl
+ // DEV-42215: Make sure they're not empty -- gUserCredential
+ // might already have been set from gSavedSettings, and it's too bad
+ // to overwrite valid values with empty strings.
+
+ if (show_connect_box)
+ {
+ // TODO if not use viewer auth
+ // Load all the name information out of the login view
+ LLPanelLogin::getFields(gUserCredential, gRememberPassword);
+ // end TODO
+
+ // HACK: Try to make not jump on login
+ gKeyboard->resetKeys();
+ }
+
+ // when we get to this state, we've already been past the login UI
+ // (possiblely automatically) - flag this so we can test in the
+ // STATE_LOGIN_SHOW state if we've gone backwards
+ mLoginStatePastUI = true;
+
+ // save the credentials
+ std::string userid = "unknown";
+ if(gUserCredential.notNull())
+ {
+ userid = gUserCredential->userID();
+ gSecAPIHandler->saveCredential(gUserCredential, gRememberPassword);
+ }
+ gSavedSettings.setBOOL("RememberPassword", gRememberPassword);
+ LL_INFOS("AppInit") << "Attempting login as: " << userid << LL_ENDL;
+ gDebugInfo["LoginName"] = userid;
+
+ // create necessary directories
+ // *FIX: these mkdir's should error check
+ gDirUtilp->setLindenUserDir(userid);
+ LLFile::mkdir(gDirUtilp->getLindenUserDir());
+
+ // Set PerAccountSettingsFile to the default value.
+ std::string per_account_settings_file = LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount");
+ gSavedSettings.setString("PerAccountSettingsFile",
+ gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT,
+ LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount")));
+
+ // Note: can't store warnings files per account because some come up before login
+
+ // Overwrite default user settings with user settings
+ LLAppViewer::instance()->loadSettingsFromDirectory("Account");
+
+ // Need to set the LastLogoff time here if we don't have one. LastLogoff is used for "Recent Items" calculation
+ // and startup time is close enough if we don't have a real value.
+ if (gSavedPerAccountSettings.getU32("LastLogoff") == 0)
+ {
+ gSavedPerAccountSettings.setU32("LastLogoff", time_corrected());
+ }
+
+ //Default the path if one isn't set.
+ // *NOTE: unable to check variable differ from "InstantMessageLogPath" because it was
+ // provided in pre 2.0 viewer. See EXT-6661
+ if (gSavedPerAccountSettings.getString("InstantMessageLogPath").empty())
+ {
+ gDirUtilp->setChatLogsDir(gDirUtilp->getOSUserAppDir());
+ gSavedPerAccountSettings.setString("InstantMessageLogPath", gDirUtilp->getChatLogsDir());
+ }
+ else
+ {
+ gDirUtilp->setChatLogsDir(gSavedPerAccountSettings.getString("InstantMessageLogPath"));
+ }
+ gDirUtilp->setPerAccountChatLogsDir(userid);
+
+ LLFile::mkdir(gDirUtilp->getChatLogsDir());
+ LLFile::mkdir(gDirUtilp->getPerAccountChatLogsDir());
+
+
+ //good a place as any to create user windlight directories
+ std::string user_windlight_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight", ""));
+ LLFile::mkdir(user_windlight_path_name.c_str());
+
+ std::string user_windlight_skies_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", ""));
+ LLFile::mkdir(user_windlight_skies_path_name.c_str());
+
+ std::string user_windlight_water_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", ""));
+ LLFile::mkdir(user_windlight_water_path_name.c_str());
+
+ std::string user_windlight_days_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/days", ""));
+ LLFile::mkdir(user_windlight_days_path_name.c_str());
+
+
+ if (show_connect_box)
+ {
+ LLSLURL slurl;
+ LLPanelLogin::closePanel();
+ }
+
+
+ // Load URL History File
+ LLURLHistory::loadFile("url_history.xml");
+ // Load location history
+ LLLocationHistory::getInstance()->load();
+
+ // Load Avatars icons cache
+ LLAvatarIconIDCache::getInstance()->load();
+
+ // Load media plugin cookies
+ LLViewerMedia::loadCookieFile();
+
+ //-------------------------------------------------
+ // Handle startup progress screen
+ //-------------------------------------------------
+
+ // on startup the user can request to go to their home,
+ // their last location, or some URL "-url //sim/x/y[/z]"
+ // All accounts have both a home and a last location, and we don't support
+ // more locations than that. Choose the appropriate one. JC
+ switch (LLStartUp::getStartSLURL().getType())
+ {
+ case LLSLURL::LOCATION:
+ agent_location_id = START_LOCATION_ID_URL;
+ location_which = START_LOCATION_ID_LAST;
+ break;
+ case LLSLURL::LAST_LOCATION:
+ agent_location_id = START_LOCATION_ID_LAST;
+ location_which = START_LOCATION_ID_LAST;
+ break;
+ default:
+ agent_location_id = START_LOCATION_ID_HOME;
+ location_which = START_LOCATION_ID_HOME;
+ break;
+ }
+
+ gViewerWindow->getWindow()->setCursor(UI_CURSOR_WAIT);
+
+ if (!gNoRender)
+ {
+ init_start_screen(agent_location_id);
+ }
+
+ // Display the startup progress bar.
+ gViewerWindow->setShowProgress(TRUE);
+ gViewerWindow->setProgressCancelButtonVisible(TRUE, LLTrans::getString("Quit"));
+
+ // Poke the VFS, which could potentially block for a while if
+ // Windows XP is acting up
+ set_startup_status(0.07f, LLTrans::getString("LoginVerifyingCache"), LLStringUtil::null);
+ display_startup();
+
+ gVFS->pokeFiles();
+
+ LLStartUp::setStartupState( STATE_LOGIN_AUTH_INIT );
+
+ return FALSE;
+ }
+
+ if(STATE_LOGIN_AUTH_INIT == LLStartUp::getStartupState())
+ {
+ gDebugInfo["GridName"] = LLGridManager::getInstance()->getGridLabel();
+
+ // Update progress status and the display loop.
+ auth_desc = LLTrans::getString("LoginInProgress");
+ set_startup_status(progress, auth_desc, auth_message);
+ progress += 0.02f;
+ display_startup();
+
+ // Setting initial values...
+ LLLoginInstance* login = LLLoginInstance::getInstance();
+ login->setNotificationsInterface(LLNotifications::getInstance());
+ if(gNoRender)
+ {
+ // HACK, skip optional updates if you're running drones
+ login->setSkipOptionalUpdate(true);
+ }
+
+ login->setSerialNumber(LLAppViewer::instance()->getSerialNumber());
+ login->setLastExecEvent(gLastExecEvent);
+ login->setUpdaterLauncher(boost::bind(&LLAppViewer::launchUpdater, LLAppViewer::instance()));
+
+ // This call to LLLoginInstance::connect() starts the
+ // authentication process.
+ login->connect(gUserCredential);
+
+ LLStartUp::setStartupState( STATE_LOGIN_CURL_UNSTUCK );
+ return FALSE;
+ }
+
+ if(STATE_LOGIN_CURL_UNSTUCK == LLStartUp::getStartupState())
+ {
+ // If we get here we have gotten past the potential stall
+ // in curl, so take "may appear frozen" out of progress bar. JC
+ auth_desc = LLTrans::getString("LoginInProgressNoFrozen");
+ set_startup_status(progress, auth_desc, auth_message);
+
+ LLStartUp::setStartupState( STATE_LOGIN_PROCESS_RESPONSE );
+ return FALSE;
+ }
+
+ if(STATE_LOGIN_PROCESS_RESPONSE == LLStartUp::getStartupState())
+ {
+ std::ostringstream emsg;
+ emsg << LLTrans::getString("LoginFailed") << "\n";
+ if(LLLoginInstance::getInstance()->authFailure())
+ {
+ LL_INFOS("LLStartup") << "Login failed, LLLoginInstance::getResponse(): "
+ << LLLoginInstance::getInstance()->getResponse() << LL_ENDL;
+ LLSD response = LLLoginInstance::getInstance()->getResponse();
+ // Still have error conditions that may need some
+ // sort of handling.
+ std::string reason_response = response["reason"];
+ std::string message_response = response["message"];
+
+ if(!message_response.empty())
+ {
+ // XUI: fix translation for strings returned during login
+ // We need a generic table for translations
+ std::string big_reason = LLAgent::sTeleportErrorMessages[ message_response ];
+ if ( big_reason.size() == 0 )
+ {
+ emsg << message_response;
+ }
+ else
+ {
+ emsg << big_reason;
+ }
+ }
+
+ if(reason_response == "key")
+ {
+ // Couldn't login because user/password is wrong
+ // Clear the credential
+ gUserCredential->clearAuthenticator();
+ }
+
+ if(reason_response == "update"
+ || reason_response == "optional")
+ {
+ // In the case of a needed update, quit.
+ // Its either downloading or declined.
+ // If optional was skipped this case shouldn't
+ // be reached.
+ LLLoginInstance::getInstance()->disconnect();
+ LLAppViewer::instance()->forceQuit();
+ }
+ else
+ {
+ if (reason_response != "tos")
+ {
+ // Don't pop up a notification in the TOS case because
+ // LLFloaterTOS::onCancel() already scolded the user.
+ std::string error_code;
+ if(response.has("errorcode"))
+ {
+ error_code = response["errorcode"].asString();
+ }
+ if ((reason_response == "CURLError") &&
+ (error_code == "SSL_CACERT" || error_code == "SSL_PEER_CERTIFICATE") &&
+ response.has("certificate"))
+ {
+ // This was a certificate error, so grab the certificate
+ // and throw up the appropriate dialog.
+ LLPointer<LLCertificate> certificate = gSecAPIHandler->getCertificate(response["certificate"]);
+ if(certificate)
+ {
+ LLSD args = transform_cert_args(certificate);
+
+ if(error_code == "SSL_CACERT")
+ {
+ // if we are handling an untrusted CA, throw up the dialog
+ // with the 'trust this CA' button.
+ LLNotificationsUtil::add("TrustCertificateError", args, response,
+ trust_cert_done);
+
+ show_connect_box = true;
+ }
+ else
+ {
+ // the certificate exception returns a unique string for each type of exception.
+ // we grab this string via the LLUserAuth object, and use that to grab the localized
+ // string.
+ args["REASON"] = LLTrans::getString(message_response);
+
+ LLNotificationsUtil::add("GeneralCertificateError", args, response,
+ general_cert_done);
+
+ reset_login();
+ gSavedSettings.setBOOL("AutoLogin", FALSE);
+ show_connect_box = true;
+
+ }
+
+ }
+ }
+ else
+ {
+ // This wasn't a certificate error, so throw up the normal
+ // notificatioin message.
+ LLSD args;
+ args["ERROR_MESSAGE"] = emsg.str();
+ LL_INFOS("LLStartup") << "Notification: " << args << LL_ENDL;
+ LLNotificationsUtil::add("ErrorMessage", args, LLSD(), login_alert_done);
+ }
+ }
+ //setup map of datetime strings to codes and slt & local time offset from utc
+ // *TODO: Does this need to be here?
+ LLStringOps::setupDatetimeInfo (false);
+ transition_back_to_login_panel(emsg.str());
+ show_connect_box = true;
+ }
+ }
+ else if(LLLoginInstance::getInstance()->authSuccess())
+ {
+ if(process_login_success_response())
+ {
+ // Pass the user information to the voice chat server interface.
+ LLVoiceClient::getInstance()->userAuthorized(gUserCredential->userID(), gAgentID);
+ // create the default proximal channel
+ LLVoiceChannel::initClass();
+ LLGridManager::getInstance()->setFavorite();
+ LLStartUp::setStartupState( STATE_WORLD_INIT);
+ }
+ else
+ {
+ LLSD args;
+ args["ERROR_MESSAGE"] = emsg.str();
+ LL_INFOS("LLStartup") << "Notification: " << args << LL_ENDL;
+ LLNotificationsUtil::add("ErrorMessage", args, LLSD(), login_alert_done);
+ transition_back_to_login_panel(emsg.str());
+ show_connect_box = true;
+ return FALSE;
+ }
+ }
+ return FALSE;
+ }
+
+ //---------------------------------------------------------------------
+ // World Init
+ //---------------------------------------------------------------------
+ if (STATE_WORLD_INIT == LLStartUp::getStartupState())
+ {
+ set_startup_status(0.30f, LLTrans::getString("LoginInitializingWorld"), gAgent.mMOTD);
+ display_startup();
+ // We should have an agent id by this point.
+ llassert(!(gAgentID == LLUUID::null));
+
+ // Finish agent initialization. (Requires gSavedSettings, builds camera)
+ gAgent.init();
+ gAgentCamera.init();
+ set_underclothes_menu_options();
+
+ // Since we connected, save off the settings so the user doesn't have to
+ // type the name/password again if we crash.
+ gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);
+ LLUIColorTable::instance().saveUserSettings();
+
+ //
+ // Initialize classes w/graphics stuff.
+ //
+ gTextureList.doPrefetchImages();
+ LLSurface::initClasses();
+
+ LLFace::initClass();
+
+ LLDrawable::initClass();
+
+ // init the shader managers
+ LLPostProcess::initClass();
+ LLWLParamManager::initClass();
+ LLWaterParamManager::initClass();
+
+ LLViewerObject::initVOClasses();
+
+ // Initialize all our tools. Must be done after saved settings loaded.
+ // NOTE: This also is where gToolMgr used to be instantiated before being turned into a singleton.
+ LLToolMgr::getInstance()->initTools();
+
+ // Pre-load floaters, like the world map, that are slow to spawn
+ // due to XML complexity.
+ gViewerWindow->initWorldUI();
+
+ display_startup();
+
+ // This is where we used to initialize gWorldp. Original comment said:
+ // World initialization must be done after above window init
+
+ // User might have overridden far clip
+ LLWorld::getInstance()->setLandFarClip(gAgentCamera.mDrawDistance);
+
+ // Before we create the first region, we need to set the agent's mOriginGlobal
+ // This is necessary because creating objects before this is set will result in a
+ // bad mPositionAgent cache.
+
+ gAgent.initOriginGlobal(from_region_handle(gFirstSimHandle));
+
+ LLWorld::getInstance()->addRegion(gFirstSimHandle, gFirstSim);
+
+ LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(gFirstSimHandle);
+ LL_INFOS("AppInit") << "Adding initial simulator " << regionp->getOriginGlobal() << LL_ENDL;
+
+ regionp->setSeedCapability(gFirstSimSeedCap);
+ LL_DEBUGS("AppInit") << "Waiting for seed grant ...." << LL_ENDL;
+
+ // Set agent's initial region to be the one we just created.
+ gAgent.setRegion(regionp);
+
+ // Set agent's initial position, which will be read by LLVOAvatar when the avatar
+ // object is created. I think this must be done after setting the region. JC
+ gAgent.setPositionAgent(agent_start_position_region);
+
+ display_startup();
+ LLStartUp::setStartupState( STATE_MULTIMEDIA_INIT );
+
+ return FALSE;
+ }
+
+
+ //---------------------------------------------------------------------
+ // Load QuickTime/GStreamer and other multimedia engines, can be slow.
+ // Do it while we're waiting on the network for our seed capability. JC
+ //---------------------------------------------------------------------
+ if (STATE_MULTIMEDIA_INIT == LLStartUp::getStartupState())
+ {
+ LLStartUp::multimediaInit();
+ LLStartUp::setStartupState( STATE_FONT_INIT );
+ return FALSE;
+ }
+
+ // Loading fonts takes several seconds
+ if (STATE_FONT_INIT == LLStartUp::getStartupState())
+ {
+ LLStartUp::fontInit();
+ LLStartUp::setStartupState( STATE_SEED_GRANTED_WAIT );
+ return FALSE;
+ }
+
+ //---------------------------------------------------------------------
+ // Wait for Seed Cap Grant
+ //---------------------------------------------------------------------
+ if(STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())
+ {
+ return FALSE;
+ }
+
+
+ //---------------------------------------------------------------------
+ // Seed Capability Granted
+ // no newMessage calls should happen before this point
+ //---------------------------------------------------------------------
+ if (STATE_SEED_CAP_GRANTED == LLStartUp::getStartupState())
+ {
+ update_texture_fetch();
+
+ if ( gViewerWindow != NULL)
+ { // This isn't the first logon attempt, so show the UI
+ gViewerWindow->setNormalControlsVisible( TRUE );
+ }
+ gLoginMenuBarView->setVisible( FALSE );
+ gLoginMenuBarView->setEnabled( FALSE );
+
+ if (!gNoRender)
+ {
+ // direct logging to the debug console's line buffer
+ LLError::logToFixedBuffer(gDebugView->mDebugConsolep);
+
+ // set initial visibility of debug console
+ gDebugView->mDebugConsolep->setVisible(gSavedSettings.getBOOL("ShowDebugConsole"));
+ }
+
+ //
+ // Set message handlers
+ //
+ LL_INFOS("AppInit") << "Initializing communications..." << LL_ENDL;
+
+ // register callbacks for messages. . . do this after initial handshake to make sure that we don't catch any unwanted
+ register_viewer_callbacks(gMessageSystem);
+
+ // Debugging info parameters
+ gMessageSystem->setMaxMessageTime( 0.5f ); // Spam if decoding all msgs takes more than 500 ms
+
+ #ifndef LL_RELEASE_FOR_DOWNLOAD
+ gMessageSystem->setTimeDecodes( TRUE ); // Time the decode of each msg
+ gMessageSystem->setTimeDecodesSpamThreshold( 0.05f ); // Spam if a single msg takes over 50ms to decode
+ #endif
+
+ gXferManager->registerCallbacks(gMessageSystem);
+
+ LLStartUp::initNameCache();
+
+ // update the voice settings *after* gCacheName initialization
+ // so that we can construct voice UI that relies on the name cache
+ LLVoiceClient::getInstance()->updateSettings();
+
+ //gCacheName is required for nearby chat history loading
+ //so I just moved nearby history loading a few states further
+ if (!gNoRender && gSavedPerAccountSettings.getBOOL("LogShowHistory"))
+ {
+ LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();
+ if (nearby_chat) nearby_chat->loadHistory();
+ }
+
+ // *Note: this is where gWorldMap used to be initialized.
+
+ // register null callbacks for audio until the audio system is initialized
+ gMessageSystem->setHandlerFuncFast(_PREHASH_SoundTrigger, null_message_callback, NULL);
+ gMessageSystem->setHandlerFuncFast(_PREHASH_AttachedSound, null_message_callback, NULL);
+
+ //reset statistics
+ LLViewerStats::getInstance()->resetStats();
+
+ display_startup();
+ //
+ // Set up region and surface defaults
+ //
+
+
+ // Sets up the parameters for the first simulator
+
+ LL_DEBUGS("AppInit") << "Initializing camera..." << LL_ENDL;
+ gFrameTime = totalTime();
+ F32 last_time = gFrameTimeSeconds;
+ gFrameTimeSeconds = (S64)(gFrameTime - gStartTime)/SEC_TO_MICROSEC;
+
+ gFrameIntervalSeconds = gFrameTimeSeconds - last_time;
+ if (gFrameIntervalSeconds < 0.f)
+ {
+ gFrameIntervalSeconds = 0.f;
+ }
+
+ // Make sure agent knows correct aspect ratio
+ // FOV limits depend upon aspect ratio so this needs to happen before initializing the FOV below
+ LLViewerCamera::getInstance()->setViewHeightInPixels(gViewerWindow->getWorldViewHeightRaw());
+ LLViewerCamera::getInstance()->setAspect(gViewerWindow->getWorldViewAspectRatio());
+ // Initialize FOV
+ LLViewerCamera::getInstance()->setDefaultFOV(gSavedSettings.getF32("CameraAngle"));
+
+ // Move agent to starting location. The position handed to us by
+ // the space server is in global coordinates, but the agent frame
+ // is in region local coordinates. Therefore, we need to adjust
+ // the coordinates handed to us to fit in the local region.
+
+ gAgent.setPositionAgent(agent_start_position_region);
+ gAgent.resetAxes(gAgentStartLookAt);
+ gAgentCamera.stopCameraAnimation();
+ gAgentCamera.resetCamera();
+
+ // Initialize global class data needed for surfaces (i.e. textures)
+ if (!gNoRender)
+ {
+ LL_DEBUGS("AppInit") << "Initializing sky..." << LL_ENDL;
+ // Initialize all of the viewer object classes for the first time (doing things like texture fetches.
+ LLGLState::checkStates();
+ LLGLState::checkTextureChannels();
+
+ gSky.init(initial_sun_direction);
+
+ LLGLState::checkStates();
+ LLGLState::checkTextureChannels();
+ }
+
+ LL_DEBUGS("AppInit") << "Decoding images..." << LL_ENDL;
+ // For all images pre-loaded into viewer cache, decode them.
+ // Need to do this AFTER we init the sky
+ const S32 DECODE_TIME_SEC = 2;
+ for (int i = 0; i < DECODE_TIME_SEC; i++)
+ {
+ F32 frac = (F32)i / (F32)DECODE_TIME_SEC;
+ set_startup_status(0.45f + frac*0.1f, LLTrans::getString("LoginDecodingImages"), gAgent.mMOTD);
+ display_startup();
+ gTextureList.decodeAllImages(1.f);
+ }
+ LLStartUp::setStartupState( STATE_WORLD_WAIT );
+
+ // JC - Do this as late as possible to increase likelihood Purify
+ // will run.
+ LLMessageSystem* msg = gMessageSystem;
+ if (!msg->mOurCircuitCode)
+ {
+ LL_WARNS("AppInit") << "Attempting to connect to simulator with a zero circuit code!" << LL_ENDL;
+ }
+
+ gUseCircuitCallbackCalled = false;
+
+ msg->enableCircuit(gFirstSim, TRUE);
+ // now, use the circuit info to tell simulator about us!
+ LL_INFOS("AppInit") << "viewer: UserLoginLocationReply() Enabling " << gFirstSim << " with code " << msg->mOurCircuitCode << LL_ENDL;
+ msg->newMessageFast(_PREHASH_UseCircuitCode);
+ msg->nextBlockFast(_PREHASH_CircuitCode);
+ msg->addU32Fast(_PREHASH_Code, msg->mOurCircuitCode);
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->addUUIDFast(_PREHASH_ID, gAgent.getID());
+ msg->sendReliable(
+ gFirstSim,
+ gSavedSettings.getS32("UseCircuitCodeMaxRetries"),
+ FALSE,
+ gSavedSettings.getF32("UseCircuitCodeTimeout"),
+ use_circuit_callback,
+ NULL);
+
+ timeout.reset();
+
+ return FALSE;
+ }
+
+ //---------------------------------------------------------------------
+ // Agent Send
+ //---------------------------------------------------------------------
+ if(STATE_WORLD_WAIT == LLStartUp::getStartupState())
+ {
+ LL_DEBUGS("AppInit") << "Waiting for simulator ack...." << LL_ENDL;
+ set_startup_status(0.59f, LLTrans::getString("LoginWaitingForRegionHandshake"), gAgent.mMOTD);
+ if(gGotUseCircuitCodeAck)
+ {
+ LLStartUp::setStartupState( STATE_AGENT_SEND );
+ }
+ LLMessageSystem* msg = gMessageSystem;
+ while (msg->checkAllMessages(gFrameCount, gServicePump))
+ {
+ }
+ msg->processAcks();
+ return FALSE;
+ }
+
+ //---------------------------------------------------------------------
+ // Agent Send
+ //---------------------------------------------------------------------
+ if (STATE_AGENT_SEND == LLStartUp::getStartupState())
+ {
+ LL_DEBUGS("AppInit") << "Connecting to region..." << LL_ENDL;
+ set_startup_status(0.60f, LLTrans::getString("LoginConnectingToRegion"), gAgent.mMOTD);
+ // register with the message system so it knows we're
+ // expecting this message
+ LLMessageSystem* msg = gMessageSystem;
+ msg->setHandlerFuncFast(
+ _PREHASH_AgentMovementComplete,
+ process_agent_movement_complete);
+ LLViewerRegion* regionp = gAgent.getRegion();
+ if(regionp)
+ {
+ send_complete_agent_movement(regionp->getHost());
+ gAssetStorage->setUpstream(regionp->getHost());
+ gCacheName->setUpstream(regionp->getHost());
+ msg->newMessageFast(_PREHASH_EconomyDataRequest);
+ gAgent.sendReliableMessage();
+ }
+
+ // Create login effect
+ // But not on first login, because you can't see your avatar then
+ if (!gAgent.isFirstLogin())
+ {
+ LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE);
+ effectp->setPositionGlobal(gAgent.getPositionGlobal());
+ effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+ LLHUDManager::getInstance()->sendEffects();
+ }
+
+ LLStartUp::setStartupState( STATE_AGENT_WAIT ); // Go to STATE_AGENT_WAIT
+
+ timeout.reset();
+ return FALSE;
+ }
+
+ //---------------------------------------------------------------------
+ // Agent Wait
+ //---------------------------------------------------------------------
+ if (STATE_AGENT_WAIT == LLStartUp::getStartupState())
+ {
+ LLMessageSystem* msg = gMessageSystem;
+ while (msg->checkAllMessages(gFrameCount, gServicePump))
+ {
+ if (gAgentMovementCompleted)
+ {
+ // Sometimes we have more than one message in the
+ // queue. break out of this loop and continue
+ // processing. If we don't, then this could skip one
+ // or more login steps.
+ break;
+ }
+ else
+ {
+ LL_DEBUGS("AppInit") << "Awaiting AvatarInitComplete, got "
+ << msg->getMessageName() << LL_ENDL;
+ }
+ }
+ msg->processAcks();
+
+ if (gAgentMovementCompleted)
+ {
+ LLStartUp::setStartupState( STATE_INVENTORY_SEND );
+ }
+
+ return FALSE;
+ }
+
+ //---------------------------------------------------------------------
+ // Inventory Send
+ //---------------------------------------------------------------------
+ if (STATE_INVENTORY_SEND == LLStartUp::getStartupState())
+ {
+ // Inform simulator of our language preference
+ LLAgentLanguage::update();
+
+ // unpack thin inventory
+ LLSD response = LLLoginInstance::getInstance()->getResponse();
+ //bool dump_buffer = false;
+
+ LLSD inv_lib_root = response["inventory-lib-root"];
+ if(inv_lib_root.isDefined())
+ {
+ // should only be one
+ LLSD id = inv_lib_root[0]["folder_id"];
+ if(id.isDefined())
+ {
+ gInventory.setLibraryRootFolderID(id.asUUID());
+ }
+ }
+
+ LLSD inv_lib_owner = response["inventory-lib-owner"];
+ if(inv_lib_owner.isDefined())
+ {
+ // should only be one
+ LLSD id = inv_lib_owner[0]["agent_id"];
+ if(id.isDefined())
+ {
+ gInventory.setLibraryOwnerID( LLUUID(id.asUUID()));
+ }
+ }
+
+ LLSD inv_skel_lib = response["inventory-skel-lib"];
+ if(inv_skel_lib.isDefined() && gInventory.getLibraryOwnerID().notNull())
+ {
+ if(!gInventory.loadSkeleton(inv_skel_lib, gInventory.getLibraryOwnerID()))
+ {
+ LL_WARNS("AppInit") << "Problem loading inventory-skel-lib" << LL_ENDL;
+ }
+ }
+
+ LLSD inv_skeleton = response["inventory-skeleton"];
+ if(inv_skeleton.isDefined())
+ {
+ if(!gInventory.loadSkeleton(inv_skeleton, gAgent.getID()))
+ {
+ LL_WARNS("AppInit") << "Problem loading inventory-skel-targets" << LL_ENDL;
+ }
+ }
+
+ LLSD buddy_list = response["buddy-list"];
+ if(buddy_list.isDefined())
+ {
+ LLAvatarTracker::buddy_map_t list;
+ LLUUID agent_id;
+ S32 has_rights = 0, given_rights = 0;
+ for(LLSD::array_const_iterator it = buddy_list.beginArray(),
+ end = buddy_list.endArray(); it != end; ++it)
+ {
+ LLSD buddy_id = (*it)["buddy_id"];
+ if(buddy_id.isDefined())
+ {
+ agent_id = buddy_id.asUUID();
+ }
+
+ LLSD buddy_rights_has = (*it)["buddy_rights_has"];
+ if(buddy_rights_has.isDefined())
+ {
+ has_rights = buddy_rights_has.asInteger();
+ }
+
+ LLSD buddy_rights_given = (*it)["buddy_rights_given"];
+ if(buddy_rights_given.isDefined())
+ {
+ given_rights = buddy_rights_given.asInteger();
+ }
+
+ list[agent_id] = new LLRelationship(given_rights, has_rights, false);
+ }
+ LLAvatarTracker::instance().addBuddyList(list);
+ }
+
+ bool show_hud = false;
+ LLSD tutorial_setting = response["tutorial_setting"];
+ if(tutorial_setting.isDefined())
+ {
+ for(LLSD::array_const_iterator it = tutorial_setting.beginArray(),
+ end = tutorial_setting.endArray(); it != end; ++it)
+ {
+ LLSD tutorial_url = (*it)["tutorial_url"];
+ if(tutorial_url.isDefined())
+ {
+ // Tutorial floater will append language code
+ gSavedSettings.setString("TutorialURL", tutorial_url.asString());
+ }
+
+ // For Viewer 2.0 we are not using the web-based tutorial
+ // If we reverse that decision, put this code back and use
+ // login.cgi to send a different URL with content that matches
+ // the Viewer 2.0 UI.
+ //LLSD use_tutorial = (*it)["use_tutorial"];
+ //if(use_tutorial.asString() == "true")
+ //{
+ // show_hud = true;
+ //}
+ }
+ }
+ // Either we want to show tutorial because this is the first login
+ // to a Linden Help Island or the user quit with the tutorial
+ // visible. JC
+ if (show_hud || gSavedSettings.getBOOL("ShowTutorial"))
+ {
+ LLFloaterReg::showInstance("hud", LLSD(), FALSE);
+ }
+
+ LLSD event_notifications = response["event_notifications"];
+ if(event_notifications.isDefined())
+ {
+ gEventNotifier.load(event_notifications);
+ }
+
+ LLSD classified_categories = response["classified_categories"];
+ if(classified_categories.isDefined())
+ {
+ LLClassifiedInfo::loadCategories(classified_categories);
+ }
+
+ // This method MUST be called before gInventory.findCategoryUUIDForType because of
+ // gInventory.mIsAgentInvUsable is set to true in the gInventory.buildParentChildMap.
+ gInventory.buildParentChildMap();
+
+ //all categories loaded. lets create "My Favorites" category
+ gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE,true);
+
+ // set up callbacks
+ llinfos << "Registering Callbacks" << llendl;
+ LLMessageSystem* msg = gMessageSystem;
+ llinfos << " Inventory" << llendl;
+ LLInventoryModel::registerCallbacks(msg);
+ llinfos << " AvatarTracker" << llendl;
+ LLAvatarTracker::instance().registerCallbacks(msg);
+ llinfos << " Landmark" << llendl;
+ LLLandmark::registerCallbacks(msg);
+
+ // request mute list
+ llinfos << "Requesting Mute List" << llendl;
+ LLMuteList::getInstance()->requestFromServer(gAgent.getID());
+
+ // Get L$ and ownership credit information
+ llinfos << "Requesting Money Balance" << llendl;
+ LLStatusBar::sendMoneyBalanceRequest();
+
+ // request all group information
+ llinfos << "Requesting Agent Data" << llendl;
+ gAgent.sendAgentDataUpdateRequest();
+
+ // Create the inventory views
+ llinfos << "Creating Inventory Views" << llendl;
+ LLFloaterReg::getInstance("inventory");
+
+ LLStartUp::setStartupState( STATE_MISC );
+ return FALSE;
+ }
+
+
+ //---------------------------------------------------------------------
+ // Misc
+ //---------------------------------------------------------------------
+ if (STATE_MISC == LLStartUp::getStartupState())
+ {
+ // We have a region, and just did a big inventory download.
+ // We can estimate the user's connection speed, and set their
+ // max bandwidth accordingly. JC
+ if (gSavedSettings.getBOOL("FirstLoginThisInstall"))
+ {
+ // This is actually a pessimistic computation, because TCP may not have enough
+ // time to ramp up on the (small) default inventory file to truly measure max
+ // bandwidth. JC
+ F64 rate_bps = LLLoginInstance::getInstance()->getLastTransferRateBPS();
+ const F32 FAST_RATE_BPS = 600.f * 1024.f;
+ const F32 FASTER_RATE_BPS = 750.f * 1024.f;
+ F32 max_bandwidth = gViewerThrottle.getMaxBandwidth();
+ if (rate_bps > FASTER_RATE_BPS
+ && rate_bps > max_bandwidth)
+ {
+ LL_DEBUGS("AppInit") << "Fast network connection, increasing max bandwidth to "
+ << FASTER_RATE_BPS/1024.f
+ << " kbps" << LL_ENDL;
+ gViewerThrottle.setMaxBandwidth(FASTER_RATE_BPS / 1024.f);
+ }
+ else if (rate_bps > FAST_RATE_BPS
+ && rate_bps > max_bandwidth)
+ {
+ LL_DEBUGS("AppInit") << "Fast network connection, increasing max bandwidth to "
+ << FAST_RATE_BPS/1024.f
+ << " kbps" << LL_ENDL;
+ gViewerThrottle.setMaxBandwidth(FAST_RATE_BPS / 1024.f);
+ }
+
+ // Set the show start location to true, now that the user has logged
+ // on with this install.
+ gSavedSettings.setBOOL("ShowStartLocation", TRUE);
+ }
+
+ // We're successfully logged in.
+ gSavedSettings.setBOOL("FirstLoginThisInstall", FALSE);
+
+ LLFloaterReg::showInitialVisibleInstances();
+
+ // based on the comments, we've successfully logged in so we can delete the 'forced'
+ // URL that the updater set in settings.ini (in a mostly paranoid fashion)
+ std::string nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" );
+ if ( nextLoginLocation.length() )
+ {
+ // clear it
+ gSavedSettings.setString( "NextLoginLocation", "" );
+
+ // and make sure it's saved
+ gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile") , TRUE );
+ LLUIColorTable::instance().saveUserSettings();
+ };
+
+ if (!gNoRender)
+ {
+ // JC: Initializing audio requests many sounds for download.
+ init_audio();
+
+ // JC: Initialize "active" gestures. This may also trigger
+ // many gesture downloads, if this is the user's first
+ // time on this machine or -purge has been run.
+ LLSD gesture_options
+ = LLLoginInstance::getInstance()->getResponse("gestures");
+ if (gesture_options.isDefined())
+ {
+ LL_DEBUGS("AppInit") << "Gesture Manager loading " << gesture_options.size()
+ << LL_ENDL;
+ uuid_vec_t item_ids;
+ for(LLSD::array_const_iterator resp_it = gesture_options.beginArray(),
+ end = gesture_options.endArray(); resp_it != end; ++resp_it)
+ {
+ // If the id is not specifed in the LLSD,
+ // the LLSD operator[]() will return a null LLUUID.
+ LLUUID item_id = (*resp_it)["item_id"];
+ LLUUID asset_id = (*resp_it)["asset_id"];
+
+ if (item_id.notNull() && asset_id.notNull())
+ {
+ // Could schedule and delay these for later.
+ const BOOL no_inform_server = FALSE;
+ const BOOL no_deactivate_similar = FALSE;
+ LLGestureMgr::instance().activateGestureWithAsset(item_id, asset_id,
+ no_inform_server,
+ no_deactivate_similar);
+ // We need to fetch the inventory items for these gestures
+ // so we have the names to populate the UI.
+ item_ids.push_back(item_id);
+ }
+ }
+ // no need to add gesture to inventory observer, it's already made in constructor
+ LLGestureMgr::instance().setFetchIDs(item_ids);
+ LLGestureMgr::instance().startFetch();
+ }
+ }
+ gDisplaySwapBuffers = TRUE;
+
+ LLMessageSystem* msg = gMessageSystem;
+ msg->setHandlerFuncFast(_PREHASH_SoundTrigger, process_sound_trigger);
+ msg->setHandlerFuncFast(_PREHASH_PreloadSound, process_preload_sound);
+ msg->setHandlerFuncFast(_PREHASH_AttachedSound, process_attached_sound);
+ msg->setHandlerFuncFast(_PREHASH_AttachedSoundGainChange, process_attached_sound_gain_change);
+
+ LL_DEBUGS("AppInit") << "Initialization complete" << LL_ENDL;
+
+ gRenderStartTime.reset();
+ gForegroundTime.reset();
+
+ // HACK: Inform simulator of window size.
+ // Do this here so it's less likely to race with RegisterNewAgent.
+ // TODO: Put this into RegisterNewAgent
+ // JC - 7/20/2002
+ gViewerWindow->sendShapeToSim();
+
+
+ // Ignore stipend information for now. Money history is on the web site.
+ // if needed, show the L$ history window
+ //if (stipend_since_login && !gNoRender)
+ //{
+ //}
+
+ // The reason we show the alert is because we want to
+ // reduce confusion for when you log in and your provided
+ // location is not your expected location. So, if this is
+ // your first login, then you do not have an expectation,
+ // thus, do not show this alert.
+ if (!gAgent.isFirstLogin())
+ {
+ llinfos << "gAgentStartLocation : " << gAgentStartLocation << llendl;
+ LLSLURL start_slurl = LLStartUp::getStartSLURL();
+
+ if (((start_slurl.getType() == LLSLURL::LOCATION) && (gAgentStartLocation == "url")) ||
+ ((start_slurl.getType() == LLSLURL::LAST_LOCATION) && (gAgentStartLocation == "last")) ||
+ ((start_slurl.getType() == LLSLURL::HOME_LOCATION) && (gAgentStartLocation == "home")))
+ {
+ // Start location is OK
+ // Disabled code to restore camera location and focus if logging in to default location
+ static bool samename = false;
+ if (samename)
+ {
+ // restore old camera pos
+ gAgentCamera.setFocusOnAvatar(FALSE, FALSE);
+ gAgentCamera.setCameraPosAndFocusGlobal(gSavedSettings.getVector3d("CameraPosOnLogout"), gSavedSettings.getVector3d("FocusPosOnLogout"), LLUUID::null);
+ BOOL limit_hit = FALSE;
+ gAgentCamera.calcCameraPositionTargetGlobal(&limit_hit);
+ if (limit_hit)
+ {
+ gAgentCamera.setFocusOnAvatar(TRUE, FALSE);
+ }
+ gAgentCamera.stopCameraAnimation();
+ }
+ }
+ else
+ {
+ std::string msg;
+ switch(start_slurl.getType())
+ {
+ case LLSLURL::LOCATION:
+ {
+
+ msg = "AvatarMovedDesired";
+ break;
+ }
+ case LLSLURL::HOME_LOCATION:
+ {
+ msg = "AvatarMovedHome";
+ break;
+ }
+ default:
+ {
+ msg = "AvatarMovedLast";
+ }
+ }
+ LLNotificationsUtil::add(msg);
+ }
+ }
+
+ //DEV-17797. get null folder. Any items found here moved to Lost and Found
+ LLInventoryModelBackgroundFetch::instance().findLostItems();
+
+ LLStartUp::setStartupState( STATE_PRECACHE );
+ timeout.reset();
+ return FALSE;
+ }
+
+ if (STATE_PRECACHE == LLStartUp::getStartupState())
+ {
+ F32 timeout_frac = timeout.getElapsedTimeF32()/PRECACHING_DELAY;
+
+ // We now have an inventory skeleton, so if this is a user's first
+ // login, we can start setting up their clothing and avatar
+ // appearance. This helps to avoid the generic "Ruth" avatar in
+ // the orientation island tutorial experience. JC
+ if (gAgent.isFirstLogin()
+ && !sInitialOutfit.empty() // registration set up an outfit
+ && !sInitialOutfitGender.empty() // and a gender
+ && isAgentAvatarValid() // can't wear clothes without object
+ && !gAgent.isGenderChosen() ) // nothing already loading
+ {
+ // Start loading the wearables, textures, gestures
+ LLStartUp::loadInitialOutfit( sInitialOutfit, sInitialOutfitGender );
+ }
+
+ // wait precache-delay and for agent's avatar or a lot longer.
+ if(((timeout_frac > 1.f) && isAgentAvatarValid())
+ || (timeout_frac > 3.f))
+ {
+ LLStartUp::setStartupState( STATE_WEARABLES_WAIT );
+ }
+ else
+ {
+ update_texture_fetch();
+ set_startup_status(0.60f + 0.30f * timeout_frac,
+ LLTrans::getString("LoginPrecaching"),
+ gAgent.mMOTD);
+ display_startup();
+ if (!LLViewerShaderMgr::sInitialized)
+ {
+ LLViewerShaderMgr::sInitialized = TRUE;
+ LLViewerShaderMgr::instance()->setShaders();
+ }
+ }
+
+ return TRUE;
+ }
+
+ if (STATE_WEARABLES_WAIT == LLStartUp::getStartupState())
+ {
+ static LLFrameTimer wearables_timer;
+
+ const F32 wearables_time = wearables_timer.getElapsedTimeF32();
+ const F32 MAX_WEARABLES_TIME = 10.f;
+
+ if (!gAgent.isGenderChosen())
+ {
+ // No point in waiting for clothing, we don't even
+ // know what gender we are. Pop a dialog to ask and
+ // proceed to draw the world. JC
+ //
+ // *NOTE: We might hit this case even if we have an
+ // initial outfit, but if the load hasn't started
+ // already then something is wrong so fall back
+ // to generic outfits. JC
+ LLNotificationsUtil::add("WelcomeChooseSex", LLSD(), LLSD(),
+ callback_choose_gender);
+ LLStartUp::setStartupState( STATE_CLEANUP );
+ return TRUE;
+ }
+
+ if (wearables_time > MAX_WEARABLES_TIME)
+ {
+ LLNotificationsUtil::add("ClothingLoading");
+ LLViewerStats::getInstance()->incStat(LLViewerStats::ST_WEARABLES_TOO_LONG);
+ LLStartUp::setStartupState( STATE_CLEANUP );
+ return TRUE;
+ }
+
+ if (gAgent.isFirstLogin())
+ {
+ // wait for avatar to be completely loaded
+ if (isAgentAvatarValid()
+ && gAgentAvatarp->isFullyLoaded())
+ {
+ //llinfos << "avatar fully loaded" << llendl;
+ LLStartUp::setStartupState( STATE_CLEANUP );
+ return TRUE;
+ }
+ }
+ else
+ {
+ // OK to just get the wearables
+ if ( gAgentWearables.areWearablesLoaded() )
+ {
+ // We have our clothing, proceed.
+ //llinfos << "wearables loaded" << llendl;
+ LLStartUp::setStartupState( STATE_CLEANUP );
+ return TRUE;
+ }
+ }
+
+ update_texture_fetch();
+ set_startup_status(0.9f + 0.1f * wearables_time / MAX_WEARABLES_TIME,
+ LLTrans::getString("LoginDownloadingClothing").c_str(),
+ gAgent.mMOTD.c_str());
+ return TRUE;
+ }
+
+ if (STATE_CLEANUP == LLStartUp::getStartupState())
+ {
+ set_startup_status(1.0, "", "");
+
+ // Let the map know about the inventory.
+ LLFloaterWorldMap* floater_world_map = LLFloaterWorldMap::getInstance();
+ if(floater_world_map)
+ {
+ floater_world_map->observeInventory(&gInventory);
+ floater_world_map->observeFriends();
+ }
+ gViewerWindow->showCursor();
+ gViewerWindow->getWindow()->resetBusyCount();
+ gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW);
+ LL_DEBUGS("AppInit") << "Done releasing bitmap" << LL_ENDL;
+ gViewerWindow->setShowProgress(FALSE);
+ gViewerWindow->setProgressCancelButtonVisible(FALSE);
+
+ // We're not away from keyboard, even though login might have taken
+ // a while. JC
+ gAgent.clearAFK();
+
+ // Have the agent start watching the friends list so we can update proxies
+ gAgent.observeFriends();
+ if (gSavedSettings.getBOOL("LoginAsGod"))
+ {
+ gAgent.requestEnterGodMode();
+ }
+
+ // Start automatic replay if the flag is set.
+ if (gSavedSettings.getBOOL("StatsAutoRun") || LLAgentPilot::sReplaySession)
+ {
+ LLUUID id;
+ LL_DEBUGS("AppInit") << "Starting automatic playback" << LL_ENDL;
+ gAgentPilot.startPlayback();
+ }
+
+ show_debug_menus(); // Debug menu visiblity and First Use trigger
+
+ // If we've got a startup URL, dispatch it
+ LLStartUp::dispatchURL();
+
+ // Retrieve information about the land data
+ // (just accessing this the first time will fetch it,
+ // then the data is cached for the viewer's lifetime)
+ LLProductInfoRequestManager::instance();
+
+ // *FIX:Mani - What do I do here?
+ // Need we really clear the Auth response data?
+ // Clean up the userauth stuff.
+ // LLUserAuth::getInstance()->reset();
+
+ LLStartUp::setStartupState( STATE_STARTED );
+
+ // Unmute audio if desired and setup volumes.
+ // Unmute audio if desired and setup volumes.
+ // This is a not-uncommon crash site, so surround it with
+ // llinfos output to aid diagnosis.
+ LL_INFOS("AppInit") << "Doing first audio_update_volume..." << LL_ENDL;
+ audio_update_volume();
+ LL_INFOS("AppInit") << "Done first audio_update_volume." << LL_ENDL;
+
+ // reset keyboard focus to sane state of pointing at world
+ gFocusMgr.setKeyboardFocus(NULL);
+
+#if 0 // sjb: enable for auto-enabling timer display
+ gDebugView->mFastTimerView->setVisible(TRUE);
+#endif
+
+ LLAppViewer::instance()->handleLoginComplete();
+
+ // reset timers now that we are running "logged in" logic
+ LLFastTimer::reset();
+
+ LLAgentPicksInfo::getInstance()->requestNumberOfPicks();
+
+ LLIMFloater::initIMFloater();
+
+ return TRUE;
+ }
+
+ LL_WARNS("AppInit") << "Reached end of idle_startup for state " << LLStartUp::getStartupState() << LL_ENDL;
+ return TRUE;
+}
+
+//
+// local function definition
+//
+
+void login_show()
+{
+ LL_INFOS("AppInit") << "Initializing Login Screen" << LL_ENDL;
+
+#ifdef LL_RELEASE_FOR_DOWNLOAD
+ BOOL bUseDebugLogin = gSavedSettings.getBOOL("UseDebugLogin");
+#else
+ BOOL bUseDebugLogin = TRUE;
+#endif
+
+ LLPanelLogin::show( gViewerWindow->getWindowRectScaled(),
+ bUseDebugLogin || gSavedSettings.getBOOL("SecondLifeEnterprise"),
+ login_callback, NULL );
+
+}
+
+// Callback for when login screen is closed. Option 0 = connect, option 1 = quit.
+void login_callback(S32 option, void *userdata)
+{
+ const S32 CONNECT_OPTION = 0;
+ const S32 QUIT_OPTION = 1;
+
+ if (CONNECT_OPTION == option)
+ {
+ LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
+ return;
+ }
+ else if (QUIT_OPTION == option) // *TODO: THIS CODE SEEMS TO BE UNREACHABLE!!!!! login_callback is never called with option equal to QUIT_OPTION
+ {
+ if (!gSavedSettings.getBOOL("RememberPassword"))
+ {
+ // turn off the setting and write out to disk
+ gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile") , TRUE );
+ LLUIColorTable::instance().saveUserSettings();
+ }
+
+ // Next iteration through main loop should shut down the app cleanly.
+ LLAppViewer::instance()->userQuit();
+
+ if (LLAppViewer::instance()->quitRequested())
+ {
+ LLPanelLogin::closePanel();
+ }
+ return;
+ }
+ else
+ {
+ LL_WARNS("AppInit") << "Unknown login button clicked" << LL_ENDL;
+ }
+}
+
+void show_first_run_dialog()
+{
+ LLNotificationsUtil::add("FirstRun", LLSD(), LLSD(), first_run_dialog_callback);
+}
+
+bool first_run_dialog_callback(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (0 == option)
+ {
+ LL_DEBUGS("AppInit") << "First run dialog cancelling" << LL_ENDL;
+ LLWeb::loadURLExternal(LLTrans::getString("create_account_url") );
+ }
+
+ LLPanelLogin::giveFocus();
+ return false;
+}
+
+
+
+void set_startup_status(const F32 frac, const std::string& string, const std::string& msg)
+{
+ gViewerWindow->setProgressPercent(frac*100);
+ gViewerWindow->setProgressString(string);
+
+ gViewerWindow->setProgressMessage(msg);
+}
+
+bool login_alert_status(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ // Buttons
+ switch( option )
+ {
+ case 0: // OK
+ break;
+ // case 1: // Help
+ // LLWeb::loadURL(LLNotifications::instance().getGlobalString("SUPPORT_URL") );
+ // break;
+ case 2: // Teleport
+ // Restart the login process, starting at our home locaton
+ LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_HOME));
+ LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
+ break;
+ default:
+ LL_WARNS("AppInit") << "Missing case in login_alert_status switch" << LL_ENDL;
+ }
+
+ LLPanelLogin::giveFocus();
+ return false;
+}
+
+
+void use_circuit_callback(void**, S32 result)
+{
+ // bail if we're quitting.
+ if(LLApp::isExiting()) return;
+ if( !gUseCircuitCallbackCalled )
+ {
+ gUseCircuitCallbackCalled = true;
+ if (result)
+ {
+ // Make sure user knows something bad happened. JC
+ LL_WARNS("AppInit") << "Backing up to login screen!" << LL_ENDL;
+ LLNotificationsUtil::add("LoginPacketNeverReceived", LLSD(), LLSD(), login_alert_status);
+ reset_login();
+ }
+ else
+ {
+ gGotUseCircuitCodeAck = true;
+ }
+ }
+}
+
+void register_viewer_callbacks(LLMessageSystem* msg)
+{
+ msg->setHandlerFuncFast(_PREHASH_LayerData, process_layer_data );
+ msg->setHandlerFuncFast(_PREHASH_ImageData, LLViewerTextureList::receiveImageHeader );
+ msg->setHandlerFuncFast(_PREHASH_ImagePacket, LLViewerTextureList::receiveImagePacket );
+ msg->setHandlerFuncFast(_PREHASH_ObjectUpdate, process_object_update );
+ msg->setHandlerFunc("ObjectUpdateCompressed", process_compressed_object_update );
+ msg->setHandlerFunc("ObjectUpdateCached", process_cached_object_update );
+ msg->setHandlerFuncFast(_PREHASH_ImprovedTerseObjectUpdate, process_terse_object_update_improved );
+ msg->setHandlerFunc("SimStats", process_sim_stats);
+ msg->setHandlerFuncFast(_PREHASH_HealthMessage, process_health_message );
+ msg->setHandlerFuncFast(_PREHASH_EconomyData, process_economy_data);
+ msg->setHandlerFunc("RegionInfo", LLViewerRegion::processRegionInfo);
+
+ msg->setHandlerFuncFast(_PREHASH_ChatFromSimulator, process_chat_from_simulator);
+ msg->setHandlerFuncFast(_PREHASH_KillObject, process_kill_object, NULL);
+ msg->setHandlerFuncFast(_PREHASH_SimulatorViewerTimeMessage, process_time_synch, NULL);
+ msg->setHandlerFuncFast(_PREHASH_EnableSimulator, process_enable_simulator);
+ msg->setHandlerFuncFast(_PREHASH_DisableSimulator, process_disable_simulator);
+ msg->setHandlerFuncFast(_PREHASH_KickUser, process_kick_user, NULL);
+
+ msg->setHandlerFunc("CrossedRegion", process_crossed_region);
+ msg->setHandlerFuncFast(_PREHASH_TeleportFinish, process_teleport_finish);
+
+ msg->setHandlerFuncFast(_PREHASH_AlertMessage, process_alert_message);
+ msg->setHandlerFunc("AgentAlertMessage", process_agent_alert_message);
+ msg->setHandlerFuncFast(_PREHASH_MeanCollisionAlert, process_mean_collision_alert_message, NULL);
+ msg->setHandlerFunc("ViewerFrozenMessage", process_frozen_message);
+
+ msg->setHandlerFuncFast(_PREHASH_NameValuePair, process_name_value);
+ msg->setHandlerFuncFast(_PREHASH_RemoveNameValuePair, process_remove_name_value);
+ msg->setHandlerFuncFast(_PREHASH_AvatarAnimation, process_avatar_animation);
+ msg->setHandlerFuncFast(_PREHASH_AvatarAppearance, process_avatar_appearance);
+ msg->setHandlerFunc("AgentCachedTextureResponse", LLAgent::processAgentCachedTextureResponse);
+ msg->setHandlerFunc("RebakeAvatarTextures", LLVOAvatarSelf::processRebakeAvatarTextures);
+ msg->setHandlerFuncFast(_PREHASH_CameraConstraint, process_camera_constraint);
+ msg->setHandlerFuncFast(_PREHASH_AvatarSitResponse, process_avatar_sit_response);
+ msg->setHandlerFunc("SetFollowCamProperties", process_set_follow_cam_properties);
+ msg->setHandlerFunc("ClearFollowCamProperties", process_clear_follow_cam_properties);
+
+ msg->setHandlerFuncFast(_PREHASH_ImprovedInstantMessage, process_improved_im);
+ msg->setHandlerFuncFast(_PREHASH_ScriptQuestion, process_script_question);
+ msg->setHandlerFuncFast(_PREHASH_ObjectProperties, LLSelectMgr::processObjectProperties, NULL);
+ msg->setHandlerFuncFast(_PREHASH_ObjectPropertiesFamily, LLSelectMgr::processObjectPropertiesFamily, NULL);
+ msg->setHandlerFunc("ForceObjectSelect", LLSelectMgr::processForceObjectSelect);
+
+ msg->setHandlerFuncFast(_PREHASH_MoneyBalanceReply, process_money_balance_reply, NULL);
+ msg->setHandlerFuncFast(_PREHASH_CoarseLocationUpdate, LLWorld::processCoarseUpdate, NULL);
+ msg->setHandlerFuncFast(_PREHASH_ReplyTaskInventory, LLViewerObject::processTaskInv, NULL);
+ msg->setHandlerFuncFast(_PREHASH_DerezContainer, process_derez_container, NULL);
+ msg->setHandlerFuncFast(_PREHASH_ScriptRunningReply,
+ &LLLiveLSLEditor::processScriptRunningReply);
+
+ msg->setHandlerFuncFast(_PREHASH_DeRezAck, process_derez_ack);
+
+ msg->setHandlerFunc("LogoutReply", process_logout_reply);
+
+ //msg->setHandlerFuncFast(_PREHASH_AddModifyAbility,
+ // &LLAgent::processAddModifyAbility);
+ //msg->setHandlerFuncFast(_PREHASH_RemoveModifyAbility,
+ // &LLAgent::processRemoveModifyAbility);
+ msg->setHandlerFuncFast(_PREHASH_AgentDataUpdate,
+ &LLAgent::processAgentDataUpdate);
+ msg->setHandlerFuncFast(_PREHASH_AgentGroupDataUpdate,
+ &LLAgent::processAgentGroupDataUpdate);
+ msg->setHandlerFunc("AgentDropGroup",
+ &LLAgent::processAgentDropGroup);
+ // land ownership messages
+ msg->setHandlerFuncFast(_PREHASH_ParcelOverlay,
+ LLViewerParcelMgr::processParcelOverlay);
+ msg->setHandlerFuncFast(_PREHASH_ParcelProperties,
+ LLViewerParcelMgr::processParcelProperties);
+ msg->setHandlerFunc("ParcelAccessListReply",
+ LLViewerParcelMgr::processParcelAccessListReply);
+ msg->setHandlerFunc("ParcelDwellReply",
+ LLViewerParcelMgr::processParcelDwellReply);
+
+ msg->setHandlerFunc("AvatarPropertiesReply",
+ &LLAvatarPropertiesProcessor::processAvatarPropertiesReply);
+ msg->setHandlerFunc("AvatarInterestsReply",
+ &LLAvatarPropertiesProcessor::processAvatarInterestsReply);
+ msg->setHandlerFunc("AvatarGroupsReply",
+ &LLAvatarPropertiesProcessor::processAvatarGroupsReply);
+ // ratings deprecated
+ //msg->setHandlerFuncFast(_PREHASH_AvatarStatisticsReply,
+ // LLPanelAvatar::processAvatarStatisticsReply);
+ msg->setHandlerFunc("AvatarNotesReply",
+ &LLAvatarPropertiesProcessor::processAvatarNotesReply);
+ msg->setHandlerFunc("AvatarPicksReply",
+ &LLAvatarPropertiesProcessor::processAvatarPicksReply);
+ msg->setHandlerFunc("AvatarClassifiedReply",
+ &LLAvatarPropertiesProcessor::processAvatarClassifiedsReply);
+
+ msg->setHandlerFuncFast(_PREHASH_CreateGroupReply,
+ LLGroupMgr::processCreateGroupReply);
+ msg->setHandlerFuncFast(_PREHASH_JoinGroupReply,
+ LLGroupMgr::processJoinGroupReply);
+ msg->setHandlerFuncFast(_PREHASH_EjectGroupMemberReply,
+ LLGroupMgr::processEjectGroupMemberReply);
+ msg->setHandlerFuncFast(_PREHASH_LeaveGroupReply,
+ LLGroupMgr::processLeaveGroupReply);
+ msg->setHandlerFuncFast(_PREHASH_GroupProfileReply,
+ LLGroupMgr::processGroupPropertiesReply);
+
+ // ratings deprecated
+ // msg->setHandlerFuncFast(_PREHASH_ReputationIndividualReply,
+ // LLFloaterRate::processReputationIndividualReply);
+
+ msg->setHandlerFuncFast(_PREHASH_AgentWearablesUpdate,
+ LLAgentWearables::processAgentInitialWearablesUpdate );
+
+ msg->setHandlerFunc("ScriptControlChange",
+ LLAgent::processScriptControlChange );
+
+ msg->setHandlerFuncFast(_PREHASH_ViewerEffect, LLHUDManager::processViewerEffect);
+
+ msg->setHandlerFuncFast(_PREHASH_GrantGodlikePowers, process_grant_godlike_powers);
+
+ msg->setHandlerFuncFast(_PREHASH_GroupAccountSummaryReply,
+ LLPanelGroupLandMoney::processGroupAccountSummaryReply);
+ msg->setHandlerFuncFast(_PREHASH_GroupAccountDetailsReply,
+ LLPanelGroupLandMoney::processGroupAccountDetailsReply);
+ msg->setHandlerFuncFast(_PREHASH_GroupAccountTransactionsReply,
+ LLPanelGroupLandMoney::processGroupAccountTransactionsReply);
+
+ msg->setHandlerFuncFast(_PREHASH_UserInfoReply,
+ process_user_info_reply);
+
+ msg->setHandlerFunc("RegionHandshake", process_region_handshake, NULL);
+
+ msg->setHandlerFunc("TeleportStart", process_teleport_start );
+ msg->setHandlerFunc("TeleportProgress", process_teleport_progress);
+ msg->setHandlerFunc("TeleportFailed", process_teleport_failed, NULL);
+ msg->setHandlerFunc("TeleportLocal", process_teleport_local, NULL);
+
+ msg->setHandlerFunc("ImageNotInDatabase", LLViewerTextureList::processImageNotInDatabase, NULL);
+
+ msg->setHandlerFuncFast(_PREHASH_GroupMembersReply,
+ LLGroupMgr::processGroupMembersReply);
+ msg->setHandlerFunc("GroupRoleDataReply",
+ LLGroupMgr::processGroupRoleDataReply);
+ msg->setHandlerFunc("GroupRoleMembersReply",
+ LLGroupMgr::processGroupRoleMembersReply);
+ msg->setHandlerFunc("GroupTitlesReply",
+ LLGroupMgr::processGroupTitlesReply);
+ // Special handler as this message is sometimes used for group land.
+ msg->setHandlerFunc("PlacesReply", process_places_reply);
+ msg->setHandlerFunc("GroupNoticesListReply", LLPanelGroupNotices::processGroupNoticesListReply);
+
+ msg->setHandlerFunc("AvatarPickerReply", LLFloaterAvatarPicker::processAvatarPickerReply);
+
+ msg->setHandlerFunc("MapBlockReply", LLWorldMapMessage::processMapBlockReply);
+ msg->setHandlerFunc("MapItemReply", LLWorldMapMessage::processMapItemReply);
+ msg->setHandlerFunc("EventInfoReply", LLEventNotifier::processEventInfoReply);
+
+ msg->setHandlerFunc("PickInfoReply", &LLAvatarPropertiesProcessor::processPickInfoReply);
+// msg->setHandlerFunc("ClassifiedInfoReply", LLPanelClassified::processClassifiedInfoReply);
+ msg->setHandlerFunc("ClassifiedInfoReply", LLAvatarPropertiesProcessor::processClassifiedInfoReply);
+ msg->setHandlerFunc("ParcelInfoReply", LLRemoteParcelInfoProcessor::processParcelInfoReply);
+ msg->setHandlerFunc("ScriptDialog", process_script_dialog);
+ msg->setHandlerFunc("LoadURL", process_load_url);
+ msg->setHandlerFunc("ScriptTeleportRequest", process_script_teleport_request);
+ msg->setHandlerFunc("EstateCovenantReply", process_covenant_reply);
+
+ // calling cards
+ msg->setHandlerFunc("OfferCallingCard", process_offer_callingcard);
+ msg->setHandlerFunc("AcceptCallingCard", process_accept_callingcard);
+ msg->setHandlerFunc("DeclineCallingCard", process_decline_callingcard);
+
+ msg->setHandlerFunc("ParcelObjectOwnersReply", LLPanelLandObjects::processParcelObjectOwnersReply);
+
+ msg->setHandlerFunc("InitiateDownload", process_initiate_download);
+ msg->setHandlerFunc("LandStatReply", LLFloaterTopObjects::handle_land_reply);
+ msg->setHandlerFunc("GenericMessage", process_generic_message);
+
+ msg->setHandlerFuncFast(_PREHASH_FeatureDisabled, process_feature_disabled_message);
+}
+
+void asset_callback_nothing(LLVFS*, const LLUUID&, LLAssetType::EType, void*, S32)
+{
+ // nothing
+}
+
+// *HACK: Must match name in Library or agent inventory
+const std::string ROOT_GESTURES_FOLDER = "Gestures";
+const std::string COMMON_GESTURES_FOLDER = "Common Gestures";
+const std::string MALE_GESTURES_FOLDER = "Male Gestures";
+const std::string FEMALE_GESTURES_FOLDER = "Female Gestures";
+const std::string SPEECH_GESTURES_FOLDER = "Speech Gestures";
+const std::string OTHER_GESTURES_FOLDER = "Other Gestures";
+const S32 OPT_CLOSED_WINDOW = -1;
+const S32 OPT_MALE = 0;
+const S32 OPT_FEMALE = 1;
+const S32 OPT_TRUST_CERT = 0;
+const S32 OPT_CANCEL_TRUST = 1;
+
+bool callback_choose_gender(const LLSD& notification, const LLSD& response)
+{
+
+ // These defaults are returned from the server on login. They are set in login.xml.
+ // If no default is returned from the server, they are retrieved from settings.xml.
+
+ S32 option = LLNotification::getSelectedOption(notification, response);
+ switch(option)
+ {
+ case OPT_MALE:
+ LLStartUp::loadInitialOutfit( gSavedSettings.getString("DefaultMaleAvatar"), "male" );
+ break;
+
+ case OPT_FEMALE:
+ case OPT_CLOSED_WINDOW:
+ default:
+ LLStartUp::loadInitialOutfit( gSavedSettings.getString("DefaultFemaleAvatar"), "female" );
+ break;
+ }
+ return false;
+}
+
+void LLStartUp::copyLibraryGestures(const std::string& same_gender_gestures)
+{
+ llinfos << "Copying library gestures" << llendl;
+
+ // Copy gestures
+ LLUUID lib_gesture_cat_id =
+ gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE,false,true);
+ if (lib_gesture_cat_id.isNull())
+ {
+ llwarns << "Unable to copy gestures, source category not found" << llendl;
+ }
+ LLUUID dst_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);
+
+ std::vector<std::string> gesture_folders_to_copy;
+ gesture_folders_to_copy.push_back(MALE_GESTURES_FOLDER);
+ gesture_folders_to_copy.push_back(FEMALE_GESTURES_FOLDER);
+ gesture_folders_to_copy.push_back(COMMON_GESTURES_FOLDER);
+ gesture_folders_to_copy.push_back(SPEECH_GESTURES_FOLDER);
+ gesture_folders_to_copy.push_back(OTHER_GESTURES_FOLDER);
+
+ for(std::vector<std::string>::iterator it = gesture_folders_to_copy.begin();
+ it != gesture_folders_to_copy.end();
+ ++it)
+ {
+ std::string& folder_name = *it;
+
+ LLPointer<LLInventoryCallback> cb(NULL);
+
+ if (folder_name == same_gender_gestures ||
+ folder_name == COMMON_GESTURES_FOLDER ||
+ folder_name == OTHER_GESTURES_FOLDER)
+ {
+ cb = new ActivateGestureCallback;
+ }
+
+
+ LLUUID cat_id = findDescendentCategoryIDByName(lib_gesture_cat_id,folder_name);
+ if (cat_id.isNull())
+ {
+ llwarns << "failed to find gesture folder for " << folder_name << llendl;
+ }
+ else
+ {
+ llinfos << "initiating fetch and copy for " << folder_name << " cat_id " << cat_id << llendl;
+ LLAppearanceMgr* app_mgr = LLAppearanceMgr::getInstance();
+ callAfterCategoryFetch(cat_id,
+ boost::bind(&LLAppearanceMgr::shallowCopyCategory,
+ app_mgr,
+ cat_id,
+ dst_id,
+ cb));
+ }
+ }
+}
+
+void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
+ const std::string& gender_name )
+{
+ llinfos << "starting" << llendl;
+
+ // Not going through the processAgentInitialWearables path, so need to set this here.
+ LLAppearanceMgr::instance().setAttachmentInvLinkEnable(true);
+ // Initiate creation of COF, since we're also bypassing that.
+ gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
+
+ S32 gender = 0;
+ std::string same_gender_gestures;
+ if (gender_name == "male")
+ {
+ gender = OPT_MALE;
+ same_gender_gestures = MALE_GESTURES_FOLDER;
+ }
+ else
+ {
+ gender = OPT_FEMALE;
+ same_gender_gestures = FEMALE_GESTURES_FOLDER;
+ }
+
+ // try to find the outfit - if not there, create some default
+ // wearables.
+ LLUUID cat_id = findDescendentCategoryIDByName(
+ gInventory.getLibraryRootFolderID(),
+ outfit_folder_name);
+ if (cat_id.isNull())
+ {
+ gAgentWearables.createStandardWearables(gender);
+ }
+ else
+ {
+ sWearablesLoadedCon = gAgentWearables.addLoadedCallback(LLStartUp::saveInitialOutfit);
+
+ bool do_copy = true;
+ bool do_append = false;
+ LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
+ LLAppearanceMgr::instance().wearInventoryCategory(cat, do_copy, do_append);
+ }
+
+ // Copy gestures
+ copyLibraryGestures(same_gender_gestures);
+
+ // This is really misnamed -- it means we have started loading
+ // an outfit/shape that will give the avatar a gender eventually. JC
+ gAgent.setGenderChosen(TRUE);
+
+}
+
+//static
+void LLStartUp::saveInitialOutfit()
+{
+ if (sInitialOutfit.empty()) return;
+
+ if (sWearablesLoadedCon.connected())
+ {
+ sWearablesLoadedCon.disconnect();
+ }
+ LLAppearanceMgr::getInstance()->makeNewOutfitLinks(sInitialOutfit,false);
+}
+
+std::string& LLStartUp::getInitialOutfitName()
+{
+ return sInitialOutfit;
+}
+
+// Loads a bitmap to display during load
+void init_start_screen(S32 location_id)
+{
+ if (gStartTexture.notNull())
+ {
+ gStartTexture = NULL;
+ LL_INFOS("AppInit") << "re-initializing start screen" << LL_ENDL;
+ }
+
+ LL_DEBUGS("AppInit") << "Loading startup bitmap..." << LL_ENDL;
+
+ std::string temp_str = gDirUtilp->getLindenUserDir() + gDirUtilp->getDirDelimiter();
+
+ if ((S32)START_LOCATION_ID_LAST == location_id)
+ {
+ temp_str += SCREEN_LAST_FILENAME;
+ }
+ else
+ {
+ temp_str += SCREEN_HOME_FILENAME;
+ }
+
+ LLPointer<LLImageBMP> start_image_bmp = new LLImageBMP;
+
+ // Turn off start screen to get around the occasional readback
+ // driver bug
+ if(!gSavedSettings.getBOOL("UseStartScreen"))
+ {
+ LL_INFOS("AppInit") << "Bitmap load disabled" << LL_ENDL;
+ return;
+ }
+ else if(!start_image_bmp->load(temp_str) )
+ {
+ LL_WARNS("AppInit") << "Bitmap load failed" << LL_ENDL;
+ return;
+ }
+
+ gStartImageWidth = start_image_bmp->getWidth();
+ gStartImageHeight = start_image_bmp->getHeight();
+
+ LLPointer<LLImageRaw> raw = new LLImageRaw;
+ if (!start_image_bmp->decode(raw, 0.0f))
+ {
+ LL_WARNS("AppInit") << "Bitmap decode failed" << LL_ENDL;
+ gStartTexture = NULL;
+ return;
+ }
+
+ raw->expandToPowerOfTwo();
+ gStartTexture = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE) ;
+}
+
+
+// frees the bitmap
+void release_start_screen()
+{
+ LL_DEBUGS("AppInit") << "Releasing bitmap..." << LL_ENDL;
+ gStartTexture = NULL;
+}
+
+
+// static
+std::string LLStartUp::startupStateToString(EStartupState state)
+{
+#define RTNENUM(E) case E: return #E
+ switch(state){
+ RTNENUM( STATE_FIRST );
+ RTNENUM( STATE_BROWSER_INIT );
+ RTNENUM( STATE_LOGIN_SHOW );
+ RTNENUM( STATE_LOGIN_WAIT );
+ RTNENUM( STATE_LOGIN_CLEANUP );
+ RTNENUM( STATE_LOGIN_AUTH_INIT );
+ RTNENUM( STATE_LOGIN_CURL_UNSTUCK );
+ RTNENUM( STATE_LOGIN_PROCESS_RESPONSE );
+ RTNENUM( STATE_WORLD_INIT );
+ RTNENUM( STATE_MULTIMEDIA_INIT );
+ RTNENUM( STATE_FONT_INIT );
+ RTNENUM( STATE_SEED_GRANTED_WAIT );
+ RTNENUM( STATE_SEED_CAP_GRANTED );
+ RTNENUM( STATE_WORLD_WAIT );
+ RTNENUM( STATE_AGENT_SEND );
+ RTNENUM( STATE_AGENT_WAIT );
+ RTNENUM( STATE_INVENTORY_SEND );
+ RTNENUM( STATE_MISC );
+ RTNENUM( STATE_PRECACHE );
+ RTNENUM( STATE_WEARABLES_WAIT );
+ RTNENUM( STATE_CLEANUP );
+ RTNENUM( STATE_STARTED );
+ default:
+ return llformat("(state #%d)", state);
+ }
+#undef RTNENUM
+}
+
+// static
+void LLStartUp::setStartupState( EStartupState state )
+{
+ LL_INFOS("AppInit") << "Startup state changing from " <<
+ getStartupStateString() << " to " <<
+ startupStateToString(state) << LL_ENDL;
+ gStartupState = state;
+ postStartupState();
+}
+
+void LLStartUp::postStartupState()
+{
+ LLSD stateInfo;
+ stateInfo["str"] = getStartupStateString();
+ stateInfo["enum"] = gStartupState;
+ sStateWatcher->post(stateInfo);
+}
+
+
+void reset_login()
+{
+ gAgentWearables.cleanup();
+ gAgentCamera.cleanup();
+ gAgent.cleanup();
+ LLWorld::getInstance()->destroyClass();
+
+ LLStartUp::setStartupState( STATE_LOGIN_SHOW );
+
+ if ( gViewerWindow )
+ { // Hide menus and normal buttons
+ gViewerWindow->setNormalControlsVisible( FALSE );
+ gLoginMenuBarView->setVisible( TRUE );
+ gLoginMenuBarView->setEnabled( TRUE );
+ }
+
+ // Hide any other stuff
+ LLFloaterReg::hideVisibleInstances();
+}
+
+//---------------------------------------------------------------------------
+
+// Initialize all plug-ins except the web browser (which was initialized
+// early, before the login screen). JC
+void LLStartUp::multimediaInit()
+{
+ LL_DEBUGS("AppInit") << "Initializing Multimedia...." << LL_ENDL;
+ std::string msg = LLTrans::getString("LoginInitializingMultimedia");
+ set_startup_status(0.42f, msg.c_str(), gAgent.mMOTD.c_str());
+ display_startup();
+
+ // LLViewerMedia::initClass();
+ LLViewerParcelMedia::initClass();
+}
+
+void LLStartUp::fontInit()
+{
+ LL_DEBUGS("AppInit") << "Initializing fonts...." << LL_ENDL;
+ std::string msg = LLTrans::getString("LoginInitializingFonts");
+ set_startup_status(0.45f, msg.c_str(), gAgent.mMOTD.c_str());
+ display_startup();
+
+ LLFontGL::loadDefaultFonts();
+}
+
+void LLStartUp::initNameCache()
+{
+ // Can be called multiple times
+ if ( gCacheName ) return;
+
+ gCacheName = new LLCacheName(gMessageSystem);
+ gCacheName->addObserver(&callback_cache_name);
+ gCacheName->localizeCacheName("waiting", LLTrans::getString("AvatarNameWaiting"));
+ gCacheName->localizeCacheName("nobody", LLTrans::getString("AvatarNameNobody"));
+ gCacheName->localizeCacheName("none", LLTrans::getString("GroupNameNone"));
+ // Load stored cache if possible
+ LLAppViewer::instance()->loadNameCache();
+
+ // Start cache in not-running state until we figure out if we have
+ // capabilities for display name lookup
+ LLAvatarNameCache::initClass(false);
+ LLAvatarNameCache::setUseDisplayNames(gSavedSettings.getBOOL("UseDisplayNames"));
+}
+
+void LLStartUp::cleanupNameCache()
+{
+ LLAvatarNameCache::cleanupClass();
+
+ delete gCacheName;
+ gCacheName = NULL;
+}
+
+bool LLStartUp::dispatchURL()
+{
+ // ok, if we've gotten this far and have a startup URL
+ if (!getStartSLURL().isValid())
+ {
+ return false;
+ }
+ if(getStartSLURL().getType() != LLSLURL::APP)
+ {
+
+ // If we started with a location, but we're already
+ // at that location, don't pop dialogs open.
+ LLVector3 pos = gAgent.getPositionAgent();
+ LLVector3 slurlpos = getStartSLURL().getPosition();
+ F32 dx = pos.mV[VX] - slurlpos.mV[VX];
+ F32 dy = pos.mV[VY] - slurlpos.mV[VY];
+ const F32 SLOP = 2.f; // meters
+
+ if( getStartSLURL().getRegion() != gAgent.getRegion()->getName()
+ || (dx*dx > SLOP*SLOP)
+ || (dy*dy > SLOP*SLOP) )
+ {
+ LLURLDispatcher::dispatch(getStartSLURL().getSLURLString(),
+ NULL, false);
+ }
+ return true;
+ }
+ return false;
+}
+
+void LLStartUp::setStartSLURL(const LLSLURL& slurl)
+{
+ sStartSLURL = slurl;
+ switch(slurl.getType())
+ {
+ case LLSLURL::HOME_LOCATION:
+ {
+ gSavedSettings.setString("LoginLocation", LLSLURL::SIM_LOCATION_HOME);
+ break;
+ }
+ case LLSLURL::LAST_LOCATION:
+ {
+ gSavedSettings.setString("LoginLocation", LLSLURL::SIM_LOCATION_LAST);
+ break;
+ }
+ default:
+ LLGridManager::getInstance()->setGridChoice(slurl.getGrid());
+ break;
+ }
+}
+
+bool login_alert_done(const LLSD& notification, const LLSD& response)
+{
+ LLPanelLogin::giveFocus();
+ return false;
+}
+
+// parse the certificate information into args for the
+// certificate notifications
+LLSD transform_cert_args(LLPointer<LLCertificate> cert)
+{
+ LLSD args = LLSD::emptyMap();
+ std::string value;
+ LLSD cert_info;
+ cert->getLLSD(cert_info);
+ // convert all of the elements in the cert into
+ // args for the xml dialog, so we have flexability to
+ // display various parts of the cert by only modifying
+ // the cert alert dialog xml.
+ for(LLSD::map_iterator iter = cert_info.beginMap();
+ iter != cert_info.endMap();
+ iter++)
+ {
+ // key usage and extended key usage
+ // are actually arrays, and we want to format them as comma separated
+ // strings, so special case those.
+ LLSDSerialize::toXML(cert_info[iter->first], std::cout);
+ if((iter->first== std::string(CERT_KEY_USAGE)) |
+ (iter->first == std::string(CERT_EXTENDED_KEY_USAGE)))
+ {
+ value = "";
+ LLSD usage = cert_info[iter->first];
+ for (LLSD::array_iterator usage_iter = usage.beginArray();
+ usage_iter != usage.endArray();
+ usage_iter++)
+ {
+
+ if(usage_iter != usage.beginArray())
+ {
+ value += ", ";
+ }
+
+ value += (*usage_iter).asString();
+ }
+
+ }
+ else
+ {
+ value = iter->second.asString();
+ }
+
+ std::string name = iter->first;
+ std::transform(name.begin(), name.end(), name.begin(),
+ (int(*)(int))toupper);
+ args[name.c_str()] = value;
+ }
+ return args;
+}
+
+
+// when we handle a cert error, give focus back to the login panel
+void general_cert_done(const LLSD& notification, const LLSD& response)
+{
+ LLStartUp::setStartupState( STATE_LOGIN_SHOW );
+ LLPanelLogin::giveFocus();
+}
+
+// check to see if the user wants to trust the cert.
+// if they do, add it to the cert store and
+void trust_cert_done(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotification::getSelectedOption(notification, response);
+ switch(option)
+ {
+ case OPT_TRUST_CERT:
+ {
+ LLPointer<LLCertificate> cert = gSecAPIHandler->getCertificate(notification["payload"]["certificate"]);
+ LLPointer<LLCertificateStore> store = gSecAPIHandler->getCertificateStore(gSavedSettings.getString("CertStore"));
+ store->add(cert);
+ store->save();
+ LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
+ break;
+ }
+ case OPT_CANCEL_TRUST:
+ reset_login();
+ gSavedSettings.setBOOL("AutoLogin", FALSE);
+ LLStartUp::setStartupState( STATE_LOGIN_SHOW );
+ default:
+ LLPanelLogin::giveFocus();
+ break;
+ }
+
+}
+
+void apply_udp_blacklist(const std::string& csv)
+{
+
+ std::string::size_type start = 0;
+ std::string::size_type comma = 0;
+ do
+ {
+ comma = csv.find(",", start);
+ if (comma == std::string::npos)
+ {
+ comma = csv.length();
+ }
+ std::string item(csv, start, comma-start);
+
+ lldebugs << "udp_blacklist " << item << llendl;
+ gMessageSystem->banUdpMessage(item);
+
+ start = comma + 1;
+
+ }
+ while(comma < csv.length());
+
+}
+
+bool process_login_success_response()
+{
+ LLSD response = LLLoginInstance::getInstance()->getResponse();
+
+ std::string text(response["udp_blacklist"]);
+ if(!text.empty())
+ {
+ apply_udp_blacklist(text);
+ }
+
+ // unpack login data needed by the application
+ text = response["agent_id"].asString();
+ if(!text.empty()) gAgentID.set(text);
+ gDebugInfo["AgentID"] = text;
+
+ // Agent id needed for parcel info request in LLUrlEntryParcel
+ // to resolve parcel name.
+ LLUrlEntryParcel::setAgentID(gAgentID);
+
+ text = response["session_id"].asString();
+ if(!text.empty()) gAgentSessionID.set(text);
+ gDebugInfo["SessionID"] = text;
+
+ // Session id needed for parcel info request in LLUrlEntryParcel
+ // to resolve parcel name.
+ LLUrlEntryParcel::setSessionID(gAgentSessionID);
+
+ text = response["secure_session_id"].asString();
+ if(!text.empty()) gAgent.mSecureSessionID.set(text);
+
+ // if the response contains a display name, use that,
+ // otherwise if the response contains a first and/or last name,
+ // use those. Otherwise use the credential identifier
+
+ gDisplayName = "";
+ if (response.has("display_name"))
+ {
+ gDisplayName.assign(response["display_name"].asString());
+ if(!gDisplayName.empty())
+ {
+ // Remove quotes from string. Login.cgi sends these to force
+ // names that look like numbers into strings.
+ LLStringUtil::replaceChar(gDisplayName, '"', ' ');
+ LLStringUtil::trim(gDisplayName);
+ }
+ }
+ if(gDisplayName.empty())
+ {
+ if(response.has("first_name"))
+ {
+ gDisplayName.assign(response["first_name"].asString());
+ LLStringUtil::replaceChar(gDisplayName, '"', ' ');
+ LLStringUtil::trim(gDisplayName);
+ }
+ if(response.has("last_name"))
+ {
+ text.assign(response["last_name"].asString());
+ LLStringUtil::replaceChar(text, '"', ' ');
+ LLStringUtil::trim(text);
+ if(!gDisplayName.empty())
+ {
+ gDisplayName += " ";
+ }
+ gDisplayName += text;
+ }
+ }
+ if(gDisplayName.empty())
+ {
+ gDisplayName.assign(gUserCredential->asString());
+ }
+
+ // this is their actual ability to access content
+ text = response["agent_access_max"].asString();
+ if (!text.empty())
+ {
+ // agent_access can be 'A', 'M', and 'PG'.
+ gAgent.setMaturity(text[0]);
+ }
+
+ // this is the value of their preference setting for that content
+ // which will always be <= agent_access_max
+ text = response["agent_region_access"].asString();
+ if (!text.empty())
+ {
+ U32 preferredMaturity = (U32)LLAgent::convertTextToMaturity(text[0]);
+
+ gSavedSettings.setU32("PreferredMaturity", preferredMaturity);
+ }
+ // During the AO transition, this flag will be true. Then the flag will
+ // go away. After the AO transition, this code and all the code that
+ // uses it can be deleted.
+ text = response["ao_transition"].asString();
+ if (!text.empty())
+ {
+ if (text == "1")
+ {
+ gAgent.setAOTransition();
+ }
+ }
+
+ text = response["start_location"].asString();
+ if(!text.empty())
+ {
+ gAgentStartLocation.assign(text);
+ }
+
+ text = response["circuit_code"].asString();
+ if(!text.empty())
+ {
+ gMessageSystem->mOurCircuitCode = strtoul(text.c_str(), NULL, 10);
+ }
+ std::string sim_ip_str = response["sim_ip"];
+ std::string sim_port_str = response["sim_port"];
+ if(!sim_ip_str.empty() && !sim_port_str.empty())
+ {
+ U32 sim_port = strtoul(sim_port_str.c_str(), NULL, 10);
+ gFirstSim.set(sim_ip_str, sim_port);
+ if (gFirstSim.isOk())
+ {
+ gMessageSystem->enableCircuit(gFirstSim, TRUE);
+ }
+ }
+ std::string region_x_str = response["region_x"];
+ std::string region_y_str = response["region_y"];
+ if(!region_x_str.empty() && !region_y_str.empty())
+ {
+ U32 region_x = strtoul(region_x_str.c_str(), NULL, 10);
+ U32 region_y = strtoul(region_y_str.c_str(), NULL, 10);
+ gFirstSimHandle = to_region_handle(region_x, region_y);
+ }
+
+ const std::string look_at_str = response["look_at"];
+ if (!look_at_str.empty())
+ {
+ size_t len = look_at_str.size();
+ LLMemoryStream mstr((U8*)look_at_str.c_str(), len);
+ LLSD sd = LLSDSerialize::fromNotation(mstr, len);
+ gAgentStartLookAt = ll_vector3_from_sd(sd);
+ }
+
+ text = response["seed_capability"].asString();
+ if (!text.empty()) gFirstSimSeedCap = text;
+
+ text = response["seconds_since_epoch"].asString();
+ if(!text.empty())
+ {
+ U32 server_utc_time = strtoul(text.c_str(), NULL, 10);
+ if(server_utc_time)
+ {
+ time_t now = time(NULL);
+ gUTCOffset = (server_utc_time - now);
+ }
+ }
+
+ // this is the base used to construct help URLs
+ text = response["help_url_format"].asString();
+ if (!text.empty())
+ {
+ // replace the default help URL format
+ gSavedSettings.setString("HelpURLFormat",text);
+
+ // don't fall back to Standalone's pre-connection static help
+ gSavedSettings.setBOOL("HelpUseLocal", false);
+ }
+
+ std::string home_location = response["home"];
+ if(!home_location.empty())
+ {
+ size_t len = home_location.size();
+ LLMemoryStream mstr((U8*)home_location.c_str(), len);
+ LLSD sd = LLSDSerialize::fromNotation(mstr, len);
+ S32 region_x = sd["region_handle"][0].asInteger();
+ S32 region_y = sd["region_handle"][1].asInteger();
+ U64 region_handle = to_region_handle(region_x, region_y);
+ LLVector3 position = ll_vector3_from_sd(sd["position"]);
+ gAgent.setHomePosRegion(region_handle, position);
+ }
+
+ gAgent.mMOTD.assign(response["message"]);
+
+ // Options...
+ // Each 'option' is an array of submaps.
+ // It appears that we only ever use the first element of the array.
+ LLUUID inv_root_folder_id = response["inventory-root"][0]["folder_id"];
+ if(inv_root_folder_id.notNull())
+ {
+ gInventory.setRootFolderID(inv_root_folder_id);
+ //gInventory.mock(gAgent.getInventoryRootID());
+ }
+
+ LLSD login_flags = response["login-flags"][0];
+ if(login_flags.size())
+ {
+ std::string flag = login_flags["ever_logged_in"];
+ if(!flag.empty())
+ {
+ gAgent.setFirstLogin((flag == "N") ? TRUE : FALSE);
+ }
+
+ /* Flag is currently ignored by the viewer.
+ flag = login_flags["stipend_since_login"];
+ if(flag == "Y")
+ {
+ stipend_since_login = true;
+ }
+ */
+
+ flag = login_flags["gendered"].asString();
+ if(flag == "Y")
+ {
+ gAgent.setGenderChosen(TRUE);
+ }
+
+ bool pacific_daylight_time = false;
+ flag = login_flags["daylight_savings"].asString();
+ if(flag == "Y")
+ {
+ pacific_daylight_time = (flag == "Y");
+ }
+
+ //setup map of datetime strings to codes and slt & local time offset from utc
+ LLStringOps::setupDatetimeInfo(pacific_daylight_time);
+ }
+
+ // set up the voice configuration. Ultimately, we should pass this up as part of each voice
+ // channel if we need to move to multiple voice servers per grid.
+ LLSD voice_config_info = response["voice-config"];
+ if(voice_config_info.has("VoiceServerType"))
+ {
+ gSavedSettings.setString("VoiceServerType", voice_config_info["VoiceServerType"].asString());
+ }
+
+ // Request the map server url
+ std::string map_server_url = response["map-server-url"];
+ if(!map_server_url.empty())
+ {
+ // We got an answer from the grid -> use that for map for the current session
+ gSavedSettings.setString("CurrentMapServerURL", map_server_url);
+ LL_INFOS("LLStartup") << "map-server-url : we got an answer from the grid : " << map_server_url << LL_ENDL;
+ }
+ else
+ {
+ // No answer from the grid -> use the default setting for current session
+ map_server_url = gSavedSettings.getString("MapServerURL");
+ gSavedSettings.setString("CurrentMapServerURL", map_server_url);
+ LL_INFOS("LLStartup") << "map-server-url : no map-server-url answer, we use the default setting for the map : " << map_server_url << LL_ENDL;
+ }
+
+ // Default male and female avatars allowing the user to choose their avatar on first login.
+ // These may be passed up by SLE to allow choice of enterprise avatars instead of the standard
+ // "new ruth." Not to be confused with 'initial-outfit' below
+ LLSD newuser_config = response["newuser-config"][0];
+ if(newuser_config.has("DefaultFemaleAvatar"))
+ {
+ gSavedSettings.setString("DefaultFemaleAvatar", newuser_config["DefaultFemaleAvatar"].asString());
+ }
+ if(newuser_config.has("DefaultMaleAvatar"))
+ {
+ gSavedSettings.setString("DefaultMaleAvatar", newuser_config["DefaultMaleAvatar"].asString());
+ }
+
+ // Initial outfit for the user.
+ // QUESTION: Why can't we simply simply set the users outfit directly
+ // from a web page into the user info on the server? - Roxie
+ LLSD initial_outfit = response["initial-outfit"][0];
+ if(initial_outfit.size())
+ {
+ std::string flag = initial_outfit["folder_name"];
+ if(!flag.empty())
+ {
+ // Initial outfit is a folder in your inventory,
+ // must be an exact folder-name match.
+ sInitialOutfit = flag;
+ }
+
+ flag = initial_outfit["gender"].asString();
+ if(!flag.empty())
+ {
+ sInitialOutfitGender = flag;
+ }
+ }
+
+ LLSD global_textures = response["global-textures"][0];
+ if(global_textures.size())
+ {
+ // Extract sun and moon texture IDs. These are used
+ // in the LLVOSky constructor, but I can't figure out
+ // how to pass them in. JC
+ LLUUID id = global_textures["sun_texture_id"];
+ if(id.notNull())
+ {
+ gSunTextureID = id;
+ }
+
+ id = global_textures["moon_texture_id"];
+ if(id.notNull())
+ {
+ gMoonTextureID = id;
+ }
+
+ id = global_textures["cloud_texture_id"];
+ if(id.notNull())
+ {
+ gCloudTextureID = id;
+ }
+ }
+
+ // Set the location of the snapshot sharing config endpoint
+ std::string snapshot_config_url = response["snapshot_config_url"];
+ if(!snapshot_config_url.empty())
+ {
+ gSavedSettings.setString("SnapshotConfigURL", snapshot_config_url);
+ }
+
+ // Start the process of fetching the OpenID session cookie for this user login
+ std::string openid_url = response["openid_url"];
+ if(!openid_url.empty())
+ {
+ std::string openid_token = response["openid_token"];
+ LLViewerMedia::openIDSetup(openid_url, openid_token);
+ }
+
+ if(response.has("max-agent-groups")) {
+ std::string max_agent_groups(response["max-agent-groups"]);
+ gMaxAgentGroups = atoi(max_agent_groups.c_str());
+ LL_INFOS("LLStartup") << "gMaxAgentGroups read from login.cgi: "
+ << gMaxAgentGroups << LL_ENDL;
+ }
+ else {
+ gMaxAgentGroups = DEFAULT_MAX_AGENT_GROUPS;
+ LL_INFOS("LLStartup") << "using gMaxAgentGroups default: "
+ << gMaxAgentGroups << LL_ENDL;
+ }
+
+ bool success = false;
+ // JC: gesture loading done below, when we have an asset system
+ // in place. Don't delete/clear gUserCredentials until then.
+ if(gAgentID.notNull()
+ && gAgentSessionID.notNull()
+ && gMessageSystem->mOurCircuitCode
+ && gFirstSim.isOk()
+ && gInventory.getRootFolderID().notNull())
+ {
+ success = true;
+ }
+
+ return success;
+}
+
+void transition_back_to_login_panel(const std::string& emsg)
+{
+ if (gNoRender)
+ {
+ LL_WARNS("AppInit") << "Failed to login!" << LL_ENDL;
+ LL_WARNS("AppInit") << emsg << LL_ENDL;
+ exit(0);
+ }
+
+ // Bounce back to the login screen.
+ reset_login(); // calls LLStartUp::setStartupState( STATE_LOGIN_SHOW );
+ gSavedSettings.setBOOL("AutoLogin", FALSE);
+}
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index f54214b95c..7fb52c1939 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -1419,22 +1419,21 @@ void LLTextureCache::readHeaderCache()
}
}
}
- if (num_entries > sCacheMaxEntries)
+ if (num_entries - empty_entries > sCacheMaxEntries)
{
// Special case: cache size was reduced, need to remove entries
// Note: After we prune entries, we will call this again and create the LRU
- U32 entries_to_purge = (num_entries-empty_entries) - sCacheMaxEntries;
+ U32 entries_to_purge = (num_entries - empty_entries) - sCacheMaxEntries;
llinfos << "Texture Cache Entries: " << num_entries << " Max: " << sCacheMaxEntries << " Empty: " << empty_entries << " Purging: " << entries_to_purge << llendl;
- if (entries_to_purge > 0)
+ // We can exit the following loop with the given condition, since if we'd reach the end of the lru set we'd have:
+ // purge_list.size() = lru.size() = num_entries - empty_entries = entries_to_purge + sCacheMaxEntries >= entries_to_purge
+ // So, it's certain that iter will never reach lru.end() first.
+ std::set<lru_data_t>::iterator iter = lru.begin();
+ while (purge_list.size() < entries_to_purge)
{
- for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter)
- {
- purge_list.insert(iter->second);
- if (purge_list.size() >= entries_to_purge)
- break;
- }
+ purge_list.insert(iter->second);
+ ++iter;
}
- llassert_always(purge_list.size() >= entries_to_purge);
}
else
{
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index fd5582d6f7..e0b07ed408 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -99,7 +99,6 @@ LLToast::Params::Params()
LLToast::LLToast(const LLToast::Params& p)
: LLModalDialog(LLSD(), p.is_modal),
- mPanel(p.panel),
mToastLifetime(p.lifetime_secs),
mToastFadingTime(p.fading_time_secs),
mNotificationID(p.notif_id),
@@ -108,6 +107,7 @@ LLToast::LLToast(const LLToast::Params& p)
mCanBeStored(p.can_be_stored),
mHideBtnEnabled(p.enable_hide_btn),
mHideBtn(NULL),
+ mPanel(NULL),
mNotification(p.notification),
mIsHidden(false),
mHideBtnPressed(false),
@@ -128,9 +128,9 @@ LLToast::LLToast(const LLToast::Params& p)
setBackgroundOpaque(TRUE); // *TODO: obsolete
updateTransparency();
- if(mPanel)
+ if(p.panel())
{
- insertPanel(mPanel);
+ insertPanel(p.panel);
}
if(mHideBtnEnabled)
@@ -309,6 +309,7 @@ void LLToast::reshapeToPanel()
void LLToast::insertPanel(LLPanel* panel)
{
+ mPanel = panel;
mWrapperPanel->addChild(panel);
reshapeToPanel();
}
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 562b9219b4..582f50ba37 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -79,8 +79,11 @@ static ECursorType cursor_from_parcel_media(U8 click_action);
LLToolPie::LLToolPie()
: LLTool(std::string("Pie")),
- mGrabMouseButtonDown( FALSE ),
- mMouseOutsideSlop( FALSE ),
+ mMouseButtonDown( false ),
+ mMouseOutsideSlop( false ),
+ mMouseSteerX(-1),
+ mMouseSteerY(-1),
+ mAbortClickToWalk(false),
mClickAction(0),
mClickActionBuyEnabled( gSavedSettings.getBOOL("ClickActionBuyEnabled") ),
mClickActionPayEnabled( gSavedSettings.getBOOL("ClickActionPayEnabled") )
@@ -99,12 +102,17 @@ BOOL LLToolPie::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktyp
BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)
{
+ mMouseOutsideSlop = FALSE;
+ mMouseDownX = x;
+ mMouseDownY = y;
+
//left mouse down always picks transparent
mPick = gViewerWindow->pickImmediate(x, y, TRUE);
mPick.mKeyMask = mask;
- mGrabMouseButtonDown = TRUE;
+
+ mMouseButtonDown = true;
- pickLeftMouseDownCallback();
+ handleLeftClickPick();
return TRUE;
}
@@ -119,7 +127,7 @@ BOOL LLToolPie::handleRightMouseDown(S32 x, S32 y, MASK mask)
// claim not handled so UI focus stays same
- pickRightMouseDownCallback();
+ handleRightClickPick();
return FALSE;
}
@@ -136,7 +144,7 @@ BOOL LLToolPie::handleScrollWheel(S32 x, S32 y, S32 clicks)
}
// True if you selected an object.
-BOOL LLToolPie::pickLeftMouseDownCallback()
+BOOL LLToolPie::handleLeftClickPick()
{
S32 x = mPick.mMousePt.mX;
S32 y = mPick.mMousePt.mY;
@@ -292,7 +300,12 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
}
// put focus back "in world"
- gFocusMgr.setKeyboardFocus(NULL);
+ if (gFocusMgr.getKeyboardFocus())
+ {
+ // don't click to walk on attempt to give focus to world
+ mAbortClickToWalk = true;
+ gFocusMgr.setKeyboardFocus(NULL);
+ }
BOOL touchable = (object && object->flagHandleTouch())
|| (parent && parent->flagHandleTouch());
@@ -304,6 +317,7 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
)
{
gGrabTransientTool = this;
+ mMouseButtonDown = false;
LLToolMgr::getInstance()->getCurrentToolset()->selectTool( LLToolGrab::getInstance() );
return LLToolGrab::getInstance()->handleObjectHit( mPick );
}
@@ -319,9 +333,9 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
if (!gSavedSettings.getBOOL("LeftClickShowMenu"))
{
// mouse already released
- if (!mGrabMouseButtonDown)
+ if (!mMouseButtonDown)
{
- return TRUE;
+ return true;
}
while( object && object->isAttachment() && !object->flagHandleTouch())
@@ -333,9 +347,10 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
}
object = (LLViewerObject*)object->getParent();
}
- if (object && object == gAgentAvatarp)
+ if (object && object == gAgentAvatarp && !gSavedSettings.getBOOL("ClickToWalk"))
{
// we left clicked on avatar, switch to focus mode
+ mMouseButtonDown = false;
LLToolMgr::getInstance()->setTransientTool(LLToolCamera::getInstance());
gViewerWindow->hideCursor();
LLToolCamera::getInstance()->setMouseCapture(TRUE);
@@ -513,7 +528,28 @@ void LLToolPie::selectionPropertiesReceived()
BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
{
+ if (!mMouseOutsideSlop
+ && mMouseButtonDown
+ && gSavedSettings.getBOOL("ClickToWalk"))
+ {
+ S32 delta_x = x - mMouseDownX;
+ S32 delta_y = y - mMouseDownY;
+ S32 threshold = gSavedSettings.getS32("DragAndDropDistanceThreshold");
+ if (delta_x * delta_x + delta_y * delta_y > threshold * threshold)
+ {
+ startCameraSteering();
+ }
+ }
+
mHoverPick = gViewerWindow->pickImmediate(x, y, FALSE);
+
+ if (inCameraSteerMode())
+ {
+ steerCameraWithMouse(x, y);
+ gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB);
+ return TRUE;
+ }
+
// perform a separate pick that detects transparent objects since they respond to 1-click actions
LLPickInfo click_action_pick = gViewerWindow->pickImmediate(x, y, TRUE);
@@ -584,39 +620,62 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
{
LLViewerObject* obj = mPick.getObject();
-
- handleMediaMouseUp();
-
U8 click_action = final_click_action(obj);
- if (click_action != CLICK_ACTION_NONE)
+
+ // let media have first pass at click
+ if (handleMediaMouseUp() || LLViewerMediaFocus::getInstance()->getFocus())
+ {
+ mAbortClickToWalk = true;
+ }
+ stopCameraSteering();
+ mMouseButtonDown = false;
+
+ if (click_action == CLICK_ACTION_NONE // not doing 1-click action
+ && gSavedSettings.getBOOL("ClickToWalk") // click to walk enabled
+ && !gAgent.getFlying() // don't auto-navigate while flying until that works
+ && !mAbortClickToWalk // another behavior hasn't cancelled click to walk
+ && !mPick.mPosGlobal.isExactlyZero() // valid coordinates for pick
+ && (mPick.mPickType == LLPickInfo::PICK_LAND // we clicked on land
+ || mPick.mObjectID.notNull())) // or on an object
{
- switch(click_action)
+ // handle special cases of steering picks
+ LLViewerObject* avatar_object = mPick.getObject();
+
+ // get pointer to avatar
+ while (avatar_object && !avatar_object->isAvatar())
{
- // NOTE: mClickActionBuyEnabled flag enables/disables BUY action but setting cursor to default is okay
- case CLICK_ACTION_BUY:
- // NOTE: mClickActionPayEnabled flag enables/disables PAY action but setting cursor to default is okay
- case CLICK_ACTION_PAY:
- case CLICK_ACTION_OPEN:
- case CLICK_ACTION_ZOOM:
- case CLICK_ACTION_PLAY:
- case CLICK_ACTION_OPEN_MEDIA:
- // Because these actions open UI dialogs, we won't change
- // the cursor again until the next hover and GL pick over
- // the world. Keep the cursor an arrow, assuming that
- // after the user moves off the UI, they won't be on the
- // same object anymore.
- gViewerWindow->setCursor(UI_CURSOR_ARROW);
- // Make sure the hover-picked object is ignored.
- //gToolTipView->resetLastHoverObject();
- break;
- default:
- break;
+ avatar_object = (LLViewerObject*)avatar_object->getParent();
+ }
+
+ if (avatar_object && ((LLVOAvatar*)avatar_object)->isSelf())
+ {
+ const F64 SELF_CLICK_WALK_DISTANCE = 3.0;
+ // pretend we picked some point a bit in front of avatar
+ mPick.mPosGlobal = gAgent.getPositionGlobal() + LLVector3d(LLViewerCamera::instance().getAtAxis()) * SELF_CLICK_WALK_DISTANCE;
}
+ gAgentCamera.setFocusOnAvatar(TRUE, TRUE);
+ if(mAutoPilotDestination) { mAutoPilotDestination->markDead(); }
+ mAutoPilotDestination = (LLHUDEffectBlob *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BLOB, FALSE);
+ mAutoPilotDestination->setPositionGlobal(mPick.mPosGlobal);
+ mAutoPilotDestination->setPixelSize(5);
+ mAutoPilotDestination->setColor(LLColor4U(50, 50, 200));
+ mAutoPilotDestination->setDuration(3.f);
+
+ handle_go_to();
+ mAbortClickToWalk = false;
+
+ return TRUE;
+ }
+ gViewerWindow->setCursor(UI_CURSOR_ARROW);
+ if (hasMouseCapture())
+ {
+ setMouseCapture(FALSE);
}
- mGrabMouseButtonDown = FALSE;
LLToolMgr::getInstance()->clearTransientTool();
gAgentCamera.setLookAt(LOOKAT_TARGET_CONVERSATION, obj); // maybe look at object/person clicked on
+
+ mAbortClickToWalk = false;
return LLTool::handleMouseUp(x, y, mask);
}
@@ -936,7 +995,7 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l
p.click_callback(boost::bind(showAvatarInspector, hover_object->getID()));
p.visible_time_near(6.f);
p.visible_time_far(3.f);
- p.delay_time(0.35f);
+ p.delay_time(gSavedSettings.getF32("AvatarInspectorTooltipDelay"));
p.wrap(false);
LLToolTipMgr::instance().show(p);
@@ -1054,7 +1113,7 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l
p.click_homepage_callback(boost::bind(VisitHomePage, mHoverPick));
p.visible_time_near(6.f);
p.visible_time_far(3.f);
- p.delay_time(0.35f);
+ p.delay_time(gSavedSettings.getF32("ObjectInspectorTooltipDelay"));
p.wrap(false);
LLToolTipMgr::instance().show(p);
@@ -1237,6 +1296,10 @@ void LLToolPie::VisitHomePage(const LLPickInfo& info)
}
}
+void LLToolPie::handleSelect()
+{
+ mAbortClickToWalk = true;
+}
void LLToolPie::handleDeselect()
{
@@ -1275,10 +1338,20 @@ void LLToolPie::stopEditing()
void LLToolPie::onMouseCaptureLost()
{
- mMouseOutsideSlop = FALSE;
+ stopCameraSteering();
+ mMouseButtonDown = false;
handleMediaMouseUp();
}
+void LLToolPie::stopCameraSteering()
+{
+ mMouseOutsideSlop = false;
+}
+
+bool LLToolPie::inCameraSteerMode()
+{
+ return mMouseButtonDown && mMouseOutsideSlop && gSavedSettings.getBOOL("ClickToWalk");
+}
// true if x,y outside small box around start_x,start_y
BOOL LLToolPie::outsideSlop(S32 x, S32 y, S32 start_x, S32 start_y)
@@ -1444,8 +1517,6 @@ bool LLToolPie::handleMediaMouseUp()
mMediaMouseCaptureID.setNull();
- setMouseCapture(FALSE);
-
result = true;
}
@@ -1508,7 +1579,7 @@ static ECursorType cursor_from_parcel_media(U8 click_action)
// True if we handled the event.
-BOOL LLToolPie::pickRightMouseDownCallback()
+BOOL LLToolPie::handleRightClickPick()
{
S32 x = mPick.mMousePt.mX;
S32 y = mPick.mMousePt.mY;
@@ -1630,10 +1701,148 @@ BOOL LLToolPie::pickRightMouseDownCallback()
void LLToolPie::showVisualContextMenuEffect()
{
- // VEFFECT: ShowPie
- LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_SPHERE, TRUE);
- effectp->setPositionGlobal(mPick.mPosGlobal);
- effectp->setColor(LLColor4U(gAgent.getEffectColor()));
- effectp->setDuration(0.25f);
+ // VEFFECT: ShowPie
+ LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_SPHERE, TRUE);
+ effectp->setPositionGlobal(mPick.mPosGlobal);
+ effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+ effectp->setDuration(0.25f);
+}
+
+
+bool intersect_ray_with_sphere( const LLVector3& ray_pt, const LLVector3& ray_dir, const LLVector3& sphere_center, F32 sphere_radius, LLVector3& intersection_pt)
+{
+ // do ray/sphere intersection by solving quadratic equation
+ LLVector3 sphere_to_ray_start_vec = ray_pt - sphere_center;
+ F32 B = 2.f * ray_dir * sphere_to_ray_start_vec;
+ F32 C = sphere_to_ray_start_vec.lengthSquared() - (sphere_radius * sphere_radius);
+
+ F32 discriminant = B*B - 4.f*C;
+ if (discriminant > 0.f)
+ { // intersection detected, now find closest one
+ F32 t0 = (-B - sqrtf(discriminant)) / 2.f;
+ if (t0 > 0.f)
+ {
+ intersection_pt = ray_pt + ray_dir * t0;
+ }
+ else
+ {
+ F32 t1 = (-B + sqrtf(discriminant)) / 2.f;
+ intersection_pt = ray_pt + ray_dir * t1;
+ }
+ return true;
+ }
+
+ return false;
+}
+
+void LLToolPie::startCameraSteering()
+{
+ mMouseOutsideSlop = true;
+ mAbortClickToWalk = true;
+ if (gAgentCamera.getFocusOnAvatar())
+ {
+ mSteerPick = mPick;
+
+ // handle special cases of steering picks
+ LLViewerObject* avatar_object = mSteerPick.getObject();
+
+ // get pointer to avatar
+ while (avatar_object && !avatar_object->isAvatar())
+ {
+ avatar_object = (LLViewerObject*)avatar_object->getParent();
+ }
+
+ // if clicking on own avatar...
+ if (avatar_object && ((LLVOAvatar*)avatar_object)->isSelf())
+ {
+ // ...project pick point a few meters in front of avatar
+ mSteerPick.mPosGlobal = gAgent.getPositionGlobal() + LLVector3d(LLViewerCamera::instance().getAtAxis()) * 3.0;
+ }
+
+ if (!mSteerPick.isValid())
+ {
+ mSteerPick.mPosGlobal = gAgent.getPosGlobalFromAgent(
+ LLViewerCamera::instance().getOrigin() + gViewerWindow->mouseDirectionGlobal(mSteerPick.mMousePt.mX, mSteerPick.mMousePt.mY) * 100.f);
+ }
+
+ setMouseCapture(TRUE);
+
+ mMouseSteerX = mMouseDownX;
+ mMouseSteerY = mMouseDownY;
+ const LLVector3 camera_to_rotation_center = gAgent.getFrameAgent().getOrigin() - LLViewerCamera::instance().getOrigin();
+ const LLVector3 rotation_center_to_pick = gAgent.getPosAgentFromGlobal(mSteerPick.mPosGlobal) - gAgent.getFrameAgent().getOrigin();
+
+ mClockwise = camera_to_rotation_center * rotation_center_to_pick < 0.f;
+ if (mMouseSteerGrabPoint) { mMouseSteerGrabPoint->markDead(); }
+ mMouseSteerGrabPoint = (LLHUDEffectBlob *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BLOB, FALSE);
+ mMouseSteerGrabPoint->setPositionGlobal(mSteerPick.mPosGlobal);
+ mMouseSteerGrabPoint->setColor(LLColor4U(50, 50, 200));
+ mMouseSteerGrabPoint->setPixelSize(5);
+ mMouseSteerGrabPoint->setDuration(2.f);
+ }
+}
+
+void LLToolPie::steerCameraWithMouse(S32 x, S32 y)
+{
+ const F32 MIN_ROTATION_RADIUS_FRACTION = 0.2f;
+
+ const LLVector3 pick_pos = gAgent.getPosAgentFromGlobal(mSteerPick.mPosGlobal);
+ const LLVector3 rotation_center = gAgent.getFrameAgent().getOrigin();
+ // FIXME: get this to work with camera tilt (i.e. sitting on a rotating object)
+ const LLVector3 rotation_up_axis(LLVector3::z_axis);
+
+ LLVector3 object_rotation_center = rotation_center + parallel_component(pick_pos - rotation_center, rotation_up_axis);
+ F32 min_rotation_radius = MIN_ROTATION_RADIUS_FRACTION * dist_vec(rotation_center, LLViewerCamera::instance().getOrigin());;
+ F32 pick_distance_from_rotation_center = llclamp(dist_vec(pick_pos, object_rotation_center), min_rotation_radius, F32_MAX);
+
+ LLVector3 mouse_ray = orthogonal_component(gViewerWindow->mouseDirectionGlobal(x, y), rotation_up_axis);
+ mouse_ray.normalize();
+
+ LLVector3 old_mouse_ray = orthogonal_component(gViewerWindow->mouseDirectionGlobal(mMouseSteerX, mMouseSteerY), rotation_up_axis);
+ old_mouse_ray.normalize();
+
+ LLVector3 camera_pos = gAgentCamera.getCameraPositionAgent();
+ LLVector3 camera_to_rotation_center = object_rotation_center - camera_pos;
+ LLVector3 adjusted_camera_pos = camera_pos + projected_vec(camera_to_rotation_center, rotation_up_axis);
+ LLVector3 rotation_fwd_axis = LLViewerCamera::instance().getAtAxis() - projected_vec(LLViewerCamera::instance().getAtAxis(), rotation_up_axis);
+ rotation_fwd_axis.normalize();
+ F32 pick_dist = dist_vec(pick_pos, adjusted_camera_pos);
+
+ LLVector3 mouse_on_sphere;
+ bool mouse_hit_sphere = intersect_ray_with_sphere(adjusted_camera_pos + (mouse_ray * pick_dist * 1.1f),
+ -1.f * mouse_ray,
+ object_rotation_center,
+ pick_distance_from_rotation_center,
+ mouse_on_sphere);
+
+ LLVector3 old_mouse_on_sphere;
+ intersect_ray_with_sphere(adjusted_camera_pos + (old_mouse_ray * pick_dist * 1.1f),
+ -1.f * old_mouse_ray,
+ object_rotation_center,
+ pick_distance_from_rotation_center,
+ old_mouse_on_sphere);
+
+ if (mouse_hit_sphere)
+ {
+ // calculate rotation frame in screen space
+ LLVector3 screen_rotation_up_axis = orthogonal_component(rotation_up_axis, LLViewerCamera::instance().getAtAxis());
+ screen_rotation_up_axis.normalize();
+
+ LLVector3 screen_rotation_left_axis = screen_rotation_up_axis % LLViewerCamera::instance().getAtAxis();
+
+ LLVector3 rotation_furthest_pt = object_rotation_center + pick_distance_from_rotation_center * rotation_fwd_axis;
+ F32 mouse_lateral_distance = llclamp(((mouse_on_sphere - rotation_furthest_pt) * screen_rotation_left_axis) / pick_distance_from_rotation_center, -1.f, 1.f);
+ F32 old_mouse_lateral_distance = llclamp(((old_mouse_on_sphere - rotation_furthest_pt) * screen_rotation_left_axis) / pick_distance_from_rotation_center, -1.f, 1.f);
+
+ F32 yaw_angle = asinf(mouse_lateral_distance);
+ F32 old_yaw_angle = asinf(old_mouse_lateral_distance);
+
+ F32 delta_angle = yaw_angle - old_yaw_angle;
+ if (!mClockwise) delta_angle *= -1.f;
+
+ gAgent.yaw(delta_angle);
+ mMouseSteerX = x;
+ mMouseSteerY = y;
+ }
}
diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h
index 77200a1da4..22e77a3159 100644
--- a/indra/newview/lltoolpie.h
+++ b/indra/newview/lltoolpie.h
@@ -30,6 +30,7 @@
#include "lltool.h"
#include "lluuid.h"
#include "llviewerwindow.h" // for LLPickInfo
+#include "llhudeffectblob.h" // for LLPointer<LLHudEffectBlob>, apparently
class LLViewerObject;
class LLObjectSelection;
@@ -56,6 +57,7 @@ public:
virtual void stopEditing();
virtual void onMouseCaptureLost();
+ virtual void handleSelect();
virtual void handleDeselect();
virtual LLTool* getOverrideTool(MASK mask);
@@ -75,8 +77,8 @@ public:
private:
BOOL outsideSlop (S32 x, S32 y, S32 start_x, S32 start_y);
- BOOL pickLeftMouseDownCallback();
- BOOL pickRightMouseDownCallback();
+ BOOL handleLeftClickPick();
+ BOOL handleRightClickPick();
BOOL useClickAction (MASK mask, LLViewerObject* object,LLViewerObject* parent);
void showVisualContextMenuEffect();
@@ -88,12 +90,26 @@ private:
BOOL handleTooltipLand(std::string line, std::string tooltip_msg);
BOOL handleTooltipObject( LLViewerObject* hover_object, std::string line, std::string tooltip_msg);
+ void steerCameraWithMouse(S32 x, S32 y);
+ void startCameraSteering();
+ void stopCameraSteering();
+ bool inCameraSteerMode();
+
private:
- BOOL mGrabMouseButtonDown;
- BOOL mMouseOutsideSlop; // for this drag, has mouse moved outside slop region
+ bool mMouseButtonDown;
+ bool mMouseOutsideSlop; // for this drag, has mouse moved outside slop region
+ S32 mMouseDownX;
+ S32 mMouseDownY;
+ S32 mMouseSteerX;
+ S32 mMouseSteerY;
+ LLPointer<LLHUDEffectBlob> mAutoPilotDestination;
+ LLPointer<LLHUDEffectBlob> mMouseSteerGrabPoint;
+ bool mClockwise;
+ bool mAbortClickToWalk;
LLUUID mMediaMouseCaptureID;
LLPickInfo mPick;
LLPickInfo mHoverPick;
+ LLPickInfo mSteerPick;
LLPointer<LLViewerObject> mClickActionObject;
U8 mClickAction;
LLSafeHandle<LLObjectSelection> mLeftClickSelection;
diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp
index bd4d3c2b78..ebbb045f0a 100644
--- a/indra/newview/llurldispatcher.cpp
+++ b/indra/newview/llurldispatcher.cpp
@@ -180,7 +180,7 @@ bool LLURLDispatcherImpl::dispatchRegion(const LLSLURL& slurl, bool right_mouse)
LLWorldMapMessage::getInstance()->sendNamedRegionRequest(slurl.getRegion(),
LLURLDispatcherImpl::regionNameCallback,
slurl.getSLURLString(),
- false); // don't teleport
+ LLUI::sSettingGroups["config"]->getBOOL("SLURLTeleportDirectly")); // don't teleport
return true;
}
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 900081b8c6..499165135a 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -59,6 +59,8 @@
#include "lluuid.h"
#include "llkeyboard.h"
#include "llmutelist.h"
+#include "llpanelprofile.h"
+#include "llappviewer.h"
//#include "llfirstuse.h"
#include "llwindow.h"
@@ -292,6 +294,43 @@ public:
};
+class LLViewerMediaWebProfileResponder : public LLHTTPClient::Responder
+{
+LOG_CLASS(LLViewerMediaWebProfileResponder);
+public:
+ LLViewerMediaWebProfileResponder(std::string host)
+ {
+ mHost = host;
+ }
+
+ ~LLViewerMediaWebProfileResponder()
+ {
+ }
+
+ /* virtual */ void completedHeader(U32 status, const std::string& reason, const LLSD& content)
+ {
+ LL_WARNS("MediaAuth") << "status = " << status << ", reason = " << reason << LL_ENDL;
+ LL_WARNS("MediaAuth") << content << LL_ENDL;
+
+ std::string cookie = content["set-cookie"].asString();
+
+ LLViewerMedia::getCookieStore()->setCookiesFromHost(cookie, mHost);
+ }
+
+ void completedRaw(
+ U32 status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ // This is just here to disable the default behavior (attempting to parse the response as llsd).
+ // We don't care about the content of the response, only the set-cookie header.
+ }
+
+ std::string mHost;
+};
+
+
LLPluginCookieStore *LLViewerMedia::sCookieStore = NULL;
LLURL LLViewerMedia::sOpenIDURL;
std::string LLViewerMedia::sOpenIDCookie;
@@ -1351,6 +1390,19 @@ void LLViewerMedia::setOpenIDCookie()
// *HACK: Doing this here is nasty, find a better way.
LLWebSharing::instance().setOpenIDCookie(sOpenIDCookie);
+
+ // Do a web profile get so we can store the cookie
+ LLSD headers = LLSD::emptyMap();
+ headers["Accept"] = "*/*";
+ headers["Cookie"] = sOpenIDCookie;
+ headers["User-Agent"] = getCurrentUserAgent();
+
+ std::string profile_url = getProfileURL("");
+ LLURL raw_profile_url( profile_url.c_str() );
+
+ LLHTTPClient::get(profile_url,
+ new LLViewerMediaWebProfileResponder(raw_profile_url.getAuthority()),
+ headers);
}
}
@@ -1833,17 +1885,12 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type)
media_source->ignore_ssl_cert_errors(true);
}
- // NOTE: Removed as per STORM-927 - SSL handshake failed - setting local self-signed certs like this
- // seems to screw things up big time. For now, devs will need to add these certs locally and Qt will pick them up.
-// // start by assuming the default CA file will be used
-// std::string ca_path = gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "lindenlab.pem" );
-// // default turned off so pick up the user specified path
-// if( ! gSavedSettings.getBOOL("BrowserUseDefaultCAFile"))
-// {
-// ca_path = gSavedSettings.getString("BrowserCAFilePath");
-// }
-// // set the path to the CA.pem file
-// media_source->addCertificateFilePath( ca_path );
+ // the correct way to deal with certs it to load ours from CA.pem and append them to the ones
+ // Qt/WebKit loads from your system location.
+ // Note: This needs the new CA.pem file with the Equifax Secure Certificate Authority
+ // cert at the bottom: (MIIDIDCCAomgAwIBAgIENd70zzANBg)
+ std::string ca_path = gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "CA.pem" );
+ media_source->addCertificateFilePath( ca_path );
media_source->proxy_setup(gSavedSettings.getBOOL("BrowserProxyEnabled"), gSavedSettings.getString("BrowserProxyAddress"), gSavedSettings.getS32("BrowserProxyPort"));
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 425fe4eafb..75cf2efc69 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -843,33 +843,49 @@ class LLAdvancedCheckFeature : public view_listener_t
}
};
-void LLDestinationAndAvatarShow(const LLSD& value)
+void toggle_destination_and_avatar_picker(const LLSD& show)
{
- S32 panel_idx = value.isDefined() ? value.asInteger() : -1;
+ S32 panel_idx = show.isDefined() ? show.asInteger() : -1;
LLView* container = gViewerWindow->getRootView()->getChildView("avatar_picker_and_destination_guide_container");
LLMediaCtrl* destinations = container->findChild<LLMediaCtrl>("destination_guide_contents");
LLMediaCtrl* avatar_picker = container->findChild<LLMediaCtrl>("avatar_picker_contents");
+ LLButton* avatar_btn = gViewerWindow->getRootView()->getChildView("bottom_tray")->getChild<LLButton>("avatar_btn");
+ LLButton* destination_btn = gViewerWindow->getRootView()->getChildView("bottom_tray")->getChild<LLButton>("destination_btn");
switch(panel_idx)
{
case 0:
- container->setVisible(true);
- destinations->setVisible(true);
- avatar_picker->setVisible(false);
- LLFirstUse::notUsingDestinationGuide(false);
+ if (!destinations->getVisible())
+ {
+ container->setVisible(true);
+ destinations->setVisible(true);
+ avatar_picker->setVisible(false);
+ LLFirstUse::notUsingDestinationGuide(false);
+ avatar_btn->setToggleState(false);
+ destination_btn->setToggleState(true);
+ return;
+ }
break;
case 1:
- container->setVisible(true);
- destinations->setVisible(false);
- avatar_picker->setVisible(true);
- LLFirstUse::notUsingAvatarPicker(false);
+ if (!avatar_picker->getVisible())
+ {
+ container->setVisible(true);
+ destinations->setVisible(false);
+ avatar_picker->setVisible(true);
+ avatar_btn->setToggleState(true);
+ destination_btn->setToggleState(false);
+ return;
+ }
break;
default:
- container->setVisible(false);
- destinations->setVisible(false);
- avatar_picker->setVisible(false);
break;
}
+
+ container->setVisible(false);
+ destinations->setVisible(false);
+ avatar_picker->setVisible(false);
+ avatar_btn->setToggleState(false);
+ destination_btn->setToggleState(false);
};
@@ -5542,20 +5558,42 @@ class LLShowHelp : public view_listener_t
}
};
-class LLShowSidetrayPanel : public view_listener_t
+class LLToggleHelp : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- std::string panel_name = userdata.asString();
- // Toggle the panel
- if (!LLSideTray::getInstance()->isPanelActive(panel_name))
+ LLFloater* help_browser = (LLFloaterReg::findInstance("help_browser"));
+ if (help_browser && help_browser->isInVisibleChain())
{
- // LLFloaterInventory::showAgentInventory();
- LLSideTray::getInstance()->showPanel(panel_name, LLSD());
+ help_browser->closeFloater();
}
else
{
- LLSideTray::getInstance()->collapseSideBar();
+ std::string help_topic = userdata.asString();
+ LLViewerHelp* vhelp = LLViewerHelp::getInstance();
+ vhelp->showTopic(help_topic);
+ }
+ return true;
+ }
+};
+
+class LLShowSidetrayPanel : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ std::string panel_name = userdata.asString();
+
+ LLPanel* panel = LLSideTray::getInstance()->getPanel(panel_name);
+ if (panel)
+ {
+ if (panel->isInVisibleChain())
+ {
+ LLSideTray::getInstance()->hidePanel(panel_name);
+ }
+ else
+ {
+ LLSideTray::getInstance()->showPanel(panel_name);
+ }
}
return true;
}
@@ -5684,6 +5722,44 @@ class LLShowAgentProfile : public view_listener_t
}
};
+class LLToggleAgentProfile : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLUUID agent_id;
+ if (userdata.asString() == "agent")
+ {
+ agent_id = gAgent.getID();
+ }
+ else if (userdata.asString() == "hit object")
+ {
+ LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
+ if (objectp)
+ {
+ agent_id = objectp->getID();
+ }
+ }
+ else
+ {
+ agent_id = userdata.asUUID();
+ }
+
+ LLVOAvatar* avatar = find_avatar_from_object(agent_id);
+ if (avatar)
+ {
+ if (!LLAvatarActions::profileVisible(avatar->getID()))
+ {
+ LLAvatarActions::showProfile(avatar->getID());
+ }
+ else
+ {
+ LLAvatarActions::hideProfile(avatar->getID());
+ }
+ }
+ return true;
+ }
+};
+
class LLLandEdit : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -8078,8 +8154,10 @@ void initialize_menus()
commit.add("ReportAbuse", boost::bind(&handle_report_abuse));
commit.add("BuyCurrency", boost::bind(&handle_buy_currency));
view_listener_t::addMenu(new LLShowHelp(), "ShowHelp");
+ view_listener_t::addMenu(new LLToggleHelp(), "ToggleHelp");
view_listener_t::addMenu(new LLPromptShowURL(), "PromptShowURL");
view_listener_t::addMenu(new LLShowAgentProfile(), "ShowAgentProfile");
+ view_listener_t::addMenu(new LLToggleAgentProfile(), "ToggleAgentProfile");
view_listener_t::addMenu(new LLToggleControl(), "ToggleControl");
view_listener_t::addMenu(new LLCheckControl(), "CheckControl");
view_listener_t::addMenu(new LLGoToObject(), "GoToObject");
@@ -8100,5 +8178,6 @@ void initialize_menus()
view_listener_t::addMenu(new LLToggleUIHints(), "ToggleUIHints");
- commit.add("DestinationAndAvatar.show", boost::bind(&LLDestinationAndAvatarShow, _2));
+ commit.add("Destination.show", boost::bind(&toggle_destination_and_avatar_picker, 0));
+ commit.add("Avatar.show", boost::bind(&toggle_destination_and_avatar_picker, 1));
}
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index 87cb4efbc4..b4e239b0cd 100644
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -126,6 +126,8 @@ bool enable_pay_object();
bool enable_buy_object();
bool handle_go_to();
+void toggle_destination_and_avatar_picker(const LLSD& show);
+
// Export to XML or Collada
void handle_export_selected( void * );
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 103989ee80..8b52d478e6 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1199,7 +1199,6 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam
// Highlight item
const BOOL auto_open =
gSavedSettings.getBOOL("ShowInInventory") && // don't open if showininventory is false
- !(asset_type == LLAssetType::AT_CALLINGCARD) && // don't open if it's a calling card
!from_name.empty(); // don't open if it's not from anyone.
LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open);
if(active_panel)
@@ -1463,15 +1462,18 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
// This is an offer from an agent. In this case, the back
// end has already copied the items into your inventory,
// so we can fetch it out of our inventory.
- LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer(mObjectID, from_string);
- open_agent_offer->startFetch();
- if(catp || (itemp && itemp->isFinished()))
+ if (gSavedSettings.getBOOL("ShowOfferedInventory"))
{
- open_agent_offer->done();
- }
- else
- {
- opener = open_agent_offer;
+ LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer(mObjectID, from_string);
+ open_agent_offer->startFetch();
+ if(catp || (itemp && itemp->isFinished()))
+ {
+ open_agent_offer->done();
+ }
+ else
+ {
+ opener = open_agent_offer;
+ }
}
}
break;
@@ -1715,15 +1717,18 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
msg->addBinaryDataFast(_PREHASH_BinaryBucket, EMPTY_BINARY_BUCKET, EMPTY_BINARY_BUCKET_SIZE);
// send the message
msg->sendReliable(mHost);
+
+ if (gSavedSettings.getBOOL("LogInventoryDecline"))
{
LLStringUtil::format_map_t log_message_args;
log_message_args["DESC"] = mDesc;
log_message_args["NAME"] = mFromName;
log_message = LLTrans::getString("InvOfferDecline", log_message_args);
+
+ LLSD args;
+ args["MESSAGE"] = log_message;
+ LLNotificationsUtil::add("SystemMessage", args);
}
- LLSD args;
- args["MESSAGE"] = log_message;
- LLNotificationsUtil::add("SystemMessage", args);
if (busy && (!mFromGroup && !mFromObject))
{
@@ -3761,8 +3766,19 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
}
else
{
- // This is likely just the initial logging in phase.
+ // This is initial log-in or a region crossing
gAgent.setTeleportState( LLAgent::TELEPORT_NONE );
+
+ if(LLStartUp::getStartupState() < STATE_STARTED)
+ { // This is initial log-in, not a region crossing:
+ // Set the camera looking ahead of the AV so send_agent_update() below
+ // will report the correct location to the server.
+ LLVector3 look_at_point = look_at;
+ look_at_point = agent_pos + look_at_point.rotVec(gAgent.getQuat());
+
+ static LLVector3 up_direction(0.0f, 0.0f, 1.0f);
+ LLViewerCamera::getInstance()->lookAt(agent_pos, look_at_point, up_direction);
+ }
}
if ( LLTracker::isTracking(NULL) )
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index b91e407c6d..a59afdc28a 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -31,6 +31,7 @@
#include "llviewercontrol.h"
#include "llsdserialize.h"
#include "llsecapi.h"
+#include "lltrans.h"
#include "llweb.h"
@@ -504,7 +505,8 @@ void LLGridManager::setGridChoice(const std::string& grid)
addGrid(grid_data);
}
mGrid = grid;
- gSavedSettings.setString("CurrentGrid", grid);
+ gSavedSettings.setString("CurrentGrid", grid);
+
updateIsInProductionGrid();
}
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index 82bc164021..979d91cfcb 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -884,13 +884,14 @@ void LLViewerObjectList::clearDebugText()
void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
{
LLMemType mt(LLMemType::MTYPE_OBJECT);
- if (mDeadObjects.count(objectp->mID))
+ if (mDeadObjects.find(objectp->mID) != mDeadObjects.end())
{
- llinfos << "Object " << objectp->mID << " already on dead list, ignoring cleanup!" << llendl;
- return;
+ llinfos << "Object " << objectp->mID << " already on dead list!" << llendl;
+ }
+ else
+ {
+ mDeadObjects.insert(objectp->mID);
}
-
- mDeadObjects.insert(std::pair<LLUUID, LLPointer<LLViewerObject> >(objectp->mID, objectp));
// Cleanup any references we have to this object
// Remove from object map so noone can look it up.
@@ -1140,6 +1141,46 @@ bool LLViewerObjectList::hasMapObjectInRegion(LLViewerRegion* regionp)
return false ;
}
+//make sure the region is cleaned up.
+void LLViewerObjectList::clearAllMapObjectsInRegion(LLViewerRegion* regionp)
+{
+ std::set<LLViewerObject*> dead_object_list ;
+ std::set<LLViewerObject*> region_object_list ;
+ for (vobj_list_t::iterator iter = mMapObjects.begin(); iter != mMapObjects.end(); ++iter)
+ {
+ LLViewerObject* objectp = *iter;
+
+ if(objectp->isDead())
+ {
+ dead_object_list.insert(objectp) ;
+ }
+ else if(objectp->getRegion() == regionp)
+ {
+ region_object_list.insert(objectp) ;
+ }
+ }
+
+ if(dead_object_list.size() > 0)
+ {
+ llwarns << "There are " << dead_object_list.size() << " dead objects on the map!" << llendl ;
+
+ for(std::set<LLViewerObject*>::iterator iter = dead_object_list.begin(); iter != dead_object_list.end(); ++iter)
+ {
+ cleanupReferences(*iter) ;
+ }
+ }
+ if(region_object_list.size() > 0)
+ {
+ llwarns << "There are " << region_object_list.size() << " objects not removed from the deleted region!" << llendl ;
+
+ for(std::set<LLViewerObject*>::iterator iter = region_object_list.begin(); iter != region_object_list.end(); ++iter)
+ {
+ (*iter)->markDead() ;
+ }
+ }
+}
+
+
void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
{
LLColor4 above_water_color = LLUIColorTable::instance().getColor( "NetMapOtherOwnAboveWater" );
@@ -1159,7 +1200,10 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
{
LLViewerObject* objectp = *iter;
- llassert_always(!objectp->isDead());
+ if(objectp->isDead())//some dead objects somehow not cleaned.
+ {
+ continue ;
+ }
if (!objectp->getRegion() || objectp->isOrphaned() || objectp->isAttachment())
{
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h
index 8cff8e988a..22a7f97c38 100644
--- a/indra/newview/llviewerobjectlist.h
+++ b/indra/newview/llviewerobjectlist.h
@@ -88,6 +88,7 @@ public:
void shiftObjects(const LLVector3 &offset);
bool hasMapObjectInRegion(LLViewerRegion* regionp) ;
+ void clearAllMapObjectsInRegion(LLViewerRegion* regionp) ;
void renderObjectsForMap(LLNetMap &netmap);
void renderObjectBounds(const LLVector3 &center);
@@ -181,8 +182,7 @@ protected:
vobj_list_t mMapObjects;
- typedef std::map<LLUUID, LLPointer<LLViewerObject> > vo_map;
- vo_map mDeadObjects; // Need to keep multiple entries per UUID
+ std::set<LLUUID> mDeadObjects;
std::map<LLUUID, LLPointer<LLViewerObject> > mUUIDObjectMap;
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 23b7b921b8..e1d3e8a0b3 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -67,6 +67,7 @@
#include "llworld.h"
#include "llspatialpartition.h"
#include "stringize.h"
+#include "llviewercontrol.h"
#ifdef LL_WINDOWS
#pragma warning(disable:4355)
@@ -1387,10 +1388,15 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
capabilityNames.append("EventQueueGet");
capabilityNames.append("ObjectMedia");
capabilityNames.append("ObjectMediaNavigate");
- capabilityNames.append("FetchLib2");
- capabilityNames.append("FetchLibDescendents2");
- capabilityNames.append("FetchInventory2");
- capabilityNames.append("FetchInventoryDescendents2");
+
+ if (gSavedSettings.getBOOL("UseHTTPInventory"))
+ {
+ capabilityNames.append("FetchLib2");
+ capabilityNames.append("FetchLibDescendents2");
+ capabilityNames.append("FetchInventory2");
+ capabilityNames.append("FetchInventoryDescendents2");
+ }
+
capabilityNames.append("GetDisplayNames");
capabilityNames.append("GetTexture");
capabilityNames.append("GroupProposalBallot");
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index 546ee9a334..874519a59f 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -852,6 +852,8 @@ void send_stats()
body["DisplayNamesEnabled"] = gSavedSettings.getBOOL("UseDisplayNames");
body["DisplayNamesShowUsername"] = gSavedSettings.getBOOL("NameTagShowUsernames");
+ body["MinimalSkin"] = !gSavedSettings.getString("SessionSettingsFile").empty();
+
LLViewerStats::getInstance()->addToMessage(body);
LLHTTPClient::post(url, body, new ViewerStatsResponder());
}
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index cd16b15e3e..cf7f3f80ad 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -2691,12 +2691,10 @@ void LLViewerFetchedTexture::saveRawImage()
mLastReferencedSavedRawImageTime = sCurrentTime ;
}
-void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard, bool from_callback)
+void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard)
{
if(!mForceToSaveRawImage || mDesiredSavedRawDiscardLevel < 0 || mDesiredSavedRawDiscardLevel > desired_discard)
{
- llassert_always(from_callback || mBoostLevel == LLViewerTexture::BOOST_PREVIEW) ;
-
mForceToSaveRawImage = TRUE ;
mDesiredSavedRawDiscardLevel = desired_discard ;
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index b5636bbdc7..d512f8ec3a 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -465,7 +465,7 @@ public:
S32 getCachedRawImageLevel() const {return mCachedRawDiscardLevel;}
BOOL isCachedRawImageReady() const {return mCachedRawImageReady ;}
BOOL isRawImageValid()const { return mIsRawImageValid ; }
- void forceToSaveRawImage(S32 desired_discard = 0, bool from_callback = false) ;
+ void forceToSaveRawImage(S32 desired_discard = 0) ;
/*virtual*/ void setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) ;
void destroySavedRawImage() ;
LLImageRaw* getSavedRawImage() ;
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 0028ced6c8..147163a9c0 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -316,6 +316,14 @@ public:
std::string rwind_vector_text;
std::string audio_text;
+ static const std::string beacon_particle = LLTrans::getString("BeaconParticle");
+ static const std::string beacon_physical = LLTrans::getString("BeaconPhysical");
+ static const std::string beacon_scripted = LLTrans::getString("BeaconScripted");
+ static const std::string beacon_scripted_touch = LLTrans::getString("BeaconScriptedTouch");
+ static const std::string beacon_sound = LLTrans::getString("BeaconSound");
+ static const std::string beacon_media = LLTrans::getString("BeaconMedia");
+ static const std::string particle_hiding = LLTrans::getString("ParticleHiding");
+
// Draw the statistics in a light gray
// and in a thin font
mTextColor = LLColor4( 0.86f, 0.86f, 0.86f, 1.f );
@@ -566,33 +574,33 @@ public:
{
if (LLPipeline::getRenderParticleBeacons(NULL))
{
- addText(xpos, ypos, "Viewing particle beacons (blue)");
+ addText(xpos, ypos, beacon_particle);
ypos += y_inc;
}
if (LLPipeline::toggleRenderTypeControlNegated((void*)LLPipeline::RENDER_TYPE_PARTICLES))
{
- addText(xpos, ypos, "Hiding particles");
+ addText(xpos, ypos, particle_hiding);
ypos += y_inc;
}
if (LLPipeline::getRenderPhysicalBeacons(NULL))
{
- addText(xpos, ypos, "Viewing physical object beacons (green)");
+ addText(xpos, ypos, beacon_physical);
ypos += y_inc;
}
if (LLPipeline::getRenderScriptedBeacons(NULL))
{
- addText(xpos, ypos, "Viewing scripted object beacons (red)");
+ addText(xpos, ypos, beacon_scripted);
ypos += y_inc;
}
else
if (LLPipeline::getRenderScriptedTouchBeacons(NULL))
{
- addText(xpos, ypos, "Viewing scripted object with touch function beacons (red)");
+ addText(xpos, ypos, beacon_scripted_touch);
ypos += y_inc;
}
if (LLPipeline::getRenderSoundBeacons(NULL))
{
- addText(xpos, ypos, "Viewing sound beacons (yellow)");
+ addText(xpos, ypos, beacon_sound);
ypos += y_inc;
}
}
@@ -1616,6 +1624,7 @@ void LLViewerWindow::initBase()
// Constrain floaters to inside the menu and status bar regions.
gFloaterView = main_view->getChild<LLFloaterView>("Floater View");
+ gFloaterView->setFloaterSnapView(main_view->getChild<LLView>("floater_snap_region")->getHandle());
gSnapshotFloaterView = main_view->getChild<LLSnapshotFloaterView>("Snapshot Floater View");
@@ -1777,6 +1786,7 @@ void LLViewerWindow::initWorldUI()
buttons_panel_container->addChild(buttons_panel);
LLView* avatar_picker_destination_guide_container = gViewerWindow->getRootView()->getChild<LLView>("avatar_picker_and_destination_guide_container");
+ avatar_picker_destination_guide_container->getChild<LLButton>("close")->setCommitCallback(boost::bind(toggle_destination_and_avatar_picker, LLSD()));
LLMediaCtrl* destinations = avatar_picker_destination_guide_container->findChild<LLMediaCtrl>("destination_guide_contents");
LLMediaCtrl* avatar_picker = avatar_picker_destination_guide_container->findChild<LLMediaCtrl>("avatar_picker_contents");
if (destinations)
@@ -2560,10 +2570,6 @@ void LLViewerWindow::updateUI()
{
LLFirstUse::notUsingDestinationGuide();
}
- if (gLoggedInTime.getElapsedTimeF32() > gSavedSettings.getF32("AvatarPickerHintTimeout"))
- {
- LLFirstUse::notUsingAvatarPicker();
- }
if (gLoggedInTime.getElapsedTimeF32() > gSavedSettings.getF32("SidePanelHintTimeout"))
{
LLFirstUse::notUsingSidePanel();
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index a933500706..b888a263d0 100644
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -71,6 +71,7 @@ LLVOCacheEntry::LLVOCacheEntry()
}
LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file)
+ : mBuffer(NULL)
{
S32 size = -1;
BOOL success;
@@ -135,7 +136,10 @@ LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file)
LLVOCacheEntry::~LLVOCacheEntry()
{
- delete [] mBuffer;
+ if(mBuffer)
+ {
+ delete[] mBuffer;
+ }
}
diff --git a/indra/newview/llvoicecallhandler.cpp b/indra/newview/llvoicecallhandler.cpp
index 274bd75208..2050dab689 100644
--- a/indra/newview/llvoicecallhandler.cpp
+++ b/indra/newview/llvoicecallhandler.cpp
@@ -27,6 +27,8 @@
#include "llviewerprecompiledheaders.h"
#include "llcommandhandler.h"
#include "llavataractions.h"
+#include "llnotificationsutil.h"
+#include "llui.h"
class LLVoiceCallAvatarHandler : public LLCommandHandler
{
@@ -38,6 +40,12 @@ public:
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
{
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnableVoiceCall"))
+ {
+ LLNotificationsUtil::add("NoVoiceCall", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
//Make sure we have some parameters
if (params.size() == 0)
{
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 481148ba4e..8f7197c607 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -282,7 +282,9 @@ void LLWorld::removeRegion(const LLHost &host)
updateWaterObjects();
- llassert_always(!gObjectList.hasMapObjectInRegion(regionp)) ;
+ //double check all objects of this region are removed.
+ gObjectList.clearAllMapObjectsInRegion(regionp) ;
+ //llassert_always(!gObjectList.hasMapObjectInRegion(regionp)) ;
}
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 13e537fae5..65fdc12f0a 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -6851,7 +6851,6 @@ void LLPipeline::renderDeferredLighting()
{
// Render debugging beacons.
gObjectList.renderObjectBeacons();
- LLHUDObject::renderAll();
gObjectList.resetObjectBeacons();
}
}
diff --git a/indra/newview/skins/default/textures/bottomtray/ChatBarHandle.png b/indra/newview/skins/default/textures/bottomtray/ChatBarHandle.png
new file mode 100644
index 0000000000..8b58db0cba
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/ChatBarHandle.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 7b3cc7bdfa..cec2942b35 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -115,6 +115,7 @@ with the same filename but different name
<texture name="DisclosureArrow_Opened_Off" file_name="widgets/DisclosureArrow_Opened_Off.png" preload="true" />
+ <texture name="ChatBarHandle" file_name="bottomtray/ChatBarHandle.png" preload="false" />
<texture name="DownArrow" file_name="bottomtray/DownArrow.png" preload="false" />
<texture name="DownArrow_Off" file_name="icons/DownArrow_Off.png" preload="false" />
<texture name="Dragbar" file_name="windows/Dragbar.png" preload="false" scale.left="35" scale.top="5" scale.right="29" scale.bottom="5" />
diff --git a/indra/newview/skins/default/xui/da/floater_about_land.xml b/indra/newview/skins/default/xui/da/floater_about_land.xml
index e80d187335..e78924a1ab 100644
--- a/indra/newview/skins/default/xui/da/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/da/floater_about_land.xml
@@ -390,7 +390,6 @@ Kun større parceller kan vises i søgning.
Hjemmeside:
</text>
<button label="Vælg" name="set_media_url"/>
- <check_box label="Skjul medie URL" name="hide_media_url" tool_tip="Klik her for at skjule medie adressen så det kun er dig og evt. parcel gruppens ejer/administratorer der kan se den."/>
<text left="4" name="Description:">
Beskrivelse:
</text>
@@ -418,7 +417,6 @@ Kun større parceller kan vises i søgning.
<check_box label="Gentag afspil" name="media_loop" tool_tip="Gentager automatisk medie, når det er færdigt med at spille starter det automatisk forfra."/>
</panel>
<panel label="LYD" name="land_audio_panel">
- <check_box label="Skjul URL" name="hide_music_url" tool_tip="Ved at vælge her, vil musik URL skjules for alle ikke autoriserede brugere der læser denne parcels information."/>
<check_box label="Tillad stemmer" name="parcel_enable_voice_channel"/>
<check_box label="Tillad stemmer (håndteret af estate)" name="parcel_enable_voice_channel_is_estate_disabled"/>
<check_box label="Begræns stemme chat til denne parcel" name="parcel_enable_voice_channel_local"/>
diff --git a/indra/newview/skins/default/xui/de/floater_about_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml
index 0e5d987ef9..8783b52013 100644
--- a/indra/newview/skins/default/xui/de/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_about_land.xml
@@ -392,7 +392,6 @@ Nur große Parzellen können in der Suche aufgeführt werden.
Homepage:
</text>
<button label="Festlegen" name="set_media_url"/>
- <check_box label="URL ausblenden" name="hide_media_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Medien-URL sehen können. Diese Option ist für HTML-Medien nicht verfügbar."/>
<text name="Description:">
Inhalt:
</text>
@@ -422,7 +421,6 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<text name="MusicURL:">
Musik-URL:
</text>
- <check_box label="URL ausblenden" name="hide_music_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Musik-URL sehen können"/>
<text name="Sound:">
Sound:
</text>
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index 965ac21110..6e985e0476 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -1649,16 +1649,6 @@ Only large parcels can be listed in search.
name="set_media_url"
width="70"
top_delta="0"/>
- <check_box
- follows="top|left"
- height="16"
- label="Hide URL"
- layout="topleft"
- left="110"
- name="hide_media_url"
- tool_tip="Checking this option will hide the media url to any non-authorized viewers of this parcel information. Note this is not available for HTML types."
- width="50"
- top_pad="5"/>
<text
type="string"
length="1"
@@ -1836,15 +1826,6 @@ Only large parcels can be listed in search.
top_delta="0"
right="-15"
select_on_focus="true" />
- <check_box
- height="16"
- label="Hide URL"
- layout="topleft"
- name="hide_music_url"
- tool_tip="Checking this option will hide the music url to any non-authorized viewers of this parcel information."
- left_delta="10"
- top_pad="5"
- width="292" />
<text
type="string"
length="1"
diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml
index d9991fcae9..e5ae0b950a 100644
--- a/indra/newview/skins/default/xui/en/main_view.xml
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -80,6 +80,13 @@
user_resize="false"
name="hud container"
width="500">
+ <view top="0"
+ follows="all"
+ height="500"
+ left="0"
+ mouse_opaque="false"
+ name="floater_snap_region"
+ width="500"/>
<panel follows="left|top"
height="19"
left="0"
diff --git a/indra/newview/skins/default/xui/en/menu_bottomtray.xml b/indra/newview/skins/default/xui/en/menu_bottomtray.xml
index 5beafef4e4..1b55fa4fd3 100644
--- a/indra/newview/skins/default/xui/en/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/menu_bottomtray.xml
@@ -9,6 +9,18 @@
visible="false"
width="128">
<menu_item_check
+ label="Voice Enabled"
+ layout="topleft"
+ name="EnableVoiceChat">
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="EnableVoiceChat" />
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="EnableVoiceChat" />
+ </menu_item_check>
+ <menu_item_separator/>
+ <menu_item_check
label="Gesture button"
layout="topleft"
name="ShowGestureButton">
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
index 50ad3f834e..5e7b16ed4a 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
@@ -1,63 +1,249 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<toggleable_menu
- create_jump_keys="true"
- layout="topleft"
- mouse_opaque="false"
- visible="false"
- name="Gear Menu">
+ layout="topleft"
+ name="Self Pie">
<menu_item_call
label="Sit Down"
- enabled="true"
- name="sit_down_here">
+ layout="topleft"
+ name="Sit Down Here">
<menu_item_call.on_click
function="Self.SitDown"
parameter="" />
- <menu_item_call.on_visible
+ <menu_item_call.on_enable
function="Self.EnableSitDown" />
</menu_item_call>
<menu_item_call
label="Stand Up"
- enabled="true"
- name="stand_up">
+ layout="topleft"
+ name="Stand Up">
<menu_item_call.on_click
function="Self.StandUp"
parameter="" />
- <menu_item_call.on_visible
+ <menu_item_call.on_enable
function="Self.EnableStandUp" />
</menu_item_call>
+ <context_menu
+ label="Take Off"
+ layout="topleft"
+ name="Take Off &gt;">
+ <context_menu
+ label="Clothes"
+ layout="topleft"
+ name="Clothes &gt;">
+ <menu_item_call
+ enabled="false"
+ label="Shirt"
+ layout="topleft"
+ name="Shirt">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="shirt" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="shirt" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Pants"
+ layout="topleft"
+ name="Pants">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="pants" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="pants" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Skirt"
+ layout="topleft"
+ name="Skirt">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="skirt" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="skirt" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Shoes"
+ layout="topleft"
+ name="Shoes">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="shoes" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="shoes" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Socks"
+ layout="topleft"
+ name="Socks">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="socks" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="socks" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Jacket"
+ layout="topleft"
+ name="Jacket">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="jacket" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="jacket" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Gloves"
+ layout="topleft"
+ name="Gloves">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="gloves" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="gloves" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Undershirt"
+ layout="topleft"
+ name="Self Undershirt">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="undershirt" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="undershirt" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Underpants"
+ layout="topleft"
+ name="Self Underpants">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="underpants" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="underpants" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Tattoo"
+ layout="topleft"
+ name="Self Tattoo">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="tattoo" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="tattoo" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Alpha"
+ layout="topleft"
+ name="Self Alpha">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="alpha" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="alpha" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="All Clothes"
+ layout="topleft"
+ name="All Clothes">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="all" />
+ </menu_item_call>
+ </context_menu>
+ <context_menu
+ label="HUD"
+ layout="topleft"
+ name="Object Detach HUD" />
+ <context_menu
+ label="Detach"
+ layout="topleft"
+ name="Object Detach" />
+ <menu_item_call
+ label="Detach All"
+ layout="topleft"
+ name="Detach All">
+ <menu_item_call.on_click
+ function="Self.RemoveAllAttachments"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="Self.EnableRemoveAllAttachments" />
+ </menu_item_call>
+ </context_menu>
<menu_item_call
- label="Change Outfit"
- name="change_outfit">
+ label="Change Outfit"
+ layout="topleft"
+ name="Chenge Outfit">
<menu_item_call.on_click
function="CustomizeAvatar" />
<menu_item_call.on_enable
function="Edit.EnableCustomizeAvatar" />
</menu_item_call>
- <menu_item_call
- label="My Profile"
- enabled="true"
- name="my_profile">
+ <menu_item_call label="Edit My Outfit"
+ layout="topleft"
+ name="Edit Outfit">
<menu_item_call.on_click
- function="ShowAgentProfile"
- parameter="agent" />
+ function="EditOutfit" />
+ <menu_item_call.on_enable
+ function="Edit.EnableCustomizeAvatar" />
+ </menu_item_call>
+ <menu_item_call label="Edit My Shape"
+ layout="topleft"
+ name="Edit My Shape">
+ <menu_item_call.on_click
+ function="EditShape" />
+ <menu_item_call.on_enable
+ function="Edit.EnableEditShape" />
</menu_item_call>
<menu_item_call
- label="My Friends"
- name="my_friends">
+ label="My Friends"
+ layout="topleft"
+ name="Friends...">
<menu_item_call.on_click
- function="SideTray.PanelPeopleTab"
- parameter="friends_panel" />
+ function="SideTray.PanelPeopleTab"
+ parameter="friends_panel" />
</menu_item_call>
<menu_item_call
label="My Groups"
- name="my_groups">
+ layout="topleft"
+ name="Groups...">
<menu_item_call.on_click
function="SideTray.PanelPeopleTab"
parameter="groups_panel" />
</menu_item_call>
<menu_item_call
- label="Debug Textures"
- name="Debug...">
+ label="My Profile"
+ layout="topleft"
+ name="Profile...">
+ <menu_item_call.on_click
+ function="ShowAgentProfile"
+ parameter="agent" />
+ </menu_item_call>
+ <menu_item_call
+ label="Debug Textures"
+ name="Debug...">
<menu_item_call.on_click
function="Avatar.Debug" />
<menu_item_call.on_visible
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index f008042a81..6ecaef1bf3 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -104,6 +104,7 @@
Your version of [APP_NAME] does not know how to display the notification it just received. Please verify that you have the latest Viewer installed.
Error details: The notification called &apos;[_NAME]&apos; was not found in notifications.xml.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -116,6 +117,7 @@ Error details: The notification called &apos;[_NAME]&apos; was not found in noti
Floater error: Could not find the following controls:
[CONTROLS]
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -126,6 +128,7 @@ Floater error: Could not find the following controls:
name="TutorialNotFound"
type="alertmodal">
No tutorial is currently available.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -154,6 +157,7 @@ No tutorial is currently available.
name="BadInstallation"
type="alertmodal">
An error occurred while updating [APP_NAME]. Please [http://get.secondlife.com download the latest version] of the Viewer.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -163,8 +167,9 @@ No tutorial is currently available.
icon="alertmodal.tga"
name="LoginFailedNoNetwork"
type="alertmodal">
-Could not connect to the [SECOND_LIFE_GRID].
-&apos;[DIAGNOSTIC]&apos;
+ <tag>fail</tag>
+ Could not connect to the [SECOND_LIFE_GRID].
+ &apos;[DIAGNOSTIC]&apos;
Make sure your Internet connection is working properly.
<usetemplate
name="okbutton"
@@ -176,6 +181,7 @@ Make sure your Internet connection is working properly.
name="MessageTemplateNotFound"
type="alertmodal">
Message Template [PATH] not found.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -198,6 +204,7 @@ Save changes to current clothing/body part?
name="CompileQueueSaveText"
type="alertmodal">
There was a problem uploading the text for a script due to the following reason: [REASON]. Please try again later.
+ <tag>fail</tag>
</notification>
<notification
@@ -205,6 +212,7 @@ There was a problem uploading the text for a script due to the following reason:
name="CompileQueueSaveBytecode"
type="alertmodal">
There was a problem uploading the compiled script due to the following reason: [REASON]. Please try again later.
+ <tag>fail</tag>
</notification>
<notification
@@ -212,6 +220,7 @@ There was a problem uploading the compiled script due to the following reason: [
name="WriteAnimationFail"
type="alertmodal">
There was a problem writing animation data. Please try again later.
+ <tag>fail</tag>
</notification>
<notification
@@ -219,6 +228,7 @@ There was a problem writing animation data. Please try again later.
name="UploadAuctionSnapshotFail"
type="alertmodal">
There was a problem uploading the auction snapshot due to the following reason: [REASON]
+ <tag>fail</tag>
</notification>
<notification
@@ -227,6 +237,7 @@ There was a problem uploading the auction snapshot due to the following reason:
type="alertmodal">
Unable to view the contents of more than one item at a time.
Please select only one object and try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -234,7 +245,8 @@ Please select only one object and try again.
name="SaveClothingBodyChanges"
type="alertmodal">
Save all changes to clothing/body parts?
- <usetemplate
+<tag>confirm</tag>
+<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
notext="Don&apos;t Save"
@@ -267,6 +279,7 @@ Save all changes to clothing/body parts?
type="alertmodal">
Granting modify rights to another Resident allows them to change, delete or take ANY objects you may have in-world. Be VERY careful when handing out this permission.
Do you want to grant modify rights for [NAME]?
+<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="No"
@@ -279,6 +292,7 @@ Do you want to grant modify rights for [NAME]?
type="alertmodal">
Granting modify rights to another Resident allows them to change ANY objects you may have in-world. Be VERY careful when handing out this permission.
Do you want to grant modify rights for the selected Residents?
+<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="No"
@@ -290,6 +304,7 @@ Do you want to grant modify rights for the selected Residents?
name="RevokeModifyRights"
type="alertmodal">
Do you want to revoke modify rights for [NAME]?
+<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="No"
@@ -301,6 +316,7 @@ Do you want to revoke modify rights for [NAME]?
name="RevokeModifyRightsMultiple"
type="alertmodal">
Do you want to revoke modify rights for the selected Residents?
+<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="No"
@@ -313,7 +329,9 @@ Do you want to revoke modify rights for the selected Residents?
type="alertmodal">
Unable to create group.
[MESSAGE]
- <usetemplate
+ <tag>group</tag>
+ <tag>fail</tag>
+ <usetemplate
name="okbutton"
yestext="OK"/>
</notification>
@@ -324,7 +342,9 @@ Unable to create group.
type="alertmodal">
[NEEDS_APPLY_MESSAGE]
[WANT_APPLY_MESSAGE]
- <usetemplate
+ <tag>confirm</tag>
+ <tag>group</tag>
+ <usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
notext="Ignore Changes"
@@ -336,7 +356,9 @@ Unable to create group.
name="MustSpecifyGroupNoticeSubject"
type="alertmodal">
You must specify a subject to send a group notice.
- <usetemplate
+ <tag>group</tag>
+ <tag>fail</tag>
+ <usetemplate
name="okbutton"
yestext="OK"/>
</notification>
@@ -349,6 +371,8 @@ You are about to add group members to the role of [ROLE_NAME].
Members cannot be removed from that role.
The members must resign from the role themselves.
Are you sure you want to continue?
+ <tag>group</tag>
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I add a new group Owner"
name="okcancelignore"
@@ -394,6 +418,7 @@ Add this Ability to &apos;[ROLE_NAME]&apos;?
type="alertmodal">
You are about to drop your attachment.
Are you sure you want to continue?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm before dropping attachments"
name="okcancelignore"
@@ -406,6 +431,9 @@ Add this Ability to &apos;[ROLE_NAME]&apos;?
type="alertmodal">
Joining this group costs L$[COST].
Do you wish to proceed?
+ <tag>confirm</tag>
+ <tag>funds</tag>
+ <tag>group</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -418,6 +446,8 @@ Do you wish to proceed?
type="alertmodal">
You are joining group [NAME].
Do you wish to proceed?
+ <tag>group</tag>
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -431,6 +461,9 @@ Do you wish to proceed?
type="alertmodal">
Joining this group costs L$[COST].
You do not have enough L$ to join this group.
+ <tag>group</tag>
+ <tag>fail</tag>
+ <tag>funds</tag>
</notification>
<notification
@@ -440,6 +473,8 @@ You do not have enough L$ to join this group.
Creating this group will cost L$100.
Groups need more than one member, or they are deleted forever.
Please invite members within 48 hours.
+ <tag>group</tag>
+ <tag>funds</tag>
<usetemplate
canceltext="Cancel"
name="okcancelbuttons"
@@ -453,6 +488,8 @@ Please invite members within 48 hours.
type="alertmodal">
<tag>fail</tag>
For L$[COST] you can enter this land (&apos;[PARCEL_NAME]&apos;) for [TIME] hours. Buy a pass?
+ <tag>funds</tag>
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -465,6 +502,7 @@ For L$[COST] you can enter this land (&apos;[PARCEL_NAME]&apos;) for [TIME] hour
type="alertmodal">
Sale price must be set to more than L$0 if selling to anyone.
Please select an individual to sell to if selling for L$0.
+ <tag>fail</tag>
</notification>
<notification
@@ -474,6 +512,7 @@ Please select an individual to sell to if selling for L$0.
type="alertmodal">
The selected [LAND_SIZE] m² land is being set for sale.
Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME].
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -488,6 +527,7 @@ ATTENTION: Clicking &apos;sell to anyone&apos; makes your land available to the
The selected [LAND_SIZE] m² land is being set for sale.
Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME].
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -503,6 +543,8 @@ Are you sure you want to return all objects shared with the group &apos;[NAME]&a
*WARNING* This will delete the non-transferable objects deeded to the group!
Objects: [N]
+ <tag>confirm</tag>
+ <tag>group</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -516,6 +558,7 @@ Objects: [N]
Are you sure you want to return all objects owned by the Resident &apos;[NAME]&apos; on this parcel of land back to their inventory?
Objects: [N]
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -529,6 +572,7 @@ Objects: [N]
Are you sure you want to return all objects owned by you on this parcel of land back to your inventory?
Objects: [N]
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -545,6 +589,7 @@ Transferable objects deeded to a group will be returned to their previous owners
*WARNING* This will delete the non-transferable objects deeded to the group!
Objects: [N]
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -561,6 +606,7 @@ Transferable objects deeded to a group will be returned to their previous owners
*WARNING* This will delete the non-transferable objects deeded to the group!
Objects: [N]
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -572,6 +618,7 @@ Objects: [N]
name="ReturnAllTopObjects"
type="alertmodal">
Are you sure you want to return all listed objects back to their owner&apos;s inventory?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -583,6 +630,7 @@ Are you sure you want to return all listed objects back to their owner&apos;s in
name="DisableAllTopObjects"
type="alertmodal">
Are you sure you want to disable all objects in this region?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -596,6 +644,8 @@ Are you sure you want to disable all objects in this region?
Return the objects on this parcel of land that are NOT shared with the group [NAME] back to their owners?
Objects: [N]
+ <tag>confirm</tag>
+ <tag>group</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -609,6 +659,7 @@ Objects: [N]
Can not disable scripts.
This entire region is damage enabled.
Scripts must be allowed to run for weapons to work.
+ <tag>fail</tag>
</notification>
<notification
@@ -618,6 +669,7 @@ Scripts must be allowed to run for weapons to work.
Multiple faces are currently selected.
If you continue this action, separate instances of media will be set on multiple faces of the object.
To place the media on only one face, choose Select Face and click on the desired face of that object then click Add.
+ <tag>confirm</tag>
<usetemplate
ignoretext="Media will be set on multiple selected faces"
name="okcancelignore"
@@ -630,6 +682,7 @@ To place the media on only one face, choose Select Face and click on the desired
name="MustBeInParcel"
type="alertmodal">
You must be standing inside the land parcel to set its Landing Point.
+ <tag>fail</tag>
</notification>
<notification
@@ -637,6 +690,7 @@ You must be standing inside the land parcel to set its Landing Point.
name="PromptRecipientEmail"
type="alertmodal">
Please enter a valid email address for the recipient(s).
+ <tag>fail</tag>
</notification>
<notification
@@ -644,6 +698,7 @@ Please enter a valid email address for the recipient(s).
name="PromptSelfEmail"
type="alertmodal">
Please enter your email address.
+ <tag>fail</tag>
</notification>
<notification
@@ -651,6 +706,7 @@ Please enter your email address.
name="PromptMissingSubjMsg"
type="alertmodal">
Email snapshot with the default subject or message?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -662,6 +718,7 @@ Email snapshot with the default subject or message?
name="ErrorProcessingSnapshot"
type="alertmodal">
Error processing snapshot data
+ <tag>fail</tag>
</notification>
<notification
@@ -669,6 +726,7 @@ Error processing snapshot data
name="ErrorEncodingSnapshot"
type="alertmodal">
Error encoding snapshot.
+ <tag>fail</tag>
</notification>
<notification
@@ -676,6 +734,7 @@ Error encoding snapshot.
name="ErrorUploadingPostcard"
type="alertmodal">
There was a problem sending a snapshot due to the following reason: [REASON]
+ <tag>fail</tag>
</notification>
<notification
@@ -683,12 +742,14 @@ There was a problem sending a snapshot due to the following reason: [REASON]
name="ErrorUploadingReportScreenshot"
type="alertmodal">
There was a problem uploading a report screenshot due to the following reason: [REASON]
+ <tag>fail</tag>
</notification>
<notification
icon="alertmodal.tga"
name="MustAgreeToLogIn"
type="alertmodal">
+ <tag>fail</tag>
You must agree to the Terms of Service to continue logging into [SECOND_LIFE].
</notification>
@@ -698,6 +759,7 @@ You must agree to the Terms of Service to continue logging into [SECOND_LIFE].
type="alertmodal">
Could not put on outfit.
The outfit folder contains no clothing, body parts, or attachments.
+ <tag>fail</tag>
</notification>
<notification
@@ -705,6 +767,7 @@ The outfit folder contains no clothing, body parts, or attachments.
name="CannotWearTrash"
type="alertmodal">
You can not wear clothes or body parts that are in the trash
+ <tag>fail</tag>
</notification>
<notification
@@ -713,6 +776,7 @@ You can not wear clothes or body parts that are in the trash
type="alertmodal">
Could not attach object.
Exceeds the attachments limit of [MAX_ATTACHMENTS] objects. Please detach another object first.
+ <tag>fail</tag>
</notification>
<notification
@@ -720,16 +784,19 @@ Exceeds the attachments limit of [MAX_ATTACHMENTS] objects. Please detach anothe
name="CannotWearInfoNotComplete"
type="alertmodal">
You can not wear that item because it has not yet loaded. Please try again in a minute.
+ <tag>fail</tag>
</notification>
<notification
icon="alertmodal.tga"
name="MustHaveAccountToLogIn"
type="alertmodal">
+ <tag>fail</tag>
Oops! Something was left blank.
You need to enter the Username name of your avatar.
You need an account to enter [SECOND_LIFE]. Would you like to create one now?
+ <tag>confirm</tag>
<url
option="0"
name="url"
@@ -747,6 +814,7 @@ You need an account to enter [SECOND_LIFE]. Would you like to create one now?
icon="alertmodal.tga"
name="InvalidCredentialFormat"
type="alertmodal">
+ <tag>fail</tag>
You need to enter either the Username or both the First and Last name of your avatar into the Username field, then login again.
</notification>
@@ -759,6 +827,7 @@ Classified ads appear in the &apos;Classified&apos; section of the Search direct
Fill out your ad, then click &apos;Publish...&apos; to add it to the directory.
You&apos;ll be asked for a price to pay when clicking Publish.
Paying more makes your ad appear higher in the list, and also appear higher when people search for keywords.
+ <tag>confirm</tag>
<usetemplate
ignoretext="How to create a new Classified ad"
name="okcancelignore"
@@ -772,6 +841,7 @@ Paying more makes your ad appear higher in the list, and also appear higher when
type="alertmodal">
Delete classified &apos;[NAME]&apos;?
There is no reimbursement for fees paid.
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -785,6 +855,7 @@ There is no reimbursement for fees paid.
type="alertmodal">
You have selected to delete the media associated with this face.
Are you sure you want to continue?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I delete media from an object"
name="okcancelignore"
@@ -797,6 +868,7 @@ Are you sure you want to continue?
name="ClassifiedSave"
type="alertmodal">
Save changes to classified [NAME]?
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -809,6 +881,7 @@ Save changes to classified [NAME]?
name="ClassifiedInsufficientFunds"
type="alertmodal">
Insufficient funds to create classified.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -819,6 +892,7 @@ Insufficient funds to create classified.
name="DeleteAvatarPick"
type="alertmodal">
Delete pick &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -830,6 +904,7 @@ Delete pick &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
name="DeleteOutfits"
type="alertmodal">
Delete the selected outfit?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -841,6 +916,7 @@ Delete pick &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
name="PromptGoToEventsPage"
type="alertmodal">
Go to the [SECOND_LIFE] events web page?
+ <tag>confirm</tag>
<url option="0" name="url">
http://secondlife.com/events/
@@ -856,6 +932,7 @@ Go to the [SECOND_LIFE] events web page?
name="SelectProposalToView"
type="alertmodal">
Please select a proposal to view.
+ <tag>fail</tag>
</notification>
<notification
@@ -863,6 +940,7 @@ Please select a proposal to view.
name="SelectHistoryItemToView"
type="alertmodal">
Please select a history item to view.
+ <tag>fail</tag>
</notification>
<!--
@@ -929,9 +1007,9 @@ Changing language will take effect after you restart [APP_NAME].
icon="alertmodal.tga"
name="GoToAuctionPage"
type="alertmodal">
-Go to the [SECOND_LIFE] web page to see auction details or make a bid?
+ Go to the [SECOND_LIFE] web page to see auction details or make a bid?
+ <tag>confirm</tag>
<url option="0" name="url">
-
http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]
</url>
<usetemplate
@@ -945,6 +1023,7 @@ Go to the [SECOND_LIFE] web page to see auction details or make a bid?
name="SaveChanges"
type="alertmodal">
Save Changes?
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -959,6 +1038,7 @@ Save Changes?
Gesture save failed.
This gesture has too many steps.
Try removing some steps, then save again.
+<tag>fail</tag>
</notification>
<notification
@@ -966,6 +1046,7 @@ Try removing some steps, then save again.
name="GestureSaveFailedTryAgain"
type="alertmodal">
Gesture save failed. Please try again in a minute.
+<tag>fail</tag>
</notification>
<notification
@@ -974,6 +1055,7 @@ Gesture save failed. Please try again in a minute.
type="alertmodal">
Could not save gesture because the object or the associated object inventory could not be found.
The object may be out of range or may have been deleted.
+<tag>fail</tag>
</notification>
<notification
@@ -981,6 +1063,7 @@ The object may be out of range or may have been deleted.
name="GestureSaveFailedReason"
type="alertmodal">
There was a problem saving a gesture due to the following reason: [REASON]. Please try resaving the gesture later.
+<tag>fail</tag>
</notification>
<notification
@@ -989,6 +1072,7 @@ There was a problem saving a gesture due to the following reason: [REASON]. Ple
type="alertmodal">
Could not save notecard because the object or the associated object inventory could not be found.
The object may be out of range or may have been deleted.
+<tag>fail</tag>
</notification>
<notification
@@ -996,6 +1080,7 @@ The object may be out of range or may have been deleted.
name="SaveNotecardFailReason"
type="alertmodal">
There was a problem saving a notecard due to the following reason: [REASON]. Please try re-saving the notecard later.
+<tag>fail</tag>
</notification>
<notification
@@ -1005,6 +1090,7 @@ There was a problem saving a notecard due to the following reason: [REASON]. Pl
Could not undo all changes in your version of the script.
Would you like to load the server&apos;s last saved version?
(**Warning** This operation cannot be undone.)
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -1016,6 +1102,7 @@ Would you like to load the server&apos;s last saved version?
name="SaveScriptFailReason"
type="alertmodal">
There was a problem saving a script due to the following reason: [REASON]. Please try re-saving the script later.
+<tag>fail</tag>
</notification>
<notification
@@ -1024,6 +1111,7 @@ There was a problem saving a script due to the following reason: [REASON]. Plea
type="alertmodal">
Could not save the script because the object it is in could not be found.
The object may be out of range or may have been deleted.
+<tag>fail</tag>
</notification>
<notification
@@ -1031,6 +1119,7 @@ The object may be out of range or may have been deleted.
name="SaveBytecodeFailReason"
type="alertmodal">
There was a problem saving a compiled script due to the following reason: [REASON]. Please try re-saving the script later.
+<tag>fail</tag>
</notification>
<notification
@@ -1039,6 +1128,7 @@ There was a problem saving a compiled script due to the following reason: [REASO
type="alertmodal">
Oops, Your Start Region is not defined.
Please type the Region name in Start Location box or choose My Last Location or My Home as your Start Location.
+<tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -1050,6 +1140,7 @@ Please type the Region name in Start Location box or choose My Last Location or
type="alertmodal">
Could not start or stop the script because the object it is on could not be found.
The object may be out of range or may have been deleted.
+ <tag>fail</tag>
</notification>
<notification
@@ -1057,6 +1148,7 @@ The object may be out of range or may have been deleted.
name="CannotDownloadFile"
type="alertmodal">
Unable to download file
+ <tag>fail</tag>
</notification>
<notification
@@ -1064,6 +1156,7 @@ Unable to download file
name="CannotWriteFile"
type="alertmodal">
Unable to write file [[FILE]]
+ <tag>fail</tag>
</notification>
<notification
@@ -1073,6 +1166,7 @@ Unable to write file [[FILE]]
Just so you know, your computer does not meet [APP_NAME]&apos;s minimum system requirements. You may experience poor performance. Unfortunately, the [SUPPORT_SITE] can't provide technical support for unsupported system configurations.
Visit [_URL] for more information?
+ <tag>confirm</tag>
<url option="0" name="url">
http://www.secondlife.com/corporate/sysreqs.php
@@ -1082,6 +1176,7 @@ Visit [_URL] for more information?
name="okcancelignore"
notext="No"
yestext="Yes"/>
+ <tag>fail</tag>
</notification>
<notification
@@ -1095,6 +1190,7 @@ This is often the case with new hardware that hasn&apos;t been tested yet with [
<ignore name="ignore"
text="My graphics card could not be identified"/>
</form>
+ <tag>fail</tag>
</notification>
<notification
@@ -1105,6 +1201,7 @@ This is often the case with new hardware that hasn&apos;t been tested yet with [
Graphics Quality will be set to Low to avoid some common driver errors. This will disable some graphics features.
We recommend updating your graphics card drivers.
Graphics Quality can be raised in Preferences &gt; Graphics.
+ <tag>fail</tag>
</notification>
<notification
@@ -1112,6 +1209,7 @@ Graphics Quality can be raised in Preferences &gt; Graphics.
name="RegionNoTerraforming"
type="alertmodal">
The region [REGION] does not allow terraforming.
+ <tag>fail</tag>
</notification>
<notification
@@ -1121,10 +1219,12 @@ The region [REGION] does not allow terraforming.
You do not have permission to copy the following items:
[ITEMS]
and will lose it from your inventory if you give it away. Do you really want to offer these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="No"
yestext="Yes"/>
+ <tag>fail</tag>
</notification>
<notification
@@ -1132,6 +1232,7 @@ and will lose it from your inventory if you give it away. Do you really want to
name="CannotGiveItem"
type="alertmodal">
Unable to give inventory item.
+ <tag>fail</tag>
</notification>
<notification
@@ -1146,6 +1247,7 @@ Transaction cancelled.
name="TooManyItems"
type="alertmodal">
Cannot give more than 42 items in a single inventory transfer.
+ <tag>fail</tag>
</notification>
<notification
@@ -1153,6 +1255,7 @@ Cannot give more than 42 items in a single inventory transfer.
name="NoItems"
type="alertmodal">
You do not have permission to transfer the selected items.
+ <tag>fail</tag>
</notification>
<notification
@@ -1161,6 +1264,8 @@ You do not have permission to transfer the selected items.
type="alertmodal">
You do not have permission to copy [COUNT] of the selected items. You will lose these items from your inventory.
Do you really want to give these items?
+ <tag>confirm</tag>
+ <tag>fail</tag>
<usetemplate
name="okcancelbuttons"
notext="No"
@@ -1172,6 +1277,7 @@ Do you really want to give these items?
name="CannotGiveCategory"
type="alertmodal">
You do not have permission to transfer the selected folder.
+ <tag>fail</tag>
</notification>
<notification
@@ -1180,6 +1286,7 @@ You do not have permission to transfer the selected folder.
type="alertmodal">
Freeze this avatar?
He or she will temporarily be unable to move, chat, or interact with the world.
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -1193,6 +1300,7 @@ He or she will temporarily be unable to move, chat, or interact with the world.
type="alertmodal">
Freeze [AVATAR_NAME]?
He or she will temporarily be unable to move, chat, or interact with the world.
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -1205,6 +1313,7 @@ He or she will temporarily be unable to move, chat, or interact with the world.
name="EjectAvatarFullname"
type="alertmodal">
Eject [AVATAR_NAME] from your land?
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -1217,6 +1326,7 @@ Eject [AVATAR_NAME] from your land?
name="EjectAvatarNoBan"
type="alertmodal">
Eject this avatar from your land?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -1228,6 +1338,7 @@ Eject this avatar from your land?
name="EjectAvatarFullnameNoBan"
type="alertmodal">
Eject [AVATAR_NAME] from your land?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -1240,6 +1351,7 @@ Eject [AVATAR_NAME] from your land?
persist="true"
type="notify">
You ejected [AVATAR_NAME] from group [GROUP_NAME]
+ <tag>group</tag>
</notification>
<notification
@@ -1247,6 +1359,7 @@ You ejected [AVATAR_NAME] from group [GROUP_NAME]
name="AcquireErrorTooManyObjects"
type="alertmodal">
ACQUIRE ERROR: Too many objects selected.
+ <tag>fail</tag>
</notification>
<notification
@@ -1255,6 +1368,7 @@ ACQUIRE ERROR: Too many objects selected.
type="alertmodal">
ACQUIRE ERROR: Objects span more than one region.
Please move all objects to be acquired onto the same region.
+ <tag>fail</tag>
</notification>
<notification
@@ -1264,6 +1378,7 @@ Please move all objects to be acquired onto the same region.
[EXTRA]
Go to [_URL] for information on purchasing L$?
+ <tag>confirm</tag>
<url option="0" name="url">
http://secondlife.com/app/currency/
@@ -1280,6 +1395,7 @@ Go to [_URL] for information on purchasing L$?
type="alertmodal">
Unable to link these [COUNT] objects.
You can link a maximum of [MAX] objects.
+ <tag>fail</tag>
</notification>
<notification
@@ -1287,6 +1403,7 @@ You can link a maximum of [MAX] objects.
name="CannotLinkIncompleteSet"
type="alertmodal">
You can only link complete sets of objects, and must select more than one object.
+ <tag>fail</tag>
</notification>
<notification
@@ -1296,6 +1413,7 @@ You can only link complete sets of objects, and must select more than one object
Unable to link because you don&apos;t have modify permission on all the objects.
Please make sure none are locked, and that you own all of them.
+ <tag>fail</tag>
</notification>
<notification
@@ -1305,6 +1423,7 @@ Please make sure none are locked, and that you own all of them.
Unable to link because not all of the objects have the same owner.
Please make sure you own all of the selected objects.
+ <tag>fail</tag>
</notification>
<notification
@@ -1314,6 +1433,7 @@ Please make sure you own all of the selected objects.
No file extension for the file: &apos;[FILE]&apos;
Please make sure the file has a correct file extension.
+ <tag>fail</tag>
</notification>
<notification
@@ -1325,6 +1445,7 @@ Expected [VALIDS]
<usetemplate
name="okbutton"
yestext="OK"/>
+ <tag>fail</tag>
</notification>
<notification
@@ -1333,6 +1454,7 @@ Expected [VALIDS]
type="alertmodal">
Couldn&apos;t open uploaded sound file for reading:
[FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1341,6 +1463,7 @@ Couldn&apos;t open uploaded sound file for reading:
type="alertmodal">
File does not appear to be a RIFF WAVE file:
[FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1349,6 +1472,7 @@ File does not appear to be a RIFF WAVE file:
type="alertmodal">
File does not appear to be a PCM WAVE audio file:
[FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1357,6 +1481,7 @@ File does not appear to be a PCM WAVE audio file:
type="alertmodal">
File has invalid number of channels (must be mono or stereo):
[FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1365,6 +1490,7 @@ File has invalid number of channels (must be mono or stereo):
type="alertmodal">
File does not appear to be a supported sample rate (must be 44.1k):
[FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1373,6 +1499,7 @@ File does not appear to be a supported sample rate (must be 44.1k):
type="alertmodal">
File does not appear to be a supported word size (must be 8 or 16 bit):
[FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1381,6 +1508,7 @@ File does not appear to be a supported word size (must be 8 or 16 bit):
type="alertmodal">
Could not find &apos;data&apos; chunk in WAV header:
[FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1389,6 +1517,7 @@ Could not find &apos;data&apos; chunk in WAV header:
type="alertmodal">
Wrong chunk size in WAV file:
[FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1397,6 +1526,7 @@ Wrong chunk size in WAV file:
type="alertmodal">
Audio file is too long (10 second maximum):
[FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1406,6 +1536,7 @@ Audio file is too long (10 second maximum):
Problem with file [FILE]:
[ERROR]
+ <tag>fail</tag>
</notification>
<notification
@@ -1413,6 +1544,7 @@ Problem with file [FILE]:
name="CannotOpenTemporarySoundFile"
type="alertmodal">
Couldn&apos;t open temporary compressed sound file for writing: [FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1420,6 +1552,7 @@ Couldn&apos;t open temporary compressed sound file for writing: [FILE]
name="UnknownVorbisEncodeFailure"
type="alertmodal">
Unknown Vorbis encode failure on: [FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1427,6 +1560,7 @@ Unknown Vorbis encode failure on: [FILE]
name="CannotEncodeFile"
type="alertmodal">
Unable to encode file: [FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1435,6 +1569,7 @@ Unable to encode file: [FILE]
type="alertmodal">
We can't fill in your username and password. This may happen when you change network setup
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -1445,6 +1580,7 @@ Unable to encode file: [FILE]
name="CorruptResourceFile"
type="alertmodal">
Corrupt resource file: [FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1452,6 +1588,7 @@ Corrupt resource file: [FILE]
name="UnknownResourceFileVersion"
type="alertmodal">
Unknown Linden resource file version in file: [FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1459,6 +1596,7 @@ Unknown Linden resource file version in file: [FILE]
name="UnableToCreateOutputFile"
type="alertmodal">
Unable to create output file: [FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1466,6 +1604,7 @@ Unable to create output file: [FILE]
name="DoNotSupportBulkAnimationUpload"
type="alertmodal">
[APP_NAME] does not currently support bulk upload of animation files.
+ <tag>fail</tag>
</notification>
<notification
@@ -1474,6 +1613,7 @@ Unable to create output file: [FILE]
type="alertmodal">
Unable to upload [FILE] due to the following reason: [REASON]
Please try again later.
+ <tag>fail</tag>
</notification>
<notification
@@ -1491,6 +1631,7 @@ You already have a landmark for this location.
<usetemplate
name="okbutton"
yestext="OK"/>
+ <tag>fail</tag>
</notification>
<notification
@@ -1498,6 +1639,7 @@ You already have a landmark for this location.
name="CannotCreateLandmarkNotOwner"
type="alertmodal">
You cannot create a landmark here because the owner of the land doesn&apos;t allow it.
+ <tag>fail</tag>
</notification>
<notification
@@ -1506,6 +1648,7 @@ You cannot create a landmark here because the owner of the land doesn&apos;t all
type="alertmodal">
Not able to perform &apos;recompilation&apos;.
Select an object with a script.
+ <tag>fail</tag>
</notification>
<notification
@@ -1515,6 +1658,7 @@ Select an object with a script.
Not able to perform &apos;recompilation&apos;.
Select objects with scripts that you have permission to modify.
+ <tag>fail</tag>
</notification>
<notification
@@ -1524,6 +1668,7 @@ Select objects with scripts that you have permission to modify.
Not able to perform &apos;reset&apos;.
Select objects with scripts.
+ <tag>fail</tag>
</notification>
<notification
@@ -1533,6 +1678,7 @@ Select objects with scripts.
Not able to perform &apos;reset&apos;.
Select objects with scripts that you have permission to modify.
+ <tag>fail</tag>
</notification>
<notification
@@ -1540,6 +1686,7 @@ Select objects with scripts that you have permission to modify.
name="CannotOpenScriptObjectNoMod"
type="alertmodal">
Unable to open script in object without modify permissions.
+ <tag>fail</tag>
</notification>
<notification
@@ -1549,6 +1696,7 @@ Select objects with scripts that you have permission to modify.
Not able to set any scripts to &apos;running&apos;.
Select objects with scripts.
+ <tag>fail</tag>
</notification>
<notification
@@ -1558,6 +1706,7 @@ Select objects with scripts.
Unable to set any scripts to &apos;not running&apos;.
Select objects with scripts.
+ <tag>fail</tag>
</notification>
<notification
@@ -1565,6 +1714,7 @@ Select objects with scripts.
name="NoFrontmostFloater"
type="alertmodal">
No frontmost floater to save.
+ <tag>fail</tag>
</notification>
<notification
@@ -1581,6 +1731,7 @@ Searched for: [FINALQUERY]
name="SeachFilteredOnShortWordsEmpty"
type="alertmodal">
Your search terms were too short so no search was performed.
+ <tag>fail</tag>
</notification>
<!-- Generic Teleport failure modes - strings will be inserted from
@@ -1591,6 +1742,7 @@ Your search terms were too short so no search was performed.
type="alertmodal">
Teleport failed.
[REASON]
+ <tag>fail</tag>
</notification>
<!-- Teleport failure modes not delivered via the generic mechanism
@@ -1603,6 +1755,7 @@ Teleport failed.
type="alertmodal">
Problem encountered processing your teleport request. You may need to log back in before you can teleport.
If you continue to get this message, please check the [SUPPORT_SITE].
+ <tag>fail</tag>
</notification>
<notification
icon="alertmodal.tga"
@@ -1610,19 +1763,21 @@ If you continue to get this message, please check the [SUPPORT_SITE].
type="alertmodal">
Problem encountered processing your region crossing. You may need to log back in before you can cross regions.
If you continue to get this message, please check the [SUPPORT_SITE].
+ <tag>fail</tag>
</notification>
<notification
icon="alertmodal.tga"
name="blocked_tport"
type="alertmodal">
- <tag>fail</tag>
Sorry, teleport is currently blocked. Try again in a moment. If you still cannot teleport, please log out and log back in to resolve the problem.
+ <tag>fail</tag>
</notification>
<notification
icon="alertmodal.tga"
name="nolandmark_tport"
type="alertmodal">
Sorry, but system was unable to locate landmark destination.
+ <tag>fail</tag>
</notification>
<notification
icon="alertmodal.tga"
@@ -1678,6 +1833,7 @@ Unable to find teleport destination. The destination may be temporarily unavaila
name="no_inventory_host"
type="alertmodal">
The inventory system is currently unavailable.
+ <tag>fail</tag>
</notification>
<notification
@@ -1686,6 +1842,7 @@ The inventory system is currently unavailable.
type="alertmodal">
Unable to set land owner:
No parcel selected.
+ <tag>fail</tag>
</notification>
<notification
@@ -1693,6 +1850,7 @@ No parcel selected.
name="CannotSetLandOwnerMultipleRegions"
type="alertmodal">
Unable to force land ownership because selection spans multiple regions. Please select a smaller area and try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -1701,6 +1859,7 @@ Unable to force land ownership because selection spans multiple regions. Please
type="alertmodal">
This parcel is up for auction. Forcing ownership will cancel the auction and potentially make some Residents unhappy if bidding has begun.
Force ownership?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -1713,6 +1872,7 @@ Force ownership?
type="alertmodal">
Unable to contentify:
No parcel selected.
+ <tag>fail</tag>
</notification>
<notification
@@ -1721,6 +1881,7 @@ No parcel selected.
type="alertmodal">
Unable to contentify:
No region selected.
+ <tag>fail</tag>
</notification>
<notification
@@ -1729,6 +1890,7 @@ No region selected.
type="alertmodal">
Unable to abandon land:
No parcel selected.
+ <tag>fail</tag>
</notification>
<notification
@@ -1737,6 +1899,7 @@ No parcel selected.
type="alertmodal">
Unable to abandon land:
Cannot find region.
+ <tag>fail</tag>
</notification>
<notification
@@ -1745,6 +1908,7 @@ Cannot find region.
type="alertmodal">
Unable to buy land:
No parcel selected.
+ <tag>fail</tag>
</notification>
<notification
@@ -1753,6 +1917,7 @@ No parcel selected.
type="alertmodal">
Unable to buy land:
Cannot find the region this land is in.
+ <tag>fail</tag>
</notification>
<notification
@@ -1760,6 +1925,7 @@ Cannot find the region this land is in.
name="CannotCloseFloaterBuyLand"
type="alertmodal">
You cannot close the Buy Land window until [APP_NAME] estimates the price of this transaction.
+ <tag>fail</tag>
</notification>
<notification
@@ -1768,6 +1934,7 @@ You cannot close the Buy Land window until [APP_NAME] estimates the price of thi
type="alertmodal">
Unable to deed land:
No parcel selected.
+ <tag>fail</tag>
</notification>
<notification
@@ -1776,6 +1943,8 @@ No parcel selected.
type="alertmodal">
Unable to deed land:
No Group selected.
+ <tag>group</tag>
+ <tag>fail</tag>
</notification>
<notification
@@ -1784,6 +1953,7 @@ No Group selected.
type="alertmodal">
Unable to deed land:
Cannot find the region this land is in.
+ <tag>fail</tag>
</notification>
<notification
@@ -1794,6 +1964,7 @@ Unable to deed land:
Multiple parcels selected.
Try selecting a single parcel.
+ <tag>fail</tag>
</notification>
<notification
@@ -1804,6 +1975,7 @@ Unable to deed land:
Waiting for server to report ownership.
Please try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -1812,6 +1984,7 @@ Please try again.
type="alertmodal">
Unable to deed land:
The region [REGION] does not allow transfer of land.
+ <tag>fail</tag>
</notification>
<notification
@@ -1822,6 +1995,7 @@ Unable to abandon land:
Waiting for server to update parcel information.
Try again in a few seconds.
+ <tag>fail</tag>
</notification>
<notification
@@ -1832,6 +2006,7 @@ Unable to abandon land:
You do not own all the parcels selected.
Please select a single parcel.
+ <tag>fail</tag>
</notification>
<notification
@@ -1841,6 +2016,7 @@ Please select a single parcel.
Unable to abandon land:
You don&apos;t have permission to release this parcel.
Parcels you own appear in green.
+ <tag>fail</tag>
</notification>
<notification
@@ -1849,6 +2025,7 @@ Parcels you own appear in green.
type="alertmodal">
Unable to abandon land:
Cannot find the region this land is in.
+ <tag>fail</tag>
</notification>
<notification
@@ -1857,6 +2034,7 @@ Cannot find the region this land is in.
type="alertmodal">
Unable to abandon land:
The region [REGION] does not allow transfer of land.
+ <tag>fail</tag>
</notification>
<notification
@@ -1867,6 +2045,7 @@ Unable to abandon land:
You must select an entire parcel to release it.
Select an entire parcel, or divide your parcel first.
+ <tag>fail</tag>
</notification>
<notification
@@ -1877,6 +2056,7 @@ You are about to release [AREA] m² of land.
Releasing this parcel will remove it from your land holdings, but will not grant any L$.
Release this land?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -1890,6 +2070,7 @@ Release this land?
Unable to divide land:
No parcels selected.
+ <tag>fail</tag>
</notification>
<notification
@@ -1900,6 +2081,7 @@ Unable to divide land:
You have an entire parcel selected.
Try selecting a part of the parcel.
+ <tag>fail</tag>
</notification>
<notification
@@ -1909,6 +2091,7 @@ Try selecting a part of the parcel.
Dividing this land will split this parcel into two and each parcel can have its own settings. Some settings will be reset to defaults after the operation.
Divide land?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -1921,6 +2104,7 @@ Divide land?
type="alertmodal">
Unable to divide land:
Cannot find the region this land is in.
+ <tag>fail</tag>
</notification>
<notification
@@ -1929,6 +2113,7 @@ Cannot find the region this land is in.
type="alertmodal">
Unable to join land:
Cannot find the region this land is in.
+ <tag>fail</tag>
</notification>
<notification
@@ -1937,6 +2122,7 @@ Cannot find the region this land is in.
type="alertmodal">
Unable to join land:
No parcels selected.
+ <tag>fail</tag>
</notification>
<notification
@@ -1947,6 +2133,7 @@ Unable to join land:
You only have one parcel selected.
Select land across both parcels.
+ <tag>fail</tag>
</notification>
<notification
@@ -1957,6 +2144,7 @@ Unable to join land:
You must select more than one parcel.
Select land across both parcels.
+ <tag>fail</tag>
</notification>
<notification
@@ -1967,6 +2155,7 @@ Joining this land will create one large parcel out of all parcels intersecting t
You will need to reset the name and options of the new parcel.
Join land?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -1978,6 +2167,7 @@ Join land?
name="ConfirmNotecardSave"
type="alertmodal">
This notecard needs to be saved before the item can be copied or viewed. Save notecard?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -1989,6 +2179,7 @@ This notecard needs to be saved before the item can be copied or viewed. Save no
name="ConfirmItemCopy"
type="alertmodal">
Copy this item to your inventory?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2000,6 +2191,7 @@ Copy this item to your inventory?
name="ResolutionSwitchFail"
type="alertmodal">
Failed to switch resolution to [RESX] by [RESY]
+ <tag>fail</tag>
</notification>
<notification
@@ -2007,6 +2199,7 @@ Failed to switch resolution to [RESX] by [RESY]
name="ErrorUndefinedGrasses"
type="alertmodal">
Error: Undefined grasses: [SPECIES]
+ <tag>fail</tag>
</notification>
<notification
@@ -2014,6 +2207,7 @@ Error: Undefined grasses: [SPECIES]
name="ErrorUndefinedTrees"
type="alertmodal">
Error: Undefined trees: [SPECIES]
+ <tag>fail</tag>
</notification>
<notification
@@ -2021,6 +2215,7 @@ Error: Undefined trees: [SPECIES]
name="CannotSaveWearableOutOfSpace"
type="alertmodal">
Unable to save &apos;[NAME]&apos; to wearable file. You will need to free up some space on your computer and save the wearable again.
+ <tag>fail</tag>
</notification>
<notification
@@ -2029,6 +2224,7 @@ Unable to save &apos;[NAME]&apos; to wearable file. You will need to free up so
type="alertmodal">
Unable to save [NAME] to central asset store.
This is usually a temporary failure. Please customize and save the wearable again in a few minutes.
+ <tag>fail</tag>
</notification>
<notification
@@ -2049,6 +2245,8 @@ Darn. You have been logged out of [SECOND_LIFE]
type="alertmodal">
Unable to buy land for the group:
You do not have permission to buy land for your active group.
+ <tag>group</tag>
+ <tag>fail</tag>
</notification>
<notification
@@ -2056,9 +2254,11 @@ You do not have permission to buy land for your active group.
label="Add Friend"
name="AddFriendWithMessage"
type="alertmodal">
+ <tag>friendship</tag>
Friends can give permissions to track each other on the map and receive online status updates.
Offer friendship to [NAME]?
+ <tag>confirm</tag>
<form name="form">
<input name="message" type="text">
Would you be my friend?
@@ -2082,6 +2282,7 @@ Would you be my friend?
type="alertmodal"
unique="true">
Save what I'm wearing as a new Outfit:
+ <tag>confirm</tag>
<form name="form">
<input name="message" type="text">
[DESC] (new)
@@ -2104,6 +2305,7 @@ Would you be my friend?
name="SaveWearableAs"
type="alertmodal">
Save item to my inventory as:
+ <tag>confirm</tag>
<form name="form">
<input name="message" type="text">
[DESC] (new)
@@ -2127,6 +2329,7 @@ Would you be my friend?
name="RenameOutfit"
type="alertmodal">
New outfit name:
+ <tag>confirm</tag>
<form name="form">
<input name="new_name" type="text" width="300">
[NAME]
@@ -2147,7 +2350,9 @@ Would you be my friend?
icon="alertmodal.tga"
name="RemoveFromFriends"
type="alertmodal">
+ <tag>friendship</tag>
Do you want to remove [NAME] from your Friends List?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2158,7 +2363,9 @@ Do you want to remove [NAME] from your Friends List?
icon="alertmodal.tga"
name="RemoveMultipleFromFriends"
type="alertmodal">
+ <tag>friendship</tag>
Do you want to remove multiple friends from your Friends list?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2172,6 +2379,7 @@ Do you want to remove multiple friends from your Friends list?
Are you sure you want to delete all scripted objects owned by
** [AVATAR_NAME] **
on all others land in this sim?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2185,6 +2393,7 @@ on all others land in this sim?
Are you sure you want to DELETE ALL scripted objects owned by
** [AVATAR_NAME] **
on ALL LAND in this sim?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2198,6 +2407,7 @@ on ALL LAND in this sim?
Are you sure you want to DELETE ALL objects (scripted or not) owned by
** [AVATAR_NAME] **
on ALL LAND in this sim?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2209,6 +2419,7 @@ on ALL LAND in this sim?
name="BlankClassifiedName"
type="alertmodal">
You must specify a name for your classified.
+ <tag>fail</tag>
</notification>
<notification
@@ -2218,6 +2429,7 @@ You must specify a name for your classified.
Price to pay for listing must be at least L$[MIN_PRICE].
Please enter a higher price.
+ <tag>fail</tag>
</notification>
<notification
@@ -2227,6 +2439,7 @@ Please enter a higher price.
At least one of the items you has link items that point to it. If you delete this item, its links will permanently stop working. It is strongly advised to delete the links first.
Are you sure you want to delete these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2240,6 +2453,7 @@ Are you sure you want to delete these items?
At least one of the items you have selected is locked.
Are you sure you want to delete these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2253,6 +2467,7 @@ Are you sure you want to delete these items?
At least one of the items you have selected is not copyable.
Are you sure you want to delete these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2266,6 +2481,7 @@ Are you sure you want to delete these items?
You do not own least one of the items you have selected.
Are you sure you want to delete these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2280,6 +2496,7 @@ At least one object is locked.
At least one object is not copyable.
Are you sure you want to delete these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2294,6 +2511,7 @@ At least one object is locked.
You do not own least one object.
Are you sure you want to delete these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2308,6 +2526,7 @@ At least one object is not copyable.
You do not own least one object.
Are you sure you want to delete these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2323,6 +2542,7 @@ At least one object is not copyable.
You do not own least one object.
Are you sure you want to delete these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="cancel"
@@ -2336,6 +2556,7 @@ Are you sure you want to delete these items?
At least one object is locked.
Are you sure you want to take these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2350,6 +2571,7 @@ You do not own all of the objects you are taking.
If you continue, next owner permissions will be applied and possibly restrict your ability to modify or copy them.
Are you sure you want to take these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2366,6 +2588,7 @@ If you continue, next owner permissions will be applied and possibly restrict yo
However, you can take the current selection.
Are you sure you want to take these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2379,6 +2602,7 @@ Are you sure you want to take these items?
Unable to buy land because selection spans multiple regions.
Please select a smaller area and try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -2389,6 +2613,8 @@ By deeding this parcel, the group will be required to have and maintain sufficie
The purchase price of the land is not refunded to the owner. If a deeded parcel is sold, the sale price will be divided evenly among group members.
Deed this [AREA] m² of land to the group &apos;[GROUP_NAME]&apos;?
+ <tag>group</tag>
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2404,6 +2630,8 @@ The deed will include a simultaneous land contribution to the group from &apos;[
The purchase price of the land is not refunded to the owner. If a deeded parcel is sold, the sale price will be divided evenly among group members.
Deed this [AREA] m² of land to the group &apos;[GROUP_NAME]&apos;?
+ <tag>group</tag>
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2429,6 +2657,7 @@ Display settings have been set to recommended levels based on your system config
name="ErrorMessage"
type="alertmodal">
[ERROR_MESSAGE]
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -2484,6 +2713,7 @@ You can use [SECOND_LIFE] normally and other people will see you correctly.
If this is your first time using [SECOND_LIFE], you will need to create an account before you can log in.
Return to [http://join.secondlife.com secondlife.com] to create a new account?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Continue"
@@ -2537,6 +2767,7 @@ Please choose the male or female avatar. You can change your mind later.
name="CantTeleportToGrid"
type="alertmodal">
Could not teleport to [SLURL] as it's on a different grid ([GRID]) than the current grid ([CURRENT_GRID]). Please close your viewer and try again.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -2557,6 +2788,7 @@ SHA1 Fingerprint: [MD5_DIGEST]
Key Usage: [KEYUSAGE]
Extended Key Usage: [EXTENDEDKEYUSAGE]
Subject Key Identifier: [SUBJECTKEYIDENTIFIER]
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -2579,6 +2811,7 @@ Extended Key Usage: [EXTENDEDKEYUSAGE]
Subject Key Identifier: [SUBJECTKEYIDENTIFIER]
Would you like to trust this authority?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2590,6 +2823,8 @@ Would you like to trust this authority?
name="NotEnoughCurrency"
type="alertmodal">
[NAME] L$ [PRICE] You don&apos;t have enough L$ to do that.
+ <tag>fail</tag>
+ <tag>funds</tag>
</notification>
<notification
@@ -2626,6 +2861,7 @@ This is really only useful for debugging.
name="BuyOneObjectOnly"
type="alertmodal">
Unable to buy more than one object at a time. Please select only one object and try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -2634,6 +2870,7 @@ Unable to buy more than one object at a time. Please select only one object and
type="alertmodal">
Unable to copy the contents of more than one item at a time.
Please select only one object and try again.
+ <tag>fail</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2645,6 +2882,7 @@ Please select only one object and try again.
name="KickUsersFromRegion"
type="alertmodal">
Teleport all Residents in this region home?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2656,6 +2894,7 @@ Teleport all Residents in this region home?
name="EstateObjectReturn"
type="alertmodal">
Are you sure you want to return objects owned by [USER_NAME]?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2670,6 +2909,7 @@ Couldn&apos;t set region textures:
Terrain texture [TEXTURE_NUM] has an invalid bit depth of [TEXTURE_BIT_DEPTH].
Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image then click &quot;Apply&quot; again.
+ <tag>fail</tag>
</notification>
<notification
@@ -2694,6 +2934,7 @@ Upload started. It may take up to two minutes, depending on your connection spee
name="ConfirmBakeTerrain"
type="alertmodal">
Do you really want to bake the current terrain, make it the center for terrain raise/lower limits and the default for the &apos;Revert&apos; tool?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2727,6 +2968,7 @@ Exceeds the [MAX_AGENTS] [LIST_TYPE] limit by [NUM_EXCESS].
name="MaxAllowedGroupsOnRegion"
type="alertmodal">
You can only have [MAX_GROUPS] Allowed Groups.
+ <tag>group</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2784,6 +3026,7 @@ Finished download of raw terrain file to:
A new version of [APP_NAME] is available.
[MESSAGE]
You must download this update to use [APP_NAME].
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Quit"
@@ -2797,6 +3040,7 @@ You must download this update to use [APP_NAME].
An updated version of [APP_NAME] is available.
[MESSAGE]
This update is not required, but we suggest you install it to improve performance and stability.
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Continue"
@@ -2810,6 +3054,7 @@ This update is not required, but we suggest you install it to improve performanc
An updated version of [APP_NAME] is available.
[MESSAGE]
This update is not required, but we suggest you install it to improve performance and stability.
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Continue"
@@ -2823,6 +3068,7 @@ This update is not required, but we suggest you install it to improve performanc
A new version of [APP_NAME] is available.
[MESSAGE]
You must download this update to use [APP_NAME].
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Quit"
@@ -2836,6 +3082,7 @@ You must download this update to use [APP_NAME].
An updated version of [APP_NAME] is available.
[MESSAGE]
This update is not required, but we suggest you install it to improve performance and stability.
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Continue"
@@ -2849,6 +3096,7 @@ This update is not required, but we suggest you install it to improve performanc
An updated version of [APP_NAME] is available.
[MESSAGE]
This update is not required, but we suggest you install it to improve performance and stability.
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Continue"
@@ -2864,6 +3112,7 @@ A new version of [APP_NAME] is available.
You must download this update to use [APP_NAME].
Download to your Applications folder?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Quit"
@@ -2879,6 +3128,7 @@ An updated version of [APP_NAME] is available.
This update is not required, but we suggest you install it to improve performance and stability.
Download to your Applications folder?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Continue"
@@ -2894,6 +3144,7 @@ An updated version of [APP_NAME] is available.
This update is not required, but we suggest you install it to improve performance and stability.
Download to your Applications folder?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Continue"
@@ -2921,6 +3172,7 @@ You will be unable to log in until [APP_NAME] has been updated.
Please download and install the latest viewer from
http://secondlife.com/download.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="Quit"/>
@@ -2934,6 +3186,7 @@ There is a required update for your Second Life Installation.
You may download this update from http://www.secondlife.com/downloads
or you can install it now.
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Quit Second Life"
@@ -2946,6 +3199,7 @@ or you can install it now.
type="notify">
We have downloaded an update to your [APP_NAME] installation.
Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update]
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Later..."
@@ -2958,6 +3212,7 @@ Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update]
type="alertmodal">
We have downloaded an update to your [APP_NAME] installation.
Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update]
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Later..."
@@ -2972,6 +3227,7 @@ We have downloaded a required software update.
Version [VERSION]
We must restart [APP_NAME] to install the update.
+ <tag>confirm</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -2982,6 +3238,7 @@ We must restart [APP_NAME] to install the update.
name="RequiredUpdateDownloadedDialog"
type="alertmodal">
We must restart [APP_NAME] to install the update.
+ <tag>confirm</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -2993,6 +3250,8 @@ We must restart [APP_NAME] to install the update.
type="alertmodal">
Deeding this object will cause the group to:
* Receive L$ paid into the object
+ <tag>group</tag>
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I deed an object to a group"
name="okcancelignore"
@@ -3005,6 +3264,7 @@ Deeding this object will cause the group to:
name="WebLaunchExternalTarget"
type="alertmodal">
Do you want to open your Web browser to view this content?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Launch my browser to view a web page"
name="okcancelignore"
@@ -3017,6 +3277,7 @@ Do you want to open your Web browser to view this content?
name="WebLaunchJoinNow"
type="alertmodal">
Go to your [http://secondlife.com/account/ Dashboard] to manage your account?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Launch my browser to manage my account"
name="okcancelignore"
@@ -3029,6 +3290,7 @@ Go to your [http://secondlife.com/account/ Dashboard] to manage your account?
name="WebLaunchSecurityIssues"
type="alertmodal">
Visit the [SECOND_LIFE] Wiki for details of how to report a security issue.
+ <tag>confirm</tag>
<usetemplate
ignoretext="Launch my browser to learn how to report a Security Issue"
name="okcancelignore"
@@ -3041,6 +3303,7 @@ Visit the [SECOND_LIFE] Wiki for details of how to report a security issue.
name="WebLaunchQAWiki"
type="alertmodal">
Visit the [SECOND_LIFE] QA Wiki.
+ <tag>confirm</tag>
<usetemplate
ignoretext="Launch my browser to view the QA Wiki"
name="okcancelignore"
@@ -3053,6 +3316,7 @@ Visit the [SECOND_LIFE] QA Wiki.
name="WebLaunchPublicIssue"
type="alertmodal">
Visit the [SECOND_LIFE] Public Issue Tracker, where you can report bugs and other issues.
+ <tag>confirm</tag>
<usetemplate
ignoretext="Launch my browser to use the Public Issue Tracker"
name="okcancelignore"
@@ -3065,6 +3329,7 @@ Visit the [SECOND_LIFE] Public Issue Tracker, where you can report bugs and othe
name="WebLaunchSupportWiki"
type="alertmodal">
Go to the Official Linden Blog, for the latest news and information.
+ <tag>confirm</tag>
<usetemplate
ignoretext="Launch my browser to view the blog"
name="okcancelignore"
@@ -3077,6 +3342,7 @@ Go to the Official Linden Blog, for the latest news and information.
name="WebLaunchLSLGuide"
type="alertmodal">
Do you want to open the Scripting Guide for help with scripting?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Launch my browser to view the Scripting Guide"
name="okcancelignore"
@@ -3089,6 +3355,7 @@ Do you want to open the Scripting Guide for help with scripting?
name="WebLaunchLSLWiki"
type="alertmodal">
Do you want to visit the LSL Portal for help with scripting?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Launch my browser to view the LSL Portal"
name="okcancelignore"
@@ -3103,6 +3370,7 @@ Do you want to visit the LSL Portal for help with scripting?
Are you sure you want to return the selected objects to their owners? Transferable deeded objects will be returned to their previous owners.
*WARNING* No-transfer deeded objects will be deleted!
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I return objects to their owners"
name="okcancelignore"
@@ -3116,6 +3384,8 @@ Are you sure you want to return the selected objects to their owners? Transferab
type="alert">
You are currently a member of the group [GROUP].
Leave Group?
+ <tag>group</tag>
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3127,6 +3397,7 @@ Leave Group?
name="ConfirmKick"
type="alert">
Do you REALLY want to kick all Residents off the grid?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3138,6 +3409,7 @@ Do you REALLY want to kick all Residents off the grid?
name="MuteLinden"
type="alertmodal">
Sorry, you cannot block a Linden.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -3147,7 +3419,8 @@ Sorry, you cannot block a Linden.
icon="alertmodal.tga"
name="CannotStartAuctionAlreadyForSale"
type="alertmodal">
-You cannot start an auction on a parcel which is already set for sale. Disable the land sale if you are sure you want to start an auction.
+ You cannot start an auction on a parcel which is already set for sale. Disable the land sale if you are sure you want to start an auction.
+ <tag>fail</tag>
</notification>
<notification
@@ -3156,6 +3429,7 @@ You cannot start an auction on a parcel which is already set for sale. Disable
name="MuteByNameFailed"
type="alertmodal">
You already have blocked this name.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -3166,6 +3440,7 @@ You already have blocked this name.
name="RemoveItemWarn"
type="alert">
Though permitted, deleting contents may damage the object. Do you want to delete that item?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3177,6 +3452,7 @@ Though permitted, deleting contents may damage the object. Do you want to delete
name="CantOfferCallingCard"
type="alert">
Cannot offer a calling card at this time. Please try again in a moment.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -3186,6 +3462,8 @@ Cannot offer a calling card at this time. Please try again in a moment.
icon="alert.tga"
name="CantOfferFriendship"
type="alert">
+ <tag>friendship</tag>
+ <tag>fail</tag>
Cannot offer friendship at this time. Please try again in a moment.
<usetemplate
name="okbutton"
@@ -3210,6 +3488,8 @@ Chat and instant messages will be hidden. Instant messages will get your Busy mo
type="alert">
You have reached your maximum number of groups. Please leave another group before joining this one, or decline the offer.
[NAME] has invited you to join a group as a member.
+ <tag>group</tag>
+ <tag>fail</tag>
<usetemplate
name="okcancelbuttons"
notext="Decline"
@@ -3221,6 +3501,8 @@ You have reached your maximum number of groups. Please leave another group befor
name="JoinedTooManyGroups"
type="alert">
You have reached your maximum number of groups. Please leave some group before joining or creating a new one.
+ <tag>group</tag>
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -3232,6 +3514,7 @@ You have reached your maximum number of groups. Please leave some group before j
type="alert">
<tag>win</tag>
Kick this Resident with what message?
+ <tag>confirm</tag>
<form name="form">
<input name="message" type="text">
An administrator has logged you off.
@@ -3254,6 +3537,7 @@ An administrator has logged you off.
type="alert">
<tag>win</tag>
Kick everyone currently on the grid with what message?
+ <tag>confirm</tag>
<form name="form">
<input name="message" type="text">
An administrator has logged you off.
@@ -3274,7 +3558,8 @@ An administrator has logged you off.
icon="alert.tga"
name="FreezeUser"
type="alert">
- <tag>win</tag>
+ <tag>win</tag>
+ <tag>confirm</tag>
Freeze this Resident with what message?
<form name="form">
<input name="message" type="text">
@@ -3297,6 +3582,7 @@ You have been frozen. You cannot move or chat. An administrator will contact you
name="UnFreezeUser"
type="alert">
<tag>win</tag>
+ <tag>confirm</tag>
Unfreeze this Resident with what message?
<form name="form">
<input name="message" type="text">
@@ -3328,6 +3614,7 @@ Just like in real life, it takes a while for everyone to learn about a new name.
name="SetDisplayNameBlocked"
type="alert">
Sorry, you cannot change your display name. If you feel this is in error, please contact support.
+ <tag>fail</tag>
</notification>
<notification
@@ -3337,6 +3624,7 @@ Sorry, you cannot change your display name. If you feel this is in error, please
Sorry, that name is too long. Display names can have a maximum of [LENGTH] characters.
Please try a shorter name.
+ <tag>fail</tag>
</notification>
<notification
@@ -3344,6 +3632,7 @@ Please try a shorter name.
name="SetDisplayNameFailedGeneric"
type="alertmodal">
Sorry, we could not set your display name. Please try again later.
+ <tag>fail</tag>
</notification>
<notification
@@ -3351,6 +3640,7 @@ Please try a shorter name.
name="SetDisplayNameMismatch"
type="alertmodal">
The display names you entered do not match. Please re-enter.
+ <tag>fail</tag>
</notification>
<!-- *NOTE: This should never happen -->
@@ -3363,6 +3653,7 @@ Sorry, you have to wait longer before you can change your display name.
See http://wiki.secondlife.com/wiki/Setting_your_display_name
Please try again later.
+ <tag>fail</tag>
</notification>
<notification
@@ -3372,6 +3663,7 @@ Please try again later.
Sorry, we could not set your requested name because it contains a banned word.
Please try a different name.
+ <tag>fail</tag>
</notification>
<notification
@@ -3379,6 +3671,7 @@ Please try again later.
name="AgentDisplayNameSetInvalidUnicode"
type="alertmodal">
The display name you wish to set contains invalid characters.
+ <tag>fail</tag>
</notification>
<notification
@@ -3386,6 +3679,7 @@ Please try again later.
name="AgentDisplayNameSetOnlyPunctuation"
type="alertmodal">
Your display name must contain letters other than punctuation.
+ <tag>fail</tag>
</notification>
@@ -3401,6 +3695,7 @@ Please try again later.
name="OfferTeleport"
type="alertmodal">
Offer a teleport to your location with the following message?
+ <tag>confirm</tag>
<form name="form">
<input name="message" type="text">
Join me in [REGION]
@@ -3422,6 +3717,7 @@ Join me in [REGION]
name="OfferTeleportFromGod"
type="alertmodal">
God summon Resident to your location?
+ <tag>confirm</tag>
<form name="form">
<input name="message" type="text">
Join me in [REGION]
@@ -3443,6 +3739,7 @@ Join me in [REGION]
name="TeleportFromLandmark"
type="alertmodal">
Are you sure you want to teleport to &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm that I want to teleport to a landmark"
name="okcancelignore"
@@ -3454,7 +3751,8 @@ Are you sure you want to teleport to &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
icon="alertmodal.tga"
name="TeleportToPick"
type="alertmodal">
-Teleport to [PICK]?
+ Teleport to [PICK]?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm that I want to teleport to a location in Picks"
name="okcancelignore"
@@ -3467,6 +3765,7 @@ Teleport to [PICK]?
name="TeleportToClassified"
type="alertmodal">
Teleport to [CLASSIFIED]?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm that I want to teleport to a location in Classifieds"
name="okcancelignore"
@@ -3479,6 +3778,7 @@ Teleport to [PICK]?
name="TeleportToHistoryEntry"
type="alertmodal">
Teleport to [HISTORY_ENTRY]?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm that I want to teleport to a history location"
name="okcancelignore"
@@ -3492,6 +3792,7 @@ Teleport to [HISTORY_ENTRY]?
name="MessageEstate"
type="alert">
Type a short announcement which will be sent to everyone currently in your estate.
+ <tag>confirm</tag>
<form name="form">
<input name="message" type="text"/>
<button
@@ -3516,6 +3817,7 @@ You are about to change a Linden owned estate (mainland, teen grid, orientation,
This is EXTREMELY DANGEROUS because it can fundamentally affect the Resident experience. On the mainland, it will change thousands of regions and make the spaceserver hiccup.
Proceed?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3531,6 +3833,7 @@ You are about to change the access list for a Linden owned estate (mainland, tee
This is DANGEROUS and should only be done to invoke the hack allowing objects/L$ to be transfered in/out of a grid.
It will change thousands of regions and make the spaceserver hiccup.
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3543,6 +3846,7 @@ It will change thousands of regions and make the spaceserver hiccup.
name="EstateAllowedAgentAdd"
type="alert">
Add to allowed list for this estate only or for [ALL_ESTATES]?
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3556,6 +3860,7 @@ Add to allowed list for this estate only or for [ALL_ESTATES]?
name="EstateAllowedAgentRemove"
type="alert">
Remove from allowed list for this estate only or for [ALL_ESTATES]?
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3569,6 +3874,8 @@ Remove from allowed list for this estate only or for [ALL_ESTATES]?
name="EstateAllowedGroupAdd"
type="alert">
Add to group allowed list for this estate only or for [ALL_ESTATES]?
+ <tag>group</tag>
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3582,6 +3889,8 @@ Add to group allowed list for this estate only or for [ALL_ESTATES]?
name="EstateAllowedGroupRemove"
type="alert">
Remove from group allowed list for this estate only or [ALL_ESTATES]?
+ <tag>group</tag>
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3595,6 +3904,7 @@ Remove from group allowed list for this estate only or [ALL_ESTATES]?
name="EstateBannedAgentAdd"
type="alert">
Deny access for this estate only or for [ALL_ESTATES]?
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3608,6 +3918,7 @@ Deny access for this estate only or for [ALL_ESTATES]?
name="EstateBannedAgentRemove"
type="alert">
Remove this Resident from the ban list for access for this estate only or for [ALL_ESTATES]?
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3621,6 +3932,7 @@ Remove this Resident from the ban list for access for this estate only or for [
name="EstateManagerAdd"
type="alert">
Add estate manager for this estate only or for [ALL_ESTATES]?
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3634,6 +3946,7 @@ Add estate manager for this estate only or for [ALL_ESTATES]?
name="EstateManagerRemove"
type="alert">
Remove estate manager for this estate only or for [ALL_ESTATES]?
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3647,6 +3960,7 @@ Remove estate manager for this estate only or for [ALL_ESTATES]?
name="EstateKickUser"
type="alert">
Kick [EVIL_USER] from this estate?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3658,6 +3972,7 @@ Kick [EVIL_USER] from this estate?
name="EstateChangeCovenant"
type="alertmodal">
Are you sure you want to change the Estate Covenant?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3682,6 +3997,7 @@ Please verify you have the latest Viewer installed, and go to the Knowledge Base
name="RegionEntryAccessBlocked_KB"
type="alertmodal">
<tag>fail</tag>
+ <tag>confirm</tag>
You are not allowed in that region due to your maturity Rating.
Go to the Knowledge Base for more information about maturity Ratings?
@@ -3708,6 +4024,7 @@ You are not allowed in that region due to your maturity Rating.
name="RegionEntryAccessBlocked_Change"
type="alertmodal">
<tag>fail</tag>
+ <tag>confirm</tag>
You are not allowed in that Region due to your maturity Rating preference.
To enter the desired region, please change your maturity Rating preference. This will allow you to search for and access [REGIONMATURITY] content. To undo any changes, go to Me &gt; Preferences &gt; General.
@@ -3739,6 +4056,7 @@ Your maturity Rating preference is now [RATING].
You cannot claim this land due to your maturity Rating. This may be a result of a lack of information validating your age.
Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -3751,6 +4069,8 @@ Please verify you have the latest Viewer installed, and go to the Knowledge Base
You cannot claim this land due to your maturity Rating.
Go to the Knowledge Base for more information about maturity Ratings?
+ <tag>fail</tag>
+ <tag>confirm</tag>
<url option="0" name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
</url>
@@ -3766,6 +4086,7 @@ Go to the Knowledge Base for more information about maturity Ratings?
name="LandClaimAccessBlocked_Notify"
type="notifytip">
You cannot claim this land due to your maturity Rating.
+ <tag>fail</tag>
</notification>
<notification
@@ -3775,6 +4096,8 @@ You cannot claim this land due to your maturity Rating.
You cannot claim this land due to your maturity Rating preference.
You can click &apos;Change Preference&apos; to raise your maturity Rating preference now and allow you to enter. You will be able to search and access [REGIONMATURITY] content from now on. If you later want to change this setting back, go to Me &gt; Preferences &gt; General.
+ <tag>fail</tag>
+ <tag>confirm</tag>
<usetemplate
name="okcancelignore"
yestext="Change Preference"
@@ -3789,6 +4112,7 @@ You can click &apos;Change Preference&apos; to raise your maturity Rating prefer
You cannot buy this land due to your maturity Rating. This may be a result of a lack of information validating your age.
Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -3801,6 +4125,8 @@ Please verify you have the latest Viewer installed, and go to the Knowledge Base
You cannot buy this land due to your maturity Rating.
Go to the Knowledge Base for more information about maturity Ratings?
+ <tag>confirm</tag>
+ <tag>fail</tag>
<url option="0" name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
</url>
@@ -3816,6 +4142,7 @@ Go to the Knowledge Base for more information about maturity Ratings?
name="LandBuyAccessBlocked_Notify"
type="notifytip">
You cannot buy this land due to your maturity Rating.
+ <tag>fail</tag>
</notification>
<notification
@@ -3825,6 +4152,8 @@ You cannot buy this land due to your maturity Rating.
You cannot buy this land due to your maturity Rating preference.
You can click &apos;Change Preference&apos; to raise your maturity Rating preference now and allow you to enter. You will be able to search and access [REGIONMATURITY] content from now on. If you later want to change this setting back, go to Me &gt; Preferences &gt; General.
+ <tag>confirm</tag>
+ <tag>fail</tag>
<usetemplate
name="okcancelignore"
yestext="Change Preference"
@@ -3837,6 +4166,7 @@ You can click &apos;Change Preference&apos; to raise your maturity Rating prefer
name="TooManyPrimsSelected"
type="alertmodal">
There are too many prims selected. Please select [MAX_PRIM_COUNT] or fewer prims and try again
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -3847,6 +4177,7 @@ There are too many prims selected. Please select [MAX_PRIM_COUNT] or fewer prim
name="ProblemImportingEstateCovenant"
type="alertmodal">
Problem importing estate covenant.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -3857,6 +4188,7 @@ Problem importing estate covenant.
name="ProblemAddingEstateManager"
type="alertmodal">
Problems adding a new estate manager. One or more estates may have a full manager list.
+ <tag>fail</tag>
</notification>
<notification
@@ -3864,6 +4196,7 @@ Problems adding a new estate manager. One or more estates may have a full manag
name="ProblemAddingEstateGeneric"
type="alertmodal">
Problems adding to this estate list. One or more estates may have a full list.
+ <tag>fail</tag>
</notification>
<notification
@@ -3874,6 +4207,7 @@ Unable to load notecard&apos;s asset at this time.
<usetemplate
name="okbutton"
yestext="OK"/>
+ <tag>fail</tag>
</notification>
<notification
@@ -3884,6 +4218,7 @@ Insufficient permissions to view notecard associated with asset ID requested.
<usetemplate
name="okbutton"
yestext="OK"/>
+ <tag>fail</tag>
</notification>
<notification
@@ -3891,6 +4226,7 @@ Insufficient permissions to view notecard associated with asset ID requested.
name="MissingNotecardAssetID"
type="alertmodal">
Asset ID for notecard is missing from database.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -3903,6 +4239,8 @@ Asset ID for notecard is missing from database.
Remember: Classified ad fees are non-refundable.
Publish this classified now for L$[AMOUNT]?
+ <tag>confirm</tag>
+ <tag>funds</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3914,6 +4252,7 @@ Publish this classified now for L$[AMOUNT]?
name="SetClassifiedMature"
type="alertmodal">
Does this classified contain Moderate content?
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3926,6 +4265,8 @@ Does this classified contain Moderate content?
name="SetGroupMature"
type="alertmodal">
Does this group contain Moderate content?
+ <tag>group</tag>
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3939,6 +4280,7 @@ Does this group contain Moderate content?
name="ConfirmRestart"
type="alert">
Do you really want to restart this region in 2 minutes?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3951,6 +4293,7 @@ Do you really want to restart this region in 2 minutes?
name="MessageRegion"
type="alert">
Type a short announcement which will be sent to everyone in this region.
+ <tag>confirm</tag>
<form name="form">
<input name="message" type="text"/>
<button
@@ -3982,6 +4325,8 @@ To enter Adult regions, Residents must be Account Verified, either by age-verifi
name="VoiceVersionMismatch"
type="alertmodal">
This version of [APP_NAME] is not compatible with the Voice Chat feature in this region. In order for Voice Chat to function correctly you will need to update [APP_NAME].
+ <tag>fail</tag>
+ <tag>voice</tag>
</notification>
<notification
@@ -3991,6 +4336,7 @@ This version of [APP_NAME] is not compatible with the Voice Chat feature in this
type="alertmodal">
Cannot buy objects from different owners at the same time.
Please select only one object and try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -4000,6 +4346,7 @@ Please select only one object and try again.
type="alertmodal">
Unable to buy the contents of more than one object at a time.
Please select only one object and try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -4009,6 +4356,7 @@ Please select only one object and try again.
type="alertmodal">
Cannot buy objects from different owners at the same time.
Please select only one object and try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -4021,6 +4369,8 @@ You will be able to:
Modify: [MODIFYPERM]
Copy: [COPYPERM]
Resell or Give Away: [RESELLPERM]
+ <tag>confirm</tag>
+ <tag>funds</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -4037,6 +4387,8 @@ You will be able to:
Modify: [MODIFYPERM]
Copy: [COPYPERM]
Resell or Give Away: [RESELLPERM]
+ <tag>confirm</tag>
+ <tag>funds</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -4053,6 +4405,8 @@ You will be able to:
Modify: [MODIFYPERM]
Copy: [COPYPERM]
Resell or Give Away: [RESELLPERM]
+ <tag>confirm</tag>
+ <tag>funds</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -4069,6 +4423,8 @@ You will be able to:
Modify: [MODIFYPERM]
Copy: [COPYPERM]
Resell or Give Away: [RESELLPERM]
+ <tag>confirm</tag>
+ <tag>funds</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -4081,6 +4437,8 @@ You will be able to:
type="alertmodal">
Buy contents from [OWNER] for L$[PRICE]?
They will be copied to your inventory.
+ <tag>confirm</tag>
+ <tag>funds</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -4093,6 +4451,8 @@ They will be copied to your inventory.
type="alertmodal">
Buy contents for L$[PRICE]?
They will be copied to your inventory.
+ <tag>confirm</tag>
+ <tag>funds</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -4107,6 +4467,8 @@ This transaction will:
[ACTION]
Are you sure you want to proceed with this purchase?
+ <tag>confirm</tag>
+ <tag>funds</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -4122,6 +4484,8 @@ This transaction will:
Are you sure you want to proceed with this purchase?
Please re-enter your password and click OK.
+ <tag>funds</tag>
+ <tag>confirm</tag>
<form name="form">
<input
name="message"
@@ -4157,6 +4521,7 @@ You have selected &apos;no copy&apos; inventory items.
These items will be moved to your inventory, not copied.
Move the inventory item(s)?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Warn me before I move &apos;no-copy&apos; items from an object"
name="okcancelignore"
@@ -4171,7 +4536,8 @@ Move the inventory item(s)?
You have selected &apos;no copy&apos; inventory items. These items will be moved to your inventory, not copied.
Because this object is scripted, moving these items to your inventory may cause the script to malfunction.
-Move the inventory item(s)?
+Move the inventory item(s)?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Warn me before I move &apos;no-copy&apos; items which might break a scripted object"
name="okcancelignore"
@@ -4195,6 +4561,7 @@ Warning: The &apos;Pay object&apos; click action has been set, but it will only
name="OpenObjectCannotCopy"
type="alertmodal">
There are no items in this object that you are allowed to copy.
+ <tag>fail</tag>
</notification>
<notification
@@ -4202,6 +4569,7 @@ There are no items in this object that you are allowed to copy.
name="WebLaunchAccountHistory"
type="alertmodal">
Go to your [http://secondlife.com/account/ Dashboard] to see your account history?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Launch my browser to see my account history"
name="okcancelignore"
@@ -4215,6 +4583,7 @@ Go to your [http://secondlife.com/account/ Dashboard] to see your account histor
type="alertmodal"
unique="true">
Are you sure you want to quit?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I quit"
name="okcancelignore"
@@ -4228,6 +4597,7 @@ Are you sure you want to quit?
type="alertmodal"
unique="true">
[QUESTION]
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm before deleting items"
name="okcancelignore"
@@ -4251,6 +4621,7 @@ All reported abuses are investigated and resolved.
type="alertmodal">
Please select a category for this abuse report.
Selecting a category helps us file and process abuse reports.
+ <tag>fail</tag>
</notification>
<notification
@@ -4259,6 +4630,7 @@ Selecting a category helps us file and process abuse reports.
type="alertmodal">
Please enter the name of the abuser.
Entering an accurate value helps us file and process abuse reports.
+ <tag>fail</tag>
</notification>
<notification
@@ -4267,6 +4639,7 @@ Entering an accurate value helps us file and process abuse reports.
type="alertmodal">
Please enter the location where the abuse took place.
Entering an accurate value helps us file and process abuse reports.
+ <tag>fail</tag>
</notification>
<notification
@@ -4275,6 +4648,7 @@ Entering an accurate value helps us file and process abuse reports.
type="alertmodal">
Please enter a summary of the abuse that took place.
Entering an accurate summary helps us file and process abuse reports.
+ <tag>fail</tag>
</notification>
<notification
@@ -4284,6 +4658,7 @@ Entering an accurate summary helps us file and process abuse reports.
Please enter a detailed description of the abuse that took place.
Be as specific as you can, including names and the details of the incident you are reporting.
Entering an accurate description helps us file and process abuse reports.
+ <tag>fail</tag>
</notification>
<notification
@@ -4311,6 +4686,7 @@ Linden Lab
type="alertmodal">
The following required components are missing from [FLOATER]:
[COMPONENTS]
+ <tag>fail</tag>
</notification>
<notification
@@ -4320,6 +4696,7 @@ The following required components are missing from [FLOATER]:
type="alert">
There is already an object attached to this point on your body.
Do you want to replace it with the selected object?
+ <tag>confirm</tag>
<form name="form">
<ignore name="ignore"
save_option="true"
@@ -4346,6 +4723,7 @@ Do you want to replace it with the selected object?
You are in Busy Mode, which means you will not receive any items offered in exchange for this payment.
Would you like to leave Busy Mode before completing this transaction?
+ <tag>confirm</tag>
<form name="form">
<ignore name="ignore"
save_option="true"
@@ -4369,6 +4747,7 @@ Would you like to leave Busy Mode before completing this transaction?
name="ConfirmDeleteProtectedCategory"
type="alertmodal">
The folder &apos;[FOLDERNAME]&apos; is a system folder. Deleting system folders can cause instability. Are you sure you want to delete it?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I delete a system folder"
name="okcancelignore"
@@ -4381,6 +4760,7 @@ The folder &apos;[FOLDERNAME]&apos; is a system folder. Deleting system folders
name="ConfirmEmptyTrash"
type="alertmodal">
Are you sure you want to permanently delete the contents of your Trash?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I empty the inventory Trash folder"
name="okcancelignore"
@@ -4393,6 +4773,7 @@ Are you sure you want to permanently delete the contents of your Trash?
name="ConfirmClearBrowserCache"
type="alertmodal">
Are you sure you want to delete your travel, web, and search history?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -4404,6 +4785,7 @@ Are you sure you want to delete your travel, web, and search history?
name="ConfirmClearCookies"
type="alertmodal">
Are you sure you want to clear your cookies?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -4415,6 +4797,7 @@ Are you sure you want to clear your cookies?
name="ConfirmClearMediaUrlList"
type="alertmodal">
Are you sure you want to clear your list of saved URLs?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -4426,6 +4809,7 @@ Are you sure you want to clear your list of saved URLs?
name="ConfirmEmptyLostAndFound"
type="alertmodal">
Are you sure you want to permanently delete the contents of your Lost And Found?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I empty the inventory Lost And Found folder"
name="okcancelignore"
@@ -4452,6 +4836,7 @@ Link to this from a web page to give others easy access to this location, or try
name="WLSavePresetAlert"
type="alertmodal">
Do you wish to overwrite the saved preset?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="No"
@@ -4463,6 +4848,7 @@ Do you wish to overwrite the saved preset?
name="WLDeletePresetAlert"
type="alertmodal">
Do you wish to delete [SKY]?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="No"
@@ -4474,6 +4860,7 @@ Do you wish to delete [SKY]?
name="WLNoEditDefault"
type="alertmodal">
You cannot edit or delete a default preset.
+ <tag>fail</tag>
</notification>
<notification
@@ -4481,6 +4868,7 @@ You cannot edit or delete a default preset.
name="WLMissingSky"
type="alertmodal">
This day cycle file references a missing sky file: [SKY].
+ <tag>fail</tag>
</notification>
<notification
@@ -4499,6 +4887,7 @@ PostProcess Effect exists. Do you still wish overwrite it?
name="NewSkyPreset"
type="alert">
Give me a name for the new sky.
+ <tag>confirm</tag>
<form name="form">
<input name="message" type="text">
New Preset
@@ -4520,6 +4909,7 @@ New Preset
name="ExistsSkyPresetAlert"
type="alertmodal">
Preset already exists!
+ <tag>fail</tag>
</notification>
<notification
@@ -4527,6 +4917,7 @@ Preset already exists!
name="NewWaterPreset"
type="alert">
Give me a name for the new water preset.
+ <tag>confirm</tag>
<form name="form">
<input name="message" type="text">
New Preset
@@ -4548,6 +4939,7 @@ New Preset
name="ExistsWaterPresetAlert"
type="alertmodal">
Preset already exists!
+ <tag>fail</tag>
</notification>
<notification
@@ -4555,6 +4947,7 @@ Preset already exists!
name="WaterNoEditDefault"
type="alertmodal">
You cannot edit or delete a default preset.
+ <tag>fail</tag>
</notification>
<notification
@@ -4563,6 +4956,7 @@ You cannot edit or delete a default preset.
type="alertmodal">
Unable to start a new chat session with [RECIPIENT].
[REASON]
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -4574,6 +4968,7 @@ Unable to start a new chat session with [RECIPIENT].
type="alertmodal">
[EVENT]
[REASON]
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -4595,6 +4990,7 @@ Your chat session with [NAME] must close.
name="Cannot_Purchase_an_Attachment"
type="alertmodal">
You can&apos;t buy an object while it is attached.
+ <tag>fail</tag>
</notification>
<notification
@@ -4613,6 +5009,7 @@ Granting this request gives a script ongoing permission to take Linden dollars (
name="AutoWearNewClothing"
type="alertmodal">
Would you like to automatically wear the clothing you are about to create?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Wear the clothing I create while editing My Appearance"
name="okcancelignore"
@@ -4628,6 +5025,7 @@ Would you like to automatically wear the clothing you are about to create?
You must be age-verified to visit this area. Do you want to go to the [SECOND_LIFE] website and verify your age?
[_URL]
+ <tag>confirm</tag>
<url option="0" name="url">
https://secondlife.com/account/verification.php
@@ -4646,6 +5044,7 @@ You must be age-verified to visit this area. Do you want to go to the [SECOND_L
You must have payment information on file to visit this area. Do you want to go to the [SECOND_LIFE] website and set this up?
[_URL]
+ <tag>confirm</tag>
<url option="0" name="url">
https://secondlife.com/account/
@@ -4662,6 +5061,7 @@ You must have payment information on file to visit this area. Do you want to go
name="MissingString"
type="alertmodal">
The string [STRING_NAME] is missing from strings.xml
+ <tag>fail</tag>
</notification>
<notification
@@ -4712,12 +5112,14 @@ Replaced missing clothing/body part with default.
persist="true"
type="groupnotify">
Topic: [SUBJECT], Message: [MESSAGE]
+ <tag>group</tag>
</notification>
<notification
icon="notifytip.tga"
name="FriendOnline"
type="notifytip">
+ <tag>friendship</tag>
[NAME] is Online
</notification>
@@ -4725,6 +5127,7 @@ Topic: [SUBJECT], Message: [MESSAGE]
icon="notifytip.tga"
name="FriendOffline"
type="notifytip">
+ <tag>friendship</tag>
[NAME] is Offline
</notification>
@@ -4732,6 +5135,7 @@ Topic: [SUBJECT], Message: [MESSAGE]
icon="notifytip.tga"
name="AddSelfFriend"
type="notifytip">
+ <tag>friendship</tag>
Although you&apos;re very nice, you can&apos;t add yourself as a friend.
</notification>
@@ -4749,6 +5153,7 @@ Uploading in-world and web site snapshots...
persist="true"
type="notify">
You paid L$[AMOUNT] to upload.
+<tag>funds</tag>
</notification>
<notification
@@ -4777,6 +5182,7 @@ Terrain.raw downloaded
name="GestureMissing"
type="notifytip">
Hmm. Gesture [NAME] is missing from the database.
+ <tag>fail</tag>
</notification>
<notification
@@ -4784,6 +5190,7 @@ Hmm. Gesture [NAME] is missing from the database.
name="UnableToLoadGesture"
type="notifytip">
Unable to load gesture [NAME].
+ <tag>fail</tag>
</notification>
<notification
@@ -4791,6 +5198,7 @@ Unable to load gesture [NAME].
name="LandmarkMissing"
type="notifytip">
Landmark is missing from database.
+ <tag>fail</tag>
</notification>
<notification
@@ -4798,6 +5206,7 @@ Landmark is missing from database.
name="UnableToLoadLandmark"
type="notifytip">
Unable to load landmark. Please try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -4813,6 +5222,7 @@ This might affect your password.
name="NotecardMissing"
type="notifytip">
Notecard is missing from database.
+ <tag>fail</tag>
</notification>
<notification
@@ -4820,6 +5230,7 @@ Notecard is missing from database.
name="NotecardNoPermissions"
type="notifytip">
You don&apos;t have permission to view this notecard.
+ <tag>fail</tag>
</notification>
<notification
@@ -4827,6 +5238,7 @@ You don&apos;t have permission to view this notecard.
name="RezItemNoPermissions"
type="notifytip">
Insufficient permissions to rez object.
+ <tag>fail</tag>
</notification>
<notification
@@ -4835,6 +5247,7 @@ Insufficient permissions to rez object.
type="notifytip">
Unable to load notecard.
Please try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -4842,6 +5255,7 @@ Please try again.
name="ScriptMissing"
type="notifytip">
Script is missing from database.
+ <tag>fail</tag>
</notification>
<notification
@@ -4849,6 +5263,7 @@ Script is missing from database.
name="ScriptNoPermissions"
type="notifytip">
Insufficient permissions to view script.
+ <tag>fail</tag>
</notification>
<notification
@@ -4856,6 +5271,7 @@ Insufficient permissions to view script.
name="UnableToLoadScript"
type="notifytip">
Unable to load script. Please try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -4863,6 +5279,7 @@ Unable to load script. Please try again.
name="IncompleteInventory"
type="notifytip">
The complete contents you are offering are not yet locally available. Please try offering those items again in a minute.
+ <tag>fail</tag>
</notification>
<notification
@@ -4870,6 +5287,7 @@ The complete contents you are offering are not yet locally available. Please try
name="CannotModifyProtectedCategories"
type="notifytip">
You cannot modify protected categories.
+ <tag>fail</tag>
</notification>
<notification
@@ -4877,6 +5295,7 @@ You cannot modify protected categories.
name="CannotRemoveProtectedCategories"
type="notifytip">
You cannot remove protected categories.
+ <tag>fail</tag>
</notification>
<notification
@@ -4885,6 +5304,7 @@ You cannot remove protected categories.
type="notifytip">
Unable to buy while downloading object data.
Please try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -4893,6 +5313,7 @@ Please try again.
type="notifytip">
Unable to link while downloading object data.
Please try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -4901,6 +5322,7 @@ Please try again.
type="notifytip">
You can only buy objects from one owner at a time.
Please select a single object.
+ <tag>fail</tag>
</notification>
<notification
@@ -4908,6 +5330,7 @@ Please select a single object.
name="ObjectNotForSale"
type="notifytip">
This object is not for sale.
+ <tag>fail</tag>
</notification>
<notification
@@ -4929,6 +5352,7 @@ Now leaving god mode, level [LEVEL]
name="CopyFailed"
type="notifytip">
You don&apos;t have permission to copy this.
+ <tag>fail</tag>
</notification>
<notification
@@ -4990,6 +5414,7 @@ Select the Resident from the list, then click &apos;IM&apos; at the bottom of th
type="notifytip">
Can&apos;t select land across server boundaries.
Try selecting a smaller piece of land.
+ <tag>fail</tag>
</notification>
<notification
@@ -4997,6 +5422,7 @@ Try selecting a smaller piece of land.
name="SearchWordBanned"
type="notifytip">
Some terms in your search query were excluded due to content restrictions as clarified in the Community Standards.
+ <tag>fail</tag>
</notification>
<notification
@@ -5004,6 +5430,7 @@ Some terms in your search query were excluded due to content restrictions as cla
name="NoContentToSearch"
type="notifytip">
Please select at least one type of content to search (General, Moderate, or Adult).
+ <tag>fail</tag>
</notification>
<notification
@@ -5019,6 +5446,7 @@ Please select at least one type of content to search (General, Moderate, or Adul
name="PaymentReceived"
persist="true"
type="notify">
+ <tag>funds</tag>
[MESSAGE]
</notification>
@@ -5027,6 +5455,7 @@ Please select at least one type of content to search (General, Moderate, or Adul
name="PaymentSent"
persist="true"
type="notify">
+ <tag>funds</tag>
[MESSAGE]
</notification>
@@ -5084,13 +5513,16 @@ Deactivated gestures with same trigger:
type="notify">
Apple&apos;s QuickTime software does not appear to be installed on your system.
If you want to view streaming media on parcels that support it you should go to the [http://www.apple.com/quicktime QuickTime site] and install the QuickTime Player.
+ <tag>fail</tag>
</notification>
+
<notification
icon="notify.tga"
name="NoPlugin"
persist="true"
type="notify">
No Media Plugin was found to handle the "[MIME_TYPE]" mime type. Media of this type will be unavailable.
+ <tag>fail</tag>
<unique>
<context>MIME_TYPE</context>
</unique>
@@ -5104,6 +5536,7 @@ The following Media Plugin has failed:
[PLUGIN]
Please re-install the plugin or contact the vendor if you continue to experience problems.
+ <tag>fail</tag>
<form name="form">
<ignore name="ignore"
text="A Media Plugin fails to run"/>
@@ -5141,6 +5574,7 @@ The objects on the selected parcel of land owned by the Resident &apos;[NAME]&ap
The objects on the selected parcel of land shared with the group [GROUPNAME] have been returned back to their owner&apos;s inventory.
Transferable deeded objects have been returned to their previous owners.
Non-transferable objects that are deeded to the group have been deleted.
+ <tag>group</tag>
</notification>
<notification
@@ -5197,6 +5631,7 @@ This area does not allow pushing. You can&apos;t push others here unless you own
type="notify"
unique="true">
This area has voice chat disabled. You won&apos;t be able to hear anyone talking.
+ <tag>voice</tag>
</notification>
<notification
@@ -5241,6 +5676,7 @@ No scripts will work here except those belonging to the land owner.
persist="true"
type="notify">
You can only claim public land in the Region you&apos;re in.
+ <tag>fail</tag>
</notification>
<notification
@@ -5529,6 +5965,7 @@ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLU
name="JoinGroup"
persist="true"
type="notify">
+ <tag>group</tag>
[MESSAGE]
<form name="form">
<button
@@ -5553,6 +5990,7 @@ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLU
[NAME_SLURL] has offered to teleport you to their location:
[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
+ <tag>confirm</tag>
<form name="form">
<button
index="0"
@@ -5596,6 +6034,8 @@ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLU
icon="notify.tga"
name="OfferFriendship"
type="offer">
+ <tag>friendship</tag>
+ <tag>confirm</tag>
[NAME_SLURL] is offering friendship.
[MESSAGE]
@@ -5617,6 +6057,7 @@ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLU
icon="notify.tga"
name="FriendshipOffered"
type="offer">
+ <tag>friendship</tag>
You have offered friendship to [TO_NAME]
</notification>
@@ -5625,6 +6066,7 @@ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLU
name="OfferFriendshipNoMessage"
persist="true"
type="notify">
+ <tag>friendship</tag>
[NAME_SLURL] is offering friendship.
(By default, you will be able to see each other&apos;s online status.)
@@ -5644,6 +6086,7 @@ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLU
icon="notify.tga"
name="FriendshipAccepted"
type="offer">
+ <tag>friendship</tag>
[NAME] accepted your friendship offer.
</notification>
@@ -5652,6 +6095,7 @@ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLU
name="FriendshipDeclined"
persist="true"
type="notify">
+ <tag>friendship</tag>
[NAME] declined your friendship offer.
</notification>
@@ -5659,6 +6103,7 @@ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLU
icon="notify.tga"
name="FriendshipAcceptedByMe"
type="offer">
+ <tag>friendship</tag>
Friendship offer accepted.
</notification>
@@ -5666,6 +6111,7 @@ Friendship offer accepted.
icon="notify.tga"
name="FriendshipDeclinedByMe"
type="offer">
+ <tag>friendship</tag>
Friendship offer declined.
</notification>
@@ -5719,6 +6165,7 @@ Load web page [URL]?
[MESSAGE]
From object: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, owner: [NAME]?
+ <tag>confirm</tag>
<form name="form">
<button
index="0"
@@ -5737,6 +6184,7 @@ From object: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, owner: [NAME]?
persist="true"
type="notify">
Failed to find [TYPE] in database.
+ <tag>fail</tag>
</notification>
<notification
@@ -5745,6 +6193,7 @@ Failed to find [TYPE] in database.
persist="true"
type="notify">
Failed to find [TYPE] named [DESC] in database.
+ <tag>fail</tag>
</notification>
<notification
@@ -5753,6 +6202,7 @@ Failed to find [TYPE] named [DESC] in database.
persist="true"
type="notify">
The item you are trying to wear uses a feature that your Viewer can&apos;t read. Please upgrade your version of [APP_NAME] to wear this item.
+ <tag>fail</tag>
</notification>
<notification
@@ -5764,6 +6214,7 @@ The item you are trying to wear uses a feature that your Viewer can&apos;t read.
[QUESTIONS]
Is this OK?
+ <tag>confirm</tag>
<form name="form">
<button
index="0"
@@ -5792,6 +6243,7 @@ An object named &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, owned by
If you do not trust this object and its creator, you should deny the request.
Grant this request?
+ <tag>confirm</tag>
<form name="form">
<button
index="0"
@@ -5827,6 +6279,7 @@ Grant this request?
icon="notify.tga"
name="ScriptDialogGroup"
type="notify">
+ <tag>group</tag>
[GROUPNAME]&apos;s &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
[MESSAGE]
<form name="form">
@@ -5863,6 +6316,7 @@ Your L$ balance is shown in the upper-right.
name="BuyLindenDollarSuccess"
persist="true"
type="notify">
+ <tag>funds</tag>
Thank you for your payment!
Your L$ balance will be updated when processing completes. If processing takes more than 20 mins, your transaction may be cancelled. In that case, the purchase amount will be credited to your US$ balance.
@@ -5870,57 +6324,6 @@ Your L$ balance will be updated when processing completes. If processing takes m
The status of your payment can be checked on your Transaction History page on your [http://secondlife.com/account/ Dashboard]
</notification>
-<!--
- <notification
- icon="notify.tga"
- name="FirstSit"
- persist="true"
- type="notify">
-You are sitting.
-Use your arrow keys (or AWSD) to look around.
-Click the &apos;Stand Up&apos; button to stand.
- </notification>
-
- <notification
- icon="notify.tga"
- name="FirstMap"
- persist="true"
- type="notify">
-Click and drag the map to look around.
-Double-click to teleport.
-Use the controls on the right to find things and display different backgrounds.
- </notification>
-
- <notification
- icon="notify.tga"
- name="FirstBuild"
- persist="true"
- type="notify">
-You have opened the Build Tools. Every object you see around you was created using these tools.
- </notification>
--->
-
-<!--
- <notification
- icon="notify.tga"
- name="FirstLeftClickNoHit"
- persist="true"
- type="notify">
- Left-clicking interacts with special objects.
- If the mouse pointer changes to a hand, you can interact with the object.
- Right-click always shows a menu of things you can do.
- </notification>
-
- <notification
- icon="notify.tga"
- name="FirstTeleport"
- persist="true"
- type="notify">
-You can only teleport to certain areas in this region. The arrow points to your specific destination. Click the arrow to dismiss it.
- </notification>
-
--->
-
<notification
icon="notify.tga"
name="FirstOverrideKeys"
@@ -5932,30 +6335,6 @@ Some objects (like guns) require you to go into mouselook to use them.
Press &apos;M&apos; to do this.
</notification>
-<!--
- <notification
- icon="notify.tga"
- name="FirstAppearance"
- persist="true"
- type="notify">
-You are editing your Appearance.
-Use the arrow keys to look around.
-When you are done, press &apos;Save All&apos;.
- </notification>
-
- <notification
- icon="notify.tga"
- name="FirstInventory"
- persist="true"
- type="notify">
-This is your Inventory, which contains items you own.
-
-* To wear something, drag it onto yourself.
-* To rez something inworld, drag it onto the ground.
-* To read a notecard, double-click it.
- </notification>
--->
-
<notification
icon="notify.tga"
name="FirstSandbox"
@@ -5966,47 +6345,6 @@ This is a sandbox area, and is meant to help Residents learn how to build.
Things you build here will be deleted after you leave, so don&apos;t forget to right-click and choose &apos;Take&apos; to move your creation to your Inventory.
</notification>
-<!--
- <notification
- icon="notify.tga"
- name="FirstFlexible"
- persist="true"
- type="notify">
-This object is flexible. Flexis must be phantom and not physical.
- </notification>
-
- <notification
- icon="notify.tga"
- name="FirstDebugMenus"
- persist="true"
- type="notify">
-You opened the Advanced menu.
-
-To toggle this menu,
- Windows: Ctrl+Alt+D
- Mac: &#8997;&#8984;D
-
- </notification>
-
- <notification
- icon="notify.tga"
- name="FirstSculptedPrim"
- persist="true"
- type="notify">
-You are editing a Sculpted prim. Sculpties require a special texture to define their shape.
- </notification>
--->
-
- <!--
- <notification
- icon="notify.tga"
- name="FirstMedia"
- persist="true"
- type="notify">
- You have begun playing media. Media can set to play automatically in the preferences window under Audio / Video. Note that this can be a security risk for media sites you do not trust.
- </notification>
- -->
-
<notification
icon="notifytip.tga"
name="MaxListSelectMessage"
@@ -6020,6 +6358,8 @@ You may only select up to [MAX_SELECT] items from this list.
type="notify">
[NAME] is inviting you to a Voice Chat call.
Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller.
+ <tag>confirm</tag>
+ <tag>voice</tag>
<unique>
<context>NAME</context>
</unique>
@@ -6069,6 +6409,9 @@ Click Accept to join the call or Decline to decline the invitation. Click Block
type="notify">
[NAME] has joined a Voice Chat call with the group [GROUP].
Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller.
+ <tag>group</tag>
+ <tag>confirm</tag>
+ <tag>voice</tag>
<unique>
<context>NAME</context>
<context>GROUP</context>
@@ -6095,6 +6438,8 @@ Click Accept to join the call or Decline to decline the invitation. Click Block
type="notify">
[NAME] has joined a voice chat call with a conference chat.
Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller.
+ <tag>confirm</tag>
+ <tag>voice</tag>
<unique>
<context>NAME</context>
</unique>
@@ -6120,6 +6465,8 @@ Click Accept to join the call or Decline to decline the invitation. Click Block
type="notify">
[NAME] is inviting you to a conference chat.
Click Accept to join the chat or Decline to decline the invitation. Click Block to block this caller.
+ <tag>confirm</tag>
+ <tag>voice</tag>
<unique>
<context>NAME</context>
</unique>
@@ -6144,6 +6491,8 @@ Click Accept to join the chat or Decline to decline the invitation. Click Block
name="VoiceChannelFull"
type="notifytip">
The voice call you are trying to join, [VOICE_CHANNEL_NAME], has reached maximum capacity. Please try again later.
+ <tag>fail</tag>
+ <tag>voice</tag>
<unique>
<context>VOICE_CHANNEL_NAME</context>
</unique>
@@ -6154,7 +6503,9 @@ The voice call you are trying to join, [VOICE_CHANNEL_NAME], has reached maximum
name="ProximalVoiceChannelFull"
type="notifytip"
unique="true">
-We&apos;re sorry. This area has reached maximum capacity for voice conversations. Please try to use voice in another area.
+ We&apos;re sorry. This area has reached maximum capacity for voice conversations. Please try to use voice in another area.
+ <tag>fail</tag>
+ <tag>voice</tag>
</notification>
<notification
@@ -6162,6 +6513,7 @@ We&apos;re sorry. This area has reached maximum capacity for voice conversation
name="VoiceChannelDisconnected"
type="notifytip">
You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnected to Nearby Voice Chat.
+ <tag>voice</tag>
<unique>
<context>VOICE_CHANNEL_NAME</context>
</unique>
@@ -6172,6 +6524,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect
name="VoiceChannelDisconnectedP2P"
type="notifytip">
[VOICE_CHANNEL_NAME] has ended the call. You will now be reconnected to Nearby Voice Chat.
+ <tag>voice</tag>
<unique>
<context>VOICE_CHANNEL_NAME</context>
</unique>
@@ -6182,6 +6535,8 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect
name="P2PCallDeclined"
type="notifytip">
[VOICE_CHANNEL_NAME] has declined your call. You will now be reconnected to Nearby Voice Chat.
+ <tag>voice</tag>
+ <tag>fail</tag>
<unique>
<context>VOICE_CHANNEL_NAME</context>
</unique>
@@ -6192,6 +6547,8 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect
name="P2PCallNoAnswer"
type="notifytip">
[VOICE_CHANNEL_NAME] is not available to take your call. You will now be reconnected to Nearby Voice Chat.
+ <tag>fail</tag>
+ <tag>voice</tag>
<unique>
<context>VOICE_CHANNEL_NAME</context>
</unique>
@@ -6202,6 +6559,8 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect
name="VoiceChannelJoinFailed"
type="notifytip">
Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now be reconnected to Nearby Voice Chat.
+ <tag>fail</tag>
+ <tag>voice</tag>
<unique>
<context>VOICE_CHANNEL_NAME</context>
</unique>
@@ -6214,6 +6573,8 @@ Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now
type="notifytip"
unique="true">
We are creating a voice channel for you. This may take up to one minute.
+ <tag>status</tag>
+ <tag>voice</tag>
</notification>
<notification
@@ -6225,6 +6586,8 @@ We are creating a voice channel for you. This may take up to one minute.
unique="true">
One or more of your subscribed Voice Morphs has expired.
[[URL] Click here] to renew your subscription.
+ <tag>fail</tag>
+ <tag>voice</tag>
</notification>
<notification
@@ -6236,6 +6599,8 @@ One or more of your subscribed Voice Morphs has expired.
unique="true">
The active Voice Morph has expired, your normal voice settings have been applied.
[[URL] Click here] to renew your subscription.
+ <tag>fail</tag>
+ <tag>voice</tag>
</notification>
<notification
@@ -6247,6 +6612,8 @@ The active Voice Morph has expired, your normal voice settings have been applied
unique="true">
One or more of your Voice Morphs will expire in less than [INTERVAL] days.
[[URL] Click here] to renew your subscription.
+ <tag>fail</tag>
+ <tag>voice</tag>
</notification>
<notification
@@ -6257,6 +6624,7 @@ One or more of your Voice Morphs will expire in less than [INTERVAL] days.
type="notify"
unique="true">
New Voice Morphs are available!
+ <tag>voice</tag>
</notification>
<notification
@@ -6264,6 +6632,7 @@ New Voice Morphs are available!
name="Cannot enter parcel: not a group member"
type="notifytip">
<tag>fail</tag>
+ <tag>group</tag>
Only members of a certain group can visit this area.
</notification>
@@ -6288,6 +6657,8 @@ Cannot enter parcel, you are not on the access list.
name="VoiceNotAllowed"
type="notifytip">
You do not have permission to connect to voice chat for [VOICE_CHANNEL_NAME].
+ <tag>fail</tag>
+ <tag>voice</tag>
<unique>
<context>VOICE_CHANNEL_NAME</context>
</unique>
@@ -6298,6 +6669,8 @@ You do not have permission to connect to voice chat for [VOICE_CHANNEL_NAME].
name="VoiceCallGenericError"
type="notifytip">
An error has occurred while trying to connect to voice chat for [VOICE_CHANNEL_NAME]. Please try again later.
+ <tag>fail</tag>
+ <tag>voice</tag>
<unique>
<context>VOICE_CHANNEL_NAME</context>
</unique>
@@ -6309,6 +6682,7 @@ An error has occurred while trying to connect to voice chat for [VOICE_CHANNEL_N
priority="high"
type="notifytip">
The SLurl you clicked on is not supported.
+ <tag>fail</tag>
</notification>
<notification
@@ -6316,7 +6690,7 @@ The SLurl you clicked on is not supported.
name="BlockedSLURL"
priority="high"
type="notifytip">
- <tag>win</tag>
+ <tag>security</tag>
A SLurl was received from an untrusted browser and has been blocked for your security.
</notification>
@@ -6325,6 +6699,7 @@ A SLurl was received from an untrusted browser and has been blocked for your sec
name="ThrottledSLURL"
priority="high"
type="notifytip">
+ <tag>security</tag>
Multiple SLurls were received from an untrusted browser within a short period.
They will be blocked for a few seconds for your security.
</notification>
@@ -6341,6 +6716,7 @@ They will be blocked for a few seconds for your security.
name="ConfirmCloseAll"
type="alertmodal">
Are you sure you want to close all IMs?
+ <tag>confirm</tag>
<usetemplate
name="okcancelignore"
notext="Cancel"
@@ -6358,6 +6734,7 @@ Attachment has been saved.
name="UnableToFindHelpTopic"
type="alertmodal">
Unable to find the help topic for this element.
+ <tag>fail</tag>
</notification>
<notification
@@ -6366,6 +6743,7 @@ Unable to find the help topic for this element.
type="alertmodal">
Server Error: Media update or get failed.
&apos;[ERROR]&apos;
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -6386,6 +6764,7 @@ Your text chat has been muted by moderator.
name="VoiceIsMutedByModerator"
type="alertmodal">
Your voice has been muted by moderator.
+ <tag>voice</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -6396,6 +6775,7 @@ Your voice has been muted by moderator.
name="ConfirmClearTeleportHistory"
type="alertmodal">
Are you sure you want to delete your teleport history?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -6408,6 +6788,7 @@ Are you sure you want to delete your teleport history?
type="alert">
Selected button can not be shown right now.
The button will be shown when there is enough space for it.
+ <tag>fail</tag>
</notification>
<notification
@@ -6427,22 +6808,27 @@ Are you sure you want to share the following items:
With the following Residents:
[RESIDENTS]
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
yestext="Ok"/>
</notification>
+
<notification
icon="notifytip.tga"
name="ItemsShared"
type="notifytip">
Items successfully shared.
</notification>
+
<notification
icon="notifytip.tga"
name="DeedToGroupFail"
type="notifytip">
Deed to group failed.
+ <tag>group</tag>
+ <tag>fail</tag>
</notification>
<notification
@@ -6516,6 +6902,7 @@ Avatar '[NAME]' left appearance mode.
type="alertmodal">
We're having trouble connecting using [PROTOCOL] [HOSTID].
Please check your network and firewall setup.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -6531,6 +6918,8 @@ We're having trouble connecting to your voice server:
Voice communications will not be available.
Please check your network and firewall setup.
+ <tag>voice</tag>
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -6565,6 +6954,8 @@ You locally updated a [RESOLUTION] baked texture for '[BODYREGION]' after [TIME]
name="ConfirmLeaveCall"
type="alert">
Are you sure you want to leave this call?
+ <tag>confirm</tag>
+ <tag>voice</tag>
<usetemplate
ignoretext="Confirm before I leave call"
name="okcancelignore"
@@ -6582,6 +6973,9 @@ This will also cause all residents that later join the call to be
muted, even after you have left the call.
Mute everyone?
+ <tag>group</tag>
+ <tag>confirm</tag>
+ <tag>voice</tag>
<usetemplate
ignoretext="Confirm before I mute all participants in a group call"
name="okcancelignore"
@@ -6600,6 +6994,7 @@ Mute everyone?
<notification
name="HintSit"
+
label="Stand"
type="hint"
unique="true">
@@ -6615,14 +7010,6 @@ Mute everyone?
</notification>
<notification
- name="HintAvatarPicker"
- label="Change your Look"
- type="hint"
- unique="true">
- Would you like to try a new look? Click the button below to see more Avatars.
- </notification>
-
- <notification
name="HintSidePanel"
label="Side Panel"
type="hint"
@@ -6678,6 +7065,7 @@ Mute everyone?
type="hint"
unique="true">
Here's your current balance of L$. Click Buy L$ to purchase more Linden Dollars.
+ <tag>funds</tag>
</notification>
<notification
@@ -6701,6 +7089,7 @@ Mute everyone?
name="AuthRequest"
type="browser">
The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;[REALM]&apos; requires a user name and password.
+ <tag>confirm</tag>
<form name="form">
<input name="username" type="text" text="User Name"/>
<input name="password" type="password" text="Password "/>
@@ -6714,6 +7103,116 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
</form>
</notification>
+ <notification
+ name="ModeChange"
+ label=""
+ type="alertmodal"
+ unique="true">
+ Changing modes requires you to quit and restart.
+ <tag>confirm</tag>
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
+
+ <notification
+ name="NoClassifieds"
+ label=""
+ type="alertmodal"
+ unique="true">
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ Creation and editing of Classifieds is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
+
+ <notification
+ name="NoGroupInfo"
+ label=""
+ type="alertmodal"
+ unique="true">
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ Creation and editing of Groups is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
+
+ <notification
+ name="NoPicks"
+ label=""
+ type="alertmodal"
+ unique="true">
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ Creation and editing of Picks is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
+
+ <notification
+ name="NoWorldMap"
+ label=""
+ type="alertmodal"
+ unique="true">
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ Viewing of the world map is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
+
+ <notification
+ name="NoVoiceCall"
+ label=""
+ type="alertmodal"
+ unique="true">
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ Voice calls are only available in Advanced mode. Would you like to logout and change modes?
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
+
+ <notification
+ name="NoAvatarShare"
+ label=""
+ type="alertmodal"
+ unique="true">
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ Sharing is only available in Advanced mode. Would you like to logout and change modes?
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
+
+ <notification
+ name="NoAvatarPay"
+ label=""
+ type="alertmodal"
+ unique="true">
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ Paying other residents is only available in Advanced mode. Would you like to logout and change modes?
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
<global name="UnsupportedCPU">
- Your CPU speed does not meet the minimum requirements.
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 013a8090f7..a92cc886e7 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -45,11 +45,11 @@
min_width="214"
height="28"
mouse_opaque="false"
- name="chat_bar_layout_panel"
+ name="chat_bar_layout_panel"
user_resize="true"
- width="308" >
+ width="310" >
<panel
- name="chat_bar"
+ name="chat_bar"
filename="panel_nearby_chat_bar.xml"
left="0"
height="28"
@@ -60,11 +60,30 @@
/>
</layout_panel>
<!--
- There is resize bar between chatbar and Speak button. It has 2px width (is is set as 2*UIResizeBarOverlap)
+ This 5px Panel is an indicator of where the resize handle is.
+ The panel provides a gap between the resize handle icon and a button to the right.
-->
<layout_panel
auto_resize="false"
- follows="right"
+ layout="topleft"
+ max_width="5"
+ min_width="5"
+ name="chat_bar_resize_handle_panel"
+ user_resize="false"
+ width="5">
+ <icon
+ follows="top|right"
+ height="25"
+ image_name="ChatBarHandle"
+ layout="topleft"
+ left="-7"
+ name="resize_handle"
+ top="4"
+ width="5" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="left|right"
height="28"
layout="topleft"
min_height="28"
@@ -72,13 +91,13 @@
mouse_opaque="false"
name="speak_panel"
top_delta="0"
- user_resize="true"
- width="110">
+ user_resize="false"
+ width="108">
<talk_button
follows="left|right"
height="23"
layout="topleft"
- left="2"
+ left="0"
name="talk"
top="5"
width="105">
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index 806182bcb4..4c2faddfe4 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -47,8 +47,8 @@ auto_resize="false"
follows="left|bottom"
name="login"
layout="topleft"
-width="695"
-min_width="695"
+width="705"
+min_width="705"
user_resize="false"
height="80">
<text
@@ -67,8 +67,7 @@ follows="left|bottom"
height="22"
left_delta="0"
max_chars="128"
-prevalidate_callback="ascii"
-select_on_focus="true"
+combo_editor.prevalidate_callback="ascii"
tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine"
top_pad="0"
name="username_combo"
@@ -118,13 +117,41 @@ label="Remember password"
name="connect_btn"
top="35"
width="90" />
+ <text
+ follows="left|bottom"
+ font="SansSerifSmall"
+ height="15"
+ left_pad="10"
+ name="mode_selection_text"
+ top="20"
+ width="130">
+ Mode:
+ </text>
+<combo_box
+ follows="left|bottom"
+ height="23"
+ max_chars="128"
+ tool_tip="Select your mode. Choose Basic for fast, easy exploration and chat. Choose Advanced to access more features."
+ top_pad="0"
+ control_name="SessionSettingsFile"
+ name="mode_combo"
+ width="110">
+<combo_box.item
+ label="Basic"
+ name="Basic"
+ value="settings_minimal.xml" />
+<combo_box.item
+ label="Advanced"
+ name="Advanced"
+ value="" />
+</combo_box>
<text
follows="left|bottom"
font="SansSerifSmall"
height="15"
- left_pad="18"
+ left_pad="8"
name="start_location_text"
-top="20"
+ top="20"
width="130">
Start at:
</text>
@@ -136,7 +163,7 @@ control_name="NextLoginLocation"
max_chars="128"
top_pad="0"
name="start_location_combo"
- width="170">
+ width="165">
<combo_box.item
label="My last location"
name="MyLastLocation"
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 43431ea7c1..1a00416b2a 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -76,7 +76,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
follows="all"
height="383"
layout="topleft"
- left="5"
+ left="3"
name="tabs"
tab_group="1"
tab_min_width="70"
@@ -84,7 +84,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
tab_position="top"
top_pad="10"
halign="center"
- width="317">
+ width="319">
<panel
background_opaque="true"
background_visible="true"
@@ -106,20 +106,20 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
left="3"
mouse_opaque="false"
name="Net Map"
- width="307"
+ width="305"
height="140"
- top="0"/>
+ top="5"/>
<avatar_list
allow_select="true"
follows="top|left|bottom|right"
- height="216"
+ height="211"
ignore_online_status="true"
layout="topleft"
left="3"
multi_select="true"
name="avatar_list"
top="145"
- width="307" />
+ width="306" />
<panel
background_visible="true"
follows="left|right|bottom"
@@ -165,7 +165,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
layout="topleft"
left_pad="1"
name="dummy_icon"
- width="241"
+ width="243"
/>
</panel>
</panel>
@@ -251,7 +251,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
top_pad="1"
left="0"
name="bottom_panel"
- width="305">
+ width="308">
<layout_panel
auto_resize="false"
height="25"
@@ -300,7 +300,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
layout="topleft"
name="dummy_panel"
user_resize="false"
- width="212">
+ width="210">
<icon
follows="bottom|left|right"
height="25"
@@ -309,7 +309,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
left="0"
top="0"
name="dummy_icon"
- width="211" />
+ width="210" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -471,7 +471,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
layout="topleft"
left_pad="1"
name="dummy_icon"
- width="209"
+ width="212"
/>
</panel>
</panel>
@@ -506,7 +506,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
height="27"
label="bottom_panel"
layout="topleft"
- left="0"
+ left="3"
name="bottom_panel"
top_pad="0"
width="313">
@@ -544,7 +544,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
layout="topleft"
left_pad="1"
name="dummy_icon"
- width="241"
+ width="244"
/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml
index f423dbb91c..daf571297f 100644
--- a/indra/newview/skins/default/xui/en/panel_places.xml
+++ b/indra/newview/skins/default/xui/en/panel_places.xml
@@ -214,10 +214,9 @@ background_visible="true"
<menu_button
follows="bottom|left|right"
height="23"
- image_disabled="ComboButton_Off"
- image_unselected="ComboButton_Off"
- image_pressed="ComboButton_Off"
- image_pressed_selected="ComboButton_Off"
+ image_disabled="ComboButton_UpOff"
+ image_unselected="ComboButton_UpOff"
+ image_selected="ComboButton_UpSelected"
layout="topleft"
mouse_opaque="false"
name="overflow_btn"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index c0d5f93f83..d0625d9755 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -3426,4 +3426,13 @@ Abuse Report</string>
<string name="Z">Z</string>
<!-- Key names end -->
+ <!-- llviewerwindow -->
+ <string name="BeaconParticle">Viewing particle beacons (blue)</string>
+ <string name="BeaconPhysical">Viewing physical object beacons (green)</string>
+ <string name="BeaconScripted">Viewing scripted object beacons (red)</string>
+ <string name="BeaconScriptedTouch">Viewing scripted object with touch function beacons (red)</string>
+ <string name="BeaconSound">Viewing sound beacons (yellow)</string>
+ <string name="BeaconMedia">Viewing media beacons (white)</string>
+ <string name="ParticleHiding">Hiding Particles</string>
+
</strings>
diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml
index 4c6e129720..3f50437c13 100644
--- a/indra/newview/skins/default/xui/es/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_about_land.xml
@@ -392,7 +392,6 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
</text>
<line_editor left="97" name="media_url"/>
<button label="Definir" name="set_media_url"/>
- <check_box label="Ocultar la URL del media" left="97" name="hide_media_url" tool_tip="Marcando esta opción esconderá en la información de esta parcela -a quien no esté autorizado a verla- la URL del media. Note que esto no está disponible para HTML."/>
<text name="Description:">
Descripción:
</text>
@@ -424,7 +423,6 @@ los media:
<text name="MusicURL:">
URL de música:
</text>
- <check_box label="Ocultar la URL" name="hide_music_url" tool_tip="Al marcar esta opción se ocultará la URL de la música a quien no esté autorizado a ver la información de esta parcela."/>
<text name="Sound:">
Sonido:
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_about_land.xml b/indra/newview/skins/default/xui/fr/floater_about_land.xml
index 63b2b1f685..6e6409725f 100644
--- a/indra/newview/skins/default/xui/fr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml
@@ -397,7 +397,6 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
</text>
<line_editor left="97" name="media_url"/>
<button label="Choisir" name="set_media_url"/>
- <check_box label="Masquer l&apos;URL" left="97" name="hide_media_url" tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l&apos;URL du média. Cette option n&apos;est pas disponible pour les fichiers HTML."/>
<text name="Description:">
Description :
</text>
@@ -429,7 +428,6 @@ texture :
URL de la
musique :
</text>
- <check_box label="Masquer l&apos;URL" name="hide_music_url" tool_tip="Si vous cochez cette option, l&apos;URL de musique sera masquée et invisible pour tous les utilisateurs non autorisés des informations de cette parcelle."/>
<text name="Sound:">
Son :
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_about_land.xml b/indra/newview/skins/default/xui/it/floater_about_land.xml
index e66f75be0f..186ed59e36 100644
--- a/indra/newview/skins/default/xui/it/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_about_land.xml
@@ -397,7 +397,6 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
</text>
<line_editor left="97" name="media_url"/>
<button label="Imposta" name="set_media_url"/>
- <check_box label="Nascondi indirizzo URL Media" left="94" name="hide_media_url" tool_tip="Abilitando questa opzione nasconderai l&apos;indirizzo url dei media a tutte le persone non autorizzate a vedere le informazioni del terreno. Nota che questo non è disponibile per contenuto di tipo HTML."/>
<text name="Description:">
Descrizione:
</text>
@@ -429,7 +428,6 @@ Media:
<text name="MusicURL:">
URL musica:
</text>
- <check_box label="Nascondi URL" name="hide_music_url" tool_tip="Questa opzione consente di nascondere l&apos;url della musica a chi non è autorizzato a visionare le informazioni di questo parcel."/>
<text name="Sound:">
Audio:
</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_about_land.xml b/indra/newview/skins/default/xui/ja/floater_about_land.xml
index a0046cec59..eefe71c9a5 100644
--- a/indra/newview/skins/default/xui/ja/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml
@@ -393,7 +393,6 @@
ホームページ:
</text>
<button label="設定" name="set_media_url"/>
- <check_box label="URL を非表示" name="hide_media_url" tool_tip="このオプションをオンにすると、許可なしでこの区画情報にアクセスしているユーザーにはメディア URL が表示されません。 これは HTML タイプには使用できませんのでご注意ください。"/>
<text name="Description:">
説明:
</text>
@@ -423,7 +422,6 @@
<text name="MusicURL:">
音楽 URL:
</text>
- <check_box label="URL を非表示にする" name="hide_music_url" tool_tip="このオプションにチェックを入れると、権限のない人が区画情報を見たときに音楽の URL が隠れます。"/>
<text name="Sound:">
サウンド:
</text>
diff --git a/indra/newview/skins/default/xui/nl/floater_about_land.xml b/indra/newview/skins/default/xui/nl/floater_about_land.xml
index bb72f54a9c..d51ea1c0f8 100644
--- a/indra/newview/skins/default/xui/nl/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/nl/floater_about_land.xml
@@ -425,8 +425,6 @@ hebt geklikt.)
</text>
<check_box label="Automatisch schalen" name="media_auto_scale" tool_tip="Het aanvinken van deze optie zal de inhoud voor dit perceel automatisch schalen. Het kan enigszins trager zijn en de visuele kwaliteit kan iets lager zijn, maar er zal geen andere textuurschaling of uitlijning nodig zijn."/>
<check_box label="Herhaal media" name="media_loop" tool_tip="Speel media af in een lus. Wanneer de media klaar is met afspelen zal het herstarten vanaf het begin."/>
- <check_box label="Verberg media URL" name="hide_media_url" tool_tip="Het aanvinken van deze optie zal de media URL verbergen voor alle niet-geautoriseerde bekijkers van de perceelinformatie. Let op: dit is niet beschikbaar voor HTML types."/>
- <check_box label="Verberg muziek URL" name="hide_music_url" tool_tip="Het aanvinken van deze optie zal de muziek URL verbergen voor alle niet-geautoriseerde bekijkers van de perceelinformatie."/>
<text name="media_size" tool_tip="Grootte om webmedia weer te geven, laat op 0 staan voor standaard." width="120">
Media grootte:
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_about_land.xml b/indra/newview/skins/default/xui/pl/floater_about_land.xml
index 865ab9eacf..b935615fcb 100644
--- a/indra/newview/skins/default/xui/pl/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pl/floater_about_land.xml
@@ -393,7 +393,6 @@ Jedynie większe posiadłości mogą być umieszczone w bazie wyszukiwarki.
URL mediów:
</text>
<button label="Ustaw" name="set_media_url"/>
- <check_box label="Ukryj URL mediów" name="hide_media_url" tool_tip="Wybranie tej opcji, zablokuje widok adresu do medów wszystkim nieautoryzowanym Rezydentom. Nie dotyczy to jednak typów HTML."/>
<text name="Description:">
Opis:
</text>
@@ -422,7 +421,6 @@ Mediów:
<check_box label="Powtórka Odtwarzania" name="media_loop" tool_tip="Odtwarzaj media z powtórką. Po wyświetleniu materialu, rozpocznie się odtwarzanie od początku."/>
</panel>
<panel label="DŹWIĘK" name="land_audio_panel">
- <check_box label="Ukryj URL muzyki" name="hide_music_url" tool_tip="Wybranie tej opcji, zablokuje widok adresu do medów muzycznych w posiadłości wszystkim nieautoryzowanym Użytkownikom"/>
<check_box label="Rozmowy dozwolone" name="parcel_enable_voice_channel"/>
<check_box label="Rozmowy dozwolone (ustawione przez Majątek)" name="parcel_enable_voice_channel_is_estate_disabled"/>
<check_box label="Ogranicz komunikację głosową w tej Posiadłości." name="parcel_enable_voice_channel_local"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_about_land.xml b/indra/newview/skins/default/xui/pt/floater_about_land.xml
index 43d056eef6..ffd1cce76c 100644
--- a/indra/newview/skins/default/xui/pt/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml
@@ -392,7 +392,6 @@ Apenas lotes maiores podem ser listados na busca.
</text>
<line_editor left="97" name="media_url"/>
<button label="Definir..." label_selected="Definir..." name="set_media_url"/>
- <check_box label="Esconder a URL da mídia" left="97" name="hide_media_url" tool_tip="Ativando esta opção, a URL da mídia se ocultará para quaisquer visualizadores não autorizados a ver esta informação do lote. Notar que isto não está disponível para tipos HTML."/>
<text name="Description:">
Descrição:
</text>
@@ -424,7 +423,6 @@ Mídia:
<text name="MusicURL:">
URL de música:
</text>
- <check_box label="Ocultar URL" name="hide_music_url" tool_tip="Selecionar esta opção oculta o URL de música a visitantes não autorizados aos dados do terreno."/>
<text name="Sound:">
Som:
</text>
diff --git a/indra/newview/skins/minimal/colors.xml b/indra/newview/skins/minimal/colors.xml
new file mode 100644
index 0000000000..097a298ce5
--- /dev/null
+++ b/indra/newview/skins/minimal/colors.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<colors>
+ <color
+ name="MenuBarBgColor"
+ value="0 0 0 0" />
+</colors>
diff --git a/indra/newview/skins/minimal/textures/arrow_keys.png b/indra/newview/skins/minimal/textures/arrow_keys.png
new file mode 100644
index 0000000000..f19af59251
--- /dev/null
+++ b/indra/newview/skins/minimal/textures/arrow_keys.png
Binary files differ
diff --git a/indra/newview/skins/minimal/textures/bottomtray/button_separator.png b/indra/newview/skins/minimal/textures/bottomtray/button_separator.png
new file mode 100644
index 0000000000..71ed25f931
--- /dev/null
+++ b/indra/newview/skins/minimal/textures/bottomtray/button_separator.png
Binary files differ
diff --git a/indra/newview/skins/minimal/textures/bottomtray/close_off.png b/indra/newview/skins/minimal/textures/bottomtray/close_off.png
new file mode 100644
index 0000000000..241a24bde9
--- /dev/null
+++ b/indra/newview/skins/minimal/textures/bottomtray/close_off.png
Binary files differ
diff --git a/indra/newview/skins/minimal/textures/bottomtray/close_over.png b/indra/newview/skins/minimal/textures/bottomtray/close_over.png
new file mode 100644
index 0000000000..4630cb6dd6
--- /dev/null
+++ b/indra/newview/skins/minimal/textures/bottomtray/close_over.png
Binary files differ
diff --git a/indra/newview/skins/minimal/textures/bottomtray/close_press.png b/indra/newview/skins/minimal/textures/bottomtray/close_press.png
new file mode 100644
index 0000000000..3ed9c99a26
--- /dev/null
+++ b/indra/newview/skins/minimal/textures/bottomtray/close_press.png
Binary files differ
diff --git a/indra/newview/skins/minimal/textures/textures.xml b/indra/newview/skins/minimal/textures/textures.xml
new file mode 100644
index 0000000000..3e2f5cd397
--- /dev/null
+++ b/indra/newview/skins/minimal/textures/textures.xml
@@ -0,0 +1,8 @@
+
+<textures version="101">
+ <texture name="Button_Separator" file_name="bottomtray/button_separator.png" preload="true" />
+ <texture name="arrow_keys.png"/>
+ <texture name="bottomtray_close_off" file_name="bottomtray/close_off.png" preload="true" />
+ <texture name="bottomtray_close_over" file_name="bottomtray/close_over.png" preload="true" />
+ <texture name="bottomtray_close_press" file_name="bottomtray/close_press.png" preload="true" />
+</textures>
diff --git a/indra/newview/skins/minimal/xui/de/floater_camera.xml b/indra/newview/skins/minimal/xui/de/floater_camera.xml
new file mode 100644
index 0000000000..d49c207f98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/floater_camera.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="camera_floater">
+ <floater.string name="rotate_tooltip">
+ Kamera um Fokus drehen
+ </floater.string>
+ <floater.string name="zoom_tooltip">
+ Kamera auf Fokus zoomen
+ </floater.string>
+ <floater.string name="move_tooltip">
+ Kamera nach oben, unten, links und rechts bewegen
+ </floater.string>
+ <floater.string name="camera_modes_title">
+ Kameramodi
+ </floater.string>
+ <floater.string name="pan_mode_title">
+ Kreisen - Zoomen - Schwenken
+ </floater.string>
+ <floater.string name="presets_mode_title">
+ Ansichten
+ </floater.string>
+ <floater.string name="free_mode_title">
+ Objekt ansehen
+ </floater.string>
+ <panel name="controls">
+ <panel name="preset_views_list">
+ <panel_camera_item name="front_view">
+ <panel_camera_item.text name="front_view_text">
+ Vorderansicht
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="group_view">
+ <panel_camera_item.text name="side_view_text">
+ Seitenansicht
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="rear_view">
+ <panel_camera_item.text name="rear_view_text">
+ Hinteransicht
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="camera_modes_list">
+ <panel_camera_item name="object_view">
+ <panel_camera_item.text name="object_view_text">
+ Objektansicht
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="mouselook_view">
+ <panel_camera_item.text name="mouselook_view_text">
+ Mouselook
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="zoom" tool_tip="Kamera auf Fokus zoomen">
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Kamera um Fokus kreisen"/>
+ <slider_bar name="zoom_slider" tool_tip="Kamera auf Fokus zoomen"/>
+ <joystick_track name="cam_track_stick" tool_tip="Kamera nach oben, unten, links und rechts bewegen"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="presets_btn" tool_tip="Ansichten"/>
+ <button label="" name="pan_btn" tool_tip="Kreisen - Zoomen - Schwenken"/>
+ <button label="" name="avatarview_btn" tool_tip="Kameramodi"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/de/floater_help_browser.xml b/indra/newview/skins/minimal/xui/de/floater_help_browser.xml
new file mode 100644
index 0000000000..459dfb66c0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/floater_help_browser.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="ANWEISUNGEN">
+ <floater.string name="loading_text">
+ Wird geladen...
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="external_controls"/>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/de/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/de/floater_nearby_chat.xml
new file mode 100644
index 0000000000..bbb4114200
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/floater_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="CHAT IN DER NÄHE">
+ <check_box label="Chat übersetzen (Service von Google)" name="translate_chat_checkbox"/>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/de/inspect_avatar.xml b/indra/newview/skins/minimal/xui/de/inspect_avatar.xml
new file mode 100644
index 0000000000..4b8fd8a0ad
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/inspect_avatar.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [AGE]
+ </string>
+ <string name="Details">
+ [SL_PROFILE]
+ </string>
+ <text name="user_subtitle" value="11 Monate und 3 Tage alt"/>
+ <text name="user_details">
+ Dies ist meine Second Life-Beschreibung und ich finde sie wirklich gut! Meine Beschreibung ist deshalb so lang, weil ich gerne rede.
+ </text>
+ <slider name="volume_slider" tool_tip="Lautstärke" value="0.5"/>
+ <button label="Freund hinzufügen" name="add_friend_btn" width="110"/>
+ <button label="IM" name="im_btn"/>
+ <button label="Profil" left_delta="120" name="view_profile_btn" width="44"/>
+ <panel name="moderator_panel">
+ <button label="Voice deaktivieren" name="disable_voice"/>
+ <button label="Voice aktivieren" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/de/inspect_object.xml b/indra/newview/skins/minimal/xui/de/inspect_object.xml
new file mode 100644
index 0000000000..72b8235828
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/inspect_object.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_object">
+ <string name="Creator">
+ Von [CREATOR]
+ </string>
+ <string name="CreatorAndOwner">
+ Von [CREATOR]
+Besitzer [OWNER]
+ </string>
+ <string name="Price">
+ [AMOUNT] L$
+ </string>
+ <string name="PriceFree">
+ Kostenlos!
+ </string>
+ <string name="Touch">
+ Berühren
+ </string>
+ <string name="Sit">
+ Sitzen
+ </string>
+ <text name="object_name" value="Test für ein Objektname der sehr lange ist und über zwei Zeilen geht."/>
+ <text name="object_creator">
+ von secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+Besitzer secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+ </text>
+ <text name="price_text">
+ 30.000 L$
+ </text>
+ <text name="object_description">
+ Dies ist eine wirklich lange Beschreibung für ein Objekt, mindestens 80 Zeichen lang oder jetzt schon mindestens 120 Zeichen lang und länger als der englische Originaltext. Niemand weiß es genau.
+ </text>
+ <text name="object_media_url">
+ http://www.superdupertest.com
+ </text>
+ <button label="Kaufen" name="buy_btn"/>
+ <button label="Bezahlen" name="pay_btn"/>
+ <button label="Kopie nehmen" name="take_free_copy_btn" width="100"/>
+ <button label="Berühren" name="touch_btn"/>
+ <button label="Sitzen" name="sit_btn"/>
+ <button label="Öffnen" name="open_btn"/>
+ <icon name="secure_browsing" tool_tip="Sicheres Browsen"/>
+ <button label="Mehr" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/de/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/de/menu_add_wearable_gear.xml
new file mode 100644
index 0000000000..f3775a05ec
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_add_wearable_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Add Wearable Gear Menu">
+ <menu_item_check label="Nach aktuellesten Objekten sortieren" name="sort_by_most_recent"/>
+ <menu_item_check label="Nach Name sortieren" name="sort_by_name"/>
+ <menu_item_check label="Nach Typ sortieren" name="sort_by_type"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/de/menu_attachment_other.xml
new file mode 100644
index 0000000000..237c92f7d2
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Profil anzeigen" name="Profile..."/>
+ <menu_item_call label="Freund hinzufügen" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Anrufen" name="Call"/>
+ <menu_item_call label="In Gruppe einladen" name="Invite..."/>
+ <menu_item_call label="Ignorieren" name="Avatar Mute"/>
+ <menu_item_call label="Melden" name="abuse"/>
+ <menu_item_call label="Einfrieren" name="Freeze..."/>
+ <menu_item_call label="Hinauswerfen" name="Eject..."/>
+ <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/>
+ <menu_item_call label="Hineinzoomen" name="Zoom In"/>
+ <menu_item_call label="Bezahlen" name="Pay..."/>
+ <menu_item_call label="Objektprofil" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/de/menu_attachment_self.xml
new file mode 100644
index 0000000000..644fc68ba4
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_attachment_self.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="Berühren" name="Attachment Object Touch"/>
+ <menu_item_call label="Bearbeiten" name="Edit..."/>
+ <menu_item_call label="Abnehmen" name="Detach"/>
+ <menu_item_call label="Hinsetzen" name="Sit Down Here"/>
+ <menu_item_call label="Aufstehen" name="Stand Up"/>
+ <menu_item_call label="Outfit ändern" name="Change Outfit"/>
+ <menu_item_call label="Mein Outfit bearbeiten" name="Edit Outfit"/>
+ <menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/>
+ <menu_item_call label="Meine Freunde" name="Friends..."/>
+ <menu_item_call label="Meine Gruppen" name="Groups..."/>
+ <menu_item_call label="Mein Profil" name="Profile..."/>
+ <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/>
+ <menu_item_call label="Fallen lassen" name="Drop"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/de/menu_avatar_icon.xml
new file mode 100644
index 0000000000..c036cf5515
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="Profil anzeigen" name="Show Profile"/>
+ <menu_item_call label="IM senden..." name="Send IM"/>
+ <menu_item_call label="Freund hinzufügen..." name="Add Friend"/>
+ <menu_item_call label="Freund entfernen..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/de/menu_avatar_other.xml
new file mode 100644
index 0000000000..8aee0be3d2
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Profil anzeigen" name="Profile..."/>
+ <menu_item_call label="Freund hinzufügen" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Anrufen" name="Call"/>
+ <menu_item_call label="In Gruppe einladen" name="Invite..."/>
+ <menu_item_call label="Ignorieren" name="Avatar Mute"/>
+ <menu_item_call label="Melden" name="abuse"/>
+ <menu_item_call label="Einfrieren" name="Freeze..."/>
+ <menu_item_call label="Hinauswerfen" name="Eject..."/>
+ <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/>
+ <menu_item_call label="Hineinzoomen" name="Zoom In"/>
+ <menu_item_call label="Bezahlen" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/de/menu_avatar_self.xml
new file mode 100644
index 0000000000..582c76ac94
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_avatar_self.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="Hinsetzen" name="Sit Down Here"/>
+ <menu_item_call label="Aufstehen" name="Stand Up"/>
+ <context_menu label="Ausziehen" name="Take Off &gt;">
+ <context_menu label="Kleidung" name="Clothes &gt;">
+ <menu_item_call label="Hemd" name="Shirt"/>
+ <menu_item_call label="Hose" name="Pants"/>
+ <menu_item_call label="Rock" name="Skirt"/>
+ <menu_item_call label="Schuhe" name="Shoes"/>
+ <menu_item_call label="Strümpfe" name="Socks"/>
+ <menu_item_call label="Jacke" name="Jacket"/>
+ <menu_item_call label="Handschuhe" name="Gloves"/>
+ <menu_item_call label="Unterhemd" name="Self Undershirt"/>
+ <menu_item_call label="Unterhose" name="Self Underpants"/>
+ <menu_item_call label="Tätowierung" name="Self Tattoo"/>
+ <menu_item_call label="Alpha" name="Self Alpha"/>
+ <menu_item_call label="Alle Kleider" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD" name="Object Detach HUD"/>
+ <context_menu label="Abnehmen" name="Object Detach"/>
+ <menu_item_call label="Alles abnehmen" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Outfit ändern" name="Chenge Outfit"/>
+ <menu_item_call label="Mein Outfit bearbeiten" name="Edit Outfit"/>
+ <menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/>
+ <menu_item_call label="Meine Freunde" name="Friends..."/>
+ <menu_item_call label="Meine Gruppen" name="Groups..."/>
+ <menu_item_call label="Mein Profil" name="Profile..."/>
+ <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/de/menu_bottomtray.xml
new file mode 100644
index 0000000000..6c4308286a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_bottomtray.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Schaltfläche Gesten" name="ShowGestureButton"/>
+ <menu_item_check label="Schaltfläche Bewegungssteuerung" name="ShowMoveButton"/>
+ <menu_item_check label="Schaltfläche Ansicht" name="ShowCameraButton"/>
+ <menu_item_check label="Schaltfläche Foto" name="ShowSnapshotButton"/>
+ <menu_item_check label="Schaltfläche „Seitenleiste“" name="ShowSidebarButton"/>
+ <menu_item_check label="Schaltfläche „Bauen“" name="ShowBuildButton"/>
+ <menu_item_check label="Schaltfläche „Suchen“" name="ShowSearchButton"/>
+ <menu_item_check label="Schaltfläche „Karte“" name="ShowWorldMapButton"/>
+ <menu_item_check label="Schaltfläche „Minikarte“" name="ShowMiniMapButton"/>
+ <menu_item_call label="Ausschneiden" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="Kopieren" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="Einfügen" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="Löschen" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="Alle auswählen" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/de/menu_cof_attachment.xml
new file mode 100644
index 0000000000..05d3dfca9d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_cof_attachment.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Attachment">
+ <menu_item_call label="Abnehmen" name="detach"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/de/menu_cof_body_part.xml
new file mode 100644
index 0000000000..07960a525c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_cof_body_part.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Body">
+ <menu_item_call label="Ersetzen" name="replace"/>
+ <menu_item_call label="Bearbeiten" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/de/menu_cof_clothing.xml
new file mode 100644
index 0000000000..7fced273a7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_cof_clothing.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Clothing">
+ <menu_item_call label="Ausziehen" name="take_off"/>
+ <menu_item_call label="Ersetzen" name="replace"/>
+ <menu_item_call label="Eine Kategorie nach oben" name="move_up"/>
+ <menu_item_call label="Eine Kategorie nach unten" name="move_down"/>
+ <menu_item_call label="Bearbeiten" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/de/menu_cof_gear.xml
new file mode 100644
index 0000000000..54b218d22f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear COF">
+ <menu label="Neue Kleider" name="COF.Gear.New_Clothes"/>
+ <menu label="Neue Körperteile" name="COF.Geear.New_Body_Parts"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_edit.xml b/indra/newview/skins/minimal/xui/de/menu_edit.xml
new file mode 100644
index 0000000000..37f68d68d5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_edit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu label="Bearbeiten" name="Edit">
+ <menu_item_call label="Rückgängig" name="Undo"/>
+ <menu_item_call label="Wiederherstellen" name="Redo"/>
+ <menu_item_call label="Ausschneiden" name="Cut"/>
+ <menu_item_call label="Kopieren" name="Copy"/>
+ <menu_item_call label="Einfügen" name="Paste"/>
+ <menu_item_call label="Löschen" name="Delete"/>
+ <menu_item_call label="Duplizieren" name="Duplicate"/>
+ <menu_item_call label="Alle auswählen" name="Select All"/>
+ <menu_item_call label="Auswahl aufheben" name="Deselect"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_favorites.xml b/indra/newview/skins/minimal/xui/de/menu_favorites.xml
new file mode 100644
index 0000000000..0d0491d2eb
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Teleportieren" name="Teleport To Landmark"/>
+ <menu_item_call label="Landmarken anzeigen/bearbeiten" name="Landmark Open"/>
+ <menu_item_call label="SLurl kopieren" name="Copy slurl"/>
+ <menu_item_call label="Auf Karte zeigen" name="Show On Map"/>
+ <menu_item_call label="Kopieren" name="Landmark Copy"/>
+ <menu_item_call label="Einfügen" name="Landmark Paste"/>
+ <menu_item_call label="Löschen" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/de/menu_gesture_gear.xml
new file mode 100644
index 0000000000..953c0eeed5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_gesture_gear.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gesture_gear">
+ <menu_item_call label="Zu Favoriten hinzufügen/daraus entfernen" name="activate"/>
+ <menu_item_call label="Kopieren" name="copy_gesture"/>
+ <menu_item_call label="Einfügen" name="paste"/>
+ <menu_item_call label="UUID kopieren" name="copy_uuid"/>
+ <menu_item_call label="Aktuelles Outfit speichern" name="save_to_outfit"/>
+ <menu_item_call label="Bearbeiten" name="edit_gesture"/>
+ <menu_item_call label="Untersuchen" name="inspect"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_group_plus.xml b/indra/newview/skins/minimal/xui/de/menu_group_plus.xml
new file mode 100644
index 0000000000..583ee793be
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Werden Sie Mitglied..." name="item_join"/>
+ <menu_item_call label="Neue Gruppe..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/de/menu_hide_navbar.xml
new file mode 100644
index 0000000000..9acf96dc6d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_hide_navbar.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="Navigationsleiste anzeigen" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Favoritenleiste anzeigen" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="Mini-Standortleiste anzeigen" name="ShowMiniLocationPanel"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/de/menu_im_well_button.xml
new file mode 100644
index 0000000000..f464b71f4a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_im_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="IM Well Button Context Menu">
+ <menu_item_call label="Alle schließen" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/de/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..11f93f47b4
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="Sitzung beenden" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/de/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..81ef3b6569
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="Gruppeninfo" name="Show Profile"/>
+ <menu_item_call label="Sitzung anzeigen" name="Chat"/>
+ <menu_item_call label="Sitzung beenden" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/de/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..d123238246
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="Profil anzeigen" name="Show Profile"/>
+ <menu_item_call label="Freund hinzufügen" name="Add Friend"/>
+ <menu_item_call label="Sitzung anzeigen" name="Send IM"/>
+ <menu_item_call label="Sitzung beenden" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/de/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..fbc119c483
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_inspect_avatar_gear.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="Profil anzeigen" name="view_profile"/>
+ <menu_item_call label="Freund hinzufügen" name="add_friend"/>
+ <menu_item_call label="IM" name="im"/>
+ <menu_item_call label="Teleportieren" name="teleport"/>
+ <menu_item_call label="Ignorieren" name="block"/>
+ <menu_item_call label="Freischalten" name="unblock"/>
+ <menu_item_call label="Melden" name="report"/>
+ <menu_item_call label="Einfrieren" name="freeze"/>
+ <menu_item_call label="Hinauswerfen" name="eject"/>
+ <menu_item_call label="Hinauswerfen" name="kick"/>
+ <menu_item_call label="CSR" name="csr"/>
+ <menu_item_call label="Fehler in Texturen beseitigen" name="debug"/>
+ <menu_item_call label="Auf Karte anzeigen" name="find_on_map"/>
+ <menu_item_call label="Hineinzoomen" name="zoom_in"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/de/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..7c47913e30
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_inspect_object_gear.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Berühren" name="touch"/>
+ <menu_item_call label="Sitzen" name="sit"/>
+ <menu_item_call label="Bezahlen" name="pay"/>
+ <menu_item_call label="Kaufen" name="buy"/>
+ <menu_item_call label="Nehmen" name="take"/>
+ <menu_item_call label="Kopie nehmen" name="take_copy"/>
+ <menu_item_call label="Öffnen" name="open"/>
+ <menu_item_call label="Bearbeiten" name="edit"/>
+ <menu_item_call label="Anziehen" name="wear"/>
+ <menu_item_call label="Hinzufügen" name="add"/>
+ <menu_item_call label="Melden" name="report"/>
+ <menu_item_call label="Ignorieren" name="block"/>
+ <menu_item_call label="Hineinzoomen" name="zoom_in"/>
+ <menu_item_call label="Entfernen" name="remove"/>
+ <menu_item_call label="Weitere Infos" name="more_info"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/de/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..851a96cc09
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_inspect_self_gear.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Hinsetzen" name="sit_down_here"/>
+ <menu_item_call label="Aufstehen" name="stand_up"/>
+ <menu_item_call label="Outfit ändern" name="change_outfit"/>
+ <menu_item_call label="Mein Profil" name="my_profile"/>
+ <menu_item_call label="Meine Freunde" name="my_friends"/>
+ <menu_item_call label="Meine Gruppen" name="my_groups"/>
+ <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/de/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..71cff7136b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_inv_offer_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="InvOfferChiclet Menu">
+ <menu_item_call label="Schließen" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_inventory.xml b/indra/newview/skins/minimal/xui/de/menu_inventory.xml
new file mode 100644
index 0000000000..43722e0dcf
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_inventory.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Teilen" name="Share"/>
+ <menu_item_call label="Kaufen" name="Task Buy"/>
+ <menu_item_call label="Öffnen" name="Task Open"/>
+ <menu_item_call label="Abspielen" name="Task Play"/>
+ <menu_item_call label="Eigenschaften" name="Task Properties"/>
+ <menu_item_call label="Umbenennen" name="Task Rename"/>
+ <menu_item_call label="Löschen" name="Task Remove"/>
+ <menu_item_call label="Papierkorb ausleeren" name="Empty Trash"/>
+ <menu_item_call label="Fundstücke ausleeren" name="Empty Lost And Found"/>
+ <menu_item_call label="Neuer Ordner" name="New Folder"/>
+ <menu_item_call label="Neues Skript" name="New Script"/>
+ <menu_item_call label="Neue Notizkarte" name="New Note"/>
+ <menu_item_call label="Neue Geste" name="New Gesture"/>
+ <menu label="Neue Kleider" name="New Clothes">
+ <menu_item_call label="Neues Hemd" name="New Shirt"/>
+ <menu_item_call label="Neue Hose" name="New Pants"/>
+ <menu_item_call label="Neue Schuhe" name="New Shoes"/>
+ <menu_item_call label="Neue Socken" name="New Socks"/>
+ <menu_item_call label="Neue Jacke" name="New Jacket"/>
+ <menu_item_call label="Neuer Rock" name="New Skirt"/>
+ <menu_item_call label="Neue Handschuhe" name="New Gloves"/>
+ <menu_item_call label="Neues Unterhemd" name="New Undershirt"/>
+ <menu_item_call label="Neue Unterhose" name="New Underpants"/>
+ <menu_item_call label="Neue Alpha-Maske" name="New Alpha Mask"/>
+ <menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
+ </menu>
+ <menu label="Neue Körperteile" name="New Body Parts">
+ <menu_item_call label="Neue Form/Gestalt" name="New Shape"/>
+ <menu_item_call label="Neue Haut" name="New Skin"/>
+ <menu_item_call label="Neues Haar" name="New Hair"/>
+ <menu_item_call label="Neue Augen" name="New Eyes"/>
+ </menu>
+ <menu label="Typ ändern" name="Change Type">
+ <menu_item_call label="Standard" name="Default"/>
+ <menu_item_call label="Handschuhe" name="Gloves"/>
+ <menu_item_call label="Jacke" name="Jacket"/>
+ <menu_item_call label="Hose" name="Pants"/>
+ <menu_item_call label="Form" name="Shape"/>
+ <menu_item_call label="Schuhe" name="Shoes"/>
+ <menu_item_call label="Hemd" name="Shirt"/>
+ <menu_item_call label="Rock" name="Skirt"/>
+ <menu_item_call label="Unterhose" name="Underpants"/>
+ <menu_item_call label="Unterhemd" name="Undershirt"/>
+ </menu>
+ <menu_item_call label="Teleportieren" name="Landmark Open"/>
+ <menu_item_call label="Öffnen" name="Animation Open"/>
+ <menu_item_call label="Öffnen" name="Sound Open"/>
+ <menu_item_call label="Aktuelles Outfit ersetzen" name="Replace Outfit"/>
+ <menu_item_call label="Zum aktuellen Outfit hinzufügen" name="Add To Outfit"/>
+ <menu_item_call label="Vom aktuellen Outfit entfernen" name="Remove From Outfit"/>
+ <menu_item_call label="Original suchen" name="Find Original"/>
+ <menu_item_call label="Objekt löschen" name="Purge Item"/>
+ <menu_item_call label="Objekt wiederherstellen" name="Restore Item"/>
+ <menu_item_call label="Öffnen" name="Open"/>
+ <menu_item_call label="Original öffnen" name="Open Original"/>
+ <menu_item_call label="Eigenschaften" name="Properties"/>
+ <menu_item_call label="Umbenennen" name="Rename"/>
+ <menu_item_call label="Asset-UUID kopieren" name="Copy Asset UUID"/>
+ <menu_item_call label="Kopieren" name="Copy"/>
+ <menu_item_call label="Einfügen" name="Paste"/>
+ <menu_item_call label="Als Link einfügen" name="Paste As Link"/>
+ <menu_item_call label="Löschen" name="Remove Link"/>
+ <menu_item_call label="Löschen" name="Delete"/>
+ <menu_item_call label="Systemordner löschen" name="Delete System Folder"/>
+ <menu_item_call label="Konferenz-Chat starten" name="Conference Chat Folder"/>
+ <menu_item_call label="Wiedergeben/Abspielen" name="Sound Play"/>
+ <menu_item_call label="Landmarken-Info" name="About Landmark"/>
+ <menu_item_call label="Inworld abspielen" name="Animation Play"/>
+ <menu_item_call label="Lokal abspielen" name="Animation Audition"/>
+ <menu_item_call label="Instant Message senden" name="Send Instant Message"/>
+ <menu_item_call label="Teleport anbieten..." name="Offer Teleport..."/>
+ <menu_item_call label="Konferenz-Chat starten" name="Conference Chat"/>
+ <menu_item_call label="Aktivieren" name="Activate"/>
+ <menu_item_call label="Deaktivieren" name="Deactivate"/>
+ <menu_item_call label="Speichern unter" name="Save As"/>
+ <menu_item_call label="Von Körper abnehmen" name="Detach From Yourself"/>
+ <menu_item_call label="Anziehen" name="Wearable And Object Wear"/>
+ <menu label="Anhängen an" name="Attach To"/>
+ <menu label="An HUD hängen" name="Attach To HUD"/>
+ <menu_item_call label="Bearbeiten" name="Wearable Edit"/>
+ <menu_item_call label="Hinzufügen" name="Wearable Add"/>
+ <menu_item_call label="Ausziehen" name="Take Off"/>
+ <menu_item_call label="--keine Optionen--" name="--no options--"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/de/menu_inventory_add.xml
new file mode 100644
index 0000000000..dccee6712d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_inventory_add.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="Hochladen" name="upload">
+ <menu_item_call label="Bild ([COST] L$)..." name="Upload Image"/>
+ <menu_item_call label="Sound ([COST] L$)..." name="Upload Sound"/>
+ <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="Mehrfach-Upload ([COST] L$ pro Datei)..." name="Bulk Upload"/>
+ <menu_item_call label="Hochlade-Berechtigungen (Standard) festlegen" name="perm prefs"/>
+ </menu>
+ <menu_item_call label="Neuer Ordner" name="New Folder"/>
+ <menu_item_call label="Neues Skript" name="New Script"/>
+ <menu_item_call label="Neue Notizkarte" name="New Note"/>
+ <menu_item_call label="Neue Geste" name="New Gesture"/>
+ <menu label="Neue Kleider" name="New Clothes">
+ <menu_item_call label="Neues Hemd" name="New Shirt"/>
+ <menu_item_call label="Neue Hose" name="New Pants"/>
+ <menu_item_call label="Neue Schuhe" name="New Shoes"/>
+ <menu_item_call label="Neue Socken" name="New Socks"/>
+ <menu_item_call label="Neue Jacke" name="New Jacket"/>
+ <menu_item_call label="Neuer Rock" name="New Skirt"/>
+ <menu_item_call label="Neue Handschuhe" name="New Gloves"/>
+ <menu_item_call label="Neues Unterhemd" name="New Undershirt"/>
+ <menu_item_call label="Neue Unterhose" name="New Underpants"/>
+ <menu_item_call label="Neues Alpha" name="New Alpha"/>
+ <menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
+ </menu>
+ <menu label="Neue Körperteile" name="New Body Parts">
+ <menu_item_call label="Neue Form/Gestalt" name="New Shape"/>
+ <menu_item_call label="Neue Haut" name="New Skin"/>
+ <menu_item_call label="Neues Haar" name="New Hair"/>
+ <menu_item_call label="Neue Augen" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/de/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..df86a5cf71
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_inventory_gear_default.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_gear_default">
+ <menu_item_call label="Neues Inventar-Fenster" name="new_window"/>
+ <menu_item_check label="Nach Name sortieren" name="sort_by_name"/>
+ <menu_item_check label="Nach aktuellesten Objekten sortieren" name="sort_by_recent"/>
+ <menu_item_check label="Systemordner nach oben" name="sort_system_folders_to_top"/>
+ <menu_item_call label="Filter anzeigen" name="show_filters"/>
+ <menu_item_call label="Filter zurücksetzen" name="reset_filters"/>
+ <menu_item_call label="Alle Ordner schließen" name="close_folders"/>
+ <menu_item_call label="Fundbüro ausleeren" name="empty_lostnfound"/>
+ <menu_item_call label="Textur speichern als" name="Save Texture As"/>
+ <menu_item_call label="Teilen" name="Share"/>
+ <menu_item_call label="Original suchen" name="Find Original"/>
+ <menu_item_call label="Alle Links suchen" name="Find All Links"/>
+ <menu_item_call label="Papierkorb ausleeren" name="empty_trash"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_land.xml b/indra/newview/skins/minimal/xui/de/menu_land.xml
new file mode 100644
index 0000000000..de679da3d8
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="Land-Info" name="Place Information..."/>
+ <menu_item_call label="Hier sitzen" name="Sit Here"/>
+ <menu_item_call label="Dieses Land kaufen" name="Land Buy"/>
+ <menu_item_call label="Pass kaufen" name="Land Buy Pass"/>
+ <menu_item_call label="Bauen" name="Create"/>
+ <menu_item_call label="Land bearbeiten" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_landmark.xml b/indra/newview/skins/minimal/xui/de/menu_landmark.xml
new file mode 100644
index 0000000000..2aff0eec95
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="SLurl kopieren" name="copy"/>
+ <menu_item_call label="Löschen" name="delete"/>
+ <menu_item_call label="Auswahl erstellen" name="pick"/>
+ <menu_item_call label="Zu Favoritenleiste hinzufügen" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_login.xml b/indra/newview/skins/minimal/xui/de/menu_login.xml
new file mode 100644
index 0000000000..a373e15338
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_login.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Login Menu">
+ <menu label="Ich" name="File">
+ <menu_item_call label="Einstellungen" name="Preferences..."/>
+ <menu_item_call label="[APP_NAME] schließen" name="Quit"/>
+ </menu>
+ <menu label="Hilfe" name="Help">
+ <menu_item_call label="[SECOND_LIFE]-Hilfe" name="Second Life Help"/>
+ <menu_item_call label="INFO ÜBER [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu_item_check label="Debug-Menü anzeigen" name="Show Debug Menu"/>
+ <menu label="Debug" name="Debug">
+ <menu_item_call label="Debug-Einstellungen anzeigen" name="Debug Settings"/>
+ <menu_item_call label="UI/Farb-Einstellungen" name="UI/Color Settings"/>
+ <menu_item_call label="XUI-Editor" name="UI Preview Tool"/>
+ <menu label="UI-Tests" name="UI Tests"/>
+ <menu_item_call label="Fenstergröße einstellen..." name="Set Window Size..."/>
+ <menu_item_call label="Servicebedingungen anzeigen" name="TOS"/>
+ <menu_item_call label="Wichtige Meldung anzeigen" name="Critical"/>
+ <menu_item_call label="Test Medienbrowser" name="Web Browser Test"/>
+ <menu_item_call label="Test Webinhalt-Floater" name="Web Content Floater Test"/>
+ <menu_item_check label="Grid-Auswahl anzeigen" name="Show Grid Picker"/>
+ <menu_item_call label="Benachrichtigungs-Konsole anzeigen" name="Show Notifications Console"/>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/de/menu_mini_map.xml b/indra/newview/skins/minimal/xui/de/menu_mini_map.xml
new file mode 100644
index 0000000000..2e0d72c40c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_mini_map.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Zoom Nah" name="Zoom Close"/>
+ <menu_item_call label="Zoom Mittel" name="Zoom Medium"/>
+ <menu_item_call label="Zoom Weit" name="Zoom Far"/>
+ <menu_item_call label="Zoom-Standard" name="Zoom Default"/>
+ <menu_item_check label="Karte drehen" name="Rotate Map"/>
+ <menu_item_check label="Automatisch zentrieren" name="Auto Center"/>
+ <menu_item_call label="Verfolgung abschalten" name="Stop Tracking"/>
+ <menu_item_call label="Weltkarte" name="World Map"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_navbar.xml b/indra/newview/skins/minimal/xui/de/menu_navbar.xml
new file mode 100644
index 0000000000..5175f34b41
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="Koordinaten anzeigen" name="Show Coordinates"/>
+ <menu_item_check label="Parzelleneigenschaften anzeigen" name="Show Parcel Properties"/>
+ <menu_item_call label="Landmarke" name="Landmark"/>
+ <menu_item_call label="Ausschneiden" name="Cut"/>
+ <menu_item_call label="Kopieren" name="Copy"/>
+ <menu_item_call label="Einfügen" name="Paste"/>
+ <menu_item_call label="Löschen" name="Delete"/>
+ <menu_item_call label="Alle auswählen" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/de/menu_nearby_chat.xml
new file mode 100644
index 0000000000..99d6428c3f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="Leute in der Nähe anzeigen..." name="nearby_people"/>
+ <menu_item_check label="Ignorierten Text anzeigen" name="muted_text"/>
+ <menu_item_check label="Bilder von Freunden anzeigen" name="show_buddy_icons"/>
+ <menu_item_check label="Namen anzeigen" name="show_names"/>
+ <menu_item_check label="Namen und Symbole anzeigen" name="show_icons_and_names"/>
+ <menu_item_call label="Schriftgröße" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/de/menu_notification_well_button.xml
new file mode 100644
index 0000000000..0f2784f160
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_notification_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Notification Well Button Context Menu">
+ <menu_item_call label="Alle schließen" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_object.xml b/indra/newview/skins/minimal/xui/de/menu_object.xml
new file mode 100644
index 0000000000..19057d4228
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_object.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="Berühren" name="Object Touch">
+ <menu_item_call.on_enable name="EnableTouch" parameter="Berühren"/>
+ </menu_item_call>
+ <menu_item_call label="Bearbeiten" name="Edit..."/>
+ <menu_item_call label="Bauen" name="Build"/>
+ <menu_item_call label="Öffnen" name="Open"/>
+ <menu_item_call label="Hier sitzen" name="Object Sit"/>
+ <menu_item_call label="Aufstehen" name="Object Stand Up"/>
+ <menu_item_call label="Objektprofil" name="Object Inspect"/>
+ <menu_item_call label="Hineinzoomen" name="Zoom In"/>
+ <context_menu label="Anziehen" name="Put On">
+ <menu_item_call label="Anziehen" name="Wear"/>
+ <menu_item_call label="Hinzufügen" name="Add"/>
+ <context_menu label="Anhängen" name="Object Attach"/>
+ <context_menu label="HUD anhängen" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="Entfernen" name="Remove">
+ <menu_item_call label="Missbrauch melden" name="Report Abuse..."/>
+ <menu_item_call label="Ignorieren" name="Object Mute"/>
+ <menu_item_call label="Zurückgeben" name="Return..."/>
+ <menu_item_call label="Löschen" name="Delete"/>
+ </context_menu>
+ <menu_item_call label="Nehmen" name="Pie Object Take"/>
+ <menu_item_call label="Kopie nehmen" name="Take Copy"/>
+ <menu_item_call label="Bezahlen" name="Pay..."/>
+ <menu_item_call label="Kaufen" name="Buy..."/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_object_icon.xml b/indra/newview/skins/minimal/xui/de/menu_object_icon.xml
new file mode 100644
index 0000000000..8b6c558416
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="Objektprofil..." name="Object Profile"/>
+ <menu_item_call label="Ignorieren..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/de/menu_outfit_gear.xml
new file mode 100644
index 0000000000..897154ec56
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_outfit_gear.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear Outfit">
+ <menu_item_call label="Anziehen - Aktuelles Outfit ersetzen" name="wear"/>
+ <menu_item_call label="Anziehen - Aktuelles Outfit hinzufügen" name="wear_add"/>
+ <menu_item_call label="Ausziehen - Aus aktuellem Outfit entfernen" name="take_off"/>
+ <menu label="Neue Kleider" name="New Clothes">
+ <menu_item_call label="Neues Hemd" name="New Shirt"/>
+ <menu_item_call label="Neue Hose" name="New Pants"/>
+ <menu_item_call label="Neue Schuhe" name="New Shoes"/>
+ <menu_item_call label="Neue Socken" name="New Socks"/>
+ <menu_item_call label="Neue Jacke" name="New Jacket"/>
+ <menu_item_call label="Neuer Rock" name="New Skirt"/>
+ <menu_item_call label="Neue Handschuhe" name="New Gloves"/>
+ <menu_item_call label="Neues Unterhemd" name="New Undershirt"/>
+ <menu_item_call label="Neue Unterhose" name="New Underpants"/>
+ <menu_item_call label="Neues Alpha" name="New Alpha"/>
+ <menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
+ </menu>
+ <menu label="Neue Körperteile" name="New Body Parts">
+ <menu_item_call label="Neue Form" name="New Shape"/>
+ <menu_item_call label="Neue Haut" name="New Skin"/>
+ <menu_item_call label="Neues Haar" name="New Hair"/>
+ <menu_item_call label="Neue Augen" name="New Eyes"/>
+ </menu>
+ <menu_item_call label="Outfit neu benennen" name="rename"/>
+ <menu_item_call label="Outfit löschen" name="delete_outfit"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/de/menu_outfit_tab.xml
new file mode 100644
index 0000000000..32a65c96fc
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_outfit_tab.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit">
+ <menu_item_call label="Anziehen - Aktuelles Outfit ersetzen" name="wear_replace"/>
+ <menu_item_call label="Anziehen - Aktuelles Outfit hinzufügen" name="wear_add"/>
+ <menu_item_call label="Ausziehen - Aus aktuellem Outfit entfernen" name="take_off"/>
+ <menu_item_call label="Outfit bearbeiten" name="edit"/>
+ <menu_item_call label="Outfit neu benennen" name="rename"/>
+ <menu_item_call label="Outfit löschen" name="delete"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_participant_list.xml b/indra/newview/skins/minimal/xui/de/menu_participant_list.xml
new file mode 100644
index 0000000000..160f2f97be
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_participant_list.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_check label="Nach Name sortieren" name="SortByName"/>
+ <menu_item_check label="Nach letzten Sprechern sortieren" name="SortByRecentSpeakers"/>
+ <menu_item_call label="Profil anzeigen" name="View Profile"/>
+ <menu_item_call label="Freund hinzufügen" name="Add Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Anrufen" name="Call"/>
+ <menu_item_call label="Teilen" name="Share"/>
+ <menu_item_call label="Bezahlen" name="Pay"/>
+ <menu_item_check label="Symbole für Personen anzeigen" name="View Icons"/>
+ <menu_item_check label="Voice ignorieren" name="Block/Unblock"/>
+ <menu_item_check label="Text ignorieren" name="MuteText"/>
+ <context_menu label="Moderator-Optionen" name="Moderator Options">
+ <menu_item_check label="Text-Chat zulassen" name="AllowTextChat"/>
+ <menu_item_call label="Diesen Teilnehmer stummschalten" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Stummschaltung für diesen Teilnehmer aufheben" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Alle stummschalten" name="ModerateVoiceMute"/>
+ <menu_item_call label="Alle freischalten" name="ModerateVoiceUnmute"/>
+ </context_menu>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/de/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..84d9d8938c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_people_friends_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Nach Name sortieren" name="sort_name"/>
+ <menu_item_check label="Nach Status sortieren" name="sort_status"/>
+ <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/>
+ <menu_item_check label="Erteilte Genehmigungen anzeigen" name="view_permissions"/>
+ <menu_item_call label="Ignorierte Einwohner &amp; Objekte anzeigen" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_people_groups.xml b/indra/newview/skins/minimal/xui/de/menu_people_groups.xml
new file mode 100644
index 0000000000..76225ba241
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_people_groups.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Info anzeigen" name="View Info"/>
+ <menu_item_call label="Chat" name="Chat"/>
+ <menu_item_call label="Anrufen" name="Call"/>
+ <menu_item_call label="Aktivieren" name="Activate"/>
+ <menu_item_call label="Verlassen" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/de/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..b68597d8aa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Gruppensymbole anzeigen" name="Display Group Icons"/>
+ <menu_item_call label="Ausgewählte Gruppe verlassen" name="Leave Selected Group"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/de/menu_people_nearby.xml
new file mode 100644
index 0000000000..1db964357f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_people_nearby.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="Profil anzeigen" name="View Profile"/>
+ <menu_item_call label="Freund hinzufügen" name="Add Friend"/>
+ <menu_item_call label="Freund entfernen" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Anrufen" name="Call"/>
+ <menu_item_call label="Karte" name="Map"/>
+ <menu_item_call label="Teilen" name="Share"/>
+ <menu_item_call label="Bezahlen" name="Pay"/>
+ <menu_item_check label="Ignorieren/Freischalten" name="Block/Unblock"/>
+ <menu_item_call label="Teleport anbieten" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/de/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..b6e99edfe1
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_people_nearby_multiselect.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="Freunde hinzufügen" name="Add Friends"/>
+ <menu_item_call label="Freunde entfernen" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Anrufen" name="Call"/>
+ <menu_item_call label="Teilen" name="Share"/>
+ <menu_item_call label="Bezahlen" name="Pay"/>
+ <menu_item_call label="Teleport anbieten" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/de/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..0f252ab46d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Nach letzten Sprechern sortieren" name="sort_by_recent_speakers"/>
+ <menu_item_check label="Nach Name sortieren" name="sort_name"/>
+ <menu_item_check label="Nach Entfernung sortieren" name="sort_distance"/>
+ <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/>
+ <menu_item_call label="Ignorierte Einwohner &amp; Objekte anzeigen" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/de/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..1ef020f5e1
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Nach aktuellesten Sprechern sortieren" name="sort_most"/>
+ <menu_item_check label="Nach Name sortieren" name="sort_name"/>
+ <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/>
+ <menu_item_call label="Ignorierte Einwohner &amp; Objekte anzeigen" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_picks.xml b/indra/newview/skins/minimal/xui/de/menu_picks.xml
new file mode 100644
index 0000000000..9aec4c83b0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="Info" name="pick_info"/>
+ <menu_item_call label="Bearbeiten" name="pick_edit"/>
+ <menu_item_call label="Teleportieren" name="pick_teleport"/>
+ <menu_item_call label="Karte" name="pick_map"/>
+ <menu_item_call label="Löschen" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/de/menu_picks_plus.xml
new file mode 100644
index 0000000000..385ff25b95
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="Neue Auswahl" name="create_pick"/>
+ <menu_item_call label="Neue Anzeige" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_place.xml b/indra/newview/skins/minimal/xui/de/menu_place.xml
new file mode 100644
index 0000000000..d9c85f5b92
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_place.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="Eine Landmarke setzen" name="landmark"/>
+ <menu_item_call label="Auswahl erstellen" name="pick"/>
+ <menu_item_call label="Pass kaufen" name="pass"/>
+ <menu_item_call label="Bearbeiten" name="edit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/de/menu_place_add_button.xml
new file mode 100644
index 0000000000..7c0ff4a46a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Ordner hinzufügen" name="add_folder"/>
+ <menu_item_call label="Landmarke hinzufügen" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/de/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..132d3f6466
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_places_gear_folder.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Landmarke hinzufügen" name="add_landmark"/>
+ <menu_item_call label="Ordner hinzufügen" name="add_folder"/>
+ <menu_item_call label="Ausschneiden" name="cut"/>
+ <menu_item_call label="Kopieren" name="copy_folder"/>
+ <menu_item_call label="Einfügen" name="paste"/>
+ <menu_item_call label="Umbenennen" name="rename"/>
+ <menu_item_call label="Löschen" name="delete"/>
+ <menu_item_call label="Erweitern Sie sich" name="expand"/>
+ <menu_item_call label="Zuklappen" name="collapse"/>
+ <menu_item_call label="Alle Ordner aufklappen" name="expand_all"/>
+ <menu_item_call label="Alle Ordner schließen" name="collapse_all"/>
+ <menu_item_check label="Nach Datum sortieren" name="sort_by_date"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/de/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..6af4d644af
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_places_gear_landmark.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_ladmark_gear">
+ <menu_item_call label="Teleportieren" name="teleport"/>
+ <menu_item_call label="Weitere Informationen" name="more_info"/>
+ <menu_item_call label="Auf Karte zeigen" name="show_on_map"/>
+ <menu_item_call label="Landmarke hinzufügen" name="add_landmark"/>
+ <menu_item_call label="Ordner hinzufügen" name="add_folder"/>
+ <menu_item_call label="Ausschneiden" name="cut"/>
+ <menu_item_call label="Landmarke kopieren" name="copy_landmark"/>
+ <menu_item_call label="SLurl kopieren" name="copy_slurl"/>
+ <menu_item_call label="Einfügen" name="paste"/>
+ <menu_item_call label="Umbenennen" name="rename"/>
+ <menu_item_call label="Löschen" name="delete"/>
+ <menu_item_call label="Alle Ordner aufklappen" name="expand_all"/>
+ <menu_item_call label="Alle Ordner schließen" name="collapse_all"/>
+ <menu_item_check label="Nach Datum sortieren" name="sort_by_date"/>
+ <menu_item_call label="Auswahl erstellen" name="create_pick"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/de/menu_profile_overflow.xml
new file mode 100644
index 0000000000..9f3fcbca1d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_profile_overflow.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Karte" name="show_on_map"/>
+ <menu_item_call label="Bezahlen" name="pay"/>
+ <menu_item_call label="Teilen" name="share"/>
+ <menu_item_call label="Ignorieren" name="block"/>
+ <menu_item_call label="Freischalten" name="unblock"/>
+ <menu_item_call label="Hinauswerfen" name="kick"/>
+ <menu_item_call label="Einfrieren" name="freeze"/>
+ <menu_item_call label="Auftauen" name="unfreeze"/>
+ <menu_item_call label="CSR" name="csr"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/de/menu_save_outfit.xml
new file mode 100644
index 0000000000..986c78b318
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_save_outfit.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="save_outfit_menu">
+ <menu_item_call label="Speichern" name="save_outfit"/>
+ <menu_item_call label="Speichern unter" name="save_as_new_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/de/menu_script_chiclet.xml
new file mode 100644
index 0000000000..3256aa1a87
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_script_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="ScriptChiclet Menu">
+ <menu_item_call label="Schließen" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_slurl.xml b/indra/newview/skins/minimal/xui/de/menu_slurl.xml
new file mode 100644
index 0000000000..b2ec017f9f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_slurl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="URL-Info" name="about_url"/>
+ <menu_item_call label="Zu URL teleportieren" name="teleport_to_url"/>
+ <menu_item_call label="Karte" name="show_on_map"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/de/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..68b8e21802
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="Alle Ordner aufklappen" name="Expand all folders"/>
+ <menu_item_call label="Alle Ordner schließen" name="Collapse all folders"/>
+ <menu_item_call label="Teleport-Liste löschen" name="Clear Teleport History"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/de/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..ff8fb0b181
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Teleportieren" name="Teleport"/>
+ <menu_item_call label="Weitere Informationen" name="More Information"/>
+ <menu_item_call label="In Zwischenablage kopieren" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/de/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..194dd16fd1
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Öffnen" name="TabOpen"/>
+ <menu_item_call label="Schließen" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_text_editor.xml b/indra/newview/skins/minimal/xui/de/menu_text_editor.xml
new file mode 100644
index 0000000000..c00186c13e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="Ausschneiden" name="Cut"/>
+ <menu_item_call label="Kopieren" name="Copy"/>
+ <menu_item_call label="Einfügen" name="Paste"/>
+ <menu_item_call label="Löschen" name="Delete"/>
+ <menu_item_call label="Alle auswählen" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/de/menu_topinfobar.xml
new file mode 100644
index 0000000000..5b0a724244
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_topinfobar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_topinfobar">
+ <menu_item_check label="Koordinaten anzeigen" name="Show Coordinates"/>
+ <menu_item_check label="Parzellen-Eigenschaften anzeigen" name="Show Parcel Properties"/>
+ <menu_item_call label="Landmarke" name="Landmark"/>
+ <menu_item_call label="Kopieren" name="Copy"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_url_agent.xml b/indra/newview/skins/minimal/xui/de/menu_url_agent.xml
new file mode 100644
index 0000000000..9a808088fb
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Einwohnerprofil anzeigen" name="show_agent"/>
+ <menu_item_call label="Name in Zwischenablage kopieren" name="url_copy_label"/>
+ <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_url_group.xml b/indra/newview/skins/minimal/xui/de/menu_url_group.xml
new file mode 100644
index 0000000000..6bd86414bc
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Gruppeninformation anzeigen" name="show_group"/>
+ <menu_item_call label="Gruppe in Zwischenablage kopieren" name="url_copy_label"/>
+ <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_url_http.xml b/indra/newview/skins/minimal/xui/de/menu_url_http.xml
new file mode 100644
index 0000000000..30eb1668a5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Webseite öffnen" name="url_open"/>
+ <menu_item_call label="Im internen Browser öffnen" name="url_open_internal"/>
+ <menu_item_call label="Im externen Browser öffnen" name="url_open_external"/>
+ <menu_item_call label="URL in Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/de/menu_url_inventory.xml
new file mode 100644
index 0000000000..dc069df02b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Inventarobjekte anzeigen" name="show_item"/>
+ <menu_item_call label="Name in Zwischenablage kopieren" name="url_copy_label"/>
+ <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_url_map.xml b/indra/newview/skins/minimal/xui/de/menu_url_map.xml
new file mode 100644
index 0000000000..2f6ffcd450
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Auf Karte zeigen" name="show_on_map"/>
+ <menu_item_call label="Zu Position teleportieren" name="teleport_to_location"/>
+ <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/de/menu_url_objectim.xml
new file mode 100644
index 0000000000..90d3763d9c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Objektinformationen anzeigen" name="show_object"/>
+ <menu_item_call label="Auf Karte zeigen" name="show_on_map"/>
+ <menu_item_call label="Zu Objekt-Position teleportieren" name="teleport_to_object"/>
+ <menu_item_call label="Objektname in Zwischenablage kopieren" name="url_copy_label"/>
+ <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/de/menu_url_parcel.xml
new file mode 100644
index 0000000000..9169bca24f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Parzelleninformationen anzeigen" name="show_parcel"/>
+ <menu_item_call label="Auf Karte zeigen" name="show_on_map"/>
+ <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/de/menu_url_slapp.xml
new file mode 100644
index 0000000000..72e916b902
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Diesen Befehl ausführen" name="run_slapp"/>
+ <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/de/menu_url_slurl.xml
new file mode 100644
index 0000000000..5d48230ebf
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Ortsinformationen anzeigen" name="show_place"/>
+ <menu_item_call label="Auf Karte zeigen" name="show_on_map"/>
+ <menu_item_call label="Zu Position teleportieren" name="teleport_to_location"/>
+ <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/de/menu_url_teleport.xml
new file mode 100644
index 0000000000..4cc1ecc70e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="An diesen Standort teleportieren" name="teleport"/>
+ <menu_item_call label="Auf Karte zeigen" name="show_on_map"/>
+ <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_viewer.xml b/indra/newview/skins/minimal/xui/de/menu_viewer.xml
new file mode 100644
index 0000000000..67dc618eb0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_viewer.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Main Menu">
+ <menu label="Hilfe" name="Help">
+ <menu_item_call label="[SECOND_LIFE]-Hilfe" name="Second Life Help"/>
+ </menu>
+ <menu label="Erweitert" name="Advanced">
+ <menu label="Tastaturkürzel" name="Shortcuts">
+ <menu_item_check label="Fliegen" name="Fly"/>
+ <menu_item_call label="Fenster schließen" name="Close Window"/>
+ <menu_item_call label="Alle Fenster schließen" name="Close All Windows"/>
+ <menu_item_call label="Ansicht zurücksetzen" name="Reset View"/>
+ </menu>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/de/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/de/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..283e454a06
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_wearable_list_item.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit Wearable Context Menu">
+ <menu_item_call label="Ersetzen" name="wear_replace"/>
+ <menu_item_call label="Anziehen" name="wear_wear"/>
+ <menu_item_call label="Hinzufügen" name="wear_add"/>
+ <menu_item_call label="Ausziehen / Abnehmen" name="take_off_or_detach"/>
+ <menu_item_call label="Abnehmen" name="detach"/>
+ <context_menu label="Anhängen an" name="wearable_attach_to"/>
+ <context_menu label="An HUD hängen" name="wearable_attach_to_hud"/>
+ <menu_item_call label="Ausziehen" name="take_off"/>
+ <menu_item_call label="Bearbeiten" name="edit"/>
+ <menu_item_call label="Objektprofil" name="object_profile"/>
+ <menu_item_call label="Original anzeigen" name="show_original"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/de/menu_wearing_gear.xml
new file mode 100644
index 0000000000..80d4ff4d9f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_wearing_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear Wearing">
+ <menu_item_call label="Outfit bearbeiten" name="edit"/>
+ <menu_item_call label="Ausziehen" name="takeoff"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/de/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/de/menu_wearing_tab.xml
new file mode 100644
index 0000000000..695451a105
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/menu_wearing_tab.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Wearing">
+ <menu_item_call label="Ausziehen" name="take_off"/>
+ <menu_item_call label="Abnehmen" name="detach"/>
+ <menu_item_call label="Outfit bearbeiten" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml
new file mode 100644
index 0000000000..ea7cccbdf8
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
+ <string name="SpeakBtnToolTip" value="Schaltet Mikrofon ein/aus"/>
+ <string name="VoiceControlBtnToolTip" value="Voice-Chat-Steuerung anzeigen/ausblenden"/>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Gesten" name="Gesture" tool_tip="Gesten anzeigen/ausblenden"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <bottomtray_button label="Ansicht" name="camera_btn" tool_tip="Kamerasteuerung anzeigen/ausblenden"/>
+ </layout_panel>
+ <layout_panel name="avatar_and_destinations_panel">
+ <radio_group name="avatar_and_destination_btns">
+ <radio_item name="destination_btn" value="0"/>
+ <radio_item name="avatar_btn" value="1"/>
+ </radio_group>
+ </layout_panel>
+ <layout_panel name="people_panel">
+ <bottomtray_button label="Leute" name="show_people_button" tool_tip="Zeigt Leutefenster an"/>
+ </layout_panel>
+ <layout_panel name="profile_panel">
+ <bottomtray_button label="Profil" name="show_profile_btn" tool_tip="Zeigt Profilfenster an"/>
+ </layout_panel>
+ <layout_panel name="howto_panel">
+ <bottomtray_button label="Anweisungen" name="show_help_btn" tool_tip="Second Life-Anweisungsthemen öffnen"/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="IMs"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Benachrichtigungen"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml
new file mode 100644
index 0000000000..abf8011d9d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <text name="avatar_name" value="Unbekannt"/>
+ <layout_stack name="button_stack">
+ <layout_panel name="view_profile_btn_panel">
+ <button label="Profil" name="view_profile_btn"/>
+ </layout_panel>
+ <layout_panel name="add_friend_btn_panel">
+ <button label="Freund hinzufügen" name="add_friend_btn"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_panel">
+ <button label="Teleportieren" name="teleport_btn" tool_tip="Dieser Person einen Teleport anbieten."/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="Teilen" name="share_btn"/>
+ </layout_panel>
+ <layout_panel name="pay_btn_panel">
+ <button label="Bezahlen" name="pay_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Anrufen" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Anruf beenden" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Voice-Steuerung" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/de/panel_login.xml b/indra/newview/skins/minimal/xui/de/panel_login.xml
new file mode 100644
index 0000000000..dff70d6994
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/panel_login.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_login">
+ <panel.string name="create_account_url">
+ http://de.secondlife.com/registration/
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php?lang=de
+ </panel.string>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="username_text">
+ Benutzername:
+ </text>
+ <combo_box name="username_combo" tool_tip="Bei der Registrierung gewählter Benutzername wie „berndschmidt12“ oder „Liebe Sonne“"/>
+ <text name="password_text">
+ Kennwort:
+ </text>
+ <check_box label="Kennwort merken" name="remember_check"/>
+ <button label="Anmelden" name="connect_btn"/>
+ <text name="mode_selection_text">
+ Modus:
+ </text>
+ <combo_box name="mode_combo">
+ <combo_box.item label="Einfach (Standard)" name="Basic"/>
+ <combo_box.item label="Erweitert" name="Advanced"/>
+ </combo_box>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ Registrieren
+ </text>
+ <text name="forgot_password_text">
+ Benutzernamen oder Kennwort vergessen?
+ </text>
+ <text name="login_help">
+ Sie brauchen Hilfe?
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/de/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/de/panel_navigation_bar.xml
new file mode 100644
index 0000000000..ee1a543aac
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/panel_navigation_bar.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Zurück zum vorherigen Standort teleportieren"/>
+ <pull_button name="forward_btn" tool_tip="Um einen Standort weiter teleportieren"/>
+ <button name="home_btn" tool_tip="Zu meinem Zuhause teleportieren"/>
+ <location_input label="Standort" name="location_combo"/>
+ <search_combo_box label="Suche" name="search_combo_box" tool_tip="Suche">
+ <combo_editor label="[SECOND_LIFE] durchsuchen" name="search_combo_editor"/>
+ </search_combo_box>
+ </panel>
+ <favorites_bar name="favorite" tool_tip="Ziehen Sie Landmarken hier hin, damit Sie schnell zu Ihren Lieblingsplätzen in Second Life gelangen können!">
+ <label name="favorites_bar_label" tool_tip="Ziehen Sie Landmarken hier hin, damit Sie schnell zu Ihren Lieblingsplätzen in Second Life gelangen können!">
+ Favoritenleiste
+ </label>
+ <chevron_button name="&gt;&gt;" tool_tip="Mehr meiner Favoriten anzeigen"/>
+ </favorites_bar>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/de/panel_people.xml b/indra/newview/skins/minimal/xui/de/panel_people.xml
new file mode 100644
index 0000000000..c6253e17de
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/panel_people.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="Leute" name="people_panel">
+ <string name="no_recent_people" value="Sie haben in letzter Zeit mit niemandem interagiert. Suchen Sie nach Leuten, mit denen Sie sich unterhalten können? Klicken Sie unten auf die Schaltfläche „Ziele“."/>
+ <string name="no_filtered_recent_people" value="Es gibt keine Leute mit diesem Namen, mit denen Sie in letzter Zeit interagiert haben."/>
+ <string name="no_one_near" value="Es ist niemand in der Nähe. Suchen Sie nach Leuten, mit denen Sie sich unterhalten können? Klicken Sie unten auf die Schaltfläche „Ziele“."/>
+ <string name="no_one_filtered_near" value="Es ist niemand mit diesem Namen in der Nähe."/>
+ <string name="no_friends_online" value="Keine Freunde online"/>
+ <string name="no_friends" value="Keine Freunde"/>
+ <string name="no_friends_msg">
+ Klicken Sie mit der rechten Maustaste auf einen Einwohner, um ihn als Freund hinzuzufügen. Suchen Sie nach Leuten, mit denen Sie sich unterhalten können? Klicken Sie unten auf die Schaltfläche „Ziele“.
+ </string>
+ <string name="no_filtered_friends_msg">
+ Sie haben nicht das Richtige gefunden? Klicken Sie unten auf die Schaltfläche „Ziele“.
+ </string>
+ <string name="people_filter_label" value="Nach Leuten filtern"/>
+ <string name="groups_filter_label" value="Nach Gruppen filtern"/>
+ <string name="no_filtered_groups_msg" value="Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/groups/[SEARCH_TERM] Suche]."/>
+ <string name="no_groups_msg" value="Suchen Sie nach Gruppen? Versuchen Sie es mit der [secondlife:///app/search/groups Suche]."/>
+ <string name="MiniMapToolTipMsg" value="[REGION](Doppelklicken, um Karte zu öffnen; Umschalttaste gedrückt halten und ziehen, um zu schwenken)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](Doppelklicken, um zu teleportieren; Umschalttaste gedrückt halten und ziehen, um zu schwenken)"/>
+ <filter_editor label="Filter" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="IN DER NÄHE" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel"/>
+ </panel>
+ <panel label="MEINE FREUNDE" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="Online"/>
+ <accordion_tab name="tab_all" title="Alle"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="bottom_panel">
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="del_btn" tool_tip="Ausgewählte Person aus Ihrer Freundesliste entfernen"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+ <panel label="AKTUELL" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="add_friend_btn" tool_tip="Ausgewählten Einwohner zur Freundeliste hinzufügen"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <layout_stack name="bottom_bar_ls">
+ <layout_panel name="view_profile_btn_lp">
+ <button label="Profil" name="view_profile_btn" tool_tip="Bilder, Gruppen und andere Einwohner-Informationen anzeigen"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="IM" name="im_btn" tool_tip="Instant Messenger öffnen"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Teleportieren" name="teleport_btn" tool_tip="Teleport anbieten"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls1">
+ <layout_panel name="group_info_btn_lp">
+ <button label="Gruppenprofil" name="group_info_btn" tool_tip="Gruppeninformationen anzeigen"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Gruppen-Chat" name="chat_btn" tool_tip="Chat öffnen"/>
+ </layout_panel>
+ <layout_panel name="group_call_btn_lp">
+ <button label="Gruppe anrufen" name="group_call_btn" tool_tip="Diese Gruppe anrufen"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/de/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/de/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..652fb7c836
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/panel_side_tray_tab_caption.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="Klappmenü??"/>
+ <button name="undock" tool_tip="Abkoppeln"/>
+ <button name="dock" tool_tip="Andocken"/>
+ <button name="show_help" tool_tip="Hilfe anzeigen"/>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/de/panel_status_bar.xml b/indra/newview/skins/minimal/xui/de/panel_status_bar.xml
new file mode 100644
index 0000000000..04ed58f944
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/panel_status_bar.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="status">
+ <panel.string name="StatBarDaysOfWeek">
+ Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag
+ </panel.string>
+ <panel.string name="StatBarMonthsOfYear">
+ Januar:Februar:März:April:Mai:Juni:Juli:August:September:Oktober:November:Dezember
+ </panel.string>
+ <panel.string name="packet_loss_tooltip">
+ Paketverlust
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
+ Bandbreite
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ [AMT] L$
+ </panel.string>
+ <panel name="balance_bg">
+ <text name="balance" tool_tip="Klicken, um L$-Guthaben zu aktualisieren" value="20 L$"/>
+ <button label="L$ kaufen" name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/>
+ </panel>
+ <text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)">
+ 24:00 H PST
+ </text>
+ <button name="media_toggle_btn" tool_tip="Alle Medien starten/stoppen (Musik, Video, Webseiten)"/>
+ <button name="volume_btn" tool_tip="Steuerung der Gesamtlautstärke"/>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/en/floater_camera.xml b/indra/newview/skins/minimal/xui/en/floater_camera.xml
new file mode 100644
index 0000000000..4cf792444f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/floater_camera.xml
@@ -0,0 +1,284 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_dock="true"
+ can_minimize="true"
+ can_close="false"
+ follows="bottom"
+ height="164"
+ layout="topleft"
+ name="camera_floater"
+ save_rect="true"
+ save_visibility="true"
+ save_dock_state="true"
+ single_instance="true"
+ width="228">
+ <floater.string
+ name="rotate_tooltip">
+ Rotate Camera Around Focus
+ </floater.string>
+ <floater.string
+ name="zoom_tooltip">
+ Zoom Camera Towards Focus
+ </floater.string>
+ <floater.string
+ name="move_tooltip">
+ Move Camera Up and Down, Left and Right
+ </floater.string>
+ <floater.string
+ name="camera_modes_title">
+ Camera modes
+ </floater.string>
+ <floater.string
+ name="pan_mode_title">
+ Orbit Zoom Pan
+ </floater.string>
+ <floater.string
+ name="presets_mode_title">
+ Preset Views
+ </floater.string>
+ <floater.string
+ name="free_mode_title">
+ View Object
+ </floater.string>
+ <panel
+ border="false"
+ height="123"
+ layout="topleft"
+ left="2"
+ top="0"
+ mouse_opaque="false"
+ name="controls"
+ width="226">
+ <panel
+ color="Transparent"
+ follows="all"
+ height="102"
+ layout="topleft"
+ left="8"
+ name="preset_views_list"
+ opaque="true"
+ top="24"
+ width="212"
+ visible="false">
+ <panel_camera_item
+ name="front_view">
+ <panel_camera_item.mousedown_callback
+ function="CameraPresets.ChangeView"
+ parameter="front_view" />
+ <panel_camera_item.picture
+ image_name="Cam_Preset_Front_Off" />
+ <panel_camera_item.selected_picture
+ image_name="Cam_Preset_Front_On" />
+ <panel_camera_item.text
+ name="front_view_text">
+ Front View
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item
+ name="group_view"
+ top_pad="4">
+ <panel_camera_item.mousedown_callback
+ function="CameraPresets.ChangeView"
+ parameter="group_view" />
+ <panel_camera_item.picture
+ image_name="Cam_Preset_Side_Off" />
+ <panel_camera_item.selected_picture
+ image_name="Cam_Preset_Side_On" />
+ <panel_camera_item.text
+ name="side_view_text">
+ Side View
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item
+ name="rear_view"
+ layout="topleft"
+ top_pad="4">
+ <panel_camera_item.mousedown_callback
+ function="CameraPresets.ChangeView"
+ parameter="rear_view" />
+ <panel_camera_item.picture
+ image_name="Cam_Preset_Back_Off" />
+ <panel_camera_item.selected_picture
+ image_name="Cam_Preset_Back_On" />
+ <panel_camera_item.text
+ name="rear_view_text">
+ Rear View
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel
+ color="Transparent"
+ follows="all"
+ height="68"
+ item_pad="4"
+ layout="topleft"
+ left="8"
+ name="camera_modes_list"
+ opaque="true"
+ top="24"
+ width="212"
+ visible="false">
+ <panel_camera_item
+ name="object_view">
+ <panel_camera_item.mousedown_callback
+ function="CameraPresets.ChangeView"
+ parameter="object_view" />
+ <panel_camera_item.text
+ name="object_view_text">
+ Object View
+ </panel_camera_item.text>
+ <panel_camera_item.picture
+ image_name="Object_View_Off" />
+ <panel_camera_item.selected_picture
+ image_name="Object_View_On" />
+ </panel_camera_item>
+ <panel_camera_item
+ name="mouselook_view"
+ layout="topleft">
+ <panel_camera_item.mousedown_callback
+ function="CameraPresets.ChangeView"
+ parameter="mouselook_view" />
+ <panel_camera_item.text
+ name="mouselook_view_text">
+ Mouselook View
+ </panel_camera_item.text>
+ <panel_camera_item.picture
+ image_name="MouseLook_View_Off" />
+ <panel_camera_item.selected_picture
+ image_name="MouseLook_View_On" />
+ </panel_camera_item>
+ </panel>
+ <!--TODO: replace + - images -->
+ <panel
+ border="false"
+ class="camera_zoom_panel"
+ height="114"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="zoom"
+ top="20"
+ width="226">
+ <joystick_rotate
+ follows="top|left"
+ height="78"
+ image_selected="Cam_Rotate_In"
+ image_unselected="Cam_Rotate_Out"
+ layout="topleft"
+ left="7"
+ mouse_opaque="false"
+ name="cam_rotate_stick"
+ quadrant="left"
+ scale_image="false"
+ sound_flags="3"
+ visible="true"
+ tool_tip="Orbit camera around focus"
+ top="20"
+ width="78">
+ <commit_callback
+ function="Camera.rotate" />
+ <mouse_held_callback
+ function="Camera.rotate" />
+ </joystick_rotate>
+ <button
+ follows="top|left"
+ height="18"
+ image_disabled="AddItem_Disabled"
+ image_selected="AddItem_Press"
+ image_unselected="AddItem_Off"
+ layout="topleft"
+ left_pad="14"
+ name="zoom_plus_btn"
+ width="18"
+ top="18">
+ <commit_callback
+ function="Zoom.plus" />
+ <mouse_held_callback
+ function="Zoom.plus" />
+ </button>
+ <slider_bar
+ height="50"
+ layout="topleft"
+ name="zoom_slider"
+ orientation="vertical"
+ tool_tip="Zoom camera toward focus"
+ top_pad="0"
+ min_val="0"
+ max_val="1"
+ width="18">
+ <commit_callback function="Slider.value_changed"/>
+ </slider_bar>
+ <button
+ follows="top|left"
+ height="18"
+ image_disabled="MinusItem_Disabled"
+ image_selected="MinusItem_Press"
+ image_unselected="MinusItem_Off"
+ layout="topleft"
+ name="zoom_minus_btn"
+ top_pad="0"
+ width="18">
+ <commit_callback
+ function="Zoom.minus" />
+ <mouse_held_callback
+ function="Zoom.minus" />
+ </button>
+ <joystick_track
+ follows="top|left"
+ height="78"
+ image_selected="Cam_Tracking_In"
+ image_unselected="Cam_Tracking_Out"
+ layout="topleft"
+ left="133"
+ name="cam_track_stick"
+ quadrant="left"
+ scale_image="false"
+ sound_flags="3"
+ tool_tip="Move camera up and down, left and right"
+ top="20"
+ width="78">
+ <commit_callback
+ function="Camera.track" />
+ <mouse_held_callback
+ function="Camera.track" />
+ </joystick_track>
+ </panel>
+ </panel>
+ <panel
+ border="false"
+ height="42"
+ layout="topleft"
+ left="2"
+ top_pad="0"
+ name="buttons"
+ width="226">
+ <button
+ height="23"
+ label=""
+ layout="topleft"
+ left="83"
+ is_toggle="true"
+ image_overlay="Cam_Avatar_Off"
+ image_selected="PushButton_Selected_Press"
+ name="presets_btn"
+ tab_stop="false"
+ tool_tip="Preset Views"
+ top="13"
+ width="25">
+ </button>
+ <button
+ height="23"
+ label=""
+ layout="topleft"
+ left_pad="1"
+ is_toggle="true"
+ image_overlay="PanOrbit_Off"
+ image_selected="PushButton_Selected_Press"
+ name="pan_btn"
+ tab_stop="false"
+ tool_tip="Orbit Zoom Pan"
+ width="25">
+ </button>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/en/floater_help_browser.xml b/indra/newview/skins/minimal/xui/en/floater_help_browser.xml
new file mode 100644
index 0000000000..eddfe41c25
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/floater_help_browser.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_resize="true"
+ can_minimize="false"
+ height="360"
+ layout="topleft"
+ min_height="360"
+ left="645"
+ top="10"
+ min_width="300"
+ name="floater_help_browser"
+ save_rect="true"
+ single_instance="true"
+ title="HOW TO"
+ width="300">
+ <floater.string
+ name="loading_text">
+ Loading...
+ </floater.string>
+ <floater.string
+ name="done_text">
+ </floater.string>
+ <layout_stack
+ bottom="360"
+ follows="left|right|top|bottom"
+ layout="topleft"
+ left="5"
+ orientation="vertical"
+ name="stack1"
+ top="20"
+ width="290">
+ <layout_panel
+ layout="topleft"
+ left_delta="0"
+ top_delta="0"
+ name="external_controls"
+ user_resize="false"
+ width="280">
+ <web_browser
+ trusted_content="true"
+ bottom="-5"
+ follows="left|right|top|bottom"
+ layout="topleft"
+ left="0"
+ name="browser"
+ top="0"
+ height="300"
+ width="280" />
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/en/floater_media_browser.xml b/indra/newview/skins/minimal/xui/en/floater_media_browser.xml
new file mode 100644
index 0000000000..4862146c94
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/floater_media_browser.xml
@@ -0,0 +1,242 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_resize="true"
+ height="440"
+ layout="topleft"
+ min_height="140"
+ min_width="467"
+ name="floater_about"
+ save_rect="true"
+ auto_tile="true"
+ title="MEDIA BROWSER"
+ width="820">
+ <floater.string
+ name="home_page_url">
+ http://www.secondlife.com
+ </floater.string>
+ <floater.string
+ name="support_page_url">
+ http://support.secondlife.com
+ </floater.string>
+ <layout_stack
+ bottom="440"
+ follows="left|right|top|bottom"
+ layout="topleft"
+ left="10"
+ name="stack1"
+ orientation="vertical"
+ top="20"
+ width="800">
+ <layout_panel
+ auto_resize="false"
+ default_tab_group="1"
+ height="20"
+ layout="topleft"
+ left="0"
+ min_height="20"
+ name="nav_controls"
+ top="400"
+ user_resize="false"
+ width="800">
+ <button
+ follows="left|top"
+ height="20"
+ label="Back"
+ layout="topleft"
+ left="0"
+ name="back"
+ top="0"
+ width="55">
+ <button.commit_callback
+ function="MediaBrowser.Back" />
+ </button>
+ <button
+ follows="left|top"
+ height="20"
+ label="Forward"
+ layout="topleft"
+ left_pad="3"
+ name="forward"
+ top_delta="0"
+ width="68">
+ <button.commit_callback
+ function="MediaBrowser.Forward" />
+ </button>
+ <button
+ enabled="false"
+ follows="left|top"
+ height="20"
+ label="Reload"
+ layout="topleft"
+ left_pad="2"
+ name="reload"
+ top_delta="0"
+ width="70">
+ <button.commit_callback
+ function="MediaBrowser.Refresh" />
+ </button>
+ <combo_box
+ allow_text_entry="true"
+ follows="left|top|right"
+ tab_group="1"
+ height="20"
+ layout="topleft"
+ left_pad="5"
+ max_chars="1024"
+ name="address"
+ combo_editor.select_on_focus="true"
+ top_delta="0"
+ width="540">
+ <combo_box.commit_callback
+ function="MediaBrowser.EnterAddress" />
+ </combo_box>
+ <button
+ enabled="false"
+ follows="right|top"
+ height="20"
+ label="Go"
+ layout="topleft"
+ left_pad="5"
+ name="go"
+ top_delta="0"
+ width="50">
+ <button.commit_callback
+ function="MediaBrowser.Go" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ height="20"
+ layout="topleft"
+ left_delta="0"
+ min_height="20"
+ name="time_controls"
+ top_delta="0"
+ user_resize="false"
+ width="800">
+ <button
+ follows="left|top"
+ height="20"
+ label="rewind"
+ layout="topleft"
+ left="0"
+ name="rewind"
+ top="0"
+ width="55" />
+ <button
+ follows="left|top"
+ height="20"
+ image_selected="button_anim_play_selected.tga"
+ image_unselected="button_anim_play.tga"
+ layout="topleft"
+ left_delta="55"
+ name="play"
+ top_delta="0"
+ width="55" />
+ <button
+ follows="left|top"
+ height="20"
+ image_selected="button_anim_pause_selected.tga"
+ image_unselected="button_anim_pause.tga"
+ layout="topleft"
+ left_delta="0"
+ name="pause"
+ top_delta="0"
+ width="55" />
+ <button
+ follows="left|top"
+ height="20"
+ label="stop"
+ layout="topleft"
+ left_pad="10"
+ name="stop"
+ top_delta="0"
+ width="55" />
+ <button
+ follows="left|top"
+ height="20"
+ label="forward"
+ layout="topleft"
+ left_pad="20"
+ name="seek"
+ top_delta="0"
+ width="55" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ height="20"
+ layout="topleft"
+ left_delta="0"
+ min_height="20"
+ name="parcel_owner_controls"
+ top_delta="0"
+ user_resize="false"
+ width="540">
+ <button
+ enabled="false"
+ follows="left|top"
+ height="20"
+ label="Send Current Page to Parcel"
+ layout="topleft"
+ left="0"
+ name="assign"
+ top="0"
+ width="200">
+ <button.commit_callback
+ function="MediaBrowser.Assign" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ height="40"
+ layout="topleft"
+ left_delta="0"
+ name="external_controls"
+ top_delta="0"
+ user_resize="false"
+ width="540">
+ <web_browser
+ bottom="-30"
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="browser"
+ top="0"
+ width="540" />
+ <button
+ follows="bottom|left"
+ height="20"
+ label="Open in My Web Browser"
+ layout="topleft"
+ left_delta="0"
+ name="open_browser"
+ top_pad="5"
+ width="185">
+ <button.commit_callback
+ function="MediaBrowser.OpenWebBrowser" />
+ </button>
+ <check_box
+ control_name="UseExternalBrowser"
+ follows="bottom|left"
+ height="20"
+ label="Always open in my web browser"
+ layout="topleft"
+ left_pad="5"
+ name="open_always"
+ top_delta="0"
+ width="200" />
+ <button
+ follows="bottom|right"
+ height="20"
+ label="Close"
+ layout="topleft"
+ left_pad="80"
+ name="close"
+ top_delta="0"
+ width="70">
+ <button.commit_callback
+ function="MediaBrowser.Close" />
+ </button>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/en/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/en/floater_nearby_chat.xml
new file mode 100644
index 0000000000..74ac885202
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/floater_nearby_chat.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater
+ border_visible="false"
+ border="false"
+ bg_opaque_image="Window_Foreground"
+ bg_alpha_image="Window_Background"
+ bg_alpha_image_overlay="DkGray_66"
+ legacy_header_height="18"
+ can_minimize="true"
+ can_tear_off="false"
+ can_resize="true"
+ can_drag_on_left="false"
+ can_close="false"
+ can_dock="true"
+ bevel_style="in"
+ height="300"
+ min_width="235"
+ layout="topleft"
+ name="nearby_chat"
+ save_rect="true"
+ title="NEARBY CHAT"
+ save_dock_state="true"
+ save_visibility="true"
+ single_instance="true"
+ width="320">
+ <check_box
+ bottom_delta="36"
+ control_name="TranslateChat"
+ enabled="true"
+ height="16"
+ label="Translate chat (powered by Google)"
+ layout="topleft"
+ left="5"
+ name="translate_chat_checkbox"
+ width="230" />
+ <chat_history
+ parse_urls="true"
+ bg_readonly_color="ChatHistoryBgColor"
+ bg_writeable_color="ChatHistoryBgColor"
+ follows="all"
+ left="5"
+ top_delta="17"
+ layout="topleft"
+ height="260"
+ name="chat_history"
+ parse_highlights="true"
+ text_color="ChatHistoryTextColor"
+ text_readonly_color="ChatHistoryTextColor"
+ right_widget_pad="5"
+ left_widget_pad="0"
+ width="315" />
+</floater>
diff --git a/indra/newview/skins/minimal/xui/en/floater_side_bar_tab.xml b/indra/newview/skins/minimal/xui/en/floater_side_bar_tab.xml
new file mode 100644
index 0000000000..83b1260620
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/floater_side_bar_tab.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<floater
+ can_close="true"
+ can_resize="true"
+ min_width="333"
+ min_height="440"
+ save_rect="true"
+ save_visibility="true"
+ >
+</floater>
diff --git a/indra/newview/skins/minimal/xui/en/floater_web_content.xml b/indra/newview/skins/minimal/xui/en/floater_web_content.xml
new file mode 100644
index 0000000000..50cb5b14ce
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/floater_web_content.xml
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_resize="true"
+ height="775"
+ layout="topleft"
+ min_height="400"
+ min_width="500"
+ name="floater_web_content"
+ save_rect="true"
+ auto_tile="true"
+ title=""
+ initial_mime_type="text/html"
+ width="780">
+ <layout_stack
+ bottom="775"
+ follows="left|right|top|bottom"
+ layout="topleft"
+ left="5"
+ name="stack1"
+ orientation="vertical"
+ top="20"
+ width="770">
+ <layout_panel
+ auto_resize="false"
+ default_tab_group="1"
+ height="22"
+ layout="topleft"
+ left="0"
+ min_height="20"
+ name="nav_controls"
+ top="400"
+ user_resize="false"
+ width="770">
+ <button
+ image_overlay="Arrow_Left_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ tool_tip="Navigate back"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="1"
+ name="back"
+ top="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Back" />
+ </button>
+ <button
+ image_overlay="Arrow_Right_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ tool_tip="Navigate forward"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="27"
+ name="forward"
+ top_delta="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Forward" />
+ </button>
+ <button
+ image_overlay="Stop_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ tool_tip="Stop navigation"
+ enabled="true"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="51"
+ name="stop"
+ top_delta="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Stop" />
+ </button>
+ <button
+ image_overlay="Refresh_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ tool_tip="Reload page"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="51"
+ name="reload"
+ top_delta="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Reload" />
+ </button>
+ <combo_box
+ allow_text_entry="true"
+ follows="left|top|right"
+ tab_group="1"
+ height="22"
+ layout="topleft"
+ left_pad="4"
+ max_chars="1024"
+ name="address"
+ combo_editor.select_on_focus="true"
+ tool_tip="Enter URL here"
+ top_delta="0"
+ width="672">
+ <combo_box.commit_callback
+ function="WebContent.EnterAddress" />
+ </combo_box>
+ <icon
+ name="media_secure_lock_flag"
+ height="16"
+ follows="top|right"
+ image_name="Lock2"
+ layout="topleft"
+ left_delta="620"
+ top_delta="2"
+ visible="false"
+ tool_tip="Secured Browsing"
+ width="16" />
+ <button
+ image_overlay="ExternalBrowser_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ tool_tip="Open current URL in your desktop browser"
+ follows="right|top"
+ enabled="true"
+ height="22"
+ layout="topleft"
+ name="popexternal"
+ right="770"
+ top_delta="-2"
+ width="22">
+ <button.commit_callback
+ function="WebContent.PopExternal" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ height="40"
+ layout="topleft"
+ left_delta="0"
+ name="external_controls"
+ top_delta="0"
+ user_resize="false"
+ width="585">
+ <web_browser
+ bottom="-22"
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="webbrowser"
+ top="0"/>
+ <text
+ type="string"
+ length="200"
+ follows="bottom|left"
+ height="20"
+ layout="topleft"
+ left_delta="0"
+ name="statusbartext"
+ parse_urls="false"
+ text_color="0.4 0.4 0.4 1"
+ top_pad="5"
+ width="495"/>
+ <progress_bar
+ color_bar="0.3 1.0 0.3 1"
+ follows="bottom|right"
+ height="16"
+ top_delta="-1"
+ left_pad="24"
+ layout="topleft"
+ name="statusbarprogress"
+ width="64"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/en/inspect_avatar.xml b/indra/newview/skins/minimal/xui/en/inspect_avatar.xml
new file mode 100644
index 0000000000..853d5f8735
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/inspect_avatar.xml
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater
+ legacy_header_height="25"
+ bevel_style="in"
+ bg_opaque_image="Inspector_Background"
+ can_close="false"
+ can_minimize="false"
+ height="164"
+ layout="topleft"
+ name="inspect_avatar"
+ single_instance="true"
+ sound_flags="0"
+ visible="true"
+ width="245">
+ <!-- Allowed fields include:
+ [BORN_ON] ("12/3/2008")
+ [SL_PROFILE] (Second Life profile),
+ [RW_PROFILE] (real world profile),
+ [ACCTTYPE] ("Resident"),
+ [PAYMENTINFO] ("Payment Info on File"),
+ [AGE] ("1 year 2 months")
+ -->
+ <string
+ name="Subtitle">
+[AGE]
+ </string>
+ <string
+ name="Details">
+[SL_PROFILE]
+ </string>
+ <text
+ follows="top|left"
+ font="SansSerif"
+ height="20"
+ left="8"
+ name="user_name_small"
+ top="7"
+ text_color="White"
+ use_ellipses="true"
+ word_wrap="true"
+ visible="false"
+ value="Grumpity ProductEngine with a long name"
+ width="185" />
+ <text
+ follows="top|left"
+ font="SansSerifBigLarge"
+ height="21"
+ left="8"
+ name="user_name"
+ top="10"
+ text_color="White"
+ use_ellipses="true"
+ value="Grumpity ProductEngine"
+ width="190" />
+ <text
+ follows="top|left"
+ height="16"
+ left="8"
+ name="user_slid"
+ font="SansSerifSmallBold"
+ text_color="EmphasisColor"
+ value="james.linden"
+ width="185"
+ use_ellipses="true" />
+ <text
+ follows="top|left"
+ height="16"
+ left="8"
+ name="user_subtitle"
+ font="SansSerifSmall"
+ text_color="White"
+ top_pad="0"
+ value="11 Months, 3 days old"
+ width="175"
+ use_ellipses="true" />
+ <text
+ follows="left|top|right"
+ height="35"
+ left="8"
+ name="user_details"
+ right="-10"
+ word_wrap="true"
+ top_pad="4"
+ use_ellipses="true"
+ width="220">This is my second life description and I really think it is great. But for some reason my description is super extra long because I like to talk a whole lot
+ </text>
+ <slider
+ follows="top|left"
+ height="23"
+ increment="0.01"
+ left="1"
+ max_val="0.95"
+ min_val="0.05"
+ name="volume_slider"
+ show_text="false"
+ tool_tip="Voice volume"
+ top_pad="0"
+ value="0.5"
+ width="200" />
+ <button
+ follows="top|left"
+ height="16"
+ image_disabled="Audio_Off"
+ image_disabled_selected="AudioMute_Off"
+ image_hover_selected="AudioMute_Over"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
+ is_toggle="true"
+ left_pad="0"
+ top_delta="4"
+ name="mute_btn"
+ width="16" />
+ <avatar_icon
+ follows="top|left"
+ height="38"
+ right="-10"
+ bevel_style="in"
+ border_style="line"
+ mouse_opaque="true"
+ name="avatar_icon"
+ top="10"
+ width="38" />
+<!-- Overlapping buttons for default actions
+ llinspectavatar.cpp makes visible the most likely default action
+-->
+ <button
+ follows="top|left"
+ height="20"
+ label="Add Friend"
+ left="8"
+ top="135"
+ name="add_friend_btn"
+ width="90" />
+ <button
+ follows="top|left"
+ height="20"
+ label="IM"
+ left_delta="0"
+ top_delta="0"
+ name="im_btn"
+ width="80"
+ commit_callback.function="InspectAvatar.IM"/>
+ <button
+ follows="top|left"
+ height="20"
+ label="Profile"
+ layout="topleft"
+ name="view_profile_btn"
+ left_delta="96"
+ top_delta="0"
+ tab_stop="false"
+ width="80" />
+ <!-- gear buttons here -->
+ <menu_button
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ image_overlay="OptionsMenu_Off"
+ menu_filename="menu_inspect_avatar_gear.xml"
+ name="gear_btn"
+ right="-5"
+ top_delta="0"
+ width="35" />
+ <menu_button
+ follows="top|left"
+ height="20"
+ image_overlay="OptionsMenu_Off"
+ menu_filename="menu_inspect_self_gear.xml"
+ name="gear_self_btn"
+ right="-5"
+ top_delta="0"
+ width="35" />
+ <panel
+ follows="top|left"
+ top="164"
+ left="0"
+ height="60"
+ width="228"
+ visible="false"
+ background_visible="true"
+ name="moderator_panel"
+ background_opaque="true"
+ bg_opaque_color="MouseGray">
+ <button
+ name="disable_voice"
+ label="Disable Voice"
+ top="20"
+ width="95"
+ height="20"
+ left="10"
+ commit_callback.function="InspectAvatar.DisableVoice"/>
+ <button
+ name="enable_voice"
+ label="Enable Voice"
+ top="20"
+ width="95"
+ height="20"
+ left="10"
+ visible="false"
+ commit_callback.function="InspectAvatar.EnableVoice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/en/inspect_object.xml b/indra/newview/skins/minimal/xui/en/inspect_object.xml
new file mode 100644
index 0000000000..f424069ec6
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/inspect_object.xml
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater
+ legacy_header_height="25"
+ bevel_style="in"
+ bg_opaque_image="Inspector_Background"
+ can_close="false"
+ can_minimize="false"
+ height="150"
+ layout="topleft"
+ name="inspect_object"
+ single_instance="true"
+ sound_flags="0"
+ visible="true"
+ width="228">
+ <string name="Creator">By [CREATOR]</string>
+ <string name="CreatorAndOwner">
+By [CREATOR]
+Owner [OWNER]
+ </string>
+ <string name="Price">L$[AMOUNT]</string>
+ <string name="PriceFree">Free!</string>
+ <string name="Touch">Touch</string>
+ <string name="Sit">Sit</string>
+ <text
+ parse_urls="false"
+ follows="all"
+ font="SansSerifLarge"
+ height="30"
+ left="8"
+ name="object_name"
+ text_color="White"
+ top="6"
+ use_ellipses="true"
+ word_wrap="true"
+ width="220" />
+ <text
+ follows="all"
+ height="50"
+ left="8"
+ name="object_creator"
+ top_pad="6"
+ use_ellipses="true"
+ width="220">
+ by secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+ </text>
+ <text
+ follows="all"
+ font="SansSerifSmall"
+ font.style="BOLD"
+ height="14"
+ halign="right"
+ right="-5"
+ name="price_text"
+ text_color="white"
+ top="60"
+ font_shadow="none"
+ width="60">
+L$30,000
+ </text>
+ <text
+ clip_partial="true"
+ follows="all"
+ font="SansSerifSmall"
+ height="25"
+ left="8"
+ name="object_description"
+ top="76"
+ use_ellipses="true"
+ width="220"
+ word_wrap="true">
+ </text>
+ <!-- Overlapping buttons for all default actions. Show "Buy" if
+ for sale, "Sit" if can sit, etc. -->
+ <icon
+ name="secure_browsing"
+ image_name="Lock"
+ left="0"
+ visible="false"
+ width="18"
+ height="18"
+ top="103"
+ tool_tip="Secure Browsing"
+ follows="left|top" />
+ <text
+ follows="all"
+ font="SansSerifSmall"
+ height="13"
+ name="object_media_url"
+ width="207"
+ left_pad="2"
+ top_delta="0"
+ max_length = "50"
+ use_ellipses="true">
+ http://www.superdupertest.com
+</text>
+ <button
+ follows="top|left"
+ height="20"
+ label="Take Copy"
+ left_delta="0"
+ name="take_free_copy_btn"
+ top_delta="0"
+ width="80" />
+ <button
+ follows="top|left"
+ height="20"
+ label="Touch"
+ left_delta="0"
+ name="touch_btn"
+ top_delta="0"
+ width="80" />
+ <button
+ follows="top|left"
+ height="20"
+ label="Sit"
+ left_delta="0"
+ name="sit_btn"
+ top_delta="0"
+ width="80" />
+ <button
+ follows="top|left"
+ height="20"
+ label="Open"
+ left_delta="0"
+ name="open_btn"
+ top_delta="0"
+ width="80" />
+
+ <!-- non-overlapping buttons here -->
+ <menu_button
+ follows="top|left"
+ height="20"
+ image_overlay="OptionsMenu_Off"
+ menu_filename="menu_inspect_object_gear.xml"
+ name="gear_btn"
+ right="-5"
+ top_delta="0"
+ width="35" />
+</floater>
diff --git a/indra/newview/skins/minimal/xui/en/main_view.xml b/indra/newview/skins/minimal/xui/en/main_view.xml
new file mode 100644
index 0000000000..45ba785c1f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/main_view.xml
@@ -0,0 +1,268 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ follows="left|right|top|bottom"
+ height="768"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ tab_stop="false"
+ name="main_view"
+ width="1024">
+ <panel top="0"
+ follows="all"
+ height="768"
+ mouse_opaque="false"
+ name="login_panel_holder"
+ width="1024"/>
+
+ <layout_stack border_size="0"
+ follows="all"
+ mouse_opaque="false"
+ height="768"
+ name="menu_stack"
+ orientation="vertical"
+ top="0">
+ <layout_panel auto_resize="false"
+ height="30"
+ mouse_opaque="false"
+ name="nav_bar_container"
+ tab_stop="false"
+ min_height="0"
+ width="1024"
+ user_resize="false"
+ visible="true">
+ </layout_panel>
+ <layout_panel auto_resize="true"
+ follows="all"
+ height="500"
+ layout="topleft"
+ mouse_opaque="false"
+ tab_stop="false"
+ name="hud"
+ width="1024">
+ <panel auto_resize="false"
+ follows="all"
+ height="500"
+ top="0"
+ layout="topleft"
+ mouse_opaque="false"
+ tab_stop="false"
+ name="non_side_tray_view"
+ user_resize="false"
+ width="1024">
+
+ <layout_stack border_size="0"
+ bottom="500"
+ follows="all"
+ height="500"
+ left="0"
+ top="0"
+ mouse_opaque="false"
+ name="world_stack"
+ open_time_constant="0.03"
+ close_time_constant="0.03"
+ orientation="vertical">
+ <layout_panel auto_resize="true"
+ follows="all"
+ height="500"
+ layout="topleft"
+ tab_stop="false"
+ mouse_opaque="false"
+ user_resize="false"
+ name="hud container"
+ width="500">
+ <view top="0"
+ follows="all"
+ height="500"
+ left="0"
+ mouse_opaque="false"
+ name="floater_snap_region"
+ width="500"/>
+ <panel follows="left|top"
+ height="0"
+ left="0"
+ mouse_opaque="false"
+ name="topinfo_bar_container"
+ tab_stop="false"
+ top="0"
+ visible="false"
+ width="1024"/>
+ <panel bottom="500"
+ follows="left|right|bottom"
+ height="25"
+ left="0"
+ mouse_opaque="false"
+ tab_stop="false"
+ name="stand_stop_flying_container"
+ visible="false"
+ width="500"/>
+ <panel follows="all"
+ height="500"
+ left="0"
+ mouse_opaque="false"
+ name="floater_view_holder"
+ tab_group="-1"
+ tab_stop="false"
+ top="0"
+ width="500">
+ <floater_view follows="all"
+ height="500"
+ left="0"
+ mouse_opaque="false"
+ name="Floater View"
+ tab_group="-1"
+ tab_stop="false"
+ top="0"
+ width="500"/>
+ </panel>
+ <panel bottom="500"
+ follows="all"
+ height="500"
+ left="0"
+ mouse_opaque="false"
+ name="world_view_rect"
+ top="0"
+ width="500"/>
+ </layout_panel>
+ <layout_panel auto_resize="false"
+ min_height="33"
+ height="33"
+ mouse_opaque="false"
+ name="bottom_tray_container"
+ visible="false"/>
+ <layout_panel auto_resize="false"
+ height="215"
+ mouse_opaque="false"
+ user_resize="false"
+ name="avatar_picker_and_destination_guide_container"
+ visible="false">
+ <panel top="0"
+ height="215"
+ left="0"
+ background_visible="true"
+ width="500"
+ follows="all">
+ <web_browser
+ top="0"
+ height="200"
+ follows="all"
+ name="destination_guide_contents"
+ trusted_content="true"
+ visible="false"/>
+ <web_browser
+ top="0"
+ height="200"
+ follows="all"
+ name="avatar_picker_contents"
+ visible="false"
+ trusted_content="true"/>
+ <button
+ name="close"
+ width="22"
+ height="23"
+ right="-10"
+ top="2"
+ follows="top|right"
+ chrome="true"
+ tab_stop="false"
+ image_unselected="bottomtray_close_off"
+ image_selected="bottomtray_close_press"
+ />
+ </panel>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ <debug_view follows="all"
+ left="0"
+ top="0"
+ mouse_opaque="false"
+ height="500"
+ name="DebugView"
+ width="1024"/>
+ </layout_panel>
+ </layout_stack>
+ <panel mouse_opaque="false"
+ follows="right|top"
+ name="status_bar_container"
+ tab_stop="false"
+ height="30"
+ left="-70"
+ top="0"
+ width="70"
+ visible="false"/>
+ <panel follows="top|bottom"
+ height="500"
+ mouse_opaque="false"
+ tab_stop="false"
+ name="hidden_side_tray"
+ visible="false"
+ width="333">
+ <panel
+ name="side_tray_container"
+ width="333"
+ height="500"/>
+ </panel>
+
+ <panel top="0"
+ follows="all"
+ mouse_opaque="false"
+ left="0"
+ name="snapshot_floater_view_holder"
+ width="1024"
+ height="798">
+ <snapshot_floater_view enabled="false"
+ follows="all"
+ height="768"
+ left="0"
+ mouse_opaque="false"
+ name="Snapshot Floater View"
+ tab_stop="false"
+ top="0"
+ visible="false"
+ width="1024"/>
+ </panel>
+ <panel top="0"
+ follows="all"
+ height="768"
+ mouse_opaque="false"
+ name="popup_holder"
+ class="popup_holder"
+ width="1024">
+ <icon follows="right|bottom"
+ image_name="Resize_Corner"
+ right="-1"
+ name="resize_corner"
+ width="11"
+ bottom="-1"
+ height="11" />
+ </panel>
+ <view top="0"
+ left="0"
+ width="1024"
+ height="768"
+ name="hint_holder"
+ mouse_opaque="false"
+ follows="all"/>
+ <panel top="0"
+ follows="all"
+ height="768"
+ mouse_opaque="true"
+ name="progress_view"
+ filename="panel_progress.xml"
+ class="progress_view"
+ width="1024"
+ visible="false"/>
+ <menu_holder top="0"
+ follows="all"
+ height="768"
+ mouse_opaque="false"
+ name="Menu Holder"
+ width="1024"/>
+ <tooltip_view top="0"
+ follows="all"
+ height="768"
+ mouse_opaque="false"
+ name="tooltip view"
+ tab_group="-2"
+ width="1024"/>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/en/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/en/menu_add_wearable_gear.xml
new file mode 100644
index 0000000000..28c4762eaa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_add_wearable_gear.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml
new file mode 100644
index 0000000000..b55e677276
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu
+ layout="topleft"
+ name="Avatar Pie">
+ <menu_item_call
+ label="View Profile"
+ name="Profile...">
+ <menu_item_call.on_click
+ function="ShowAgentProfile"
+ parameter="hit object" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Add Friend"
+ name="Add Friend">
+ <menu_item_call.on_click
+ function="Avatar.AddFriend" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableAddFriend" />
+ </menu_item_call>
+ <menu_item_call
+ label="IM"
+ name="Send IM...">
+ <menu_item_call.on_click
+ function="Avatar.SendIM" />
+ </menu_item_call>
+ <menu_item_separator />
+ <menu_item_call
+ enabled="false"
+ label="Block"
+ name="Avatar Mute">
+ <menu_item_call.on_click
+ function="Avatar.Mute" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableMute" />
+ </menu_item_call>
+ <menu_item_call
+ label="Report"
+ name="abuse">
+ <menu_item_call.on_click
+ function="Avatar.ReportAbuse" />
+ </menu_item_call>
+ <menu_item_call
+ label="Freeze"
+ name="Freeze...">
+ <menu_item_call.on_click
+ function="Avatar.Freeze" />
+ <menu_item_call.on_visible
+ function="Avatar.EnableFreezeEject"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Eject"
+ name="Eject...">
+ <menu_item_call.on_click
+ function="Avatar.Eject" />
+ <menu_item_call.on_visible
+ function="Avatar.EnableFreezeEject"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Debug Textures"
+ name="Debug...">
+ <menu_item_call.on_click
+ function="Avatar.Debug" />
+ <menu_item_call.on_visible
+ function="IsGodCustomerService"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Zoom In"
+ name="Zoom In">
+ <menu_item_call.on_click
+ function="Tools.LookAtSelection"
+ parameter="zoom" />
+ </menu_item_call>
+ <menu_item_separator />
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/en/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/en/menu_attachment_self.xml
new file mode 100644
index 0000000000..542a7dc7dc
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_attachment_self.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Attachment Pie">
+ <menu_item_call
+ enabled="false"
+ label="Touch"
+ layout="topleft"
+ name="Attachment Object Touch">
+ <menu_item_call.on_click
+ function="Object.Touch" />
+ <menu_item_call.on_enable
+ function="Object.EnableTouch"
+ name="EnableTouch"/>
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Detach"
+ layout="topleft"
+ name="Detach">
+ <menu_item_call.on_click
+ function="Attachment.Detach" />
+ <menu_item_call.on_enable
+ function="Attachment.EnableDetach" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml
new file mode 100644
index 0000000000..9ebab9ef98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml
new file mode 100644
index 0000000000..b76629f401
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu
+ layout="topleft"
+ name="Avatar Pie">
+ <menu_item_call
+ label="View Profile"
+ name="Profile...">
+ <menu_item_call.on_click
+ function="ShowAgentProfile"
+ parameter="hit object" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Add Friend"
+ name="Add Friend">
+ <menu_item_call.on_click
+ function="Avatar.AddFriend" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableAddFriend" />
+ </menu_item_call>
+ <menu_item_call
+ label="IM"
+ name="Send IM...">
+ <menu_item_call.on_click
+ function="Avatar.SendIM" />
+ </menu_item_call>
+ <menu_item_separator />
+ <menu_item_call
+ enabled="false"
+ label="Block"
+ name="Avatar Mute">
+ <menu_item_call.on_click
+ function="Avatar.Mute" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableMute" />
+ </menu_item_call>
+ <menu_item_call
+ label="Report"
+ name="abuse">
+ <menu_item_call.on_click
+ function="Avatar.ReportAbuse" />
+ </menu_item_call>
+ <menu_item_call
+ label="Freeze"
+ name="Freeze...">
+ <menu_item_call.on_click
+ function="Avatar.Freeze" />
+ <menu_item_call.on_visible
+ function="Avatar.EnableFreezeEject"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Eject"
+ name="Eject...">
+ <menu_item_call.on_click
+ function="Avatar.Eject" />
+ <menu_item_call.on_visible
+ function="Avatar.EnableFreezeEject"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Debug Textures"
+ name="Debug...">
+ <menu_item_call.on_click
+ function="Avatar.Debug" />
+ <menu_item_call.on_visible
+ function="IsGodCustomerService"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Zoom In"
+ name="Zoom In">
+ <menu_item_call.on_click
+ function="Tools.LookAtSelection"
+ parameter="zoom" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/en/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/en/menu_avatar_self.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_avatar_self.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml
new file mode 100644
index 0000000000..9ebab9ef98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/en/menu_cof_attachment.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_cof_attachment.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/en/menu_cof_body_part.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_cof_body_part.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/en/menu_cof_clothing.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_cof_clothing.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/en/menu_cof_gear.xml
new file mode 100644
index 0000000000..28c4762eaa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_cof_gear.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_edit.xml b/indra/newview/skins/minimal/xui/en/menu_edit.xml
new file mode 100644
index 0000000000..747eb3fc6a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_edit.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu create_jump_keys="true"
+ label="Edit"
+ name="Edit"
+ visible="false">
+ <menu_item_call
+ label="Undo"
+ name="Undo"
+ shortcut="control|Z">
+ <menu_item_call.on_click
+ function="Edit.Undo" />
+ <menu_item_call.on_enable
+ function="Edit.EnableUndo" />
+ </menu_item_call>
+ <menu_item_call
+ label="Redo"
+ name="Redo"
+ shortcut="control|Y">
+ <menu_item_call.on_click
+ function="Edit.Redo" />
+ <menu_item_call.on_enable
+ function="Edit.EnableRedo" />
+ </menu_item_call>
+ <menu_item_separator/>
+ <menu_item_call
+ label="Cut"
+ name="Cut"
+ shortcut="control|X">
+ <menu_item_call.on_click
+ function="Edit.Cut" />
+ <menu_item_call.on_enable
+ function="Edit.EnableCut" />
+ </menu_item_call>
+ <menu_item_call
+ label="Copy"
+ name="Copy"
+ shortcut="control|C">
+ <menu_item_call.on_click
+ function="Edit.Copy" />
+ <menu_item_call.on_enable
+ function="Edit.EnableCopy" />
+ </menu_item_call>
+ <menu_item_call
+ label="Paste"
+ name="Paste"
+ shortcut="control|V">
+ <menu_item_call.on_click
+ function="Edit.Paste" />
+ <menu_item_call.on_enable
+ function="Edit.EnablePaste" />
+ </menu_item_call>
+ <menu_item_call
+ label="Delete"
+ name="Delete"
+ allow_key_repeat="true"
+ shortcut="Del">
+ <menu_item_call.on_click
+ function="Edit.Delete" />
+ <menu_item_call.on_enable
+ function="Edit.EnableDelete" />
+ </menu_item_call>
+ <menu_item_call
+ label="Duplicate"
+ name="Duplicate"
+ shortcut="control|D">
+ <menu_item_call.on_click
+ function="Edit.Duplicate" />
+ <menu_item_call.on_enable
+ function="Edit.EnableDuplicate" />
+ </menu_item_call>
+ <menu_item_separator/>
+ <menu_item_call
+ label="Select All"
+ name="Select All"
+ shortcut="control|A">
+ <menu_item_call.on_click
+ function="Edit.SelectAll" />
+ <menu_item_call.on_enable
+ function="Edit.EnableSelectAll" />
+ </menu_item_call>
+ <menu_item_call
+ label="Deselect"
+ name="Deselect"
+ shortcut="control|E">
+ <menu_item_call.on_click
+ function="Edit.Deselect" />
+ <menu_item_call.on_enable
+ function="Edit.EnableDeselect" />
+ </menu_item_call>
+</menu> \ No newline at end of file
diff --git a/indra/newview/skins/minimal/xui/en/menu_favorites.xml b/indra/newview/skins/minimal/xui/en/menu_favorites.xml
new file mode 100644
index 0000000000..9ebab9ef98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_favorites.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/en/menu_gesture_gear.xml
new file mode 100644
index 0000000000..28c4762eaa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_gesture_gear.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_group_plus.xml b/indra/newview/skins/minimal/xui/en/menu_group_plus.xml
new file mode 100644
index 0000000000..9ebab9ef98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_group_plus.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml
new file mode 100644
index 0000000000..9ebab9ef98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/en/menu_im_well_button.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_im_well_button.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..9ebab9ef98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..9ebab9ef98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..9ebab9ef98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..5a4a059781
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="utf-8"?>
+<toggleable_menu
+ create_jump_keys="true"
+ layout="topleft"
+ mouse_opaque="false"
+ visible="false"
+ name="Gear Menu">
+ <menu_item_call
+ label="View Profile"
+ enabled="true"
+ name="view_profile">
+ <menu_item_call.on_click
+ function="InspectAvatar.ViewProfile"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Add Friend"
+ name="add_friend">
+ <menu_item_call.on_click
+ function="InspectAvatar.AddFriend"/>
+ <menu_item_call.on_enable
+ function="InspectAvatar.Gear.Enable"/>
+ </menu_item_call>
+ <menu_item_call
+ label="IM"
+ name="im">
+ <menu_item_call.on_click
+ function="InspectAvatar.IM"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Teleport"
+ name="teleport">
+ <menu_item_call.on_click
+ function="InspectAvatar.Teleport"/>
+ <menu_item_call.on_enable
+ function="InspectAvatar.Gear.EnableTeleportOffer"/>
+ </menu_item_call>
+ <menu_item_separator />
+ <menu_item_call
+ label="Block"
+ name="block">
+ <menu_item_call.on_click
+ function="InspectAvatar.ToggleMute"/>
+ <menu_item_call.on_visible
+ function="InspectAvatar.EnableMute" />
+ </menu_item_call>
+ <menu_item_call
+ label="Unblock"
+ name="unblock">
+ <menu_item_call.on_click
+ function="InspectAvatar.ToggleMute"/>
+ <menu_item_call.on_visible
+ function="InspectAvatar.EnableUnmute" />
+ </menu_item_call>
+ <menu_item_call
+ label="Report"
+ name="report">
+ <menu_item_call.on_click
+ function="InspectAvatar.Report"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Freeze"
+ name="freeze">
+ <menu_item_call.on_click
+ function="InspectAvatar.Freeze"/>
+ <menu_item_call.on_visible
+ function="InspectAvatar.VisibleFreeze"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Eject"
+ name="eject">
+ <menu_item_call.on_click
+ function="InspectAvatar.Eject"/>
+ <menu_item_call.on_visible
+ function="InspectAvatar.VisibleEject"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Kick"
+ name="kick">
+ <menu_item_call.on_click
+ function="InspectAvatar.Kick"/>
+ <menu_item_call.on_visible
+ function="InspectAvatar.EnableGod"/>
+ </menu_item_call>
+ <menu_item_call
+ label="CSR"
+ name="csr">
+ <menu_item_call.on_click
+ function="InspectAvatar.CSR" />
+ <menu_item_call.on_visible
+ function="InspectAvatar.EnableGod" />
+ </menu_item_call>
+ <menu_item_call
+ label="Debug Textures"
+ name="debug">
+ <menu_item_call.on_click
+ function="Avatar.Debug"/>
+ <menu_item_call.on_visible
+ function="IsGodCustomerService"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Find On Map"
+ name="find_on_map">
+ <menu_item_call.on_click
+ function="InspectAvatar.FindOnMap"/>
+ <menu_item_call.on_visible
+ function="InspectAvatar.VisibleFindOnMap"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Zoom In"
+ name="zoom_in">
+ <menu_item_call.on_click
+ function="InspectAvatar.ZoomIn"/>
+ <menu_item_call.on_visible
+ function="InspectAvatar.VisibleZoomIn"/>
+ </menu_item_call>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/en/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/en/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..8ec360a604
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_inspect_object_gear.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<toggleable_menu
+ create_jump_keys="true"
+ layout="topleft"
+ mouse_opaque="false"
+ visible="false"
+ name="Gear Menu">
+ <menu_item_call
+ label="Touch"
+ layout="topleft"
+ enabled="true"
+ name="touch">
+ <menu_item_call.on_click
+ function="InspectObject.Touch"/>
+ <menu_item_call.on_visible
+ function="Object.EnableTouch" />
+ </menu_item_call>
+ <menu_item_call
+ label="Sit"
+ layout="topleft"
+ name="sit">
+ <menu_item_call.on_click
+ function="InspectObject.Sit"/>
+ <menu_item_call.on_visible
+ function="Object.EnableSit"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Report"
+ layout="topleft"
+ name="report">
+ <menu_item_call.on_click
+ function="Object.ReportAbuse" />
+ </menu_item_call>
+ <menu_item_call
+ label="Block"
+ layout="topleft"
+ name="block">
+ <menu_item_call.on_click
+ function="Object.Mute" />
+ <menu_item_call.on_visible
+ function="Object.EnableMute" />
+ </menu_item_call>
+ <menu_item_call
+ label="Zoom In"
+ layout="topleft"
+ name="zoom_in">
+ <menu_item_call.on_click
+ function="InspectObject.ZoomIn" />
+ </menu_item_call>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/en/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..ae8b640d26
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_inspect_self_gear.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ layout="topleft"
+ name="Self Pie">
+ <menu_item_call
+ label="Sit Down"
+ layout="topleft"
+ name="Sit Down Here">
+ <menu_item_call.on_click
+ function="Self.SitDown"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="Self.EnableSitDown" />
+ </menu_item_call>
+ <menu_item_call
+ label="Stand Up"
+ layout="topleft"
+ name="Stand Up">
+ <menu_item_call.on_click
+ function="Self.StandUp"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="Self.EnableStandUp" />
+ </menu_item_call>
+ <menu_item_call
+ label="My Friends"
+ layout="topleft"
+ name="Friends...">
+ <menu_item_call.on_click
+ function="SideTray.PanelPeopleTab"
+ parameter="friends_panel" />
+ </menu_item_call>
+ <menu_item_call
+ label="My Profile"
+ layout="topleft"
+ name="Profile...">
+ <menu_item_call.on_click
+ function="ShowAgentProfile"
+ parameter="agent" />
+ </menu_item_call>
+ <menu_item_call
+ label="Debug Textures"
+ name="Debug...">
+ <menu_item_call.on_click
+ function="Avatar.Debug" />
+ <menu_item_call.on_visible
+ function="IsGodCustomerService"/>
+ </menu_item_call>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..9ebab9ef98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_inventory.xml b/indra/newview/skins/minimal/xui/en/menu_inventory.xml
new file mode 100644
index 0000000000..9ebab9ef98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml
new file mode 100644
index 0000000000..9ebab9ef98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/en/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..28c4762eaa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_inventory_gear_default.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_land.xml b/indra/newview/skins/minimal/xui/en/menu_land.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_land.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_landmark.xml b/indra/newview/skins/minimal/xui/en/menu_landmark.xml
new file mode 100644
index 0000000000..28c4762eaa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_landmark.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_login.xml b/indra/newview/skins/minimal/xui/en/menu_login.xml
new file mode 100644
index 0000000000..62dbce3f56
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_login.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu_bar/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_mini_map.xml b/indra/newview/skins/minimal/xui/en/menu_mini_map.xml
new file mode 100644
index 0000000000..9ebab9ef98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_mini_map.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_navbar.xml b/indra/newview/skins/minimal/xui/en/menu_navbar.xml
new file mode 100644
index 0000000000..9ebab9ef98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_navbar.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml
new file mode 100644
index 0000000000..9ebab9ef98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/en/menu_notification_well_button.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_notification_well_button.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_object.xml b/indra/newview/skins/minimal/xui/en/menu_object.xml
new file mode 100644
index 0000000000..888ce42cf1
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_object.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Object Pie">
+ <menu_item_call
+ enabled="false"
+ label="Sit Here"
+ name="Object Sit">
+ <menu_item_call.on_click
+ function="Object.SitOrStand" />
+ <menu_item_call.on_enable
+ function="Object.EnableSit" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Stand Up"
+ name="Object Stand Up">
+ <menu_item_call.on_click
+ function="Object.SitOrStand" />
+ <menu_item_call.on_enable
+ function="Object.EnableStandUp" />
+ </menu_item_call>
+ <menu_item_call
+ label="Zoom In"
+ name="Zoom In">
+ <menu_item_call.on_click
+ function="Object.ZoomIn" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Touch"
+ name="Object Touch">
+ <menu_item_call.on_click
+ function="Object.Touch" />
+ <menu_item_call.on_enable
+ function="Object.EnableTouch"
+ name="EnableTouch"
+ parameter="Touch" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/en/menu_object_icon.xml b/indra/newview/skins/minimal/xui/en/menu_object_icon.xml
new file mode 100644
index 0000000000..9ebab9ef98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_object_icon.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/en/menu_outfit_gear.xml
new file mode 100644
index 0000000000..28c4762eaa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_outfit_gear.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/en/menu_outfit_tab.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_outfit_tab.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_participant_list.xml b/indra/newview/skins/minimal/xui/en/menu_participant_list.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_participant_list.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/en/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..28c4762eaa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_people_friends_view_sort.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_people_groups.xml b/indra/newview/skins/minimal/xui/en/menu_people_groups.xml
new file mode 100644
index 0000000000..9ebab9ef98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_people_groups.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/en/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..28c4762eaa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_people_groups_view_sort.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml
new file mode 100644
index 0000000000..3d64133f54
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Avatar Context Menu">
+ <menu_item_call
+ label="View Profile"
+ layout="topleft"
+ name="View Profile">
+ <menu_item_call.on_click
+ function="Avatar.Profile" />
+ </menu_item_call>
+ <menu_item_call
+ label="Add Friend"
+ layout="topleft"
+ name="Add Friend">
+ <menu_item_call.on_click
+ function="Avatar.AddFriend" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableItem"
+ parameter="can_add" />
+ </menu_item_call>
+ <menu_item_call
+ label="Remove Friend"
+ layout="topleft"
+ name="Remove Friend">
+ <menu_item_call.on_click
+ function="Avatar.RemoveFriend" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableItem"
+ parameter="can_delete" />
+ </menu_item_call>
+ <menu_item_call
+ label="IM"
+ layout="topleft"
+ name="IM">
+ <menu_item_call.on_click
+ function="Avatar.IM" />
+ </menu_item_call>
+ <menu_item_check
+ label="Block/Unblock"
+ layout="topleft"
+ name="Block/Unblock">
+ <menu_item_check.on_click
+ function="Avatar.BlockUnblock" />
+ <menu_item_check.on_check
+ function="Avatar.CheckItem"
+ parameter="is_blocked" />
+ <menu_item_check.on_enable
+ function="Avatar.EnableItem"
+ parameter="can_block" />
+ </menu_item_check>
+ <menu_item_call
+ label="Offer Teleport"
+ name="teleport">
+ <menu_item_call.on_click
+ function="Avatar.OfferTeleport"/>
+ <menu_item_call.on_enable
+ function="Avatar.EnableItem"
+ parameter="can_offer_teleport"/>
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/en/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/en/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_people_nearby_multiselect.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/en/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..28c4762eaa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_people_nearby_view_sort.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/en/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..28c4762eaa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_people_recent_view_sort.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_picks.xml b/indra/newview/skins/minimal/xui/en/menu_picks.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_picks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/en/menu_picks_plus.xml
new file mode 100644
index 0000000000..28c4762eaa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_picks_plus.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_place.xml b/indra/newview/skins/minimal/xui/en/menu_place.xml
new file mode 100644
index 0000000000..28c4762eaa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_place.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml
new file mode 100644
index 0000000000..9ebab9ef98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/en/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..28c4762eaa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_places_gear_folder.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/en/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..28c4762eaa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_places_gear_landmark.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/en/menu_profile_overflow.xml
new file mode 100644
index 0000000000..28c4762eaa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_profile_overflow.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/en/menu_save_outfit.xml
new file mode 100644
index 0000000000..28c4762eaa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_save_outfit.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml
new file mode 100644
index 0000000000..9ebab9ef98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_slurl.xml b/indra/newview/skins/minimal/xui/en/menu_slurl.xml
new file mode 100644
index 0000000000..9ebab9ef98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_slurl.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/en/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..28c4762eaa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_teleport_history_gear.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/en/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_teleport_history_item.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/en/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_teleport_history_tab.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_text_editor.xml b/indra/newview/skins/minimal/xui/en/menu_text_editor.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_text_editor.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml
new file mode 100644
index 0000000000..9ebab9ef98
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_url_agent.xml b/indra/newview/skins/minimal/xui/en/menu_url_agent.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_url_agent.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_url_group.xml b/indra/newview/skins/minimal/xui/en/menu_url_group.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_url_group.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_url_http.xml b/indra/newview/skins/minimal/xui/en/menu_url_http.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_url_http.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/en/menu_url_inventory.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_url_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_url_map.xml b/indra/newview/skins/minimal/xui/en/menu_url_map.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_url_map.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/en/menu_url_objectim.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_url_objectim.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/en/menu_url_parcel.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_url_parcel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/en/menu_url_slapp.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_url_slapp.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/en/menu_url_slurl.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_url_slurl.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/en/menu_url_teleport.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_url_teleport.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_viewer.xml b/indra/newview/skins/minimal/xui/en/menu_viewer.xml
new file mode 100644
index 0000000000..cd83ea4e99
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_viewer.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu_bar
+ bg_visible="false"
+ follows="left|top|right"
+ name="Main Menu">
+ <menu
+ create_jump_keys="true"
+ label="Help"
+ name="Help"
+ tear_off="true">
+ <menu_item_call
+ label="[SECOND_LIFE] Help"
+ name="Second Life Help"
+ shortcut="F1">
+ <menu_item_call.on_click
+ function="ShowHelp"
+ parameter="f1_help" />
+ </menu_item_call>
+ </menu>
+ <menu
+ create_jump_keys="true"
+ label="Advanced"
+ name="Advanced"
+ tear_off="true"
+ visible="false">
+ <menu
+ create_jump_keys="true"
+ label="Shortcuts"
+ name="Shortcuts"
+ tear_off="true"
+ visible="false">
+ <menu_item_check
+ label="Fly"
+ name="Fly"
+ shortcut="Home">
+ <menu_item_check.on_check
+ function="Agent.getFlying" />
+ <menu_item_check.on_click
+ function="Agent.toggleFlying" />
+ <menu_item_check.on_enable
+ function="Agent.enableFlying" />
+ </menu_item_check>
+ <menu_item_call
+ label="Close Window"
+ name="Close Window"
+ shortcut="control|W">
+ <menu_item_call.on_click
+ function="File.CloseWindow" />
+ <menu_item_call.on_enable
+ function="File.EnableCloseWindow" />
+ </menu_item_call>
+ <menu_item_call
+ label="Close All Windows"
+ name="Close All Windows"
+ shortcut="control|shift|W">
+ <menu_item_call.on_click
+ function="File.CloseAllWindows" />
+ <menu_item_call.on_enable
+ function="File.EnableCloseAllWindows" />
+ </menu_item_call>
+
+ <menu_item_call
+ label="Reset View"
+ name="Reset View"
+ shortcut="Esc">
+ <menu_item_call.on_click
+ function="View.ResetView" />
+ </menu_item_call>
+ </menu> <!--Shortcuts-->
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/en/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/en/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_wearable_list_item.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/en/menu_wearing_gear.xml
new file mode 100644
index 0000000000..28c4762eaa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_wearing_gear.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/en/menu_wearing_tab.xml
new file mode 100644
index 0000000000..fb19c5eb2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/menu_wearing_tab.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu/>
diff --git a/indra/newview/skins/minimal/xui/en/notification_visibility.xml b/indra/newview/skins/minimal/xui/en/notification_visibility.xml
new file mode 100644
index 0000000000..616b544847
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/notification_visibility.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" ?>
+<notification_visibility>
+ <respond name="VoiceInviteP2P" response="Decline"/>
+ <respond name="VoiceInviteAdHoc" response="Decline"/>
+ <respond name="VoiceInviteGroup" response="Decline"/>
+
+ <!-- group and voice are disabled features -->
+ <hide tag="group"/>
+ <hide tag="voice"/>
+
+ <!-- no spammy scripts -->
+ <!-- <hide name="ScriptDialog"/> -->
+
+ <!-- hints pertaining to UI we don't show -->
+ <hide name="FirstBalanceIncrease"/>
+ <hide name="FirstInventory"/>
+ <hide name="HintSidePanel"/>
+ <hide name="HintMove"/>
+ <hide name="HintDisplayName"/>
+ <hide name="HintInventory"/>
+ <hide name="HintLindenDollar"/>
+
+ <!-- spam from servers, such as "Autopilot cancelled" -->
+ <hide name="SystemMessageTip"/>
+
+ <!-- show everything else -->
+ <show/>
+</notification_visibility>
+
diff --git a/indra/newview/skins/minimal/xui/en/notifications.xml b/indra/newview/skins/minimal/xui/en/notifications.xml
new file mode 100644
index 0000000000..84da9472cc
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/notifications.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" ?>
+<notifications>
+ <notification
+ icon="notify.tga"
+ name="UserGiveItem"
+ type="offer">
+ [NAME_SLURL] is offering you [ITEM_SLURL]. Using this item requires you to switch to Advanced mode where you will find the item in your Inventory. To switch to Advanced mode, quit and restart this application and change the mode setting on the login screen.
+ <form name="form">
+ <button
+ index="4"
+ name="Show"
+ text="Keep Item"/>
+ <button
+ index="1"
+ name="Discard"
+ text="Reject Item"/>
+ <button
+ index="2"
+ name="Mute"
+ text="Block User"/>
+ </form>
+ </notification>
+ <notification
+ icon="notify.tga"
+ name="ObjectGiveItem"
+ type="offer">
+ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLURL] is offering you [ITEM_SLURL]. Using this item requires you to switch to Advanced mode where you will find the item in your Inventory. To switch to Advanced mode, quit and restart this application and change the mode setting on the login screen.
+ <form name="form">
+ <button
+ index="0"
+ name="Keep"
+ text="Keep Item"/>
+ <button
+ index="1"
+ name="Discard"
+ text="Reject Item"/>
+ <button
+ index="2"
+ name="Mute"
+ text="Block Object"/>
+ </form>
+ </notification>
+
+</notifications>
diff --git a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..5730adab8a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ border="false"
+ follows="all"
+ height="215"
+ name="panel_im_control_panel"
+ width="150">
+ <layout_stack
+ mouse_opaque="false"
+ border_size="0"
+ clip="false"
+ follows="all"
+ height="215"
+ layout="topleft"
+ left="3"
+ name="vertical_stack"
+ orientation="vertical"
+ top="0"
+ width="147">
+ <layout_panel
+ auto_resize="true"
+ follows="top|left"
+ height="130"
+ layout="topleft"
+ left="0"
+ min_height="0"
+ mouse_opaque="false"
+ width="147"
+ top="0"
+ name="speakers_list_panel"
+ user_resize="false">
+ <avatar_list
+ color="DkGray2"
+ follows="all"
+ height="130"
+ ignore_online_status="true"
+ layout="topleft"
+ name="speakers_list"
+ opaque="false"
+ show_info_btn="true"
+ show_profile_btn="false"
+ show_speaking_indicator="false"
+ width="147" />
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml
new file mode 100644
index 0000000000..0145de8be9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml
@@ -0,0 +1,483 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ bg_opaque_color="DkGray"
+ chrome="true"
+ follows="left|bottom|right"
+ height="33"
+ layout="topleft"
+ left="0"
+ name="bottom_tray"
+ focus_root="true"
+ top="28"
+ width="1310">
+ <string
+ name="DragIndicationImageName"
+ value="Accordion_ArrowOpened_Off" />
+ <string
+ name="SpeakBtnToolTip"
+ value="Turns microphone on/off" />
+ <string
+ name="VoiceControlBtnToolTip"
+ value="Shows/hides voice control panel" />
+ <layout_stack
+ border_size="0"
+ clip="false"
+ follows="all"
+ height="28"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="toolbar_stack"
+ orientation="horizontal"
+ top="0"
+ width="1310">
+ <layout_panel
+ auto_resize="false"
+ user_resize="false"
+ min_width="2"
+ width="2" />
+ <layout_panel
+ auto_resize="false"
+ layout="topleft"
+ max_width="320"
+ min_width="214"
+ height="28"
+ mouse_opaque="false"
+ name="chat_bar_layout_panel"
+ user_resize="true"
+ width="308" >
+ <panel
+ name="chat_bar"
+ filename="panel_nearby_chat_bar.xml"
+ left="0"
+ height="28"
+ width="306"
+ top="0"
+ mouse_opaque="false"
+ follows="left|right"
+ />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="65"
+ mouse_opaque="false"
+ name="gesture_panel"
+ top_delta="0"
+ user_resize="false"
+ width="85">
+ <gesture_combo_list
+ follows="left|right"
+ height="23"
+ label="Gesture"
+ layout="topleft"
+ get_more="false"
+ view_all="false"
+ left="0"
+ name="Gesture"
+ tool_tip="Shows/hides gestures"
+ top="5"
+ width="82">
+ <combo_button
+ pad_right="10"
+ can_drag="false"
+ use_ellipses="true" />
+ <combo_list
+ page_lines="17" />
+ </gesture_combo_list>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="left|right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="52"
+ mouse_opaque="false"
+ name="cam_panel"
+ user_resize="false"
+ width="83">
+ <bottomtray_button
+ can_drag="false"
+ follows="left|right"
+ height="23"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
+ is_toggle="true"
+ label="View"
+ layout="topleft"
+ left="0"
+ name="camera_btn"
+ tool_tip="Shows/hides camera controls"
+ top="5"
+ use_ellipses="true"
+ width="80">
+ <init_callback
+ function="Button.SetDockableFloaterToggle"
+ parameter="camera" />
+ </bottomtray_button>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="left|right"
+ height="28"
+ layout="topleft"
+ min_width="17"
+ name="splitter_panel"
+ user_resize="false"
+ width="17">
+ <icon
+ follows="left|bottom"
+ height="18"
+ width="2"
+ left="6"
+ image_name="Button_Separator"
+ name="separator"
+ top="7"/>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="left|right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="83"
+ mouse_opaque="false"
+ name="avatar_and_destinations_panel"
+ user_resize="false"
+ width="103">
+ <bottomtray_button
+ can_drag="false"
+ follows="left|right"
+ height="23"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
+ label="Destinations"
+ layout="topleft"
+ left="0"
+ name="destination_btn"
+ tool_tip="Shows people window"
+ top="5"
+ is_toggle="true"
+ use_ellipses="true"
+ width="100">
+ <bottomtray_button.commit_callback
+ function="Destination.show" />
+ </bottomtray_button>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="left|right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="73"
+ mouse_opaque="false"
+ name="avatar_and_destinations_panel"
+ user_resize="false"
+ width="103">
+ <bottomtray_button
+ can_drag="false"
+ follows="left|right"
+ height="23"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
+ label="My Avatar"
+ layout="topleft"
+ left="0"
+ name="avatar_btn"
+ top="5"
+ is_toggle="true"
+ use_ellipses="true"
+ width="100">
+ <bottomtray_button.commit_callback
+ function="Avatar.show" />
+ </bottomtray_button>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="left|right"
+ height="28"
+ layout="topleft"
+ min_width="17"
+ name="splitter_panel"
+ user_resize="false"
+ width="17">
+ <icon
+ follows="left|bottom"
+ height="18"
+ width="2"
+ left="6"
+ image_name="Button_Separator"
+ name="separator"
+ top="7"/>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="65"
+ mouse_opaque="false"
+ name="people_panel"
+ top_delta="0"
+ user_resize="false"
+ width="105">
+ <bottomtray_button
+ can_drag="false"
+ follows="left|right"
+ height="23"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
+ label="People"
+ layout="topleft"
+ left="0"
+ name="show_people_button"
+ tool_tip="Shows people window"
+ top="5"
+ is_toggle="true"
+ use_ellipses="true"
+ width="100">
+ <bottomtray_button.commit_callback
+ function="ShowSidetrayPanel"
+ parameter="panel_people" />
+ </bottomtray_button>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="65"
+ mouse_opaque="false"
+ name="profile_panel"
+ top_delta="0"
+ user_resize="false"
+ width="105">
+ <bottomtray_button
+ can_drag="false"
+ follows="left|right"
+ height="23"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
+ label="Profile"
+ layout="topleft"
+ left="0"
+ name="show_profile_btn"
+ tool_tip="Shows profile window"
+ is_toggle="true"
+ top="5"
+ use_ellipses="true"
+ width="100">
+ <bottomtray_button.commit_callback
+ function="ToggleAgentProfile"
+ parameter="agent"/>
+ </bottomtray_button>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="65"
+ mouse_opaque="false"
+ name="howto_panel"
+ top_delta="0"
+ user_resize="false"
+ width="105">
+ <bottomtray_button
+ can_drag="false"
+ follows="left|right"
+ height="23"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
+ label="How To"
+ layout="topleft"
+ left="0"
+ name="show_help_btn"
+ tool_tip="Open Second Life How To topics"
+ is_toggle="true"
+ top="5"
+ use_ellipses="true"
+ width="100">
+ <bottomtray_button.commit_callback
+ function="ToggleHelp"
+ parameter="f1_help" />
+ </bottomtray_button>
+ </layout_panel>
+ <layout_panel
+ follows="left|right"
+ height="30"
+ layout="topleft"
+ min_width="95"
+ mouse_opaque="false"
+ name="chiclet_list_panel"
+ top="0"
+ user_resize="false"
+ width="189">
+ <!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same
+as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991-->
+ <chiclet_panel
+ chiclet_padding="4"
+ follows="left|right"
+ height="24"
+ layout="topleft"
+ left="1"
+ min_width="95"
+ mouse_opaque="false"
+ name="chiclet_list"
+ top="7"
+ width="189">
+ <button
+ auto_resize="true"
+ follows="right"
+ height="29"
+ image_hover_selected="SegmentedBtn_Left_Over"
+ image_hover_unselected="SegmentedBtn_Left_Over"
+ image_overlay="Arrow_Small_Left"
+ image_pressed="SegmentedBtn_Left_Press"
+ image_pressed_selected="SegmentedBtn_Left_Press"
+ image_selected="SegmentedBtn_Left_Off"
+ image_unselected="SegmentedBtn_Left_Off"
+ layout="topleft"
+ name="chicklet_left_scroll_button"
+ tab_stop="false"
+ top="-28"
+ visible="false"
+ width="7" />
+ <button
+ auto_resize="true"
+ follows="right"
+ height="29"
+ image_hover_selected="SegmentedBtn_Right_Over"
+ image_hover_unselected="SegmentedBtn_Right_Over"
+ image_overlay="Arrow_Small_Right"
+ image_pressed="SegmentedBtn_Right_Press"
+ image_pressed_selected="SegmentedBtn_Right_Press"
+ image_selected="SegmentedBtn_Right_Off"
+ image_unselected="SegmentedBtn_Right_Off"
+ layout="topleft"
+ name="chicklet_right_scroll_button"
+ tab_stop="false"
+ top="-28"
+ visible="false"
+ width="7" />
+ </chiclet_panel>
+ </layout_panel>
+ <layout_panel auto_resize="false"
+ user_resize="false"
+ width="4"
+ min_width="4"/>
+ <layout_panel
+ auto_resize="false"
+ follows="right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="37"
+ name="im_well_panel"
+ top="0"
+ user_resize="false"
+ width="37">
+ <chiclet_im_well
+ follows="right"
+ height="28"
+ layout="topleft"
+ left="0"
+ max_displayed_count="99"
+ name="im_well"
+ top="0"
+ width="35">
+ <!--
+Emulate 4 states of button by background images, see details in EXT-3147. The same should be for notification_well button
+xml attribute Description
+image_unselected "Unlit" - there are no new messages
+image_selected "Unlit" + "Selected" - there are no new messages and the Well is open
+image_pressed "Lit" - there are new messages
+image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open
+ -->
+ <button
+ auto_resize="true"
+ follows="right"
+ halign="center"
+ height="23"
+ image_overlay="Unread_IM"
+ image_overlay_alignment="center"
+ image_pressed="WellButton_Lit"
+ image_pressed_selected="WellButton_Lit_Selected"
+ image_selected="PushButton_Press"
+ label_color="Black"
+ left="0"
+ name="Unread IM messages"
+ tool_tip="Conversations"
+ width="34">
+ <init_callback
+ function="Button.SetDockableFloaterToggle"
+ parameter="im_well_window" />
+ </button>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="37"
+ name="notification_well_panel"
+ top="0"
+ user_resize="false"
+ width="37">
+ <chiclet_notification
+ follows="right"
+ height="23"
+ layout="topleft"
+ left="0"
+ max_displayed_count="99"
+ name="notification_well"
+ top="5"
+ width="35">
+ <button
+ auto_resize="true"
+ bottom_pad="3"
+ follows="right"
+ halign="center"
+ height="23"
+ image_overlay="Notices_Unread"
+ image_overlay_alignment="center"
+ image_pressed="WellButton_Lit"
+ image_pressed_selected="WellButton_Lit_Selected"
+ image_selected="PushButton_Press"
+ label_color="Black"
+ left="0"
+ name="Unread"
+ tool_tip="Notifications"
+ width="34">
+ <init_callback
+ function="Button.SetDockableFloaterToggle"
+ parameter="notification_well_window" />
+ </button>
+ </chiclet_notification>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ user_resize="false"
+ min_width="4"
+ name="DUMMY2"
+ width="8" />
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_group_control_panel.xml
new file mode 100644
index 0000000000..abddc59296
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/panel_group_control_panel.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ border="false"
+ follows="all"
+ height="238"
+ name="panel_im_control_panel"
+ width="150">
+ <layout_stack
+ mouse_opaque="false"
+ border_size="0"
+ clip="false"
+ follows="all"
+ height="238"
+ layout="topleft"
+ left="5"
+ name="vertical_stack"
+ orientation="vertical"
+ top="0"
+ width="145">
+ <layout_panel
+ auto_resize="true"
+ follows="top|left"
+ height="100"
+ layout="topleft"
+ min_height="0"
+ mouse_opaque="false"
+ width="145"
+ top="0"
+ name="speakers_list_panel"
+ user_resize="false">
+ <avatar_list
+ color="DkGray2"
+ follows="all"
+ height="100"
+ ignore_online_status="true"
+ layout="topleft"
+ name="speakers_list"
+ opaque="false"
+ show_info_btn="true"
+ show_profile_btn="false"
+ show_speaking_indicator="false"
+ width="145" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ width="130"
+ name="end_call_btn_panel"
+ user_resize="false"
+ visible="false">
+ <button
+ follows="all"
+ height="23"
+ label="Leave Call"
+ name="end_call_btn"
+ use_ellipses="true" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ width="130"
+ name="voice_ctrls_btn_panel"
+ user_resize="false"
+ visible="false">
+ <button
+ follows="all"
+ height="23"
+ label="Open Voice Controls"
+ name="voice_ctrls_btn"
+ use_ellipses="true" />
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml
new file mode 100644
index 0000000000..53def54aca
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ border="false"
+ height="300"
+ name="panel_im_control_panel"
+ width="150">
+ <avatar_icon
+ follows="left|top"
+ height="105"
+ left_delta="20"
+ name="avatar_icon"
+ top="-5"
+ width="114"/>
+ <layout_stack
+ mouse_opaque="false"
+ border_size="0"
+ clip="false"
+ follows="all"
+ height="183"
+ layout="topleft"
+ left="5"
+ name="button_stack"
+ orientation="vertical"
+ top_pad="5"
+ width="145">
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_login.xml b/indra/newview/skins/minimal/xui/en/panel_login.xml
new file mode 100644
index 0000000000..ef058e5567
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/panel_login.xml
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+follows="all"
+height="600"
+layout="topleft"
+left="0"
+name="panel_login"
+focus_root="true"
+top="600"
+ width="996">
+<panel.string
+ name="create_account_url">
+ http://join.secondlife.com/
+</panel.string>
+<string name="reg_in_client_url" translate="false">
+ http://secondlife.eniac15.lindenlab.com/reg-in-client/
+</string>
+<panel.string
+ name="forgot_password_url">
+ http://secondlife.com/account/request.php
+</panel.string>
+<!-- *NOTE: Custom resize logic for login_html in llpanellogin.cpp -->
+<web_browser
+ tab_stop="false"
+trusted_content="true"
+bg_opaque_color="Black"
+border_visible="false"
+bottom="600"
+follows="all"
+hide_loading="true"
+left="0"
+name="login_html"
+start_url=""
+top="0"
+height="600"
+ width="980" />
+<layout_stack
+follows="left|bottom|right"
+name="login_widgets"
+layout="topleft"
+orientation="horizontal"
+top="519"
+width="996"
+height="80">
+<layout_panel
+auto_resize="false"
+follows="left|bottom"
+name="login"
+layout="topleft"
+width="570"
+min_width="570"
+user_resize="false"
+height="80">
+<text
+follows="left|bottom"
+font="SansSerifSmall"
+height="16"
+name="username_text"
+top="20"
+left="20"
+width="150">
+Username:
+</text>
+ <combo_box
+ allow_text_entry="true"
+ follows="left|bottom"
+ height="22"
+ left_delta="0"
+ max_chars="128"
+ combo_editor.prevalidate_callback="ascii"
+ tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine"
+ top_pad="0"
+ name="username_combo"
+ width="178">
+ <combo_box.combo_button
+ visible ="false"/>
+ <combo_box.drop_down_button
+ visible ="false"/>
+ </combo_box>
+<text
+follows="left|bottom"
+font="SansSerifSmall"
+height="15"
+left_pad="-19"
+name="password_text"
+top="20"
+ width="150">
+ Password:
+</text>
+<line_editor
+follows="left|bottom"
+ height="22"
+left_delta="0"
+ max_length_bytes="16"
+name="password_edit"
+is_password="true"
+select_on_focus="true"
+ top_pad="0"
+ width="135" />
+ <check_box
+control_name="RememberPassword"
+follows="left|bottom"
+font="SansSerifSmall"
+height="16"
+label="Remember password"
+ top_pad="3"
+ name="remember_check"
+ width="135" />
+<button
+ follows="left|bottom"
+ height="23"
+ image_unselected="PushButton_On"
+ image_selected="PushButton_On_Selected"
+ label="Log In"
+ label_color="White"
+ layout="topleft"
+ left_pad="10"
+ name="connect_btn"
+ top="35"
+ width="90" />
+ <text
+ follows="left|bottom"
+ font="SansSerifSmall"
+ height="15"
+ left_pad="10"
+ name="mode_selection_text"
+top="20"
+ width="130">
+ Mode:
+ </text>
+<combo_box
+ follows="left|bottom"
+ height="23"
+ max_chars="128"
+ top_pad="0"
+ tool_tip="Select your mode. Choose Basic for fast, easy exploration and chat. Choose Advanced to access more features."
+ control_name="SessionSettingsFile"
+ name="mode_combo"
+ width="120">
+<combo_box.item
+ label="Basic"
+ name="Basic"
+ value="settings_minimal.xml" />
+<combo_box.item
+ label="Advanced"
+ name="Advanced"
+ value="" />
+</combo_box>
+</layout_panel>
+<layout_panel
+tab_stop="false"
+follows="right|bottom"
+name="links"
+width="205"
+min_width="205"
+user_resize="false"
+height="80">
+ <text
+follows="right|bottom"
+font="SansSerifSmall"
+text_color="EmphasisColor"
+halign="right"
+height="16"
+top="12"
+right="-10"
+name="create_new_account_text"
+ width="200">
+ Sign up
+ </text>
+<text
+follows="right|bottom"
+font="SansSerifSmall"
+text_color="EmphasisColor"
+halign="right"
+height="16"
+name="forgot_password_text"
+top_pad="12"
+right="-10"
+ width="200">
+ Forgot your username or password?
+</text>
+<text
+follows="right|bottom"
+font="SansSerifSmall"
+text_color="EmphasisColor"
+halign="right"
+height="16"
+name="login_help"
+top_pad="2"
+right="-10"
+ width="200">
+ Need help logging in? </text>
+<!-- <text
+ follows="right|bottom"
+ font="SansSerifSmall"
+ halign="right"
+ height="28"
+ top_pad="2"
+ name="channel_text"
+ width="180"
+ word_wrap="true">
+ [VERSION]
+ </text>-->
+ </layout_panel>
+</layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/en/panel_navigation_bar.xml
new file mode 100644
index 0000000000..6dc1a1c9b0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/panel_navigation_bar.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_opaque="true"
+ background_visible="true"
+ bg_opaque_color="MouseGray"
+ follows="left|top|right"
+ height="26"
+ layout="topleft"
+ name="navigation_bar"
+ chrome="true"
+ width="600">
+ <icon
+ follows="all"
+ image_name="NavBar_BG_NoFav_Bevel"
+ mouse_opaque="false"
+ name="bg_icon_no_fav_bevel"
+ scale_image="true"
+ visible="true"
+ left="0"
+ top="0"
+ height="26"
+ width="600"/>
+ <panel
+ background_visible="false"
+ follows="left|top|right"
+ top="3"
+ height="26"
+ layout="topleft"
+ name="navigation_panel"
+ width="600">
+ <pull_button
+follows="left|top"
+direction="down"
+height="23"
+image_overlay="Arrow_Left_Off"
+image_bottom_pad="1"
+layout="topleft"
+left="10"
+name="back_btn"
+tool_tip="Go back to previous location"
+top="2"
+width="31" />
+ <pull_button
+ follows="left|top"
+ direction="down"
+ height="23"
+ image_overlay="Arrow_Right_Off"
+ image_bottom_pad="1"
+ layout="topleft"
+ left_pad="0"
+ name="forward_btn"
+ tool_tip="Go forward one location"
+ top_delta="0"
+ width="31" />
+ <location_input
+ follows="left|right|top"
+ halign="right"
+ height="23"
+ label="Location"
+ layout="topleft"
+ left_pad="7"
+ max_chars="254"
+ mouse_opaque="false"
+ name="location_combo"
+ top_delta="0"
+ width="440">
+ </location_input>
+ <icon follows="right"
+ height="20"
+ width="2"
+ left_pad="2"
+ image_name="Button_Separator"
+ name="separator"
+ top="2"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_people.xml b/indra/newview/skins/minimal/xui/en/panel_people.xml
new file mode 100644
index 0000000000..4a72653d76
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/panel_people.xml
@@ -0,0 +1,550 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- Side tray panel -->
+<panel
+ default_tab_group="1"
+ follows="all"
+ height="449"
+ label="People"
+ layout="topleft"
+ left="0"
+ min_height="350"
+ name="people_panel"
+ top="0"
+ width="333">
+ <string
+ name="no_recent_people"
+ value="No recent people. Looking for people to hang out with? Try the Destinations button below." />
+ <string
+ name="no_filtered_recent_people"
+ value="No recent people with that name." />
+ <string
+ name="no_one_near"
+ value="No one nearby. Looking for people to hang out with? Try the Destinations button below." />
+ <string
+ name="no_one_filtered_near"
+ value="No one nearby with that name." />
+ <string
+ name="no_friends_online"
+ value="No friends online" />
+ <string
+ name="no_friends"
+ value="No friends" />
+ <string
+ name="no_friends_msg">
+ Right-click on a Resident to add them as a friend.
+Looking for people to hang out with? Try the Destinations button below.
+ </string>
+ <string
+ name="no_filtered_friends_msg">
+ Didn't find what you're looking for? Try the Destinations button below..
+ </string>
+ <string
+ name="people_filter_label"
+ value="Filter People" />
+ <string
+ name="groups_filter_label"
+ value="Filter Groups" />
+ <!--
+ *WORKAROUND: for group_list.no_items_msg & group_list.no_filtered_items_msg attributes.
+ They are not defined as translatable in VLT. See EXT-5931
+ -->
+ <string
+ name="no_filtered_groups_msg"
+ value="Didn't find what you're looking for? Try [secondlife:///app/search/groups/[SEARCH_TERM] Search]." />
+ <string
+ name="no_groups_msg"
+ value="Looking for Groups to join? Try [secondlife:///app/search/groups Search]." />
+ <string
+ name="MiniMapToolTipMsg"
+ value="[REGION](Double-click to open Map, shift-drag to pan)"/>
+ <string
+ name="AltMiniMapToolTipMsg"
+ value="[REGION](Double-click to teleport, shift-drag to pan)"/>
+ <filter_editor
+ follows="left|top|right"
+ height="23"
+ layout="topleft"
+ left="10"
+ label="Filter"
+ max_length="300"
+ name="filter_input"
+ text_color="Black"
+ text_pad_left="10"
+ top="3"
+ width="303" />
+ <tab_container
+ follows="all"
+ height="383"
+ layout="topleft"
+ left="5"
+ name="tabs"
+ tab_group="1"
+ tab_min_width="70"
+ tab_height="30"
+ tab_position="top"
+ top_pad="10"
+ halign="center"
+ width="317">
+ <panel
+ background_opaque="true"
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ bg_opaque_color="DkGray"
+ follows="all"
+ height="383"
+ label="NEARBY"
+ layout="topleft"
+ left="0"
+ help_topic="people_nearby_tab"
+ name="nearby_panel"
+ top="0"
+ width="313">
+ <net_map
+ bg_color="NetMapBackgroundColor"
+ follows="top|left|right"
+ layout="topleft"
+ left="3"
+ mouse_opaque="false"
+ name="Net Map"
+ width="307"
+ height="140"
+ top="0"/>
+ <avatar_list
+ allow_select="true"
+ follows="top|left|bottom|right"
+ height="216"
+ ignore_online_status="true"
+ layout="topleft"
+ left="3"
+ multi_select="true"
+ name="avatar_list"
+ top="145"
+ width="307" />
+ <panel
+ background_visible="true"
+ follows="left|right|bottom"
+ height="27"
+ label="bottom_panel"
+ layout="topleft"
+ left="3"
+ name="bottom_panel"
+ top_pad="0"
+ width="313">
+ <icon
+ follows="bottom|left|right"
+ height="25"
+ image_name="Toolbar_Right_Off"
+ layout="topleft"
+ left_pad="1"
+ name="dummy_icon"
+ width="241"
+ />
+ </panel>
+ </panel>
+ <panel
+ background_opaque="true"
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ bg_opaque_color="DkGray"
+ follows="all"
+ height="383"
+ label="MY FRIENDS"
+ layout="topleft"
+ left="0"
+ help_topic="people_friends_tab"
+ name="friends_panel"
+ top="0"
+ width="313">
+ <accordion
+ background_visible="true"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ follows="all"
+ height="356"
+ layout="topleft"
+ left="3"
+ name="friends_accordion"
+ top="0"
+ width="307">
+ <accordion_tab
+ layout="topleft"
+ height="172"
+ min_height="150"
+ name="tab_online"
+ title="Online">
+ <avatar_list
+ allow_select="true"
+ follows="all"
+ height="172"
+ layout="topleft"
+ left="0"
+ multi_select="true"
+ name="avatars_online"
+ show_permissions_granted="true"
+ top="0"
+ width="307" />
+ </accordion_tab>
+ <accordion_tab
+ layout="topleft"
+ height="173"
+ name="tab_all"
+ title="All">
+ <avatar_list
+ allow_select="true"
+ follows="all"
+ height="173"
+ layout="topleft"
+ left="0"
+ multi_select="true"
+ name="avatars_all"
+ show_permissions_granted="true"
+ top="0"
+ width="307" />
+ </accordion_tab>
+ </accordion>
+ <panel
+ background_visible="true"
+ follows="left|right|bottom"
+ height="27"
+ label="bottom_panel"
+ layout="topleft"
+ left="3"
+ name="bottom_panel"
+ top_pad="0"
+ width="313">
+
+ <layout_stack
+ animate="false"
+ border_size="0"
+ follows="left|right|bottom"
+ height="25"
+ layout="topleft"
+ orientation="horizontal"
+ top_pad="1"
+ left="0"
+ name="bottom_panel"
+ width="305">
+ <layout_panel
+ auto_resize="true"
+ height="25"
+ layout="topleft"
+ name="dummy_panel"
+ user_resize="false"
+ width="212">
+ <icon
+ follows="bottom|left|right"
+ height="25"
+ image_name="Toolbar_Middle_Off"
+ layout="topleft"
+ left="0"
+ top="0"
+ name="dummy_icon"
+ width="211" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ height="25"
+ layout="topleft"
+ name="trash_btn_panel"
+ user_resize="false"
+ width="31">
+ <dnd_button
+ follows="bottom|left"
+ height="25"
+ image_hover_unselected="Toolbar_Right_Over"
+ image_overlay="TrashItem_Off"
+ image_selected="Toolbar_Right_Selected"
+ image_unselected="Toolbar_Right_Off"
+ left="0"
+ layout="topleft"
+ name="del_btn"
+ tool_tip="Remove selected person from your Friends list"
+ top="0"
+ width="31"/>
+ </layout_panel>
+ </layout_stack><!--
+
+ <button
+ follows="bottom|left"
+ tool_tip="Options"
+ height="25"
+ image_hover_unselected="Toolbar_Left_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Left_Selected"
+ image_unselected="Toolbar_Left_Off"
+ layout="topleft"
+ left="0"
+ name="friends_viewsort_btn"
+ top="1"
+ width="31" />
+ <button
+ follows="bottom|left"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="AddItem_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="1"
+ name="add_btn"
+ tool_tip="Offer friendship to a Resident"
+ width="31" />
+ <icon
+ follows="bottom|left|right"
+ height="25"
+ image_name="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="1"
+ name="dummy_icon"
+ width="209"
+ />
+ <button
+ follows="bottom|left"
+ height="25"
+ image_hover_unselected="Toolbar_Right_Over"
+ image_overlay="TrashItem_Off"
+ image_selected="Toolbar_Right_Selected"
+ image_unselected="Toolbar_Right_Off"
+ layout="topleft"
+ left_pad="1"
+ name="del_btn"
+ tool_tip="Remove selected person from your Friends list"
+ width="31" />
+ --></panel>
+ <text
+ follows="all"
+ height="450"
+ left="13"
+ name="no_friends_help_text"
+ top="10"
+ width="293"
+ wrap="true" />
+ </panel>
+ <panel
+ background_opaque="true"
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ bg_opaque_color="DkGray"
+ follows="all"
+ height="383"
+ label="RECENT"
+ layout="topleft"
+ left="0"
+ help_topic="people_recent_tab"
+ name="recent_panel"
+ top="0"
+ width="313">
+ <avatar_list
+ allow_select="true"
+ follows="all"
+ height="356"
+ layout="topleft"
+ left="3"
+ multi_select="true"
+ name="avatar_list"
+ show_last_interaction_time="true"
+ top="0"
+ width="307" />
+ <panel
+ background_visible="true"
+ follows="left|right|bottom"
+ height="27"
+ label="bottom_panel"
+ layout="topleft"
+ left="0"
+ name="bottom_panel"
+ top_pad="0"
+ width="313">
+ <button
+ follows="bottom|left"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="AddItem_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="1"
+ name="add_friend_btn"
+ tool_tip="Add selected Resident to your friends List"
+ width="31">
+ <commit_callback
+ function="People.addFriend" />
+ </button>
+ <icon
+ follows="bottom|left|right"
+ height="25"
+ image_name="Toolbar_Right_Off"
+ layout="topleft"
+ left_pad="1"
+ name="dummy_icon"
+ width="241"
+ />
+ </panel>
+ </panel>
+ </tab_container>
+ <panel
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ left="8"
+ top_pad="4"
+ name="button_bar"
+ width="313">
+
+<!--********************************Profile; IM; Call, Share, Teleport********************************-->
+ <layout_stack
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ name="bottom_bar_ls"
+ left="0"
+ orientation="horizontal"
+ top_pad="0"
+ width="313">
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left="0"
+ name="view_profile_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="68">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Profile"
+ layout="topleft"
+ left="1"
+ name="view_profile_btn"
+ tool_tip="Show picture, groups, and other Residents information"
+ top="0"
+ width="67" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="chat_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="41">
+ <button
+ follows="bottom|left|right"
+ left="1"
+ height="23"
+ label="IM"
+ layout="topleft"
+ name="im_btn"
+ tool_tip="Open instant message session"
+ top="0"
+ width="40" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="chat_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="77">
+ <button
+ follows="bottom|left|right"
+ left="1"
+ height="23"
+ label="Teleport"
+ layout="topleft"
+ name="teleport_btn"
+ tool_tip="Offer teleport"
+ top="0"
+ width="76" />
+ </layout_panel>
+ </layout_stack>
+
+<!--********************************Group Profile; Group Chat; Group Call buttons************************-->
+ <layout_stack
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ mouse_opaque="false"
+ name="bottom_bar_ls1"
+ left="0"
+ orientation="horizontal"
+ top="0"
+ width="313">
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left="0"
+ mouse_opaque="false"
+ name="group_info_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="108">
+ <button
+ follows="bottom|left|right"
+ left="1"
+ height="23"
+ label="Group Profile"
+ layout="topleft"
+ mouse_opaque="false"
+ name="group_info_btn"
+ tool_tip="Show group information"
+ top="0"
+ width="107" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ mouse_opaque="false"
+ name="chat_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="101">
+ <button
+ follows="bottom|left|right"
+ left="1"
+ height="23"
+ label="Group Chat"
+ layout="topleft"
+ mouse_opaque="false"
+ name="chat_btn"
+ tool_tip="Open chat session"
+ top="0"
+ width="100" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ mouse_opaque="false"
+ name="group_call_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="96">
+ <button
+ follows="bottom|left|right"
+ left="1"
+ height="23"
+ label="Group Call"
+ layout="topleft"
+ mouse_opaque="false"
+ name="group_call_btn"
+ tool_tip="Call this group"
+ top="0"
+ width="95" />
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/en/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..9f2f41ba31
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/panel_side_tray_tab_caption.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ bottom="0"
+ follows="left|top|right"
+ height="5"
+ width="333"
+ layout="topleft"
+ left="0"
+ name="sidetray_tab_panel">
+</panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_status_bar.xml b/indra/newview/skins/minimal/xui/en/panel_status_bar.xml
new file mode 100644
index 0000000000..6ccd0e938d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/panel_status_bar.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_opaque="true"
+ background_visible="true"
+ bg_opaque_color="MouseGray"
+ chrome="true"
+ follows="top|right"
+ height="30"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="status"
+ top="19"
+ tab_stop="false"
+ width="70">
+ <panel.string
+ name="packet_loss_tooltip">
+ Packet Loss
+ </panel.string>
+ <panel.string
+ name="bandwidth_tooltip">
+ Bandwidth
+ </panel.string>
+ <panel.string
+ name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string
+ name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string
+ name="buycurrencylabel">
+ L$ [AMT]
+ </panel.string>
+ <button
+ follows="right|top"
+ height="16"
+ image_selected="Play_Off"
+ image_unselected="Pause_Off"
+ image_pressed="Pause_Press"
+ image_pressed_selected="Play_Press"
+ is_toggle="true"
+ left="15"
+ top="7"
+ name="media_toggle_btn"
+ tool_tip="Start/Stop All Media (Music, Video, Web pages)"
+ width="16" >
+ </button>
+ <button
+ follows="right|top"
+ height="16"
+ image_selected="AudioMute_Off"
+ image_pressed="Audio_Press"
+ image_unselected="Audio_Off"
+ is_toggle="true"
+ left_pad="5"
+ top="8"
+ name="volume_btn"
+ tool_tip="Global Volume Control"
+ width="16" />
+</panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_volume_pulldown.xml b/indra/newview/skins/minimal/xui/en/panel_volume_pulldown.xml
new file mode 100644
index 0000000000..36ad39abe8
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/panel_volume_pulldown.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_opaque="true"
+ background_visible="true"
+ bg_opaque_image="Volume_Background"
+ bg_alpha_image="Volume_Background"
+ border_visible="false"
+ border="false"
+ chrome="true"
+ follows="bottom"
+ height="150"
+ layout="topleft"
+ name="volumepulldown_floater"
+ width="32">
+ <slider
+ control_name="AudioLevelMaster"
+ follows="left|top"
+ left="0"
+ top="1"
+ orientation="vertical"
+ height="140"
+ increment="0.05"
+ initial_value="0.5"
+ layout="topleft"
+ name="mastervolume"
+ show_text="false"
+ slider_label.halign="right"
+ top_pad="2"
+ volume="true">
+ <slider.commit_callback
+ function="Vol.setControlFalse"
+ parameter="MuteAudio" />
+ </slider>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/en/widgets/location_input.xml b/indra/newview/skins/minimal/xui/en/widgets/location_input.xml
new file mode 100644
index 0000000000..fe06a2d816
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/en/widgets/location_input.xml
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!--
+*TODO: Replace hardcoded buttons width/height with getting this info from the button images.
+ Currently that doesn't work because LLUIImage::getWidth/getHeight() return 1 for the images.
+-->
+<location_input font="SansSerifSmall"
+ maturity_help_topic="maturity_rating"
+ add_landmark_hpad="0"
+ icon_hpad="2"
+ allow_text_entry="true"
+ list_position="below"
+ show_text_as_tentative="false"
+ max_chars="20"
+ follows="left|top"
+ allow_new_values="true"
+ >
+ <!-- *NOTE: Tooltips are in strings.xml so they can be localized.
+ See LocationCtrlAddLandmarkTooltip etc. -->
+ <info_button
+ name="Place Information"
+ width="0"
+ height="0"
+ visible="false"
+ left="6"
+ top="20"
+ follows="left|top"
+ hover_glow_amount="0.15" />
+ <add_landmark_button name="Add Landmark"
+ hover_glow_amount="0.15"
+ width="0"
+ height="0"
+ visible="false"
+ follows="right|top"
+ scale_image="false"
+ top="19"
+ left="-3" />
+ <maturity_button
+ name="maturity_icon"
+ width="0"
+ height="0"
+ visible="false"
+ top="20"
+ follows="left|top"
+ />
+ <for_sale_button
+ name="for_sale_btn"
+ width="0"
+ height="0"
+ visible="false"
+ follows="right|top"
+ scale_image="false"
+ top="21"
+ />
+ <voice_icon
+ enabled="true"
+ name="voice_icon"
+ width="0"
+ height="0"
+ visible="false"
+ top="21"
+ follows="right|top"
+ />
+ <fly_icon
+ name="fly_icon"
+ width="0"
+ height="0"
+ visible="false"
+ top="21"
+ follows="right|top"
+ />
+ <push_icon
+ name="push_icon"
+ width="0"
+ height="0"
+ visible="false"
+ top="21"
+ follows="right|top"
+ />
+ <build_icon
+ name="build_icon"
+ width="0"
+ height="0"
+ visible="false"
+ top="21"
+ follows="right|top"
+ />
+ <scripts_icon
+ name="scripts_icon"
+ width="0"
+ height="0"
+ visible="false"
+ top="21"
+ follows="right|top"
+ />
+ <damage_icon
+ name="damage_icon"
+ width="0"
+ height="0"
+ visible="false"
+ top="19"
+ left="2"
+ follows="right|top"
+ />
+ <!-- Default text color is invisible on top of nav bar background -->
+ <damage_text
+ name="damage_text"
+ width="0"
+ height="0"
+ max_length="0"
+ top="17"
+ follows="right|top"
+ halign="right"
+ font="SansSerifSmall"
+ text_color="TextFgColor"
+ />
+ <combo_button
+ name="Location History"
+ label=""
+ pad_right="0"/>
+ <combo_list
+ bg_writeable_color="MenuDefaultBgColor"
+ page_lines="10"
+ scroll_bar_bg_visible="true" />
+ <combo_editor name="Combo Text Entry"
+ text_pad_left="4"
+ select_on_focus="false"
+ font="SansSerifSmall"
+ bevel_style="none"
+ border_style="line"
+ border.border_thickness="0" />
+</location_input>
diff --git a/indra/newview/skins/minimal/xui/es/floater_camera.xml b/indra/newview/skins/minimal/xui/es/floater_camera.xml
new file mode 100644
index 0000000000..ccf3d4bf91
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/floater_camera.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="camera_floater" title="">
+ <floater.string name="rotate_tooltip">
+ Girar la cámara alrededor de lo enfocado
+ </floater.string>
+ <floater.string name="zoom_tooltip">
+ Hacer zoom con la cámara en lo enfocado
+ </floater.string>
+ <floater.string name="move_tooltip">
+ Mover la cámara arriba y abajo, izquierda y derecha
+ </floater.string>
+ <floater.string name="camera_modes_title">
+ Modos de cámara
+ </floater.string>
+ <floater.string name="pan_mode_title">
+ Orbital - Zoom - Panóramica
+ </floater.string>
+ <floater.string name="presets_mode_title">
+ Vistas predefinidas
+ </floater.string>
+ <floater.string name="free_mode_title">
+ Centrar el objeto
+ </floater.string>
+ <panel name="controls">
+ <panel name="preset_views_list">
+ <panel_camera_item name="front_view">
+ <panel_camera_item.text name="front_view_text">
+ De frente
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="group_view">
+ <panel_camera_item.text name="side_view_text">
+ Vista lateral
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="rear_view">
+ <panel_camera_item.text name="rear_view_text">
+ Desde detrás
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="camera_modes_list">
+ <panel_camera_item name="object_view">
+ <panel_camera_item.text name="object_view_text">
+ Vista de objeto
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="mouselook_view">
+ <panel_camera_item.text name="mouselook_view_text">
+ Vista subjetiva
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="zoom" tool_tip="Hacer zoom con la cámara en lo enfocado">
+ <joystick_rotate name="cam_rotate_stick" tool_tip="La cámara gira alrededor del punto de vista"/>
+ <slider_bar name="zoom_slider" tool_tip="Hacer zoom en lo enfocado"/>
+ <joystick_track name="cam_track_stick" tool_tip="Mueve la cámara arriba y abajo, a izquierda y derecha"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="presets_btn" tool_tip="Vistas predefinidas"/>
+ <button label="" name="pan_btn" tool_tip="Orbital - Zoom - Panóramica"/>
+ <button label="" name="avatarview_btn" tool_tip="Modos de cámara"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/es/floater_help_browser.xml b/indra/newview/skins/minimal/xui/es/floater_help_browser.xml
new file mode 100644
index 0000000000..67590ebfbb
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/floater_help_browser.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="INDICACIONES">
+ <floater.string name="loading_text">
+ Cargando...
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="external_controls"/>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/es/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/es/floater_nearby_chat.xml
new file mode 100644
index 0000000000..1fee9ab056
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/floater_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="CHAT">
+ <check_box label="Traducir chat (mediante Google)" name="translate_chat_checkbox"/>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/es/inspect_avatar.xml b/indra/newview/skins/minimal/xui/es/inspect_avatar.xml
new file mode 100644
index 0000000000..1d70fa6a90
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/inspect_avatar.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [AGE]
+ </string>
+ <string name="Details">
+ [SL_PROFILE]
+ </string>
+ <text name="user_details">
+ Ésta es mi descripción de Second Life que, por cierto, me encanta. Pero, por lo que sea, me he enrollado más de la cuenta y la descripción es larguísima.
+ </text>
+ <slider name="volume_slider" tool_tip="Volumen de la voz" value="0.5"/>
+ <button label="Añadir como amigo" name="add_friend_btn"/>
+ <button label="MI" name="im_btn"/>
+ <button label="Perfil" name="view_profile_btn"/>
+ <panel name="moderator_panel">
+ <button label="Desactivar la voz" name="disable_voice"/>
+ <button label="Activar la voz" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/es/inspect_object.xml b/indra/newview/skins/minimal/xui/es/inspect_object.xml
new file mode 100644
index 0000000000..d608b4a0f7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/inspect_object.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_object">
+ <string name="Creator">
+ Por [CREATOR]
+ </string>
+ <string name="CreatorAndOwner">
+ Por [CREATOR]
+Propietario [OWNER]
+ </string>
+ <string name="Price">
+ [AMOUNT] L$
+ </string>
+ <string name="PriceFree">
+ ¡Gratis!
+ </string>
+ <string name="Touch">
+ Tocar
+ </string>
+ <string name="Sit">
+ Sentarme
+ </string>
+ <text name="object_name" value="Test Object Name That Is actually two lines and Really Long"/>
+ <text name="price_text">
+ 30.000 L$
+ </text>
+ <text name="object_description">
+ This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really?
+ </text>
+ <button label="Comprar" name="buy_btn"/>
+ <button label="Pagar" name="pay_btn"/>
+ <button label="Coger una copia" name="take_free_copy_btn"/>
+ <button label="Tocar" name="touch_btn"/>
+ <button label="Sentarme" name="sit_btn"/>
+ <button label="Abrir" name="open_btn"/>
+ <icon name="secure_browsing" tool_tip="Navegación segura"/>
+ <button label="Más" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/es/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/es/menu_add_wearable_gear.xml
new file mode 100644
index 0000000000..f2367c72a3
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_add_wearable_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Add Wearable Gear Menu">
+ <menu_item_check label="Ordenar por los más recientes" name="sort_by_most_recent"/>
+ <menu_item_check label="Ordenar alfabéticamente" name="sort_by_name"/>
+ <menu_item_check label="Ordenar por tipo" name="sort_by_type"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/es/menu_attachment_other.xml
new file mode 100644
index 0000000000..00bdb74881
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Ver el perfil" name="Profile..."/>
+ <menu_item_call label="Añadir como amigo" name="Add Friend"/>
+ <menu_item_call label="MI" name="Send IM..."/>
+ <menu_item_call label="Llamada" name="Call"/>
+ <menu_item_call label="Invitar al grupo" name="Invite..."/>
+ <menu_item_call label="Ignorar" name="Avatar Mute"/>
+ <menu_item_call label="Denunciar" name="abuse"/>
+ <menu_item_call label="Congelar" name="Freeze..."/>
+ <menu_item_call label="Expulsar" name="Eject..."/>
+ <menu_item_call label="Depurar las texturas" name="Debug..."/>
+ <menu_item_call label="Acercar el zoom" name="Zoom In"/>
+ <menu_item_call label="Pagar" name="Pay..."/>
+ <menu_item_call label="Perfil del objeto" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/es/menu_attachment_self.xml
new file mode 100644
index 0000000000..ab76c92d65
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_attachment_self.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="Tocar" name="Attachment Object Touch"/>
+ <menu_item_call label="Editar" name="Edit..."/>
+ <menu_item_call label="Quitar" name="Detach"/>
+ <menu_item_call label="Sentarte" name="Sit Down Here"/>
+ <menu_item_call label="Levantarme" name="Stand Up"/>
+ <menu_item_call label="Cambiar vestuario" name="Change Outfit"/>
+ <menu_item_call label="Editar mi vestuario" name="Edit Outfit"/>
+ <menu_item_call label="Editar mi anatomía" name="Edit My Shape"/>
+ <menu_item_call label="Mis amigos" name="Friends..."/>
+ <menu_item_call label="Mis grupos" name="Groups..."/>
+ <menu_item_call label="Mi perfil" name="Profile..."/>
+ <menu_item_call label="Depurar las texturas" name="Debug..."/>
+ <menu_item_call label="Soltar" name="Drop"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/es/menu_avatar_icon.xml
new file mode 100644
index 0000000000..fe7331a108
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="Ver el perfil" name="Show Profile"/>
+ <menu_item_call label="Enviar un MI..." name="Send IM"/>
+ <menu_item_call label="Añadir como amigo..." name="Add Friend"/>
+ <menu_item_call label="Quitar de los amigos..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/es/menu_avatar_other.xml
new file mode 100644
index 0000000000..7df2d7c4e0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Ver el perfil" name="Profile..."/>
+ <menu_item_call label="Añadir como amigo" name="Add Friend"/>
+ <menu_item_call label="MI" name="Send IM..."/>
+ <menu_item_call label="Llamada" name="Call"/>
+ <menu_item_call label="Invitar al grupo" name="Invite..."/>
+ <menu_item_call label="Ignorar" name="Avatar Mute"/>
+ <menu_item_call label="Denunciar" name="abuse"/>
+ <menu_item_call label="Congelar" name="Freeze..."/>
+ <menu_item_call label="Expulsar" name="Eject..."/>
+ <menu_item_call label="Depurar las texturas" name="Debug..."/>
+ <menu_item_call label="Acercar el zoom" name="Zoom In"/>
+ <menu_item_call label="Pagar" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/es/menu_avatar_self.xml
new file mode 100644
index 0000000000..50f8384b0f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_avatar_self.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="Sentarte" name="Sit Down Here"/>
+ <menu_item_call label="Levantarme" name="Stand Up"/>
+ <context_menu label="Quitarme" name="Take Off &gt;">
+ <context_menu label="Ropas" name="Clothes &gt;">
+ <menu_item_call label="Camisa" name="Shirt"/>
+ <menu_item_call label="Pantalón" name="Pants"/>
+ <menu_item_call label="Falda" name="Skirt"/>
+ <menu_item_call label="Zapatos" name="Shoes"/>
+ <menu_item_call label="Calcetines" name="Socks"/>
+ <menu_item_call label="Chaqueta" name="Jacket"/>
+ <menu_item_call label="Guantes" name="Gloves"/>
+ <menu_item_call label="Camiseta" name="Self Undershirt"/>
+ <menu_item_call label="Ropa interior" name="Self Underpants"/>
+ <menu_item_call label="Tatuaje" name="Self Tattoo"/>
+ <menu_item_call label="Alfa" name="Self Alpha"/>
+ <menu_item_call label="Toda la ropa" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD" name="Object Detach HUD"/>
+ <context_menu label="Quitar" name="Object Detach"/>
+ <menu_item_call label="Quitarse todo" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Cambiar vestuario" name="Chenge Outfit"/>
+ <menu_item_call label="Editar mi vestuario" name="Edit Outfit"/>
+ <menu_item_call label="Editar mi anatomía" name="Edit My Shape"/>
+ <menu_item_call label="Mis amigos" name="Friends..."/>
+ <menu_item_call label="Mis grupos" name="Groups..."/>
+ <menu_item_call label="Mi perfil" name="Profile..."/>
+ <menu_item_call label="Depurar las texturas" name="Debug..."/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/es/menu_bottomtray.xml
new file mode 100644
index 0000000000..62683f3076
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_bottomtray.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Botón Gestos" name="ShowGestureButton"/>
+ <menu_item_check label="Botón Moverse" name="ShowMoveButton"/>
+ <menu_item_check label="Botón Vista" name="ShowCameraButton"/>
+ <menu_item_check label="Botón Foto" name="ShowSnapshotButton"/>
+ <menu_item_check label="Botón Barra lateral" name="ShowSidebarButton"/>
+ <menu_item_check label="Botón Construir" name="ShowBuildButton"/>
+ <menu_item_check label="Botón Buscar" name="ShowSearchButton"/>
+ <menu_item_check label="Botón Mapa" name="ShowWorldMapButton"/>
+ <menu_item_check label="Botón Minimapa" name="ShowMiniMapButton"/>
+ <menu_item_call label="Cortar" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="Copiar" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="Pegar" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="Borrar" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="Seleccionar todo" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/es/menu_cof_attachment.xml
new file mode 100644
index 0000000000..7541530601
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_cof_attachment.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Attachment">
+ <menu_item_call label="Quitar" name="detach"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/es/menu_cof_body_part.xml
new file mode 100644
index 0000000000..56b95bdc3b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_cof_body_part.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Body">
+ <menu_item_call label="Reemplazar" name="replace"/>
+ <menu_item_call label="Editar" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/es/menu_cof_clothing.xml
new file mode 100644
index 0000000000..3c0c588284
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_cof_clothing.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Clothing">
+ <menu_item_call label="Quitarme" name="take_off"/>
+ <menu_item_call label="Editar" name="edit"/>
+ <menu_item_call label="Reemplazar" name="replace"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/es/menu_cof_gear.xml
new file mode 100644
index 0000000000..ff8ad0977a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear COF">
+ <menu label="Ropas nuevas" name="COF.Gear.New_Clothes"/>
+ <menu label="Nuevas partes del cuerpo" name="COF.Geear.New_Body_Parts"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_edit.xml b/indra/newview/skins/minimal/xui/es/menu_edit.xml
new file mode 100644
index 0000000000..96fc9d8881
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_edit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu label="Editar" name="Edit">
+ <menu_item_call label="Deshacer" name="Undo"/>
+ <menu_item_call label="Rehacer" name="Redo"/>
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Pegar" name="Paste"/>
+ <menu_item_call label="Borrar" name="Delete"/>
+ <menu_item_call label="Duplicar" name="Duplicate"/>
+ <menu_item_call label="Seleccionar todo" name="Select All"/>
+ <menu_item_call label="Deseleccionar" name="Deselect"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_favorites.xml b/indra/newview/skins/minimal/xui/es/menu_favorites.xml
new file mode 100644
index 0000000000..c8a7858ddb
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Teleportarse" name="Teleport To Landmark"/>
+ <menu_item_call label="Ver/Editar el hito" name="Landmark Open"/>
+ <menu_item_call label="Copiar la SLurl" name="Copy slurl"/>
+ <menu_item_call label="Mostrar en el mapa" name="Show On Map"/>
+ <menu_item_call label="Copiar" name="Landmark Copy"/>
+ <menu_item_call label="Pegar" name="Landmark Paste"/>
+ <menu_item_call label="Borrar" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/es/menu_gesture_gear.xml
new file mode 100644
index 0000000000..24706eb2c8
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_gesture_gear.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gesture_gear">
+ <menu_item_call label="Añadir a / Quitar de los favoritos" name="activate"/>
+ <menu_item_call label="Copiar" name="copy_gesture"/>
+ <menu_item_call label="Pegar" name="paste"/>
+ <menu_item_call label="Copiar la UUID" name="copy_uuid"/>
+ <menu_item_call label="Añadir al vestuario actual" name="save_to_outfit"/>
+ <menu_item_call label="Editar" name="edit_gesture"/>
+ <menu_item_call label="Inspeccionar" name="inspect"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_group_plus.xml b/indra/newview/skins/minimal/xui/es/menu_group_plus.xml
new file mode 100644
index 0000000000..6b26ba42c4
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Entrar al grupo..." name="item_join"/>
+ <menu_item_call label="Grupo nuevo..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/es/menu_hide_navbar.xml
new file mode 100644
index 0000000000..22a1873234
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_hide_navbar.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="Mostrar la barra de navegación" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Mostrar la barra de favoritos" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="Mostrar mini-barra de ubicación" name="ShowMiniLocationPanel"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/es/menu_im_well_button.xml
new file mode 100644
index 0000000000..c8f6c217cc
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_im_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="IM Well Button Context Menu">
+ <menu_item_call label="Cerrar todo" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/es/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..e11e9bdc58
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="Acabar la sesión" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/es/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..a5e60ea40b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="Información del grupo" name="Show Profile"/>
+ <menu_item_call label="Mostrar la sesión" name="Chat"/>
+ <menu_item_call label="Acabar la sesión" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/es/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..492801026c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="Ver el perfil" name="Show Profile"/>
+ <menu_item_call label="Añadir como amigo" name="Add Friend"/>
+ <menu_item_call label="Mostrar la sesión" name="Send IM"/>
+ <menu_item_call label="Acabar la sesión" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..ebe33cea11
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="Ver el perfil" name="view_profile"/>
+ <menu_item_call label="Añadir como amigo" name="add_friend"/>
+ <menu_item_call label="MI" name="im"/>
+ <menu_item_call label="Teleportarse" name="teleport"/>
+ <menu_item_call label="Ignorar" name="block"/>
+ <menu_item_call label="Designorar" name="unblock"/>
+ <menu_item_call label="Denunciar" name="report"/>
+ <menu_item_call label="Congelar" name="freeze"/>
+ <menu_item_call label="Expulsar" name="eject"/>
+ <menu_item_call label="Expulsar" name="kick"/>
+ <menu_item_call label="CSR" name="csr"/>
+ <menu_item_call label="Depurar las texturas" name="debug"/>
+ <menu_item_call label="Encontrar en el mapa" name="find_on_map"/>
+ <menu_item_call label="Acercar el zoom" name="zoom_in"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/es/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..bcdc25894f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_inspect_object_gear.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Tocar" name="touch"/>
+ <menu_item_call label="Sentarse" name="sit"/>
+ <menu_item_call label="Pagar" name="pay"/>
+ <menu_item_call label="Comprar" name="buy"/>
+ <menu_item_call label="Tomar" name="take"/>
+ <menu_item_call label="Coger una copia" name="take_copy"/>
+ <menu_item_call label="Abrir" name="open"/>
+ <menu_item_call label="Editar" name="edit"/>
+ <menu_item_call label="Ponerse" name="wear"/>
+ <menu_item_call label="Añadir" name="add"/>
+ <menu_item_call label="Denunciar" name="report"/>
+ <menu_item_call label="Ignorar" name="block"/>
+ <menu_item_call label="Acercar el zoom" name="zoom_in"/>
+ <menu_item_call label="Quitar" name="remove"/>
+ <menu_item_call label="Más información" name="more_info"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/es/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..c8a1e9d9da
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_inspect_self_gear.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Sentarte" name="sit_down_here"/>
+ <menu_item_call label="Levantarme" name="stand_up"/>
+ <menu_item_call label="Cambiar vestuario" name="change_outfit"/>
+ <menu_item_call label="Mi perfil" name="my_profile"/>
+ <menu_item_call label="Mis amigos" name="my_friends"/>
+ <menu_item_call label="Mis grupos" name="my_groups"/>
+ <menu_item_call label="Depurar las texturas" name="Debug..."/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/es/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..20d99afde1
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_inv_offer_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="InvOfferChiclet Menu">
+ <menu_item_call label="Cerrar" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_inventory.xml b/indra/newview/skins/minimal/xui/es/menu_inventory.xml
new file mode 100644
index 0000000000..94ee162bbc
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_inventory.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Compartir" name="Share"/>
+ <menu_item_call label="Comprar" name="Task Buy"/>
+ <menu_item_call label="Abrir" name="Task Open"/>
+ <menu_item_call label="Ejecutar" name="Task Play"/>
+ <menu_item_call label="Propiedades" name="Task Properties"/>
+ <menu_item_call label="Renombrar" name="Task Rename"/>
+ <menu_item_call label="Borrar" name="Task Remove"/>
+ <menu_item_call label="Vaciar la papelera" name="Empty Trash"/>
+ <menu_item_call label="Vaciar Objetos Perdidos" name="Empty Lost And Found"/>
+ <menu_item_call label="Carpeta nueva" name="New Folder"/>
+ <menu_item_call label="Script nuevo" name="New Script"/>
+ <menu_item_call label="Nota nueva" name="New Note"/>
+ <menu_item_call label="Gesto nuevo" name="New Gesture"/>
+ <menu label="Ropas nuevas" name="New Clothes">
+ <menu_item_call label="Camisa nueva" name="New Shirt"/>
+ <menu_item_call label="Pantalones nuevos" name="New Pants"/>
+ <menu_item_call label="Zapatos nuevos" name="New Shoes"/>
+ <menu_item_call label="Calcetines nuevos" name="New Socks"/>
+ <menu_item_call label="Chaqueta nueva" name="New Jacket"/>
+ <menu_item_call label="Falda nueva" name="New Skirt"/>
+ <menu_item_call label="Guantes nuevos" name="New Gloves"/>
+ <menu_item_call label="Camiseta nueva" name="New Undershirt"/>
+ <menu_item_call label="Ropa interior nueva" name="New Underpants"/>
+ <menu_item_call label="Nueva capa Alpha" name="New Alpha Mask"/>
+ <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/>
+ </menu>
+ <menu label="Nuevas partes del cuerpo" name="New Body Parts">
+ <menu_item_call label="Forma nueva" name="New Shape"/>
+ <menu_item_call label="Piel nueva" name="New Skin"/>
+ <menu_item_call label="Pelo nuevo" name="New Hair"/>
+ <menu_item_call label="Ojos nuevos" name="New Eyes"/>
+ </menu>
+ <menu label="Change Type" name="Change Type">
+ <menu_item_call label="Por defecto" name="Default"/>
+ <menu_item_call label="Guantes" name="Gloves"/>
+ <menu_item_call label="Chaqueta" name="Jacket"/>
+ <menu_item_call label="Pantalón" name="Pants"/>
+ <menu_item_call label="Forma" name="Shape"/>
+ <menu_item_call label="Zapatos" name="Shoes"/>
+ <menu_item_call label="Camisa" name="Shirt"/>
+ <menu_item_call label="Falda" name="Skirt"/>
+ <menu_item_call label="Ropa interior" name="Underpants"/>
+ <menu_item_call label="Camiseta" name="Undershirt"/>
+ </menu>
+ <menu_item_call label="Teleportar" name="Landmark Open"/>
+ <menu_item_call label="Abrir" name="Animation Open"/>
+ <menu_item_call label="Abrir" name="Sound Open"/>
+ <menu_item_call label="Reemplazar el vestuario" name="Replace Outfit"/>
+ <menu_item_call label="Añadir al vestuario" name="Add To Outfit"/>
+ <menu_item_call label="Quitar del vestuario actual" name="Remove From Outfit"/>
+ <menu_item_call label="Encontrar el original" name="Find Original"/>
+ <menu_item_call label="Eliminar el ítem" name="Purge Item"/>
+ <menu_item_call label="Restaurar el ítem" name="Restore Item"/>
+ <menu_item_call label="Abrir" name="Open"/>
+ <menu_item_call label="Abrir original" name="Open Original"/>
+ <menu_item_call label="Propiedades" name="Properties"/>
+ <menu_item_call label="Renombrar" name="Rename"/>
+ <menu_item_call label="Copiar la UUID" name="Copy Asset UUID"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Pegar" name="Paste"/>
+ <menu_item_call label="Pegar como enlace" name="Paste As Link"/>
+ <menu_item_call label="Borrar" name="Remove Link"/>
+ <menu_item_call label="Borrar" name="Delete"/>
+ <menu_item_call label="Borrar carpeta del sistema" name="Delete System Folder"/>
+ <menu_item_call label="Empezar multiconferencia" name="Conference Chat Folder"/>
+ <menu_item_call label="Escuchar" name="Sound Play"/>
+ <menu_item_call label="Acerca del hito" name="About Landmark"/>
+ <menu_item_call label="Escuchar en el mundo" name="Animation Play"/>
+ <menu_item_call label="Ejecutarla para usted" name="Animation Audition"/>
+ <menu_item_call label="Enviar un mensaje instantáneo" name="Send Instant Message"/>
+ <menu_item_call label="Ofrecer teleporte..." name="Offer Teleport..."/>
+ <menu_item_call label="Empezar multiconferencia" name="Conference Chat"/>
+ <menu_item_call label="Activar" name="Activate"/>
+ <menu_item_call label="Desactivar" name="Deactivate"/>
+ <menu_item_call label="Guardar como" name="Save As"/>
+ <menu_item_call label="Quitarse" name="Detach From Yourself"/>
+ <menu_item_call label="Ponerme" name="Wearable And Object Wear"/>
+ <menu label="Anexar a" name="Attach To"/>
+ <menu label="Anexar como HUD" name="Attach To HUD"/>
+ <menu_item_call label="Editar" name="Wearable Edit"/>
+ <menu_item_call label="Añadir" name="Wearable Add"/>
+ <menu_item_call label="Quitarse" name="Take Off"/>
+ <menu_item_call label="--sin opciones--" name="--no options--"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/es/menu_inventory_add.xml
new file mode 100644
index 0000000000..ba106e8335
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_inventory_add.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="Subir" name="upload">
+ <menu_item_call label="Imagen ([COST] L$)..." name="Upload Image"/>
+ <menu_item_call label="Sonido ([COST] L$)..." name="Upload Sound"/>
+ <menu_item_call label="Animación ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="Masivo ([COST] L$ por archivo)..." name="Bulk Upload"/>
+ <menu_item_call label="Configurar los permisos por defecto de subida" name="perm prefs"/>
+ </menu>
+ <menu_item_call label="Carpeta nueva" name="New Folder"/>
+ <menu_item_call label="Script nuevo" name="New Script"/>
+ <menu_item_call label="Nota nueva" name="New Note"/>
+ <menu_item_call label="Gesto nuevo" name="New Gesture"/>
+ <menu label="Ropas nuevas" name="New Clothes">
+ <menu_item_call label="Camisa nueva" name="New Shirt"/>
+ <menu_item_call label="Pantalón nuevo" name="New Pants"/>
+ <menu_item_call label="Zapatos nuevos" name="New Shoes"/>
+ <menu_item_call label="Calcetines nuevos" name="New Socks"/>
+ <menu_item_call label="Chaqueta nueva" name="New Jacket"/>
+ <menu_item_call label="Falda nueva" name="New Skirt"/>
+ <menu_item_call label="Guantes nuevos" name="New Gloves"/>
+ <menu_item_call label="Camiseta nueva" name="New Undershirt"/>
+ <menu_item_call label="Ropa interior nueva" name="New Underpants"/>
+ <menu_item_call label="Nueva Alfa" name="New Alpha"/>
+ <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/>
+ </menu>
+ <menu label="Nuevas partes del cuerpo" name="New Body Parts">
+ <menu_item_call label="Forma nueva" name="New Shape"/>
+ <menu_item_call label="Piel nueva" name="New Skin"/>
+ <menu_item_call label="Pelo nuevo" name="New Hair"/>
+ <menu_item_call label="Ojos nuevos" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/es/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..8e498fefba
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_inventory_gear_default.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_gear_default">
+ <menu_item_call label="Nueva ventana del inventario" name="new_window"/>
+ <menu_item_check label="Ordenar alfabéticamente" name="sort_by_name"/>
+ <menu_item_check label="Ordenar por los más recientes" name="sort_by_recent"/>
+ <menu_item_check label="Las carpetas del sistema, arriba" name="sort_system_folders_to_top"/>
+ <menu_item_call label="Ver los filtros" name="show_filters"/>
+ <menu_item_call label="Restablecer los filtros" name="reset_filters"/>
+ <menu_item_call label="Cerrar todas las carpetas" name="close_folders"/>
+ <menu_item_call label="Vaciar Objetos Perdidos" name="empty_lostnfound"/>
+ <menu_item_call label="Guardar la textura como" name="Save Texture As"/>
+ <menu_item_call label="Compartir" name="Share"/>
+ <menu_item_call label="Encontrar el original" name="Find Original"/>
+ <menu_item_call label="Encontrar todos los enlazados" name="Find All Links"/>
+ <menu_item_call label="Vaciar la Papelera" name="empty_trash"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_land.xml b/indra/newview/skins/minimal/xui/es/menu_land.xml
new file mode 100644
index 0000000000..b0f15be1b6
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="Acerca del terreno" name="Place Information..."/>
+ <menu_item_call label="Sentarme aquí" name="Sit Here"/>
+ <menu_item_call label="Comprar este terreno" name="Land Buy"/>
+ <menu_item_call label="Comprar un pase" name="Land Buy Pass"/>
+ <menu_item_call label="Construir" name="Create"/>
+ <menu_item_call label="Modificar el terreno" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_landmark.xml b/indra/newview/skins/minimal/xui/es/menu_landmark.xml
new file mode 100644
index 0000000000..f69b1539b8
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="Copiar la SLurl" name="copy"/>
+ <menu_item_call label="Borrar" name="delete"/>
+ <menu_item_call label="Crear un Destacado" name="pick"/>
+ <menu_item_call label="Añadir a la barra de favoritos" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_login.xml b/indra/newview/skins/minimal/xui/es/menu_login.xml
new file mode 100644
index 0000000000..c27d624732
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_login.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Login Menu">
+ <menu label="Yo" name="File">
+ <menu_item_call label="Preferencias" name="Preferences..."/>
+ <menu_item_call label="Salir de [APP_NAME]" name="Quit"/>
+ </menu>
+ <menu label="Ayuda" name="Help">
+ <menu_item_call label="Ayuda de [SECOND_LIFE]" name="Second Life Help"/>
+ <menu_item_call label="Acerca de [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu_item_check label="Mostrar el menú &apos;Debug&apos;" name="Show Debug Menu"/>
+ <menu label="Depurar" name="Debug">
+ <menu_item_call label="Mostrar las configuraciones del depurador" name="Debug Settings"/>
+ <menu_item_call label="Configuraciones del Visor/Color" name="UI/Color Settings"/>
+ <menu label="Pruebas de la interfaz" name="UI Tests"/>
+ <menu_item_call label="Definir el tamaño de la ventana..." name="Set Window Size..."/>
+ <menu_item_call label="Mostrar los &apos;TOS&apos;" name="TOS"/>
+ <menu_item_call label="Mostrar mensaje crítico" name="Critical"/>
+ <menu_item_call label="Prueba de navegadores de medios" name="Web Browser Test"/>
+ <menu_item_call label="Prueba de ventanas de contenidos web" name="Web Content Floater Test"/>
+ <menu_item_check label="Mostrar el selector de Grid" name="Show Grid Picker"/>
+ <menu_item_call label="Mostrar la consola de notificaciones" name="Show Notifications Console"/>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/es/menu_mini_map.xml b/indra/newview/skins/minimal/xui/es/menu_mini_map.xml
new file mode 100644
index 0000000000..07d1b08572
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_mini_map.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Zoom cerca" name="Zoom Close"/>
+ <menu_item_call label="Zoom medio" name="Zoom Medium"/>
+ <menu_item_call label="Zoom lejos" name="Zoom Far"/>
+ <menu_item_call label="Zoom por defecto" name="Zoom Default"/>
+ <menu_item_check label="Girar el mapa" name="Rotate Map"/>
+ <menu_item_check label="Centrar automáticamente" name="Auto Center"/>
+ <menu_item_call label="Parar la búsqueda" name="Stop Tracking"/>
+ <menu_item_call label="Mapa del mundo" name="World Map"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_navbar.xml b/indra/newview/skins/minimal/xui/es/menu_navbar.xml
new file mode 100644
index 0000000000..63e5468020
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="Mostrar las coordenadas" name="Show Coordinates"/>
+ <menu_item_check label="Mostrar las propiedades de la parcela" name="Show Parcel Properties"/>
+ <menu_item_call label="Hito" name="Landmark"/>
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Pegar" name="Paste"/>
+ <menu_item_call label="Borrar" name="Delete"/>
+ <menu_item_call label="Seleccionar todo" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/es/menu_nearby_chat.xml
new file mode 100644
index 0000000000..94b281b6c7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="Mostrar la gente que está cerca..." name="nearby_people"/>
+ <menu_item_check label="Ver el texto ignorado" name="muted_text"/>
+ <menu_item_check label="Mostrar los iconos del amigo" name="show_buddy_icons"/>
+ <menu_item_check label="Mostrar los nombres" name="show_names"/>
+ <menu_item_check label="Mostrar los iconos y los nombres" name="show_icons_and_names"/>
+ <menu_item_call label="Tamaño de la fuente" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/es/menu_notification_well_button.xml
new file mode 100644
index 0000000000..0562d35be7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_notification_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Notification Well Button Context Menu">
+ <menu_item_call label="Cerrar todo" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_object.xml b/indra/newview/skins/minimal/xui/es/menu_object.xml
new file mode 100644
index 0000000000..06121e0c09
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_object.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="Tocar" name="Object Touch">
+ <menu_item_call.on_enable name="EnableTouch" parameter="Tocar"/>
+ </menu_item_call>
+ <menu_item_call label="Editar" name="Edit..."/>
+ <menu_item_call label="Construir" name="Build"/>
+ <menu_item_call label="Abrir" name="Open"/>
+ <menu_item_call label="Sentarme aquí" name="Object Sit"/>
+ <menu_item_call label="Levantarme" name="Object Stand Up"/>
+ <menu_item_call label="Perfil del objeto" name="Object Inspect"/>
+ <menu_item_call label="Acercar el zoom" name="Zoom In"/>
+ <context_menu label="Ponerme" name="Put On">
+ <menu_item_call label="Ponerme" name="Wear"/>
+ <menu_item_call label="Añadir" name="Add"/>
+ <context_menu label="Anexar" name="Object Attach"/>
+ <context_menu label="Anexar el HUD" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="Quitar" name="Remove">
+ <menu_item_call label="Denunciar una infracción" name="Report Abuse..."/>
+ <menu_item_call label="Ignorar" name="Object Mute"/>
+ <menu_item_call label="Devolver" name="Return..."/>
+ <menu_item_call label="Eliminar" name="Delete"/>
+ </context_menu>
+ <menu_item_call label="Tomar" name="Pie Object Take"/>
+ <menu_item_call label="Coger una copia" name="Take Copy"/>
+ <menu_item_call label="Pagar" name="Pay..."/>
+ <menu_item_call label="Comprar" name="Buy..."/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_object_icon.xml b/indra/newview/skins/minimal/xui/es/menu_object_icon.xml
new file mode 100644
index 0000000000..7e4578b950
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="Perfil del objeto..." name="Object Profile"/>
+ <menu_item_call label="Ignorar..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/es/menu_outfit_gear.xml
new file mode 100644
index 0000000000..3b11bceecf
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_outfit_gear.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear Outfit">
+ <menu_item_call label="Ponerme - Reemplazar el vestuario actual" name="wear"/>
+ <menu_item_call label="Ponerme - Añadir al vestuario actual" name="wear_add"/>
+ <menu_item_call label="Quitarme - Quitar del vestuario actual" name="take_off"/>
+ <menu label="Ropas nuevas" name="New Clothes">
+ <menu_item_call label="Camisa nueva" name="New Shirt"/>
+ <menu_item_call label="Pantalón nuevo" name="New Pants"/>
+ <menu_item_call label="Zapatos nuevos" name="New Shoes"/>
+ <menu_item_call label="Calcetines nuevos" name="New Socks"/>
+ <menu_item_call label="Chaqueta nueva" name="New Jacket"/>
+ <menu_item_call label="Falda nueva" name="New Skirt"/>
+ <menu_item_call label="Guantes nuevos" name="New Gloves"/>
+ <menu_item_call label="Camiseta nueva" name="New Undershirt"/>
+ <menu_item_call label="Ropa interior nueva" name="New Underpants"/>
+ <menu_item_call label="Nueva Alfa" name="New Alpha"/>
+ <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/>
+ </menu>
+ <menu label="Nuevas partes del cuerpo" name="New Body Parts">
+ <menu_item_call label="Anatomía nueva" name="New Shape"/>
+ <menu_item_call label="Piel nueva" name="New Skin"/>
+ <menu_item_call label="Pelo nuevo" name="New Hair"/>
+ <menu_item_call label="Ojos nuevos" name="New Eyes"/>
+ </menu>
+ <menu_item_call label="Renombrar el vestuario" name="rename"/>
+ <menu_item_call label="Borrar el vestuario" name="delete_outfit"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/es/menu_outfit_tab.xml
new file mode 100644
index 0000000000..4136082a62
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_outfit_tab.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit">
+ <menu_item_call label="Ponerme - Reemplazar el vestuario actual" name="wear_replace"/>
+ <menu_item_call label="Ponerme - Añadir al vestuario actual" name="wear_add"/>
+ <menu_item_call label="Quitarme - Quitar del vestuario actual" name="take_off"/>
+ <menu_item_call label="Editar el vestuario" name="edit"/>
+ <menu_item_call label="Renombrar el vestuario" name="rename"/>
+ <menu_item_call label="Borrar el vestuario" name="delete"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_participant_list.xml b/indra/newview/skins/minimal/xui/es/menu_participant_list.xml
new file mode 100644
index 0000000000..f6eedd1170
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_participant_list.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_check label="Ordenar alfabéticamente" name="SortByName"/>
+ <menu_item_check label="Ordenar según las intervenciones recientes" name="SortByRecentSpeakers"/>
+ <menu_item_call label="Ver el perfil" name="View Profile"/>
+ <menu_item_call label="Añadir como amigo" name="Add Friend"/>
+ <menu_item_call label="MI" name="IM"/>
+ <menu_item_call label="Llamar" name="Call"/>
+ <menu_item_call label="Compartir" name="Share"/>
+ <menu_item_call label="Pagar" name="Pay"/>
+ <menu_item_check label="Ver los iconos de la gente" name="View Icons"/>
+ <menu_item_check label="Ignorar la voz" name="Block/Unblock"/>
+ <menu_item_check label="Ignorar el texto" name="MuteText"/>
+ <context_menu label="Opciones del moderador" name="Moderator Options">
+ <menu_item_check label="Permitir el chat de texto" name="AllowTextChat"/>
+ <menu_item_call label="Ignorar a este participante" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Quitar el silencio a este participante" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Silenciar a todos" name="ModerateVoiceMute"/>
+ <menu_item_call label="Quitar el silencio a todos" name="ModerateVoiceUnmute"/>
+ </context_menu>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/es/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..3899ad9e96
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_people_friends_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/>
+ <menu_item_check label="Ordenar por estatus" name="sort_status"/>
+ <menu_item_check label="Ver los iconos de la gente" name="view_icons"/>
+ <menu_item_check label="Ver permisos concedidos" name="view_permissions"/>
+ <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_people_groups.xml b/indra/newview/skins/minimal/xui/es/menu_people_groups.xml
new file mode 100644
index 0000000000..51bd2c7208
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_people_groups.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Ver la información" name="View Info"/>
+ <menu_item_call label="Chat" name="Chat"/>
+ <menu_item_call label="Llamar" name="Call"/>
+ <menu_item_call label="Activar" name="Activate"/>
+ <menu_item_call label="Dejar" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/es/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..1bd3efb611
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Mostrar los iconos de grupo" name="Display Group Icons"/>
+ <menu_item_call label="Dejar el grupo seleccionado" name="Leave Selected Group"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/es/menu_people_nearby.xml
new file mode 100644
index 0000000000..dc1486d879
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_people_nearby.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="Ver el perfil" name="View Profile"/>
+ <menu_item_call label="Añadir como amigo" name="Add Friend"/>
+ <menu_item_call label="Quitarle como amigo" name="Remove Friend"/>
+ <menu_item_call label="MI" name="IM"/>
+ <menu_item_call label="Llamar" name="Call"/>
+ <menu_item_call label="Mapa" name="Map"/>
+ <menu_item_call label="Compartir" name="Share"/>
+ <menu_item_call label="Pagar" name="Pay"/>
+ <menu_item_check label="Ignorar / No ignorar" name="Block/Unblock"/>
+ <menu_item_call label="Ofrecer teleporte" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/es/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..227c5ebe58
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_people_nearby_multiselect.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="Añadir como amigos" name="Add Friends"/>
+ <menu_item_call label="Quitar amigos" name="Remove Friend"/>
+ <menu_item_call label="MI" name="IM"/>
+ <menu_item_call label="Llamar" name="Call"/>
+ <menu_item_call label="Compartir" name="Share"/>
+ <menu_item_call label="Pagar" name="Pay"/>
+ <menu_item_call label="Ofrecer teleporte" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/es/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..f0fe383c0c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Ordenar según las intervenciones recientes" name="sort_by_recent_speakers"/>
+ <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/>
+ <menu_item_check label="Ordenar según distancia" name="sort_distance"/>
+ <menu_item_check label="Ver los iconos de la gente" name="view_icons"/>
+ <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/es/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..e4aaa89110
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Ordenar por los más recientes" name="sort_most"/>
+ <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/>
+ <menu_item_check label="Ver los iconos de la gente" name="view_icons"/>
+ <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_picks.xml b/indra/newview/skins/minimal/xui/es/menu_picks.xml
new file mode 100644
index 0000000000..9da68d7c9b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="Información" name="pick_info"/>
+ <menu_item_call label="Editar" name="pick_edit"/>
+ <menu_item_call label="Teleportar" name="pick_teleport"/>
+ <menu_item_call label="Mapa" name="pick_map"/>
+ <menu_item_call label="Eliminar" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/es/menu_picks_plus.xml
new file mode 100644
index 0000000000..cc59bf1d29
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="Destacado nuevo" name="create_pick"/>
+ <menu_item_call label="Clasificado nuevo" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_place.xml b/indra/newview/skins/minimal/xui/es/menu_place.xml
new file mode 100644
index 0000000000..675f0699e9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_place.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="Crear un hito" name="landmark"/>
+ <menu_item_call label="Crear un destacado" name="pick"/>
+ <menu_item_call label="Comprar un pase" name="pass"/>
+ <menu_item_call label="Editar" name="edit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/es/menu_place_add_button.xml
new file mode 100644
index 0000000000..4b2f908a06
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Añadir una carpeta" name="add_folder"/>
+ <menu_item_call label="Añadir este hito" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/es/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..bf46eb58e3
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_places_gear_folder.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Añadir este hito" name="add_landmark"/>
+ <menu_item_call label="Añadir una carpeta" name="add_folder"/>
+ <menu_item_call label="Cortar" name="cut"/>
+ <menu_item_call label="Copiar" name="copy_folder"/>
+ <menu_item_call label="Pegar" name="paste"/>
+ <menu_item_call label="Renombrar" name="rename"/>
+ <menu_item_call label="Borrar" name="delete"/>
+ <menu_item_call label="Abrir" name="expand"/>
+ <menu_item_call label="Cerrar" name="collapse"/>
+ <menu_item_call label="Abrir todas las carpetas" name="expand_all"/>
+ <menu_item_call label="Cerrar todas las carpetas" name="collapse_all"/>
+ <menu_item_check label="Ordenar por fecha" name="sort_by_date"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/es/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..eac85de846
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_places_gear_landmark.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_ladmark_gear">
+ <menu_item_call label="Teleportar" name="teleport"/>
+ <menu_item_call label="Más información" name="more_info"/>
+ <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
+ <menu_item_call label="Añadir un hito" name="add_landmark"/>
+ <menu_item_call label="Añadir una carpeta" name="add_folder"/>
+ <menu_item_call label="Cortar" name="cut"/>
+ <menu_item_call label="Copiar el hito" name="copy_landmark"/>
+ <menu_item_call label="Copiar la SLurl" name="copy_slurl"/>
+ <menu_item_call label="Pegar" name="paste"/>
+ <menu_item_call label="Renombrar" name="rename"/>
+ <menu_item_call label="Eliminar" name="delete"/>
+ <menu_item_call label="Abrir todas las carpetas" name="expand_all"/>
+ <menu_item_call label="Cerrar todas las carpetas" name="collapse_all"/>
+ <menu_item_check label="Ordenar por fecha" name="sort_by_date"/>
+ <menu_item_call label="Crear un Destacado" name="create_pick"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/es/menu_profile_overflow.xml
new file mode 100644
index 0000000000..5ee8c50949
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_profile_overflow.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Mapa" name="show_on_map"/>
+ <menu_item_call label="Pagar" name="pay"/>
+ <menu_item_call label="Compartir" name="share"/>
+ <menu_item_call label="Ignorar" name="block"/>
+ <menu_item_call label="Designorar" name="unblock"/>
+ <menu_item_call label="Expulsar" name="kick"/>
+ <menu_item_call label="Congelar" name="freeze"/>
+ <menu_item_call label="Descongelar" name="unfreeze"/>
+ <menu_item_call label="CSR" name="csr"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/es/menu_save_outfit.xml
new file mode 100644
index 0000000000..a04ec75b60
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_save_outfit.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="save_outfit_menu">
+ <menu_item_call label="Guardar" name="save_outfit"/>
+ <menu_item_call label="Guardar como" name="save_as_new_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/es/menu_script_chiclet.xml
new file mode 100644
index 0000000000..f517baf566
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_script_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="ScriptChiclet Menu">
+ <menu_item_call label="Cerrar" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_slurl.xml b/indra/newview/skins/minimal/xui/es/menu_slurl.xml
new file mode 100644
index 0000000000..ca19acec6e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_slurl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Acerca de la URL" name="about_url"/>
+ <menu_item_call label="Teleportar a la URL" name="teleport_to_url"/>
+ <menu_item_call label="Mapa" name="show_on_map"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/es/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..b708f3bc20
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="Abrir todas las carpetas" name="Expand all folders"/>
+ <menu_item_call label="Cerrar todas las carpetas" name="Collapse all folders"/>
+ <menu_item_call label="Limpiar el historial de teleportes" name="Clear Teleport History"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..ed33c55aca
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Teleportarse" name="Teleport"/>
+ <menu_item_call label="Más información" name="More Information"/>
+ <menu_item_call label="Copiar al portapapeles" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/es/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..17e90422a5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Abrir" name="TabOpen"/>
+ <menu_item_call label="Cerrar" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_text_editor.xml b/indra/newview/skins/minimal/xui/es/menu_text_editor.xml
new file mode 100644
index 0000000000..095e461734
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Pegar" name="Paste"/>
+ <menu_item_call label="Borrar" name="Delete"/>
+ <menu_item_call label="Seleccionar todo" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/es/menu_topinfobar.xml
new file mode 100644
index 0000000000..2125fd51b2
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_topinfobar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_topinfobar">
+ <menu_item_check label="Mostrar las coordenadas" name="Show Coordinates"/>
+ <menu_item_check label="Mostrar las propiedades de la parcela" name="Show Parcel Properties"/>
+ <menu_item_call label="Hito" name="Landmark"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_url_agent.xml b/indra/newview/skins/minimal/xui/es/menu_url_agent.xml
new file mode 100644
index 0000000000..a089c8f68e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar el perfil del Residente" name="show_agent"/>
+ <menu_item_call label="Copiar el nombre al portapapeles" name="url_copy_label"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_url_group.xml b/indra/newview/skins/minimal/xui/es/menu_url_group.xml
new file mode 100644
index 0000000000..79374b9739
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar la información del grupo" name="show_group"/>
+ <menu_item_call label="Copiar el grupo al portapapeles" name="url_copy_label"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_url_http.xml b/indra/newview/skins/minimal/xui/es/menu_url_http.xml
new file mode 100644
index 0000000000..585c059ff3
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Abrir la página web" name="url_open"/>
+ <menu_item_call label="Abrir en el navegador incorporado" name="url_open_internal"/>
+ <menu_item_call label="Abrir en mi navegador" name="url_open_external"/>
+ <menu_item_call label="Copiar la URL al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/es/menu_url_inventory.xml
new file mode 100644
index 0000000000..13a8711c76
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar ítem del inventario" name="show_item"/>
+ <menu_item_call label="Copiar el nombre al portapapeles" name="url_copy_label"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_url_map.xml b/indra/newview/skins/minimal/xui/es/menu_url_map.xml
new file mode 100644
index 0000000000..f96a0c7170
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
+ <menu_item_call label="Teleportarse a la localización" name="teleport_to_location"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/es/menu_url_objectim.xml
new file mode 100644
index 0000000000..8791a290af
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar la información del objeto" name="show_object"/>
+ <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
+ <menu_item_call label="Teleportarse a la posición del objeto" name="teleport_to_object"/>
+ <menu_item_call label="Copiar el nombre del objeto al portapapeles" name="url_copy_label"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/es/menu_url_parcel.xml
new file mode 100644
index 0000000000..9e789ef8ee
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar la información de la parcela" name="show_parcel"/>
+ <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/es/menu_url_slapp.xml
new file mode 100644
index 0000000000..7147dcd3cf
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Ejecutar este comando" name="run_slapp"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/es/menu_url_slurl.xml
new file mode 100644
index 0000000000..4ab47c2f61
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar la información del lugar" name="show_place"/>
+ <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
+ <menu_item_call label="Teleportarse a este lugar" name="teleport_to_location"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/es/menu_url_teleport.xml
new file mode 100644
index 0000000000..8f86a91be3
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Teleportarse a este lugar" name="teleport"/>
+ <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_viewer.xml b/indra/newview/skins/minimal/xui/es/menu_viewer.xml
new file mode 100644
index 0000000000..776ccfe21b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_viewer.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Main Menu">
+ <menu label="Ayuda" name="Help">
+ <menu_item_call label="Ayuda de [SECOND_LIFE]" name="Second Life Help"/>
+ </menu>
+ <menu label="Avanzado" name="Advanced">
+ <menu label="Atajos de teclado" name="Shortcuts">
+ <menu_item_check label="Volar" name="Fly"/>
+ <menu_item_call label="Cerrar la ventana" name="Close Window"/>
+ <menu_item_call label="Cerrar todas las ventanas" name="Close All Windows"/>
+ <menu_item_call label="Volver a la vista por defecto" name="Reset View"/>
+ </menu>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/es/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/es/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..4bffa689e7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_wearable_list_item.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit Wearable Context Menu">
+ <menu_item_call label="Reemplazar" name="wear_replace"/>
+ <menu_item_call label="Ponerme" name="wear_wear"/>
+ <menu_item_call label="Añadir" name="wear_add"/>
+ <menu_item_call label="Quitarme / Quitar" name="take_off_or_detach"/>
+ <menu_item_call label="Quitar" name="detach"/>
+ <context_menu label="Anexar a" name="wearable_attach_to"/>
+ <context_menu label="Anexar al HUD" name="wearable_attach_to_hud"/>
+ <menu_item_call label="Quitarme" name="take_off"/>
+ <menu_item_call label="Editar" name="edit"/>
+ <menu_item_call label="Perfil del elemento" name="object_profile"/>
+ <menu_item_call label="Mostrar original" name="show_original"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/es/menu_wearing_gear.xml
new file mode 100644
index 0000000000..9d9ce75e53
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_wearing_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear Wearing">
+ <menu_item_call label="Editar el vestuario" name="edit"/>
+ <menu_item_call label="Quitarme" name="takeoff"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/es/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/es/menu_wearing_tab.xml
new file mode 100644
index 0000000000..64fd7ce4cf
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/menu_wearing_tab.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Wearing">
+ <menu_item_call label="Quitarme" name="take_off"/>
+ <menu_item_call label="Quitar" name="detach"/>
+ <menu_item_call label="Editar el vestuario" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/es/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/es/panel_bottomtray.xml
new file mode 100644
index 0000000000..9ab30b5613
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/panel_bottomtray.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
+ <string name="SpeakBtnToolTip" value="Activa/Desactiva el micrófono"/>
+ <string name="VoiceControlBtnToolTip" value="Muestra/Oculta el panel del control de voz"/>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Gestos" name="Gesture" tool_tip="Muestra/Oculta los gestos"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <bottomtray_button label="Visión" name="camera_btn" tool_tip="Muestra/Oculta los controles de la cámara"/>
+ </layout_panel>
+ <layout_panel name="avatar_and_destinations_panel">
+ <radio_group name="avatar_and_destination_btns">
+ <radio_item name="destination_btn" value="0"/>
+ <radio_item name="avatar_btn" value="1"/>
+ </radio_group>
+ </layout_panel>
+ <layout_panel name="people_panel">
+ <bottomtray_button label="Gente" name="show_people_button" tool_tip="Muestra la ventana de gente"/>
+ </layout_panel>
+ <layout_panel name="profile_panel">
+ <bottomtray_button label="Perfil" name="show_profile_btn" tool_tip="Muestra la ventana del perfil"/>
+ </layout_panel>
+ <layout_panel name="howto_panel">
+ <bottomtray_button label="Indicaciones" name="show_help_btn" tool_tip="Abrir los temas sobre indicaciones de Second Life"/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Conversaciones"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Notificaciones"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml
new file mode 100644
index 0000000000..7d4db6a630
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/panel_im_control_panel.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="button_stack">
+ <layout_panel name="view_profile_btn_panel">
+ <button label="Perfil" name="view_profile_btn"/>
+ </layout_panel>
+ <layout_panel name="add_friend_btn_panel">
+ <button label="Añadir como amigo" name="add_friend_btn"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_panel">
+ <button label="Teleportarme" name="teleport_btn" tool_tip="Ofrecer teleporte a esta persona"/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="Compartir" name="share_btn"/>
+ </layout_panel>
+ <layout_panel name="pay_btn_panel">
+ <button label="Pagar" name="pay_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Llamar" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Colgar" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Controles de la voz" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/es/panel_login.xml b/indra/newview/skins/minimal/xui/es/panel_login.xml
new file mode 100644
index 0000000000..161ea19b0e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/panel_login.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_login">
+ <panel.string name="create_account_url">
+ http://join.secondlife.com/index.php?lang=es-ES
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php?lang=es
+ </panel.string>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="username_text">
+ Nombre de usuario:
+ </text>
+ <combo_box name="username_combo" tool_tip="El nombre de usuario que elegiste al registrarte, como bobsmith12 o Steller Sunshine"/>
+ <text name="password_text">
+ Contraseña:
+ </text>
+ <check_box label="Recordar la contraseña" name="remember_check"/>
+ <button label="Iniciar sesión" name="connect_btn"/>
+ <text name="mode_selection_text">
+ Modo:
+ </text>
+ <combo_box name="mode_combo">
+ <combo_box.item label="Básico (Predeterminado)" name="Basic"/>
+ <combo_box.item label="Avanzado" name="Advanced"/>
+ </combo_box>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ Registrarme
+ </text>
+ <text name="forgot_password_text">
+ ¿Olvidaste el nombre de usuario o la contraseña?
+ </text>
+ <text name="login_help">
+ ¿Necesitas ayuda para conectarte?
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/es/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/es/panel_navigation_bar.xml
new file mode 100644
index 0000000000..e8e95c3bac
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/panel_navigation_bar.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Volver a lo localización anterior"/>
+ <pull_button name="forward_btn" tool_tip="Ir una localización adelante"/>
+ <button name="home_btn" tool_tip="Teleportar a mi Base"/>
+ <location_input label="Localización" name="location_combo"/>
+ <search_combo_box label="Buscar" name="search_combo_box" tool_tip="Buscar">
+ <combo_editor label="Buscar en [SECOND_LIFE]" name="search_combo_editor"/>
+ </search_combo_box>
+ </panel>
+ <favorites_bar name="favorite" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquí!">
+ <label name="favorites_bar_label" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquí!">
+ Barra de Favoritos
+ </label>
+ <chevron_button name="&gt;&gt;" tool_tip="Ver más de Mis favoritos"/>
+ </favorites_bar>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/es/panel_people.xml b/indra/newview/skins/minimal/xui/es/panel_people.xml
new file mode 100644
index 0000000000..7d3157ef45
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/panel_people.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="Gente" name="people_panel">
+ <string name="no_recent_people" value="No hay gente reciente. ¿Estás buscando gente con la que juntarte? Prueba con el botón Destinos que aparece a continuación."/>
+ <string name="no_filtered_recent_people" value="No hay gente reciente con ese nombre."/>
+ <string name="no_one_near" value="No hay nadie cerca. ¿Estás buscando gente con la que juntarte? Prueba con el botón Destinos que aparece a continuación."/>
+ <string name="no_one_filtered_near" value="No hay nadie cerca con ese nombre."/>
+ <string name="no_friends_online" value="No hay amigos conectados"/>
+ <string name="no_friends" value="No hay amigos"/>
+ <string name="no_friends_msg">
+ Haz clic con el botón derecho del ratón en un residente para agregarlo como amigo.
+¿Estás buscando gente con la que juntarte? Prueba con el botón Destinos que aparece a continuación.
+ </string>
+ <string name="no_filtered_friends_msg">
+ ¿No encuentras lo que buscas? Prueba con el botón Destinos que aparece a continuación.
+ </string>
+ <string name="people_filter_label" value="Filtrar a la gente"/>
+ <string name="groups_filter_label" value="Filtrar a los grupos"/>
+ <string name="no_filtered_groups_msg" value="¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/groups/[SEARCH_TERM] Buscar]."/>
+ <string name="no_groups_msg" value="¿Buscas grupos en que participar? Prueba la [secondlife:///app/search/groups Búsqueda]."/>
+ <string name="MiniMapToolTipMsg" value="[REGIÓN](Haz doble clic para abrir el mapa y pulsa la tecla Mayús y arrastra para obtener una vista panorámica)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGIÓN](Haz doble clic para teleportarte y pulsa la tecla Mayús y arrastra para obtener una vista panorámica)"/>
+ <filter_editor label="Filtrar" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="CERCANA" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel"/>
+ </panel>
+ <panel label="MIS AMIGOS" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="Conectado"/>
+ <accordion_tab name="tab_all" title="Todos"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="bottom_panel">
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="del_btn" tool_tip="Quitar a la persona seleccionada de tu lista de amigos"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+ <panel label="RECIENTE" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="add_friend_btn" tool_tip="Añadir al Residente seleccionado a la lista de tus amigos"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <layout_stack name="bottom_bar_ls">
+ <layout_panel name="view_profile_btn_lp">
+ <button label="Perfil" name="view_profile_btn" tool_tip="Mostrar imágenes, grupos y otra información del Residente"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="MI" name="im_btn" tool_tip="Abrir una sesión de mensajes instantáneos"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Teleporte" name="teleport_btn" tool_tip="Ofrecer teleporte"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls1">
+ <layout_panel name="group_info_btn_lp">
+ <button label="Perfil del grupo" name="group_info_btn" tool_tip="Ver la información del grupo"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Chat de grupo" name="chat_btn" tool_tip="Abrir el chat"/>
+ </layout_panel>
+ <layout_panel name="group_call_btn_lp">
+ <button label="Llamar al grupo" name="group_call_btn" tool_tip="Llama a este grupo"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/es/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/es/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..775e343dc9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/panel_side_tray_tab_caption.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="Panel lateral"/>
+ <button name="undock" tool_tip="Soltar"/>
+ <button name="dock" tool_tip="Fijar"/>
+ <button name="show_help" tool_tip="Ver ayuda"/>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/es/panel_status_bar.xml b/indra/newview/skins/minimal/xui/es/panel_status_bar.xml
new file mode 100644
index 0000000000..ab76d3f994
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/panel_status_bar.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="status">
+ <panel.string name="StatBarDaysOfWeek">
+ Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado
+ </panel.string>
+ <panel.string name="StatBarMonthsOfYear">
+ Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Septiembre:Octubre:Noviembre:Diciembre
+ </panel.string>
+ <panel.string name="packet_loss_tooltip">
+ Pérdida de paquetes
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
+ Ancho de banda
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ [AMT] L$
+ </panel.string>
+ <panel name="balance_bg">
+ <text name="balance" tool_tip="Haz clic para actualizar tu saldo en L$" value="20 L$"/>
+ <button label="COMPRAR L$" name="buyL" tool_tip="Pulsa para comprar más L$"/>
+ </panel>
+ <text name="TimeText" tool_tip="Hora actual (Pacífico)">
+ 24:00 AM PST
+ </text>
+ <button name="media_toggle_btn" tool_tip="Iniciar/Parar todos los media (música, vídeo, páginas web)"/>
+ <button name="volume_btn" tool_tip="Control general del volumen"/>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/fr/floater_camera.xml b/indra/newview/skins/minimal/xui/fr/floater_camera.xml
new file mode 100644
index 0000000000..1d62a89ff2
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/floater_camera.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="camera_floater">
+ <floater.string name="rotate_tooltip">
+ Faire tourner la caméra autour du point central
+ </floater.string>
+ <floater.string name="zoom_tooltip">
+ Zoomer en direction du point central
+ </floater.string>
+ <floater.string name="move_tooltip">
+ Déplacer la caméra vers le haut et le bas, la gauche et la droite
+ </floater.string>
+ <floater.string name="camera_modes_title">
+ Modes
+ </floater.string>
+ <floater.string name="pan_mode_title">
+ Rotation - Zoom - Panoramique
+ </floater.string>
+ <floater.string name="presets_mode_title">
+ Préréglages
+ </floater.string>
+ <floater.string name="free_mode_title">
+ Voir l&apos;objet
+ </floater.string>
+ <panel name="controls">
+ <panel name="preset_views_list">
+ <panel_camera_item name="front_view">
+ <panel_camera_item.text name="front_view_text">
+ Vue frontale
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="group_view">
+ <panel_camera_item.text name="side_view_text">
+ Vue latérale
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="rear_view">
+ <panel_camera_item.text name="rear_view_text">
+ Vue arrière
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="camera_modes_list">
+ <panel_camera_item name="object_view">
+ <panel_camera_item.text name="object_view_text">
+ Vue de l&apos;objet
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="mouselook_view">
+ <panel_camera_item.text name="mouselook_view_text">
+ Vue subjective
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="zoom" tool_tip="Zoomer en direction du point central">
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Faire tourner la caméra autour du point central"/>
+ <slider_bar name="zoom_slider" tool_tip="Zoomer en direction du point central"/>
+ <joystick_track name="cam_track_stick" tool_tip="Déplacer la caméra vers le haut et le bas, la gauche et la droite"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="presets_btn" tool_tip="Préréglages"/>
+ <button label="" name="pan_btn" tool_tip="Rotation - Zoom - Panoramique"/>
+ <button label="" name="avatarview_btn" tool_tip="Modes"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/fr/floater_help_browser.xml b/indra/newview/skins/minimal/xui/fr/floater_help_browser.xml
new file mode 100644
index 0000000000..09d763b809
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/floater_help_browser.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="AIDE RAPIDE">
+ <floater.string name="loading_text">
+ Chargement…
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="external_controls"/>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/fr/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/fr/floater_nearby_chat.xml
new file mode 100644
index 0000000000..9b1b21c434
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/floater_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="CHAT PRÈS DE MOI">
+ <check_box label="Traduction du chat (fournie par Google)" name="translate_chat_checkbox"/>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/fr/inspect_avatar.xml b/indra/newview/skins/minimal/xui/fr/inspect_avatar.xml
new file mode 100644
index 0000000000..553646f8e9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/inspect_avatar.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [AGE]
+ </string>
+ <string name="Details">
+ [SL_PROFILE]
+ </string>
+ <text name="user_subtitle" value="11 mois, 3 jours"/>
+ <text name="user_details">
+ This is my second life description and I really think it is great. But for some reason my description is super extra long because I like to talk a whole lot
+ </text>
+ <slider name="volume_slider" tool_tip="Volume de la voix" value="0.5"/>
+ <button label="Devenir amis" name="add_friend_btn"/>
+ <button label="IM" name="im_btn"/>
+ <button label="Profil" name="view_profile_btn"/>
+ <panel name="moderator_panel">
+ <button label="Désactiver le chat vocal" name="disable_voice"/>
+ <button label="Activer le chat vocal" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/fr/inspect_object.xml b/indra/newview/skins/minimal/xui/fr/inspect_object.xml
new file mode 100644
index 0000000000..b66af7a2bf
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/inspect_object.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_object">
+ <string name="Creator">
+ Par [CREATOR]
+ </string>
+ <string name="CreatorAndOwner">
+ De [CREATOR]
+Propriétaire [OWNER]
+ </string>
+ <string name="Price">
+ [AMOUNT] L$
+ </string>
+ <string name="PriceFree">
+ Gratuit !
+ </string>
+ <string name="Touch">
+ Toucher
+ </string>
+ <string name="Sit">
+ M&apos;asseoir
+ </string>
+ <text name="object_name" value="Test Object Name That Is actually two lines and Really Long"/>
+ <text name="object_creator">
+ par secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+ </text>
+ <text name="price_text">
+ 30 000 L$
+ </text>
+ <text name="object_description">
+ This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really?
+ </text>
+ <text name="object_media_url">
+ http://www.superdupertest.com
+ </text>
+ <button label="Acheter" name="buy_btn"/>
+ <button label="Payer" name="pay_btn"/>
+ <button label="Prendre une copie" name="take_free_copy_btn"/>
+ <button label="Toucher" name="touch_btn"/>
+ <button label="M&apos;asseoir" name="sit_btn"/>
+ <button label="Ouvert" name="open_btn"/>
+ <icon name="secure_browsing" tool_tip="Navigation sécurisée"/>
+ <button label="Plus" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_add_wearable_gear.xml
new file mode 100644
index 0000000000..7e7993175e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_add_wearable_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Add Wearable Gear Menu">
+ <menu_item_check label="Trier en commençant par le plus récent" name="sort_by_most_recent"/>
+ <menu_item_check label="Trier par nom" name="sort_by_name"/>
+ <menu_item_check label="Trier par type" name="sort_by_type"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/fr/menu_attachment_other.xml
new file mode 100644
index 0000000000..f48513eb2b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Voir le profil" name="Profile..."/>
+ <menu_item_call label="Devenir amis" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Appeler" name="Call"/>
+ <menu_item_call label="Inviter dans le groupe" name="Invite..."/>
+ <menu_item_call label="Ignorer" name="Avatar Mute"/>
+ <menu_item_call label="Signaler" name="abuse"/>
+ <menu_item_call label="Figer" name="Freeze..."/>
+ <menu_item_call label="Expulser" name="Eject..."/>
+ <menu_item_call label="Déboguer les textures" name="Debug..."/>
+ <menu_item_call label="Zoomer en avant" name="Zoom In"/>
+ <menu_item_call label="Payer" name="Pay..."/>
+ <menu_item_call label="Profil de l&apos;objet" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/fr/menu_attachment_self.xml
new file mode 100644
index 0000000000..78198fb5a8
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_attachment_self.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="Toucher" name="Attachment Object Touch"/>
+ <menu_item_call label="Modifier" name="Edit..."/>
+ <menu_item_call label="Détacher" name="Detach"/>
+ <menu_item_call label="M&apos;asseoir" name="Sit Down Here"/>
+ <menu_item_call label="Me lever" name="Stand Up"/>
+ <menu_item_call label="Changer de tenue" name="Change Outfit"/>
+ <menu_item_call label="Modifier ma tenue" name="Edit Outfit"/>
+ <menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/>
+ <menu_item_call label="Mes amis" name="Friends..."/>
+ <menu_item_call label="Mes groupes" name="Groups..."/>
+ <menu_item_call label="Mon profil" name="Profile..."/>
+ <menu_item_call label="Déboguer les textures" name="Debug..."/>
+ <menu_item_call label="Lâcher" name="Drop"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/fr/menu_avatar_icon.xml
new file mode 100644
index 0000000000..3bac25c79b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="Voir le profil" name="Show Profile"/>
+ <menu_item_call label="Envoyer IM..." name="Send IM"/>
+ <menu_item_call label="Devenir amis..." name="Add Friend"/>
+ <menu_item_call label="Supprimer cet ami..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/fr/menu_avatar_other.xml
new file mode 100644
index 0000000000..08d1a20361
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Voir le profil" name="Profile..."/>
+ <menu_item_call label="Devenir amis" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Appeler" name="Call"/>
+ <menu_item_call label="Inviter dans le groupe" name="Invite..."/>
+ <menu_item_call label="Ignorer" name="Avatar Mute"/>
+ <menu_item_call label="Signaler" name="abuse"/>
+ <menu_item_call label="Figer" name="Freeze..."/>
+ <menu_item_call label="Expulser" name="Eject..."/>
+ <menu_item_call label="Déboguer les textures" name="Debug..."/>
+ <menu_item_call label="Zoomer en avant" name="Zoom In"/>
+ <menu_item_call label="Payer" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/fr/menu_avatar_self.xml
new file mode 100644
index 0000000000..c7ee2e9f88
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_avatar_self.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="M&apos;asseoir" name="Sit Down Here"/>
+ <menu_item_call label="Me lever" name="Stand Up"/>
+ <context_menu label="Enlever" name="Take Off &gt;">
+ <context_menu label="Habits" name="Clothes &gt;">
+ <menu_item_call label="Chemise" name="Shirt"/>
+ <menu_item_call label="Pantalon" name="Pants"/>
+ <menu_item_call label="Jupe" name="Skirt"/>
+ <menu_item_call label="Chaussures" name="Shoes"/>
+ <menu_item_call label="Chaussettes" name="Socks"/>
+ <menu_item_call label="Veste" name="Jacket"/>
+ <menu_item_call label="Gants" name="Gloves"/>
+ <menu_item_call label="Débardeur" name="Self Undershirt"/>
+ <menu_item_call label="Caleçon" name="Self Underpants"/>
+ <menu_item_call label="Tatouage" name="Self Tattoo"/>
+ <menu_item_call label="Alpha" name="Self Alpha"/>
+ <menu_item_call label="Tous les habits" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD" name="Object Detach HUD"/>
+ <context_menu label="Détacher" name="Object Detach"/>
+ <menu_item_call label="Tout détacher" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Changer de tenue" name="Chenge Outfit"/>
+ <menu_item_call label="Modifier ma tenue" name="Edit Outfit"/>
+ <menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/>
+ <menu_item_call label="Mes amis" name="Friends..."/>
+ <menu_item_call label="Mes groupes" name="Groups..."/>
+ <menu_item_call label="Mon profil" name="Profile..."/>
+ <menu_item_call label="Déboguer les textures" name="Debug..."/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/fr/menu_bottomtray.xml
new file mode 100644
index 0000000000..bfdc89c5bb
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_bottomtray.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Bouton Geste" name="ShowGestureButton"/>
+ <menu_item_check label="Bouton Bouger" name="ShowMoveButton"/>
+ <menu_item_check label="Bouton Affichage" name="ShowCameraButton"/>
+ <menu_item_check label="Bouton Photo" name="ShowSnapshotButton"/>
+ <menu_item_check label="Bouton Panneau latéral" name="ShowSidebarButton"/>
+ <menu_item_check label="Bouton Construire" name="ShowBuildButton"/>
+ <menu_item_check label="Bouton Rechercher" name="ShowSearchButton"/>
+ <menu_item_check label="Bouton Carte" name="ShowWorldMapButton"/>
+ <menu_item_check label="Bouton Mini-carte" name="ShowMiniMapButton"/>
+ <menu_item_call label="Couper" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="Copier" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="Coller" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="Supprimer" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="Tout sélectionner" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/fr/menu_cof_attachment.xml
new file mode 100644
index 0000000000..a4ead48b6b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_cof_attachment.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Attachment">
+ <menu_item_call label="Détacher" name="detach"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/fr/menu_cof_body_part.xml
new file mode 100644
index 0000000000..4b6907fcc6
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_cof_body_part.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Body">
+ <menu_item_call label="Remplacer" name="replace"/>
+ <menu_item_call label="Modifier" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/fr/menu_cof_clothing.xml
new file mode 100644
index 0000000000..03cc569704
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_cof_clothing.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Clothing">
+ <menu_item_call label="Enlever" name="take_off"/>
+ <menu_item_call label="Modifier" name="edit"/>
+ <menu_item_call label="Remplacer" name="replace"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_cof_gear.xml
new file mode 100644
index 0000000000..8276d57025
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear COF">
+ <menu label="Nouveaux habits" name="COF.Gear.New_Clothes"/>
+ <menu label="Nouvelles parties du corps" name="COF.Geear.New_Body_Parts"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_edit.xml b/indra/newview/skins/minimal/xui/fr/menu_edit.xml
new file mode 100644
index 0000000000..56669f31e1
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_edit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu label="Modifier" name="Edit">
+ <menu_item_call label="Annuler" name="Undo"/>
+ <menu_item_call label="Refaire" name="Redo"/>
+ <menu_item_call label="Couper" name="Cut"/>
+ <menu_item_call label="Copier" name="Copy"/>
+ <menu_item_call label="Coller" name="Paste"/>
+ <menu_item_call label="Supprimer" name="Delete"/>
+ <menu_item_call label="Dupliquer" name="Duplicate"/>
+ <menu_item_call label="Tout sélectionner" name="Select All"/>
+ <menu_item_call label="Désélectionner" name="Deselect"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_favorites.xml b/indra/newview/skins/minimal/xui/fr/menu_favorites.xml
new file mode 100644
index 0000000000..5f1545fde7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Téléporter" name="Teleport To Landmark"/>
+ <menu_item_call label="Voir/Modifier le repère" name="Landmark Open"/>
+ <menu_item_call label="Copier la SLurl" name="Copy slurl"/>
+ <menu_item_call label="Voir sur la carte" name="Show On Map"/>
+ <menu_item_call label="Copier" name="Landmark Copy"/>
+ <menu_item_call label="Coller" name="Landmark Paste"/>
+ <menu_item_call label="Supprimer" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_gesture_gear.xml
new file mode 100644
index 0000000000..062dd0f005
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_gesture_gear.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gesture_gear">
+ <menu_item_call label="Ajouter/Supprimer des favoris" name="activate"/>
+ <menu_item_call label="Copier" name="copy_gesture"/>
+ <menu_item_call label="Coller" name="paste"/>
+ <menu_item_call label="Copier l&apos;UUID" name="copy_uuid"/>
+ <menu_item_call label="Enregistrer dans la tenue actuelle" name="save_to_outfit"/>
+ <menu_item_call label="Modifier" name="edit_gesture"/>
+ <menu_item_call label="Inspecter" name="inspect"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_group_plus.xml b/indra/newview/skins/minimal/xui/fr/menu_group_plus.xml
new file mode 100644
index 0000000000..0db5afedc7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Rejoindre des groupes..." name="item_join"/>
+ <menu_item_call label="Nouveau groupe..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/fr/menu_hide_navbar.xml
new file mode 100644
index 0000000000..20af901ddc
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_hide_navbar.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="Afficher la barre de navigation" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Afficher la barre des favoris" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="Afficher la mini-barre d&apos;emplacement" name="ShowMiniLocationPanel"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/fr/menu_im_well_button.xml
new file mode 100644
index 0000000000..8ef1529e6b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_im_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="IM Well Button Context Menu">
+ <menu_item_call label="Tout fermer" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/fr/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..4d9a103058
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="Mettre fin à la session" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/fr/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..59f97d8b48
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="Profil du groupe" name="Show Profile"/>
+ <menu_item_call label="Afficher la session" name="Chat"/>
+ <menu_item_call label="Mettre fin à la session" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/fr/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..ecc8cee413
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="Voir le profil" name="Show Profile"/>
+ <menu_item_call label="Devenir amis" name="Add Friend"/>
+ <menu_item_call label="Afficher la session" name="Send IM"/>
+ <menu_item_call label="Mettre fin à la session" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..231a175ee5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_inspect_avatar_gear.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="Voir le profil" name="view_profile"/>
+ <menu_item_call label="Devenir amis" name="add_friend"/>
+ <menu_item_call label="IM" name="im"/>
+ <menu_item_call label="Téléporter" name="teleport"/>
+ <menu_item_call label="Ignorer" name="block"/>
+ <menu_item_call label="Ne plus ignorer" name="unblock"/>
+ <menu_item_call label="Signaler" name="report"/>
+ <menu_item_call label="Figer" name="freeze"/>
+ <menu_item_call label="Expulser" name="eject"/>
+ <menu_item_call label="Éjecter" name="kick"/>
+ <menu_item_call label="Représentant de l&apos;Assistance client" name="csr"/>
+ <menu_item_call label="Déboguer les textures" name="debug"/>
+ <menu_item_call label="Situer sur la carte" name="find_on_map"/>
+ <menu_item_call label="Zoomer en avant" name="zoom_in"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..074bb54cdc
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_inspect_object_gear.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Toucher" name="touch"/>
+ <menu_item_call label="M&apos;asseoir" name="sit"/>
+ <menu_item_call label="Payer" name="pay"/>
+ <menu_item_call label="Acheter" name="buy"/>
+ <menu_item_call label="Prendre" name="take"/>
+ <menu_item_call label="Prendre une copie" name="take_copy"/>
+ <menu_item_call label="Ouvrir" name="open"/>
+ <menu_item_call label="Modifier" name="edit"/>
+ <menu_item_call label="Porter" name="wear"/>
+ <menu_item_call label="Ajouter" name="add"/>
+ <menu_item_call label="Signaler" name="report"/>
+ <menu_item_call label="Ignorer" name="block"/>
+ <menu_item_call label="Zoomer en avant" name="zoom_in"/>
+ <menu_item_call label="Supprimer" name="remove"/>
+ <menu_item_call label="En savoir plus" name="more_info"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..3bc164788a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_inspect_self_gear.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="M&apos;asseoir" name="sit_down_here"/>
+ <menu_item_call label="Me lever" name="stand_up"/>
+ <menu_item_call label="Changer de tenue" name="change_outfit"/>
+ <menu_item_call label="Mon profil" name="my_profile"/>
+ <menu_item_call label="Mes amis" name="my_friends"/>
+ <menu_item_call label="Mes groupes" name="my_groups"/>
+ <menu_item_call label="Déboguer les textures" name="Debug..."/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/fr/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..a9b2883cca
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_inv_offer_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="InvOfferChiclet Menu">
+ <menu_item_call label="Fermer" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_inventory.xml b/indra/newview/skins/minimal/xui/fr/menu_inventory.xml
new file mode 100644
index 0000000000..a2279cf0ac
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_inventory.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Partager" name="Share"/>
+ <menu_item_call label="Acheter" name="Task Buy"/>
+ <menu_item_call label="Ouvrir" name="Task Open"/>
+ <menu_item_call label="Jouer" name="Task Play"/>
+ <menu_item_call label="Propriétés" name="Task Properties"/>
+ <menu_item_call label="Renommer" name="Task Rename"/>
+ <menu_item_call label="Supprimer" name="Task Remove"/>
+ <menu_item_call label="Vider la corbeille" name="Empty Trash"/>
+ <menu_item_call label="Vider les objets trouvés" name="Empty Lost And Found"/>
+ <menu_item_call label="Nouveau dossier" name="New Folder"/>
+ <menu_item_call label="Nouveau script" name="New Script"/>
+ <menu_item_call label="Nouvelle note" name="New Note"/>
+ <menu_item_call label="Nouveau geste" name="New Gesture"/>
+ <menu label="Nouveaux habits" name="New Clothes">
+ <menu_item_call label="Nouvelle chemise" name="New Shirt"/>
+ <menu_item_call label="Nouveau pantalon" name="New Pants"/>
+ <menu_item_call label="Nouvelles chaussures" name="New Shoes"/>
+ <menu_item_call label="Nouvelles chaussettes" name="New Socks"/>
+ <menu_item_call label="Nouvelle veste" name="New Jacket"/>
+ <menu_item_call label="Nouvelle jupe" name="New Skirt"/>
+ <menu_item_call label="Nouveaux gants" name="New Gloves"/>
+ <menu_item_call label="Nouveau débardeur" name="New Undershirt"/>
+ <menu_item_call label="Nouveau caleçon" name="New Underpants"/>
+ <menu_item_call label="Nouveau masque alpha" name="New Alpha Mask"/>
+ <menu_item_call label="Nouveau tatouage" name="New Tattoo"/>
+ </menu>
+ <menu label="Nouvelles parties du corps" name="New Body Parts">
+ <menu_item_call label="Nouvelle silhouette" name="New Shape"/>
+ <menu_item_call label="Nouvelle peau" name="New Skin"/>
+ <menu_item_call label="Nouveaux cheveux" name="New Hair"/>
+ <menu_item_call label="Nouveaux yeux" name="New Eyes"/>
+ </menu>
+ <menu label="Changer de type" name="Change Type">
+ <menu_item_call label="Défaut" name="Default"/>
+ <menu_item_call label="Gants" name="Gloves"/>
+ <menu_item_call label="Veste" name="Jacket"/>
+ <menu_item_call label="Pantalon" name="Pants"/>
+ <menu_item_call label="Silhouette" name="Shape"/>
+ <menu_item_call label="Chaussures" name="Shoes"/>
+ <menu_item_call label="Chemise" name="Shirt"/>
+ <menu_item_call label="Jupe" name="Skirt"/>
+ <menu_item_call label="Caleçon" name="Underpants"/>
+ <menu_item_call label="Débardeur" name="Undershirt"/>
+ </menu>
+ <menu_item_call label="Téléporter" name="Landmark Open"/>
+ <menu_item_call label="Ouvrir" name="Animation Open"/>
+ <menu_item_call label="Ouvrir" name="Sound Open"/>
+ <menu_item_call label="Remplacer la tenue actuelle" name="Replace Outfit"/>
+ <menu_item_call label="Ajouter à la tenue actuelle" name="Add To Outfit"/>
+ <menu_item_call label="Enlever de la tenue actuelle" name="Remove From Outfit"/>
+ <menu_item_call label="Trouver l&apos;original" name="Find Original"/>
+ <menu_item_call label="Purger l&apos;objet" name="Purge Item"/>
+ <menu_item_call label="Restaurer l&apos;objet" name="Restore Item"/>
+ <menu_item_call label="Ouvrir" name="Open"/>
+ <menu_item_call label="Ouvrir l&apos;original" name="Open Original"/>
+ <menu_item_call label="Propriétés" name="Properties"/>
+ <menu_item_call label="Renommer" name="Rename"/>
+ <menu_item_call label="Copier l&apos;UUID (identifiant universel unique)" name="Copy Asset UUID"/>
+ <menu_item_call label="Copier" name="Copy"/>
+ <menu_item_call label="Coller" name="Paste"/>
+ <menu_item_call label="Coller comme lien" name="Paste As Link"/>
+ <menu_item_call label="Supprimer" name="Remove Link"/>
+ <menu_item_call label="Supprimer" name="Delete"/>
+ <menu_item_call label="Supprimer le dossier système" name="Delete System Folder"/>
+ <menu_item_call label="Démarrer le chat conférence" name="Conference Chat Folder"/>
+ <menu_item_call label="Jouer" name="Sound Play"/>
+ <menu_item_call label="À propos du repère" name="About Landmark"/>
+ <menu_item_call label="Jouer dans Second Life" name="Animation Play"/>
+ <menu_item_call label="Jouer localement" name="Animation Audition"/>
+ <menu_item_call label="Envoyer un message instantané" name="Send Instant Message"/>
+ <menu_item_call label="Offrir de téléporter..." name="Offer Teleport..."/>
+ <menu_item_call label="Démarrer le chat conférence" name="Conference Chat"/>
+ <menu_item_call label="Activer" name="Activate"/>
+ <menu_item_call label="Désactiver" name="Deactivate"/>
+ <menu_item_call label="Enregistrer sous" name="Save As"/>
+ <menu_item_call label="Détacher de vous" name="Detach From Yourself"/>
+ <menu_item_call label="Porter" name="Wearable And Object Wear"/>
+ <menu label="Attacher à" name="Attach To"/>
+ <menu label="Attacher au HUD " name="Attach To HUD"/>
+ <menu_item_call label="Modifier" name="Wearable Edit"/>
+ <menu_item_call label="Ajouter" name="Wearable Add"/>
+ <menu_item_call label="Enlever" name="Take Off"/>
+ <menu_item_call label="--aucune option--" name="--no options--"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/fr/menu_inventory_add.xml
new file mode 100644
index 0000000000..fe096b4a7e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_inventory_add.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="Importer" name="upload">
+ <menu_item_call label="Image ([COST] L$)..." name="Upload Image"/>
+ <menu_item_call label="Son ([COST] L$)..." name="Upload Sound"/>
+ <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="Lot ([COST] L$ par fichier)..." name="Bulk Upload"/>
+ <menu_item_call label="Définir les droits de chargement par défaut" name="perm prefs"/>
+ </menu>
+ <menu_item_call label="Nouveau dossier" name="New Folder"/>
+ <menu_item_call label="Nouveau script" name="New Script"/>
+ <menu_item_call label="Nouvelle note" name="New Note"/>
+ <menu_item_call label="Nouveau geste" name="New Gesture"/>
+ <menu label="Nouveaux habits" name="New Clothes">
+ <menu_item_call label="Nouvelle chemise" name="New Shirt"/>
+ <menu_item_call label="Nouveau pantalon" name="New Pants"/>
+ <menu_item_call label="Nouvelles chaussures" name="New Shoes"/>
+ <menu_item_call label="Nouvelles chaussettes" name="New Socks"/>
+ <menu_item_call label="Nouvelle veste" name="New Jacket"/>
+ <menu_item_call label="Nouvelle jupe" name="New Skirt"/>
+ <menu_item_call label="Nouveaux gants" name="New Gloves"/>
+ <menu_item_call label="Nouveau débardeur" name="New Undershirt"/>
+ <menu_item_call label="Nouveau caleçon" name="New Underpants"/>
+ <menu_item_call label="Nouvel alpha" name="New Alpha"/>
+ <menu_item_call label="Nouveau tatouage" name="New Tattoo"/>
+ </menu>
+ <menu label="Nouvelles parties du corps" name="New Body Parts">
+ <menu_item_call label="Nouvelle silhouette" name="New Shape"/>
+ <menu_item_call label="Nouvelle peau" name="New Skin"/>
+ <menu_item_call label="Nouveaux cheveux" name="New Hair"/>
+ <menu_item_call label="Nouveaux yeux" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/fr/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..f28918ae14
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_inventory_gear_default.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_gear_default">
+ <menu_item_call label="Nouvelle fenêtre d&apos;inventaire" name="new_window"/>
+ <menu_item_check label="Trier par nom" name="sort_by_name"/>
+ <menu_item_check label="Trier en commençant par le plus récent" name="sort_by_recent"/>
+ <menu_item_check label="Dossiers système en premier" name="sort_system_folders_to_top"/>
+ <menu_item_call label="Afficher les filtres" name="show_filters"/>
+ <menu_item_call label="Réinitialiser les filtres" name="reset_filters"/>
+ <menu_item_call label="Fermer tous les dossiers" name="close_folders"/>
+ <menu_item_call label="Vider les objets trouvés" name="empty_lostnfound"/>
+ <menu_item_call label="Enregistrer la texture sous" name="Save Texture As"/>
+ <menu_item_call label="Partager" name="Share"/>
+ <menu_item_call label="Trouver l&apos;original" name="Find Original"/>
+ <menu_item_call label="Trouver tous les liens" name="Find All Links"/>
+ <menu_item_call label="Vider la corbeille" name="empty_trash"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_land.xml b/indra/newview/skins/minimal/xui/fr/menu_land.xml
new file mode 100644
index 0000000000..b84daee3ae
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="À propos du terrain" name="Place Information..."/>
+ <menu_item_call label="M&apos;asseoir ici" name="Sit Here"/>
+ <menu_item_call label="Acheter ce terrain" name="Land Buy"/>
+ <menu_item_call label="Acheter un pass" name="Land Buy Pass"/>
+ <menu_item_call label="Construire" name="Create"/>
+ <menu_item_call label="Modifier le terrain" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_landmark.xml b/indra/newview/skins/minimal/xui/fr/menu_landmark.xml
new file mode 100644
index 0000000000..73eaa4af7e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="Copier la SLurl" name="copy"/>
+ <menu_item_call label="Supprimer" name="delete"/>
+ <menu_item_call label="Créer un favori" name="pick"/>
+ <menu_item_call label="Ajouter à la barre des favoris" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_login.xml b/indra/newview/skins/minimal/xui/fr/menu_login.xml
new file mode 100644
index 0000000000..400c77e51a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_login.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Login Menu">
+ <menu label="Moi" name="File">
+ <menu_item_call label="Préférences" name="Preferences..."/>
+ <menu_item_call label="Quitter [APP_NAME]" name="Quit"/>
+ </menu>
+ <menu label="Aide" name="Help">
+ <menu_item_call label="Aide de [SECOND_LIFE]" name="Second Life Help"/>
+ <menu_item_call label="À propos de [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu_item_check label="Afficher le menu de débogage" name="Show Debug Menu"/>
+ <menu label="Débogage" name="Debug">
+ <menu_item_call label="Afficher les paramètres de débogage" name="Debug Settings"/>
+ <menu_item_call label="Paramètres de couleurs/interface" name="UI/Color Settings"/>
+ <menu_item_call label="Outil d&apos;aperçu XUI" name="UI Preview Tool"/>
+ <menu label="Tests de l&apos;interface" name="UI Tests"/>
+ <menu_item_call label="Définir la taille de la fenêtre..." name="Set Window Size..."/>
+ <menu_item_call label="Afficher les conditions d&apos;utilisation" name="TOS"/>
+ <menu_item_call label="Afficher le message critique" name="Critical"/>
+ <menu_item_call label="Test du navigateur de médias" name="Web Browser Test"/>
+ <menu_item_call label="Test de la fenêtre flottante du contenu Web" name="Web Content Floater Test"/>
+ <menu_item_check label="Afficher le sélecteur de grille" name="Show Grid Picker"/>
+ <menu_item_call label="Afficher la console des notifications" name="Show Notifications Console"/>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_mini_map.xml b/indra/newview/skins/minimal/xui/fr/menu_mini_map.xml
new file mode 100644
index 0000000000..b9d0a70383
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_mini_map.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Zoom rapproché" name="Zoom Close"/>
+ <menu_item_call label="Zoom moyen" name="Zoom Medium"/>
+ <menu_item_call label="Zoom éloigné" name="Zoom Far"/>
+ <menu_item_call label="Zoom par défaut" name="Zoom Default"/>
+ <menu_item_check label="Faire pivoter la carte" name="Rotate Map"/>
+ <menu_item_check label="Centrage auto" name="Auto Center"/>
+ <menu_item_call label="Arrêter de suivre" name="Stop Tracking"/>
+ <menu_item_call label="Carte du monde" name="World Map"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_navbar.xml b/indra/newview/skins/minimal/xui/fr/menu_navbar.xml
new file mode 100644
index 0000000000..08d810b653
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="Voir les coordonnées" name="Show Coordinates"/>
+ <menu_item_check label="Afficher les propriétés de la parcelle" name="Show Parcel Properties"/>
+ <menu_item_call label="Repère" name="Landmark"/>
+ <menu_item_call label="Couper" name="Cut"/>
+ <menu_item_call label="Copier" name="Copy"/>
+ <menu_item_call label="Coller" name="Paste"/>
+ <menu_item_call label="Supprimer" name="Delete"/>
+ <menu_item_call label="Tout sélectionner" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/fr/menu_nearby_chat.xml
new file mode 100644
index 0000000000..99e22aeff7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="Afficher les personnes près de vous..." name="nearby_people"/>
+ <menu_item_check label="Afficher le texte ignoré" name="muted_text"/>
+ <menu_item_check label="Afficher les icônes des Buddy" name="show_buddy_icons"/>
+ <menu_item_check label="Afficher les noms" name="show_names"/>
+ <menu_item_check label="Afficher les icônes et les noms" name="show_icons_and_names"/>
+ <menu_item_call label="Taille de la police" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/fr/menu_notification_well_button.xml
new file mode 100644
index 0000000000..323bfdbf16
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_notification_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Notification Well Button Context Menu">
+ <menu_item_call label="Tout fermer" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_object.xml b/indra/newview/skins/minimal/xui/fr/menu_object.xml
new file mode 100644
index 0000000000..a50a9df4b1
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_object.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="Toucher" name="Object Touch">
+ <menu_item_call.on_enable name="EnableTouch" parameter="Toucher"/>
+ </menu_item_call>
+ <menu_item_call label="Modifier" name="Edit..."/>
+ <menu_item_call label="Construire" name="Build"/>
+ <menu_item_call label="Ouvrir" name="Open"/>
+ <menu_item_call label="M&apos;asseoir ici" name="Object Sit"/>
+ <menu_item_call label="Me lever" name="Object Stand Up"/>
+ <menu_item_call label="Profil de l&apos;objet" name="Object Inspect"/>
+ <menu_item_call label="Zoomer en avant" name="Zoom In"/>
+ <context_menu label="Porter" name="Put On">
+ <menu_item_call label="Porter" name="Wear"/>
+ <menu_item_call label="Ajouter" name="Add"/>
+ <context_menu label="Attacher" name="Object Attach"/>
+ <context_menu label="Attacher HUD" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="Supprimer" name="Remove">
+ <menu_item_call label="Signaler une infraction" name="Report Abuse..."/>
+ <menu_item_call label="Ignorer" name="Object Mute"/>
+ <menu_item_call label="Retour" name="Return..."/>
+ <menu_item_call label="Supprimer" name="Delete"/>
+ </context_menu>
+ <menu_item_call label="Prendre" name="Pie Object Take"/>
+ <menu_item_call label="Prendre une copie" name="Take Copy"/>
+ <menu_item_call label="Payer" name="Pay..."/>
+ <menu_item_call label="Acheter" name="Buy..."/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_object_icon.xml b/indra/newview/skins/minimal/xui/fr/menu_object_icon.xml
new file mode 100644
index 0000000000..69f8e88a0d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="Profil de l&apos;objet..." name="Object Profile"/>
+ <menu_item_call label="Ignorer..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_outfit_gear.xml
new file mode 100644
index 0000000000..5db7f176b5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_outfit_gear.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear Outfit">
+ <menu_item_call label="Porter - Remplacer la tenue actuelle" name="wear"/>
+ <menu_item_call label="Porter - Ajouter à la tenue actuelle" name="wear_add"/>
+ <menu_item_call label="Enlever - Supprimer de la tenue actuelle" name="take_off"/>
+ <menu label="Nouveaux habits" name="New Clothes">
+ <menu_item_call label="Nouvelle chemise" name="New Shirt"/>
+ <menu_item_call label="Nouveau pantalon" name="New Pants"/>
+ <menu_item_call label="Nouvelles chaussures" name="New Shoes"/>
+ <menu_item_call label="Nouvelles chaussettes" name="New Socks"/>
+ <menu_item_call label="Nouvelle veste" name="New Jacket"/>
+ <menu_item_call label="Nouvelle jupe" name="New Skirt"/>
+ <menu_item_call label="Nouveaux gants" name="New Gloves"/>
+ <menu_item_call label="Nouveau débardeur" name="New Undershirt"/>
+ <menu_item_call label="Nouveau caleçon" name="New Underpants"/>
+ <menu_item_call label="Nouvel alpha" name="New Alpha"/>
+ <menu_item_call label="Nouveau tatouage" name="New Tattoo"/>
+ </menu>
+ <menu label="Nouvelles parties du corps" name="New Body Parts">
+ <menu_item_call label="Nouvelle silhouette" name="New Shape"/>
+ <menu_item_call label="Nouvelle peau" name="New Skin"/>
+ <menu_item_call label="Nouveaux cheveux" name="New Hair"/>
+ <menu_item_call label="Nouveaux yeux" name="New Eyes"/>
+ </menu>
+ <menu_item_call label="Renommer la tenue" name="rename"/>
+ <menu_item_call label="Supprimer la tenue" name="delete_outfit"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/fr/menu_outfit_tab.xml
new file mode 100644
index 0000000000..2a7f618e07
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_outfit_tab.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit">
+ <menu_item_call label="Porter - Remplacer la tenue actuelle" name="wear_replace"/>
+ <menu_item_call label="Porter - Ajouter à la tenue actuelle" name="wear_add"/>
+ <menu_item_call label="Enlever - Supprimer de la tenue actuelle" name="take_off"/>
+ <menu_item_call label="Modifier la tenue" name="edit"/>
+ <menu_item_call label="Renommer la tenue" name="rename"/>
+ <menu_item_call label="Supprimer la tenue" name="delete"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_participant_list.xml b/indra/newview/skins/minimal/xui/fr/menu_participant_list.xml
new file mode 100644
index 0000000000..f91a30f6bb
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_participant_list.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_check label="Trier par nom" name="SortByName"/>
+ <menu_item_check label="Trier par intervenants récents" name="SortByRecentSpeakers"/>
+ <menu_item_call label="Voir le profil" name="View Profile"/>
+ <menu_item_call label="Devenir amis" name="Add Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Appeler" name="Call"/>
+ <menu_item_call label="Partager" name="Share"/>
+ <menu_item_call label="Payer" name="Pay"/>
+ <menu_item_check label="Afficher les icônes des résidents" name="View Icons"/>
+ <menu_item_check label="Bloquer le chat vocal" name="Block/Unblock"/>
+ <menu_item_check label="Ignorer le texte" name="MuteText"/>
+ <context_menu label="Options du modérateur" name="Moderator Options">
+ <menu_item_check label="Autoriser les chats écrits" name="AllowTextChat"/>
+ <menu_item_call label="Ignorer ce participant" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Ne plus ignorer ce participant" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Ignorer les autres" name="ModerateVoiceMute"/>
+ <menu_item_call label="Ne plus ignorer les autres" name="ModerateVoiceUnmute"/>
+ </context_menu>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/fr/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..a6170a6c16
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_people_friends_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Trier par nom" name="sort_name"/>
+ <menu_item_check label="Trier par statut" name="sort_status"/>
+ <menu_item_check label="Afficher les icônes des résidents" name="view_icons"/>
+ <menu_item_check label="Afficher les droits octroyés" name="view_permissions"/>
+ <menu_item_call label="Afficher les résidents et les objets ignorés" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_groups.xml b/indra/newview/skins/minimal/xui/fr/menu_people_groups.xml
new file mode 100644
index 0000000000..eb51b4cf7e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_people_groups.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Afficher les infos" name="View Info"/>
+ <menu_item_call label="Chat" name="Chat"/>
+ <menu_item_call label="Appeler" name="Call"/>
+ <menu_item_call label="Activer" name="Activate"/>
+ <menu_item_call label="Quitter" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/fr/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..34f949cf2c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Afficher les icônes des groupes" name="Display Group Icons"/>
+ <menu_item_call label="Quitter le groupe sélectionné" name="Leave Selected Group"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/fr/menu_people_nearby.xml
new file mode 100644
index 0000000000..26bd3978a9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_people_nearby.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="Voir le profil" name="View Profile"/>
+ <menu_item_call label="Devenir amis" name="Add Friend"/>
+ <menu_item_call label="Supprimer cet ami" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Appeler" name="Call"/>
+ <menu_item_call label="Carte" name="Map"/>
+ <menu_item_call label="Partager" name="Share"/>
+ <menu_item_call label="Payer" name="Pay"/>
+ <menu_item_check label="Ignorer/Ne plus ignorer" name="Block/Unblock"/>
+ <menu_item_call label="Proposer une téléportation" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/fr/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..8400ec0a14
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_people_nearby_multiselect.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="Devenir amis" name="Add Friends"/>
+ <menu_item_call label="Supprimer des amis" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Appeler" name="Call"/>
+ <menu_item_call label="Partager" name="Share"/>
+ <menu_item_call label="Payer" name="Pay"/>
+ <menu_item_call label="Proposer une téléportation" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/fr/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..45f97e062e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Trier par intervenants récents" name="sort_by_recent_speakers"/>
+ <menu_item_check label="Trier par nom" name="sort_name"/>
+ <menu_item_check label="Trier par distance" name="sort_distance"/>
+ <menu_item_check label="Afficher les icônes des résidents" name="view_icons"/>
+ <menu_item_call label="Afficher les résidents et les objets interdits" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/fr/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..93b90ae61c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Trier en commençant par le plus récent" name="sort_most"/>
+ <menu_item_check label="Trier par nom" name="sort_name"/>
+ <menu_item_check label="Afficher les icônes des résidents" name="view_icons"/>
+ <menu_item_call label="Afficher les résidents et les objets ignorés" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_picks.xml b/indra/newview/skins/minimal/xui/fr/menu_picks.xml
new file mode 100644
index 0000000000..7d7174d43c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="Infos" name="pick_info"/>
+ <menu_item_call label="Modifier" name="pick_edit"/>
+ <menu_item_call label="Téléporter" name="pick_teleport"/>
+ <menu_item_call label="Carte" name="pick_map"/>
+ <menu_item_call label="Supprimer" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/fr/menu_picks_plus.xml
new file mode 100644
index 0000000000..b6cde6d6e2
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="Nouveau favori" name="create_pick"/>
+ <menu_item_call label="Nouvelle petite annonce" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_place.xml b/indra/newview/skins/minimal/xui/fr/menu_place.xml
new file mode 100644
index 0000000000..6b0f4db752
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_place.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="Enregistrer comme repère" name="landmark"/>
+ <menu_item_call label="Créer un favori" name="pick"/>
+ <menu_item_call label="Acheter un pass" name="pass"/>
+ <menu_item_call label="Modifier" name="edit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/fr/menu_place_add_button.xml
new file mode 100644
index 0000000000..92f9e7719d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Ajouter un dossier" name="add_folder"/>
+ <menu_item_call label="Ajouter un repère" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/fr/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..3570bdec7f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_places_gear_folder.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Ajouter un repère" name="add_landmark"/>
+ <menu_item_call label="Ajouter un dossier" name="add_folder"/>
+ <menu_item_call label="Couper" name="cut"/>
+ <menu_item_call label="Copier" name="copy_folder"/>
+ <menu_item_call label="Coller" name="paste"/>
+ <menu_item_call label="Renommer" name="rename"/>
+ <menu_item_call label="Supprimer" name="delete"/>
+ <menu_item_call label="Agrandir" name="expand"/>
+ <menu_item_call label="Réduire" name="collapse"/>
+ <menu_item_call label="Développer tous les dossiers" name="expand_all"/>
+ <menu_item_call label="Réduire tous les dossiers" name="collapse_all"/>
+ <menu_item_check label="Trier par date" name="sort_by_date"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/fr/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..5491c1b3fc
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_places_gear_landmark.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_ladmark_gear">
+ <menu_item_call label="Téléporter" name="teleport"/>
+ <menu_item_call label="Plus d&apos;informations" name="more_info"/>
+ <menu_item_call label="Voir sur la carte" name="show_on_map"/>
+ <menu_item_call label="Ajouter un repère" name="add_landmark"/>
+ <menu_item_call label="Ajouter un dossier" name="add_folder"/>
+ <menu_item_call label="Couper" name="cut"/>
+ <menu_item_call label="Copier le repère" name="copy_landmark"/>
+ <menu_item_call label="Copier la SLurl" name="copy_slurl"/>
+ <menu_item_call label="Coller" name="paste"/>
+ <menu_item_call label="Renommer" name="rename"/>
+ <menu_item_call label="Supprimer" name="delete"/>
+ <menu_item_call label="Développer tous les dossiers" name="expand_all"/>
+ <menu_item_call label="Réduire tous les dossiers" name="collapse_all"/>
+ <menu_item_check label="Trier par date" name="sort_by_date"/>
+ <menu_item_call label="Créer un favori" name="create_pick"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/fr/menu_profile_overflow.xml
new file mode 100644
index 0000000000..ddf898b791
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_profile_overflow.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Carte" name="show_on_map"/>
+ <menu_item_call label="Payer" name="pay"/>
+ <menu_item_call label="Partager" name="share"/>
+ <menu_item_call label="Ignorer" name="block"/>
+ <menu_item_call label="Ne plus ignorer" name="unblock"/>
+ <menu_item_call label="Éjecter" name="kick"/>
+ <menu_item_call label="Figer" name="freeze"/>
+ <menu_item_call label="Libérer" name="unfreeze"/>
+ <menu_item_call label="Représentant du service consommateur" name="csr"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/fr/menu_save_outfit.xml
new file mode 100644
index 0000000000..f78db411b3
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_save_outfit.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="save_outfit_menu">
+ <menu_item_call label="Enregistrer" name="save_outfit"/>
+ <menu_item_call label="Enregistrer sous" name="save_as_new_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/fr/menu_script_chiclet.xml
new file mode 100644
index 0000000000..46efa30bd6
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_script_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="ScriptChiclet Menu">
+ <menu_item_call label="Fermer" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_slurl.xml b/indra/newview/skins/minimal/xui/fr/menu_slurl.xml
new file mode 100644
index 0000000000..ddfa5c0849
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_slurl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="À propos de l&apos;URL" name="about_url"/>
+ <menu_item_call label="Téléporter vers l&apos;URL" name="teleport_to_url"/>
+ <menu_item_call label="Carte" name="show_on_map"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..3dea662cc2
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="Développer tous les dossiers" name="Expand all folders"/>
+ <menu_item_call label="Réduire tous les dossiers" name="Collapse all folders"/>
+ <menu_item_call label="Effacer l&apos;historique des téléportations" name="Clear Teleport History"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/fr/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..fb4582dbce
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Téléporter" name="Teleport"/>
+ <menu_item_call label="Plus d&apos;informations" name="More Information"/>
+ <menu_item_call label="Copier dans le presse-papiers" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/fr/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..369680985d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Ouvrir" name="TabOpen"/>
+ <menu_item_call label="Fermer" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_text_editor.xml b/indra/newview/skins/minimal/xui/fr/menu_text_editor.xml
new file mode 100644
index 0000000000..b6f429aec9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="Couper" name="Cut"/>
+ <menu_item_call label="Copier" name="Copy"/>
+ <menu_item_call label="Coller" name="Paste"/>
+ <menu_item_call label="Supprimer" name="Delete"/>
+ <menu_item_call label="Tout sélectionner" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/fr/menu_topinfobar.xml
new file mode 100644
index 0000000000..dc68f40fe7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_topinfobar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_topinfobar">
+ <menu_item_check label="Afficher les coordonnées" name="Show Coordinates"/>
+ <menu_item_check label="Afficher les propriétés de la parcelle" name="Show Parcel Properties"/>
+ <menu_item_call label="Repère" name="Landmark"/>
+ <menu_item_call label="Copier" name="Copy"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_agent.xml b/indra/newview/skins/minimal/xui/fr/menu_url_agent.xml
new file mode 100644
index 0000000000..5ed627fbc3
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Voir le profil du résident" name="show_agent"/>
+ <menu_item_call label="Copier le nom dans le presse-papiers" name="url_copy_label"/>
+ <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_group.xml b/indra/newview/skins/minimal/xui/fr/menu_url_group.xml
new file mode 100644
index 0000000000..de90c3ff7e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Voir le profil du groupe" name="show_group"/>
+ <menu_item_call label="Copier le groupe dans le presse-papiers" name="url_copy_label"/>
+ <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_http.xml b/indra/newview/skins/minimal/xui/fr/menu_url_http.xml
new file mode 100644
index 0000000000..5e96352999
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Ouvrir la page Web" name="url_open"/>
+ <menu_item_call label="Ouvrir dans un navigateur interne" name="url_open_internal"/>
+ <menu_item_call label="Ouvrir dans un navigateur externe" name="url_open_external"/>
+ <menu_item_call label="Copier l&apos;URL dans le presse-papiers" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/fr/menu_url_inventory.xml
new file mode 100644
index 0000000000..8ab88b4be7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Afficher l&apos;article d&apos;inventaire" name="show_item"/>
+ <menu_item_call label="Copier le nom dans le presse-papiers" name="url_copy_label"/>
+ <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_map.xml b/indra/newview/skins/minimal/xui/fr/menu_url_map.xml
new file mode 100644
index 0000000000..67e6986f5d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Voir sur la carte" name="show_on_map"/>
+ <menu_item_call label="Me téléporter à cet endroit" name="teleport_to_location"/>
+ <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/fr/menu_url_objectim.xml
new file mode 100644
index 0000000000..f581c3ef9d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Afficher les informations sur l&apos;objet" name="show_object"/>
+ <menu_item_call label="Voir sur la carte" name="show_on_map"/>
+ <menu_item_call label="Me téléporter à l&apos;emplacement de l&apos;objet" name="teleport_to_object"/>
+ <menu_item_call label="Copier le nom de l&apos;objet dans le presse-papiers" name="url_copy_label"/>
+ <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/fr/menu_url_parcel.xml
new file mode 100644
index 0000000000..07b0eeca49
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Afficher les informations sur la parcelle" name="show_parcel"/>
+ <menu_item_call label="Voir sur la carte" name="show_on_map"/>
+ <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/fr/menu_url_slapp.xml
new file mode 100644
index 0000000000..f4b7e212ca
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Exécuter cette commande" name="run_slapp"/>
+ <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/fr/menu_url_slurl.xml
new file mode 100644
index 0000000000..e44943cf15
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Afficher les informations sur ce lieu" name="show_place"/>
+ <menu_item_call label="Voir sur la carte" name="show_on_map"/>
+ <menu_item_call label="Me téléporter à cet endroit" name="teleport_to_location"/>
+ <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/fr/menu_url_teleport.xml
new file mode 100644
index 0000000000..a5075a2740
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Me téléporter à cet endroit." name="teleport"/>
+ <menu_item_call label="Voir sur la carte" name="show_on_map"/>
+ <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_viewer.xml b/indra/newview/skins/minimal/xui/fr/menu_viewer.xml
new file mode 100644
index 0000000000..bd1c077f52
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_viewer.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Main Menu">
+ <menu label="Aide" name="Help">
+ <menu_item_call label="Aide de [SECOND_LIFE]" name="Second Life Help"/>
+ </menu>
+ <menu label="Avancé" name="Advanced">
+ <menu label="Raccourcis" name="Shortcuts">
+ <menu_item_check label="Voler" name="Fly"/>
+ <menu_item_call label="Fermer la fenêtre" name="Close Window"/>
+ <menu_item_call label="Fermer toutes les fenêtres" name="Close All Windows"/>
+ <menu_item_call label="Réinitialiser la vue" name="Reset View"/>
+ </menu>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/fr/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..187cb4bcd2
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_wearable_list_item.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit Wearable Context Menu">
+ <menu_item_call label="Remplacer" name="wear_replace"/>
+ <menu_item_call label="Porter" name="wear_wear"/>
+ <menu_item_call label="Ajouter" name="wear_add"/>
+ <menu_item_call label="Enlever / Détacher" name="take_off_or_detach"/>
+ <menu_item_call label="Détacher" name="detach"/>
+ <context_menu label="Attacher à" name="wearable_attach_to"/>
+ <context_menu label="Attacher au HUD" name="wearable_attach_to_hud"/>
+ <menu_item_call label="Enlever" name="take_off"/>
+ <menu_item_call label="Modifier" name="edit"/>
+ <menu_item_call label="Profil de l&apos;article" name="object_profile"/>
+ <menu_item_call label="Afficher l&apos;original" name="show_original"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_wearing_gear.xml
new file mode 100644
index 0000000000..0ca9fe1879
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_wearing_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear Wearing">
+ <menu_item_call label="Modifier la tenue" name="edit"/>
+ <menu_item_call label="Enlever" name="takeoff"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/fr/menu_wearing_tab.xml
new file mode 100644
index 0000000000..4d88445506
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/menu_wearing_tab.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Wearing">
+ <menu_item_call label="Enlever" name="take_off"/>
+ <menu_item_call label="Détacher" name="detach"/>
+ <menu_item_call label="Modifier la tenue" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml
new file mode 100644
index 0000000000..3a01571f54
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
+ <string name="SpeakBtnToolTip" value="Active/Désactive le micro"/>
+ <string name="VoiceControlBtnToolTip" value="Affiche/Masque le panneau de contrôle de la voix"/>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Geste" name="Gesture" tool_tip="Affiche/Masque les gestes"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <bottomtray_button label="Affichage" name="camera_btn" tool_tip="Affiche/Masque le contrôle de la caméra"/>
+ </layout_panel>
+ <layout_panel name="avatar_and_destinations_panel">
+ <radio_group name="avatar_and_destination_btns">
+ <radio_item name="destination_btn" value="0"/>
+ <radio_item name="avatar_btn" value="1"/>
+ </radio_group>
+ </layout_panel>
+ <layout_panel name="people_panel">
+ <bottomtray_button label="Personnes" name="show_people_button" tool_tip="Afficher la fenêtre des personnes."/>
+ </layout_panel>
+ <layout_panel name="profile_panel">
+ <bottomtray_button label="Profil" name="show_profile_btn" tool_tip="Afficher la fenêtre de profil."/>
+ </layout_panel>
+ <layout_panel name="howto_panel">
+ <bottomtray_button label="Aide rapide" name="show_help_btn" tool_tip="Ouvrir les rubriques d&apos;aide rapide Second Life."/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Conversations"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Notifications"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml
new file mode 100644
index 0000000000..1f2169e22c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/panel_im_control_panel.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <text name="avatar_name" value="Inconnu"/>
+ <layout_stack name="button_stack">
+ <layout_panel name="view_profile_btn_panel">
+ <button label="Profil" name="view_profile_btn"/>
+ </layout_panel>
+ <layout_panel name="add_friend_btn_panel">
+ <button label="Devenir amis" name="add_friend_btn"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_panel">
+ <button label="Téléporter" name="teleport_btn" tool_tip="Proposer de téléporter cette personne"/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="Partager" name="share_btn"/>
+ </layout_panel>
+ <layout_panel name="pay_btn_panel">
+ <button label="Payer" name="pay_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Appeler" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Quitter l&apos;appel" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Contrôles vocaux" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_login.xml b/indra/newview/skins/minimal/xui/fr/panel_login.xml
new file mode 100644
index 0000000000..cb4822e96b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/panel_login.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_login">
+ <panel.string name="create_account_url">
+ http://fr.secondlife.com/registration/
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php?lang=fr
+ </panel.string>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="username_text">
+ Nom d&apos;utilisateur :
+ </text>
+ <combo_box name="username_combo" tool_tip="Nom d&apos;utilisateur que vous avez choisi lors de votre inscription (par exemple, bobsmith12 ou Steller Sunshine)."/>
+ <text name="password_text">
+ Mot de passe :
+ </text>
+ <check_box label="Enregistrer" name="remember_check"/>
+ <button label="Connexion" name="connect_btn"/>
+ <text name="mode_selection_text">
+ Mode :
+ </text>
+ <combo_box name="mode_combo">
+ <combo_box.item label="Basique (par défaut)" name="Basic"/>
+ <combo_box.item label="Avancé" name="Advanced"/>
+ </combo_box>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ S&apos;inscrire
+ </text>
+ <text name="forgot_password_text">
+ Nom d&apos;utilisateur ou mot de passe oublié ?
+ </text>
+ <text name="login_help">
+ Besoin d&apos;aide ?
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/fr/panel_navigation_bar.xml
new file mode 100644
index 0000000000..45caf2323d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/panel_navigation_bar.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Revenir à l&apos;emplacement précédent"/>
+ <pull_button name="forward_btn" tool_tip="Avancer d&apos;un emplacement"/>
+ <button name="home_btn" tool_tip="Me téléporter jusqu&apos;à mon domicile"/>
+ <location_input label="Emplacement" name="location_combo"/>
+ <search_combo_box label="Rechercher" name="search_combo_box" tool_tip="Rechercher">
+ <combo_editor label="Rechercher dans [SECOND_LIFE]" name="search_combo_editor"/>
+ </search_combo_box>
+ </panel>
+ <favorites_bar name="favorite" tool_tip="Faites glisser des repères ici pour un accès rapide à vos lieux favoris dans Second Life.">
+ <label name="favorites_bar_label" tool_tip="Faites glisser des repères ici pour un accès rapide à vos lieux favoris dans Second Life.">
+ Favoris
+ </label>
+ <chevron_button name="&gt;&gt;" tool_tip="Afficher d&apos;avantage de Favoris"/>
+ </favorites_bar>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_people.xml b/indra/newview/skins/minimal/xui/fr/panel_people.xml
new file mode 100644
index 0000000000..88409a2a86
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/panel_people.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="Résidents" name="people_panel">
+ <string name="no_recent_people" value="Personne de récent. Vous recherchez des résidents avec qui passer du temps ? Essayez avec le bouton Destinations ci-dessous."/>
+ <string name="no_filtered_recent_people" value="Personne de récent portant ce nom."/>
+ <string name="no_one_near" value="Personne près de vous. Vous recherchez des résidents avec qui passer du temps ? Essayez avec le bouton Destinations ci-dessous."/>
+ <string name="no_one_filtered_near" value="Personne près de vous portant ce nom."/>
+ <string name="no_friends_online" value="Pas d&apos;amis connectés"/>
+ <string name="no_friends" value="Pas d&apos;amis"/>
+ <string name="no_friends_msg">
+ Pour ajouter un résident à votre liste d&apos;amis, cliquez-droit dessus.
+Vous recherchez des résidents avec qui passer du temps ? Essayez avec le bouton Destinations ci-dessous.
+ </string>
+ <string name="no_filtered_friends_msg">
+ Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez avec le bouton Destinations ci-dessous.
+ </string>
+ <string name="people_filter_label" value="Filtrer les personnes"/>
+ <string name="groups_filter_label" value="Filtrer les groupes"/>
+ <string name="no_filtered_groups_msg" value="Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/groups/[SEARCH_TERM] Rechercher]."/>
+ <string name="no_groups_msg" value="Vous souhaitez trouver des groupes à rejoindre ? Utilisez [secondlife:///app/search/groups Rechercher]."/>
+ <string name="MiniMapToolTipMsg" value="[REGION](Carte : double-clic ; Panoramique : Maj + faire glisser)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](Téléportation : double-clic ; Panoramique : Maj + faire glisser)"/>
+ <filter_editor label="Filtre" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="PRÈS DE VOUS" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel"/>
+ </panel>
+ <panel label="MES AMIS" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="En ligne"/>
+ <accordion_tab name="tab_all" title="Tout"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="bottom_panel">
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="del_btn" tool_tip="Supprimer le résident sélectionné de votre liste d&apos;amis."/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+ <panel label="RÉCENT" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="add_friend_btn" tool_tip="Ajouter le résident sélectionné à votre liste d&apos;amis"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <layout_stack name="bottom_bar_ls">
+ <layout_panel name="view_profile_btn_lp">
+ <button label="Profil" name="view_profile_btn" tool_tip="Afficher la photo, les groupes et autres infos des résidents"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="IM" name="im_btn" tool_tip="Ouvrir une session IM"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Téléporter" name="teleport_btn" tool_tip="Proposer une téléportation"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls1">
+ <layout_panel name="group_info_btn_lp">
+ <button label="Profil du groupe" name="group_info_btn" tool_tip="Afficher les informations sur le groupe"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Chat de groupe" name="chat_btn" tool_tip="Ouvrir une session de chat"/>
+ </layout_panel>
+ <layout_panel name="group_call_btn_lp">
+ <button label="Appel de groupe" name="group_call_btn" tool_tip="Appeler ce groupe"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/fr/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..45efbdc980
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/panel_side_tray_tab_caption.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="Panneau latéral"/>
+ <button name="undock" tool_tip="Détacher"/>
+ <button name="dock" tool_tip="Attacher"/>
+ <button name="show_help" tool_tip="Afficher l&apos;aide"/>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_status_bar.xml b/indra/newview/skins/minimal/xui/fr/panel_status_bar.xml
new file mode 100644
index 0000000000..69aec99e1d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/panel_status_bar.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="status">
+ <panel.string name="StatBarDaysOfWeek">
+ Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday
+ </panel.string>
+ <panel.string name="StatBarMonthsOfYear">
+ January:February:March:April:May:June:July:August:September:October:November:December
+ </panel.string>
+ <panel.string name="packet_loss_tooltip">
+ Perte de paquets
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
+ Bande passante
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt] [sday, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ [AMT] L$
+ </panel.string>
+ <panel name="balance_bg">
+ <text name="balance" tool_tip="Cliquer sur ce bouton pour actualiser votre solde en L$." value="20 L$"/>
+ <button label="ACHETER L$" name="buyL" tool_tip="Cliquer pour acheter plus de L$"/>
+ </panel>
+ <text name="TimeText" tool_tip="Heure actuelle (Pacifique)">
+ 00h00 PST
+ </text>
+ <button name="media_toggle_btn" tool_tip="Arrêter tous les médias (musique, vidéo, pages web)"/>
+ <button name="volume_btn" tool_tip="Contrôle du volume global"/>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/pt/floater_camera.xml b/indra/newview/skins/minimal/xui/pt/floater_camera.xml
new file mode 100644
index 0000000000..4f3729c623
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/floater_camera.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="camera_floater" title="">
+ <floater.string name="rotate_tooltip">
+ Girar a Câmera ao redor do Foco
+ </floater.string>
+ <floater.string name="zoom_tooltip">
+ Aproximar a Câmera in direção ao Foco
+ </floater.string>
+ <floater.string name="move_tooltip">
+ Mover a Câmera para Cima e para Baixo, para a Esquerda e para a Direita
+ </floater.string>
+ <floater.string name="camera_modes_title">
+ Modos de câmera
+ </floater.string>
+ <floater.string name="pan_mode_title">
+ Pan zoom orbital
+ </floater.string>
+ <floater.string name="presets_mode_title">
+ Ângulos predefinidos
+ </floater.string>
+ <floater.string name="free_mode_title">
+ Visualizar objeto
+ </floater.string>
+ <panel name="controls">
+ <panel name="preset_views_list">
+ <panel_camera_item name="front_view">
+ <panel_camera_item.text name="front_view_text">
+ Vista frontal
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="group_view">
+ <panel_camera_item.text name="side_view_text">
+ Vista lateral
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="rear_view">
+ <panel_camera_item.text name="rear_view_text">
+ Vista de trás
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="camera_modes_list">
+ <panel_camera_item name="object_view">
+ <panel_camera_item.text name="object_view_text">
+ Vista de objetos
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="mouselook_view">
+ <panel_camera_item.text name="mouselook_view_text">
+ Vista do mouse
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="zoom" tool_tip="Aproximar a Câmera in direção ao Foco">
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Girar câmera ao redor do foco"/>
+ <slider_bar name="zoom_slider" tool_tip="Zoom de câmera para focalizar"/>
+ <joystick_track name="cam_track_stick" tool_tip="Move a câmera para cima e para baixo, direita e esquerda"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="presets_btn" tool_tip="Ângulos predefinidos"/>
+ <button label="" name="pan_btn" tool_tip="Pan zoom orbital"/>
+ <button label="" name="avatarview_btn" tool_tip="Modos de câmera"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/pt/floater_help_browser.xml b/indra/newview/skins/minimal/xui/pt/floater_help_browser.xml
new file mode 100644
index 0000000000..11428ff651
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/floater_help_browser.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="COMO">
+ <floater.string name="loading_text">
+ Carregando...
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="external_controls"/>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/pt/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/pt/floater_nearby_chat.xml
new file mode 100644
index 0000000000..60edfa505f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/floater_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="Bate-papo local">
+ <check_box label="Traduzir bate-papo (via Google)" name="translate_chat_checkbox"/>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/pt/inspect_avatar.xml b/indra/newview/skins/minimal/xui/pt/inspect_avatar.xml
new file mode 100644
index 0000000000..a199c58c15
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/inspect_avatar.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [IDADE]
+ </string>
+ <string name="Details">
+ [PERFIL_SL]
+ </string>
+ <text name="user_details">
+ This is my second life description and I really think it is great. But for some reason my description is super extra long because I like to talk a whole lot
+ </text>
+ <slider name="volume_slider" tool_tip="Volume de Voz" value="0.5"/>
+ <button label="Adicionar amigo" name="add_friend_btn"/>
+ <button label="MI" name="im_btn"/>
+ <button label="Perfil" name="view_profile_btn"/>
+ <panel name="moderator_panel">
+ <button label="Disabilitar Voz" name="disable_voice"/>
+ <button label="Habilitar Voz" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/pt/inspect_object.xml b/indra/newview/skins/minimal/xui/pt/inspect_object.xml
new file mode 100644
index 0000000000..b72de7038d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/inspect_object.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_object">
+ <string name="Creator">
+ Autor: [CREATOR]
+ </string>
+ <string name="CreatorAndOwner">
+ Autor [CREATOR]
+Proprietário [OWNER]
+ </string>
+ <string name="Price">
+ L$[AMOUNT]
+ </string>
+ <string name="PriceFree">
+ Grátis!
+ </string>
+ <string name="Touch">
+ Tocar
+ </string>
+ <string name="Sit">
+ Sentar
+ </string>
+ <text name="object_name" value="Test Object Name That Is actually two lines and Really Long"/>
+ <text name="price_text">
+ L$30.000
+ </text>
+ <text name="object_description">
+ This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really?
+ </text>
+ <button label="Comprar" name="buy_btn"/>
+ <button label="Pagar" name="pay_btn"/>
+ <button label="Pegar uma cópia" name="take_free_copy_btn"/>
+ <button label="Tocar" name="touch_btn"/>
+ <button label="Sentar" name="sit_btn"/>
+ <button label="Abrir" name="open_btn"/>
+ <icon name="secure_browsing" tool_tip="Navegação segura"/>
+ <button label="Mais" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_add_wearable_gear.xml
new file mode 100644
index 0000000000..4b81276ab3
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_add_wearable_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Add Wearable Gear Menu">
+ <menu_item_check label="Ordenar por mais recente" name="sort_by_most_recent"/>
+ <menu_item_check label="Ordenar por nome" name="sort_by_name"/>
+ <menu_item_check label="Ordenar por tipo" name="sort_by_type"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/pt/menu_attachment_other.xml
new file mode 100644
index 0000000000..cfd69158bc
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Ver perfil" name="Profile..."/>
+ <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
+ <menu_item_call label="MI" name="Send IM..."/>
+ <menu_item_call label="Ligar" name="Call"/>
+ <menu_item_call label="Convidar para entrar no grupo" name="Invite..."/>
+ <menu_item_call label="Bloquear" name="Avatar Mute"/>
+ <menu_item_call label="Denunciar" name="abuse"/>
+ <menu_item_call label="Congelar" name="Freeze..."/>
+ <menu_item_call label="Ejetar" name="Eject..."/>
+ <menu_item_call label="Depurar texturas" name="Debug..."/>
+ <menu_item_call label="Mais zoom" name="Zoom In"/>
+ <menu_item_call label="Pagar" name="Pay..."/>
+ <menu_item_call label="Perfil do objeto" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/pt/menu_attachment_self.xml
new file mode 100644
index 0000000000..09060cf3ae
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_attachment_self.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="Tocar" name="Attachment Object Touch"/>
+ <menu_item_call label="Editar" name="Edit..."/>
+ <menu_item_call label="Tirar" name="Detach"/>
+ <menu_item_call label="Sentar" name="Sit Down Here"/>
+ <menu_item_call label="Ficar de pé" name="Stand Up"/>
+ <menu_item_call label="Trocar de look" name="Change Outfit"/>
+ <menu_item_call label="Editar meu look" name="Edit Outfit"/>
+ <menu_item_call label="Editar meu corpo" name="Edit My Shape"/>
+ <menu_item_call label="Meus amigos" name="Friends..."/>
+ <menu_item_call label="Meus grupos" name="Groups..."/>
+ <menu_item_call label="Meu perfil" name="Profile..."/>
+ <menu_item_call label="Depurar texturas" name="Debug..."/>
+ <menu_item_call label="Largar" name="Drop"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/pt/menu_avatar_icon.xml
new file mode 100644
index 0000000000..beba969b7e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="Ver perfil" name="Show Profile"/>
+ <menu_item_call label="Enviar MI..." name="Send IM"/>
+ <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
+ <menu_item_call label="Remover amigo..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/pt/menu_avatar_other.xml
new file mode 100644
index 0000000000..a4a26144c7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Ver perfil" name="Profile..."/>
+ <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
+ <menu_item_call label="MI" name="Send IM..."/>
+ <menu_item_call label="Ligar" name="Call"/>
+ <menu_item_call label="Convidar para entrar no grupo" name="Invite..."/>
+ <menu_item_call label="Bloquear" name="Avatar Mute"/>
+ <menu_item_call label="Denunciar" name="abuse"/>
+ <menu_item_call label="Congelar" name="Freeze..."/>
+ <menu_item_call label="Ejetar" name="Eject..."/>
+ <menu_item_call label="Depurar texturas" name="Debug..."/>
+ <menu_item_call label="Mais zoom" name="Zoom In"/>
+ <menu_item_call label="Pagar" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/pt/menu_avatar_self.xml
new file mode 100644
index 0000000000..6e203d5a25
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_avatar_self.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="Sentar" name="Sit Down Here"/>
+ <menu_item_call label="Ficar de pé" name="Stand Up"/>
+ <context_menu label="Tirar" name="Take Off &gt;">
+ <context_menu label="Roupa" name="Clothes &gt;">
+ <menu_item_call label="Camisa" name="Shirt"/>
+ <menu_item_call label="Calças" name="Pants"/>
+ <menu_item_call label="Saia" name="Skirt"/>
+ <menu_item_call label="Sapatos" name="Shoes"/>
+ <menu_item_call label="Meias" name="Socks"/>
+ <menu_item_call label="Jaqueta" name="Jacket"/>
+ <menu_item_call label="Luvas" name="Gloves"/>
+ <menu_item_call label="Camiseta" name="Self Undershirt"/>
+ <menu_item_call label="Roupa de baixo" name="Self Underpants"/>
+ <menu_item_call label="Tatuagem" name="Self Tattoo"/>
+ <menu_item_call label="Alpha" name="Self Alpha"/>
+ <menu_item_call label="Todas as roupas" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD" name="Object Detach HUD"/>
+ <context_menu label="Tirar" name="Object Detach"/>
+ <menu_item_call label="Tirar tudo" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Trocar de look" name="Chenge Outfit"/>
+ <menu_item_call label="Editar meu look" name="Edit Outfit"/>
+ <menu_item_call label="Editar meu corpo" name="Edit My Shape"/>
+ <menu_item_call label="Meus amigos" name="Friends..."/>
+ <menu_item_call label="Meus grupos" name="Groups..."/>
+ <menu_item_call label="Meu perfil" name="Profile..."/>
+ <menu_item_call label="Depurar texturas" name="Debug..."/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/pt/menu_bottomtray.xml
new file mode 100644
index 0000000000..479d02512f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_bottomtray.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Botão de gestos" name="ShowGestureButton"/>
+ <menu_item_check label="Botão de movimento" name="ShowMoveButton"/>
+ <menu_item_check label="Botão de ver" name="ShowCameraButton"/>
+ <menu_item_check label="Botão de fotos" name="ShowSnapshotButton"/>
+ <menu_item_check label="Botão da Barra lateral" name="ShowSidebarButton"/>
+ <menu_item_check label="Botão Construir" name="ShowBuildButton"/>
+ <menu_item_check label="Botão Buscar" name="ShowSearchButton"/>
+ <menu_item_check label="Botão Mapa" name="ShowWorldMapButton"/>
+ <menu_item_check label="Botão do Mini Mapa" name="ShowMiniMapButton"/>
+ <menu_item_call label="Cortar" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="Copiar" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="Colar" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="Excluir" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="Selecionar tudo" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/pt/menu_cof_attachment.xml
new file mode 100644
index 0000000000..527e3af3c9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_cof_attachment.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Attachment">
+ <menu_item_call label="Separar" name="detach"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/pt/menu_cof_body_part.xml
new file mode 100644
index 0000000000..704fd226eb
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_cof_body_part.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Body">
+ <menu_item_call label="Trocar" name="replace"/>
+ <menu_item_call label="Editar" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/pt/menu_cof_clothing.xml
new file mode 100644
index 0000000000..051323ae6a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_cof_clothing.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Clothing">
+ <menu_item_call label="Tirar" name="take_off"/>
+ <menu_item_call label="Editar" name="edit"/>
+ <menu_item_call label="Trocar" name="replace"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_cof_gear.xml
new file mode 100644
index 0000000000..8716992a5e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear COF">
+ <menu label="Roupas novas" name="COF.Gear.New_Clothes"/>
+ <menu label="Nova parte do corpo" name="COF.Geear.New_Body_Parts"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_edit.xml b/indra/newview/skins/minimal/xui/pt/menu_edit.xml
new file mode 100644
index 0000000000..ff431c9a21
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_edit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu label="Editar" name="Edit">
+ <menu_item_call label="Desfazer" name="Undo"/>
+ <menu_item_call label="Repetir" name="Redo"/>
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Colar" name="Paste"/>
+ <menu_item_call label="Excluir" name="Delete"/>
+ <menu_item_call label="Replicar" name="Duplicate"/>
+ <menu_item_call label="Selecionar tudo" name="Select All"/>
+ <menu_item_call label="Desfazer seleção" name="Deselect"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_favorites.xml b/indra/newview/skins/minimal/xui/pt/menu_favorites.xml
new file mode 100644
index 0000000000..062820fbca
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Teletransportar" name="Teleport To Landmark"/>
+ <menu_item_call label="Ver/Editar marco" name="Landmark Open"/>
+ <menu_item_call label="Copiar SLurl" name="Copy slurl"/>
+ <menu_item_call label="Mostrar no mapa" name="Show On Map"/>
+ <menu_item_call label="Copiar" name="Landmark Copy"/>
+ <menu_item_call label="Colar" name="Landmark Paste"/>
+ <menu_item_call label="Excluir" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_gesture_gear.xml
new file mode 100644
index 0000000000..70d8ae7a8e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_gesture_gear.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gesture_gear">
+ <menu_item_call label="Adicionar/remover de favoritos" name="activate"/>
+ <menu_item_call label="Copiar" name="copy_gesture"/>
+ <menu_item_call label="Colar" name="paste"/>
+ <menu_item_call label="Copiar UUID" name="copy_uuid"/>
+ <menu_item_call label="Salvar para look atual" name="save_to_outfit"/>
+ <menu_item_call label="Editar" name="edit_gesture"/>
+ <menu_item_call label="Verificar" name="inspect"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_group_plus.xml b/indra/newview/skins/minimal/xui/pt/menu_group_plus.xml
new file mode 100644
index 0000000000..1083845d68
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Entrar no grupo..." name="item_join"/>
+ <menu_item_call label="Novo grupo..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/pt/menu_hide_navbar.xml
new file mode 100644
index 0000000000..c2b063193e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_hide_navbar.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="Mostrar barra de navegação" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Mostrar barra de favoritos" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="Mostrar minibarra de localização" name="ShowMiniLocationPanel"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/pt/menu_im_well_button.xml
new file mode 100644
index 0000000000..2d37cefd6f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_im_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="IM Well Button Context Menu">
+ <menu_item_call label="Fechar tudo" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/pt/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..ead949ba13
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="Encerrar esta sessão" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/pt/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..dd177d1b8d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="Sobre o grupo" name="Show Profile"/>
+ <menu_item_call label="Mostrar sessão" name="Chat"/>
+ <menu_item_call label="Encerrar esta sessão" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/pt/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..d821b3ded0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="Ver perfil" name="Show Profile"/>
+ <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
+ <menu_item_call label="Mostrar sessão" name="Send IM"/>
+ <menu_item_call label="Encerrar esta sessão" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..f7fe5640ef
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_inspect_avatar_gear.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="Ver perfil" name="view_profile"/>
+ <menu_item_call label="Adicionar amigo..." name="add_friend"/>
+ <menu_item_call label="MI" name="im"/>
+ <menu_item_call label="Teletransportar" name="teleport"/>
+ <menu_item_call label="Bloquear" name="block"/>
+ <menu_item_call label="Desbloquear" name="unblock"/>
+ <menu_item_call label="Denunciar" name="report"/>
+ <menu_item_call label="Congelar" name="freeze"/>
+ <menu_item_call label="Ejetar" name="eject"/>
+ <menu_item_call label="Chutar" name="kick"/>
+ <menu_item_call label="CSR" name="csr"/>
+ <menu_item_call label="Depurar texturas" name="debug"/>
+ <menu_item_call label="Localizar no mapa" name="find_on_map"/>
+ <menu_item_call label="Mais zoom" name="zoom_in"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..184db26538
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_inspect_object_gear.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Tocar" name="touch"/>
+ <menu_item_call label="Sentar" name="sit"/>
+ <menu_item_call label="Pagar" name="pay"/>
+ <menu_item_call label="Comprar" name="buy"/>
+ <menu_item_call label="Pegar" name="take"/>
+ <menu_item_call label="Pegar uma cópia" name="take_copy"/>
+ <menu_item_call label="Abrir" name="open"/>
+ <menu_item_call label="Editar" name="edit"/>
+ <menu_item_call label="Vestir" name="wear"/>
+ <menu_item_call label="Adicionar" name="add"/>
+ <menu_item_call label="Denunciar" name="report"/>
+ <menu_item_call label="Bloquear" name="block"/>
+ <menu_item_call label="Mais zoom" name="zoom_in"/>
+ <menu_item_call label="Tirar" name="remove"/>
+ <menu_item_call label="Mais informações" name="more_info"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..7e67f4cfd4
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_inspect_self_gear.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Sentar" name="sit_down_here"/>
+ <menu_item_call label="Ficar de pé" name="stand_up"/>
+ <menu_item_call label="Trocar de look" name="change_outfit"/>
+ <menu_item_call label="Meu perfil" name="my_profile"/>
+ <menu_item_call label="Meus amigos" name="my_friends"/>
+ <menu_item_call label="Meus grupos" name="my_groups"/>
+ <menu_item_call label="Depurar texturas" name="Debug..."/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/pt/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..c404719c95
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_inv_offer_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="InvOfferChiclet Menu">
+ <menu_item_call label="Fechar" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_inventory.xml b/indra/newview/skins/minimal/xui/pt/menu_inventory.xml
new file mode 100644
index 0000000000..1b1efd3270
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_inventory.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Compartilhar" name="Share"/>
+ <menu_item_call label="Comprar" name="Task Buy"/>
+ <menu_item_call label="Abrir" name="Task Open"/>
+ <menu_item_call label="Executar" name="Task Play"/>
+ <menu_item_call label="Propriedades" name="Task Properties"/>
+ <menu_item_call label="Renomear" name="Task Rename"/>
+ <menu_item_call label="Apagar" name="Task Remove"/>
+ <menu_item_call label="Limpar lixeira" name="Empty Trash"/>
+ <menu_item_call label="Limpar Achados &amp; perdidos" name="Empty Lost And Found"/>
+ <menu_item_call label="Nova pasta" name="New Folder"/>
+ <menu_item_call label="Novo script" name="New Script"/>
+ <menu_item_call label="Nova anotação" name="New Note"/>
+ <menu_item_call label="Novo gesto" name="New Gesture"/>
+ <menu label="Novas roupas" name="New Clothes">
+ <menu_item_call label="Nova camisa" name="New Shirt"/>
+ <menu_item_call label="Nova calça" name="New Pants"/>
+ <menu_item_call label="Novos sapatos" name="New Shoes"/>
+ <menu_item_call label="Novas meias" name="New Socks"/>
+ <menu_item_call label="Nova jaqueta" name="New Jacket"/>
+ <menu_item_call label="Nova saia" name="New Skirt"/>
+ <menu_item_call label="Novas luvas" name="New Gloves"/>
+ <menu_item_call label="Nova anágua" name="New Undershirt"/>
+ <menu_item_call label="Nova roupa de baixo" name="New Underpants"/>
+ <menu_item_call label="Nova máscara alfa" name="New Alpha Mask"/>
+ <menu_item_call label="Nova tatuagem" name="New Tattoo"/>
+ </menu>
+ <menu label="Nova parte do corpo" name="New Body Parts">
+ <menu_item_call label="Nova forma" name="New Shape"/>
+ <menu_item_call label="Nova pele" name="New Skin"/>
+ <menu_item_call label="Novo cabelo" name="New Hair"/>
+ <menu_item_call label="Novos olhos" name="New Eyes"/>
+ </menu>
+ <menu label="Alterar fonte" name="Change Type">
+ <menu_item_call label="Padrão" name="Default"/>
+ <menu_item_call label="Luvas" name="Gloves"/>
+ <menu_item_call label="Jaqueta" name="Jacket"/>
+ <menu_item_call label="Calças" name="Pants"/>
+ <menu_item_call label="Silhueta" name="Shape"/>
+ <menu_item_call label="Sapatos" name="Shoes"/>
+ <menu_item_call label="Camisa" name="Shirt"/>
+ <menu_item_call label="Saia" name="Skirt"/>
+ <menu_item_call label="Roupa de baixo" name="Underpants"/>
+ <menu_item_call label="Camiseta" name="Undershirt"/>
+ </menu>
+ <menu_item_call label="Teletransporte" name="Landmark Open"/>
+ <menu_item_call label="Abrir" name="Animation Open"/>
+ <menu_item_call label="Abrir" name="Sound Open"/>
+ <menu_item_call label="Substituir look" name="Replace Outfit"/>
+ <menu_item_call label="Adicionar a look" name="Add To Outfit"/>
+ <menu_item_call label="Tirar do look atual" name="Remove From Outfit"/>
+ <menu_item_call label="Encontrar original" name="Find Original"/>
+ <menu_item_call label="Remover item" name="Purge Item"/>
+ <menu_item_call label="Restaurar item" name="Restore Item"/>
+ <menu_item_call label="Abrir" name="Open"/>
+ <menu_item_call label="Abrir original" name="Open Original"/>
+ <menu_item_call label="Propriedades" name="Properties"/>
+ <menu_item_call label="Renomear" name="Rename"/>
+ <menu_item_call label="Copiar item UUID" name="Copy Asset UUID"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Colar" name="Paste"/>
+ <menu_item_call label="Colar como link" name="Paste As Link"/>
+ <menu_item_call label="Excluir" name="Remove Link"/>
+ <menu_item_call label="Apagar" name="Delete"/>
+ <menu_item_call label="Excluir pasta do sistema" name="Delete System Folder"/>
+ <menu_item_call label="Pasta conversa em conferência" name="Conference Chat Folder"/>
+ <menu_item_call label="Executar som" name="Sound Play"/>
+ <menu_item_call label="Sobre o marco" name="About Landmark"/>
+ <menu_item_call label="Executar animação" name="Animation Play"/>
+ <menu_item_call label="Executar áudio" name="Animation Audition"/>
+ <menu_item_call label="Mandar MI" name="Send Instant Message"/>
+ <menu_item_call label="Oferecer teletransporte..." name="Offer Teleport..."/>
+ <menu_item_call label="Bate-papo em conferência" name="Conference Chat"/>
+ <menu_item_call label="Ativar" name="Activate"/>
+ <menu_item_call label="Desativar" name="Deactivate"/>
+ <menu_item_call label="Salvar como" name="Save As"/>
+ <menu_item_call label="Tirar de si mesmo" name="Detach From Yourself"/>
+ <menu_item_call label="Vestir" name="Wearable And Object Wear"/>
+ <menu label="Anexar a" name="Attach To"/>
+ <menu label="Anexar ao HUD" name="Attach To HUD"/>
+ <menu_item_call label="Editar" name="Wearable Edit"/>
+ <menu_item_call label="Adicionar" name="Wearable Add"/>
+ <menu_item_call label="Tirar" name="Take Off"/>
+ <menu_item_call label="--Sem opções--" name="--no options--"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/pt/menu_inventory_add.xml
new file mode 100644
index 0000000000..2723f39287
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_inventory_add.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="Upload" name="upload">
+ <menu_item_call label="Imagem (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="Som (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="Animação (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Volume (L$[COST] per file)..." name="Bulk Upload"/>
+ <menu_item_call label="Autorizações de upload padrão" name="perm prefs"/>
+ </menu>
+ <menu_item_call label="Nova pasta" name="New Folder"/>
+ <menu_item_call label="Novo script" name="New Script"/>
+ <menu_item_call label="Nova anotação" name="New Note"/>
+ <menu_item_call label="Novo gesto" name="New Gesture"/>
+ <menu label="Novas roupas" name="New Clothes">
+ <menu_item_call label="Nova camisa" name="New Shirt"/>
+ <menu_item_call label="Novas calças" name="New Pants"/>
+ <menu_item_call label="Novos sapatos" name="New Shoes"/>
+ <menu_item_call label="Novas meias" name="New Socks"/>
+ <menu_item_call label="Nova blusa" name="New Jacket"/>
+ <menu_item_call label="Nova saia" name="New Skirt"/>
+ <menu_item_call label="Novas luvas" name="New Gloves"/>
+ <menu_item_call label="Nova camiseta" name="New Undershirt"/>
+ <menu_item_call label="Novas roupa de baixo" name="New Underpants"/>
+ <menu_item_call label="Novo alpha" name="New Alpha"/>
+ <menu_item_call label="Nova tatuagem" name="New Tattoo"/>
+ </menu>
+ <menu label="Nova parte do corpo" name="New Body Parts">
+ <menu_item_call label="Nova forma" name="New Shape"/>
+ <menu_item_call label="Nova pele" name="New Skin"/>
+ <menu_item_call label="Novo cabelo" name="New Hair"/>
+ <menu_item_call label="Novos olhos" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/pt/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..3400578d9a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_inventory_gear_default.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_gear_default">
+ <menu_item_call label="Nova janela de inventário" name="new_window"/>
+ <menu_item_check label="Ordenar por nome" name="sort_by_name"/>
+ <menu_item_check label="Ordenar por mais recente" name="sort_by_recent"/>
+ <menu_item_check label="Pastas do sistema no topo" name="sort_system_folders_to_top"/>
+ <menu_item_call label="Mostrar filtros" name="show_filters"/>
+ <menu_item_call label="Restabelecer filtros" name="reset_filters"/>
+ <menu_item_call label="Fechar todas as pastas" name="close_folders"/>
+ <menu_item_call label="Esvaziar achados e perdidos" name="empty_lostnfound"/>
+ <menu_item_call label="Salvar textura como" name="Save Texture As"/>
+ <menu_item_call label="Compartilhar" name="Share"/>
+ <menu_item_call label="Encontrar original" name="Find Original"/>
+ <menu_item_call label="Encontrar todos os links" name="Find All Links"/>
+ <menu_item_call label="Esvaziar lixeira" name="empty_trash"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_land.xml b/indra/newview/skins/minimal/xui/pt/menu_land.xml
new file mode 100644
index 0000000000..9182ce321a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="Sobre terrenos" name="Place Information..."/>
+ <menu_item_call label="Sentar aqui" name="Sit Here"/>
+ <menu_item_call label="Comprar este terreno" name="Land Buy"/>
+ <menu_item_call label="Comprar passe" name="Land Buy Pass"/>
+ <menu_item_call label="Construir" name="Create"/>
+ <menu_item_call label="Editar a topografia" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_landmark.xml b/indra/newview/skins/minimal/xui/pt/menu_landmark.xml
new file mode 100644
index 0000000000..6accfebee7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="Copiar SLurl" name="copy"/>
+ <menu_item_call label="Excluir" name="delete"/>
+ <menu_item_call label="Criar destaque" name="pick"/>
+ <menu_item_call label="Adicionar à barra de favoritos" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_login.xml b/indra/newview/skins/minimal/xui/pt/menu_login.xml
new file mode 100644
index 0000000000..3dff3d7c8a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_login.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Login Menu">
+ <menu label="Eu" name="File">
+ <menu_item_call label="Preferências" name="Preferences..."/>
+ <menu_item_call label="Sair do [APP_NAME]" name="Quit"/>
+ </menu>
+ <menu label="Ajuda" name="Help">
+ <menu_item_call label="Ajuda do [SECOND_LIFE]" name="Second Life Help"/>
+ <menu_item_call label="Sobre [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu_item_check label="Exibir menu de depuração" name="Show Debug Menu"/>
+ <menu label="Depurar" name="Debug">
+ <menu_item_call label="Mostrar configurações" name="Debug Settings"/>
+ <menu_item_call label="Configurações da interface e cor" name="UI/Color Settings"/>
+ <menu label="Testes de UI" name="UI Tests"/>
+ <menu_item_call label="Definir tamanho da janela:" name="Set Window Size..."/>
+ <menu_item_call label="Mostrar TOS" name="TOS"/>
+ <menu_item_call label="Mostrar mensagem crítica" name="Critical"/>
+ <menu_item_call label="Teste de mídia do navegador" name="Web Browser Test"/>
+ <menu_item_call label="Teste de conteúdo web" name="Web Content Floater Test"/>
+ <menu_item_check label="Exibir seletor da grade" name="Show Grid Picker"/>
+ <menu_item_call label="Exibir painel de notificações" name="Show Notifications Console"/>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_mini_map.xml b/indra/newview/skins/minimal/xui/pt/menu_mini_map.xml
new file mode 100644
index 0000000000..6a3fe55de5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_mini_map.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Zoom Perto" name="Zoom Close"/>
+ <menu_item_call label="Zoom Médio" name="Zoom Medium"/>
+ <menu_item_call label="Zoom Longe" name="Zoom Far"/>
+ <menu_item_call label="Zoom padrão" name="Zoom Default"/>
+ <menu_item_check label="Girar mapa" name="Rotate Map"/>
+ <menu_item_check label="Auto Center" name="Auto Center"/>
+ <menu_item_call label="Parar Acompanhamento" name="Stop Tracking"/>
+ <menu_item_call label="Mapa-múndi" name="World Map"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_navbar.xml b/indra/newview/skins/minimal/xui/pt/menu_navbar.xml
new file mode 100644
index 0000000000..57c1471de3
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="Mostrar coordenadas" name="Show Coordinates"/>
+ <menu_item_check label="Mostrar as propriedades do terreno" name="Show Parcel Properties"/>
+ <menu_item_call label="Marco" name="Landmark"/>
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Colar" name="Paste"/>
+ <menu_item_call label="Excluir" name="Delete"/>
+ <menu_item_call label="Selecionar tudo" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/pt/menu_nearby_chat.xml
new file mode 100644
index 0000000000..f1ea83c837
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="Mostrar quem está aqui..." name="nearby_people"/>
+ <menu_item_check label="Mostrar texto bloqueado" name="muted_text"/>
+ <menu_item_check label="Mostrar ícones de amigos" name="show_buddy_icons"/>
+ <menu_item_check label="Mostrar nomes" name="show_names"/>
+ <menu_item_check label="Mostrar ícones e nomes" name="show_icons_and_names"/>
+ <menu_item_call label="Tamanho da fonte" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/pt/menu_notification_well_button.xml
new file mode 100644
index 0000000000..43ad4134ec
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_notification_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Notification Well Button Context Menu">
+ <menu_item_call label="Fechar tudo" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_object.xml b/indra/newview/skins/minimal/xui/pt/menu_object.xml
new file mode 100644
index 0000000000..bf94859699
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_object.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="Tocar" name="Object Touch">
+ <menu_item_call.on_enable name="EnableTouch" parameter="Tocar"/>
+ </menu_item_call>
+ <menu_item_call label="Editar" name="Edit..."/>
+ <menu_item_call label="Construir" name="Build"/>
+ <menu_item_call label="Abrir" name="Open"/>
+ <menu_item_call label="Sentar aqui" name="Object Sit"/>
+ <menu_item_call label="Ficar de pé" name="Object Stand Up"/>
+ <menu_item_call label="Perfil do objeto" name="Object Inspect"/>
+ <menu_item_call label="Mais zoom" name="Zoom In"/>
+ <context_menu label="Colocar no(a)" name="Put On">
+ <menu_item_call label="Vestir" name="Wear"/>
+ <menu_item_call label="Adicionar" name="Add"/>
+ <context_menu label="Anexar" name="Object Attach"/>
+ <context_menu label="Anexar o HUD" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="Tirar" name="Remove">
+ <menu_item_call label="Denunciar abuso" name="Report Abuse..."/>
+ <menu_item_call label="Bloquear" name="Object Mute"/>
+ <menu_item_call label="Devolver" name="Return..."/>
+ <menu_item_call label="Excluir" name="Delete"/>
+ </context_menu>
+ <menu_item_call label="Pegar" name="Pie Object Take"/>
+ <menu_item_call label="Pegar uma cópia" name="Take Copy"/>
+ <menu_item_call label="Pagar" name="Pay..."/>
+ <menu_item_call label="Comprar" name="Buy..."/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_object_icon.xml b/indra/newview/skins/minimal/xui/pt/menu_object_icon.xml
new file mode 100644
index 0000000000..7af760a6ee
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="Perfil do objeto..." name="Object Profile"/>
+ <menu_item_call label="Bloquear..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_outfit_gear.xml
new file mode 100644
index 0000000000..11b3e653c6
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_outfit_gear.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear Outfit">
+ <menu_item_call label="Vestir - Substituir look atual" name="wear"/>
+ <menu_item_call label="Vestir - Adicionar ao look atual" name="wear_add"/>
+ <menu_item_call label="Tirar - Tirar do look atual" name="take_off"/>
+ <menu label="Roupas novas" name="New Clothes">
+ <menu_item_call label="Nova camisa" name="New Shirt"/>
+ <menu_item_call label="Novas calças" name="New Pants"/>
+ <menu_item_call label="Novos sapatos" name="New Shoes"/>
+ <menu_item_call label="Novas meias" name="New Socks"/>
+ <menu_item_call label="Nova blusa" name="New Jacket"/>
+ <menu_item_call label="Nova saia" name="New Skirt"/>
+ <menu_item_call label="Novas luvas" name="New Gloves"/>
+ <menu_item_call label="Nova camiseta" name="New Undershirt"/>
+ <menu_item_call label="Novas roupa de baixo" name="New Underpants"/>
+ <menu_item_call label="Novo alpha" name="New Alpha"/>
+ <menu_item_call label="Nova tatuagem" name="New Tattoo"/>
+ </menu>
+ <menu label="Nova parte do corpo" name="New Body Parts">
+ <menu_item_call label="Nova silhueta" name="New Shape"/>
+ <menu_item_call label="Nova pele" name="New Skin"/>
+ <menu_item_call label="Novo cabelo" name="New Hair"/>
+ <menu_item_call label="Novos olhos" name="New Eyes"/>
+ </menu>
+ <menu_item_call label="Renomear look" name="rename"/>
+ <menu_item_call label="Excluir visual" name="delete_outfit"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/pt/menu_outfit_tab.xml
new file mode 100644
index 0000000000..8db5e405b3
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_outfit_tab.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit">
+ <menu_item_call label="Vestir - Substituir look atual" name="wear_replace"/>
+ <menu_item_call label="Vestir - Sem tirar look atual" name="wear_add"/>
+ <menu_item_call label="Tirar - Tirar do look atual" name="take_off"/>
+ <menu_item_call label="Editar look" name="edit"/>
+ <menu_item_call label="Renomear look" name="rename"/>
+ <menu_item_call label="Excluir visual" name="delete"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_participant_list.xml b/indra/newview/skins/minimal/xui/pt/menu_participant_list.xml
new file mode 100644
index 0000000000..01f1d4ef80
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_participant_list.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_check label="Ordenar por nome" name="SortByName"/>
+ <menu_item_check label="Ordenar por conversas mais recentes" name="SortByRecentSpeakers"/>
+ <menu_item_call label="Ver perfil" name="View Profile"/>
+ <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
+ <menu_item_call label="MI" name="IM"/>
+ <menu_item_call label="Ligar" name="Call"/>
+ <menu_item_call label="Compartilhar" name="Share"/>
+ <menu_item_call label="Pagar" name="Pay"/>
+ <menu_item_check label="Ver ícones de pessoas" name="View Icons"/>
+ <menu_item_check label="Bloquear voz" name="Block/Unblock"/>
+ <menu_item_check label="Bloquear texto" name="MuteText"/>
+ <context_menu label="Opções do moderador &gt;" name="Moderator Options">
+ <menu_item_check label="Pode bater papo por escrito" name="AllowTextChat"/>
+ <menu_item_call label="Silenciar este participante" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Desfazer silenciar deste participante" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Silenciar todos" name="ModerateVoiceMute"/>
+ <menu_item_call label="Desfazer silenciar para todos" name="ModerateVoiceUnmute"/>
+ </context_menu>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/pt/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..e7c325010f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_people_friends_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Ordenar por nome" name="sort_name"/>
+ <menu_item_check label="Ordenar por status" name="sort_status"/>
+ <menu_item_check label="Ver ícones de pessoas" name="view_icons"/>
+ <menu_item_check label="Autorizações de visualização dadas" name="view_permissions"/>
+ <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_groups.xml b/indra/newview/skins/minimal/xui/pt/menu_people_groups.xml
new file mode 100644
index 0000000000..9a924ad7b9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_people_groups.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Ver dados" name="View Info"/>
+ <menu_item_call label="Bate-papo" name="Chat"/>
+ <menu_item_call label="Ligar" name="Call"/>
+ <menu_item_call label="Ativar" name="Activate"/>
+ <menu_item_call label="Sair" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/pt/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..86a9d2263f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Mostrar ícones de grupos" name="Display Group Icons"/>
+ <menu_item_call label="Sair do grupo selecionado" name="Leave Selected Group"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/pt/menu_people_nearby.xml
new file mode 100644
index 0000000000..7c720f262b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_people_nearby.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="Ver perfil" name="View Profile"/>
+ <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
+ <menu_item_call label="Remover amigo..." name="Remove Friend"/>
+ <menu_item_call label="MI" name="IM"/>
+ <menu_item_call label="Ligar" name="Call"/>
+ <menu_item_call label="Mapa" name="Map"/>
+ <menu_item_call label="Compartilhar" name="Share"/>
+ <menu_item_call label="Pagar" name="Pay"/>
+ <menu_item_check label="Bloquear/desbloquear" name="Block/Unblock"/>
+ <menu_item_call label="Teletransportar?" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/pt/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..79edb96b1c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_people_nearby_multiselect.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="Adicionar amigo..." name="Add Friends"/>
+ <menu_item_call label="Remover amigo..." name="Remove Friend"/>
+ <menu_item_call label="MI" name="IM"/>
+ <menu_item_call label="Ligar" name="Call"/>
+ <menu_item_call label="Compartilhar" name="Share"/>
+ <menu_item_call label="Pagar" name="Pay"/>
+ <menu_item_call label="Teletransportar?" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/pt/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..228ce46a31
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Ordenar por conversas mais recentes" name="sort_by_recent_speakers"/>
+ <menu_item_check label="Ordenar por nome" name="sort_name"/>
+ <menu_item_check label="Ordenar por distância" name="sort_distance"/>
+ <menu_item_check label="Ver ícones de pessoas" name="view_icons"/>
+ <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/pt/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..f3b89e01cd
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Ordenar por mais recente" name="sort_most"/>
+ <menu_item_check label="Ordenar por nome" name="sort_name"/>
+ <menu_item_check label="Ver ícones de pessoas" name="view_icons"/>
+ <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_picks.xml b/indra/newview/skins/minimal/xui/pt/menu_picks.xml
new file mode 100644
index 0000000000..8b9e10fc02
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="Info" name="pick_info"/>
+ <menu_item_call label="Editar" name="pick_edit"/>
+ <menu_item_call label="Teletransportar" name="pick_teleport"/>
+ <menu_item_call label="Mapa" name="pick_map"/>
+ <menu_item_call label="Excluir" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/pt/menu_picks_plus.xml
new file mode 100644
index 0000000000..95a7c05262
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="Adicionar" name="create_pick"/>
+ <menu_item_call label="Novo anúncio" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_place.xml b/indra/newview/skins/minimal/xui/pt/menu_place.xml
new file mode 100644
index 0000000000..282ea20a7a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_place.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="Criar marco" name="landmark"/>
+ <menu_item_call label="Criar destaque" name="pick"/>
+ <menu_item_call label="Comprar passe" name="pass"/>
+ <menu_item_call label="Editar" name="edit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/pt/menu_place_add_button.xml
new file mode 100644
index 0000000000..d099d04f8d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Adicionar pasta" name="add_folder"/>
+ <menu_item_call label="Adicionar marco" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/pt/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..2059a9ed2d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_places_gear_folder.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Adicionar marco" name="add_landmark"/>
+ <menu_item_call label="Adicionar pasta" name="add_folder"/>
+ <menu_item_call label="Cortar" name="cut"/>
+ <menu_item_call label="Copiar" name="copy_folder"/>
+ <menu_item_call label="Colar" name="paste"/>
+ <menu_item_call label="Renomear" name="rename"/>
+ <menu_item_call label="Excluir" name="delete"/>
+ <menu_item_call label="Expanda" name="expand"/>
+ <menu_item_call label="Recolher" name="collapse"/>
+ <menu_item_call label="Expandir todas as pastas" name="expand_all"/>
+ <menu_item_call label="Recolher todas as pastas" name="collapse_all"/>
+ <menu_item_check label="Ordenar por data" name="sort_by_date"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/pt/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..52a9d13735
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_places_gear_landmark.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_ladmark_gear">
+ <menu_item_call label="Teletransportar" name="teleport"/>
+ <menu_item_call label="Mais informações" name="more_info"/>
+ <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
+ <menu_item_call label="Adicionar marco" name="add_landmark"/>
+ <menu_item_call label="Adicionar pasta" name="add_folder"/>
+ <menu_item_call label="Cortar" name="cut"/>
+ <menu_item_call label="Copiar marco" name="copy_landmark"/>
+ <menu_item_call label="Copiar SLurl" name="copy_slurl"/>
+ <menu_item_call label="Colar" name="paste"/>
+ <menu_item_call label="Renomear" name="rename"/>
+ <menu_item_call label="Excluir" name="delete"/>
+ <menu_item_call label="Expandir todas as pastas" name="expand_all"/>
+ <menu_item_call label="Recolher todas as pastas" name="collapse_all"/>
+ <menu_item_check label="Ordenar por data" name="sort_by_date"/>
+ <menu_item_call label="Criar destaque" name="create_pick"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/pt/menu_profile_overflow.xml
new file mode 100644
index 0000000000..d41ecbd755
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_profile_overflow.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Mapa" name="show_on_map"/>
+ <menu_item_call label="Pagar" name="pay"/>
+ <menu_item_call label="Compartilhar" name="share"/>
+ <menu_item_call label="Bloquear" name="block"/>
+ <menu_item_call label="Desbloquear" name="unblock"/>
+ <menu_item_call label="Chutar" name="kick"/>
+ <menu_item_call label="Congelar" name="freeze"/>
+ <menu_item_call label="Descongelar" name="unfreeze"/>
+ <menu_item_call label="CSR" name="csr"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/pt/menu_save_outfit.xml
new file mode 100644
index 0000000000..61c6b9202f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_save_outfit.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="save_outfit_menu">
+ <menu_item_call label="Salvar" name="save_outfit"/>
+ <menu_item_call label="Salvar como" name="save_as_new_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/pt/menu_script_chiclet.xml
new file mode 100644
index 0000000000..ccf3878e14
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_script_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="ScriptChiclet Menu">
+ <menu_item_call label="Fechar" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_slurl.xml b/indra/newview/skins/minimal/xui/pt/menu_slurl.xml
new file mode 100644
index 0000000000..6d4c84fc3c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_slurl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Sobre a URL" name="about_url"/>
+ <menu_item_call label="Teletransporte para a URL" name="teleport_to_url"/>
+ <menu_item_call label="Mapa" name="show_on_map"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..f034509be8
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="Expandir todas as pastas" name="Expand all folders"/>
+ <menu_item_call label="Recolher todas as pastas" name="Collapse all folders"/>
+ <menu_item_call label="Limpar histórico de teletransporte" name="Clear Teleport History"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/pt/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..ec1e7a0950
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Teletransportar" name="Teleport"/>
+ <menu_item_call label="Mais informações" name="More Information"/>
+ <menu_item_call label="Copiar" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/pt/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..6a633cf74c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Abrir" name="TabOpen"/>
+ <menu_item_call label="Fechar" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_text_editor.xml b/indra/newview/skins/minimal/xui/pt/menu_text_editor.xml
new file mode 100644
index 0000000000..31c284c6ed
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Colar" name="Paste"/>
+ <menu_item_call label="Excluir" name="Delete"/>
+ <menu_item_call label="Selecionar tudo" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/pt/menu_topinfobar.xml
new file mode 100644
index 0000000000..d9347950b1
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_topinfobar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_topinfobar">
+ <menu_item_check label="Mostrar coordenadas" name="Show Coordinates"/>
+ <menu_item_check label="Mostrar as propriedades do terreno" name="Show Parcel Properties"/>
+ <menu_item_call label="Marco" name="Landmark"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_agent.xml b/indra/newview/skins/minimal/xui/pt/menu_url_agent.xml
new file mode 100644
index 0000000000..ba5e055124
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar perfil de residente" name="show_agent"/>
+ <menu_item_call label="Copiar nome para área de transferência" name="url_copy_label"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_group.xml b/indra/newview/skins/minimal/xui/pt/menu_url_group.xml
new file mode 100644
index 0000000000..5b67a69c9a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar informações do grupo" name="show_group"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy_label"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_http.xml b/indra/newview/skins/minimal/xui/pt/menu_url_http.xml
new file mode 100644
index 0000000000..e53a2572b8
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Abrir página da web" name="url_open"/>
+ <menu_item_call label="Abrir no navegador do SL" name="url_open_internal"/>
+ <menu_item_call label="Abrir no navegador externo" name="url_open_external"/>
+ <menu_item_call label="Copiar URL para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/pt/menu_url_inventory.xml
new file mode 100644
index 0000000000..45c14355d0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar item de inventário" name="show_item"/>
+ <menu_item_call label="Copiar nome para área de transferência" name="url_copy_label"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_map.xml b/indra/newview/skins/minimal/xui/pt/menu_url_map.xml
new file mode 100644
index 0000000000..ba114cccaa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
+ <menu_item_call label="Teletransportar para este lugar" name="teleport_to_location"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/pt/menu_url_objectim.xml
new file mode 100644
index 0000000000..c197444181
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar informações sobre o objeto" name="show_object"/>
+ <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
+ <menu_item_call label="Teletransportar para lugar do objeto" name="teleport_to_object"/>
+ <menu_item_call label="Copiar nome do objeto para área de transferência" name="url_copy_label"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/pt/menu_url_parcel.xml
new file mode 100644
index 0000000000..6cc668bfd3
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar informações sobre este lote" name="show_parcel"/>
+ <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/pt/menu_url_slapp.xml
new file mode 100644
index 0000000000..d0784149ac
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Executar este comando" name="run_slapp"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/pt/menu_url_slurl.xml
new file mode 100644
index 0000000000..7216ccf0b3
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar informações sobre este lugar" name="show_place"/>
+ <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
+ <menu_item_call label="Teletransportar para este lugar" name="teleport_to_location"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/pt/menu_url_teleport.xml
new file mode 100644
index 0000000000..f007425646
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Teletransportar para este lugar" name="teleport"/>
+ <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_viewer.xml b/indra/newview/skins/minimal/xui/pt/menu_viewer.xml
new file mode 100644
index 0000000000..2bd1e88279
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_viewer.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Main Menu">
+ <menu label="Ajuda" name="Help">
+ <menu_item_call label="[SECOND_LIFE] Ajuda" name="Second Life Help"/>
+ </menu>
+ <menu label="Avançado" name="Advanced">
+ <menu label="Atalhos" name="Shortcuts">
+ <menu_item_check label="Voar" name="Fly"/>
+ <menu_item_call label="Fechar janela" name="Close Window"/>
+ <menu_item_call label="Fechar todas as janelas" name="Close All Windows"/>
+ <menu_item_call label="Visão padrão" name="Reset View"/>
+ </menu>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/pt/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..2487f6779f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_wearable_list_item.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit Wearable Context Menu">
+ <menu_item_call label="Trocar" name="wear_replace"/>
+ <menu_item_call label="Vestir" name="wear_wear"/>
+ <menu_item_call label="Adicionar" name="wear_add"/>
+ <menu_item_call label="Tirar / Separar" name="take_off_or_detach"/>
+ <menu_item_call label="Separar" name="detach"/>
+ <context_menu label="Colocar em" name="wearable_attach_to"/>
+ <context_menu label="Anexar ao HUD" name="wearable_attach_to_hud"/>
+ <menu_item_call label="Tirar" name="take_off"/>
+ <menu_item_call label="Editar" name="edit"/>
+ <menu_item_call label="Perfil do item" name="object_profile"/>
+ <menu_item_call label="Mostrar original" name="show_original"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_wearing_gear.xml
new file mode 100644
index 0000000000..7b6ce4d87e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_wearing_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear Wearing">
+ <menu_item_call label="Editar look" name="edit"/>
+ <menu_item_call label="Tirar" name="takeoff"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/pt/menu_wearing_tab.xml
new file mode 100644
index 0000000000..4e6e52ebc7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/menu_wearing_tab.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Wearing">
+ <menu_item_call label="Tirar" name="take_off"/>
+ <menu_item_call label="Tirar" name="detach"/>
+ <menu_item_call label="Editar look" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/pt/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..bd50d4953d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/panel_adhoc_control_panel.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="call_btn_panel">
+ <button label="Ligar" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Desligar" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Controles de voz" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml
new file mode 100644
index 0000000000..243f323f09
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
+ <string name="SpeakBtnToolTip" value="Liga e desliga o microfone"/>
+ <string name="VoiceControlBtnToolTip" value="Mostra/oculta os controles de voz"/>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Gesto" name="Gesture" tool_tip="Mostra/oculta os gestos"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <bottomtray_button label="Exibir" name="camera_btn" tool_tip="Mostra/oculta os controles da câmera"/>
+ </layout_panel>
+ <layout_panel name="avatar_and_destinations_panel">
+ <radio_group name="avatar_and_destination_btns">
+ <radio_item name="destination_btn" value="0"/>
+ <radio_item name="avatar_btn" value="1"/>
+ </radio_group>
+ </layout_panel>
+ <layout_panel name="people_panel">
+ <bottomtray_button label="Pessoas" name="show_people_button" tool_tip="Exibe as pessoas"/>
+ </layout_panel>
+ <layout_panel name="profile_panel">
+ <bottomtray_button label="Perfil" name="show_profile_btn" tool_tip="Exibe o perfil"/>
+ </layout_panel>
+ <layout_panel name="howto_panel">
+ <bottomtray_button label="Como..." name="show_help_btn" tool_tip="Abrir &quot;Como...&quot; do Second Life"/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Conversas"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Notificações"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml
new file mode 100644
index 0000000000..91b7d1b7cd
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/panel_im_control_panel.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="button_stack">
+ <layout_panel name="view_profile_btn_panel">
+ <button label="Perfil" name="view_profile_btn"/>
+ </layout_panel>
+ <layout_panel name="add_friend_btn_panel">
+ <button label="Adicionar amigo" name="add_friend_btn"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_panel">
+ <button label="Teletransportar" name="teleport_btn" tool_tip="Oferecer teletransporte"/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="Compartilhar" name="share_btn"/>
+ </layout_panel>
+ <layout_panel name="pay_btn_panel">
+ <button label="Pagar" name="pay_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Ligar" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Encerrar ligação" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Controles de voz" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_login.xml b/indra/newview/skins/minimal/xui/pt/panel_login.xml
new file mode 100644
index 0000000000..cd529b0b06
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/panel_login.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_login">
+ <panel.string name="create_account_url">
+ http://join.secondlife.com/
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php?lang=pt
+ </panel.string>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="username_text">
+ Nome de usuário:
+ </text>
+ <combo_box name="username_combo" tool_tip="O nome de usuário que você escolheu ao fazer seu cadastro, como zecazc12 or Magia Solar"/>
+ <text name="password_text">
+ Senha:
+ </text>
+ <check_box label="Lembrar senha" name="remember_check"/>
+ <button label="conectar" name="connect_btn"/>
+ <text name="mode_selection_text">
+ Modo:
+ </text>
+ <combo_box name="mode_combo">
+ <combo_box.item label="Básico (padrão)" name="Basic"/>
+ <combo_box.item label="Avançado" name="Advanced"/>
+ </combo_box>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ Cadastre-se
+ </text>
+ <text name="forgot_password_text">
+ Esqueceu seu nome ou senha?
+ </text>
+ <text name="login_help">
+ Precisa de ajuda ao conectar?
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/pt/panel_navigation_bar.xml
new file mode 100644
index 0000000000..01930bf3b3
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/panel_navigation_bar.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Voltar para região anterior"/>
+ <pull_button name="forward_btn" tool_tip="Avançar uma região"/>
+ <button name="home_btn" tool_tip="Teletransportar para meu início"/>
+ <location_input label="Onde" name="location_combo"/>
+ <search_combo_box label="Busca" name="search_combo_box" tool_tip="Busca">
+ <combo_editor label="Buscar no [SECOND_LIFE]" name="search_combo_editor"/>
+ </search_combo_box>
+ </panel>
+ <favorites_bar name="favorite" tool_tip="Arraste marcos para cá para acessar seus lugares preferidos do Second Life!">
+ <label name="favorites_bar_label" tool_tip="Arraste marcos para cá para acessar seus lugares preferidos do Second Life!">
+ Barra Destaques
+ </label>
+ <chevron_button name="&gt;&gt;" tool_tip="Mostrar mais favoritos"/>
+ </favorites_bar>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_people.xml b/indra/newview/skins/minimal/xui/pt/panel_people.xml
new file mode 100644
index 0000000000..935ade2177
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/panel_people.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="Pessoas" name="people_panel">
+ <string name="no_recent_people" value="Ninguém, recentemente. Em busca de alguém para conversar? Confira o botão Destinos abaixo."/>
+ <string name="no_filtered_recent_people" value="Não há ninguém com esse nome ultimamente."/>
+ <string name="no_one_near" value="Ninguém por perto Em busca de alguém para conversar? Confira o botão Destinos abaixo."/>
+ <string name="no_one_filtered_near" value="Não há ninguém com esse nome por perto."/>
+ <string name="no_friends_online" value="Nenhum amigo online"/>
+ <string name="no_friends" value="Nenhum amigo"/>
+ <string name="no_friends_msg">
+ Clique em um residente com o botão direito to mouse para adicioná-lo como amigo.
+Em busca de alguém para conversar? Confira o botão Destinos abaixo.
+ </string>
+ <string name="no_filtered_friends_msg">
+ Não encontrou o que procura? Confira o botão Destinos abaixo.
+ </string>
+ <string name="people_filter_label" value="Filtro de pessoas"/>
+ <string name="groups_filter_label" value="Filtro de grupos"/>
+ <string name="no_filtered_groups_msg" value="Não encontrou o que procura? Tente buscar no [secondlife:///app/search/groups/[SEARCH_TERM] Search]."/>
+ <string name="no_groups_msg" value="À procura de grupos interessantes? Tente fazer uma [secondlife:///app/search/groups Busca]."/>
+ <string name="MiniMapToolTipMsg" value="[REGION](Clique duplo para abrir o Mapa, botão Shift e arrastar para ver mais)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](Clique duplo para se teletransportar, botão Shift e arrastar para ver mais)"/>
+ <filter_editor label="Filtro" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="PROXIMIDADE" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel"/>
+ </panel>
+ <panel label="MEUS AMIGOS" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="Online"/>
+ <accordion_tab name="tab_all" title="Todos"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="bottom_panel">
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="del_btn" tool_tip="Remover a pessoa selecionada da sua lista de amigos"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+ <panel label="RECENTE" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="add_friend_btn" tool_tip="Adicionar o residente selecionado para sua lista de amigos"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <layout_stack name="bottom_bar_ls">
+ <layout_panel name="view_profile_btn_lp">
+ <button label="Perfil" name="view_profile_btn" tool_tip="Exibir fotografia, grupos e outras informações dos residentes"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="MI" name="im_btn" tool_tip="Abrir sessão de mensagem instantânea"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Teletransportar" name="teleport_btn" tool_tip="Oferecer teletransporte"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls1">
+ <layout_panel name="group_info_btn_lp">
+ <button label="Perfil do grupo" name="group_info_btn" tool_tip="Exibir dados do grupo"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Bate-papo de grupo" name="chat_btn" tool_tip="Nova sessão de bate-papo"/>
+ </layout_panel>
+ <layout_panel name="group_call_btn_lp">
+ <button label="Ligar para o grupo" name="group_call_btn" tool_tip="Ligar para este grupo"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/pt/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..09444a5535
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/panel_side_tray_tab_caption.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="Bandeja lateral"/>
+ <button name="undock" tool_tip="Soltar janela"/>
+ <button name="dock" tool_tip="Ancorar janela"/>
+ <button name="show_help" tool_tip="Mostrar ajuda"/>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_status_bar.xml b/indra/newview/skins/minimal/xui/pt/panel_status_bar.xml
new file mode 100644
index 0000000000..f7890ae57d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/panel_status_bar.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="status">
+ <panel.string name="StatBarDaysOfWeek">
+ Domingo:Segunda-feira:Terça-feira:Quarta-feira:Quinta-feira:Sexta-feira:Sábado
+ </panel.string>
+ <panel.string name="StatBarMonthsOfYear">
+ Janeiro:Fevereiro:Março:Abril:Maio:Junho:Julho:Agosto:Setembro:Outubro:Novembro:Dezembro
+ </panel.string>
+ <panel.string name="packet_loss_tooltip">
+ Perda de pacote
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
+ Banda
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ L$ [AMT]
+ </panel.string>
+ <panel name="balance_bg">
+ <text name="balance" tool_tip="Atualizar saldo de L$" value="L$20"/>
+ <button label="Comprar L$" name="buyL" tool_tip="Comprar mais L$"/>
+ </panel>
+ <text name="TimeText" tool_tip="Hora atual (Pacífico)">
+ 24:00 AM PST
+ </text>
+ <button name="media_toggle_btn" tool_tip="Tocar/Pausar todas mídias (música, vídeo, páginas web)"/>
+ <button name="volume_btn" tool_tip="Volume geral"/>
+</panel>
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 1722c84d34..e08c815218 100644
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -332,7 +332,7 @@ class WindowsManifest(ViewerManifest):
self.end_prefix()
# winmm.dll shim
- if self.prefix(src='../media_plugins/winmmshim/%s' % self.args['configuration'], dst="llplugin"):
+ if self.prefix(src='../media_plugins/winmmshim/%s' % self.args['configuration'], dst=""):
self.path("winmm.dll")
self.end_prefix()
@@ -803,7 +803,7 @@ class DarwinManifest(ViewerManifest):
self.run_command('SetFile -a V %r' % pathname)
# Create the alias file (which is a resource file) from the .r
- self.run_command('rez %r -o %r' %
+ self.run_command('Rez %r -o %r' %
(self.src_path_of("installers/darwin/release-dmg/Applications-alias.r"),
os.path.join(volpath, "Applications")))
diff --git a/install.xml b/install.xml
index 13abaac1c1..c91bec8535 100644
--- a/install.xml
+++ b/install.xml
@@ -981,9 +981,9 @@ anguage Infrstructure (CLI) international standard</string>
<key>darwin</key>
<map>
<key>md5sum</key>
- <string>66c46841825ab4969ec875b5c8f9b24c</string>
+ <string>13f9be04ba029d19f822abdcb755c700</string>
<key>url</key>
- <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-darwin-qt4.7.1-20101221.tar.bz2</uri>
+ <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-darwin-4.7.1-20110302.tar.bz2</uri>
</map>
<key>linux</key>
<map>
@@ -995,9 +995,9 @@ anguage Infrstructure (CLI) international standard</string>
<key>windows</key>
<map>
<key>md5sum</key>
- <string>b678c4d18ea8e4fab42b20f8d0b2629a</string>
+ <string>7cc9626ff4ac035f8605c996d18ea6a9</string>
<key>url</key>
- <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.7.1-20101221.tar.bz2</uri>
+ <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.7.1-20110302.tar.bz2</uri>
</map>
</map>
</map>