summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan "Geenz" Goodman <geenz@lindenlab.com>2026-05-20 11:57:48 -0400
committerGitHub <noreply@github.com>2026-05-20 11:57:48 -0400
commit9c2ee024bef564ebb6e2e8942b43ffae1d99232c (patch)
tree6c6c6bebf982cda7b056156fb206378dbc443fe7
parent491b0b32c74e2186dd34f9be8513bb08d390dfe2 (diff)
parent3f82abe033887ff690398381563100735e008df4 (diff)
Merge pull request #5843 from secondlife/geenz/26.2-to-26.3
26.2 to 26.3
-rw-r--r--autobuild.xml32
-rw-r--r--indra/cmake/ViewerMiscLibs.cmake1
-rw-r--r--indra/llcommon/llapp.h1
-rw-r--r--indra/llcommon/llwatchdog.cpp71
-rw-r--r--indra/llcommon/llwatchdog.h19
-rw-r--r--indra/llmath/v3math.h9
-rw-r--r--indra/llplugin/llpluginclassmedia.cpp12
-rw-r--r--indra/llplugin/llpluginclassmedia.h2
-rw-r--r--indra/llprimitive/llgltfmaterial.cpp65
-rw-r--r--indra/llrender/llfontfreetype.cpp141
-rw-r--r--indra/llrender/llfontfreetype.h15
-rw-r--r--indra/llrender/llfontgl.cpp13
-rw-r--r--indra/llrender/llfontgl.h3
-rw-r--r--indra/llrender/llfontregistry.cpp66
-rw-r--r--indra/llrender/llfontregistry.h31
-rw-r--r--indra/llrender/llrender.cpp63
-rw-r--r--indra/llrender/llrender.h13
-rw-r--r--indra/llui/llaccordionctrltab.cpp2
-rw-r--r--indra/llui/llbutton.cpp25
-rw-r--r--indra/llui/llbutton.h9
-rw-r--r--indra/llui/llconsole.cpp11
-rw-r--r--indra/llui/lldraghandle.cpp12
-rw-r--r--indra/llui/lldraghandle.h8
-rw-r--r--indra/llui/llfloater.cpp10
-rw-r--r--indra/llui/llfloater.h6
-rw-r--r--indra/llui/llfocusmgr.cpp5
-rw-r--r--indra/llui/llfocusmgr.h2
-rw-r--r--indra/llui/llfolderviewitem.cpp14
-rw-r--r--indra/llui/llfolderviewitem.h4
-rw-r--r--indra/llui/lllayoutstack.cpp11
-rw-r--r--indra/llui/lllayoutstack.h6
-rw-r--r--indra/llui/lllineeditor.cpp7
-rw-r--r--indra/llui/lllineeditor.h4
-rw-r--r--indra/llui/llmenugl.cpp17
-rw-r--r--indra/llui/lltabcontainer.cpp28
-rw-r--r--indra/llui/lltabcontainer.h1
-rw-r--r--indra/llui/lltextbase.cpp5
-rw-r--r--indra/llui/lltextbase.h1
-rw-r--r--indra/llui/lluictrl.cpp2
-rw-r--r--indra/llui/llviewborder.cpp2
-rw-r--r--indra/llwebrtc/llwebrtc.cpp80
-rw-r--r--indra/llwebrtc/llwebrtc.h6
-rw-r--r--indra/llwebrtc/llwebrtc_impl.h14
-rw-r--r--indra/newview/CMakeLists.txt2
-rw-r--r--indra/newview/VIEWER_VERSION.txt2
-rw-r--r--indra/newview/app_settings/settings.xml55
-rw-r--r--indra/newview/llappviewer.cpp207
-rw-r--r--indra/newview/llappviewer.h3
-rw-r--r--indra/newview/llappviewerwin32.cpp66
-rw-r--r--indra/newview/llappviewerwin32.h1
-rw-r--r--indra/newview/llcolorswatch.cpp18
-rw-r--r--indra/newview/lleventpoll.cpp25
-rw-r--r--indra/newview/llfilepicker_mac.mm4
-rw-r--r--indra/newview/llfloaterimcontainer.cpp111
-rw-r--r--indra/newview/llfloaterimcontainer.h1
-rw-r--r--indra/newview/llfloaterimsession.cpp2
-rw-r--r--indra/newview/llfloaterimsessiontab.cpp2
-rw-r--r--indra/newview/llmeshrepository.cpp44
-rw-r--r--indra/newview/llnearbyvoicemoderation.cpp220
-rw-r--r--indra/newview/llnearbyvoicemoderation.h50
-rw-r--r--indra/newview/llnotificationlistitem.cpp4
-rw-r--r--indra/newview/llpanelface.cpp2
-rw-r--r--indra/newview/llpanellogin.cpp154
-rw-r--r--indra/newview/llpanellogin.h12
-rw-r--r--indra/newview/llstartup.cpp5
-rw-r--r--indra/newview/lltoastnotifypanel.cpp40
-rw-r--r--indra/newview/lltoastnotifypanel.h2
-rw-r--r--indra/newview/llvelopack.cpp230
-rw-r--r--indra/newview/llvelopack.h5
-rw-r--r--indra/newview/llviewerchat.cpp2
-rw-r--r--indra/newview/llviewermenu.cpp2
-rw-r--r--indra/newview/llviewernetwork.cpp4
-rw-r--r--indra/newview/llviewernetwork.h1
-rw-r--r--indra/newview/llviewerparcelmgr.cpp10
-rw-r--r--indra/newview/llviewerparcelmgr.h6
-rwxr-xr-xindra/newview/llviewerparceloverlay.cpp235
-rw-r--r--indra/newview/llviewerparceloverlay.h5
-rwxr-xr-xindra/newview/llviewerregion.cpp11
-rw-r--r--indra/newview/llviewerregion.h2
-rw-r--r--indra/newview/llviewerstats.cpp14
-rw-r--r--indra/newview/llviewerstats.h3
-rw-r--r--indra/newview/llviewerwindow.cpp20
-rw-r--r--indra/newview/llvoiceclient.cpp4
-rw-r--r--indra/newview/llvoicewebrtc.cpp180
-rw-r--r--indra/newview/llvoicewebrtc.h6
-rw-r--r--indra/newview/llwindowlistener.cpp105
-rw-r--r--indra/newview/llwindowlistener.h1
-rw-r--r--indra/newview/skins/default/colors.xml52
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Cam_Rotate_Center.pngbin10689 -> 1816 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Cam_Rotate_In.pngbin407 -> 1794 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Cam_Tracking_Center.pngbin1714 -> 1806 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Cam_Tracking_In.pngbin328 -> 1717 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Movement_Backward_On.pngbin353 -> 1723 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Movement_Down_On.pngbin50907 -> 2091 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Movement_Forward_On.pngbin321 -> 1710 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Movement_Left_On.pngbin51806 -> 2269 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Movement_Right_On.pngbin50161 -> 2063 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Movement_TurnLeft_On.pngbin430 -> 1806 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Movement_TurnRight_On.pngbin427 -> 1946 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Movement_Up_On.pngbin51965 -> 2282 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1.pngbin557 -> 1960 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2.pngbin663 -> 2053 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/VoicePTT_On.pngbin451 -> 1842 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Cone_Selected.pngbin576 -> 2394 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Cube_Selected.pngbin477 -> 2278 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Cylinder_Selected.pngbin443 -> 2273 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Grass_Selected.pngbin757 -> 2538 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Hemi_Cone_Selected.pngbin531 -> 2357 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Hemi_Cylinder_Selected.pngbin463 -> 2292 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Hemi_Sphere_Selected.pngbin696 -> 2530 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Prism_Selected.pngbin485 -> 2419 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Pyramid_Selected.pngbin594 -> 2389 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Ring_Selected.pngbin738 -> 2560 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Sphere_Selected.pngbin1003 -> 2799 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Tetrahedron_Selected.pngbin558 -> 2394 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Torus_Selected.pngbin825 -> 2645 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Tree_Selected.pngbin839 -> 2794 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Tube_Selected.pngbin552 -> 2506 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/Accordion_Selected.pngbin228 -> 15050 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/TabLeft_Flat_Off.pngbin0 -> 18169 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/TabLeft_Flat_Selected.pngbin0 -> 18193 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/TabTop_First_Flat_Off.pngbin0 -> 18167 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/TabTop_First_Flat_Selected.pngbin0 -> 18172 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/TabTop_Last_Flat_Off.pngbin0 -> 18164 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/TabTop_Last_Flat_Selected.pngbin0 -> 18166 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/TabTop_Middle_Flat_Off.pngbin0 -> 18168 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/TabTop_Middle_Flat_Selected.pngbin0 -> 18174 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/Toolbar_Middle_Selected.pngbin296 -> 15778 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Info_Over.pngbin520 -> 1974 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_SysClosed.pngbin656 -> 2266 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_SysOpen.pngbin766 -> 2361 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/SL_Logo.pngbin1515 -> 1136 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/back_arrow_off.pngbin1223 -> 802 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/back_arrow_over.pngbin1256 -> 799 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/back_arrow_press.pngbin1417 -> 802 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/check_mark.pngbin1227 -> 2136 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/hand.pngbin1183 -> 2337 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/see_me_online.pngbin645 -> 1843 bytes
-rw-r--r--indra/newview/skins/default/textures/locked_image_dark.pngbin0 -> 18122 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/Favorite_Star_Active.pngbin704 -> 2241 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/Favorite_Star_Over.pngbin445 -> 1967 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/Row_Selection.pngbin231 -> 1736 bytes
-rw-r--r--indra/newview/skins/default/textures/square_selection.pngbin0 -> 18061 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml26
-rw-r--r--indra/newview/skins/default/textures/widgets/Checkbox_Disabled.pngbin470 -> 14960 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Checkbox_Off.pngbin480 -> 14961 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Checkbox_On.pngbin635 -> 15341 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Checkbox_On_Disabled.pngbin621 -> 15333 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Checkbox_On_Press.pngbin647 -> 15245 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Checkbox_Press.pngbin515 -> 15313 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Checkbox_Slim_Off.pngbin0 -> 18115 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Checkbox_Slim_On.pngbin0 -> 17762 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ComboButton_Arrow.pngbin0 -> 16236 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ComboButton_Disabled.pngbin575 -> 15356 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ComboButton_Off.pngbin583 -> 15127 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ComboButton_Selected.pngbin630 -> 15216 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ComboButton_Transparent.pngbin0 -> 18116 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ComboButton_UpOff.pngbin553 -> 16654 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ComboButton_UpSelected.pngbin603 -> 16828 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/DropDown_Disabled.pngbin669 -> 15771 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/DropDown_Off.pngbin678 -> 15125 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/DropDown_On.pngbin869 -> 15433 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/DropDown_Press.pngbin702 -> 15322 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ListItem_Over.pngbin443 -> 15029 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ListItem_Select.pngbin460 -> 15029 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/MarketplaceBtn_Off.pngbin911 -> 15460 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/MarketplaceBtn_Selected.pngbin912 -> 15538 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/PushButton_Disabled.pngbin569 -> 15664 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/PushButton_Login.pngbin1437 -> 18568 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/PushButton_Login_Over.pngbin1516 -> 18568 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/PushButton_Login_Pressed.pngbin1493 -> 18571 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/PushButton_Off.pngbin579 -> 15660 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/PushButton_On.pngbin835 -> 15296 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/PushButton_Over.pngbin589 -> 15808 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/PushButton_Press.pngbin614 -> 15657 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/PushButton_Selected_Press.pngbin998 -> 15333 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/PushButton_Sign.pngbin0 -> 18631 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/PushButton_Sign_Over.pngbin0 -> 18631 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/PushButton_Sign_Pressed.pngbin0 -> 18631 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/RadioButton_Disabled.pngbin606 -> 15444 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/RadioButton_Off.pngbin628 -> 16378 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/RadioButton_On.pngbin679 -> 16857 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/RadioButton_On_Disabled.pngbin652 -> 15907 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/RadioButton_On_Press.pngbin688 -> 15781 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/RadioButton_Press.pngbin666 -> 15307 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz.pngbin509 -> 15228 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ScrollThumb_Vert.pngbin494 -> 15233 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Disabled.pngbin454 -> 15261 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected.pngbin524 -> 15265 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.pngbin613 -> 15279 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Press.pngbin728 -> 15359 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SliderThumb_Disabled.pngbin592 -> 15444 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SliderThumb_Off.pngbin579 -> 16378 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SliderThumb_Press.pngbin582 -> 15307 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SliderTrack_Horiz.pngbin420 -> 15033 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Stepper_Down_Off.pngbin477 -> 15325 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Stepper_Down_Press.pngbin502 -> 15389 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Stepper_Up_Off.pngbin482 -> 15315 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Stepper_Up_Press.pngbin521 -> 15543 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/TextField_Highlight.pngbin0 -> 15490 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/TextField_Transparent.pngbin0 -> 15031 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/track_control_moon_back.pngbin1767 -> 2587 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/track_control_moon_front.pngbin2060 -> 2479 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/track_control_sphere.pngbin7537 -> 9705 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/track_control_sun_back.pngbin1626 -> 2439 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Inspector_I.pngbin547 -> 1974 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Window_Background.pngbin508 -> 15072 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Window_Foreground.pngbin517 -> 15060 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/login_sl_logo_horizontal.pngbin0 -> 4366 bytes
-rw-r--r--indra/newview/skins/default/xui/da/floater_joystick.xml14
-rw-r--r--indra/newview/skins/default/xui/da/floater_whitelist_entry.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_alerts.xml1
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_sound.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_login_first.xml39
-rw-r--r--indra/newview/skins/default/xui/en/floater_about_land.xml26
-rw-r--r--indra/newview/skins/default/xui/en/floater_add_payment_method.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_adjust_environment.xml26
-rw-r--r--indra/newview/skins/default/xui/en/floater_avatar_picker.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_bulk_perms.xml12
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_currency.xml13
-rw-r--r--indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_edit_hover_height.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_font_test.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_god_tools.xml58
-rw-r--r--indra/newview/skins/default/xui/en/floater_inventory_settings.xml13
-rw-r--r--indra/newview/skins/default/xui/en/floater_live_material_editor.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_material_editor.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_model_preview.xml21
-rw-r--r--indra/newview/skins/default/xui/en/floater_my_environments.xml11
-rw-r--r--indra/newview/skins/default/xui/en/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_new_feature_notification.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_performance.xml8
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml24
-rw-r--r--indra/newview/skins/default/xui/en/floater_stats.xml58
-rw-r--r--indra/newview/skins/default/xui/en/floater_telehub.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_slapp.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_textbox.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml668
-rw-r--r--indra/newview/skins/default/xui/en/floater_toybox.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_whitelist_entry.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_world_map.xml51
-rw-r--r--indra/newview/skins/default/xui/en/fonts.xml140
-rw-r--r--indra/newview/skins/default/xui/en/inspect_group.xml10
-rw-r--r--indra/newview/skins/default/xui/en/menu_conversation.xml107
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml17
-rw-r--r--indra/newview/skins/default/xui/en/panel_avatar_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_blocked_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_chat_header.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_chiclet_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_conversation_list_item.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_shape.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_experience_search.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_gltf_material.xml12
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_general.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_notices.xml5
-rw-r--r--indra/newview/skins/default/xui/en/panel_hint.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_hint_image.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_login.xml549
-rw-r--r--indra/newview/skins/default/xui/en/panel_login_first.xml262
-rw-r--r--indra/newview/skins/default/xui/en/panel_main_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_marketplace_listings.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_navigation_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_notification_list_item.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfit_edit.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml5
-rw-r--r--indra/newview/skins/default/xui/en/panel_performance_autoadjustments.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_performance_preferences.xml19
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_advanced.xml26
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_general.xml13
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml38
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_privacy.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_setup.xml21
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_sound.xml31
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_experiences.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_general.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_terrain.xml26
-rw-r--r--indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml14
-rw-r--r--indra/newview/skins/default/xui/en/panel_status_bar.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_tools_texture.xml256
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_appearance.xml20
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml5
-rw-r--r--indra/newview/skins/default/xui/en/widgets/button.xml5
-rw-r--r--indra/newview/skins/default/xui/en/widgets/conversation_view_participant.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/filter_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/en/widgets/floater.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/folder_view_item.xml13
-rw-r--r--indra/newview/skins/default/xui/en/widgets/gesture_combo_list.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/inbox_folder_view_item.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/line_editor.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/panel_camera_item.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/search_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/en/widgets/simple_text_editor.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/tab_container.xml29
-rw-r--r--indra/newview/skins/default/xui/en/widgets/toolbar.xml7
-rw-r--r--indra/newview/skins/default/xui/en/widgets/wearable_outfit_list_item.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_login_first.xml39
-rw-r--r--indra/newview/skins/default/xui/fr/panel_login_first.xml39
-rw-r--r--indra/newview/skins/default/xui/it/panel_login_first.xml39
-rw-r--r--indra/newview/skins/default/xui/ja/fonts.xml78
-rw-r--r--indra/newview/skins/default/xui/ja/panel_login_first.xml54
-rw-r--r--indra/newview/skins/default/xui/pl/panel_login_first.xml30
-rw-r--r--indra/newview/skins/default/xui/pt/panel_login_first.xml39
-rw-r--r--indra/newview/skins/default/xui/ru/panel_login_first.xml39
-rw-r--r--indra/newview/skins/default/xui/tr/panel_login_first.xml39
-rw-r--r--indra/newview/skins/default/xui/zh/panel_login_first.xml39
-rw-r--r--indra/newview/tests/llviewernetwork_test.cpp10
312 files changed, 3964 insertions, 2142 deletions
diff --git a/autobuild.xml b/autobuild.xml
index 1e315b68e5..3a2cfa0b46 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -2424,6 +2424,38 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>description</key>
<string>Viewer fonts</string>
</map>
+ <key>google-fonts</key>
+ <map>
+ <key>platforms</key>
+ <map>
+ <key>common</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>8de96fd083783b9f4df1d8d7028c8a713a7d7217</string>
+ <key>hash_algorithm</key>
+ <string>sha1</string>
+ <key>url</key>
+ <string>https://github.com/secondlife/3p-google-fonts/releases/download/v1.0.0-r6/google_fonts-1.0.0.24469773244-common-24469773244.tar.zst</string>
+ </map>
+ <key>name</key>
+ <string>common</string>
+ </map>
+ </map>
+ <key>license</key>
+ <string>SIL Open Font License, Version 1.1</string>
+ <key>license_file</key>
+ <string>LICENSES/google_inter.txt</string>
+ <key>copyright</key>
+ <string>Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter)</string>
+ <key>version</key>
+ <string>1.0.0.22606339007</string>
+ <key>name</key>
+ <string>google-fonts</string>
+ <key>description</key>
+ <string>Google fonts</string>
+ </map>
<key>viewer-manager</key>
<map>
<key>platforms</key>
diff --git a/indra/cmake/ViewerMiscLibs.cmake b/indra/cmake/ViewerMiscLibs.cmake
index f91222aa75..5974a5d212 100644
--- a/indra/cmake/ViewerMiscLibs.cmake
+++ b/indra/cmake/ViewerMiscLibs.cmake
@@ -18,4 +18,5 @@ endif()
use_prebuilt_binary(nanosvg)
use_prebuilt_binary(viewer-fonts)
+use_prebuilt_binary(google-fonts)
use_prebuilt_binary(emoji_shortcodes)
diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h
index ce09c566a9..3a855bc480 100644
--- a/indra/llcommon/llapp.h
+++ b/indra/llcommon/llapp.h
@@ -285,6 +285,7 @@ public:
#ifdef LL_WINDOWS
virtual bool reportCrashToBugsplat(void* pExcepInfo /*EXCEPTION_POINTERS*/) { return false; }
+ virtual bool reportCustomToBugsplat(const std::string& description) { return false; }
#endif
public:
diff --git a/indra/llcommon/llwatchdog.cpp b/indra/llcommon/llwatchdog.cpp
index d3242a6c96..66b565c763 100644
--- a/indra/llcommon/llwatchdog.cpp
+++ b/indra/llcommon/llwatchdog.cpp
@@ -173,6 +173,17 @@ void LLWatchdog::add(LLWatchdogEntry* e)
{
lockThread();
mSuspects.insert(e);
+
+ if (!mFrozeList.empty())
+ {
+ mFrozeList.erase(e);
+ if (mFrozeList.empty())
+ {
+ // Clear error marker file if there is no frozen threads,
+ // viewer is responsive again.
+ mClearMarkerFnc();
+ }
+ }
unlockThread();
}
@@ -180,10 +191,16 @@ void LLWatchdog::remove(LLWatchdogEntry* e)
{
lockThread();
mSuspects.erase(e);
+ mFrozeList.erase(e);
unlockThread();
}
-void LLWatchdog::init(func_t set_error_state_callback)
+void LLWatchdog::init(
+ create_marker_func_t error_state_callback,
+ clear_marker_func_t clear_marker_callback,
+ report_func_t report_callback,
+ notify_func_t notify_callback,
+ bool crash_on_freeze)
{
if (!mSuspectsAccessMutex && !mTimer)
{
@@ -196,7 +213,11 @@ void LLWatchdog::init(func_t set_error_state_callback)
// start needs to use the mSuspectsAccessMutex
mTimer->start();
}
- mCreateMarkerFnc = set_error_state_callback;
+ mCreateMarkerFnc = error_state_callback;
+ mClearMarkerFnc = clear_marker_callback;
+ mCrashReportFnc = report_callback;
+ mNotifyFnc = notify_callback;
+ mCrashOnFreeze = crash_on_freeze;
}
void LLWatchdog::cleanup()
@@ -251,21 +272,47 @@ void LLWatchdog::run()
mTimer->stop();
}
- // Sets error marker file
- mCreateMarkerFnc();
- // Todo1: Warn user?
- // Todo2: We probably want to report even if 5 seconds passed, just not error 'yet'.
std::string last_state = (*result)->getLastState();
- if (last_state.empty())
+ std::string description = "Watchdog timer for thread " + (*result)->getThreadName() + " expired";
+ if (!last_state.empty())
{
- LL_ERRS() << "Watchdog timer for thread " << (*result)->getThreadName()
- << " expired; assuming viewer is hung and crashing" << LL_ENDL;
+ description += " with state: " + last_state;
+ }
+ description += "; assuming viewer is hung and crashing";
+
+ if (!mCrashOnFreeze)
+ {
+ // Sets watchdog marker file
+ mCreateMarkerFnc(false);
+ // If it's mainloop and it somehow recovers, it will re-add itself
+ LLWatchdogEntry* froze_entry = *result;
+ mSuspects.erase(result);
+ mFrozeList.insert(froze_entry);
+ LL_WARNS() << description << LL_ENDL;
}
else
{
- LL_ERRS() << "Watchdog timer for thread " << (*result)->getThreadName()
- << " expired with state: " << last_state
- << "; assuming viewer is hung and crashing" << LL_ENDL;
+
+ if (!mCrashReportFnc(description))
+ {
+ // Sets error marker file
+ mCreateMarkerFnc(true);
+ // If false is returned, then we failed to report the issue to bugsplat,
+ // instead, Notify user, then crash viewer.
+ // Todo: ask user if viewer should quit or wait?
+ mNotifyFnc();
+ LL_ERRS() << description << LL_ENDL;
+ }
+ else
+ {
+ // Sets watchdog marker file
+ mCreateMarkerFnc(false);
+ // Already reported, don't report again.
+ // If it's mainloop and it somehow recovers, it will re-add itself
+ LLWatchdogEntry* froze_entry = *result;
+ mSuspects.erase(result);
+ mFrozeList.insert(froze_entry);
+ }
}
}
}
diff --git a/indra/llcommon/llwatchdog.h b/indra/llcommon/llwatchdog.h
index 2100a90879..f138fbccb0 100644
--- a/indra/llcommon/llwatchdog.h
+++ b/indra/llcommon/llwatchdog.h
@@ -93,8 +93,16 @@ public:
void add(LLWatchdogEntry* e);
void remove(LLWatchdogEntry* e);
- typedef std::function<void()> func_t;
- void init(func_t set_error_state_callback);
+ typedef std::function<void(bool)> create_marker_func_t;
+ typedef std::function<void()> clear_marker_func_t;
+ typedef std::function<bool(std::string&)> report_func_t;
+ typedef std::function<void()> notify_func_t;
+ void init(
+ create_marker_func_t error_state_callback,
+ clear_marker_func_t clear_marker_callback,
+ report_func_t report_callback,
+ notify_func_t notify_callback,
+ bool crash_on_freeze);
void run();
void cleanup();
@@ -105,14 +113,19 @@ private:
typedef std::set<LLWatchdogEntry*> SuspectsRegistry;
SuspectsRegistry mSuspects;
+ SuspectsRegistry mFrozeList;
LLMutex* mSuspectsAccessMutex;
LLWatchdogTimerThread* mTimer;
U64 mLastClockCount;
+ bool mCrashOnFreeze;
// At the moment watchdog expects app to set markers in mCreateMarkerFnc,
// but technically can be used to set any error states or do some cleanup
// or show warnings.
- func_t mCreateMarkerFnc;
+ create_marker_func_t mCreateMarkerFnc;
+ clear_marker_func_t mClearMarkerFnc;
+ report_func_t mCrashReportFnc;
+ notify_func_t mNotifyFnc;
};
#endif // LL_LLTHREADWATCHDOG_H
diff --git a/indra/llmath/v3math.h b/indra/llmath/v3math.h
index 0e11dca876..196ecdcf7d 100644
--- a/indra/llmath/v3math.h
+++ b/indra/llmath/v3math.h
@@ -155,7 +155,6 @@ class LLVector3
friend const LLVector3& operator*=(LLVector3 &a, const LLVector3 &b); // Returns a * b;
friend const LLVector3& operator*=(LLVector3 &a, F32 k); // Return a times scaler k
friend const LLVector3& operator/=(LLVector3 &a, F32 k); // Return a divided by scaler k
- friend const LLVector3& operator/=(LLVector3& a, const LLVector3& b);
friend const LLVector3& operator*=(LLVector3 &a, const LLQuaternion &b); // Returns a * b;
friend LLVector3 operator-(const LLVector3 &a); // Return vector -a
@@ -461,14 +460,6 @@ inline const LLVector3& operator/=(LLVector3& a, F32 k)
return a;
}
-inline const LLVector3& operator/=(LLVector3& a, const LLVector3& b)
-{
- a.mV[VX] /= b.mV[VX];
- a.mV[VY] /= b.mV[VY];
- a.mV[VZ] /= b.mV[VZ];
- return a;
-}
-
inline LLVector3 operator-(const LLVector3& a)
{
return LLVector3(-a.mV[VX], -a.mV[VY], -a.mV[VZ]);
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index 88d428c233..4e80f4c0ca 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -1642,3 +1642,15 @@ void LLPluginClassMedia::initializeUrlHistory(const LLSD& url_history)
LL_DEBUGS("Plugin") << "Sending history" << LL_ENDL;
}
+
+void LLPluginClassMedia::forceRenderRefresh()
+{
+ // Force layout recalculation by briefly hiding/showing the web content
+ // Used to clear black screen issues after resize, see #5607
+ const std::string refresh_script =
+ "document.documentElement.style.visibility='hidden';"
+ "document.documentElement.offsetHeight;"
+ "document.documentElement.style.visibility='';";
+
+ executeJavaScript(refresh_script);
+}
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index 71522bcd7d..40f6295e55 100644
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -350,6 +350,8 @@ public:
std::shared_ptr<LLPluginClassMedia> getSharedPtr() { return std::dynamic_pointer_cast<LLPluginClassMedia>(shared_from_this()); } // due to enable_shared_from_this
+ void forceRenderRefresh();
+
protected:
LLPluginClassMediaOwner *mOwner;
diff --git a/indra/llprimitive/llgltfmaterial.cpp b/indra/llprimitive/llgltfmaterial.cpp
index 1c47001272..764ab222ad 100644
--- a/indra/llprimitive/llgltfmaterial.cpp
+++ b/indra/llprimitive/llgltfmaterial.cpp
@@ -937,6 +937,15 @@ void LLGLTFMaterial::updateTextureTracking()
// Case 4.
// Input: scale 1.0,1.0; Offset horizontal 0.5, Offset vertical 0.0 Rotation 0.349066;
// Expected output: scale 1.0,1.0; Offset horizontal 0.701, Offset vertical -0.141 Rotation -0.349066;
+// Case 5.
+// Input: scale 10.0,15.0; Offset horizontal 0.0, Offset vertical 0.0 Rotation -1.57079637
+// Expected output: scale 15.0,10.0; Offset horizontal 7.5, Offset vertical -4.0 Rotation 1.57079637;
+// Case 6.
+// Input: scale 10.0,15.0; Offset horizontal 0.0, Offset vertical 0.0 Rotation 0
+// Expected output: scale 10.0,15.0; Offset horizontal 0.5, Offset vertical .0 Rotation 0;
+// Case 7.
+// Input: scale 10.0,15.0; Offset horizontal 0.0, Offset vertical 0.0 Rotation -0.785398163
+// Expected output: scale 12.74,12.74; Offset horizontal 0.5, Offset vertical .0 Rotation 0.785398163;
//
// Legacy offsets are right to left and top to bottom.
// PBR offsets are right to left and bottom to top.
@@ -953,16 +962,32 @@ void LLGLTFMaterial::convertTextureTransformToPBR(
LLVector2& pbr_offset,
F32& pbr_rotation)
{
- pbr_scale.set(tex_scale_s, tex_scale_t);
+ // Legacy is counter-clockwise, PBR is clockwise
pbr_rotation = -tex_rotation;
// Center of the tile
const F32 center_s = 0.5f;
const F32 center_t = 0.5f;
+ // Calculate the rotated scale
+ F32 cos_rot = cosf(tex_rotation);
+ F32 sin_rot = sinf(tex_rotation);
+ F32 cos_sq = cos_rot * cos_rot;
+ F32 sin_sq = sin_rot * sin_rot;
+
+ // GLTF scale doesn't match legacy scaling when rotation is applied.
+ // Legacy applies scale then rotation, which allows for planar aligment
+ // withoutn deformations, but gltf rotates first, so when scale gets
+ // aplied image gets deformed by rotation.
+ // It appears to be imposible to properly match legacy scale, so this
+ // is an approximation that at least matches at 0, 90, 180, 270 degree
+ // rotations, and is close enough at angles like 45.
+ pbr_scale.mV[VX] = tex_scale_s * cos_sq + tex_scale_t * sin_sq;
+ pbr_scale.mV[VY] = tex_scale_s * sin_sq + tex_scale_t * cos_sq;
+
// Center adjustment for scale
- F32 center_adjust_s = 0.5f * (1.0f - tex_scale_s);
- F32 center_adjust_t = 0.5f * (1.0f - tex_scale_t);
+ F32 center_adjust_s = 0.5f * (1.0f - pbr_scale.mV[VX]);
+ F32 center_adjust_t = 0.5f * (1.0f - pbr_scale.mV[VY]);
// 2. Offset from center
F32 pos_s = center_adjust_s - center_s;
@@ -990,17 +1015,43 @@ void LLGLTFMaterial::convertPBRTransformToTexture(
F32& tex_offset_t,
F32& tex_rotation)
{
- tex_scale_s = pbr_scale.mV[0];
- tex_scale_t = pbr_scale.mV[1];
tex_rotation = -pbr_rotation;
+ // Reverse the scale transformation
+ // From: pbr_s = tex_s * cos² + tex_t * sin²
+ // pbr_t = tex_s * sin² + tex_t * cos²
+ // Solve for tex_s and tex_t
+ F32 cos_rot = cosf(tex_rotation);
+ F32 sin_rot = sinf(tex_rotation);
+ F32 cos_sq = cos_rot * cos_rot;
+ F32 sin_sq = sin_rot * sin_rot;
+
+ F32 denom = cos_sq * cos_sq - sin_sq * sin_sq;
+
+ if (fabsf(denom) < 0.0001f) // Near 45 degrees (cos²≈sin²≈0.5)
+ {
+ // At 45°: both scales contribute equally
+ // pbr_s = pbr_t = (tex_s + tex_t) / 2
+ // So: tex_s + tex_t = 2 * pbr_avg
+ // Use the average and assume symmetric scaling
+ tex_scale_s = tex_scale_t = (pbr_scale.mV[VX] + pbr_scale.mV[VY]) / 2.f;
+ }
+ else
+ {
+ // Solve the 2x2 system:
+ // pbr_s * cos² - pbr_t * sin² = tex_s * (cos⁴ - sin⁴)
+ // pbr_t * cos² - pbr_s * sin² = tex_t * (cos⁴ - sin⁴)
+ tex_scale_s = (pbr_scale.mV[VX] * cos_sq - pbr_scale.mV[VY] * sin_sq) / denom;
+ tex_scale_t = (pbr_scale.mV[VY] * cos_sq - pbr_scale.mV[VX] * sin_sq) / denom;
+ }
+
// Center of the tile
const F32 center_s = 0.5f;
const F32 center_t = 0.5f;
// Center adjustment for scale
- F32 center_adjust_s = 0.5f * (1.0f - tex_scale_s);
- F32 center_adjust_t = 0.5f * (1.0f - tex_scale_t);
+ F32 center_adjust_s = 0.5f * (1.0f - pbr_scale.mV[VX]);
+ F32 center_adjust_t = 0.5f * (1.0f - pbr_scale.mV[VY]);
// 2. Offset from center
F32 pos_s = center_adjust_s - center_s;
diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp
index d9857a7ad5..075c496ec5 100644
--- a/indra/llrender/llfontfreetype.cpp
+++ b/indra/llrender/llfontfreetype.cpp
@@ -39,6 +39,7 @@
// For some reason, this won't work if it's not wrapped in the ifdef
#ifdef FT_FREETYPE_H
#include FT_FREETYPE_H
+#include FT_MULTIPLE_MASTERS_H
#endif
#include "lldir.h"
@@ -116,6 +117,8 @@ LLFontGlyphInfo::LLFontGlyphInfo(U32 index, EFontGlyphType glyph_type)
mYBitmapOffset(0), // Offset to the origin in the bitmap
mXBearing(0), // Distance from baseline to left in pixels
mYBearing(0), // Distance from baseline to top in pixels
+ mLsbDelta(0),
+ mRsbDelta(0),
mBitmapEntry(std::make_pair(EFontGlyphType::Unspecified, -1)) // Which bitmap in the bitmap cache contains this glyph
{
}
@@ -131,6 +134,8 @@ LLFontGlyphInfo::LLFontGlyphInfo(const LLFontGlyphInfo& fgi)
, mYBitmapOffset(fgi.mYBitmapOffset)
, mXBearing(fgi.mXBearing)
, mYBearing(fgi.mYBearing)
+ , mLsbDelta(fgi.mLsbDelta)
+ , mRsbDelta(fgi.mRsbDelta)
{
mBitmapEntry = fgi.mBitmapEntry;
}
@@ -141,6 +146,7 @@ LLFontFreetype::LLFontFreetype()
mDescender(0.f),
mLineHeight(0.f),
mIsFallback(false),
+ mHinting(EFontHinting::FORCE_AUTOHINT),
mFTFace(nullptr),
mRenderGlyphCount(0),
mStyle(0),
@@ -164,7 +170,7 @@ LLFontFreetype::~LLFontFreetype()
// mFallbackFonts cleaned up by LLPointer destructor
}
-bool LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, bool is_fallback, S32 face_n)
+bool LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, S32 weight, bool is_fallback, S32 face_n, EFontHinting hinting, S32 flags)
{
// Don't leak face objects. This is also needed to deal with
// changed font file names.
@@ -188,6 +194,20 @@ bool LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 v
return false;
mIsFallback = is_fallback;
+ mHinting = hinting;
+ mFontFlags = flags;
+ mWeight = weight;
+
+ bool variable_font = false;
+ if (weight >= 0)
+ {
+ variable_font = setVariationAxis("wght", static_cast<F32>(weight));
+
+ // For Inter, also set optical size based on point size
+ // This makes text look better at different sizes
+ setVariationAxis("opsz", point_size);
+ }
+
F32 pixels_per_em = (point_size / 72.f)*vert_dpi; // Size in inches * dpi
error = FT_Set_Char_Size(mFTFace, /* handle to face object */
@@ -243,6 +263,18 @@ bool LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 v
{
mStyle |= LLFontGL::BOLD;
}
+ else if (flags & LLFontGL::BOLD)
+ {
+ // FontGL applies programmatic bolding to fonts that are a part of 'bold' descriptor but don't have the bold style set.
+ // Ex: Inter SemiBold doesn't have FT_STYLE_FLAG_BOLD and without this style it would be bolded programmatically.
+ mStyle |= LLFontGL::BOLD;
+ }
+ else if (weight >= 600 && variable_font)
+ {
+ // If the font is heavy enough, consider it bold and avoid programmatic bolding
+ // even if it doesn't have the bold style set.
+ mStyle |= LLFontGL::BOLD;
+ }
if(mFTFace->style_flags & FT_STYLE_FLAG_ITALIC)
{
@@ -341,16 +373,10 @@ F32 LLFontFreetype::getXKerning(llwchar char_left, llwchar char_right) const
//llassert(!mIsFallback);
LLFontGlyphInfo* left_glyph_info = getGlyphInfo(char_left, EFontGlyphType::Unspecified);;
- U32 left_glyph = left_glyph_info ? left_glyph_info->mGlyphIndex : 0;
// Kern this puppy.
LLFontGlyphInfo* right_glyph_info = getGlyphInfo(char_right, EFontGlyphType::Unspecified);
- U32 right_glyph = right_glyph_info ? right_glyph_info->mGlyphIndex : 0;
- FT_Vector delta;
-
- llverify(!FT_Get_Kerning(mFTFace, left_glyph, right_glyph, ft_kerning_unfitted, &delta));
-
- return delta.x*(1.f/64.f);
+ return getXKerning(left_glyph_info, right_glyph_info);
}
F32 LLFontFreetype::getXKerning(const LLFontGlyphInfo* left_glyph_info, const LLFontGlyphInfo* right_glyph_info) const
@@ -363,9 +389,28 @@ F32 LLFontFreetype::getXKerning(const LLFontGlyphInfo* left_glyph_info, const LL
FT_Vector delta;
- llverify(!FT_Get_Kerning(mFTFace, left_glyph, right_glyph, ft_kerning_unfitted, &delta));
+ llverify(!FT_Get_Kerning(mFTFace, left_glyph, right_glyph, FT_KERNING_UNFITTED, &delta));
- return delta.x*(1.f/64.f);
+ // Apply the FreeType auto-hinter's subpixel side-bearing correction between
+ // adjacent glyphs. When the hinter has shifted the right side of the left
+ // glyph or the left side of the right glyph, (rsb_delta - lsb_delta) is the
+ // sub-pixel nudge that keeps spacing visually even.
+ F32 delta_correction = 0.0f;
+ if (left_glyph_info && right_glyph_info)
+ {
+ // According to FreeType docs, these delta values should only trigger
+ // discrete ±1 pixel adjustments when they cross certain thresholds.
+ // Substructing delta_diff from delta.x doesn't work as well as treating
+ // it as a thresholds
+ S32 delta_diff = left_glyph_info->mRsbDelta - right_glyph_info->mLsbDelta;
+ if (delta_diff > 32)
+ delta_correction = -1.0f;
+ else if (delta_diff < -31)
+ delta_correction = 1.0f;
+ }
+
+ // ft_kerning_unfitted mode always returns 26.6 fixed-point values
+ return (F32)(delta.x * (1.f / 64.f)) + delta_correction;
}
bool LLFontFreetype::hasGlyph(llwchar wch) const
@@ -510,6 +555,11 @@ LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, l
gi->mHeight = height;
gi->mXBearing = fontp->mFTFace->glyph->bitmap_left;
gi->mYBearing = fontp->mFTFace->glyph->bitmap_top;
+ // FreeType fills these when the glyph has been auto-hinted; they describe how
+ // much the hinter nudged the left/right side bearings (in 26.6 pixels). Keep
+ // them so inter-glyph spacing can be corrected in getXKerning().
+ gi->mLsbDelta = (S32)fontp->mFTFace->glyph->lsb_delta;
+ gi->mRsbDelta = (S32)fontp->mFTFace->glyph->rsb_delta;
// Convert these from 26.6 units to float pixels.
gi->mXAdvance = fontp->mFTFace->glyph->advance.x / 64.f;
gi->mYAdvance = fontp->mFTFace->glyph->advance.y / 64.f;
@@ -635,7 +685,7 @@ void LLFontFreetype::renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index, ll
if (mFTFace == nullptr)
return;
- FT_Int32 load_flags = FT_LOAD_FORCE_AUTOHINT;
+ FT_Int32 load_flags = (FT_Int32)mHinting;
if (EFontGlyphType::Color == bitmap_type)
{
// We may not actually get a color render so our caller should always examine mFTFace->glyph->bitmap.pixel_mode
@@ -678,7 +728,7 @@ void LLFontFreetype::renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index, ll
void LLFontFreetype::reset(F32 vert_dpi, F32 horz_dpi)
{
resetBitmapCache();
- loadFace(mName, mPointSize, vert_dpi ,horz_dpi, mIsFallback, 0);
+ loadFace(mName, mPointSize, vert_dpi ,horz_dpi, mWeight, mIsFallback, 0, mHinting, mFontFlags);
if (!mIsFallback)
{
// This is the head of the list - need to rebuild ourself and all fallbacks.
@@ -846,6 +896,73 @@ void LLFontFreetype::setSubImageLuminanceAlpha(U32 x, U32 y, U32 bitmap_num, U32
}
}
+bool LLFontFreetype::setVariationAxis(const std::string& axis_tag, F32 value)
+{
+ if (!mFTFace)
+ return false;
+
+ // Check if this is a variable font
+ FT_MM_Var* master = nullptr;
+ if (FT_Get_MM_Var(mFTFace, &master) != 0)
+ {
+ // Not a variable font - this is not an error, just silently skip
+ return false;
+ }
+
+ // Find the axis by tag (e.g., "wght" for weight)
+ FT_UInt axis_index = 0;
+ bool found = false;
+ for (FT_UInt i = 0; i < master->num_axis; i++)
+ {
+ // Compare the 4-byte tag
+ if (master->axis[i].tag == FT_MAKE_TAG(axis_tag[0], axis_tag[1], axis_tag[2], axis_tag[3]))
+ {
+ axis_index = i;
+ found = true;
+
+ // Clamp value to valid range for this axis
+ F32 min_val = master->axis[i].minimum / 65536.0f;
+ F32 max_val = master->axis[i].maximum / 65536.0f;
+ value = llclamp(value, min_val, max_val);
+
+ break;
+ }
+ }
+
+ if (!found)
+ {
+ FT_Done_MM_Var(gFTLibrary, master);
+ LL_WARNS_ONCE("Font") << "Axis '" << axis_tag << "' not found in font: " << mName << LL_ENDL;
+ return false;
+ }
+
+ FT_UInt num_coords = master->num_axis;
+ FT_Fixed* coords = new FT_Fixed[num_coords];
+
+ // Get current coordinates
+ FT_Get_Var_Design_Coordinates(mFTFace, num_coords, coords);
+
+ // Update the specific axis
+ coords[axis_index] = (FT_Fixed)(value * 65536.0f);
+
+ // Set all coordinates
+ int error = FT_Set_Var_Design_Coordinates(mFTFace, num_coords, coords);
+
+ delete[] coords;
+ FT_Done_MM_Var(gFTLibrary, master);
+
+ if (error != 0)
+ {
+ LL_WARNS() << "Failed to set variation coordinates for " << axis_tag
+ << " = " << value << " in font: " << mName << LL_ENDL;
+ return false;
+ }
+
+ LL_DEBUGS("Font") << "Set " << axis_tag << " = " << value
+ << " for font: " << mName << LL_ENDL;
+ return true;
+}
+
namespace ll
{
diff --git a/indra/llrender/llfontfreetype.h b/indra/llrender/llfontfreetype.h
index f7600e40a3..d2164e8fa2 100644
--- a/indra/llrender/llfontfreetype.h
+++ b/indra/llrender/llfontfreetype.h
@@ -43,6 +43,7 @@ struct FT_FaceRec_;
typedef struct FT_FaceRec_* LLFT_Face;
struct FT_StreamRec_;
typedef struct FT_StreamRec_ LLFT_Stream;
+enum class EFontHinting : S32;
namespace ll
{
@@ -87,6 +88,8 @@ struct LLFontGlyphInfo
S32 mYBitmapOffset; // Offset to the origin in the bitmap
S32 mXBearing; // Distance from baseline to left in pixels
S32 mYBearing; // Distance from baseline to top in pixels
+ S32 mLsbDelta; // FreeType subpixel left side bearing delta (26.6 units)
+ S32 mRsbDelta; // FreeType subpixel right side bearing delta (26.6 units)
std::pair<EFontGlyphType, S32> mBitmapEntry; // Which bitmap in the bitmap cache contains this glyph
};
@@ -100,7 +103,7 @@ public:
// is_fallback should be true for fallback fonts that aren't used
// to render directly (Unicode backup, primarily)
- bool loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, bool is_fallback, S32 face_n);
+ bool loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, S32 weight, bool is_fallback, S32 face_n, EFontHinting hinting, S32 flags);
S32 getNumFaces(const std::string& filename);
@@ -162,9 +165,14 @@ private:
void resetBitmapCache();
void setSubImageLuminanceAlpha(U32 x, U32 y, U32 bitmap_num, U32 width, U32 height, U8 *data, S32 stride = 0) const;
bool setSubImageBGRA(U32 x, U32 y, U32 bitmap_num, U16 width, U16 height, const U8* data, U32 stride) const;
+ bool setVariationAxis(const std::string& axis_tag, F32 value);
bool hasGlyph(llwchar wch) const; // Has a glyph for this character
LLFontGlyphInfo* addGlyph(llwchar wch, EFontGlyphType glyph_type) const; // Add a new character to the font if necessary
- LLFontGlyphInfo* addGlyphFromFont(const LLFontFreetype *fontp, llwchar wch, U32 glyph_index, EFontGlyphType bitmap_type) const; // Add a glyph from this font to the other (returns the glyph_index, 0 if not found)
+ LLFontGlyphInfo* addGlyphFromFont(
+ const LLFontFreetype *fontp,
+ llwchar wch,
+ U32 glyph_index,
+ EFontGlyphType bitmap_type) const; // Add a glyph from this font to the other (returns the glyph_index, 0 if not found)
void renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index, llwchar wch) const;
void insertGlyphInfo(llwchar wch, LLFontGlyphInfo* gi) const;
@@ -180,6 +188,9 @@ private:
LLFT_Face mFTFace;
bool mIsFallback;
+ EFontHinting mHinting;
+ S32 mFontFlags;
+ S32 mWeight = -1;
typedef std::pair<LLPointer<LLFontFreetype>, char_functor_t> fallback_font_t;
typedef std::vector<fallback_font_t> fallback_font_vector_t;
fallback_font_vector_t mFallbackFonts; // A list of fallback fonts to look for glyphs in (for Unicode chars)
diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp
index 16eec1fdd2..5d99c35047 100644
--- a/indra/llrender/llfontgl.cpp
+++ b/indra/llrender/llfontgl.cpp
@@ -90,14 +90,14 @@ void LLFontGL::destroyGL()
mFontFreetype->destroyGL();
}
-bool LLFontGL::loadFace(const std::string& filename, F32 point_size, const F32 vert_dpi, const F32 horz_dpi, bool is_fallback, S32 face_n)
+bool LLFontGL::loadFace(const std::string& filename, F32 point_size, const F32 vert_dpi, const F32 horz_dpi, S32 weight, bool is_fallback, S32 face_n, EFontHinting hinting, S32 flags)
{
if(mFontFreetype == reinterpret_cast<LLFontFreetype*>(NULL))
{
mFontFreetype = new LLFontFreetype;
}
- return mFontFreetype->loadFace(filename, point_size, vert_dpi, horz_dpi, is_fallback, face_n);
+ return mFontFreetype->loadFace(filename, point_size, vert_dpi, horz_dpi, weight, is_fallback, face_n, hinting, flags);
}
S32 LLFontGL::getNumFaces(const std::string& filename)
@@ -1115,7 +1115,14 @@ LLFontGL* LLFontGL::getFontSansSerifSmallItalic()
//static
LLFontGL* LLFontGL::getFontSansSerif()
{
- static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif","Medium",0));
+ static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif","Small",0));
+ return fontp;
+}
+
+// static
+LLFontGL* LLFontGL::getFontSansSerifMedium()
+{
+ static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif", "Medium", 0));
return fontp;
}
diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h
index 1c8e036f58..3b82d8e43d 100644
--- a/indra/llrender/llfontgl.h
+++ b/indra/llrender/llfontgl.h
@@ -87,7 +87,7 @@ public:
void destroyGL();
- bool loadFace(const std::string& filename, F32 point_size, const F32 vert_dpi, const F32 horz_dpi, bool is_fallback, S32 face_n);
+ bool loadFace(const std::string& filename, F32 point_size, const F32 vert_dpi, const F32 horz_dpi, S32 weight, bool is_fallback, S32 face_n, EFontHinting hinting, S32 flags);
S32 getNumFaces(const std::string& filename);
S32 getCacheGeneration() const;
@@ -204,6 +204,7 @@ public:
static LLFontGL* getFontSansSerifSmallBold();
static LLFontGL* getFontSansSerifSmallItalic();
static LLFontGL* getFontSansSerif();
+ static LLFontGL* getFontSansSerifMedium();
static LLFontGL* getFontSansSerifBig();
static LLFontGL* getFontSansSerifHuge();
static LLFontGL* getFontSansSerifBold();
diff --git a/indra/llrender/llfontregistry.cpp b/indra/llrender/llfontregistry.cpp
index c48a389f6a..890308ab54 100644
--- a/indra/llrender/llfontregistry.cpp
+++ b/indra/llrender/llfontregistry.cpp
@@ -170,7 +170,7 @@ LLFontDescriptor LLFontDescriptor::normalize() const
if (new_size != s_template_string && new_size.empty() && findSubString(new_name,"Monospace"))
new_size = "Monospace";
if (new_size.empty())
- new_size = "Medium";
+ new_size = "Small";
if (removeSubString(new_name,"Bold"))
new_style |= LLFontGL::BOLD;
@@ -181,16 +181,16 @@ LLFontDescriptor LLFontDescriptor::normalize() const
return LLFontDescriptor(new_name,new_size,new_style, getFontFiles(), getFontCollectionFiles());
}
-void LLFontDescriptor::addFontFile(const std::string& file_name, const std::string& char_functor)
+void LLFontDescriptor::addFontFile(const std::string& file_name, EFontHinting hinting, S32 flags, F32 size_delta, S32 weight, const std::string& char_functor)
{
char_functor_map_t::const_iterator it = mCharFunctors.find(char_functor);
- mFontFiles.push_back(LLFontFileInfo(file_name, (mCharFunctors.end() != it) ? it->second : nullptr));
+ mFontFiles.push_back(LLFontFileInfo(file_name, hinting, flags, size_delta, weight, (mCharFunctors.end() != it) ? it->second : nullptr));
}
-void LLFontDescriptor::addFontCollectionFile(const std::string& file_name, const std::string& char_functor)
+void LLFontDescriptor::addFontCollectionFile(const std::string& file_name, EFontHinting hinting, S32 flags, F32 size_delta, S32 weight, const std::string& char_functor)
{
char_functor_map_t::const_iterator it = mCharFunctors.find(char_functor);
- mFontCollectionFiles.push_back(LLFontFileInfo(file_name, (mCharFunctors.end() != it) ? it->second : nullptr));
+ mFontCollectionFiles.push_back(LLFontFileInfo(file_name, hinting, flags, size_delta, weight, (mCharFunctors.end() != it) ? it->second : nullptr));
}
LLFontRegistry::LLFontRegistry(bool create_gl_textures)
@@ -289,23 +289,69 @@ bool font_desc_init_from_xml(LLXMLNodePtr node, LLFontDescriptor& desc)
{
std::string font_file_name = child->getTextContents();
std::string char_functor;
+ EFontHinting hinting = EFontHinting::FORCE_AUTOHINT;
+ S32 flags = 0;
+ S32 weight = -1;
if (child->hasAttribute("functor"))
{
child->getAttributeString("functor", char_functor);
}
+ if (child->hasAttribute("font_hinting"))
+ {
+ std::string attr_hinting;
+ child->getAttributeString("font_hinting", attr_hinting);
+ LLStringUtil::toLower(attr_hinting);
+
+ if (attr_hinting == "default")
+ {
+ hinting = EFontHinting::DEFAULT;
+ }
+ else if (attr_hinting == "force_auto")
+ {
+ hinting = EFontHinting::FORCE_AUTOHINT;
+ }
+ else if (attr_hinting == "no_hinting")
+ {
+ hinting = EFontHinting::NO_HINTING;
+ }
+ }
+
+ if (child->hasAttribute("flags"))
+ {
+ std::string attr_flags;
+ child->getAttributeString("flags", attr_flags);
+ LLStringUtil::toLower(attr_flags);
+
+ if (attr_flags == "bold")
+ {
+ flags |= LLFontGL::BOLD;
+ }
+ }
+
+ F32 size_delta = 0.f;
+ if (child->hasAttribute("size_delta"))
+ {
+ child->getAttributeF32("size_delta", size_delta);
+ }
+
+ if (child->hasAttribute("font_weight"))
+ {
+ child->getAttributeS32("font_weight", weight);
+ }
+
if (child->hasAttribute("load_collection"))
{
bool col = false;
child->getAttributeBOOL("load_collection", col);
if (col)
{
- desc.addFontCollectionFile(font_file_name, char_functor);
+ desc.addFontCollectionFile(font_file_name, hinting, flags, size_delta, weight, char_functor);
}
}
- desc.addFontFile(font_file_name, char_functor);
+ desc.addFontFile(font_file_name, hinting, flags, size_delta, weight, char_functor);
}
else if (child->hasName("os"))
{
@@ -462,7 +508,7 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc)
// Add ultimate fallback list - generated dynamically on linux,
// null elsewhere.
std::transform(getUltimateFallbackList().begin(), getUltimateFallbackList().end(), std::back_inserter(font_files),
- [](const std::string& file_name) { return LLFontFileInfo(file_name); });
+ [](const std::string& file_name) { return LLFontFileInfo(file_name, EFontHinting::FORCE_AUTOHINT, 0, 0.f, -1); });
// Load fonts based on names.
if (font_files.empty())
@@ -517,8 +563,8 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc)
{
fontp = new LLFontGL;
}
- if (fontp->loadFace(font_path, point_size_scale,
- LLFontGL::sVertDPI, LLFontGL::sHorizDPI, is_fallback, i))
+ if (fontp->loadFace(font_path, point_size_scale + font_file_it->mSizeDelta,
+ LLFontGL::sVertDPI, LLFontGL::sHorizDPI, font_file_it->mWeight, is_fallback, i, font_file_it->mHinting, font_file_it->mFlags))
{
is_font_loaded = true;
if (is_first_found)
diff --git a/indra/llrender/llfontregistry.h b/indra/llrender/llfontregistry.h
index 8bbf5aa30c..fcbb2667e4 100644
--- a/indra/llrender/llfontregistry.h
+++ b/indra/llrender/llfontregistry.h
@@ -34,22 +34,45 @@ class LLFontGL;
typedef std::vector<std::string> string_vec_t;
+enum class EFontHinting : S32
+{
+ DEFAULT = 0,
+ NO_HINTING = 0x8000U,
+ FORCE_AUTOHINT = 0x20,
+};
+
struct LLFontFileInfo
{
- LLFontFileInfo(const std::string& file_name, const std::function<bool(llwchar)>& char_functor = nullptr)
+ LLFontFileInfo(const std::string& file_name, EFontHinting hinting, S32 flags, F32 size_delta, S32 weight, const std::function<bool(llwchar)>& char_functor = nullptr)
: FileName(file_name)
, CharFunctor(char_functor)
+ , mHinting(hinting)
+ , mFlags(flags)
+ , mSizeDelta(size_delta)
+ , mWeight(weight)
{
}
- LLFontFileInfo(const LLFontFileInfo& ffi)
+ LLFontFileInfo(const LLFontFileInfo& ffi, EFontHinting hinting, S32 flags, F32 size_delta, S32 weight)
: FileName(ffi.FileName)
, CharFunctor(ffi.CharFunctor)
+ , mHinting(hinting)
+ , mFlags(flags)
+ , mSizeDelta(size_delta)
+ , mWeight(weight)
{
}
std::string FileName;
std::function<bool(llwchar)> CharFunctor;
+ EFontHinting mHinting;
+ S32 mFlags;
+ S32 mWeight; // -1 - default, whatever is in the file.
+
+ // Not all fonts are the same size, Ex: dejavu is bigger than inter,
+ // so in some cases we want to adjust relative sizes to make characters
+ // from different files match.
+ F32 mSizeDelta;
};
typedef std::vector<LLFontFileInfo> font_file_info_vec_t;
@@ -71,10 +94,10 @@ public:
const std::string& getSize() const { return mSize; }
void setSize(const std::string& size) { mSize = size; }
- void addFontFile(const std::string& file_name, const std::string& char_functor = LLStringUtil::null);
+ void addFontFile(const std::string& file_name, EFontHinting hinting, S32 flags, F32 size_delta, S32 weight, const std::string& char_functor = LLStringUtil::null);
const font_file_info_vec_t & getFontFiles() const { return mFontFiles; }
void setFontFiles(const font_file_info_vec_t& font_files) { mFontFiles = font_files; }
- void addFontCollectionFile(const std::string& file_name, const std::string& char_functor = LLStringUtil::null);
+ void addFontCollectionFile(const std::string& file_name, EFontHinting hinting, S32 flags, F32 size_delta, S32 weight, const std::string& char_functor = LLStringUtil::null);
const font_file_info_vec_t& getFontCollectionFiles() const { return mFontCollectionFiles; }
void setFontCollectionFiles(const font_file_info_vec_t& font_collection_files) { mFontCollectionFiles = font_collection_files; }
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 1a3a499b20..57be8570af 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -1774,64 +1774,25 @@ void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z)
return;
}
- LLVector4a vert(x, y, z);
- transform(vert);
- mVerticesp[mCount] = vert;
-
- mCount++;
- mVerticesp[mCount] = mVerticesp[mCount-1];
- mColorsp[mCount] = mColorsp[mCount-1];
- mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
-}
-
-void LLRender::transform(LLVector3& vert)
-{
- if (!mUIOffset.empty())
+ if (mUIOffset.empty())
{
- vert += LLVector3(mUIOffset.back().getF32ptr());
- vert *= LLVector3(mUIScale.back().getF32ptr());
+ mVerticesp[mCount].set(x,y,z);
}
-}
-
-void LLRender::transform(LLVector4a& vert)
-{
- if (!mUIOffset.empty())
+ else
{
+ LLVector4a vert(x, y, z);
vert.add(mUIOffset.back());
vert.mul(mUIScale.back());
+ mVerticesp[mCount] = vert;
}
-}
-
-void LLRender::untransform(LLVector3& vert)
-{
- if (!mUIOffset.empty())
- {
- vert /= LLVector3(mUIScale.back().getF32ptr());
- vert -= LLVector3(mUIOffset.back().getF32ptr());
- }
-}
-
-void LLRender::batchTransform(LLVector4a* verts, U32 vert_count)
-{
- if (!mUIOffset.empty())
- {
- const LLVector4a& offset = mUIOffset.back();
- const LLVector4a& scale = mUIScale.back();
-
- for (U32 i = 0; i < vert_count; ++i)
- {
- verts[i].add(offset);
- verts[i].mul(scale);
- }
- }
-}
-void LLRender::vertexBatchPreTransformed(const std::vector<LLVector4a>& verts)
-{
- vertexBatchPreTransformed(verts.data(), narrow(verts.size()));
+ mCount++;
+ mVerticesp[mCount] = mVerticesp[mCount-1];
+ mColorsp[mCount] = mColorsp[mCount-1];
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
}
-void LLRender::vertexBatchPreTransformed(const LLVector4a* verts, S32 vert_count)
+void LLRender::vertexBatchPreTransformed(LLVector4a* verts, S32 vert_count)
{
if (mCount + vert_count > 4094)
{
@@ -1852,7 +1813,7 @@ void LLRender::vertexBatchPreTransformed(const LLVector4a* verts, S32 vert_count
mVerticesp[mCount] = mVerticesp[mCount-1];
}
-void LLRender::vertexBatchPreTransformed(const LLVector4a* verts, const LLVector2* uvs, S32 vert_count)
+void LLRender::vertexBatchPreTransformed(LLVector4a* verts, LLVector2* uvs, S32 vert_count)
{
if (mCount + vert_count > 4094)
{
@@ -1876,7 +1837,7 @@ void LLRender::vertexBatchPreTransformed(const LLVector4a* verts, const LLVector
}
}
-void LLRender::vertexBatchPreTransformed(const LLVector4a* verts, const LLVector2* uvs, const LLColor4U* colors, S32 vert_count)
+void LLRender::vertexBatchPreTransformed(LLVector4a* verts, LLVector2* uvs, LLColor4U* colors, S32 vert_count)
{
if (mCount + vert_count > 4094)
{
diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h
index be8539433c..0801c12fb4 100644
--- a/indra/llrender/llrender.h
+++ b/indra/llrender/llrender.h
@@ -450,16 +450,9 @@ public:
void diffuseColor4ubv(const U8* c);
void diffuseColor4ub(U8 r, U8 g, U8 b, U8 a);
- void transform(LLVector3& vert);
- void transform(LLVector4a& vert);
- void untransform(LLVector3& vert);
-
- void batchTransform(LLVector4a* verts, U32 vert_count);
-
- void vertexBatchPreTransformed(const std::vector<LLVector4a>& verts);
- void vertexBatchPreTransformed(const LLVector4a* verts, S32 vert_count);
- void vertexBatchPreTransformed(const LLVector4a* verts, const LLVector2* uvs, S32 vert_count);
- void vertexBatchPreTransformed(const LLVector4a* verts, const LLVector2* uvs, const LLColor4U*, S32 vert_count);
+ void vertexBatchPreTransformed(LLVector4a* verts, S32 vert_count);
+ void vertexBatchPreTransformed(LLVector4a* verts, LLVector2* uvs, S32 vert_count);
+ void vertexBatchPreTransformed(LLVector4a* verts, LLVector2* uvs, LLColor4U*, S32 vert_count);
void setColorMask(bool writeColor, bool writeAlpha);
void setColorMask(bool writeColorR, bool writeColorG, bool writeColorB, bool writeAlpha);
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
index 828bfb289b..fa9de1eb09 100644
--- a/indra/llui/llaccordionctrltab.cpp
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -39,7 +39,7 @@ static const std::string DD_BUTTON_NAME = "dd_button";
static const std::string DD_TEXTBOX_NAME = "dd_textbox";
static const std::string DD_HEADER_NAME = "dd_header";
-static const S32 HEADER_HEIGHT = 23;
+static const S32 HEADER_HEIGHT = 25;
static const S32 HEADER_IMAGE_LEFT_OFFSET = 5;
static const S32 HEADER_TEXT_LEFT_OFFSET = 30;
static const F32 AUTO_OPEN_TIME = 1.f;
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 0048c44189..7f209c60a7 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -85,6 +85,7 @@ LLButton::Params::Params()
image_top_pad("image_top_pad"),
image_bottom_pad("image_bottom_pad"),
imgoverlay_label_space("imgoverlay_label_space", 1),
+ image_overlay_right_delta("image_overlay_right_delta", 0),
label_color("label_color"),
label_color_selected("label_color_selected"), // requires is_toggle true
label_color_disabled("label_color_disabled"),
@@ -109,6 +110,8 @@ LLButton::Params::Params()
commit_on_capture_lost("commit_on_capture_lost", false),
display_pressed_state("display_pressed_state", true),
use_draw_context_alpha("use_draw_context_alpha", true),
+ draw_focus_border("draw_focus_border", true),
+ hover_hand_cursor("hover_hand_cursor", false),
badge("badge"),
handle_right_mouse("handle_right_mouse"),
held_down_delay("held_down_delay"),
@@ -158,6 +161,7 @@ LLButton::LLButton(const LLButton::Params& p)
mImageOverlayTopPad(p.image_top_pad),
mImageOverlayBottomPad(p.image_bottom_pad),
mImgOverlayLabelSpace(p.imgoverlay_label_space),
+ mImageOverlayRightDelta(p.image_overlay_right_delta),
mIsToggle(p.is_toggle),
mScaleImage(p.scale_image),
mDropShadowedText(p.label_shadow),
@@ -179,6 +183,8 @@ LLButton::LLButton(const LLButton::Params& p)
mMouseUpSignal(NULL),
mHeldDownSignal(NULL),
mUseDrawContextAlpha(p.use_draw_context_alpha),
+ mDrawFocusBorder(p.draw_focus_border),
+ mHoverHandCursor(p.hover_hand_cursor),
mHandleRightMouse(p.handle_right_mouse),
mFlashingTimer(NULL)
{
@@ -653,7 +659,7 @@ bool LLButton::handleHover(S32 x, S32 y, MASK mask)
}
// We only handle the click if the click both started and ended within us
- getWindow()->setCursor(UI_CURSOR_ARROW);
+ getWindow()->setCursor(mHoverHandCursor ? UI_CURSOR_HAND : UI_CURSOR_ARROW);
LL_DEBUGS("UserInput") << "hover handled by " << getName() << LL_ENDL;
}
return true;
@@ -840,10 +846,9 @@ void LLButton::draw()
label_color = ll::ui::SearchableControl::getHighlightFontColor();
// overlay with keyboard focus border
- if (hasFocus())
+ if (hasFocus() && mDrawFocusBorder)
{
- F32 lerp_amt = gFocusMgr.getFocusFlashAmt();
- drawBorder(imagep, gFocusMgr.getFocusColor() % alpha, ll_round(lerp(1.f, 3.f, lerp_amt)));
+ drawBorder(imagep, gFocusMgr.getFocusColor() % alpha, gFocusMgr.getFocusFlashWidth());
}
if (use_glow_effect)
@@ -930,6 +935,17 @@ void LLButton::draw()
}
overlay_color.mV[VALPHA] *= alpha;
+ if (mImageOverlayRightDelta > 0)
+ {
+ mImageOverlay->draw(getRect().getWidth() - overlay_width - mImageOverlayRightDelta,
+ center_y - (overlay_height / 2),
+ overlay_width,
+ overlay_height,
+ overlay_color);
+ }
+ else
+ {
+
switch(mImageOverlayAlignment)
{
case LLFontGL::LEFT:
@@ -964,6 +980,7 @@ void LLButton::draw()
// draw nothing
break;
}
+ }
}
// Draw label
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index f530eceb4b..0d1a28ee31 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -110,6 +110,7 @@ public:
//image overlay paddings
Optional<S32> image_top_pad;
Optional<S32> image_bottom_pad;
+ Optional<S32> image_overlay_right_delta;
/**
* Space between image_overlay and label
@@ -132,7 +133,9 @@ public:
Optional<F32> hover_glow_amount;
Optional<TimeIntervalParam> held_down_delay;
- Optional<bool> use_draw_context_alpha;
+ Optional<bool> use_draw_context_alpha,
+ draw_focus_border,
+ hover_hand_cursor;
Optional<LLBadge::Params> badge;
@@ -366,12 +369,16 @@ protected:
S32 mImageOverlayBottomPad;
bool mUseDrawContextAlpha;
+ bool mDrawFocusBorder;
+ bool mHoverHandCursor;
/*
* Space between image_overlay and label
*/
S32 mImgOverlayLabelSpace;
+ S32 mImageOverlayRightDelta;
+
F32 mHoverGlowStrength;
F32 mCurGlowStrength;
diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp
index 91e6f281da..ca512a9883 100644
--- a/indra/llui/llconsole.cpp
+++ b/indra/llui/llconsole.cpp
@@ -67,6 +67,10 @@ LLConsole::LLConsole(const LLConsole::Params& p)
{
setFontSize(p.font_size_index);
}
+ if (mFont == nullptr)
+ {
+ setFontSize(0); // sans-serif
+ }
mFadeTime = mLinePersistTime - FADE_DURATION;
setMaxLines(LLUI::getInstance()->mSettingGroups["config"]->getS32("ConsoleMaxLines"));
}
@@ -79,6 +83,13 @@ void LLConsole::setLinePersistTime(F32 seconds)
void LLConsole::reshape(S32 width, S32 height, bool called_from_parent)
{
+ if (mFont == nullptr)
+ {
+ // not initialized yet
+ LL_WARNS() << "LLConsole::reshape called before font is set" << LL_ENDL;
+ return;
+ }
+
S32 new_width = llmax(50, llmin(getRect().getWidth(), width));
S32 new_height = llmax(mFont->getLineHeight() + 15, llmin(getRect().getHeight(), height));
diff --git a/indra/llui/lldraghandle.cpp b/indra/llui/lldraghandle.cpp
index 15536178ab..b3b47084c5 100644
--- a/indra/llui/lldraghandle.cpp
+++ b/indra/llui/lldraghandle.cpp
@@ -59,7 +59,9 @@ LLDragHandle::LLDragHandle(const LLDragHandle::Params& p)
mMaxTitleWidth( 0 ),
mForeground( true ),
mDragHighlightColor(p.drag_highlight_color()),
- mDragShadowColor(p.drag_shadow_color())
+ mDragShadowColor(p.drag_shadow_color()),
+ mFont(p.font),
+ mLabelVPad(p.label_vpad())
{
static LLUICachedControl<S32> snap_margin ("SnapMargin", 0);
@@ -98,14 +100,13 @@ void LLDragHandleTop::setTitle(const std::string& title)
}
else
{
- const LLFontGL* font = LLFontGL::getFontSansSerif();
LLTextBox::Params params;
params.name("Drag Handle Title");
params.rect(getRect());
params.initial_value(trimmed_title);
- params.font(font);
+ params.font(mFont);
params.follows.flags(FOLLOWS_TOP | FOLLOWS_LEFT | FOLLOWS_RIGHT);
- params.font_shadow(LLFontGL::DROP_SHADOW_SOFT);
+ params.font_shadow(LLFontGL::NO_SHADOW);
params.use_ellipses = true;
params.parse_urls = false; //cancel URL replacement in floater title
mTitleBox = LLUICtrlFactory::create<LLTextBox> (params);
@@ -236,7 +237,6 @@ void LLDragHandleLeft::draw()
void LLDragHandleTop::reshapeTitleBox()
{
- static LLUICachedControl<S32> title_vpad("UIFloaterTitleVPad", 0);
if( ! mTitleBox)
{
return;
@@ -248,7 +248,7 @@ void LLDragHandleTop::reshapeTitleBox()
LLRect title_rect;
title_rect.setLeftTopAndSize(
LEFT_PAD,
- getRect().getHeight() - title_vpad,
+ getRect().getHeight() - mLabelVPad,
title_width,
title_height);
diff --git a/indra/llui/lldraghandle.h b/indra/llui/lldraghandle.h
index 73211d5292..f768839749 100644
--- a/indra/llui/lldraghandle.h
+++ b/indra/llui/lldraghandle.h
@@ -43,13 +43,17 @@ public:
: public LLInitParam::Block<Params, LLView::Params>
{
Optional<std::string> label;
+ Optional<S32> label_vpad;
Optional<LLUIColor> drag_highlight_color;
Optional<LLUIColor> drag_shadow_color;
+ Optional<const LLFontGL*> font;
Params()
: label("label"),
+ label_vpad("label_vpad", 7),
drag_highlight_color("drag_highlight_color", LLUIColorTable::instance().getColor("DefaultHighlightLight")),
- drag_shadow_color("drag_shadow_color", LLUIColorTable::instance().getColor("DefaultShadowDark"))
+ drag_shadow_color("drag_shadow_color", LLUIColorTable::instance().getColor("DefaultShadowDark")),
+ font("font", LLFontGL::getFontSansSerif())
{
changeDefault(mouse_opaque, true);
changeDefault(follows.flags, FOLLOWS_ALL);
@@ -82,6 +86,8 @@ protected:
protected:
LLTextBox* mTitleBox;
+ const LLFontGL* mFont;
+ S32 mLabelVPad;
private:
LLRect mButtonsRect;
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index c60253e7fe..9361358ced 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -183,8 +183,10 @@ LLFloater::Params::Params()
show_title("show_title", true),
auto_close("auto_close", false),
positioning("positioning", LLFloaterEnums::POSITIONING_RELATIVE),
+ header_font("header_font", LLFontGL::getFontSansSerif()),
header_height("header_height", 0),
legacy_header_height("legacy_header_height", 0),
+ header_vpad("header_vpad", 7),
close_image("close_image"),
restore_image("restore_image"),
minimize_image("minimize_image"),
@@ -293,7 +295,7 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)
memset(mButtonsEnabled, 0, BUTTON_COUNT * sizeof(bool));
memset(mButtons, 0, BUTTON_COUNT * sizeof(LLButton*));
- addDragHandle();
+ addDragHandle(p);
addResizeCtrls();
initFromParams(p);
@@ -336,7 +338,7 @@ void LLFloater::initFloater(const Params& p)
}
}
-void LLFloater::addDragHandle()
+void LLFloater::addDragHandle(const LLFloater::Params& floater_params)
{
if (!mDragHandle)
{
@@ -346,6 +348,8 @@ void LLFloater::addDragHandle()
p.name("drag");
p.follows.flags(FOLLOWS_ALL);
p.label(mTitle);
+ p.font(floater_params.header_font);
+ p.label_vpad(floater_params.header_vpad);
mDragHandle = LLUICtrlFactory::create<LLDragHandleLeft>(p);
}
else // drag on top
@@ -354,6 +358,8 @@ void LLFloater::addDragHandle()
p.name("Drag Handle");
p.follows.flags(FOLLOWS_ALL);
p.label(mTitle);
+ p.font(floater_params.header_font);
+ p.label_vpad(floater_params.header_vpad);
mDragHandle = LLUICtrlFactory::create<LLDragHandleTop>(p);
}
addChild(mDragHandle);
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 9e1594bdd2..bda2531b43 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -172,8 +172,10 @@ public:
Optional<LLFloaterEnums::EOpenPositioning> positioning;
+ Optional<const LLFontGL*> header_font;
Optional<S32> header_height,
- legacy_header_height; // HACK see initFromXML()
+ legacy_header_height, // HACK see initFromXML()
+ header_vpad;
Optional<F32> rel_x,
rel_y;
@@ -442,7 +444,7 @@ private:
bool offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButton index);
void addResizeCtrls();
void layoutResizeCtrls();
- void addDragHandle();
+ void addDragHandle(const LLFloater::Params& p);
void layoutDragHandle(); // repair layout
static void updateActiveFloaterTransparency();
diff --git a/indra/llui/llfocusmgr.cpp b/indra/llui/llfocusmgr.cpp
index 7544a44478..ce0e8036e7 100644
--- a/indra/llui/llfocusmgr.cpp
+++ b/indra/llui/llfocusmgr.cpp
@@ -464,6 +464,11 @@ F32 LLFocusMgr::getFocusFlashAmt() const
return clamp_rescale(mFocusFlashTimer.getElapsedTimeF32(), 0.f, FOCUS_FADE_TIME, 1.f, 0.f);
}
+S32 LLFocusMgr::getFocusFlashWidth() const
+{
+ return ll_round(lerp(1.f, 2.f, getFocusFlashAmt()));
+}
+
LLColor4 LLFocusMgr::getFocusColor() const
{
static LLUIColor focus_color_cached = LLUIColorTable::instance().getColor("FocusColor");
diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h
index 89fee5c9f1..2e2293196b 100644
--- a/indra/llui/llfocusmgr.h
+++ b/indra/llui/llfocusmgr.h
@@ -101,7 +101,7 @@ public:
void setKeystrokesOnly(bool keystrokes_only) { mKeystrokesOnly = keystrokes_only; }
F32 getFocusFlashAmt() const;
- S32 getFocusFlashWidth() const { return ll_round(lerp(1.f, 3.f, getFocusFlashAmt())); }
+ S32 getFocusFlashWidth() const;
LLColor4 getFocusColor() const;
void triggerFocusFlash();
bool getAppHasFocus() const { return mAppHasFocus; }
diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp
index dafbca7433..fcc1964bd6 100644
--- a/indra/llui/llfolderviewitem.cpp
+++ b/indra/llui/llfolderviewitem.cpp
@@ -159,9 +159,11 @@ LLFolderViewItem::Params::Params()
icon_width("icon_width", 0),
text_pad("text_pad", 0),
text_pad_right("text_pad_right", 0),
+ text_pad_top("text_pad_top", 1),
single_folder_mode("single_folder_mode", false),
double_click_override("double_click_override", false),
arrow_size("arrow_size", 0),
+ arrow_pad_top("arrow_pad_top", 1),
max_folder_item_overlap("max_folder_item_overlap", 0)
{ }
@@ -201,7 +203,9 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
mIconWidth(p.icon_width),
mTextPad(p.text_pad),
mTextPadRight(p.text_pad_right),
+ mTextPadTop(p.text_pad_top),
mArrowSize(p.arrow_size),
+ mArrowPadTop(p.arrow_pad_top),
mSingleFolderMode(p.single_folder_mode),
mMaxFolderItemOverlap(p.max_folder_item_overlap),
mDoubleClickOverride(p.double_click_override)
@@ -811,7 +815,7 @@ void LLFolderViewItem::drawOpenFolderArrow()
if (hasVisibleChildren() || !isFolderComplete())
{
gl_draw_scaled_rotated_image(
- mIndentation, getRect().getHeight() - mArrowSize - mTextPad - sTopPad,
+ mIndentation, getRect().getHeight() - mArrowSize - mArrowPadTop - sTopPad,
mArrowSize, mArrowSize, mControlLabelRotation, sFolderArrowImg->getImage(), sFgColor);
}
}
@@ -1045,7 +1049,7 @@ void LLFolderViewItem::draw()
S32 filter_string_length = mViewModelItem->hasFilterStringMatch() ? (S32)mViewModelItem->getFilterStringSize() : 0;
F32 right_x = 0;
- F32 y = (F32)rect_height - line_height - (F32)mTextPad - (F32)sTopPad;
+ F32 y = (F32)rect_height - line_height - (F32)mTextPadTop - (F32)sTopPad;
F32 text_left = (F32)getLabelXPos();
LLWString combined_string = mLabel + mLabelSuffix;
@@ -1124,7 +1128,7 @@ void LLFolderViewItem::draw()
if(mLabelSuffix.empty() || (font == sSuffixFont))
{
F32 match_string_left = text_left + font->getWidthF32(combined_string.c_str(), 0, filter_offset + filter_string_length) - font->getWidthF32(combined_string.c_str(), filter_offset, filter_string_length);
- F32 yy = (F32)rect_height - line_height - (F32)mTextPad - (F32)sTopPad;
+ F32 yy = (F32)rect_height - line_height - (F32)mTextPadTop - (F32)sTopPad;
font->render(combined_string, filter_offset, match_string_left, yy,
sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
filter_string_length, S32_MAX, &right_x);
@@ -1135,7 +1139,7 @@ void LLFolderViewItem::draw()
if(label_filter_length > 0)
{
F32 match_string_left = text_left + font->getWidthF32(mLabel.c_str(), 0, filter_offset + label_filter_length) - font->getWidthF32(mLabel.c_str(), filter_offset, label_filter_length);
- F32 yy = (F32)rect_height - line_height - (F32)mTextPad - (F32)sTopPad;
+ F32 yy = (F32)rect_height - line_height - (F32)mTextPadTop - (F32)sTopPad;
font->render(mLabel, filter_offset, match_string_left, yy,
sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
label_filter_length, S32_MAX, &right_x);
@@ -1146,7 +1150,7 @@ void LLFolderViewItem::draw()
{
S32 suffix_offset = llmax(0, filter_offset - (S32)mLabel.size());
F32 match_string_left = text_left + font->getWidthF32(mLabel.c_str(), 0, static_cast<S32>(mLabel.size())) + sSuffixFont->getWidthF32(mLabelSuffix.c_str(), 0, suffix_offset + suffix_filter_length) - sSuffixFont->getWidthF32(mLabelSuffix.c_str(), suffix_offset, suffix_filter_length);
- F32 yy = (F32)rect_height - sSuffixFont->getLineHeight() - (F32)mTextPad - (F32)sTopPad;
+ F32 yy = (F32)rect_height - sSuffixFont->getLineHeight() - (F32)mTextPadTop - (F32)sTopPad;
sSuffixFont->render(mLabelSuffix, suffix_offset, match_string_left, yy, sFilterTextColor,
LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
suffix_filter_length, S32_MAX, &right_x);
diff --git a/indra/llui/llfolderviewitem.h b/indra/llui/llfolderviewitem.h
index 23d794bf26..258a806b91 100644
--- a/indra/llui/llfolderviewitem.h
+++ b/indra/llui/llfolderviewitem.h
@@ -73,7 +73,9 @@ public:
icon_width,
text_pad,
text_pad_right,
+ text_pad_top,
arrow_size,
+ arrow_pad_top,
max_folder_item_overlap;
Optional<bool> single_folder_mode,
double_click_override;
@@ -117,7 +119,9 @@ protected:
mIconWidth,
mTextPad,
mTextPadRight,
+ mTextPadTop,
mArrowSize,
+ mArrowPadTop,
mMaxFolderItemOverlap;
F32 mControlLabelRotation;
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index fe0591ce4b..1dc80671cc 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -48,17 +48,21 @@ static LLLayoutStack::LayoutStackRegistry::Register<LLLayoutPanel> register_layo
LLLayoutPanel::Params::Params()
: expanded_min_dim("expanded_min_dim", 0),
min_dim("min_dim", -1),
+ max_dim("max_dim", -1),
user_resize("user_resize", false),
auto_resize("auto_resize", true)
{
addSynonym(min_dim, "min_width");
addSynonym(min_dim, "min_height");
+ addSynonym(max_dim, "max_width");
+ addSynonym(max_dim, "max_height");
}
LLLayoutPanel::LLLayoutPanel(const Params& p)
: LLPanel(p),
mExpandedMinDim(p.expanded_min_dim.isProvided() ? p.expanded_min_dim : p.min_dim),
mMinDim(p.min_dim),
+ mMaxDim(p.max_dim),
mAutoResize(p.auto_resize),
mUserResize(p.user_resize),
mCollapsed(false),
@@ -75,6 +79,7 @@ LLLayoutPanel::LLLayoutPanel(const Params& p)
{
mVisibleAmt = 0.f;
}
+ setMaxDim(mMaxDim);
}
void LLLayoutPanel::initFromParams(const Params& p)
@@ -113,6 +118,8 @@ S32 LLLayoutPanel::getTargetDim() const
void LLLayoutPanel::setTargetDim(S32 value)
{
+ value = llmin(value, mMaxDim);
+
LLRect new_rect(getRect());
if (mOrientation == LLLayoutStack::HORIZONTAL)
{
@@ -145,6 +152,7 @@ void LLLayoutPanel::setOrientation( LLView::EOrientation orientation )
setMinDim(layout_dim);
}
mTargetDim = llmax(layout_dim, getMinDim());
+ mTargetDim = llmin(mTargetDim, mMaxDim);
}
void LLLayoutPanel::setVisible( bool visible )
@@ -167,6 +175,7 @@ void LLLayoutPanel::reshape( S32 width, S32 height, bool called_from_parent /*=
if (!mIgnoreReshape && !mAutoResize)
{
mTargetDim = (mOrientation == LLLayoutStack::HORIZONTAL) ? width : height;
+ mTargetDim = llmin(mTargetDim, mMaxDim);
LLLayoutStack* stackp = dynamic_cast<LLLayoutStack*>(getParent());
if (stackp)
{
@@ -439,6 +448,7 @@ void LLLayoutStack::updateLayout()
F32 fraction_to_distribute = (panelp->mFractionalSize * panelp->getAutoResizeFactor()) / (total_visible_fraction);
S32 delta = ll_round((F32)space_to_distribute * fraction_to_distribute);
panelp->mTargetDim += delta;
+ panelp->mTargetDim = llmin(panelp->mTargetDim, panelp->mMaxDim);
remaining_space -= delta;
}
}
@@ -455,6 +465,7 @@ void LLLayoutStack::updateLayout()
{
S32 space_for_panel = remaining_space > 0 ? 1 : -1;
panelp->mTargetDim += space_for_panel;
+ panelp->mTargetDim = llmin(panelp->mTargetDim, panelp->mMaxDim);
remaining_space -= space_for_panel;
}
}
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index 9e3536aaff..4c78c8a289 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -140,7 +140,8 @@ public:
struct Params : public LLInitParam::Block<Params, LLPanel::Params>
{
Optional<S32> expanded_min_dim,
- min_dim;
+ min_dim,
+ max_dim;
Optional<bool> user_resize,
auto_resize;
@@ -164,6 +165,8 @@ public:
S32 getMinDim() const { return llmax(0, mMinDim); }
void setMinDim(S32 value) { mMinDim = value; }
+ void setMaxDim(S32 value) { mMaxDim = value < 0 ? S32_MAX : value; }
+
S32 getExpandedMinDim() const { return mExpandedMinDim >= 0 ? mExpandedMinDim : getMinDim(); }
void setExpandedMinDim(S32 value) { mExpandedMinDim = value; }
@@ -198,6 +201,7 @@ protected:
S32 mExpandedMinDim;
S32 mMinDim;
+ S32 mMaxDim;
bool mCollapsed;
F32 mVisibleAmt;
F32 mCollapseAmt;
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index ef62666918..9a88083a5d 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -97,6 +97,7 @@ LLLineEditor::Params::Params()
ignore_tab("ignore_tab", true),
is_password("is_password", false),
allow_emoji("allow_emoji", true),
+ draw_focus_border("draw_focus_border", true),
cursor_color("cursor_color"),
use_bg_color("use_bg_color", false),
bg_color("bg_color"),
@@ -147,6 +148,7 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
mIgnoreTab( p.ignore_tab ),
mDrawAsterixes( p.is_password ),
mAllowEmoji( p.allow_emoji ),
+ mDrawFocusBorder(p.draw_focus_border),
mSpellCheck( p.spellcheck ),
mSpellCheckStart(-1),
mSpellCheckEnd(-1),
@@ -1795,7 +1797,7 @@ void LLLineEditor::drawBackground()
if (!image) return;
// optionally draw programmatic border
- if (has_focus)
+ if (has_focus && mDrawFocusBorder)
{
LLColor4 tmp_color = gFocusMgr.getFocusColor();
tmp_color.setAlpha(alpha);
@@ -1955,12 +1957,11 @@ void LLLineEditor::draw()
width = llmin(width, mTextRightEdge - ll_round(rendered_pixels_right));
gl_rect_2d(ll_round(rendered_pixels_right), cursor_top, ll_round(rendered_pixels_right)+width, cursor_bottom, color);
- LLColor4 tmp_color( 1.f - text_color.mV[0], 1.f - text_color.mV[1], 1.f - text_color.mV[2], alpha );
rendered_text += mFontBufferSelection.render(
mGLFont,
mText, mScrollHPos + rendered_text,
rendered_pixels_right, text_bottom,
- tmp_color,
+ LLColor4::black,
LLFontGL::LEFT, LLFontGL::BOTTOM,
0,
LLFontGL::NO_SHADOW,
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index 6384bfdc5f..fd248edda3 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -95,7 +95,8 @@ public:
show_label_focused,
is_password,
allow_emoji,
- use_bg_color;
+ use_bg_color,
+ draw_focus_border;
// colors
Optional<LLUIColor> cursor_color,
@@ -411,6 +412,7 @@ protected:
bool mAllowEmoji;
bool mUseBgColor;
+ bool mDrawFocusBorder;
LLWString mPreeditWString;
LLWString mPreeditOverwrittenWString;
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 6ba31c251e..3b21ed8f47 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -73,7 +73,7 @@ S32 MENU_BAR_WIDTH = 410;
/// Local function declarations, constants, enums, and typedefs
///============================================================================
-const S32 LABEL_BOTTOM_PAD_PIXELS = 2;
+const S32 LABEL_BOTTOM_PAD_PIXELS = 1;
const U32 LEFT_PAD_PIXELS = 3;
const U32 LEFT_WIDTH_PIXELS = 15;
@@ -519,21 +519,25 @@ void LLMenuItemGL::draw( void )
}
else
{
+ // Munus are all of the same size, so fixed offset works here,
+ // but it won't work if somebody decides to use different font
+ // todo: adjust logic to work of rect and font height
+ F32 y = (F32)MENU_ITEM_PADDING / 2.f;
if( !mDrawBoolLabel.empty() )
{
- mFont->render( mDrawBoolLabel.getWString(), 0, (F32)LEFT_PAD_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f), color,
+ mFont->render( mDrawBoolLabel.getWString(), 0, (F32)LEFT_PAD_PIXELS, y, color,
LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, false );
}
- mFont->render( mLabel.getWString(), 0, (F32)LEFT_PLAIN_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f), color,
+ mFont->render( mLabel.getWString(), 0, (F32)LEFT_PLAIN_PIXELS, y, color,
LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, false );
if( !mDrawAccelLabel.empty() )
{
- mFont->render( mDrawAccelLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PLAIN_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f), color,
+ mFont->render( mDrawAccelLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PLAIN_PIXELS, y, color,
LLFontGL::RIGHT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, false );
}
if( !mDrawBranchLabel.empty() )
{
- mFont->render( mDrawBranchLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PAD_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f), color,
+ mFont->render( mDrawBranchLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PAD_PIXELS, y, color,
LLFontGL::RIGHT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, false );
}
}
@@ -1638,6 +1642,9 @@ void LLMenuItemBranchDownGL::draw( void )
{
color = mDisabledColor.get();
}
+ // Munus are all of the same size, so fixed offset works here,
+ // but it won't work if somebody decides to use different font
+ // todo: adjust logic to work of rect and font height
getFont()->render( mLabel.getWString(), 0, (F32)getRect().getWidth() / 2.f, (F32)LABEL_BOTTOM_PAD_PIXELS, color,
LLFontGL::HCENTER, LLFontGL::BOTTOM, LLFontGL::NORMAL);
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index 48e42d9fc0..27f1dcb03d 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -483,7 +483,7 @@ void LLTabContainer::draw()
tuple->mButton->setVisible( true );
}
- S32 max_scroll_visible = getTabCount() - getMaxScrollPos() + getScrollPos();
+ S32 max_scroll_visible = getVisibleTabCount() - getMaxScrollPos() + getScrollPos();
S32 idx = 0;
for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter)
{
@@ -1380,6 +1380,20 @@ S32 LLTabContainer::getTabCount() const
return static_cast<S32>(mTabList.size());
}
+S32 LLTabContainer::getVisibleTabCount() const
+{
+ S32 visible_count = 0;
+ for (tuple_list_t::const_iterator itr = mTabList.begin(); itr != mTabList.end(); ++itr)
+ {
+ const LLTabTuple* pTT = *itr;
+ if (pTT->mVisible)
+ {
+ visible_count++;
+ }
+ }
+ return visible_count;
+}
+
LLPanel* LLTabContainer::getPanelByIndex(S32 index) const
{
if (index >= 0 && index < (S32)mTabList.size())
@@ -2109,6 +2123,14 @@ void LLTabContainer::updateMaxScrollPos()
S32 tab_space = 0;
S32 available_space = 0;
tab_space = mTotalTabWidth;
+ for(tuple_list_t::const_iterator tab_it = mTabList.begin(); tab_it != mTabList.end(); ++tab_it)
+ {
+ const LLTabTuple* tuple = *tab_it;
+ if (!tuple->mVisible)
+ {
+ tab_space -= tuple->mButton->getRect().getWidth();
+ }
+ }
available_space = getRect().getWidth() - mRightTabBtnOffset - 2 * (LLPANEL_BORDER_WIDTH + tabcntr_tab_h_pad);
if( tab_space > available_space )
@@ -2118,7 +2140,7 @@ void LLTabContainer::updateMaxScrollPos()
available_width_with_arrows -= tabcntr_tab_partial_width;
S32 running_tab_width = 0;
- setMaxScrollPos(getTabCount());
+ setMaxScrollPos(getVisibleTabCount());
for(tuple_list_t::reverse_iterator tab_it = mTabList.rbegin(); tab_it != mTabList.rend(); ++tab_it)
{
running_tab_width += (*tab_it)->mButton->getRect().getWidth();
@@ -2129,7 +2151,7 @@ void LLTabContainer::updateMaxScrollPos()
setMaxScrollPos(getMaxScrollPos()-1);
}
// in case last tab doesn't actually fit on screen, make it the last scrolling position
- setMaxScrollPos(llmin(getMaxScrollPos(), getTabCount() - 1));
+ setMaxScrollPos(llmin(getMaxScrollPos(), getVisibleTabCount() - 1));
no_scroll = false;
}
}
diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h
index cbf56dc653..3095e641f8 100644
--- a/indra/llui/lltabcontainer.h
+++ b/indra/llui/lltabcontainer.h
@@ -188,6 +188,7 @@ public:
LLPanel* getCurrentPanel();
S32 getCurrentPanelIndex() const;
S32 getTabCount() const;
+ S32 getVisibleTabCount() const;
LLPanel* getPanelByIndex(S32 index) const;
S32 getIndexForPanel(LLPanel* panel) const;
S32 getPanelIndexByTitle(std::string_view title) const;
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 9fcf2a5f10..0521853b02 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -51,6 +51,9 @@ const F32 CURSOR_FLASH_DELAY = 1.0f; // in seconds
const S32 CURSOR_THICKNESS = 2;
const F32 TRIPLE_CLICK_INTERVAL = 0.3f; // delay between double and triple click.
+constexpr F32 FOCUSED_SELECTION_BG_ALPHA = 1;
+constexpr F32 UNFOCUSED_SELECTION_BG_ALPHA = 0.7f;
+
LLTextBase::line_info::line_info(S32 index_start, S32 index_end, LLRect rect, S32 line_num)
: mDocIndexStart(index_start),
mDocIndexEnd(index_end),
@@ -530,7 +533,7 @@ void LLTextBase::drawSelectionBackground()
// Draw the selection box (we're using a box instead of reversing the colors on the selected text).
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
const LLColor4& color = mSelectedBGColor;
- F32 alpha = hasFocus() ? 0.7f : 0.3f;
+ F32 alpha = hasFocus() ? FOCUSED_SELECTION_BG_ALPHA : UNFOCUSED_SELECTION_BG_ALPHA;
alpha *= getDrawContext().mAlpha;
LLColor4 selection_color(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], alpha);
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 9206b3facf..bc39d9732c 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -409,6 +409,7 @@ public:
/*virtual*/ void setColor(const LLUIColor& c) override;
virtual void setReadOnlyColor(const LLUIColor& c);
/*virtual*/ void onVisibilityChange(bool new_visibility) override;
+ void setBgReadOnlyColor(const LLUIColor& c) { mReadOnlyBgColor = c; }
/*virtual*/ void setValue(const LLSD& value) override;
/*virtual*/ LLTextViewModel* getViewModel() const override;
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index 05461edd82..9a27049d37 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -80,7 +80,7 @@ LLUICtrl::Params::Params()
mouseenter_callback("mouseenter_callback"),
mouseleave_callback("mouseleave_callback"),
control_name("control_name"),
- font("font", LLFontGL::getFontEmojiMedium()),
+ font("font", LLFontGL::getFontEmojiSmall()),
font_halign("halign"),
font_valign("valign"),
length("length"), // ignore LLXMLNode cruft
diff --git a/indra/llui/llviewborder.cpp b/indra/llui/llviewborder.cpp
index d53fd6eb91..68ca61681c 100644
--- a/indra/llui/llviewborder.cpp
+++ b/indra/llui/llviewborder.cpp
@@ -149,7 +149,7 @@ void LLViewBorder::drawOnePixelLines()
top_color = gFocusMgr.getFocusColor();
bottom_color = top_color;
- LLUI::setLineWidth(lerp(1.f, 3.f, gFocusMgr.getFocusFlashAmt()));
+ LLUI::setLineWidth(lerp(1.f, 2.f, gFocusMgr.getFocusFlashAmt()));
}
S32 left = 0;
diff --git a/indra/llwebrtc/llwebrtc.cpp b/indra/llwebrtc/llwebrtc.cpp
index 39cecbda25..a286f75f42 100644
--- a/indra/llwebrtc/llwebrtc.cpp
+++ b/indra/llwebrtc/llwebrtc.cpp
@@ -811,6 +811,8 @@ LLWebRTCPeerConnectionImpl::LLWebRTCPeerConnectionImpl() :
mPeerConnection(nullptr),
mMute(MUTE_INITIAL),
mAnswerReceived(false),
+ mPeerConnectionState(webrtc::PeerConnectionInterface::PeerConnectionState::kNew),
+ mDisconnectCount(0),
mPendingJobs(0)
{
}
@@ -1237,11 +1239,15 @@ void LLWebRTCPeerConnectionImpl::OnIceGatheringChange(webrtc::PeerConnectionInte
}
}
+static const webrtc::TimeDelta DISCONNECT_RENEGOTIATE_DELAY = webrtc::TimeDelta::Millis(10000);
+
// Called any time the PeerConnectionState changes.
void LLWebRTCPeerConnectionImpl::OnConnectionChange(webrtc::PeerConnectionInterface::PeerConnectionState new_state)
{
RTC_LOG(LS_ERROR) << __FUNCTION__ << " Peer Connection State Change " << new_state;
+ mPeerConnectionState = new_state;
+
switch (new_state)
{
case webrtc::PeerConnectionInterface::PeerConnectionState::kConnected:
@@ -1257,13 +1263,32 @@ void LLWebRTCPeerConnectionImpl::OnConnectionChange(webrtc::PeerConnectionInterf
break;
}
case webrtc::PeerConnectionInterface::PeerConnectionState::kFailed:
- case webrtc::PeerConnectionInterface::PeerConnectionState::kDisconnected:
{
for (auto &observer : mSignalingObserverList)
{
observer->OnRenegotiationNeeded();
}
-
+ break;
+ }
+ case webrtc::PeerConnectionInterface::PeerConnectionState::kDisconnected:
+ {
+ // Wait 10 seconds before renegotiating in case the connection recovers on its own.
+ // Use a sequence count so that only the most recent disconnect transition can trigger
+ // a renegotiation, avoiding stale delayed tasks from earlier disconnect/reconnect cycles.
+ uint32_t disconnect_count = ++mDisconnectCount;
+ mWebRTCImpl->PostDelayedSignalingTask(
+ [this, disconnect_count]()
+ {
+ if (disconnect_count == mDisconnectCount
+ && mPeerConnectionState == webrtc::PeerConnectionInterface::PeerConnectionState::kDisconnected)
+ {
+ for (auto &observer : mSignalingObserverList)
+ {
+ observer->OnRenegotiationNeeded();
+ }
+ }
+ },
+ DISCONNECT_RENEGOTIATE_DELAY);
break;
}
default:
@@ -1536,6 +1561,57 @@ void LLWebRTCPeerConnectionImpl::unsetDataObserver(LLWebRTCDataObserver* observe
}
}
+class LLStatsCollectorCallback : public webrtc::RTCStatsCollectorCallback
+{
+public:
+ typedef std::function<void(const LLWebRTCStatsMap&)> StatsCallback;
+
+ LLStatsCollectorCallback(StatsCallback callback) : callback_(callback) {}
+
+ void OnStatsDelivered(const webrtc::scoped_refptr<const webrtc::RTCStatsReport>& report) override
+ {
+ if (callback_)
+ {
+ // Transform RTCStatsReport stats to simple map
+ LLWebRTCStatsMap stats_map;
+ for (const auto& stats : *report)
+ {
+ std::map<std::string, std::string> stat_attributes;
+
+ // Convert each attribute to string format
+ for (const auto& attribute : stats.Attributes())
+ {
+ stat_attributes[attribute.name()] = attribute.ToString();
+ }
+ stats_map[stats.id()] = stat_attributes;
+ }
+ callback_(stats_map);
+ }
+ }
+
+private:
+ StatsCallback callback_;
+};
+
+void LLWebRTCPeerConnectionImpl::gatherConnectionStats()
+{
+ if (!mPeerConnection)
+ {
+ return;
+ }
+
+ auto stats_callback = webrtc::make_ref_counted<LLStatsCollectorCallback>(
+ [this](const LLWebRTCStatsMap& generic_stats)
+ {
+ for (auto& observer : mSignalingObserverList)
+ {
+ observer->OnStatsDelivered(generic_stats);
+ }
+ });
+
+ mPeerConnection->GetStats(stats_callback.get());
+}
+
LLWebRTCImpl * gWebRTCImpl = nullptr;
LLWebRTCDeviceInterface * getDeviceInterface()
{
diff --git a/indra/llwebrtc/llwebrtc.h b/indra/llwebrtc/llwebrtc.h
index 7d06b7d2b4..e76e708f0c 100644
--- a/indra/llwebrtc/llwebrtc.h
+++ b/indra/llwebrtc/llwebrtc.h
@@ -38,6 +38,7 @@
#ifndef LLWEBRTC_H
#define LLWEBRTC_H
+#include <map>
#include <string>
#include <vector>
@@ -55,6 +56,7 @@
namespace llwebrtc
{
+typedef std::map<std::string, std::map<std::string, std::string>> LLWebRTCStatsMap;
class LLWebRTCLogCallback
{
@@ -240,6 +242,8 @@ class LLWebRTCSignalingObserver
// Called when the data channel has been established and data
// transfer can begin.
virtual void OnDataChannelReady(LLWebRTCDataInterface *data_interface) = 0;
+
+ virtual void OnStatsDelivered(const LLWebRTCStatsMap& stats_data) {}
};
// LLWebRTCPeerConnectionInterface representsd a connection to a peer,
@@ -273,6 +277,8 @@ class LLWebRTCPeerConnectionInterface
virtual void unsetSignalingObserver(LLWebRTCSignalingObserver* observer) = 0;
virtual void AnswerAvailable(const std::string &sdp) = 0;
+
+ virtual void gatherConnectionStats() = 0;
};
// The following define the dynamic linked library
diff --git a/indra/llwebrtc/llwebrtc_impl.h b/indra/llwebrtc/llwebrtc_impl.h
index 01cfb17ced..bd7a2e0bcf 100644
--- a/indra/llwebrtc/llwebrtc_impl.h
+++ b/indra/llwebrtc/llwebrtc_impl.h
@@ -343,6 +343,7 @@ public:
inner_->InitRecording();
inner_->StartRecording();
}
+ inner_->InitPlayout();
inner_->StartPlayout();
}
}
@@ -479,6 +480,13 @@ class LLWebRTCImpl : public LLWebRTCDeviceInterface, public webrtc::AudioDeviceO
mSignalingThread->PostTask(std::move(task), location);
}
+ void PostDelayedSignalingTask(absl::AnyInvocable<void() &&> task,
+ webrtc::TimeDelta delay,
+ const webrtc::Location& location = webrtc::Location::Current())
+ {
+ mSignalingThread->PostDelayedTask(std::move(task), delay, location);
+ }
+
void PostNetworkTask(absl::AnyInvocable<void() &&> task,
const webrtc::Location& location = webrtc::Location::Current())
{
@@ -648,6 +656,8 @@ class LLWebRTCPeerConnectionImpl : public LLWebRTCPeerConnectionInterface,
void enableSenderTracks(bool enable);
void enableReceiverTracks(bool enable);
+ void gatherConnectionStats() override;
+
protected:
LLWebRTCImpl * mWebRTCImpl;
@@ -673,6 +683,10 @@ class LLWebRTCPeerConnectionImpl : public LLWebRTCPeerConnectionInterface,
std::vector<LLWebRTCDataObserver *> mDataObserverList;
webrtc::scoped_refptr<webrtc::DataChannelInterface> mDataChannel;
+ // connection state tracking for delayed renegotiation on disconnect
+ webrtc::PeerConnectionInterface::PeerConnectionState mPeerConnectionState;
+ uint32_t mDisconnectCount;
+
std::atomic<int> mPendingJobs;
};
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 861712fb58..8e5e146c03 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -417,6 +417,7 @@ set(viewer_SOURCE_FILES
llfloaterimnearbychat.cpp
llfloaterimnearbychathandler.cpp
llfloaterimnearbychatlistener.cpp
+ llnearbyvoicemoderation.cpp
llnetmap.cpp
llnotificationalerthandler.cpp
llnotificationgrouphandler.cpp
@@ -1094,6 +1095,7 @@ set(viewer_HEADER_FILES
llnameeditor.h
llnamelistctrl.h
llnavigationbar.h
+ llnearbyvoicemoderation.h
llnetmap.h
llnotificationhandler.h
llnotificationlistitem.h
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index 124b7a2cd0..c4697fd566 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-26.1.1
+26.3.0
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 931abeb7ab..c69f4a0c21 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -5894,6 +5894,17 @@
<key>Value</key>
<integer>90</integer>
</map>
+ <key>ScriptToastButtonWidth</key>
+ <map>
+ <key>Comment</key>
+ <string>Default width of buttons in the Script dialog toast.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>110</integer>
+ </map>
<key>NotificationChannelRightMargin</key>
<map>
<key>Comment</key>
@@ -6125,6 +6136,39 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>OpenDebugStatVoice</key>
+ <map>
+ <key>Comment</key>
+ <string>Expand Voice (WebRTC) stats display</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>OpenDebugStatVoiceOutgoing</key>
+ <map>
+ <key>Comment</key>
+ <string>Expand Outgoing audio (Voice) stats display</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>OpenDebugStatVoiceIncoming</key>
+ <map>
+ <key>Comment</key>
+ <string>Expand Incoming audio (Voice) stats display</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>OutBandwidth</key>
<map>
<key>Comment</key>
@@ -12332,17 +12376,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>UIFloaterTitleVPad</key>
- <map>
- <key>Comment</key>
- <string>Distance from top of floater to top of title string, pixels</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <real>7</real>
- </map>
<key>UIImgDefaultEyesUUID</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index bea275bf82..59056381e1 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -382,6 +382,7 @@ const std::string MARKER_FILE_NAME("SecondLife.exec_marker");
const std::string START_MARKER_FILE_NAME("SecondLife.start_marker");
const std::string ERROR_MARKER_FILE_NAME("SecondLife.error_marker");
const std::string LOGOUT_MARKER_FILE_NAME("SecondLife.logout_marker");
+const std::string WATCHDOG_MARKER_FILE_NAME("SecondLife.watchdog_marker");
static std::string gLaunchFileOnQuit;
//----------------------------------------------------------------------------
@@ -3162,20 +3163,60 @@ bool LLAppViewer::initWindow()
<< " (setting = " << watchdog_enabled_setting << ")"
<< LL_ENDL;
- if (use_watchdog)
+ // Watchdog reports to statistics via marker files, that is
+ // pointless without ability to write (!mSecondInstance) those files.
+ // If use_watchdog is set, watchdog also reports to bugspat.
+ if (use_watchdog || !mSecondInstance)
{
- LLWatchdog::getInstance()->init([]()
- {
- LLAppViewer* app = LLAppViewer::instance();
- if (app->logoutRequestSent())
+ LLWatchdog::getInstance()->init(
+ [](bool final_marker)
{
- app->createErrorMarker(LAST_EXEC_LOGOUT_FROZE);
- }
- else
+ LLAppViewer* app = LLAppViewer::instance();
+ // Without watchdog everything will be counted as
+ // either 'unknown' (no crash marker) or based of present crash marker
+ if (final_marker)
+ {
+ // watchdog is going to crash viewer, so crate a 'crash' marker
+ if (app->logoutRequestSent())
+ {
+ app->createErrorMarker(LAST_EXEC_LOGOUT_FROZE);
+ }
+ else
+ {
+ app->createErrorMarker(LAST_EXEC_FROZE);
+ }
+ }
+ else
+ {
+ // not going to crash, just create a 'watchdog' marker
+ app->createWatchdogMarker();
+ }
+ },
+ []()
{
- app->createErrorMarker(LAST_EXEC_FROZE);
- }
- });
+ LLAppViewer* app = LLAppViewer::instance();
+ // in case process recovered from freeze, remove watchdog marker.
+ app->removeWatchdogMarker();
+ },
+ [](std::string &desc)
+ {
+#if LL_WINDOWS && LL_BUGSPLAT
+ LLAppViewer* app = LLAppViewer::instance();
+ app->writeDebugInfo();
+ return app->reportCustomToBugsplat(desc);
+#else
+ return false;
+#endif
+ },
+ []()
+ {
+ LLAppViewer* app = LLAppViewer::instance();
+ app->sendLogoutRequest();
+ // Might be better to ask user if user wants to terminate the app or wait.
+ OSMessageBox(LLTrans::getString("MBFreezeDetected"), LLTrans::getString("MBFatalError"), OSMB_OK);
+ },
+ use_watchdog);
+
}
LLNotificationsUI::LLNotificationManager::getInstance();
@@ -3948,13 +3989,8 @@ void LLAppViewer::processMarkerFiles()
{
// the file existed, is ours, and matched our version, so we can report on what it says
LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found; last exec crashed or froze" << LL_ENDL;
-#if LL_WINDOWS && LL_BUGSPLAT
- // bugsplat will set correct state in bugsplatSendLog
- // Might be more accurate to rename this one into 'unknown'
+ // App terminated unexpectedly or froze, we don't know the cause yet.
gLastExecEvent = LAST_EXEC_UNKNOWN;
-#else
- gLastExecEvent = LAST_EXEC_OTHER_CRASH;
-#endif // LL_WINDOWS
}
else
@@ -4007,23 +4043,29 @@ void LLAppViewer::processMarkerFiles()
}
LLAPRFile::remove(logout_marker_file);
}
- // and last refine based on whether or not a marker created during a non-llerr crash is found
+ // Refine based on whether or not a marker created during
+ // a crash is found or if wathdog caught a freeze.
+ // Bugsplat will set correct state in bugsplatSendLog.
std::string error_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ERROR_MARKER_FILE_NAME);
+ std::string watchdog_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, WATCHDOG_MARKER_FILE_NAME);
if(LLAPRFile::isExist(error_marker_file, NULL, LL_APR_RB))
{
S32 marker_code = getMarkerErrorCode(error_marker_file);
if (marker_code >= 0)
{
- if (gLastExecEvent == LAST_EXEC_LOGOUT_FROZE)
- {
- gLastExecEvent = LAST_EXEC_LOGOUT_CRASH;
- LL_INFOS("MarkerFile") << "Error marker '"<< error_marker_file << "' crashed, setting LastExecEvent to LOGOUT_CRASH" << LL_ENDL;
- }
- else if (marker_code > 0 && marker_code < (S32)LAST_EXEC_COUNT)
+ if (marker_code > 0 && marker_code < (S32)LAST_EXEC_COUNT)
{
+ // If we have a code, it takes precendence
gLastExecEvent = (eLastExecEvent)marker_code;
LL_INFOS("MarkerFile") << "Error marker '"<< error_marker_file << "' crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL;
}
+ // if we have the marker, even without a code, it's a crash.
+ else if (gLastExecEvent == LAST_EXEC_LOGOUT_UNKNOWN
+ || gLastExecEvent == LAST_EXEC_LOGOUT_FROZE)
+ {
+ gLastExecEvent = LAST_EXEC_LOGOUT_CRASH;
+ LL_INFOS("MarkerFile") << "Error marker '" << error_marker_file << "' crashed, setting LastExecEvent to LOGOUT_CRASH" << LL_ENDL;
+ }
else
{
gLastExecEvent = LAST_EXEC_OTHER_CRASH;
@@ -4035,6 +4077,33 @@ void LLAppViewer::processMarkerFiles()
LL_INFOS("MarkerFile") << "Error marker '"<< error_marker_file << "' marker found, but versions did not match" << LL_ENDL;
}
LLAPRFile::remove(error_marker_file);
+ if (LLAPRFile::isExist(watchdog_marker_file, NULL, LL_APR_RB))
+ {
+ // If viewer crashed after a freeze was detected,
+ // crash still takes precendence. Just clear watchdog.
+ removeWatchdogMarker();
+ }
+ }
+ else
+ {
+ // so only check watchdog marker if there is no error marker.
+ if (LLAPRFile::isExist(watchdog_marker_file, NULL, LL_APR_RB))
+ {
+ if (LAST_EXEC_UNKNOWN == gLastExecEvent
+ || LAST_EXEC_LOGOUT_UNKNOWN == gLastExecEvent)
+ {
+ // watchdog marker gets created if we detect a freeze,
+ // so if viwer did not stop gracefully, and we know it wasn't a crash,
+ // we have no other info, check watchdog.
+ if (markerIsSameVersion(watchdog_marker_file))
+ {
+ gLastExecEvent = LAST_EXEC_UNKNOWN == gLastExecEvent ? LAST_EXEC_FROZE : LAST_EXEC_LOGOUT_FROZE;
+ LL_INFOS("MarkerFile") << "Watchdog marker '" << watchdog_marker_file << "' found, setting LastExecEvent to FROZE"
+ << LL_ENDL;
+ }
+ }
+ removeWatchdogMarker();
+ }
}
#if LL_DARWIN
@@ -4079,6 +4148,7 @@ void LLAppViewer::removeMarkerFiles()
{
LL_WARNS("MarkerFile") << "logout marker '"<<mLogoutMarkerFileName<<"' not open"<< LL_ENDL;
}
+ removeWatchdogMarker();
}
else
{
@@ -4495,13 +4565,66 @@ void LLAppViewer::purgeCefStaleCaches()
LL_PROFILE_ZONE_SCOPED;
// TODO: we really shouldn't use a hard coded name for the cache folder here...
const std::string browser_parent_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "cef_cache");
- if (LLFile::isdir(browser_parent_cache))
+ if (!LLFile::isdir(browser_parent_cache))
{
- // This is a sledgehammer approach - nukes the cef_cache dir entirely
- // which is then recreated the first time a CEF instance creates an
- // individual cache folder. If we ever decide to retain some folders
- // e.g. Search UI cache - then we will need a more granular approach.
- gDirUtilp->deleteDirAndContents(browser_parent_cache);
+ return;
+ }
+ // We are using a fixed name to not leave stale folders
+ // around in case something goes wrong on startup.
+ const std::string holder_cache_name = browser_parent_cache + "_rename";
+
+ // Try to rename the entire directory first
+ if (LLFile::rename(browser_parent_cache, holder_cache_name) == 0)
+ {
+ LL_DEBUGS("AppInit") << "Successfully renamed CEF cache folder for deletion" << LL_ENDL;
+ }
+ else
+ {
+ // Rename failed (likely another instance has files open in the cache)
+ // Create holder folder and move individual subfolders instead
+ LL_DEBUGS("AppInit") << "Could not rename CEF cache folder (may be in use), moving individual folders" << LL_ENDL;
+
+ if (!LLFile::isdir(holder_cache_name) && LLFile::mkdir(holder_cache_name) != 0)
+ {
+ LL_WARNS() << "Failed to create holder folder: " << holder_cache_name << LL_ENDL;
+ // Attept normal cleanup
+ gDirUtilp->deleteDirAndContents(browser_parent_cache);
+ return;
+ }
+
+ // Iterate through subdirectories in the cache folder
+ LLDirIterator dir_iter(browser_parent_cache, "*");
+ std::string subfolder_name;
+ while (dir_iter.next(subfolder_name))
+ {
+ if (subfolder_name == "." || subfolder_name == "..")
+ {
+ continue;
+ }
+
+ std::string source_path = browser_parent_cache + gDirUtilp->getDirDelimiter() + subfolder_name;
+ std::string dest_path = holder_cache_name + gDirUtilp->getDirDelimiter() + subfolder_name;
+
+ // If folder is in use, move will fail, don't delete it.
+ LLFile::rename(source_path, dest_path);
+ }
+ }
+
+ // Post deletion task to the General work queue to avoid blocking the main thread
+ if (auto queue = LL::WorkQueue::getInstance("General"))
+ {
+ // Alternatively throw it at LLPurgeDiskCacheThread to clean
+ // it during periodic purges.
+ queue->post([holder_cache_name]()
+ {
+ LL_PROFILE_ZONE_NAMED("cef_cache_cleanup");
+ gDirUtilp->deleteDirAndContents(holder_cache_name);
+ });
+ }
+ else
+ {
+ LL_WARNS() << "Failed to get General work queue, deleting CEF cache synchronously" << LL_ENDL;
+ gDirUtilp->deleteDirAndContents(holder_cache_name);
}
}
@@ -5466,6 +5589,30 @@ bool LLAppViewer::errorMarkerExists() const
return LLAPRFile::isExist(error_marker_file, NULL, LL_APR_RB);
}
+void LLAppViewer::createWatchdogMarker() const
+{
+ if (!mSecondInstance)
+ {
+ std::string error_marker = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, WATCHDOG_MARKER_FILE_NAME);
+
+ LLAPRFile file;
+ file.open(error_marker, LL_APR_WB);
+ if (file.getFileHandle())
+ {
+ recordMarkerVersion(file);
+ file.close();
+ }
+ }
+}
+void LLAppViewer::removeWatchdogMarker() const
+{
+ if (!mSecondInstance)
+ {
+ std::string error_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, WATCHDOG_MARKER_FILE_NAME);
+ LLFile::remove(error_marker_file);
+ }
+}
+
void LLAppViewer::outOfMemorySoftQuit()
{
if (!mQuitRequested)
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index c977757e48..d76e5015e9 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -254,6 +254,9 @@ public:
void createErrorMarker(eLastExecEvent error_code) const;
bool errorMarkerExists() const;
+ void createWatchdogMarker() const;
+ void removeWatchdogMarker() const;
+
// Attempt a 'soft' quit with disconnect and saving of settings/cache.
// Intended to be thread safe.
// Good chance of viewer crashing either way, but better than alternatives.
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 94a5f7951e..2e4e9e29d5 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -119,6 +119,7 @@ namespace
// MiniDmpSender pointer. As things stand, though, we must define an
// actual function and store the pointer statically.
static MiniDmpSender *sBugSplatSender = nullptr;
+ static std::string sBugsplatDescriptionField;
bool bugsplatSendLog(UINT nCode, LPVOID lpVal1, LPVOID lpVal2)
{
@@ -155,8 +156,21 @@ namespace
WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "settings_per_account.xml")));
}
- // LL_ERRS message, when there is one
- sBugSplatSender->setDefaultUserDescription(WCSTR(LLError::getFatalMessage()));
+ if (!sBugsplatDescriptionField.empty())
+ {
+ // Can be set by watchdog or other code that detects a problem
+ // and wants to add some context to the crash report.
+ // Will be visible in the BugSplat web UI.
+ sBugSplatSender->setDefaultUserDescription(WCSTR(sBugsplatDescriptionField));
+ // This type of crash is not necessarily a crash, or final.
+ // Prepare for the next one.
+ sBugsplatDescriptionField.clear();
+ }
+ else
+ {
+ // LL_ERRS message, when there is one
+ sBugSplatSender->setDefaultUserDescription(WCSTR(LLError::getFatalMessage()));
+ }
sBugSplatSender->setAttribute(WCSTR(L"OS"), WCSTR(LLOSInfo::instance().getOSStringSimple())); // In case we ever stop using email for this
sBugSplatSender->setAttribute(WCSTR(L"AppState"), WCSTR(LLStartUp::getStartupStateString()));
@@ -433,22 +447,8 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
// commands and exit the process before we do anything else.
if (!velopack_initialize())
{
+ // Obsolete? Always return true
// Velopack handled the invocation (install/uninstall hook)
-
- // Drop install related settings
- gDirUtilp->initAppDirs("SecondLife");
-
- std::string user_settings_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "settings.xml");
- LLControlGroup settings("global");
- if (settings.loadFromFile(user_settings_path))
- {
- // If user reinstalls or updates, we want to recheck for nsis leftovers.
- if (settings.controlExists("PreviousInstallChecked"))
- {
- settings.setBOOL("PreviousInstallChecked", false);
- }
- settings.saveToFile(user_settings_path, true);
- }
return 0;
}
#endif
@@ -862,6 +862,38 @@ bool LLAppViewerWin32::reportCrashToBugsplat(void* pExcepInfo)
return false;
}
+#if defined(LL_BUGSPLAT)
+static int reportCustomToBugsplatFilter(EXCEPTION_POINTERS* pExcepInfo)
+{
+ if (sBugSplatSender)
+ {
+ sBugSplatSender->createReport(pExcepInfo);
+ }
+ return EXCEPTION_EXECUTE_HANDLER;
+}
+#endif
+
+bool LLAppViewerWin32::reportCustomToBugsplat(const std::string &description)
+{
+#if defined(LL_BUGSPLAT)
+ if (sBugSplatSender)
+ {
+ sBugsplatDescriptionField = description;
+
+ __try
+ {
+ // Generate a custom exception code
+ RaiseException(0xE0000001, 0, 0, NULL);
+ }
+ __except (reportCustomToBugsplatFilter(GetExceptionInformation()))
+ {
+ }
+ return true;
+ }
+#endif // LL_BUGSPLAT
+ return false;
+}
+
bool LLAppViewerWin32::initWindow()
{
// This is a workaround/hotfix for a change in Windows 11 24H2 (and possibly later)
diff --git a/indra/newview/llappviewerwin32.h b/indra/newview/llappviewerwin32.h
index 0741758a0c..53177f7f95 100644
--- a/indra/newview/llappviewerwin32.h
+++ b/indra/newview/llappviewerwin32.h
@@ -44,6 +44,7 @@ public:
bool cleanup() override;
bool reportCrashToBugsplat(void* pExcepInfo) override;
+ bool reportCustomToBugsplat(const std::string& description) override;
protected:
bool initWindow() override; // Override to initialize the viewer's window.
diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp
index 97d2345778..ce236dec66 100644
--- a/indra/newview/llcolorswatch.cpp
+++ b/indra/newview/llcolorswatch.cpp
@@ -200,13 +200,14 @@ void LLColorSwatchCtrl::draw()
F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
mBorder->setKeyboardFocusHighlight(hasFocus());
- // Draw border
- LLRect border( 0, getRect().getHeight(), getRect().getWidth(), mLabelHeight );
- gl_rect_2d( border, mBorderColor.get(), false );
- LLRect interior = border;
+ LLRect gl_border(0, getRect().getHeight(), getRect().getWidth(), mLabelHeight);
+ LLColor4 gl_border_color = mBorderColor.get();
+ LLRect interior = gl_border;
interior.stretch( -1 );
+ bool show_border_ctrl = true;
+
// Check state
if ( mValid )
{
@@ -239,7 +240,9 @@ void LLColorSwatchCtrl::draw()
{
if (mFallbackImage.notNull())
{
- mFallbackImage->draw(interior.mLeft, interior.mBottom, interior.getWidth(), interior.getHeight(), LLColor4::white % alpha);
+ mFallbackImage->draw(interior.mLeft - 1, interior.mBottom - 1, mFallbackImage->getWidth(), mFallbackImage->getHeight(), LLColor4::white % alpha);
+ gl_border_color = LLUIColorTable::instance().getColor("ColorSwatchBorderColorGray").get();
+ show_border_ctrl = false;
}
else
{
@@ -250,6 +253,11 @@ void LLColorSwatchCtrl::draw()
}
}
+ mBorder->setVisible(show_border_ctrl);
+
+ // Draw border
+ gl_rect_2d(gl_border, gl_border_color, false);
+
LLUICtrl::draw();
}
diff --git a/indra/newview/lleventpoll.cpp b/indra/newview/lleventpoll.cpp
index f1b46f0533..9eddec55c5 100644
--- a/indra/newview/lleventpoll.cpp
+++ b/indra/newview/lleventpoll.cpp
@@ -73,9 +73,9 @@ namespace Details
// We will wait RETRY_SECONDS + (errorCount * RETRY_SECONDS_INC) before retrying after an error.
// This means we attempt to recover relatively quickly but back off giving more time to recover
// until we finally give up after MAX_EVENT_POLL_HTTP_ERRORS attempts.
- constexpr F32 EVENT_POLL_ERROR_RETRY_SECONDS = 15.f; // ~ half of a normal timeout.
- constexpr F32 EVENT_POLL_ERROR_RETRY_SECONDS_INC = 5.f; // ~ half of a normal timeout.
- constexpr S32 MAX_EVENT_POLL_HTTP_ERRORS = 10; // ~5 minutes, by the above rules.
+ constexpr F32 EVENT_POLL_ERROR_RETRY_SECONDS = 1.f;
+ constexpr F32 EVENT_POLL_ERROR_RETRY_SECONDS_INC = 3.f;
+ constexpr S32 MAX_EVENT_POLL_ERRORS = 15; // ~5 minutes, by the above rules.
constexpr F64 MIN_SECONDS_PASSED = 10.0; // Minimum time we expect the server to hold the request.
int LLEventPollImpl::sNextCounter = 1;
@@ -238,23 +238,26 @@ namespace Details
}
else if (!status.isHttpStatus())
{
- /// Some LLCore or LIBCurl error was returned. This is unlikely to be recoverable
- LL_WARNS("LLEventPollImpl") << "<" << counter << "> Critical error from poll request returned from libraries. Canceling coroutine." << LL_ENDL;
- break;
+ // Some LLCore or LIBCurl error was returned.
+ LL_WARNS("LLEventPollImpl") << "<" << counter << "> Error from poll request returned from libraries. " << status.toTerseString() << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS("LLEventPollImpl") << "<" << counter << "> Error result from LLCoreHttpUtil::HttpCoroHandler. Code "
+ << status.toTerseString() << ": '" << httpResults["message"] << "'" << LL_ENDL;
}
- LL_WARNS("LLEventPollImpl") << "<" << counter << "> Error result from LLCoreHttpUtil::HttpCoroHandler. Code "
- << status.toTerseString() << ": '" << httpResults["message"] << "'" << LL_ENDL;
- if (errorCount < MAX_EVENT_POLL_HTTP_ERRORS)
+ if (errorCount < MAX_EVENT_POLL_ERRORS)
{ // An unanticipated error has been received from our poll
// request. Calculate a timeout and wait for it to expire(sleep)
- // before trying again. The sleep time is increased by 5 seconds
+ // before trying again. The sleep time is increased by 3 seconds
// for each consecutive error.
- ++errorCount;
F32 waitToRetry = EVENT_POLL_ERROR_RETRY_SECONDS
+ errorCount * EVENT_POLL_ERROR_RETRY_SECONDS_INC;
+ ++errorCount;
+
LL_WARNS("LLEventPollImpl") << "<" << counter << "> Retrying in " << waitToRetry <<
" seconds, error count is now " << errorCount << LL_ENDL;
diff --git a/indra/newview/llfilepicker_mac.mm b/indra/newview/llfilepicker_mac.mm
index 7262d18483..99e93bafbf 100644
--- a/indra/newview/llfilepicker_mac.mm
+++ b/indra/newview/llfilepicker_mac.mm
@@ -245,8 +245,8 @@ void doSaveDialogModeless(const std::string* file,
NSURL *last_url = [[NSUserDefaults standardUserDefaults] URLForKey:@"NSNavLastRootDirectory"];
if(!last_url)
{
- NSURL *documents_url = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].firstObject;
- [panel setDirectoryURL:documents_url];
+ NSURL *downloads_url = [[NSFileManager defaultManager] URLsForDirectory:NSDownloadsDirectory inDomains:NSUserDomainMask].firstObject;
+ [panel setDirectoryURL:downloads_url];
}
[panel beginWithCompletionHandler:^(NSModalResponse result)
diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index e80133f93c..ef4252eba6 100644
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -57,6 +57,8 @@
#include "llsdserialize.h"
#include "llviewermenu.h" // is_agent_mappable
#include "llviewerobjectlist.h"
+#include "llvoavatar.h"
+#include "llnearbyvoicemoderation.h"
const S32 EVENTS_PER_IDLE_LOOP_CURRENT_SESSION = 80;
@@ -90,6 +92,7 @@ LLFloaterIMContainer::LLFloaterIMContainer(const LLSD& seed, const Params& param
mAutoResize = false;
LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::IM, this);
+ LLNearbyVoiceModeration::getInstance();
}
LLFloaterIMContainer::~LLFloaterIMContainer()
@@ -530,6 +533,33 @@ void LLFloaterIMContainer::idleUpdate()
mGeneralTitleInUse = !needs_override;
setTitle(needs_override ? conversation_floaterp->getTitle() : mGeneralTitle);
}
+ const LLConversationItem* nearby_session = getSessionModel(LLUUID());
+ if (nearby_session)
+ {
+ LLSpeakerMgr* speaker_mgr = (LLSpeakerMgr*)(LLLocalSpeakerMgr::getInstance());
+
+ LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = nearby_session->getChildrenBegin();
+ LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = nearby_session->getChildrenEnd();
+ while (current_participant_model != end_participant_model)
+ {
+ LLConversationItemParticipant* participant_model =
+ dynamic_cast<LLConversationItemParticipant*>((*current_participant_model).get());
+ if (participant_model)
+ {
+ bool show_moderator_options = LLNearbyVoiceModeration::getInstance()->isNearbyChatModerator();
+ LLUUID participant_id = participant_model->getUUID();
+ if (participant_id != gAgentID)
+ {
+ // Don't show moderator options if participant is not connected to the same spatial channel
+ LLSpeaker* speakerp = speaker_mgr->findSpeaker(participant_id).get();
+ show_moderator_options &= speakerp && speakerp->isInVoiceChannel();
+ }
+ participant_model->setModeratorOptionsVisible(show_moderator_options);
+ }
+
+ current_participant_model++;
+ }
+ }
}
mParticipantRefreshTimer.setTimerExpirySec(1.0f);
@@ -1685,6 +1715,10 @@ bool LLFloaterIMContainer::visibleContextMenuItem(const LLSD& userdata)
{
return isMuted(conversation_item->getUUID());
}
+ else if ("can_allow_text_chat" == item)
+ {
+ return !isNearbyChatSpeakerSelected();
+ }
return true;
}
@@ -2014,9 +2048,27 @@ LLConversationViewParticipant* LLFloaterIMContainer::createConversationViewParti
bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& userdata, bool is_self)
{
- // only group moderators can perform actions related to this "enable callback"
- if (!isGroupModerator())
+ if (LLNearbyVoiceModeration::getInstance()->isNearbyChatModerator() && isNearbyChatSpeakerSelected())
{
+ // Determine here which actions are allowed
+ if ("can_moderate_voice" == userdata)
+ {
+ return true;
+ }
+ else if (("can_mute" == userdata))
+ {
+ return !is_self;
+ }
+ else if ("can_unmute" == userdata)
+ {
+ return true;
+ }
+
+ return false;
+ }
+ else if (!isGroupModerator())
+ {
+ // only group moderators can perform actions related to this "enable callback"
return false;
}
@@ -2149,7 +2201,35 @@ void LLFloaterIMContainer::banSelectedMember(const LLUUID& participant_uuid)
void LLFloaterIMContainer::moderateVoice(const std::string& command, const LLUUID& userID)
{
- if (!gAgent.getRegion()) return;
+ if (!gAgent.getRegion())
+ {
+ return;
+ }
+
+ if (isNearbyChatSpeakerSelected())
+ {
+ if ("selected" == command)
+ {
+ // Request a mute/unmute using a capability request via the simulator
+ LLNearbyVoiceModeration::getInstance()->requestMuteIndividual(userID, !isMuted(userID));
+ }
+ else
+ if ("mute_all" == command)
+ {
+ // Send the mute_all request to the server
+ const bool mute_state = true;
+ LLNearbyVoiceModeration::getInstance()->requestMuteAll(mute_state);
+ }
+ else
+ if ("unmute_all" == command)
+ {
+ // Send the unmute_all request to the server
+ const bool mute_state = false;
+ LLNearbyVoiceModeration::getInstance()->requestMuteAll(mute_state);
+ }
+
+ return;
+ }
if (command.compare("selected"))
{
@@ -2267,6 +2347,31 @@ LLSpeaker * LLFloaterIMContainer::getSpeakerOfSelectedParticipant(LLSpeakerMgr *
return speaker_managerp->findSpeaker(participant_itemp->getUUID());
}
+bool LLFloaterIMContainer::isNearbyChatSpeakerSelected()
+{
+ LLFolderViewItem *selectedItem = mConversationsRoot->getCurSelectedItem();
+ if (!selectedItem)
+ {
+ LL_WARNS() << "Current selected item is null" << LL_ENDL;
+ return NULL;
+ }
+
+ conversations_widgets_map::const_iterator iter = mConversationsWidgets.begin();
+ conversations_widgets_map::const_iterator end = mConversationsWidgets.end();
+ const LLUUID * conversation_uuidp = NULL;
+ while(iter != end)
+ {
+ if (iter->second == selectedItem || iter->second == selectedItem->getParentFolder())
+ {
+ conversation_uuidp = &iter->first;
+ break;
+ }
+ ++iter;
+ }
+ // Nearby chat ID is LLUUID::null
+ return conversation_uuidp->isNull();
+}
+
void LLFloaterIMContainer::toggleAllowTextChat(const LLUUID& participant_uuid)
{
LLIMSpeakerMgr * speaker_managerp = dynamic_cast<LLIMSpeakerMgr*>(getSpeakerMgrForSelectedParticipant());
diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h
index 30eed8be36..9f1690a9b9 100644
--- a/indra/newview/llfloaterimcontainer.h
+++ b/indra/newview/llfloaterimcontainer.h
@@ -178,6 +178,7 @@ private:
void banSelectedMember(const LLUUID& participant_uuid);
void openNearbyChat();
bool isParticipantListExpanded();
+ bool isNearbyChatSpeakerSelected();
void idleUpdate(); // for convenience (self) from static idle
void idleProcessEvents();
diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp
index 6d642638b3..73bce6f2fd 100644
--- a/indra/newview/llfloaterimsession.cpp
+++ b/indra/newview/llfloaterimsession.cpp
@@ -1056,7 +1056,7 @@ void LLFloaterIMSession::processAgentListUpdates(const LLSD& body)
if (moderator_muted_text)
label = LLTrans::getString("IM_muted_text_label");
else
- label = LLTrans::getString("IM_to_label") + " " + LLIMModel::instance().getName(mSessionID);
+ label = LLIMModel::instance().getName(mSessionID);
mInputEditor->setLabel(label);
if (moderator_muted_text)
diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp
index 453161b792..b70d21e2c5 100644
--- a/indra/newview/llfloaterimsessiontab.cpp
+++ b/indra/newview/llfloaterimsessiontab.cpp
@@ -935,7 +935,7 @@ void LLFloaterIMSessionTab::hideOrShowTitle()
void LLFloaterIMSessionTab::updateSessionName(const std::string& name)
{
- mInputEditor->setLabel(LLTrans::getString("IM_to_label") + " " + name);
+ mInputEditor->setLabel(name);
}
void LLFloaterIMSessionTab::updateChatIcon(const LLUUID& id)
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 20bda5039d..fb6ecedcbf 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -2847,8 +2847,44 @@ void LLMeshUploadThread::packModelIntance(
texture_index.find(texture) == texture_index.end())
{
texture_index[texture] = texture_num;
- std::string str = texture_str.str();
- res["texture_list"][texture_num] = LLSD::Binary(str.begin(), str.end());
+ if (include_textures)
+ {
+ std::string str = texture_str.str();
+ res["texture_list"][texture_num] = LLSD::Binary(str.begin(), str.end());
+ }
+ else
+ { // When not including the whole texture, we need to send some metadata about the image
+ // to ensure accurate price estimation. If not included, the server will assume all
+ // textures are 1024 x 1024, which could lead to a low estimate.
+ LLSD info = LLSD::emptyMap();
+
+ S32 texture_width = 0;
+ S32 texture_height = 0;
+ if (texture->hasSavedRawImage())
+ {
+ LLImageDataLock lock(texture->getSavedRawImage());
+
+ LLPointer<LLImageJ2C> upload_file = LLViewerTextureList::convertToUploadFile(texture->getSavedRawImage());
+
+ if (!upload_file.isNull() && upload_file->getDataSize() && !upload_file->isBufferInvalid())
+ {
+ texture_width = upload_file->getWidth();
+ texture_height = upload_file->getHeight();
+ }
+ }
+
+ if ((texture_width <= 0) || (texture_height <= 0))
+ {
+ // Fall back to the texture's stored dimensions if we can't get dimensions from the raw image.
+ texture_width = texture->getFullWidth();
+ texture_height = texture->getFullHeight();
+ }
+
+ info["width"] = texture_width;
+ info["height"] = texture_height;
+ res["texture_info"][texture_num] = info;
+ res["texture_list"][texture_num] = LLSD::Binary(); // empty binary to indicate texture is not included, for older server compatibility
+ }
// store indexes for error handling;
texture_list_dest.push_back(material.mDiffuseMapFilename);
texture_num++;
@@ -2881,8 +2917,8 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, std::vector<std::string>&
LLSD res;
if (mDestinationFolderId.isNull())
{
- result["folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_OBJECT);
- result["texture_folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE);
+ result["folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_OBJECT);
+ result["texture_folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE);
}
else
{
diff --git a/indra/newview/llnearbyvoicemoderation.cpp b/indra/newview/llnearbyvoicemoderation.cpp
new file mode 100644
index 0000000000..a5ee0e9423
--- /dev/null
+++ b/indra/newview/llnearbyvoicemoderation.cpp
@@ -0,0 +1,220 @@
+/**
+ * @file llnearbyvoicemoderation.cpp
+ *
+ * $LicenseInfo:firstyear=2008&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 "llagent.h"
+#include "llnotificationsutil.h"
+#include "llviewerregion.h"
+#include "llvoavatar.h"
+#include "llvoicechannel.h"
+#include "llvoiceclient.h"
+#include "llviewerobjectlist.h"
+#include "llviewerparcelmgr.h"
+#include "roles_constants.h"
+
+#include "llnearbyvoicemoderation.h"
+
+LLNearbyVoiceModeration::LLNearbyVoiceModeration()
+{
+}
+
+LLNearbyVoiceModeration::~LLNearbyVoiceModeration()
+{
+}
+
+LLVOAvatar* LLNearbyVoiceModeration::getVOAvatarFromId(const LLUUID& agent_id)
+{
+ LLViewerObject *obj = gObjectList.findObject(agent_id);
+ while (obj && obj->isAttachment())
+ {
+ obj = (LLViewerObject*)obj->getParent();
+ }
+
+ if (obj && obj->isAvatar())
+ {
+ return (LLVOAvatar*)obj;
+ }
+ else
+ {
+ return NULL;
+ }
+}
+
+const std::string LLNearbyVoiceModeration::getCapUrlFromRegion(LLViewerRegion* region)
+{
+ if (! region || ! region->capabilitiesReceived())
+ {
+ return std::string();
+ }
+
+ std::string url = region->getCapability("SpatialVoiceModerationRequest");
+ if (url.empty())
+ {
+ LL_INFOS() << "Capability URL for region " << region->getName() << " is empty" << LL_ENDL;
+ return std::string();
+ }
+ LL_INFOS() << "Capability URL for region " << region->getName() << " is " << url << LL_ENDL;
+
+ return url;
+}
+
+void LLNearbyVoiceModeration::requestMuteIndividual(const LLUUID& agent_id, bool mute)
+{
+ LLVOAvatar* avatar = getVOAvatarFromId(agent_id);
+ if (avatar)
+ {
+ const std::string cap_url = getCapUrlFromRegion(avatar->getRegion());
+ if (cap_url.length())
+ {
+ const std::string operand = mute ? "mute" : "unmute";
+
+ LLSD body;
+ body["operand"] = operand;
+ body["agent_id"] = agent_id;
+
+ const std::string agent_name = avatar->getFullname();
+ LL_INFOS() << "Resident " << agent_name
+ << " (" << agent_id << ")" << " applying " << operand << LL_ENDL;
+
+ std::string success_msg =
+ STRINGIZE("Resident " << agent_name
+ << " (" << agent_id << ")" << " nearby voice was set to " << operand);
+
+ std::string failure_msg =
+ STRINGIZE("Unable to change voice muting for resident "
+ << agent_name << " (" << agent_id << ")");
+
+ LLCoreHttpUtil::HttpCoroutineAdapter::messageHttpPost(
+ cap_url,
+ body,
+ success_msg,
+ failure_msg);
+ }
+ }
+}
+
+void LLNearbyVoiceModeration::requestMuteAll(bool mute)
+{
+ // Use our own avatar to get the region name
+ LLViewerRegion* region = gAgent.getRegion();
+
+ const std::string cap_url = getCapUrlFromRegion(region);
+ if (cap_url.length())
+ {
+ const std::string operand = mute ? "mute_all" : "unmute_all";
+
+ LLSD body;
+ body["operand"] = operand;
+
+ LL_INFOS() << "For all residents in this region, applying: " << operand << LL_ENDL;
+
+ std::string success_msg =
+ STRINGIZE("Nearby voice for all residents was set to: " << operand);
+
+ std::string failure_msg =
+ STRINGIZE("Unable to set nearby voice for all residents to: " << operand);
+
+ LLCoreHttpUtil::HttpCoroutineAdapter::messageHttpPost(
+ cap_url,
+ body,
+ success_msg,
+ failure_msg);
+ }
+}
+
+void LLNearbyVoiceModeration::setMutedInfo(const std::string& channelID, bool mute)
+{
+ auto it = mChannelMuteMap.find(channelID);
+ if (it == mChannelMuteMap.end())
+ {
+ if (mute)
+ {
+ // Channel is new and being muted
+ showMutedNotification(true);
+ }
+ mChannelMuteMap[channelID] = mute;
+ }
+ else
+ {
+ if (it->second != mute)
+ {
+ // Flag changed
+ showMutedNotification(mute);
+ it->second = mute;
+ }
+ }
+ if (mute && LLVoiceClient::getInstance()->getUserPTTState())
+ {
+ LLVoiceClient::getInstance()->setUserPTTState(false);
+ }
+}
+
+bool LLNearbyVoiceModeration::showNotificationIfNeeded()
+{
+ if (LLVoiceClient::getInstance()->inProximalChannel() &&
+ LLVoiceClient::getInstance()->getIsModeratorMuted(gAgentID))
+ {
+ return showMutedNotification(true);
+ }
+ return false;
+}
+
+bool LLNearbyVoiceModeration::showMutedNotification(bool is_muted)
+{
+ // Check if the current voice channel is nearby chat
+ if (LLVoiceClient::getInstance()->inProximalChannel())
+ {
+ LLNotificationsUtil::add(is_muted ? "NearbyVoiceMutedByModerator" : "NearbyVoiceUnmutedByModerator");
+ return true;
+ }
+ return false;
+}
+
+bool LLNearbyVoiceModeration::isNearbyChatModerator()
+{
+ // Region doesn't support WebRTC voice
+ if (!gAgent.getRegion() || !gAgent.getRegion()->isRegionWebRTCEnabled())
+ {
+ return false;
+ }
+
+ // Only show moderator options when connected to spatial voice chat
+ LLVoiceChannel* channel = LLVoiceChannel::getCurrentVoiceChannel();
+ if (!channel || channel->getSessionID().notNull() || !LLAgent::isActionAllowed("speak"))
+ {
+ return false;
+ }
+
+ if (LLViewerParcelMgr::getInstance()->isVoiceRestricted())
+ {
+ // Only the parcel owner should have access to moderate parcel voice space
+ return LLViewerParcelMgr::getInstance()->allowVoiceModeration();
+ }
+ else
+ {
+ return gAgent.canManageEstate();
+ }
+}
diff --git a/indra/newview/llnearbyvoicemoderation.h b/indra/newview/llnearbyvoicemoderation.h
new file mode 100644
index 0000000000..619f169883
--- /dev/null
+++ b/indra/newview/llnearbyvoicemoderation.h
@@ -0,0 +1,50 @@
+/**
+ * @file llnearbyvoicemoderation.h
+ *
+ * $LicenseInfo:firstyear=2008&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$
+ */
+
+#pragma once
+
+class LLVOAvatar;
+
+class LLNearbyVoiceModeration : public LLSingleton <LLNearbyVoiceModeration> {
+ LLSINGLETON(LLNearbyVoiceModeration);
+ ~LLNearbyVoiceModeration();
+
+ public:
+ void requestMuteIndividual(const LLUUID& userID, bool mute);
+ void requestMuteAll(bool mute);
+
+ void setMutedInfo(const std::string& channelID, bool mute);
+ bool showMutedNotification(bool is_muted);
+ bool showNotificationIfNeeded();
+
+ bool isNearbyChatModerator();
+
+ private:
+ LLVOAvatar* getVOAvatarFromId(const LLUUID& id);
+ const std::string getCapUrlFromRegion(LLViewerRegion* region);
+
+ boost::signals2::connection mParcelCallbackConnection;
+ std::map<std::string, bool> mChannelMuteMap;
+};
diff --git a/indra/newview/llnotificationlistitem.cpp b/indra/newview/llnotificationlistitem.cpp
index 9a33bcb1b9..4939cd5fbb 100644
--- a/indra/newview/llnotificationlistitem.cpp
+++ b/indra/newview/llnotificationlistitem.cpp
@@ -175,13 +175,15 @@ void LLNotificationListItem::onMouseEnter(S32 x, S32 y, MASK mask)
{
mCondensedViewPanel->setTransparentColor(LLUIColorTable::instance().getColor( "ScrollHoveredColor" ));
mExpandedViewPanel->setTransparentColor(LLUIColorTable::instance().getColor( "ScrollHoveredColor" ));
+ mNoticeTextExp->setBgReadOnlyColor(LLUIColorTable::instance().getColor("SelectedBgReadOnlyColor"));
}
void LLNotificationListItem::onMouseLeave(S32 x, S32 y, MASK mask)
{
mCondensedViewPanel->setTransparentColor(LLUIColorTable::instance().getColor( "SysWellItemUnselected" ));
mExpandedViewPanel->setTransparentColor(LLUIColorTable::instance().getColor( "SysWellItemUnselected" ));
-}
+ mNoticeTextExp->setBgReadOnlyColor(LLUIColorTable::instance().getColor("TextBgReadOnlyColor"));
+ }
//static
LLNotificationListItem* LLNotificationListItem::create(const Params& p)
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 128ba42efd..345426824e 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -1927,7 +1927,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
if (mColorSwatch)
{
mColorSwatch->setEnabled( false );
- mColorSwatch->setFallbackImage(LLUI::getUIImage("locked_image.j2c") );
+ mColorSwatch->setFallbackImage(LLUI::getUIImage("locked_image") );
mColorSwatch->setValid(false);
}
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 0cfb3ec49a..15cc8b421c 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -51,6 +51,7 @@
#include "llstartup.h"
#include "lltextbox.h"
#include "llui.h"
+#include "llframetimer.h"
#include "lluiconstants.h"
#include "llslurl.h"
#include "llversioninfo.h"
@@ -177,6 +178,19 @@ public:
};
LLLoginLocationAutoHandler gLoginLocationAutoHandler;
+std::string getShortGridLabel(const std::string& slurl_grid)
+{
+ if (slurl_grid == MAINGRID)
+ {
+ return LLTrans::getString("AgniGridLabelShort");
+ }
+ if (slurl_grid == BETAGRID)
+ {
+ return LLTrans::getString("AditiGridLabelShort");
+ }
+ return LLGridManager::getInstance()->getGridLabel(slurl_grid);
+}
+
//---------------------------------------------------------------------------
// Public methods
//---------------------------------------------------------------------------
@@ -187,7 +201,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
mCallback(callback),
mCallbackData(cb_data),
mListener(std::make_unique<LLPanelLoginListener>(this)),
- mFirstLoginThisInstall(gSavedSettings.getBOOL("FirstLoginThisInstall")),
mUsernameLength(0),
mPasswordLength(0),
mLocationLength(0),
@@ -207,15 +220,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
login_holder->addChild(this);
}
- if (mFirstLoginThisInstall)
- {
- buildFromFile( "panel_login_first.xml");
- }
- else
- {
- buildFromFile( "panel_login.xml");
- }
-
+ buildFromFile( "panel_login.xml");
reshape(rect.getWidth(), rect.getHeight());
LLLineEditor* password_edit(getChild<LLLineEditor>("password_edit"));
@@ -224,17 +229,19 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
password_edit->setCommitCallback(boost::bind(&LLPanelLogin::onClickConnect, false));
childSetAction("connect_btn", onClickConnect, this);
+ childSetAction("sign_btn", onClickSignUp, this);
mLoginBtn = getChild<LLButton>("connect_btn");
setDefaultBtn(mLoginBtn);
// change z sort of clickable text to be behind buttons
sendChildToBack(getChildView("forgot_password_text"));
- sendChildToBack(getChildView("sign_up_text"));
+
+ mLoginStack = getChild<LLLayoutStack>("login_stack");
+ mGridPanel = getChild<LLLayoutPanel>("grid_panel");
std::string current_grid = LLGridManager::getInstance()->getGrid();
- if (!mFirstLoginThisInstall)
- {
+
LLComboBox* favorites_combo = getChild<LLComboBox>("start_location_combo");
updateLocationSelectorsVisibility(); // separate so that it can be called from preferences
favorites_combo->setReturnCallback(boost::bind(&LLPanelLogin::onClickConnect, false));
@@ -254,17 +261,16 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
if (!grid_choice->first.empty() && current_grid != grid_choice->first)
{
LL_DEBUGS("AppInit") << "adding " << grid_choice->first << LL_ENDL;
- server_choice_combo->add(grid_choice->second, grid_choice->first);
+ server_choice_combo->add(getShortGridLabel(grid_choice->first), grid_choice->first);
}
}
server_choice_combo->sortByName();
LL_DEBUGS("AppInit") << "adding current " << current_grid << LL_ENDL;
- server_choice_combo->add(LLGridManager::getInstance()->getGridLabel(),
+ server_choice_combo->add(getShortGridLabel(current_grid),
current_grid,
ADD_TOP);
server_choice_combo->selectFirstItem();
- }
LLSLURL start_slurl(LLStartUp::getStartSLURL());
// The StartSLURL might have been set either by an explicit command-line
@@ -311,12 +317,9 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
LLTextBox* forgot_password_text = getChild<LLTextBox>("forgot_password_text");
forgot_password_text->setClickedCallback(onClickForgotPassword, NULL);
- LLTextBox* sign_up_text = getChild<LLTextBox>("sign_up_text");
- sign_up_text->setClickedCallback(onClickSignUp, NULL);
-
// get the web browser control
- LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
- web_browser->addObserver(this);
+ mWebBrowser = getChild<LLMediaCtrl>("login_html");
+ mWebBrowser->addObserver(this);
loadLoginPage();
@@ -337,15 +340,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
void LLPanelLogin::addFavoritesToStartLocation()
{
- if (mFirstLoginThisInstall)
- {
- // first login panel has no favorites, just update name length and buttons
- std::string user_defined_name = getChild<LLComboBox>("username_combo")->getSimple();
- mUsernameLength = static_cast<unsigned int>(user_defined_name.length());
- updateLoginButtons();
- return;
- }
-
// Clear the combo.
LLComboBox* combo = getChild<LLComboBox>("start_location_combo");
if (!combo) return;
@@ -565,16 +559,8 @@ void LLPanelLogin::resetFields()
// function is used to reset list in case of changes by external sources
return;
}
- if (sInstance->mFirstLoginThisInstall)
- {
- // no list to populate
- LL_WARNS() << "Shouldn't happen, user should have no ability to modify list on first install" << LL_ENDL;
- }
- else
- {
- LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
- sInstance->populateUserList(cred);
- }
+ LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
+ sInstance->populateUserList(cred);
}
// static
@@ -755,6 +741,11 @@ void LLPanelLogin::updateLocationSelectorsVisibility()
{
server_combo->setVisible(show_server);
}
+ if (LLTextBox* grid_txt = sInstance->getChild<LLTextBox>("grid_text"))
+ {
+ grid_txt->setVisible(show_server);
+ }
+ sInstance->collapseGridPanel(!show_server);
}
}
@@ -790,7 +781,7 @@ void LLPanelLogin::onUpdateStartSLURL(const LLSLURL& new_start_slurl)
// update the grid selector to match the slurl
LLComboBox* server_combo = sInstance->getChild<LLComboBox>("server_combo");
- std::string server_label(LLGridManager::getInstance()->getGridLabel(slurl_grid));
+ std::string server_label(getShortGridLabel(slurl_grid));
server_combo->setSimple(server_label);
updateServer(); // to change the links and splash screen
@@ -863,11 +854,9 @@ void LLPanelLogin::setAlwaysRefresh(bool refresh)
{
if (sInstance && LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP)
{
- LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
-
- if (web_browser)
+ if (sInstance->mWebBrowser)
{
- web_browser->setAlwaysRefresh(refresh);
+ sInstance->mWebBrowser->setAlwaysRefresh(refresh);
}
}
}
@@ -924,16 +913,35 @@ void LLPanelLogin::loadLoginPage()
gViewerWindow->setMenuBackgroundColor(false, !LLGridManager::getInstance()->isInProductionGrid());
- LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
- if (web_browser->getCurrentNavUrl() != login_uri.asString())
+ if (sInstance->mWebBrowser)
+ {
+ if (sInstance->mWebBrowser->getCurrentNavUrl() != login_uri.asString())
+ {
+ LL_DEBUGS("AppInit") << "loading: " << login_uri << LL_ENDL;
+ sInstance->mWebBrowser->navigateTo(login_uri.asString(), "text/html");
+ }
+ }
+ else
{
- LL_DEBUGS("AppInit") << "loading: " << login_uri << LL_ENDL;
- web_browser->navigateTo( login_uri.asString(), "text/html" );
+ LL_WARNS("AppInit") << "No web browser control for login panel" << LL_ENDL;
}
}
-void LLPanelLogin::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent event)
+void LLPanelLogin::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
{
+ constexpr F32 REFRESH_DELAY = 2.f;
+ switch (event)
+ {
+ case MEDIA_EVENT_SIZE_CHANGED:
+ {
+ mForceRefreshTimer.reset();
+ mForceRefreshTimer.setTimerExpirySec(REFRESH_DELAY);
+ mForceRefresh = true;
+ break;
+ }
+ default:
+ break;
+ }
}
//---------------------------------------------------------------------------
@@ -1100,8 +1108,7 @@ void LLPanelLogin::onRememberUserCheck(void*)
LLComboBox* user_combo(sInstance->getChild<LLComboBox>("username_combo"));
bool remember = remember_name->getValue().asBoolean();
- if (!sInstance->mFirstLoginThisInstall
- && user_combo->getCurrentIndex() != -1
+ if (user_combo->getCurrentIndex() != -1
&& !remember)
{
remember = true;
@@ -1214,17 +1221,14 @@ void LLPanelLogin::updateLoginButtons()
{
mLoginBtn->setEnabled(mUsernameLength != 0 && mPasswordLength != 0 && !mAlertNotif);
- if (!mFirstLoginThisInstall)
+ LLComboBox* user_combo = getChild<LLComboBox>("username_combo");
+ LLCheckBoxCtrl* remember_name = getChild<LLCheckBoxCtrl>("remember_name");
+ if (user_combo->getCurrentIndex() != -1)
{
- LLComboBox* user_combo = getChild<LLComboBox>("username_combo");
- LLCheckBoxCtrl* remember_name = getChild<LLCheckBoxCtrl>("remember_name");
- if (user_combo->getCurrentIndex() != -1)
- {
- remember_name->setValue(true);
- LLCheckBoxCtrl* remember_pass = getChild<LLCheckBoxCtrl>("remember_password");
- remember_pass->setEnabled(true);
- } // Note: might be good idea to do "else remember_name->setValue(mRememberedState)" but it might behave 'weird' to user
- }
+ remember_name->setValue(true);
+ LLCheckBoxCtrl* remember_pass = getChild<LLCheckBoxCtrl>("remember_password");
+ remember_pass->setEnabled(true);
+ } // Note: might be good idea to do "else remember_name->setValue(mRememberedState)" but it might behave 'weird' to user
}
void LLPanelLogin::populateUserList(LLPointer<LLCredential> credential)
@@ -1403,3 +1407,29 @@ bool LLPanelLogin::onUpdateNotification(const LLSD& notify)
}
return false;
}
+
+void LLPanelLogin::collapseGridPanel(bool collapse)
+{
+ if (mGridPanel->isCollapsed() == collapse)
+ {
+ return;
+ }
+ mLoginStack->collapsePanel(mGridPanel, collapse);
+ mLoginStack->updateLayout();
+}
+
+void LLPanelLogin::draw()
+{
+ LLPanel::draw();
+
+ // Workaround for the black screen issue (see #5607)
+ // Should be removed after the proper fix for resizing is implemented
+ if (mForceRefresh && mForceRefreshTimer.hasExpired())
+ {
+ if (mWebBrowser->getMediaPlugin())
+ {
+ mWebBrowser->getMediaPlugin()->forceRenderRefresh();
+ }
+ mForceRefresh = false;
+ }
+}
diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h
index f527aa53ac..a00081795e 100644
--- a/indra/newview/llpanellogin.h
+++ b/indra/newview/llpanellogin.h
@@ -48,6 +48,8 @@ public:
void *callback_data);
~LLPanelLogin();
+ void draw();
+
virtual void setFocus( bool b );
static void show(const LLRect &rect,
@@ -87,6 +89,8 @@ public:
// extract name from cred in a format apropriate for username field
static std::string getUserName(LLPointer<LLCredential> &cred);
+ void collapseGridPanel(bool collapse);
+
private:
friend class LLPanelLoginListener;
void addFavoritesToStartLocation();
@@ -122,7 +126,6 @@ private:
static LLPanelLogin* sInstance;
static bool sCapslockDidNotification;
- bool mFirstLoginThisInstall;
static bool sCredentialSet;
@@ -130,8 +133,15 @@ private:
unsigned int mPasswordLength;
unsigned int mLocationLength;
+ LLTimer mForceRefreshTimer;
+ bool mForceRefresh {false};
+
bool mAlertNotif;
LLButton* mLoginBtn;
+ LLLayoutPanel* mGridPanel;
+ LLLayoutStack* mLoginStack;
+
+ LLMediaCtrl* mWebBrowser;
};
#endif
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 9bdfbaedc8..55f23eb021 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -2632,8 +2632,9 @@ void uninstall_nsis_if_required()
S32 found_minor = 0;
S32 found_patch = 0;
U64 found_build = 0;
+ std::string nsis_path;
- if (!get_nsis_version(found_major, found_minor, found_patch, found_build))
+ if (!get_nsis_version(found_major, found_minor, found_patch, found_build, nsis_path))
{
return;
}
@@ -2665,7 +2666,7 @@ void uninstall_nsis_if_required()
// so there is no point to check build.
LL_INFOS() << "Found NSIS install " << found_major << "." << found_minor << "." << found_patch << "." << found_build << LL_ENDL;
- clear_nsis_links();
+ clear_nsis_links(nsis_path);
LLSD args;
args["VERSION"] = llformat("%d.%d.%d", found_major, found_minor, found_patch);
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index eb77343fd3..3de61dffc7 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -47,7 +47,7 @@
const S32 BOTTOM_PAD = VPAD * 3;
const S32 IGNORE_BTN_TOP_DELTA = 3*VPAD;//additional ignore_btn padding
-S32 BUTTON_WIDTH = 90;
+const S32 BUTTON_WIDTH = 90;
//static
@@ -59,7 +59,8 @@ LLToastNotifyPanel::button_click_signal_t LLToastNotifyPanel::sButtonClickSignal
LLToastNotifyPanel::LLToastNotifyPanel(const LLNotificationPtr& notification, const LLRect& rect, bool show_images)
: LLCheckBoxToastPanel(notification)
, LLInstanceTracker<LLToastNotifyPanel, LLUUID, LLInstanceTrackerReplaceOnCollision>(notification->getID())
-, mTextBox(NULL)
+, mTextBox(NULL),
+ mButtonWidth(BUTTON_WIDTH)
{
init(rect, show_images);
}
@@ -70,9 +71,9 @@ void LLToastNotifyPanel::addDefaultButton()
LLButton* ok_btn = createButton(form_element, false);
LLRect new_btn_rect(ok_btn->getRect());
- new_btn_rect.setOriginAndSize(llabs(getRect().getWidth() - BUTTON_WIDTH)/ 2, BOTTOM_PAD,
+ new_btn_rect.setOriginAndSize(llabs(getRect().getWidth() - mButtonWidth) / 2, BOTTOM_PAD,
//auto_size for ok button makes it very small, so let's make it wider
- BUTTON_WIDTH, new_btn_rect.getHeight());
+ mButtonWidth, new_btn_rect.getHeight());
ok_btn->setRect(new_btn_rect);
addChild(ok_btn, -1);
mNumButtons = 1;
@@ -115,7 +116,7 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, bool is_opt
p.font = font;
p.rect.height = BTN_HEIGHT;
p.click_callback.function(boost::bind(&LLToastNotifyPanel::onClickButton, userdata));
- p.rect.width = BUTTON_WIDTH;
+ p.rect.width = mButtonWidth;
p.auto_resize = false;
p.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);
p.enabled = !form_element.has("enabled") || form_element["enabled"].asBoolean();
@@ -125,7 +126,7 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, bool is_opt
p.image_color_disabled(LLUIColorTable::instance().getColor("ButtonCautionImageColor"));
}
// for the scriptdialog buttons we use fixed button size. This is a limit!
- if (!mIsScriptDialog && font->getWidth(form_element["text"].asString()) > (BUTTON_WIDTH-2*HPAD))
+ if (!mIsScriptDialog && font->getWidth(form_element["text"].asString()) > (mButtonWidth - 2 * HPAD))
{
p.rect.width = 1;
p.auto_resize = true;
@@ -290,7 +291,7 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images )
mInfoPanel = getChild<LLPanel>("info_panel");
mControlPanel = getChild<LLPanel>("control_panel");
- BUTTON_WIDTH = gSavedSettings.getS32("ToastButtonWidth");
+
// customize panel's attributes
// is it intended for displaying a tip?
mIsTip = mNotification->getType() == "notifytip";
@@ -299,6 +300,10 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images )
// is it a script dialog?
mIsScriptDialog = (notif_name == "ScriptDialog" || notif_name == "ScriptDialogGroup");
+ static LLCachedControl<S32> btn_width(gSavedSettings, "ToastButtonWidth", 90);
+ static LLCachedControl<S32> script_button_width(gSavedSettings, "ScriptToastButtonWidth", 110);
+ mButtonWidth = mIsScriptDialog ? script_button_width : btn_width;
+
bool is_content_trusted = (notif_name != "LoadWebPage");
// is it a caution?
//
@@ -379,8 +384,21 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images )
}
else
{
- const S32 button_panel_width = mControlPanel->getRect().getWidth();// do not change width of the panel
+ S32 button_panel_width = mControlPanel->getRect().getWidth();// get initial width from XML
S32 button_panel_height = mControlPanel->getRect().getHeight();
+
+ // Script dialog has wider buttons so it requires wider layout to ensure proper spacing
+ if (mIsScriptDialog)
+ {
+ // width for 3 columns: 3 buttons + 2 gaps
+ S32 min_width_required = 3 * mButtonWidth + 2 * (2 * HPAD);
+ if (min_width_required > button_panel_width)
+ {
+ button_panel_width = min_width_required;
+ S32 width_increase = button_panel_width - mControlPanel->getRect().getWidth();
+ reshape(getRect().getWidth() + width_increase, getRect().getHeight());
+ }
+ }
//try get an average h_pad to spread out buttons
S32 h_pad = (button_panel_width - buttons_width) / (S32(buttons.size()));
if(h_pad < 2*HPAD)
@@ -390,8 +408,8 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images )
* for a scriptdialog toast h_pad can be < 2*HPAD if we have a lot of buttons.
* In last case set default h_pad to avoid heaping of buttons
*/
- S32 button_per_row = button_panel_width / BUTTON_WIDTH;
- h_pad = (button_panel_width % BUTTON_WIDTH) / (button_per_row - 1);// -1 because we do not need space after last button in a row
+ S32 button_per_row = button_panel_width / mButtonWidth;
+ h_pad = (button_panel_width % mButtonWidth) / (button_per_row - 1);// -1 because we do not need space after last button in a row
if(h_pad < 2*HPAD) // still not enough space between buttons ?
{
h_pad = 2*HPAD;
@@ -402,7 +420,7 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images )
// we are using default width for script buttons so we can determinate button_rows
// to get a number of rows we divide the required width of the buttons to button_panel_width
// buttons.size() is reduced by -2 due to presence of ignore button which is calculated independently a bit lower
- S32 button_rows = llceil(F32(buttons.size() - 2) * (BUTTON_WIDTH + h_pad) / (button_panel_width + h_pad));
+ S32 button_rows = llceil(F32(buttons.size() - 2) * (mButtonWidth + h_pad) / (button_panel_width + h_pad));
//reserve one row for the ignore_btn
button_rows++;
//calculate required panel height for scripdialog notification.
diff --git a/indra/newview/lltoastnotifypanel.h b/indra/newview/lltoastnotifypanel.h
index d694513aba..71b9eaf8f5 100644
--- a/indra/newview/lltoastnotifypanel.h
+++ b/indra/newview/lltoastnotifypanel.h
@@ -134,6 +134,8 @@ protected:
S32 mNumOptions { 0 };
S32 mNumButtons { 0 };
+ S32 mButtonWidth;
+
static const std::string sFontDefault;
static const std::string sFontScript;
};
diff --git a/indra/newview/llvelopack.cpp b/indra/newview/llvelopack.cpp
index 28e989c4ba..90eb977bba 100644
--- a/indra/newview/llvelopack.cpp
+++ b/indra/newview/llvelopack.cpp
@@ -330,14 +330,14 @@ static std::wstring get_desktop_path()
return L"";
}
-static bool create_shortcut(const std::wstring& shortcut_path,
+static HRESULT create_shortcut(const std::wstring& shortcut_path,
const std::wstring& target_path,
const std::wstring& arguments,
const std::wstring& description,
const std::wstring& icon_path)
{
HRESULT hr = CoInitialize(NULL);
- if (FAILED(hr)) return false;
+ if (FAILED(hr)) return hr;
IShellLinkW* shell_link = nullptr;
hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
@@ -365,7 +365,7 @@ static bool create_shortcut(const std::wstring& shortcut_path,
}
CoUninitialize();
- return SUCCEEDED(hr);
+ return hr;
}
static void register_protocol_handler(const std::wstring& protocol,
@@ -405,9 +405,172 @@ static void register_protocol_handler(const std::wstring& protocol,
}
}
-void clear_nsis_links()
+static bool get_shortcut_target(const std::wstring& lnk_path, std::wstring& target_path_str)
+{
+ // Resolve the shortcut to check its target
+ wchar_t target_path[MAX_PATH] = { 0 };
+ HRESULT hr = CoInitialize(NULL);
+ bool res = false;
+ if (SUCCEEDED(hr))
+ {
+ IShellLinkW* psl = nullptr;
+ hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (void**)&psl);
+ if (SUCCEEDED(hr))
+ {
+ IPersistFile* ppf = nullptr;
+ hr = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);
+ if (SUCCEEDED(hr))
+ {
+ hr = ppf->Load(lnk_path.c_str(), STGM_READ);
+ if (SUCCEEDED(hr))
+ {
+ // Resolve() in theory may retarget to a different executable,
+ // but we should be fine as long as folder stays the same,
+ // otherwise we shouldn't clear it.
+ hr = psl->Resolve(NULL, SLR_NO_UI | SLR_NOUPDATE | SLR_ANY_MATCH);
+ if (SUCCEEDED(hr))
+ {
+ hr = psl->GetPath(target_path, MAX_PATH, nullptr, 0);
+ if (SUCCEEDED(hr))
+ {
+ target_path_str = std::wstring(target_path);
+ res = true;
+ }
+ }
+ }
+ ppf->Release();
+ }
+ psl->Release();
+ }
+ CoUninitialize();
+ }
+ return res;
+}
+
+static bool paths_are_equal(const std::wstring& path1, const std::wstring& path2)
+{
+ try
+ {
+ std::error_code ec1, ec2;
+ std::filesystem::path p1(path1);
+ std::filesystem::path p2(path2);
+
+ // Get canonical (absolute, normalized) paths
+ auto canonical1 = std::filesystem::canonical(p1, ec1);
+ auto canonical2 = std::filesystem::canonical(p2, ec2);
+
+ // If either path doesn't exist, fall back to string comparison
+ if (ec1 || ec2)
+ {
+ // Normalize case for comparison
+ std::wstring lower1 = path1;
+ std::wstring lower2 = path2;
+ std::transform(lower1.begin(), lower1.end(), lower1.begin(), ::towlower);
+ std::transform(lower2.begin(), lower2.end(), lower2.begin(), ::towlower);
+ while (!lower1.empty() && (lower1.back() == L'\\' || lower1.back() == L'/'))
+ {
+ lower1.pop_back();
+ }
+ while (!lower2.empty() && (lower2.back() == L'\\' || lower2.back() == L'/'))
+ {
+ lower2.pop_back();
+ }
+ return lower1 == lower2;
+ }
+
+ // Use filesystem::equivalent which handles all path variations
+ return std::filesystem::equivalent(canonical1, canonical2, ec1);
+ }
+ catch (const std::filesystem::filesystem_error&)
+ {
+ // Fallback to case-insensitive string comparison
+ std::wstring lower1 = path1;
+ std::wstring lower2 = path2;
+ std::transform(lower1.begin(), lower1.end(), lower1.begin(), ::towlower);
+ std::transform(lower2.begin(), lower2.end(), lower2.begin(), ::towlower);
+ while (!lower1.empty() && (lower1.back() == L'\\' || lower1.back() == L'/'))
+ {
+ lower1.pop_back();
+ }
+ while (!lower2.empty() && (lower2.back() == L'\\' || lower2.back() == L'/'))
+ {
+ lower2.pop_back();
+ }
+ return lower1 == lower2;
+ }
+}
+
+static void update_taskbar_shortcut(const std::string& nsis_folder_path, const std::wstring& appdata_path, const std::wstring& app_name, const std::wstring& link_name)
+{
+ std::wstring taskbar_path = appdata_path;
+ taskbar_path += L"\\Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar\\";
+ taskbar_path += link_name;
+
+ if (!PathFileExistsW(taskbar_path.c_str()))
+ {
+ // User didn't create one
+ return;
+ }
+
+ // Verify we are removing or updating the right thing.
+ // It is not warranteed that the shortcut points to NSIS.
+ std::wstring target_path;
+ if (get_shortcut_target(taskbar_path, target_path))
+ {
+ // Strip the filename part to get just the folder path
+ std::filesystem::path trim_path(target_path);
+ if (trim_path.has_filename())
+ {
+ target_path = trim_path.parent_path().wstring();
+ }
+ std::wstring nsis_path_w = ll_convert<std::wstring>(nsis_folder_path);
+ if (!paths_are_equal(nsis_path_w, target_path))
+ {
+ // Shortcut points to something else, don't mess with it
+ LL_INFOS("Velopack") << "Found a matching shortcut, but it points to a different channel. Expected: "
+ << ll_convert_wide_to_string(nsis_path_w)
+ << ", actual: " << ll_convert_wide_to_string(target_path)
+ << LL_ENDL;
+ return;
+ }
+ }
+
+ // First try to overwrite shortcut
+ std::wstring current_exe = ll_convert<std::wstring>(gDirUtilp->getExecutablePathAndName());
+ HRESULT hr = create_shortcut(taskbar_path, current_exe, L"", app_name, current_exe);
+ if (SUCCEEDED(hr))
+ {
+ LL_INFOS("Velopack") << "Successfully updated taskbar shortcut to point to current exe" << LL_ENDL;
+ return;
+ }
+
+ // Try deleting and if possible, recreating separately. We should not leave hanging shortcuts behind.
+ if (!DeleteFileW(taskbar_path.c_str()))
+ {
+ DWORD error = GetLastError();
+ if (error != ERROR_FILE_NOT_FOUND)
+ {
+ LL_WARNS("Velopack") << "Failed to delete NSIS taskbar shortcut: "
+ << ll_convert_wide_to_string(taskbar_path)
+ << " (error: " << error << ")" << LL_ENDL;
+ }
+ }
+ else
+ {
+ // Deleted user created link, recreate it with new target if possible.
+ LL_INFOS("Velopack") << "Updating taskbar shortcut to point to current exe" << LL_ENDL;
+ HRESULT hr = create_shortcut(taskbar_path, current_exe, L"", app_name, current_exe);
+ if (FAILED(hr))
+ {
+ LL_WARNS("Velopack") << "Failed to re-create taskbar shortcut, error: " << std::hex << hr << ", NSIS shortcut was removed" << LL_ENDL;
+ }
+ }
+}
+
+void clear_nsis_links(const std::string& nsis_folder_path)
{
wchar_t path[MAX_PATH];
+ std::wstring app_name = get_app_name();
// 1. The 'start' shortcuts set by nsis would be global, like app shortcut:
// C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Second Life Viewer\Second Life Viewer.lnk
@@ -415,7 +578,7 @@ void clear_nsis_links()
if (SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_COMMON_PROGRAMS, NULL, 0, path)))
{
std::wstring start_menu_path = path;
- std::wstring folder_path = start_menu_path + L"\\" + get_app_name();
+ std::wstring folder_path = start_menu_path + L"\\" + app_name;
std::error_code ec;
std::filesystem::path dir(folder_path);
@@ -431,11 +594,11 @@ void clear_nsis_links()
}
// 2. Desktop link, also a global one.
- // C:\Users\Public\Desktop
+ // C:\Users\Public\Desktop\Second Life Viewer.lnk
if (SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_COMMON_DESKTOPDIRECTORY, NULL, 0, path)))
{
std::wstring desktop_path = path;
- std::wstring shortcut_path = desktop_path + L"\\" + get_app_name() + L".lnk";
+ std::wstring shortcut_path = desktop_path + L"\\" + app_name + L".lnk";
if (!DeleteFileW(shortcut_path.c_str()))
{
DWORD error = GetLastError();
@@ -447,6 +610,19 @@ void clear_nsis_links()
}
}
}
+
+ // 3. Taskbar links, which are user-specific and located at:
+ // %AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\
+ // Note that it can be a link to velopack already or to a different NSIS viewer.
+ // Name might also be different based on method of creation.
+ if (SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_APPDATA, NULL, 0, path)))
+ {
+ update_taskbar_shortcut(nsis_folder_path, path, app_name, L"Second Life.lnk"); // Window class name
+ update_taskbar_shortcut(nsis_folder_path, path, app_name, L"Second Life(1).lnk"); // Just in case user somehow did it twice and removed first
+ update_taskbar_shortcut(nsis_folder_path, path, app_name, L"SecondLifeViewer.lnk"); // Executable name
+ update_taskbar_shortcut(nsis_folder_path, path, app_name, L"secondlife-bin.lnk"); // Debug builds
+ update_taskbar_shortcut(nsis_folder_path, path, app_name, app_name + L".lnk"); // Default name
+ }
}
static void parse_version(const wchar_t* version_str, int& major, int& minor, int& patch, uint64_t& build)
@@ -462,7 +638,8 @@ bool get_nsis_version(
int& nsis_major,
int& nsis_minor,
int& nsis_patch,
- uint64_t& nsis_build)
+ uint64_t& nsis_build,
+ std::string& nsis_path)
{
// Test for presence of NSIS viewer registration, then
// attempt to read uninstall info
@@ -515,12 +692,21 @@ bool get_nsis_version(
}
std::error_code ec;
std::filesystem::path path(path_buffer);
+ // check if uninstaller exists
if (!std::filesystem::exists(path, ec))
{
return false;
}
- // Todo: check codesigning?
+ // We found a valid NSIS installation, trim the path to get the folder
+ wchar_t* pos = wcsstr(path_buffer, L"uninst.exe");
+ if (pos)
+ {
+ // Trim uninst.exe from the path by setting null terminator before it
+ *pos = L'\0';
+ }
+ // Note that it has a trailing backslash.
+ nsis_path = ll_convert_wide_to_string(path_buffer);
return true;
}
@@ -647,6 +833,32 @@ static void on_first_run(void* p_user_data, const char* app_version)
MultiByteToWideChar(CP_UTF8, 0, app_version, -1, &version[0], len);
register_uninstall_info(install_dir, app_name, version);
+ // Drop install related settings
+ // Unfortunately gDirUtilp is not initialized yet and it's shouldn't
+ // be possible to change location of the settings. For now it's simpler
+ // to hardcode the location.
+ std::optional<std::string> app_data = LLStringUtil::getoptenv("APPDATA");
+ if (app_data)
+ {
+ // Strip trailing delimiter if present
+ std::string app_data_path = *app_data;
+ if (!app_data_path.empty() && (app_data_path.back() == '\\' || app_data_path.back() == '/'))
+ {
+ app_data_path.pop_back();
+ }
+
+ std::string user_settings_path = app_data_path + "\\SecondLife\\user_settings\\settings.xml";
+ LLControlGroup settings("global");
+ if (settings.loadFromFile(user_settings_path))
+ {
+ // If user reinstalls or updates, we want to recheck for nsis leftovers.
+ if (settings.controlExists("PreviousInstallChecked"))
+ {
+ settings.setBOOL("PreviousInstallChecked", false);
+ }
+ settings.saveToFile(user_settings_path, true);
+ }
+ }
}
static void on_after_install(void* user_data, const char* app_version)
diff --git a/indra/newview/llvelopack.h b/indra/newview/llvelopack.h
index d04d0db7dc..449330f68d 100644
--- a/indra/newview/llvelopack.h
+++ b/indra/newview/llvelopack.h
@@ -46,12 +46,13 @@ void velopack_set_progress_callback(std::function<void(int)> callback);
void velopack_cleanup();
#if LL_WINDOWS
-void clear_nsis_links();
+void clear_nsis_links(const std::string& nsis_folder_path);
bool get_nsis_version(
int& nsis_major,
int& nsis_minor,
int& nsis_patch,
- uint64_t& nsis_build);
+ uint64_t& nsis_build,
+ std::string& nsis_folder_path);
#endif
#endif // LL_VELOPACK
diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp
index 2ca2c5c07d..a9aa63e68f 100644
--- a/indra/newview/llviewerchat.cpp
+++ b/indra/newview/llviewerchat.cpp
@@ -200,7 +200,7 @@ LLFontGL* LLViewerChat::getChatFont()
break;
default:
case 1:
- fontp = LLFontGL::getFontSansSerif();
+ fontp = LLFontGL::getFontSansSerifMedium();
break;
case 2:
fontp = LLFontGL::getFontSansSerifBig();
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 5a79aa91bf..554c7ebcb2 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -648,7 +648,7 @@ void init_menus()
LLRect menuBarRect = gLoginMenuBarView->getRect();
menuBarRect.setLeftTopAndSize(0, menu_bar_holder->getRect().getHeight(), menuBarRect.getWidth(), menuBarRect.getHeight());
gLoginMenuBarView->setRect(menuBarRect);
- gLoginMenuBarView->setBackgroundColor( color );
+ gLoginMenuBarView->setBackgroundColor(LLColor4::black);
menu_bar_holder->addChild(gLoginMenuBarView);
// tooltips are on top of EVERYTHING, including menus
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index 6cb3aee20c..8ec2a6d661 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -63,7 +63,7 @@ const std::string GRID_LOGIN_IDENTIFIER_TYPES = "login_identifier_types";
const std::string GRID_SLURL_BASE = "slurl_base";
const std::string GRID_APP_SLURL_BASE = "app_slurl_base";
-const std::string DEFAULT_LOGIN_PAGE = "https://viewer-splash.secondlife.com/";
+const std::string DEFAULT_LOGIN_PAGE = "https://viewer-splash-v2.secondlife.com/";
const std::string MAIN_GRID_LOGIN_URI = "https://login.agni.lindenlab.com/cgi-bin/login.cgi";
@@ -125,7 +125,7 @@ void LLGridManager::initialize(const std::string& grid_file)
MAIN_GRID_WEB_PROFILE_URL,
"Agni");
addSystemGrid(LLTrans::getString("AditiGridLabel"),
- "util.aditi.lindenlab.com",
+ BETAGRID,
"https://login.aditi.lindenlab.com/cgi-bin/login.cgi",
"https://secondlife.aditi.lindenlab.com/helpers/",
DEFAULT_LOGIN_PAGE,
diff --git a/indra/newview/llviewernetwork.h b/indra/newview/llviewernetwork.h
index 2ed663e038..0937425a18 100644
--- a/indra/newview/llviewernetwork.h
+++ b/indra/newview/llviewernetwork.h
@@ -30,6 +30,7 @@
// @TODO this really should be private, but is used in llslurl
#define MAINGRID "util.agni.lindenlab.com"
+#define BETAGRID "util.aditi.lindenlab.com"
/// Exception thrown when a grid is not valid
class LLInvalidGridName
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 6a029645fb..b794047135 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -702,6 +702,16 @@ bool LLViewerParcelMgr::allowAgentVoice() const
return allowAgentVoice(gAgent.getRegion(), mAgentParcel);
}
+bool LLViewerParcelMgr::isVoiceRestricted() const
+{
+ return mAgentParcel && !mAgentParcel->getParcelFlagUseEstateVoiceChannel();
+}
+
+bool LLViewerParcelMgr::allowVoiceModeration() const
+{
+ return isVoiceRestricted() && isParcelOwnedByAgent(mAgentParcel, GP_SESSION_MODERATOR);
+}
+
bool LLViewerParcelMgr::allowAgentVoice(const LLViewerRegion* region, const LLParcel* parcel) const
{
return region && region->isVoiceEnabled()
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index 8439283eb0..0d79496ccc 100644
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -174,6 +174,12 @@ public:
bool allowAgentVoice() const;
bool allowAgentVoice(const LLViewerRegion* region, const LLParcel* parcel) const;
+ // Returns true if this parcel is using private voice channel
+ bool isVoiceRestricted() const;
+
+ // Can this agent moderate Nearby voice chat on this parcel?
+ bool allowVoiceModeration() const;
+
// Can this agent start flying on this parcel?
// Used for parcel property icons in nav bar.
bool allowAgentFly(const LLViewerRegion* region, const LLParcel* parcel) const;
diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp
index e023dffc03..e36ad0e722 100755
--- a/indra/newview/llviewerparceloverlay.cpp
+++ b/indra/newview/llviewerparceloverlay.cpp
@@ -63,9 +63,9 @@ LLUIColor LLViewerParcelOverlay::sForSaleColor;
LLUIColor LLViewerParcelOverlay::sAuctionColor;
LLViewerParcelOverlay::LLViewerParcelOverlay(LLViewerRegion* region, F32 region_width_meters)
-: mRegion(region),
- mParcelGridsPerEdge(S32(region_width_meters / PARCEL_GRID_STEP_METERS)),
- mDirty(false),
+: mRegion( region ),
+ mParcelGridsPerEdge( S32( region_width_meters / PARCEL_GRID_STEP_METERS ) ),
+ mDirty( false ),
mTimeSinceLastUpdate(),
mOverlayTextureIdx(-1)
{
@@ -467,9 +467,9 @@ void LLViewerParcelOverlay::updatePropertyLines()
{
for (S32 col = 0; col < GRIDS_PER_EDGE; col++)
{
- U8 overlay = mOwnership[row * GRIDS_PER_EDGE + col];
+ U8 overlay = mOwnership[row*GRIDS_PER_EDGE+col];
S32 colorIndex = overlay & PARCEL_COLOR_MASK;
- switch (colorIndex)
+ switch(colorIndex)
{
case PARCEL_SELF:
case PARCEL_GROUP:
@@ -483,11 +483,11 @@ void LLViewerParcelOverlay::updatePropertyLines()
const LLColor4U& color = colors[colorIndex];
- F32 left = col * GRID_STEP;
- F32 right = left + GRID_STEP;
+ F32 left = col*GRID_STEP;
+ F32 right = left+GRID_STEP;
- F32 bottom = row * GRID_STEP;
- F32 top = bottom + GRID_STEP;
+ F32 bottom = row*GRID_STEP;
+ F32 top = bottom+GRID_STEP;
// West edge
if (overlay & PARCEL_WEST_LINE)
@@ -528,121 +528,99 @@ void LLViewerParcelOverlay::addPropertyLine(F32 start_x, F32 start_y, F32 dx, F3
Edge& edge = mEdges.back();
edge.color = color;
- // Detailized rendering vertices:
- // A B C D E F G
- // *-*------*--------*--------*------*-* : 'outside' vertices are placed right on the border
- // *------*--------*--------*------* : 'inside' vertices are shifted on LINE_WIDTH inside
-
- // Simplified rendering vertices:
- // A G
- // *-----------------------------------*
- // *-----------------------------------*
-
F32 outside_x = start_x;
F32 outside_y = start_y;
- F32 outside_z = land.resolveHeightRegion(outside_x, outside_y);
- F32 inside_x = start_x + tick_dx;
- F32 inside_y = start_y + tick_dy;
- F32 inside_z = land.resolveHeightRegion(inside_x, inside_y);
-
- auto move = [&](F32 distance)
- {
- outside_x += dx * distance;
- outside_y += dy * distance;
- outside_z = land.resolveHeightRegion(outside_x, outside_y);
- inside_x += dx * distance;
- inside_y += dy * distance;
- inside_z = land.resolveHeightRegion(inside_x, inside_y);
- };
+ F32 outside_z = 0.f;
+ F32 inside_x = start_x + tick_dx;
+ F32 inside_y = start_y + tick_dy;
+ F32 inside_z = 0.f;
- auto split = [&](U32 lod, const LLVector4a& start, F32 x, F32 y, F32 z, F32 part)
+ auto split = [&](const LLVector3& start, F32 x, F32 y, F32 z, F32 part)
{
- F32 new_x = start[VX] + (x - start[VX]) * part;
- F32 new_y = start[VY] + (y - start[VY]) * part;
- edge.pushVertex(lod, new_x, new_y, water_z, 0);
+ F32 new_x = start.mV[VX] + (x - start.mV[VX]) * part;
+ F32 new_y = start.mV[VY] + (y - start.mV[VY]) * part;
+ F32 new_z = start.mV[VZ] + (z - start.mV[VZ]) * part;
+ edge.vertices.emplace_back(new_x, new_y, new_z);
};
- auto checkForSplit = [&](U32 lod)
+ auto checkForSplit = [&]()
{
- const std::vector<LLVector4a>& vertices = edge.verticesUnderWater[lod];
- const LLVector4a& last_outside = vertices.back();
- F32 z0 = last_outside[VZ];
+ const LLVector3& last_outside = edge.vertices.back();
+ F32 z0 = last_outside.mV[VZ];
F32 z1 = outside_z;
if ((z0 >= water_z && z1 >= water_z) || (z0 < water_z && z1 < water_z))
return;
F32 part = (water_z - z0) / (z1 - z0);
- const LLVector4a& last_inside = vertices[vertices.size() - 2];
- split(lod, last_inside, inside_x, inside_y, inside_z, part);
- split(lod, last_outside, outside_x, outside_y, outside_z, part);
+ const LLVector3& last_inside = edge.vertices[edge.vertices.size() - 2];
+ split(last_inside, inside_x, inside_y, inside_z, part);
+ split(last_outside, outside_x, outside_y, outside_z, part);
};
- auto pushTwoVertices = [&](U32 lod)
- {
- LLVector3 out(outside_x, outside_y, outside_z);
- LLVector3 in(inside_x, inside_y, inside_z);
- if (fabs(inside_z - outside_z) < LINE_WIDTH / 5)
- {
- edge.pushVertex(lod, inside_x, inside_y, inside_z, water_z);
- }
- else
- {
- // Make the line thinner if heights differ too much
- LLVector3 dist(in - out);
- F32 coef = dist.length() / LINE_WIDTH;
- LLVector3 new_in(out + dist / coef);
- edge.pushVertex(lod, new_in[VX], new_in[VY], new_in[VZ], water_z);
- }
- edge.pushVertex(lod, outside_x, outside_y, outside_z, water_z);
- };
+ // First part, only one vertex
+ outside_z = land.resolveHeightRegion( outside_x, outside_y );
- // Point A simplified (first two vertices)
- pushTwoVertices(1);
+ edge.vertices.emplace_back(outside_x, outside_y, outside_z);
- // Point A detailized (only one vertex)
- edge.pushVertex(0, outside_x, outside_y, outside_z, water_z);
+ inside_x += dx * LINE_WIDTH;
+ inside_y += dy * LINE_WIDTH;
- // Point B (two vertices)
- move(LINE_WIDTH);
- pushTwoVertices(0);
+ outside_x += dx * LINE_WIDTH;
+ outside_y += dy * LINE_WIDTH;
- // Points C, D, E
- F32 distance = 1.f - LINE_WIDTH;
+ // Then the "actual edge"
+ inside_z = land.resolveHeightRegion( inside_x, inside_y );
+ outside_z = land.resolveHeightRegion( outside_x, outside_y );
+
+ edge.vertices.emplace_back(inside_x, inside_y, inside_z);
+ edge.vertices.emplace_back(outside_x, outside_y, outside_z);
+
+ inside_x += dx * (dx - LINE_WIDTH);
+ inside_y += dy * (dy - LINE_WIDTH);
+
+ outside_x += dx * (dx - LINE_WIDTH);
+ outside_y += dy * (dy - LINE_WIDTH);
+
+ // Middle part, full width
constexpr S32 GRID_STEP = (S32)PARCEL_GRID_STEP_METERS;
- for (U32 i = 1; i < GRID_STEP; ++i)
+ for (S32 i = 1; i < GRID_STEP; i++)
{
- move(distance);
- checkForSplit(0);
- pushTwoVertices(0);
- distance = 1.f;
+ inside_z = land.resolveHeightRegion( inside_x, inside_y );
+ outside_z = land.resolveHeightRegion( outside_x, outside_y );
+
+ checkForSplit();
+
+ edge.vertices.emplace_back(inside_x, inside_y, inside_z);
+ edge.vertices.emplace_back(outside_x, outside_y, outside_z);
+
+ inside_x += dx;
+ inside_y += dy;
+
+ outside_x += dx;
+ outside_y += dy;
}
- // Point F (two vertices)
- move(1.f - LINE_WIDTH);
- checkForSplit(0);
- pushTwoVertices(0);
+ // Extra buffer for edge
+ inside_x -= dx * LINE_WIDTH;
+ inside_y -= dy * LINE_WIDTH;
- // Point G simplified (last two vertices)
- move(LINE_WIDTH);
- pushTwoVertices(1);
+ outside_x -= dx * LINE_WIDTH;
+ outside_y -= dy * LINE_WIDTH;
- // Point G detailized (only one vertex)
- edge.pushVertex(0, outside_x, outside_y, outside_z, water_z);
-}
+ inside_z = land.resolveHeightRegion( inside_x, inside_y );
+ outside_z = land.resolveHeightRegion( outside_x, outside_y );
-void LLViewerParcelOverlay::Edge::pushVertex(U32 lod, F32 x, F32 y, F32 z, F32 water_z)
-{
- verticesUnderWater[lod].emplace_back(x, y, z);
- gGL.transform(verticesUnderWater[lod].back());
+ checkForSplit();
- if (z >= water_z)
- {
- verticesAboveWater[lod].push_back(verticesUnderWater[lod].back());
- }
- else
- {
- verticesAboveWater[lod].emplace_back(x, y, water_z);
- gGL.transform(verticesAboveWater[lod].back());
- }
+ edge.vertices.emplace_back(inside_x, inside_y, inside_z);
+ edge.vertices.emplace_back(outside_x, outside_y, outside_z);
+
+ outside_x += dx * LINE_WIDTH;
+ outside_y += dy * LINE_WIDTH;
+
+ // Last edge is not drawn to the edge
+ outside_z = land.resolveHeightRegion( outside_x, outside_y );
+
+ edge.vertices.emplace_back(outside_x, outside_y, outside_z);
}
void LLViewerParcelOverlay::setDirty()
@@ -687,9 +665,6 @@ void LLViewerParcelOverlay::renderPropertyLines()
if (!show)
return;
- LL_PROFILE_ZONE_SCOPED;
- LL_PROFILE_GPU_ZONE("Property Lines");
-
LLSurface& land = mRegion->getLand();
bool render_water = gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_WATER);
@@ -727,8 +702,6 @@ void LLViewerParcelOverlay::renderPropertyLines()
// Stomp the camera into two dimensions
LLVector3 camera_region = mRegion->getPosRegionFromGlobal( gAgentCamera.getCameraPositionGlobal() );
- bool draw_underwater = camera_region.mV[VZ] < water_z ||
- !gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_WATER);
// Set up a cull plane 2 * PARCEL_GRID_STEP_METERS behind
// the camera. The cull plane normal is the camera's at axis.
@@ -736,23 +709,15 @@ void LLViewerParcelOverlay::renderPropertyLines()
cull_plane_point *= -2.f * PARCEL_GRID_STEP_METERS;
cull_plane_point += camera_region;
- bool render_hidden = !draw_underwater &&
- LLSelectMgr::sRenderHiddenSelections &&
- LLFloaterReg::instanceVisible("build");
+ bool render_hidden = LLSelectMgr::sRenderHiddenSelections && LLFloaterReg::instanceVisible("build");
constexpr F32 PROPERTY_LINE_CLIP_DIST_SQUARED = 256.f * 256.f;
- const F32 PROPERTY_LINE_LOD0_DIST_SQUARED = PROPERTY_LINE_CLIP_DIST_SQUARED / 25;
for (const Edge& edge : mEdges)
{
- const std::vector<LLVector4a>& vertices0 = edge.verticesAboveWater[0];
- const F32* first = vertices0.front().getF32ptr();
- const F32* last = vertices0.back().getF32ptr();
- LLVector3 center((first[VX] + last[VX]) / 2, (first[VY] + last[VY]) / 2, (first[VZ] + last[VZ]) / 2);
- gGL.untransform(center);
+ LLVector3 center = edge.vertices[edge.vertices.size() >> 1];
- F32 dist_squared = dist_vec_squared(center, camera_region);
- if (dist_squared > PROPERTY_LINE_CLIP_DIST_SQUARED)
+ if (dist_vec_squared2D(center, camera_region) > PROPERTY_LINE_CLIP_DIST_SQUARED)
{
continue;
}
@@ -766,33 +731,43 @@ void LLViewerParcelOverlay::renderPropertyLines()
continue;
}
- U32 lod = dist_squared < PROPERTY_LINE_LOD0_DIST_SQUARED ? 0 : 1;
-
gGL.begin(LLRender::TRIANGLE_STRIP);
gGL.color4ubv(edge.color.mV);
- if (draw_underwater)
+ for (const LLVector3& vertex : edge.vertices)
{
- gGL.vertexBatchPreTransformed(edge.verticesUnderWater[lod]);
+ if (render_hidden || camera_z < water_z || vertex.mV[2] >= water_z)
+ {
+ gGL.vertex3fv(vertex.mV);
+ }
+ else
+ {
+ LLVector3 visible = vertex;
+ visible.mV[VZ] = water_z;
+ gGL.vertex3fv(visible.mV);
+ }
}
- else
+
+ gGL.end();
+
+ if (render_hidden)
{
- gGL.vertexBatchPreTransformed(edge.verticesAboveWater[lod]);
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER);
- if (render_hidden)
- {
- LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER);
+ gGL.begin(LLRender::TRIANGLE_STRIP);
- LLColor4U color = edge.color;
- color.mV[VALPHA] /= 4;
- gGL.color4ubv(color.mV);
+ LLColor4U color = edge.color;
+ color.mV[VALPHA] /= 4;
+ gGL.color4ubv(color.mV);
- gGL.vertexBatchPreTransformed(edge.verticesUnderWater[lod]);
+ for (const LLVector3& vertex : edge.vertices)
+ {
+ gGL.vertex3fv(vertex.mV);
}
- }
- gGL.end();
+ gGL.end();
+ }
}
gGL.popMatrix();
diff --git a/indra/newview/llviewerparceloverlay.h b/indra/newview/llviewerparceloverlay.h
index 7271c85701..50bef02ddf 100644
--- a/indra/newview/llviewerparceloverlay.h
+++ b/indra/newview/llviewerparceloverlay.h
@@ -116,10 +116,7 @@ private:
struct Edge
{
- void pushVertex(U32 lod, F32 x, F32 y, F32 z, F32 water_z);
- // LOD: 0 - detailized, 1 - simplified
- std::vector<LLVector4a> verticesAboveWater[2];
- std::vector<LLVector4a> verticesUnderWater[2];
+ std::vector<LLVector3> vertices;
LLColor4U color;
};
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 42a587f376..f31befd1ab 100755
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -3300,6 +3300,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("SetDisplayName");
capabilityNames.append("SimConsoleAsync");
capabilityNames.append("SimulatorFeatures");
+ capabilityNames.append("SpatialVoiceModerationRequest");
capabilityNames.append("StartGroupProposal");
capabilityNames.append("TerrainNavMeshProperties");
capabilityNames.append("TextureStats");
@@ -3800,6 +3801,16 @@ std::string LLViewerRegion::getSimHostName()
return std::string("...");
}
+
+bool LLViewerRegion::isRegionWebRTCEnabled()
+{
+ if (mSimulatorFeaturesReceived && mSimulatorFeatures.has("VoiceServerType"))
+ {
+ return mSimulatorFeatures["VoiceServerType"].asString() == "webrtc";
+ }
+ return false;
+}
+
void LLViewerRegion::applyCacheMiscExtras(LLViewerObject* obj)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 974bc375b8..f1eb335582 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -424,6 +424,8 @@ public:
std::string getSimHostName();
+ bool isRegionWebRTCEnabled();
+
static bool isNewObjectCreationThrottleDisabled() {return sNewObjectCreationThrottle < 0;}
// rebuild reflection probe list
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index 4dcd1cc03a..6490fe76a2 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -262,6 +262,20 @@ LLTrace::SampleStatHandle<LLUnit<F32, LLUnits::Percent> > HUDS_FRAME_PCT("huds_
LLTrace::SampleStatHandle<LLUnit<F32, LLUnits::Percent> > UI_FRAME_PCT("ui_frame_pct");
LLTrace::SampleStatHandle<LLUnit<F32, LLUnits::Percent> > SWAP_FRAME_PCT("swap_frame_pct");
LLTrace::SampleStatHandle<LLUnit<F32, LLUnits::Percent> > IDLE_FRAME_PCT("idle_frame_pct");
+
+
+
+LLTrace::SampleStatHandle<U32> WEBRTC_PACKETS_IN_LOST("webrtc_packets_in_lost", "Lost incoming packets"),
+ WEBRTC_PACKETS_IN_RECEIVED("webrtc_packets_in_recv", "Incoming packets received"),
+ WEBRTC_PACKETS_OUT_SENT("webrtc_packets_out_sent", "Outgoing packets sent"),
+ WEBRTC_PACKETS_OUT_LOST("webrtc_packets_out_lost", "Lost outgoing packets");
+
+LLTrace::SampleStatHandle<F32> WEBRTC_JITTER_OUT("webrtc_jitter_out", "Timing variation of outgoing audio"),
+ WEBRTC_JITTER_IN("webrtc_jitter_in", "Timing variation of incoming audio"),
+ WEBRTC_LATENCY("webrtc_latency", "Round-trip audio delay"),
+ WEBRTC_UPLOAD_BANDWIDTH("webrtc_upload_bandwidth", "Estimated upload bandwidth"),
+ WEBRTC_JITTER_BUFFER("webrtc_jitter_buffer", "Average delay added to smooth incoming audio");
+
}
LLViewerStats::LLViewerStats()
diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h
index 1ac8b2f66b..8ec0dd0024 100644
--- a/indra/newview/llviewerstats.h
+++ b/indra/newview/llviewerstats.h
@@ -232,6 +232,9 @@ extern LLTrace::EventStatHandle<LLUnit<F32, LLUnits::Percent> > OBJECT_CACHE_HIT
extern LLTrace::SampleStatHandle<F64> NOTRMALIZED_FRAMETIME_JITTER_SESSION;
extern LLTrace::SampleStatHandle<F64> NORMALIZED_FRAMTIME_JITTER_PERIOD;
+extern LLTrace::SampleStatHandle<U32> WEBRTC_PACKETS_IN_LOST, WEBRTC_PACKETS_IN_RECEIVED, WEBRTC_PACKETS_OUT_SENT, WEBRTC_PACKETS_OUT_LOST;
+extern LLTrace::SampleStatHandle<F32> WEBRTC_JITTER_OUT, WEBRTC_JITTER_IN, WEBRTC_LATENCY, WEBRTC_UPLOAD_BANDWIDTH, WEBRTC_JITTER_BUFFER;
+
}
class LLViewerStats : public LLSingleton<LLViewerStats>
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 8695b96952..0f3f24d1af 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -2330,14 +2330,22 @@ void LLViewerWindow::initWorldUI()
physical_mem = LLMemory::getMaxMemKB();
}
- if (!gNonInteractive && physical_mem > MIN_PHYSICAL_MEMORY)
+ if (!gNonInteractive)
{
- LL_INFOS() << "Preloading cef instances" << LL_ENDL;
+ if (physical_mem > MIN_PHYSICAL_MEMORY)
+ {
+ LL_INFOS() << "Preloading cef instances" << LL_ENDL;
- LLFloaterReg::getInstance("destinations");
- LLFloaterReg::getInstance("avatar_welcome_pack");
- LLFloaterReg::getInstance("search");
- LLFloaterReg::getInstance("marketplace");
+ LLFloaterReg::getInstance("destinations");
+ LLFloaterReg::getInstance("avatar_welcome_pack");
+ LLFloaterReg::getInstance("search");
+ LLFloaterReg::getInstance("marketplace");
+ }
+ else if (gSavedSettings.getBOOL("FirstLoginThisInstall"))
+ {
+ // Preload the welcome pack for first-time login even on low end hardware
+ LLFloaterReg::getInstance("avatar_welcome_pack");
+ }
}
}
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 51a7204782..53d82ff989 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -38,6 +38,7 @@
#include "llagent.h"
#include "lltrans.h"
#include "lluiusage.h"
+#include "llnearbyvoicemoderation.h"
const F32 LLVoiceClient::OVERDRIVEN_POWER_LEVEL = 0.7f;
@@ -640,6 +641,9 @@ void LLVoiceClient::setUserPTTState(bool ptt)
{
if (ptt)
{
+ // Nearby chat is muted by moderator, don't toggle PTT
+ if (!mUserPTTState && LLNearbyVoiceModeration::getInstance()->showNotificationIfNeeded())
+ return;
LLUIUsage::instance().logCommand("Agent.EnableMicrophone");
}
mUserPTTState = ptt;
diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp
index 3b36c7ed25..3b98ca49ef 100644
--- a/indra/newview/llvoicewebrtc.cpp
+++ b/indra/newview/llvoicewebrtc.cpp
@@ -61,10 +61,12 @@
#include "llrand.h"
#include "llviewerwindow.h"
#include "llviewercamera.h"
+#include "llviewerstats.h"
#include "llversioninfo.h"
#include "llviewernetwork.h"
#include "llnotificationsutil.h"
+#include "llnearbyvoicemoderation.h"
#include "llcorehttputil.h"
#include "lleventfilter.h"
@@ -80,6 +82,8 @@
const std::string WEBRTC_VOICE_SERVER_TYPE = "webrtc";
+const F32 STATS_TIMER_DELAY = 2.0;
+
namespace {
const F32 MAX_AUDIO_DIST = 50.0f;
@@ -2963,6 +2967,7 @@ bool LLVoiceWebRTCConnection::connectionStateMachine()
}
mWebRTCAudioInterface->setReceiveVolume(mSpeakerVolume);
LLWebRTCVoiceClient::getInstance()->OnConnectionEstablished(mChannelID, mRegionID);
+ resetConnectionStats();
setVoiceConnectionState(VOICE_STATE_WAIT_FOR_DATA_CHANNEL);
break;
}
@@ -3016,6 +3021,13 @@ bool LLVoiceWebRTCConnection::connectionStateMachine()
sendJoin();
}
}
+
+ static LLTimer stats_timer;
+ if (stats_timer.getElapsedTimeF32() > STATS_TIMER_DELAY)
+ {
+ mWebRTCPeerConnectionInterface->gatherConnectionStats();
+ stats_timer.reset();
+ }
}
break;
}
@@ -3148,6 +3160,13 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b
LL_WARNS("Voice") << "Expected object from data channel:" << data << LL_ENDL;
return;
}
+
+ bool is_primary_region = mPrimary;
+ if (!mPrimary && isSpatial() && gAgent.getRegion())
+ {
+ is_primary_region = (mRegionID == gAgent.getRegion()->getRegionID());
+ LL_WARNS() << "mPrimary is false, expected: " << is_primary_region << " connection state: " << getVoiceConnectionState() << LL_ENDL;
+ }
boost::json::object voice_data = voice_data_parsed.as_object();
boost::json::object mute;
boost::json::object user_gain;
@@ -3243,12 +3262,63 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b
if (participant_obj.contains("m") && participant_obj["m"].is_bool())
{
- participant->mIsModeratorMuted = participant_obj["m"].as_bool();
+ bool is_moderator_muted = participant_obj["m"].as_bool();
+ if (isSpatial())
+ {
+ // ignore muted flags from non-primary server
+ if (is_primary_region || primary)
+ {
+ participant->mIsModeratorMuted = is_moderator_muted;
+ if (gAgentID == agent_id)
+ {
+ LLNearbyVoiceModeration::getInstance()->setMutedInfo(mChannelID, is_moderator_muted);
+ }
+ }
+ }
+ else
+ {
+ participant->mIsModeratorMuted = is_moderator_muted;
+ }
}
}
}
- }
+ else
+ {
+ if (isSpatial() && (is_primary_region || primary))
+ {
+ // mute info message can be received before join message, so try to mute again later
+ if (participant_obj.contains("m") && participant_obj["m"].is_bool())
+ {
+ LL_WARNS() << "Mute info msg received: " << participant_obj["m"].as_bool()
+ << " but participant " << agent_id
+ << " was not found in channel " << mChannelID << LL_ENDL;
+ bool is_moderator_muted = participant_obj["m"].as_bool();
+ std::string channel_id = mChannelID;
+ F32 delay { 1.5f };
+ doAfterInterval(
+ [channel_id, agent_id, is_moderator_muted]()
+ {
+ LLWebRTCVoiceClient::participantStatePtr_t participant =
+ LLWebRTCVoiceClient::getInstance()->findParticipantByID(channel_id, agent_id);
+ if (participant)
+ {
+ participant->mIsModeratorMuted = is_moderator_muted;
+ LL_WARNS() << "Participant " << agent_id << " is found after delay, is_muted: " << is_moderator_muted << LL_ENDL;
+ if (gAgentID == agent_id)
+ {
+ LLNearbyVoiceModeration::getInstance()->setMutedInfo(channel_id, is_moderator_muted);
+ }
+ }
+ else
+ {
+ LL_WARNS() << "Participant " << agent_id << " is still not found in channel " << channel_id << LL_ENDL;
+ }
+ }, delay);
+ }
+ }
+ }
+ }
// tell the simulator to set the mute and volume data for this
// participant, if there are any updates.
boost::json::object root;
@@ -3320,6 +3390,112 @@ void LLVoiceWebRTCConnection::sendJoin()
mWebRTCDataInterface->sendData(json_data, false);
}
+void LLVoiceWebRTCConnection::OnStatsDelivered(const llwebrtc::LLWebRTCStatsMap& stats_data)
+{
+ LL::WorkQueue::postMaybe(mMainQueue, [=, this]
+ {
+ if (mShutDown)
+ {
+ return;
+ }
+ for (const auto& [stats_id, attributes] : stats_data)
+ {
+ if (attributes.contains("currentRoundTripTime"))
+ {
+ F32 rtt_seconds = 0.0f;
+ LLStringUtil::convertToF32(attributes.at("currentRoundTripTime"), rtt_seconds);
+ sample(LLStatViewer::WEBRTC_LATENCY, rtt_seconds * 1000.0f);
+ }
+ if (attributes.contains("availableOutgoingBitrate"))
+ {
+ F32 bitrate_bps = 0.0f;
+ LLStringUtil::convertToF32(attributes.at("availableOutgoingBitrate"), bitrate_bps);
+ sample(LLStatViewer::WEBRTC_UPLOAD_BANDWIDTH, bitrate_bps / 1000.0f);
+ }
+
+ // Stat type detection below is heuristic-based.
+ // It's relied on specific fields to distinguish outbound-rtp, remote-inbound-rtp, and inbound-rtp.
+ // This approach works with current WebRTC stats but may need updating later.
+
+ // Outbound RTP
+ if (attributes.contains("mediaSourceId"))
+ {
+ U32 out_packets_sent = 0;
+ LLStringUtil::convertToU32(attributes.at("packetsSent"), out_packets_sent);
+ sample(LLStatViewer::WEBRTC_PACKETS_OUT_SENT, out_packets_sent);
+ }
+ // Remote-Inbound RTP
+ else if (attributes.contains("localId"))
+ {
+ if (attributes.contains("packetsLost"))
+ {
+ U32 out_packets_lost = 0;
+ LLStringUtil::convertToU32(attributes.at("packetsLost"), out_packets_lost);
+ sample(LLStatViewer::WEBRTC_PACKETS_OUT_LOST, out_packets_lost);
+ }
+ if (attributes.contains("jitter"))
+ {
+ F32 jitter_seconds = 0.0f;
+ LLStringUtil::convertToF32(attributes.at("jitter"), jitter_seconds);
+ sample(LLStatViewer::WEBRTC_JITTER_OUT, jitter_seconds * 1000.0f);
+ }
+ }
+ // Inbound RTP
+ else if (attributes.contains("jitterBufferDelay"))
+ {
+ if (attributes.contains("packetsLost"))
+ {
+ U32 in_packets_lost = 0;
+ LLStringUtil::convertToU32(attributes.at("packetsLost"), in_packets_lost);
+ sample(LLStatViewer::WEBRTC_PACKETS_IN_LOST, in_packets_lost);
+ }
+ if (attributes.contains("packetsReceived"))
+ {
+ U32 in_packets_recv = 0;
+ LLStringUtil::convertToU32(attributes.at("packetsReceived"), in_packets_recv);
+ sample(LLStatViewer::WEBRTC_PACKETS_IN_RECEIVED, in_packets_recv);
+ }
+ if (attributes.contains("jitter"))
+ {
+ F32 jitter_seconds = 0.0f;
+ LLStringUtil::convertToF32(attributes.at("jitter"), jitter_seconds);
+ sample(LLStatViewer::WEBRTC_JITTER_IN, jitter_seconds * 1000.0f);
+ }
+ if (attributes.contains("jitterBufferDelay") && attributes.contains("jitterBufferEmittedCount"))
+ {
+ F32 total_delay_seconds = 0.0f;
+ F32 emitted_count_f = 0.0f;
+
+ // total delay in seconds
+ LLStringUtil::convertToF32(attributes.at("jitterBufferDelay"), total_delay_seconds);
+
+ // number of packets played out
+ LLStringUtil::convertToF32(attributes.at("jitterBufferEmittedCount"), emitted_count_f);
+ if (emitted_count_f > 0.0f)
+ {
+ F32 avg_delay_seconds = total_delay_seconds / emitted_count_f;
+ F32 avg_delay_ms = avg_delay_seconds * 1000.0f;
+ sample(LLStatViewer::WEBRTC_JITTER_BUFFER, avg_delay_seconds * 1000.0f);
+ }
+ }
+ }
+ }
+ });
+}
+
+void LLVoiceWebRTCConnection::resetConnectionStats()
+{
+ sample(LLStatViewer::WEBRTC_JITTER_BUFFER, 0);
+ sample(LLStatViewer::WEBRTC_JITTER_IN, 0);
+ sample(LLStatViewer::WEBRTC_JITTER_OUT, 0);
+ sample(LLStatViewer::WEBRTC_LATENCY, 0);
+ sample(LLStatViewer::WEBRTC_PACKETS_IN_LOST, 0);
+ sample(LLStatViewer::WEBRTC_PACKETS_IN_RECEIVED, 0);
+ sample(LLStatViewer::WEBRTC_PACKETS_OUT_SENT, 0);
+ sample(LLStatViewer::WEBRTC_PACKETS_OUT_LOST, 0);
+ sample(LLStatViewer::WEBRTC_UPLOAD_BANDWIDTH, 0);
+}
+
/////////////////////////////
// WebRTC Spatial Connection
diff --git a/indra/newview/llvoicewebrtc.h b/indra/newview/llvoicewebrtc.h
index be384f0de0..818bce5bc3 100644
--- a/indra/newview/llvoicewebrtc.h
+++ b/indra/newview/llvoicewebrtc.h
@@ -541,6 +541,8 @@ private:
static bool sShuttingDown;
LLEventMailDrop mWebRTCPump;
+
+ LLSD mLastWebRTCStats;
};
@@ -604,6 +606,8 @@ class LLVoiceWebRTCConnection :
//@{
void OnDataReceived(const std::string &data, bool binary) override;
void OnDataChannelReady(llwebrtc::LLWebRTCDataInterface *data_interface) override;
+
+ void OnStatsDelivered(const llwebrtc::LLWebRTCStatsMap& stats_data) override;
//@}
void OnDataReceivedImpl(const std::string &data, bool binary);
@@ -641,6 +645,8 @@ class LLVoiceWebRTCConnection :
void OnVoiceConnectionRequestSuccess(const LLSD &body);
+ void resetConnectionStats();
+
protected:
typedef enum e_voice_connection_state
{
diff --git a/indra/newview/llwindowlistener.cpp b/indra/newview/llwindowlistener.cpp
index 6d234a9a34..38e49d0750 100644
--- a/indra/newview/llwindowlistener.cpp
+++ b/indra/newview/llwindowlistener.cpp
@@ -41,6 +41,8 @@
#include "llrootview.h"
#include "llsdutil.h"
#include "stringize.h"
+#include "llclipboard.h"
+#include "lleditmenuhandler.h"
#include <functional>
#include <typeinfo>
#include <map>
@@ -89,7 +91,8 @@ LLWindowListener::LLWindowListener(LLViewerWindow *window, const KeyboardGetter&
&LLWindowListener::getPaths,
LLSDMap("reply", LLSD()));
add("keyDown",
- keySomething + "keypress event.\n" + keyExplain + mask,
+ keySomething + "keypress event.\n" + keyExplain +
+ "The [\"char\"] parameter detects and handles non-ASCII characters seperately\n" + mask,
&LLWindowListener::keyDown);
add("keyUp",
keySomething + "key release event.\n" + keyExplain + mask,
@@ -107,6 +110,10 @@ LLWindowListener::LLWindowListener(LLViewerWindow *window, const KeyboardGetter&
"Given an integer number of [\"clicks\"], inject the requested mouse scroll event.\n"
"(positive clicks moves downward through typical content)",
&LLWindowListener::mouseScroll);
+ add("pasteText",
+ "Paste specified [\"text\"] into the current edit field\n"
+ "Optional [\"path\"] specifies target UI element (must be focusable).",
+ &LLWindowListener::pasteText);
}
template <typename MAPPED>
@@ -264,6 +271,20 @@ void LLWindowListener::keyDown(LLSD const & evt)
KEY key = getKEY(evt);
MASK mask = getMask(evt);
+ bool is_non_ascii = false;
+ llwchar uni_char = 0;
+
+ if (evt.has("char"))
+ {
+ LLWString wstr = utf8str_to_wstring(evt["char"].asString());
+ if (!wstr.empty())
+ {
+ uni_char = wstr[0];
+ // If the Unicode code point is outside ASCII range, use Unicode-only handling
+ is_non_ascii = (uni_char >= 0x80);
+ }
+ }
+
if (evt.has("path"))
{
std::string path(evt["path"]);
@@ -278,8 +299,17 @@ void LLWindowListener::keyDown(LLSD const & evt)
response.setResponse(target_view->getInfo());
gFocusMgr.setKeyboardFocus(target_view);
- gViewerInput.handleKey(key, mask, false);
- if(key < 0x80) mWindow->handleUnicodeChar(key, mask);
+
+ if (is_non_ascii)
+ {
+ // For non-ASCII characters, only send the Unicode event
+ mWindow->handleUnicodeChar(uni_char, mask);
+ }
+ else
+ {
+ gViewerInput.handleKey(key, mask, false);
+ if(key < 0x80) mWindow->handleUnicodeChar(key, mask);
+ }
}
else
{
@@ -290,8 +320,16 @@ void LLWindowListener::keyDown(LLSD const & evt)
}
else
{
- gViewerInput.handleKey(key, mask, false);
- if(key < 0x80) mWindow->handleUnicodeChar(key, mask);
+ if (is_non_ascii)
+ {
+ // For non-ASCII characters, only send the Unicode event
+ mWindow->handleUnicodeChar(uni_char, mask);
+ }
+ else
+ {
+ gViewerInput.handleKey(key, mask, false);
+ if(key < 0x80) mWindow->handleUnicodeChar(key, mask);
+ }
}
}
@@ -521,3 +559,60 @@ void LLWindowListener::mouseScroll(LLSD const & request)
mWindow->handleScrollWheel(NULL, clicks);
}
+
+void LLWindowListener::pasteText(LLSD const & evt)
+{
+ Response response(LLSD(), evt);
+
+ if (!evt.has("text"))
+ {
+ response.error(STRINGIZE(evt["op"].asString() << " request did not provide required \"text\" parameter"));
+ return;
+ }
+
+ std::string text_to_paste = evt["text"].asString();
+ if (evt.has("path"))
+ {
+ std::string path(evt["path"]);
+ LLView* target_view = LLUI::getInstance()->resolvePath(LLUI::getInstance()->getRootView(), path);
+ if (!target_view)
+ {
+ response.error(STRINGIZE(evt["op"].asString() << " request specified invalid \"path\": " << path));
+ return;
+ }
+ else if(!target_view->isAvailable())
+ {
+ response.error(STRINGIZE("Target view specified by \"path\": " << path << " is not visible"));
+ return;
+ }
+ else
+ {
+ // Focus the target view
+ gFocusMgr.setKeyboardFocus(target_view);
+ }
+ }
+
+ // Check if edit menu handler is available
+ if (!LLEditMenuHandler::gEditMenuHandler)
+ {
+ response.error(STRINGIZE(evt["op"].asString() << " request failed: no edit menu handler available"));
+ return;
+ }
+
+ // Save current clipboard contents
+ LLWString saved_clipboard;
+ LLClipboard::instance().pasteFromClipboard(saved_clipboard);
+
+ LLClipboard::instance().copyToClipboard(utf8str_to_wstring(text_to_paste), 0, static_cast<S32>(text_to_paste.size()));
+ LLEditMenuHandler::gEditMenuHandler->paste();
+
+ // Restore original clipboard contents if there were any
+ if (!saved_clipboard.empty())
+ {
+ LLClipboard::instance().copyToClipboard(saved_clipboard, 0, static_cast<S32>(saved_clipboard.size()));
+ }
+ else
+ {
+ LLClipboard::instance().reset();
+ }
+}
diff --git a/indra/newview/llwindowlistener.h b/indra/newview/llwindowlistener.h
index 9908a9c451..d3a16cfde9 100644
--- a/indra/newview/llwindowlistener.h
+++ b/indra/newview/llwindowlistener.h
@@ -47,6 +47,7 @@ public:
void mouseUp(LLSD const & evt);
void mouseMove(LLSD const & evt);
void mouseScroll(LLSD const & evt);
+ void pasteText(LLSD const & evt);
private:
LLViewerWindow * mWindow;
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index 2ad285eb1f..d627556a7c 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -4,13 +4,16 @@
<!-- Named Colors -->
<color
name="EmphasisColor"
- value="0.38 0.694 0.573 1" />
- <color
- name="EmphasisColor_13"
- value="0.38 0.694 0.573 0.13" />
+ value="0.3 0.82 1 1" />
<color
name="EmphasisColor_35"
- value="0.38 0.694 0.573 0.35" />
+ value="0.426 0.729 1.0 0.368" />
+ <color
+ name="SelectionColor"
+ value="0.706 0.851 1 1" />
+ <color
+ name="ScrollHoveredColor"
+ value="0.18 0.26 0.33 1" />
<color
name="BeaconColor"
value="0.749 0.298 0 1" />
@@ -53,6 +56,9 @@
<color
name="DkGray2"
value="0.169 0.169 0.169 1" />
+ <color
+ name="DkGrayLogin"
+ value="0.129 0.133 0.137 1" />
<color
name="MouseGray"
value="0.191 0.191 0.191 1" />
@@ -338,7 +344,7 @@
reference="EmphasisColor" />
<color
name="ConversationFriendColor"
- value="0.42 0.85 0.71 1" />
+ reference="EmphasisColor" />
<color
name="DefaultHighlightDark"
reference="White_10" />
@@ -359,7 +365,7 @@
reference="Black" />
<color
name="FilterTextColor"
- value="0.38 0.69 0.57 1" />
+ reference="EmphasisColor" />
<color
name="FloaterButtonImageColor"
reference="LtGray" />
@@ -377,7 +383,7 @@
reference="Black_50" />
<color
name="FocusColor"
- reference="EmphasisColor" />
+ value="0.7 0.7 0.7 1" />
<color
name="FolderViewLoadingMessageTextColor"
value="0.3344 0.5456 0.5159 1" />
@@ -595,7 +601,7 @@
reference="White" />
<color
name="NameTagFriend"
- value="0.447 0.784 0.663 1" />
+ reference="EmphasisColor" />
<color
name="NameTagLegacy"
reference="White" />
@@ -741,9 +747,6 @@
name="ScrollHighlightedColor"
reference="Unused?" />
<color
- name="ScrollHoveredColor"
- reference="EmphasisColor_13" />
- <color
name="ScrollSelectedBGColor"
reference="EmphasisColor_35" />
<color
@@ -762,6 +765,9 @@
name="SelectedOutfitTextColor"
reference="EmphasisColor" />
<color
+ name="WornOutfitTextColor"
+ value="0.54 0.73 0.87 1" />
+ <color
name="SearchableControlHighlightFontColor"
value="1 0 0 1" />
<color
@@ -792,6 +798,9 @@
name="SystemChatColor"
reference="LtGray" />
<color
+ name="SelectedBgReadOnlyColor"
+ value="0.15 0.21 0.27 1" />
+ <color
name="TextBgFocusColor"
reference="White" />
<color
@@ -863,18 +872,24 @@
name="ColorSwatchBorderColor"
value="0.45098 0.517647 0.607843 1"/>
<color
+ name="ColorSwatchBorderColorGray"
+ value="0.329 0.329 0.329 1"/>
+ <color
name="ChatTeleportSeparatorColor"
reference="Black" />
<color
name="ChatTimestampColor"
reference="White" />
<color
+ name="MenuBarStreamingBgColor"
+ reference="DkGray" />
+ <color
name="MenuBarBetaBgColor"
reference="DkBlue" />
- <color
- name="MenuBarProjectBgColor"
- reference="MdBlue" />
- <color
+ <color
+ name="MenuBarProjectBgColor"
+ reference="MdBlue" />
+ <color
name="MenuBarTestBgColor"
reference="DkRed" />
<color
@@ -984,7 +999,7 @@
value="1 0.14 0 1" />
<color
name="OutfitGalleryItemSelected"
- value="0.22 0.45 0.35 1" />
+ value="0.26 0.36 0.47 1"/>
<color
name="OutfitGalleryItemWorn"
value="0.33 0.58 0.47 1" />
@@ -995,6 +1010,9 @@
name="PanelGray"
value="0.27 0.27 0.27 1" />
<color
+ name="PanelDark"
+ value="0.078 0.078 0.078 1" />
+ <color
name="PerformanceMid"
value="1 0.8 0 1" />
<color
diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Rotate_Center.png b/indra/newview/skins/default/textures/bottomtray/Cam_Rotate_Center.png
index ffc3c85ea2..2e84daaf6b 100644
--- a/indra/newview/skins/default/textures/bottomtray/Cam_Rotate_Center.png
+++ b/indra/newview/skins/default/textures/bottomtray/Cam_Rotate_Center.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Rotate_In.png b/indra/newview/skins/default/textures/bottomtray/Cam_Rotate_In.png
index c8560c0869..1854cb87df 100644
--- a/indra/newview/skins/default/textures/bottomtray/Cam_Rotate_In.png
+++ b/indra/newview/skins/default/textures/bottomtray/Cam_Rotate_In.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Tracking_Center.png b/indra/newview/skins/default/textures/bottomtray/Cam_Tracking_Center.png
index 2812d614e6..d009044ee1 100644
--- a/indra/newview/skins/default/textures/bottomtray/Cam_Tracking_Center.png
+++ b/indra/newview/skins/default/textures/bottomtray/Cam_Tracking_Center.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Tracking_In.png b/indra/newview/skins/default/textures/bottomtray/Cam_Tracking_In.png
index ae2c57c207..a9415e9cc0 100644
--- a/indra/newview/skins/default/textures/bottomtray/Cam_Tracking_In.png
+++ b/indra/newview/skins/default/textures/bottomtray/Cam_Tracking_In.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Backward_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_Backward_On.png
index 9f31d461b5..f22f6e23b6 100644
--- a/indra/newview/skins/default/textures/bottomtray/Movement_Backward_On.png
+++ b/indra/newview/skins/default/textures/bottomtray/Movement_Backward_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Down_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_Down_On.png
index f7ed4c25fb..238d005bef 100644
--- a/indra/newview/skins/default/textures/bottomtray/Movement_Down_On.png
+++ b/indra/newview/skins/default/textures/bottomtray/Movement_Down_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Forward_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_Forward_On.png
index d0a825a682..ad4a02ee27 100644
--- a/indra/newview/skins/default/textures/bottomtray/Movement_Forward_On.png
+++ b/indra/newview/skins/default/textures/bottomtray/Movement_Forward_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Left_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_Left_On.png
index 2f81fb1588..1a134661eb 100644
--- a/indra/newview/skins/default/textures/bottomtray/Movement_Left_On.png
+++ b/indra/newview/skins/default/textures/bottomtray/Movement_Left_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Right_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_Right_On.png
index 4f86e81a15..8c5bf3bc66 100644
--- a/indra/newview/skins/default/textures/bottomtray/Movement_Right_On.png
+++ b/indra/newview/skins/default/textures/bottomtray/Movement_Right_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_TurnLeft_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_TurnLeft_On.png
index b211371e64..1eeab859e5 100644
--- a/indra/newview/skins/default/textures/bottomtray/Movement_TurnLeft_On.png
+++ b/indra/newview/skins/default/textures/bottomtray/Movement_TurnLeft_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_TurnRight_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_TurnRight_On.png
index e937c3f012..57762defe4 100644
--- a/indra/newview/skins/default/textures/bottomtray/Movement_TurnRight_On.png
+++ b/indra/newview/skins/default/textures/bottomtray/Movement_TurnRight_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Up_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_Up_On.png
index ed4902f3ee..512bd3b64e 100644
--- a/indra/newview/skins/default/textures/bottomtray/Movement_Up_On.png
+++ b/indra/newview/skins/default/textures/bottomtray/Movement_Up_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1.png
index cd18ae310d..b1012e505e 100644
--- a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1.png
+++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2.png
index b0ed6ee8eb..49cdadded7 100644
--- a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2.png
+++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_On.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_On.png
index be4881b64c..9afe58dcd1 100644
--- a/indra/newview/skins/default/textures/bottomtray/VoicePTT_On.png
+++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Cone_Selected.png b/indra/newview/skins/default/textures/build/Object_Cone_Selected.png
index d50dc69ffe..051c85d05d 100644
--- a/indra/newview/skins/default/textures/build/Object_Cone_Selected.png
+++ b/indra/newview/skins/default/textures/build/Object_Cone_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Cube_Selected.png b/indra/newview/skins/default/textures/build/Object_Cube_Selected.png
index 3d6964530d..3560b36ec6 100644
--- a/indra/newview/skins/default/textures/build/Object_Cube_Selected.png
+++ b/indra/newview/skins/default/textures/build/Object_Cube_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Cylinder_Selected.png b/indra/newview/skins/default/textures/build/Object_Cylinder_Selected.png
index 3ed0389961..8f752aaf4c 100644
--- a/indra/newview/skins/default/textures/build/Object_Cylinder_Selected.png
+++ b/indra/newview/skins/default/textures/build/Object_Cylinder_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Grass_Selected.png b/indra/newview/skins/default/textures/build/Object_Grass_Selected.png
index 3ebd5ea7a1..90844abe94 100644
--- a/indra/newview/skins/default/textures/build/Object_Grass_Selected.png
+++ b/indra/newview/skins/default/textures/build/Object_Grass_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Hemi_Cone_Selected.png b/indra/newview/skins/default/textures/build/Object_Hemi_Cone_Selected.png
index 3bdc4d1fd5..66e1c45567 100644
--- a/indra/newview/skins/default/textures/build/Object_Hemi_Cone_Selected.png
+++ b/indra/newview/skins/default/textures/build/Object_Hemi_Cone_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Hemi_Cylinder_Selected.png b/indra/newview/skins/default/textures/build/Object_Hemi_Cylinder_Selected.png
index 0912442e29..48ae5969a1 100644
--- a/indra/newview/skins/default/textures/build/Object_Hemi_Cylinder_Selected.png
+++ b/indra/newview/skins/default/textures/build/Object_Hemi_Cylinder_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Hemi_Sphere_Selected.png b/indra/newview/skins/default/textures/build/Object_Hemi_Sphere_Selected.png
index 33db4a2de8..eff8a231d6 100644
--- a/indra/newview/skins/default/textures/build/Object_Hemi_Sphere_Selected.png
+++ b/indra/newview/skins/default/textures/build/Object_Hemi_Sphere_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Prism_Selected.png b/indra/newview/skins/default/textures/build/Object_Prism_Selected.png
index 9e80fe2b84..ab7921b97d 100644
--- a/indra/newview/skins/default/textures/build/Object_Prism_Selected.png
+++ b/indra/newview/skins/default/textures/build/Object_Prism_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Pyramid_Selected.png b/indra/newview/skins/default/textures/build/Object_Pyramid_Selected.png
index d36bfa55d4..446951d992 100644
--- a/indra/newview/skins/default/textures/build/Object_Pyramid_Selected.png
+++ b/indra/newview/skins/default/textures/build/Object_Pyramid_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Ring_Selected.png b/indra/newview/skins/default/textures/build/Object_Ring_Selected.png
index 962f6efb93..a23e6dba50 100644
--- a/indra/newview/skins/default/textures/build/Object_Ring_Selected.png
+++ b/indra/newview/skins/default/textures/build/Object_Ring_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Sphere_Selected.png b/indra/newview/skins/default/textures/build/Object_Sphere_Selected.png
index 715d597144..daf39a658c 100644
--- a/indra/newview/skins/default/textures/build/Object_Sphere_Selected.png
+++ b/indra/newview/skins/default/textures/build/Object_Sphere_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Tetrahedron_Selected.png b/indra/newview/skins/default/textures/build/Object_Tetrahedron_Selected.png
index b2ea680f23..28175f107e 100644
--- a/indra/newview/skins/default/textures/build/Object_Tetrahedron_Selected.png
+++ b/indra/newview/skins/default/textures/build/Object_Tetrahedron_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Torus_Selected.png b/indra/newview/skins/default/textures/build/Object_Torus_Selected.png
index 1fc22686eb..049ca64f05 100644
--- a/indra/newview/skins/default/textures/build/Object_Torus_Selected.png
+++ b/indra/newview/skins/default/textures/build/Object_Torus_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Tree_Selected.png b/indra/newview/skins/default/textures/build/Object_Tree_Selected.png
index 5bd87f8a2f..8b45d668aa 100644
--- a/indra/newview/skins/default/textures/build/Object_Tree_Selected.png
+++ b/indra/newview/skins/default/textures/build/Object_Tree_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Tube_Selected.png b/indra/newview/skins/default/textures/build/Object_Tube_Selected.png
index a4c3f39e14..c94a984c41 100644
--- a/indra/newview/skins/default/textures/build/Object_Tube_Selected.png
+++ b/indra/newview/skins/default/textures/build/Object_Tube_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/Accordion_Selected.png b/indra/newview/skins/default/textures/containers/Accordion_Selected.png
index 0616dea6a3..ab852007ab 100644
--- a/indra/newview/skins/default/textures/containers/Accordion_Selected.png
+++ b/indra/newview/skins/default/textures/containers/Accordion_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/TabLeft_Flat_Off.png b/indra/newview/skins/default/textures/containers/TabLeft_Flat_Off.png
new file mode 100644
index 0000000000..d6c6bc41ec
--- /dev/null
+++ b/indra/newview/skins/default/textures/containers/TabLeft_Flat_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/TabLeft_Flat_Selected.png b/indra/newview/skins/default/textures/containers/TabLeft_Flat_Selected.png
new file mode 100644
index 0000000000..cc310bbc26
--- /dev/null
+++ b/indra/newview/skins/default/textures/containers/TabLeft_Flat_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/TabTop_First_Flat_Off.png b/indra/newview/skins/default/textures/containers/TabTop_First_Flat_Off.png
new file mode 100644
index 0000000000..177d341ba3
--- /dev/null
+++ b/indra/newview/skins/default/textures/containers/TabTop_First_Flat_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/TabTop_First_Flat_Selected.png b/indra/newview/skins/default/textures/containers/TabTop_First_Flat_Selected.png
new file mode 100644
index 0000000000..54bd4d923d
--- /dev/null
+++ b/indra/newview/skins/default/textures/containers/TabTop_First_Flat_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/TabTop_Last_Flat_Off.png b/indra/newview/skins/default/textures/containers/TabTop_Last_Flat_Off.png
new file mode 100644
index 0000000000..28a315665b
--- /dev/null
+++ b/indra/newview/skins/default/textures/containers/TabTop_Last_Flat_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/TabTop_Last_Flat_Selected.png b/indra/newview/skins/default/textures/containers/TabTop_Last_Flat_Selected.png
new file mode 100644
index 0000000000..993e79b37f
--- /dev/null
+++ b/indra/newview/skins/default/textures/containers/TabTop_Last_Flat_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/TabTop_Middle_Flat_Off.png b/indra/newview/skins/default/textures/containers/TabTop_Middle_Flat_Off.png
new file mode 100644
index 0000000000..1f5d926cc8
--- /dev/null
+++ b/indra/newview/skins/default/textures/containers/TabTop_Middle_Flat_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/TabTop_Middle_Flat_Selected.png b/indra/newview/skins/default/textures/containers/TabTop_Middle_Flat_Selected.png
new file mode 100644
index 0000000000..e4e4d27d42
--- /dev/null
+++ b/indra/newview/skins/default/textures/containers/TabTop_Middle_Flat_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/Toolbar_Middle_Selected.png b/indra/newview/skins/default/textures/containers/Toolbar_Middle_Selected.png
index 642113b135..62f82879cf 100644
--- a/indra/newview/skins/default/textures/containers/Toolbar_Middle_Selected.png
+++ b/indra/newview/skins/default/textures/containers/Toolbar_Middle_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Info_Over.png b/indra/newview/skins/default/textures/icons/Info_Over.png
index 0efd596d3e..1d00c2c175 100644
--- a/indra/newview/skins/default/textures/icons/Info_Over.png
+++ b/indra/newview/skins/default/textures/icons/Info_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_SysClosed.png b/indra/newview/skins/default/textures/icons/Inv_SysClosed.png
index 9af3b60cbd..19afa94cc4 100644
--- a/indra/newview/skins/default/textures/icons/Inv_SysClosed.png
+++ b/indra/newview/skins/default/textures/icons/Inv_SysClosed.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_SysOpen.png b/indra/newview/skins/default/textures/icons/Inv_SysOpen.png
index 01e7dbff8f..7ca0f5a849 100644
--- a/indra/newview/skins/default/textures/icons/Inv_SysOpen.png
+++ b/indra/newview/skins/default/textures/icons/Inv_SysOpen.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/SL_Logo.png b/indra/newview/skins/default/textures/icons/SL_Logo.png
index 1eafc304f5..7b147df369 100644
--- a/indra/newview/skins/default/textures/icons/SL_Logo.png
+++ b/indra/newview/skins/default/textures/icons/SL_Logo.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/back_arrow_off.png b/indra/newview/skins/default/textures/icons/back_arrow_off.png
index ab82dfc0a7..0c96257470 100644
--- a/indra/newview/skins/default/textures/icons/back_arrow_off.png
+++ b/indra/newview/skins/default/textures/icons/back_arrow_off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/back_arrow_over.png b/indra/newview/skins/default/textures/icons/back_arrow_over.png
index ad8c1f8d2c..a7fac5ef99 100644
--- a/indra/newview/skins/default/textures/icons/back_arrow_over.png
+++ b/indra/newview/skins/default/textures/icons/back_arrow_over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/back_arrow_press.png b/indra/newview/skins/default/textures/icons/back_arrow_press.png
index 8aecc3d876..0c96257470 100644
--- a/indra/newview/skins/default/textures/icons/back_arrow_press.png
+++ b/indra/newview/skins/default/textures/icons/back_arrow_press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/check_mark.png b/indra/newview/skins/default/textures/icons/check_mark.png
index 5431dd31c8..00ec32964d 100644
--- a/indra/newview/skins/default/textures/icons/check_mark.png
+++ b/indra/newview/skins/default/textures/icons/check_mark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/hand.png b/indra/newview/skins/default/textures/icons/hand.png
index d8ef2e22fa..6effb7c77d 100644
--- a/indra/newview/skins/default/textures/icons/hand.png
+++ b/indra/newview/skins/default/textures/icons/hand.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/see_me_online.png b/indra/newview/skins/default/textures/icons/see_me_online.png
index 4059035b20..51d369003c 100644
--- a/indra/newview/skins/default/textures/icons/see_me_online.png
+++ b/indra/newview/skins/default/textures/icons/see_me_online.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/locked_image_dark.png b/indra/newview/skins/default/textures/locked_image_dark.png
new file mode 100644
index 0000000000..b952f2cfb0
--- /dev/null
+++ b/indra/newview/skins/default/textures/locked_image_dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/Favorite_Star_Active.png b/indra/newview/skins/default/textures/navbar/Favorite_Star_Active.png
index e27dbe2cad..cbb78cd514 100644
--- a/indra/newview/skins/default/textures/navbar/Favorite_Star_Active.png
+++ b/indra/newview/skins/default/textures/navbar/Favorite_Star_Active.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/Favorite_Star_Over.png b/indra/newview/skins/default/textures/navbar/Favorite_Star_Over.png
index 7909d54f2b..6b4092bf49 100644
--- a/indra/newview/skins/default/textures/navbar/Favorite_Star_Over.png
+++ b/indra/newview/skins/default/textures/navbar/Favorite_Star_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/Row_Selection.png b/indra/newview/skins/default/textures/navbar/Row_Selection.png
index fc4f0c07ef..0eeb4f494c 100644
--- a/indra/newview/skins/default/textures/navbar/Row_Selection.png
+++ b/indra/newview/skins/default/textures/navbar/Row_Selection.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/square_selection.png b/indra/newview/skins/default/textures/square_selection.png
new file mode 100644
index 0000000000..9f344c4842
--- /dev/null
+++ b/indra/newview/skins/default/textures/square_selection.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index ff5737ab49..1f4b12fc91 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -124,7 +124,9 @@ with the same filename but different name
<texture name="Checkbox_Off_Disabled" file_name="widgets/Checkbox_Disabled.png" preload="true" />
<texture name="Checkbox_On_Disabled" file_name="widgets/Checkbox_On_Disabled.png" preload="true" />
<texture name="Checkbox_Off" file_name="widgets/Checkbox_Off.png" preload="true" />
+ <texture name="Checkbox_Slim_Off" file_name="widgets/Checkbox_Slim_Off.png" preload="true" />
<texture name="Checkbox_On" file_name="widgets/Checkbox_On.png" preload="true" />
+ <texture name="Checkbox_Slim_On" file_name="widgets/Checkbox_Slim_On.png" preload="true" />
<texture name="Checkbox_On_Press" file_name="widgets/Checkbox_On_Press.png" preload="true" />
<texture name="Checkbox_Press" file_name="widgets/Checkbox_Press.png" preload="true" />
<texture name="Check_Mark" file_name="icons/check_mark.png" preload="true" />
@@ -172,6 +174,8 @@ with the same filename but different name
<texture name="ComboButton_On" file_name="widgets/ComboButton_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="ComboButton_Off" file_name="widgets/ComboButton_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="ComboButton_UpOff" file_name="widgets/ComboButton_UpOff.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+ <texture name="ComboButton_Arrow" file_name="widgets/ComboButton_Arrow.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+ <texture name="ComboButton_Transparent" file_name="widgets/ComboButton_Transparent.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="Container" file_name="containers/Container.png" preload="false" />
@@ -559,15 +563,16 @@ with the same filename but different name
<texture name="PushButton_On" file_name="widgets/PushButton_On.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_On_Selected" file_name="widgets/PushButton_On_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Over" file_name="widgets/PushButton_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
- <texture name="PushButton_Press" file_name="widgets/PushButton_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
- <texture name="PushButton_Selected" file_name="widgets/PushButton_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Selected" file_name="widgets/PushButton_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Selected_Press" file_name="widgets/PushButton_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Selected_Disabled" file_name="widgets/PushButton_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Login" file_name="widgets/PushButton_Login.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Login_Over" file_name="widgets/PushButton_Login_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Login_Pressed" file_name="widgets/PushButton_Login_Pressed.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
-
+ <texture name="PushButton_Sign" file_name="widgets/PushButton_Sign.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Sign_Over" file_name="widgets/PushButton_Sign_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Sign_Pressed" file_name="widgets/PushButton_Sign_Pressed.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="RadioButton_Press" file_name="widgets/RadioButton_Press.png" preload="true" />
<texture name="RadioButton_On_Press" file_name="widgets/RadioButton_On_Press.png" preload="true" />
@@ -648,6 +653,8 @@ with the same filename but different name
<texture name="OBJECT_Icon" file_name="icons/object_icon.png" preload="true" />
<texture name="Unknown_Icon" file_name="icons/unknown_icon.png" preload="true" />
+ <texture name="Square_Selection" file_name="square_selection.png" preload="true" scale.left="16" scale.top="16" scale.right="112" scale.bottom="16" />
+
<texture name="Snapshot_Off" file_name="bottomtray/Snapshot_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="Snapshot_Download" file_name="snapshot_download.png" preload="false" />
<texture name="Snapshot_Email" file_name="snapshot_email.png" preload="false" />
@@ -656,6 +663,7 @@ with the same filename but different name
<texture name="startup_logo" file_name="windows/startup_logo.png" preload="true" />
<texture name="login_sl_logo" file_name="windows/login_sl_logo.png" preload="true" />
+ <texture name="login_sl_logo_horizontal" file_name="windows/login_sl_logo_horizontal.png" preload="true" />
<texture name="login_sl_logo_small" file_name="windows/login_sl_logo_small.png" preload="true" />
<texture name="first_login_image" file_name="windows/first_login_image.jpg" preload="true" />
@@ -685,6 +693,15 @@ with the same filename but different name
<texture name="TabIcon_Places_Off" file_name="taskpanel/TabIcon_Places_Off.png" preload="false" />
<texture name="TabIcon_Things_Off" file_name="taskpanel/TabIcon_Things_Off.png" preload="false" />
+ <texture name="TabLeft_Flat_Off" file_name="containers/TabLeft_Flat_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="TabLeft_Flat_Selected" file_name="containers/TabLeft_Flat_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="TabTop_First_Flat_Off" file_name="containers/TabTop_First_Flat_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
+ <texture name="TabTop_Last_Flat_Off" file_name="containers/TabTop_Last_Flat_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
+ <texture name="TabTop_Middle_Flat_Off" file_name="containers/TabTop_Middle_Flat_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
+ <texture name="TabTop_First_Flat_Selected" file_name="containers/TabTop_First_Flat_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
+ <texture name="TabTop_Last_Flat_Selected" file_name="containers/TabTop_Last_Flat_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
+ <texture name="TabTop_Middle_Flat_Selected" file_name="containers/TabTop_Middle_Flat_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
+
<texture name="TabTop_Right_Off" file_name="containers/TabTop_Right_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
<texture name="TabTop_Right_Selected" file_name="containers/TabTop_Right_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
<texture name="TabTop_Right_Flashing" file_name="containers/TabTop_Right_Flashing.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
@@ -702,7 +719,9 @@ with the same filename but different name
<texture name="TextField_Search_Off" file_name="widgets/TextField_Search_Off.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
<texture name="TextField_Disabled" file_name="widgets/TextField_Disabled.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
<texture name="TextField_Active" file_name="widgets/TextField_Active.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="TextField_Highlight" file_name="widgets/TextField_Highlight.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
<texture name="TextField_Search_Highlight" file_name="widgets/TextField_Search_Highlight.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="TextField_Transparent" file_name="widgets/TextField_Transparent.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="Thumbnail_Fallback" file_name="icons/thumbnail_fallback_icon.png" preload="true" />
@@ -870,6 +889,7 @@ with the same filename but different name
<texture name="badge_warn.j2c" />
<texture name="badge_ok.j2c" />
<texture name="materials_ui_x_24.png" />
+ <texture name="locked_image" file_name="locked_image_dark.png" preload="true"/>
<texture name="Progress_1" file_name="icons/Progress_1.png" preload="true" />
<texture name="Progress_2" file_name="icons/Progress_2.png" preload="true" />
diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_Disabled.png b/indra/newview/skins/default/textures/widgets/Checkbox_Disabled.png
index 8439f82e29..383ff8f6e3 100644
--- a/indra/newview/skins/default/textures/widgets/Checkbox_Disabled.png
+++ b/indra/newview/skins/default/textures/widgets/Checkbox_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_Off.png b/indra/newview/skins/default/textures/widgets/Checkbox_Off.png
index cb9a04d84f..66f12496cb 100644
--- a/indra/newview/skins/default/textures/widgets/Checkbox_Off.png
+++ b/indra/newview/skins/default/textures/widgets/Checkbox_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_On.png b/indra/newview/skins/default/textures/widgets/Checkbox_On.png
index 0ec090504a..549bbde5cd 100644
--- a/indra/newview/skins/default/textures/widgets/Checkbox_On.png
+++ b/indra/newview/skins/default/textures/widgets/Checkbox_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_On_Disabled.png b/indra/newview/skins/default/textures/widgets/Checkbox_On_Disabled.png
index 5759f7de69..9c80670837 100644
--- a/indra/newview/skins/default/textures/widgets/Checkbox_On_Disabled.png
+++ b/indra/newview/skins/default/textures/widgets/Checkbox_On_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_On_Press.png b/indra/newview/skins/default/textures/widgets/Checkbox_On_Press.png
index ba46e91c55..903c61f01b 100644
--- a/indra/newview/skins/default/textures/widgets/Checkbox_On_Press.png
+++ b/indra/newview/skins/default/textures/widgets/Checkbox_On_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_Press.png b/indra/newview/skins/default/textures/widgets/Checkbox_Press.png
index 5f5a33d878..96dfd7267c 100644
--- a/indra/newview/skins/default/textures/widgets/Checkbox_Press.png
+++ b/indra/newview/skins/default/textures/widgets/Checkbox_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_Slim_Off.png b/indra/newview/skins/default/textures/widgets/Checkbox_Slim_Off.png
new file mode 100644
index 0000000000..99af0397d5
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/Checkbox_Slim_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_Slim_On.png b/indra/newview/skins/default/textures/widgets/Checkbox_Slim_On.png
new file mode 100644
index 0000000000..cabecf1467
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/Checkbox_Slim_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Arrow.png b/indra/newview/skins/default/textures/widgets/ComboButton_Arrow.png
new file mode 100644
index 0000000000..7961967458
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/ComboButton_Arrow.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Disabled.png b/indra/newview/skins/default/textures/widgets/ComboButton_Disabled.png
index ebeb813349..5b2bc7b163 100644
--- a/indra/newview/skins/default/textures/widgets/ComboButton_Disabled.png
+++ b/indra/newview/skins/default/textures/widgets/ComboButton_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Off.png b/indra/newview/skins/default/textures/widgets/ComboButton_Off.png
index 4f573cf6fa..7199470307 100644
--- a/indra/newview/skins/default/textures/widgets/ComboButton_Off.png
+++ b/indra/newview/skins/default/textures/widgets/ComboButton_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Selected.png b/indra/newview/skins/default/textures/widgets/ComboButton_Selected.png
index 1a834bfbbc..715b401ce5 100644
--- a/indra/newview/skins/default/textures/widgets/ComboButton_Selected.png
+++ b/indra/newview/skins/default/textures/widgets/ComboButton_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Transparent.png b/indra/newview/skins/default/textures/widgets/ComboButton_Transparent.png
new file mode 100644
index 0000000000..4b978877e1
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/ComboButton_Transparent.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png b/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png
index 5a067aca7c..9e74524be4 100644
--- a/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png
+++ b/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_UpSelected.png b/indra/newview/skins/default/textures/widgets/ComboButton_UpSelected.png
index ff56367147..aa8865c33d 100644
--- a/indra/newview/skins/default/textures/widgets/ComboButton_UpSelected.png
+++ b/indra/newview/skins/default/textures/widgets/ComboButton_UpSelected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/DropDown_Disabled.png b/indra/newview/skins/default/textures/widgets/DropDown_Disabled.png
index 9a69f7e0d9..fff0cfaff2 100644
--- a/indra/newview/skins/default/textures/widgets/DropDown_Disabled.png
+++ b/indra/newview/skins/default/textures/widgets/DropDown_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/DropDown_Off.png b/indra/newview/skins/default/textures/widgets/DropDown_Off.png
index b118e7a7d4..9f6a2313b9 100644
--- a/indra/newview/skins/default/textures/widgets/DropDown_Off.png
+++ b/indra/newview/skins/default/textures/widgets/DropDown_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/DropDown_On.png b/indra/newview/skins/default/textures/widgets/DropDown_On.png
index 613a8c2ff6..a498465940 100644
--- a/indra/newview/skins/default/textures/widgets/DropDown_On.png
+++ b/indra/newview/skins/default/textures/widgets/DropDown_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/DropDown_Press.png b/indra/newview/skins/default/textures/widgets/DropDown_Press.png
index fa3a152df1..b6bf4d1c22 100644
--- a/indra/newview/skins/default/textures/widgets/DropDown_Press.png
+++ b/indra/newview/skins/default/textures/widgets/DropDown_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ListItem_Over.png b/indra/newview/skins/default/textures/widgets/ListItem_Over.png
index e72c1c4020..9316567e7b 100644
--- a/indra/newview/skins/default/textures/widgets/ListItem_Over.png
+++ b/indra/newview/skins/default/textures/widgets/ListItem_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ListItem_Select.png b/indra/newview/skins/default/textures/widgets/ListItem_Select.png
index 0e16a8b454..cd65d347d6 100644
--- a/indra/newview/skins/default/textures/widgets/ListItem_Select.png
+++ b/indra/newview/skins/default/textures/widgets/ListItem_Select.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Off.png b/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Off.png
index de71f763d3..b2767c6174 100644
--- a/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Off.png
+++ b/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Selected.png b/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Selected.png
index 8bfa3acb42..de50b29f79 100644
--- a/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Selected.png
+++ b/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Disabled.png b/indra/newview/skins/default/textures/widgets/PushButton_Disabled.png
index e99ec4b14b..64a9a2d885 100644
--- a/indra/newview/skins/default/textures/widgets/PushButton_Disabled.png
+++ b/indra/newview/skins/default/textures/widgets/PushButton_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Login.png b/indra/newview/skins/default/textures/widgets/PushButton_Login.png
index 8e7d932ab1..7e892d2b0a 100644
--- a/indra/newview/skins/default/textures/widgets/PushButton_Login.png
+++ b/indra/newview/skins/default/textures/widgets/PushButton_Login.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Login_Over.png b/indra/newview/skins/default/textures/widgets/PushButton_Login_Over.png
index 038ba23be2..9110889d6c 100644
--- a/indra/newview/skins/default/textures/widgets/PushButton_Login_Over.png
+++ b/indra/newview/skins/default/textures/widgets/PushButton_Login_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Login_Pressed.png b/indra/newview/skins/default/textures/widgets/PushButton_Login_Pressed.png
index 828aa1a139..bf38c2cd75 100644
--- a/indra/newview/skins/default/textures/widgets/PushButton_Login_Pressed.png
+++ b/indra/newview/skins/default/textures/widgets/PushButton_Login_Pressed.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Off.png b/indra/newview/skins/default/textures/widgets/PushButton_Off.png
index 29eeed7c78..113c371a4d 100644
--- a/indra/newview/skins/default/textures/widgets/PushButton_Off.png
+++ b/indra/newview/skins/default/textures/widgets/PushButton_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/PushButton_On.png b/indra/newview/skins/default/textures/widgets/PushButton_On.png
index 65d92a9d82..db70f75dd6 100644
--- a/indra/newview/skins/default/textures/widgets/PushButton_On.png
+++ b/indra/newview/skins/default/textures/widgets/PushButton_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Over.png b/indra/newview/skins/default/textures/widgets/PushButton_Over.png
index 819f27c0ba..67dfa0ca75 100644
--- a/indra/newview/skins/default/textures/widgets/PushButton_Over.png
+++ b/indra/newview/skins/default/textures/widgets/PushButton_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Press.png b/indra/newview/skins/default/textures/widgets/PushButton_Press.png
index b0a92d8ffe..8dfa9030b1 100644
--- a/indra/newview/skins/default/textures/widgets/PushButton_Press.png
+++ b/indra/newview/skins/default/textures/widgets/PushButton_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Selected_Press.png b/indra/newview/skins/default/textures/widgets/PushButton_Selected_Press.png
index 8588576fb0..062fcf9246 100644
--- a/indra/newview/skins/default/textures/widgets/PushButton_Selected_Press.png
+++ b/indra/newview/skins/default/textures/widgets/PushButton_Selected_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Sign.png b/indra/newview/skins/default/textures/widgets/PushButton_Sign.png
new file mode 100644
index 0000000000..f1c27f8c9b
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/PushButton_Sign.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Sign_Over.png b/indra/newview/skins/default/textures/widgets/PushButton_Sign_Over.png
new file mode 100644
index 0000000000..efef8bebad
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/PushButton_Sign_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Sign_Pressed.png b/indra/newview/skins/default/textures/widgets/PushButton_Sign_Pressed.png
new file mode 100644
index 0000000000..ec3409e8b8
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/PushButton_Sign_Pressed.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_Disabled.png b/indra/newview/skins/default/textures/widgets/RadioButton_Disabled.png
index 32ec25fe0e..fb98907be2 100644
--- a/indra/newview/skins/default/textures/widgets/RadioButton_Disabled.png
+++ b/indra/newview/skins/default/textures/widgets/RadioButton_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_Off.png b/indra/newview/skins/default/textures/widgets/RadioButton_Off.png
index 5d267af5dc..231aead651 100644
--- a/indra/newview/skins/default/textures/widgets/RadioButton_Off.png
+++ b/indra/newview/skins/default/textures/widgets/RadioButton_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_On.png b/indra/newview/skins/default/textures/widgets/RadioButton_On.png
index e6bf0db157..066872ff82 100644
--- a/indra/newview/skins/default/textures/widgets/RadioButton_On.png
+++ b/indra/newview/skins/default/textures/widgets/RadioButton_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_On_Disabled.png b/indra/newview/skins/default/textures/widgets/RadioButton_On_Disabled.png
index 72aae43618..43af5bec2f 100644
--- a/indra/newview/skins/default/textures/widgets/RadioButton_On_Disabled.png
+++ b/indra/newview/skins/default/textures/widgets/RadioButton_On_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_On_Press.png b/indra/newview/skins/default/textures/widgets/RadioButton_On_Press.png
index f3883b82b3..6870a48129 100644
--- a/indra/newview/skins/default/textures/widgets/RadioButton_On_Press.png
+++ b/indra/newview/skins/default/textures/widgets/RadioButton_On_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_Press.png b/indra/newview/skins/default/textures/widgets/RadioButton_Press.png
index 0025256045..0fb0054bfb 100644
--- a/indra/newview/skins/default/textures/widgets/RadioButton_Press.png
+++ b/indra/newview/skins/default/textures/widgets/RadioButton_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz.png b/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz.png
index 9afc907c1c..eb9563e0ee 100644
--- a/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz.png
+++ b/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert.png b/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert.png
index ede643e528..144a7cba25 100644
--- a/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert.png
+++ b/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Disabled.png
index d9f05d33ec..8ad008ba51 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Disabled.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected.png
index d2342f6538..ca5f84a088 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png
index 6223ad8dfe..9b1531a11e 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Press.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Press.png
index 101d5a0930..28f5bf37f7 100644
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Press.png
+++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SliderThumb_Disabled.png b/indra/newview/skins/default/textures/widgets/SliderThumb_Disabled.png
index 5cfa3ae4e1..fb98907be2 100644
--- a/indra/newview/skins/default/textures/widgets/SliderThumb_Disabled.png
+++ b/indra/newview/skins/default/textures/widgets/SliderThumb_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SliderThumb_Off.png b/indra/newview/skins/default/textures/widgets/SliderThumb_Off.png
index 66cdcbeb94..231aead651 100644
--- a/indra/newview/skins/default/textures/widgets/SliderThumb_Off.png
+++ b/indra/newview/skins/default/textures/widgets/SliderThumb_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SliderThumb_Press.png b/indra/newview/skins/default/textures/widgets/SliderThumb_Press.png
index 0bf8e43e81..0fb0054bfb 100644
--- a/indra/newview/skins/default/textures/widgets/SliderThumb_Press.png
+++ b/indra/newview/skins/default/textures/widgets/SliderThumb_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SliderTrack_Horiz.png b/indra/newview/skins/default/textures/widgets/SliderTrack_Horiz.png
index 720830f83f..65cfaf4c62 100644
--- a/indra/newview/skins/default/textures/widgets/SliderTrack_Horiz.png
+++ b/indra/newview/skins/default/textures/widgets/SliderTrack_Horiz.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Stepper_Down_Off.png b/indra/newview/skins/default/textures/widgets/Stepper_Down_Off.png
index 51d269bd45..720946aba6 100644
--- a/indra/newview/skins/default/textures/widgets/Stepper_Down_Off.png
+++ b/indra/newview/skins/default/textures/widgets/Stepper_Down_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Stepper_Down_Press.png b/indra/newview/skins/default/textures/widgets/Stepper_Down_Press.png
index b4f19b7dbb..505fa6c82c 100644
--- a/indra/newview/skins/default/textures/widgets/Stepper_Down_Press.png
+++ b/indra/newview/skins/default/textures/widgets/Stepper_Down_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Stepper_Up_Off.png b/indra/newview/skins/default/textures/widgets/Stepper_Up_Off.png
index a01d928aef..9482e4773e 100644
--- a/indra/newview/skins/default/textures/widgets/Stepper_Up_Off.png
+++ b/indra/newview/skins/default/textures/widgets/Stepper_Up_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Stepper_Up_Press.png b/indra/newview/skins/default/textures/widgets/Stepper_Up_Press.png
index d5b672d943..ca311768c4 100644
--- a/indra/newview/skins/default/textures/widgets/Stepper_Up_Press.png
+++ b/indra/newview/skins/default/textures/widgets/Stepper_Up_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/TextField_Highlight.png b/indra/newview/skins/default/textures/widgets/TextField_Highlight.png
new file mode 100644
index 0000000000..71c2a5dbc3
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/TextField_Highlight.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/TextField_Transparent.png b/indra/newview/skins/default/textures/widgets/TextField_Transparent.png
new file mode 100644
index 0000000000..1735184387
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/TextField_Transparent.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/track_control_moon_back.png b/indra/newview/skins/default/textures/widgets/track_control_moon_back.png
index 03d1e805e1..1e2ce7bc83 100644
--- a/indra/newview/skins/default/textures/widgets/track_control_moon_back.png
+++ b/indra/newview/skins/default/textures/widgets/track_control_moon_back.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/track_control_moon_front.png b/indra/newview/skins/default/textures/widgets/track_control_moon_front.png
index cdc52fe08a..25f2914ecc 100644
--- a/indra/newview/skins/default/textures/widgets/track_control_moon_front.png
+++ b/indra/newview/skins/default/textures/widgets/track_control_moon_front.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/track_control_sphere.png b/indra/newview/skins/default/textures/widgets/track_control_sphere.png
index 60a81d1fea..adfb51edd2 100644
--- a/indra/newview/skins/default/textures/widgets/track_control_sphere.png
+++ b/indra/newview/skins/default/textures/widgets/track_control_sphere.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/track_control_sun_back.png b/indra/newview/skins/default/textures/widgets/track_control_sun_back.png
index b3191ccc5d..98bae90332 100644
--- a/indra/newview/skins/default/textures/widgets/track_control_sun_back.png
+++ b/indra/newview/skins/default/textures/widgets/track_control_sun_back.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Inspector_I.png b/indra/newview/skins/default/textures/windows/Inspector_I.png
index 843f6e9fbe..d51cf43051 100644
--- a/indra/newview/skins/default/textures/windows/Inspector_I.png
+++ b/indra/newview/skins/default/textures/windows/Inspector_I.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Window_Background.png b/indra/newview/skins/default/textures/windows/Window_Background.png
index 9864ec0db8..83a09584c1 100644
--- a/indra/newview/skins/default/textures/windows/Window_Background.png
+++ b/indra/newview/skins/default/textures/windows/Window_Background.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Window_Foreground.png b/indra/newview/skins/default/textures/windows/Window_Foreground.png
index a86b236504..1f4f9040bc 100644
--- a/indra/newview/skins/default/textures/windows/Window_Foreground.png
+++ b/indra/newview/skins/default/textures/windows/Window_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/login_sl_logo_horizontal.png b/indra/newview/skins/default/textures/windows/login_sl_logo_horizontal.png
new file mode 100644
index 0000000000..f56d0bd542
--- /dev/null
+++ b/indra/newview/skins/default/textures/windows/login_sl_logo_horizontal.png
Binary files differ
diff --git a/indra/newview/skins/default/xui/da/floater_joystick.xml b/indra/newview/skins/default/xui/da/floater_joystick.xml
index 49e1397e9f..c756bc6969 100644
--- a/indra/newview/skins/default/xui/da/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/da/floater_joystick.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Joystick" title="JOYSTICK OPSÆTNING">
<check_box label="Aktiver Joystick:" name="enable_joystick"/>
- <spinner label="X akse mapping" name="JoystickAxis1"/>
- <spinner label="Y akse mapping" name="JoystickAxis2"/>
- <spinner label="Z akse mapping" name="JoystickAxis0"/>
- <spinner label="Hældning mapping" name="JoystickAxis4"/>
- <spinner label="Drejning mapping" name="JoystickAxis5"/>
- <spinner label="Rulning mapping" name="JoystickAxis3"/>
- <spinner label="Zoom mapping" name="JoystickAxis6"/>
+ <spinner label="X akse mapping" name="JoystickAxis1" label_width="115" width="155"/>
+ <spinner label="Y akse mapping" name="JoystickAxis2" label_width="115" width="155"/>
+ <spinner label="Z akse mapping" name="JoystickAxis0" label_width="115" width="155"/>
+ <spinner label="Hældning mapping" name="JoystickAxis4" label_width="115" width="155"/>
+ <spinner label="Drejning mapping" name="JoystickAxis5" label_width="115" width="155"/>
+ <spinner label="Rulning mapping" name="JoystickAxis3" label_width="115" width="155"/>
+ <spinner label="Zoom mapping" name="JoystickAxis6" label_width="115" width="155"/>
<check_box label="Direkte zoom" name="ZoomDirect"/>
<check_box label="3D Cursor" name="Cursor3D"/>
<check_box label="Auto opret" name="AutoLeveling"/>
diff --git a/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml
index 443e84b64a..e05be4e310 100644
--- a/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml
+++ b/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml
@@ -3,7 +3,7 @@
<text name="media_label">
Indtast en URL eller et URL mønster for at tilføje til listen med godkendte domæner
</text>
- <line_editor name="whitelist_entry" tool_tip="Indtast en URL eller et URL mønster for at godkende side(r)"/>
+ <line_editor name="whitelist_entry" tool_tip="Indtast en URL eller et URL mønster for at godkende side(r)" bottom_delta="25"/>
<button label="OK" name="ok_btn"/>
<button label="Annullér" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml
index 7caa17d514..fa245416cf 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml
@@ -4,6 +4,7 @@
Vis mig når:
</text>
<check_box label="Når jeg bruger eller får L$" name="notify_money_change_checkbox"/>
+ <check_box name="notify_money_spend_checkbox" left_delta="70"/>
<check_box label="Når mine venner logger på eller af" name="friends_online_notify_checkbox"/>
<text name="show_label">
Vis altid:
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml
index 26d2ae4abd..acae39061b 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml
@@ -30,7 +30,7 @@
<radio_item label="Avatar position" name="1"/>
</radio_group>
<check_box label="Bevæg avatar-læber når der snakkes" name="enable_lip_sync"/>
- <check_box label="Skift tale tænd/sluk når jeg trykker:" name="push_to_talk_toggle_check" tool_tip="Når du er i skift-modus, vil hvert tryk tænde eller slukke din mikrofon. Når du ikke er i skift-modus, vil din mikrofon kun være tændt når knappen/tasten holdes nede (som en Walkie Talkie)"/>
+ <check_box label="Skift tale tænd/sluk når jeg trykker" name="push_to_talk_toggle_check" tool_tip="Når du er i skift-modus, vil hvert tryk tænde eller slukke din mikrofon. Når du ikke er i skift-modus, vil din mikrofon kun være tændt når knappen/tasten holdes nede (som en Walkie Talkie)"/>
<line_editor label="Tryk-for-tale udløser" name="modifier_combo"/>
<button label="Angiv taste" name="set_voice_hotkey_button"/>
<button name="set_voice_middlemouse_button" tool_tip="Nulstil til midterste muse-knap"/>
diff --git a/indra/newview/skins/default/xui/de/panel_login_first.xml b/indra/newview/skins/default/xui/de/panel_login_first.xml
deleted file mode 100644
index 038001157e..0000000000
--- a/indra/newview/skins/default/xui/de/panel_login_first.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<panel name="panel_login">
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php?lang=de
- </panel.string>
- <panel.string name="sign_up_url">
- https://join.secondlife.com/
- </panel.string>
- <layout_stack name="logo_stack">
- <layout_panel name="parent_panel2">
- <layout_stack name="widget_stack">
- <layout_panel name="widget_container">
- <combo_box label="Benutzername" name="username_combo" tool_tip="Bei der Registrierung gewählter Benutzername wie „berndschmidt12“ oder „Liebe Sonne“"/>
- <line_editor label="Kennwort" name="password_edit"/>
- <button label="Anmelden" name="connect_btn"/>
- <check_box label="Details speichern" name="remember_check"/>
- <text name="forgot_password_text">
- Kennwort vergessen
- </text>
- <text name="sign_up_text">
- Registrieren
- </text>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="parent_panel3">
- <layout_stack name="images_stack">
- <layout_panel name="images_container">
- <text name="image_caption_left">
- Ihr erster Schritt ist Learning Island. Suchen Sie die Pforte!
- </text>
- <text name="image_caption_right">
- Erkunden Sie dann Social Island und lernen Sie andere Einwohner kennen!
- </text>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
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 c5b42b6dae..ffb9c0f78e 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -974,7 +974,7 @@
layout="topleft"
left="28"
name="Set to group:"
- top_pad="5"
+ top_pad="9"
width="176">
Set to group:
</text>
@@ -1022,7 +1022,7 @@
layout="topleft"
left="28"
name="Owned by others:"
- top_pad="5"
+ top_pad="9"
width="176">
Owned by others:
</text>
@@ -1593,7 +1593,7 @@ Only large parcels can be listed in search.
left="10"
name="with media:"
top="10"
- width="100">
+ width="110">
Type:
</text>
<combo_box
@@ -1620,7 +1620,7 @@ Only large parcels can be listed in search.
layout="topleft"
left="10"
name="at URL:"
- width="100"
+ width="110"
top_pad="10">
Home Page:
</text>
@@ -1632,7 +1632,7 @@ Only large parcels can be listed in search.
max_length_bytes="255"
name="media_url"
select_on_focus="true"
- width="300"
+ width="290"
top_delta="0"/>
<button
follows="left|top"
@@ -1659,13 +1659,13 @@ Only large parcels can be listed in search.
follows="left|top"
height="20"
layout="topleft"
- left="110"
+ left="120"
max_length_bytes="255"
name="url_description"
select_on_focus="true"
tool_tip="Text displayed next to play/load button"
top_delta="0"
- width="300" />
+ width="290" />
<text
type="string"
length="1"
@@ -1685,7 +1685,7 @@ Only large parcels can be listed in search.
follows="left|top"
height="80"
layout="topleft"
- left="110"
+ left="120"
name="media texture"
tool_tip="Click to choose a picture"
top_delta="0"
@@ -1698,7 +1698,7 @@ Only large parcels can be listed in search.
layout="topleft"
left_pad="8"
name="replace_texture_help"
- width="300"
+ width="290"
word_wrap="true"
top_delta="0">
Objects using this texture will show the movie or web page after you click the play arrow. Select the thumbnail to choose a different texture.
@@ -1707,7 +1707,7 @@ Only large parcels can be listed in search.
height="16"
label="Auto scale"
layout="topleft"
- left="107"
+ left="117"
name="media_auto_scale"
top_pad="-10"
tool_tip="Checking this option will scale the content for this parcel automatically. It may be slightly slower and lower quality visually but no other texture scaling or alignment will be required."
@@ -1721,7 +1721,7 @@ Only large parcels can be listed in search.
left="10"
name="media_size"
tool_tip="Size to render Web media, leave 0 for default."
- width="100"
+ width="110"
top_pad="10">
Size:
</text>
@@ -1776,7 +1776,7 @@ Only large parcels can be listed in search.
left="10"
name="Options:"
top_pad="10"
- width="100">
+ width="110">
Options:
</text>
<check_box
@@ -1786,7 +1786,7 @@ Only large parcels can be listed in search.
left_pad="-3"
name="media_loop"
tool_tip="Play media in a loop. When the media has finished playing, it will restart from the beginning."
- top_delta="-1"
+ top_delta="1"
width="200" />
</panel>
<panel
diff --git a/indra/newview/skins/default/xui/en/floater_add_payment_method.xml b/indra/newview/skins/default/xui/en/floater_add_payment_method.xml
index 870ddee554..308f4feb5a 100644
--- a/indra/newview/skins/default/xui/en/floater_add_payment_method.xml
+++ b/indra/newview/skins/default/xui/en/floater_add_payment_method.xml
@@ -50,7 +50,6 @@
follows="top|left|right"
height="24"
label="Get started"
- font="SansSerifMedium"
layout="topleft"
left="320"
name="continue_btn"
@@ -59,6 +58,7 @@
image_hover_unselected="PushButton_Login_Over"
label_color="White"
top_pad ="15"
+ pad_bottom="1"
width="140"/>
<button
follows="top|left|right"
@@ -66,6 +66,7 @@
label="Later"
layout="topleft"
left_pad="9"
+ pad_bottom="1"
name="close_btn"
width="90"/>
<icon
@@ -97,7 +98,6 @@
type="string"
length="1"
follows="top|left"
- font="SansSerifMedium"
text_color="White"
height="75"
width="260"
@@ -112,7 +112,6 @@
type="string"
length="1"
follows="top|left"
- font="SansSerifMedium"
text_color="White"
height="75"
width="260"
@@ -126,7 +125,6 @@
type="string"
length="1"
follows="top|left"
- font="SansSerifMedium"
text_color="White"
height="75"
width="260"
diff --git a/indra/newview/skins/default/xui/en/floater_adjust_environment.xml b/indra/newview/skins/default/xui/en/floater_adjust_environment.xml
index 889eeb5369..d6dc112dce 100644
--- a/indra/newview/skins/default/xui/en/floater_adjust_environment.xml
+++ b/indra/newview/skins/default/xui/en/floater_adjust_environment.xml
@@ -47,15 +47,15 @@
name="ambient_lbl"
height="10"
layout="topleft"
- left="10"
+ left="7"
top="5"
- width="80">Ambient:</text>
+ width="80">Ambient</text>
<color_swatch can_apply_immediately="true"
follows="left|top"
height="40"
label_height="0"
layout="topleft"
- left_delta="0"
+ left_delta="3"
name="ambient_light"
top_pad="5"
width="60"/>
@@ -63,15 +63,15 @@
name="blue_horizon_lbl"
height="10"
layout="topleft"
- left_delta="0"
+ left="7"
top_pad="10"
- width="80">Blue Horizon:</text>
+ width="80">Blue Horizon</text>
<color_swatch can_apply_immediately="true"
follows="left|top"
height="40"
label_height="0"
layout="topleft"
- left_delta="0"
+ left_delta="3"
name="blue_horizon"
top_pad="5"
width="60"/>
@@ -79,15 +79,15 @@
name="blue_density_lbl"
height="10"
layout="topleft"
- left_delta="0"
+ left="7"
top_pad="10"
- width="80">Blue Density:</text>
+ width="80">Blue Density</text>
<color_swatch can_apply_immediately="true"
follows="left|top"
height="40"
label_height="0"
layout="topleft"
- left_delta="0"
+ left_delta="3"
name="blue_density"
top_pad="5"
width="60"/>
@@ -107,7 +107,7 @@
layout="topleft"
right="-12"
top="5"
- width="60">Sun Color:</text>
+ width="60">Sun Color</text>
<color_swatch can_apply_immediately="true"
follows="left|top"
height="10"
@@ -123,7 +123,7 @@
layout="topleft"
left_delta="0"
top_pad="5"
- width="80">Cloud Color:</text>
+ width="80">Cloud Color</text>
<color_swatch can_apply_immediately="true"
follows="left|top"
height="10"
@@ -139,7 +139,7 @@
left_delta="0"
top_pad="10"
name="cloud_map_label"
- width="80">Cloud Image:</text>
+ width="80">Cloud Image</text>
<texture_picker height="63"
layout="topleft"
left_delta="0"
@@ -152,7 +152,7 @@
left_delta="0"
top_pad="-13"
name="water_map_label"
- width="80">Water Image:</text>
+ width="80">Water Image</text>
<texture_picker height="63"
layout="topleft"
left_delta="0"
diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
index adbce0d982..0c82cbb00c 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
@@ -63,7 +63,7 @@
layout="topleft"
left="10"
name="InstructSearchResidentName"
- top="8"
+ top="7"
width="220">
Type part of a person&apos;s name:
</text>
@@ -76,7 +76,7 @@
height="23"
left_delta="0"
name="Edit"
- top_pad="0"
+ top_pad="3"
width="65" />
<button
follows="top|right"
diff --git a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml
index 7636284b4b..17631ad30c 100644
--- a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml
@@ -29,7 +29,7 @@
control_name="BulkChangeIncludeAnimations"
height="16"
name="check_animation"
- top="24"
+ top="30"
left="10"
width="16" />
<icon
@@ -73,7 +73,7 @@
name="check_gesture"
left="95"
width="16"
- top="25" />
+ top="30" />
<icon
height="16"
image_name="Inv_Gesture"
@@ -116,7 +116,7 @@
control_name="BulkChangeIncludeScripts"
height="16"
name="check_script"
- top="25"
+ top="30"
left="180"
width="16"
/>
@@ -161,7 +161,7 @@
height="16"
name="check_settings"
left="245"
- top="25"
+ top="30"
width="16" />
<icon
height="16"
@@ -291,7 +291,7 @@
height="16"
label="Copy"
layout="topleft"
- top_pad="0"
+ top_pad="3"
name="next_owner_copy"
tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied."
width="92">
@@ -302,7 +302,7 @@
control_name="BulkChangeNextOwnerTransfer"
enabled_control="BulkChangeNextOwnerCopy"
height="16"
- top_pad="0"
+ top_pad="3"
initial_value="true"
label="Transfer"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
index e8e83301be..5e0903a40f 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
@@ -93,7 +93,6 @@
type="string"
length="1"
follows="top|left"
- font="SansSerifMedium"
height="16"
layout="topleft"
left="20"
@@ -105,7 +104,6 @@
<text
type="string"
length="1"
- font="SansSerifMedium"
follows="top|left"
halign="right"
height="16"
@@ -128,7 +126,6 @@
type="string"
length="1"
follows="top|left"
- font="SansSerifMedium"
height="16"
layout="topleft"
left="20"
@@ -140,7 +137,6 @@
<text
type="string"
length="1"
- font="SansSerifMedium"
follows="top|left"
halign="right"
height="16"
@@ -163,7 +159,6 @@
type="string"
length="1"
follows="top|left"
- font="SansSerifMedium"
font.style="BOLD"
height="16"
layout="topleft"
@@ -176,7 +171,6 @@
<text
type="string"
length="1"
- font="SansSerifMedium"
follows="top|left"
halign="right"
height="16"
@@ -207,7 +201,6 @@
type="string"
length="1"
follows="top|left"
- font="SansSerifMedium"
height="16"
top_pad="15"
layout="topleft"
@@ -217,7 +210,6 @@
Choose amount to buy
</text>
<text
- font="SansSerifMedium"
type="string"
length="1"
follows="left|top"
@@ -233,7 +225,6 @@
type="string"
max_length_bytes="10"
halign="right"
- font="SansSerifMedium"
select_on_focus="true"
follows="top|left"
top_delta="-4"
@@ -247,7 +238,6 @@
<text
type="string"
length="1"
- font="SansSerifMedium"
text_color="EmphasisColor"
follows="top|left"
halign="right"
@@ -276,7 +266,6 @@
</text>
<text
type="string"
- font="SansSerifMedium"
length="1"
follows="top|left"
height="16"
@@ -290,7 +279,6 @@
<text
type="string"
length="1"
- font="SansSerifMedium"
follows="top|left"
top_delta="0"
height="16"
@@ -350,7 +338,6 @@ Re-enter amount to see the latest exchange rate.
length="1"
follows="top|left"
layout="topleft"
- font="SansSerifMedium"
top="10"
left="20"
width="310"
diff --git a/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml b/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml
index 787b2f8be4..b911e9b6f5 100644
--- a/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml
+++ b/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml
@@ -290,7 +290,7 @@
<button
follows="top|left"
height="23"
- width="110"
+ width="113"
label="Clone Track From"
left="10"
top_pad="10"
@@ -298,7 +298,7 @@
<button
follows="top|left"
height="23"
- width="110"
+ width="113"
label="Load Track From"
top_pad="0"
left_delta="0"
@@ -306,7 +306,7 @@
<button
follows="top|left"
height="23"
- width="110"
+ width="113"
label="Clear Track"
top_pad="0"
left_delta="0"
diff --git a/indra/newview/skins/default/xui/en/floater_edit_hover_height.xml b/indra/newview/skins/default/xui/en/floater_edit_hover_height.xml
index c831684594..41e8d3dc8a 100644
--- a/indra/newview/skins/default/xui/en/floater_edit_hover_height.xml
+++ b/indra/newview/skins/default/xui/en/floater_edit_hover_height.xml
@@ -5,7 +5,7 @@
can_minimize="true"
can_close="true"
can_resize="false"
- height="80"
+ height="84"
width="515"
layout="topleft"
name="HoverHeight"
@@ -39,6 +39,6 @@
label="Bind Camera view"
layout="topleft"
name="BindCameraCheck"
- top_pad="7"
+ top_pad="14"
width="237"/>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_font_test.xml b/indra/newview/skins/default/xui/en/floater_font_test.xml
index 61cb91e2f3..8070ed55e6 100644
--- a/indra/newview/skins/default/xui/en/floater_font_test.xml
+++ b/indra/newview/skins/default/xui/en/floater_font_test.xml
@@ -5,7 +5,7 @@
height="800"
layout="topleft"
min_height="175"
- min_width="154"
+ min_width="390"
name="contents"
help_topic="contents"
title="FONT TEST"
diff --git a/indra/newview/skins/default/xui/en/floater_god_tools.xml b/indra/newview/skins/default/xui/en/floater_god_tools.xml
index f8ec696af9..e94669bba4 100644
--- a/indra/newview/skins/default/xui/en/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_god_tools.xml
@@ -6,7 +6,7 @@
name="godtools floater"
help_topic="godtools_floater"
title="GOD TOOLS"
- width="400">
+ width="410">
<tab_container
follows="left|top"
height="364"
@@ -15,7 +15,7 @@
name="GodTools Tabs"
tab_position="top"
top="20"
- width="400">
+ width="410">
<panel
border="true"
follows="left|top|right|bottom"
@@ -72,11 +72,11 @@
follows="left|top|right"
height="20"
layout="topleft"
- left_pad="0"
+ left_pad="5"
max_length_bytes="63"
name="region name"
top_delta="0"
- width="250">
+ width="294">
<line_editor.commit_callback
function="RegionTools.ChangeAnything" />
</line_editor>
@@ -233,13 +233,13 @@
border_style="line"
border_thickness="1"
follows="top|right"
- height="16"
+ height="18"
layout="topleft"
- left_delta="108"
+ left_delta="90"
max_length_bytes="10"
name="estate"
top_delta="0"
- width="50" />
+ width="100" />
<text
type="string"
length="1"
@@ -249,7 +249,7 @@
layout="topleft"
left="200"
name="parent id"
- top_pad="4"
+ top_pad="7"
width="190">
Parent ID:
</text>
@@ -257,14 +257,14 @@
border_style="line"
border_thickness="1"
follows="top|right"
- height="16"
+ height="18"
layout="topleft"
- left_delta="108"
+ left_delta="90"
max_length_bytes="10"
name="parentestate"
tool_tip="This is the parent estate for this region"
top_delta="0"
- width="50">
+ width="100">
<line_editor.commit_callback
function="RegionTools.ChangeAnything" />
</line_editor>
@@ -276,22 +276,22 @@
layout="topleft"
left="200"
name="Grid Pos: "
- top_pad="4"
- width="190">
+ top_pad="7"
+ width="90">
Grid Pos:
</text>
<line_editor
border_style="line"
border_thickness="1"
follows="top|right"
- height="16"
+ height="18"
layout="topleft"
- left_delta="88"
+ left_pad="0"
max_length_bytes="10"
name="gridposx"
tool_tip="This is the grid x position for this region"
top_delta="0"
- width="50">
+ width="46">
<line_editor.commit_callback
function="RegionTools.ChangeAnything" />
</line_editor>
@@ -299,14 +299,14 @@
border_style="line"
border_thickness="1"
follows="top|right"
- height="16"
+ height="18"
layout="topleft"
- left_pad="10"
+ left_pad="8"
max_length_bytes="10"
name="gridposy"
tool_tip="This is the grid y position for this region"
top_delta="0"
- width="40">
+ width="46">
<line_editor.commit_callback
function="RegionTools.ChangeAnything" />
</line_editor>
@@ -318,20 +318,20 @@
layout="topleft"
left="200"
name="Redirect to Grid: "
- top_pad="4"
- width="88">
+ top_pad="7"
+ width="90">
Redirect to Grid:
</text>
<line_editor
border_style="line"
border_thickness="1"
follows="top|right"
- height="16"
+ height="18"
layout="topleft"
left_pad="0"
max_length_bytes="10"
name="redirectx"
- width="50">
+ width="46">
<line_editor.commit_callback
function="RegionTools.ChangeAnything" />
</line_editor>
@@ -339,13 +339,13 @@
border_style="line"
border_thickness="1"
follows="top|right"
- height="16"
+ height="18"
layout="topleft"
- left_pad="10"
+ left_pad="8"
max_length_bytes="10"
name="redirecty"
top_delta="0"
- width="40">
+ width="46">
<line_editor.commit_callback
function="RegionTools.ChangeAnything" />
</line_editor>
@@ -407,10 +407,10 @@
label="Refresh"
label_selected="Refresh"
layout="topleft"
- left="278"
+ left="280"
name="Refresh"
tool_tip="Click here to refresh the above information"
- top_pad="10"
+ top_pad="14"
width="110">
<button.commit_callback
function="RegionTools.Refresh" />
@@ -526,7 +526,7 @@
height="16"
label="Disable Physics"
layout="topleft"
- left_delta="120"
+ left_delta="136"
name="disable physics"
tool_tip="Set this to disable all physics in this region"
top_delta="0"
diff --git a/indra/newview/skins/default/xui/en/floater_inventory_settings.xml b/indra/newview/skins/default/xui/en/floater_inventory_settings.xml
index a51e7a844a..5dd3dfa2bf 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory_settings.xml
@@ -27,7 +27,6 @@
left_pad="12"
top_delta="2"
name="multi_folder_txt"
- font="SansSerifMedium"
text_color="White"
width="300">
Double-click on folder in multi-folder view:
@@ -37,7 +36,6 @@
follows="left|top"
top_pad="8"
layout="topleft"
- font="SansSerifMedium"
left="60"
width="300"
height="66"
@@ -90,7 +88,6 @@
left_pad="12"
top_delta="2"
name="single_folder_txt"
- font="SansSerifMedium"
text_color="White"
width="300">
Double-click on folder in single-folder view:
@@ -100,7 +97,6 @@
follows="left|top"
top_pad="8"
layout="topleft"
- font="SansSerifMedium"
left="60"
width="300"
height="44"
@@ -142,10 +138,9 @@
layout="topleft"
left_pad="13"
name="find_original_txt"
- font="SansSerifMedium"
text_color="White"
top_delta="1"
- width="300">
+ width="310">
Clicking on "Show in inventory" or "Find original"
</text>
<radio_group
@@ -153,7 +148,6 @@
follows="left|top"
top_pad="8"
layout="topleft"
- font="SansSerifMedium"
left="60"
width="300"
height="44"
@@ -196,7 +190,6 @@
left_pad="12"
top_delta="2"
name="favorites_txt"
- font="SansSerifMedium"
text_color="White"
width="300">
Favorites
@@ -206,7 +199,6 @@
layout="topleft"
follows="left|top"
top_pad="8"
- font="SansSerifMedium"
left="60"
width="300"
height="18"
@@ -219,7 +211,6 @@
follows="left|top"
top_pad="5"
layout="topleft"
- font="SansSerifMedium"
left="60"
width="150"
height="18"
@@ -232,7 +223,6 @@
follows="left|top"
top_pad="5"
layout="topleft"
- font="SansSerifMedium"
left="60"
width="150"
height="18"
@@ -276,7 +266,6 @@
left_pad="12"
top_delta="2"
name="single_folder_txt"
- font="SansSerifMedium"
text_color="White"
width="300">
Pressing enter on an avatar attachment
diff --git a/indra/newview/skins/default/xui/en/floater_live_material_editor.xml b/indra/newview/skins/default/xui/en/floater_live_material_editor.xml
index 5b7dab6a52..a104923f8d 100644
--- a/indra/newview/skins/default/xui/en/floater_live_material_editor.xml
+++ b/indra/newview/skins/default/xui/en/floater_live_material_editor.xml
@@ -4,9 +4,9 @@
can_resize="true"
default_tab_group="1"
height="790"
- width="256"
+ width="267"
min_height="500"
- min_width="256"
+ min_width="267"
layout="topleft"
name="material editor"
help_topic="material_editor"
@@ -17,7 +17,7 @@
top="18"
left="4"
height="768"
- width="250"
+ width="261"
follows="all"
layout="topleft"
color="DkGray2"
diff --git a/indra/newview/skins/default/xui/en/floater_material_editor.xml b/indra/newview/skins/default/xui/en/floater_material_editor.xml
index 21ceeafeea..f894e94622 100644
--- a/indra/newview/skins/default/xui/en/floater_material_editor.xml
+++ b/indra/newview/skins/default/xui/en/floater_material_editor.xml
@@ -4,9 +4,9 @@
can_resize="true"
default_tab_group="1"
height="891"
- width="256"
+ width="267"
min_height="500"
- min_width="256"
+ min_width="267"
layout="topleft"
name="material editor"
help_topic="material_editor"
@@ -20,7 +20,7 @@
top="18"
left="4"
height="768"
- width="250"
+ width="261"
follows="all"
layout="topleft"
color="DkGray2"
diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml
index 39e9de0980..fb828b804a 100644
--- a/indra/newview/skins/default/xui/en/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml
@@ -1407,7 +1407,7 @@
follows="top|left"
height="15"
layout="topleft"
- left="220"
+ left="240"
name="pelvis_offset_label"
text_color="White"
top="8"
@@ -1421,12 +1421,13 @@
max_val="3.0"
name="pelvis_offset"
top_pad="10"
+ left="340"
value="0.0"
width="80"/>
<text
follows="top|left"
height="17"
- left="425"
+ left="435"
name="skin_too_many_joints"
text_color="Orange"
top="7"
@@ -1437,7 +1438,7 @@
<text
follows="top|left"
height="32"
- left="425"
+ left="435"
name="skin_unknown_joint"
text_color="Orange"
top="8"
@@ -1879,7 +1880,7 @@ Analysed:
top="5"
left_pad="20"
name="label_display"
- width="50">
+ width="53">
Display...
</text>
<check_box
@@ -1889,7 +1890,7 @@ Analysed:
layout="topleft"
left_delta="0"
name="show_edges"
- top_pad="8">
+ top_pad="10">
</check_box>
<check_box
follows="top|left"
@@ -1897,7 +1898,7 @@ Analysed:
label_text.text_color="White"
layout="topleft"
name="show_physics"
- top_pad="8">
+ top_pad="10">
</check_box>
<check_box
follows="top|left"
@@ -1905,7 +1906,7 @@ Analysed:
label_text.text_color="White"
layout="topleft"
name="show_textures"
- top_pad="8">
+ top_pad="10">
</check_box>
<check_box
follows="top|left"
@@ -1913,7 +1914,7 @@ Analysed:
label_text.text_color="White"
layout="topleft"
name="show_skin_weight"
- top_pad="8">
+ top_pad="10">
</check_box>
<check_box
follows="top|left"
@@ -1923,7 +1924,7 @@ Analysed:
width="130"
layout="topleft"
name="show_joint_overrides"
- top_pad="8">
+ top_pad="10">
</check_box>
<check_box
follows="top|left"
@@ -1931,7 +1932,7 @@ Analysed:
label_text.text_color="White"
layout="topleft"
name="show_joint_positions"
- top_pad="17">
+ top_pad="21">
</check_box>
<text
follows="top|left"
diff --git a/indra/newview/skins/default/xui/en/floater_my_environments.xml b/indra/newview/skins/default/xui/en/floater_my_environments.xml
index 8c9c450d7c..88fd8bf585 100644
--- a/indra/newview/skins/default/xui/en/floater_my_environments.xml
+++ b/indra/newview/skins/default/xui/en/floater_my_environments.xml
@@ -41,6 +41,7 @@
mouse_opaque="true"
name="icon_settingsdays"
left="4"
+ top="9"
width="16" />
<check_box
height="16"
@@ -48,7 +49,7 @@
layout="topleft"
left_pad="2"
name="chk_days"
- top_delta="0"
+ top_delta="2"
width="60" />
<icon
height="16"
@@ -57,6 +58,7 @@
mouse_opaque="true"
name="icon_settingsskies"
left_pad="10"
+ top="9"
width="16" />
<check_box
height="16"
@@ -64,7 +66,7 @@
layout="topleft"
left_pad="2"
name="chk_skies"
- top_delta="0"
+ top_delta="2"
width="60" />
<icon
height="16"
@@ -73,6 +75,7 @@
mouse_opaque="true"
name="icon_settingswater"
left_pad="10"
+ top="9"
width="16" />
<check_box
height="16"
@@ -80,7 +83,7 @@
layout="topleft"
left_pad="2"
name="chk_water"
- top_delta="0"
+ top_delta="2"
width="60" />
<filter_editor
follows="left|top|right"
@@ -89,7 +92,7 @@
layout="topleft"
left="4"
name="flt_search"
- top_pad="6"
+ top_pad="4"
right="-4" />
</layout_panel>
<layout_panel
diff --git a/indra/newview/skins/default/xui/en/floater_my_inventory.xml b/indra/newview/skins/default/xui/en/floater_my_inventory.xml
index 881c1f7469..def57abfe4 100644
--- a/indra/newview/skins/default/xui/en/floater_my_inventory.xml
+++ b/indra/newview/skins/default/xui/en/floater_my_inventory.xml
@@ -12,7 +12,7 @@
save_visibility="true"
reuse_instance="true"
title="INVENTORY"
- width="418" >
+ width="424" >
<panel
class="sidepanel_inventory"
name="main_panel"
diff --git a/indra/newview/skins/default/xui/en/floater_new_feature_notification.xml b/indra/newview/skins/default/xui/en/floater_new_feature_notification.xml
index 9981e5d893..66c229e698 100644
--- a/indra/newview/skins/default/xui/en/floater_new_feature_notification.xml
+++ b/indra/newview/skins/default/xui/en/floater_new_feature_notification.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater
- height="130"
+ height="140"
width="300"
layout="topleft"
name="floater_new_feature_notification"
@@ -40,7 +40,7 @@ New feature
text_color="White"
layout="topleft"
left="10"
- height="40"
+ height="50"
top_pad="14"
right="-10"
word_wrap="true"
diff --git a/indra/newview/skins/default/xui/en/floater_performance.xml b/indra/newview/skins/default/xui/en/floater_performance.xml
index dac8a71b2d..5fb9eeb2de 100644
--- a/indra/newview/skins/default/xui/en/floater_performance.xml
+++ b/indra/newview/skins/default/xui/en/floater_performance.xml
@@ -65,10 +65,10 @@
text_color="White"
height="20"
layout="topleft"
- left="395"
+ left="392"
top="7"
name="fps_desc1_lbl"
- width="150">
+ width="153">
Allow 5-10 seconds for
</text>
<text
@@ -78,7 +78,7 @@
layout="topleft"
top_pad="-3"
name="fps_desc2_lbl"
- width="150">
+ width="153">
changes to take full effect.
</text>
</panel>
@@ -265,7 +265,7 @@
left="10"
name="complexity_info"
top_pad="0"
- width="455">
+ width="490">
Reduce the complexity of your avatar if you aren't satisfied with current FPS.
</text>
<icon
diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml
index 4b0e0bb221..b7d992bcb4 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences.xml
@@ -82,8 +82,8 @@
name="pref core"
tab_group="1"
tab_position="left"
- tab_width="140"
- tab_padding_right="0"
+ tab_width="136"
+ tab_padding_right="4"
top="40"
width="658">
<panel
diff --git a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
index 2a18134491..99dca7b395 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
@@ -664,7 +664,7 @@
increment="8"
initial_value="160"
label="Sky:"
- label_width="145"
+ label_width="164"
layout="topleft"
left="420"
min_val="16"
@@ -750,7 +750,7 @@
control_name="RenderShadowDetail"
height="18"
layout="topleft"
- left_delta="130"
+ left_delta="175"
top_delta="0"
name="ShadowDetail"
width="150">
@@ -800,7 +800,7 @@
control_name="RenderReflectionProbeDetail"
height="18"
layout="topleft"
- left_delta="130"
+ left_delta="175"
top_delta="0"
name="ReflectionDetail"
width="150">
@@ -836,7 +836,7 @@
control_name="RenderReflectionProbeLevel"
height="18"
layout="topleft"
- left_delta="130"
+ left_delta="175"
top_delta="0"
name="ReflectionLevel"
width="150">
@@ -868,7 +868,7 @@
name="ReflectionProbeCount"
text_readonly_color="LabelDisabledColor"
top_delta="22"
- width="128">
+ width="130">
Max Reflection Probes:
</text>
@@ -877,7 +877,7 @@
height="18"
layout="topleft"
label="Max. Reflection Probes:"
- left_delta="130"
+ left_delta="175"
top_delta="0"
name="ProbeCount"
width="150">
@@ -911,7 +911,7 @@
increment="0.1"
initial_value="160"
label="Exposure:"
- label_width="145"
+ label_width="164"
layout="topleft"
left="420"
min_val="0.5"
@@ -955,7 +955,7 @@
control_name="RenderHeroProbeResolution"
height="18"
layout="topleft"
- left_delta="130"
+ left_delta="175"
top_delta="0"
name="MirrorResolution"
width="150">
@@ -995,7 +995,7 @@
control_name="RenderHeroProbeUpdateRate"
height="18"
layout="topleft"
- left_delta="130"
+ left_delta="175"
top_delta="0"
name="HeroProbeUpdateRate"
width="150">
@@ -1026,7 +1026,7 @@
increment="0.1"
initial_value="160"
label="Sharpening:"
- label_width="145"
+ label_width="164"
layout="topleft"
left="420"
min_val="0.0"
@@ -1055,7 +1055,7 @@
control_name="RenderTonemapType"
height="18"
layout="topleft"
- left_delta="130"
+ left_delta="175"
top_delta="0"
name="TonemapType"
width="150">
@@ -1077,7 +1077,7 @@
initial_value="1"
label="Tone Mapping Mix:"
tool_tip="Mix between linear and tone mapped colors"
- label_width="145"
+ label_width="164"
layout="topleft"
left="420"
min_val="0.0"
diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml
index 1600c422c3..191db4f854 100644
--- a/indra/newview/skins/default/xui/en/floater_stats.xml
+++ b/indra/newview/skins/default/xui/en/floater_stats.xml
@@ -418,6 +418,64 @@
</stat_view>
</stat_view>
</stat_view>
+ <stat_view name="voice"
+ label="Voice"
+ setting="OpenDebugStatVoice">
+ <stat_bar
+ name="webrtc_latency"
+ label="Latency"
+ stat="webrtc_latency"
+ unit_label="ms"
+ decimal_digits="1"/>
+ <stat_bar
+ name="webrtc_upload_bandwidth"
+ label="Upload bandwidth"
+ stat="webrtc_upload_bandwidth"
+ unit_label="kbps"
+ decimal_digits="0"/>
+ <stat_view name="incoming_audio"
+ label="Incoming audio"
+ setting="OpenDebugStatVoiceIncoming">
+ <stat_bar
+ name="incoming_packet_recv"
+ label="Packets received"
+ stat="webrtc_packets_in_recv"/>
+ <stat_bar
+ name="packets_in_lost"
+ label="Packets lost"
+ stat="webrtc_packets_in_lost"/>
+ <stat_bar
+ name="jitter_in"
+ label="Jitter"
+ stat="webrtc_jitter_in"
+ unit_label="ms"
+ decimal_digits="1"/>
+ <stat_bar
+ name="jitter_buffer"
+ label="Jitter buffer"
+ stat="webrtc_jitter_buffer"
+ unit_label="ms"
+ decimal_digits="1"/>
+ </stat_view>
+ <stat_view name="outgoing_audio"
+ label="Outgoing audio"
+ setting="OpenDebugStatVoiceOutgoing">
+ <stat_bar
+ name="packets_out_sent"
+ label="Packets sent"
+ stat="webrtc_packets_out_sent"/>
+ <stat_bar
+ name="packets_out_lost"
+ label="Packets lost"
+ stat="webrtc_packets_out_lost"/>
+ <stat_bar
+ name="jitter_out"
+ label="Jitter"
+ stat="webrtc_jitter_out"
+ unit_label="ms"
+ decimal_digits="1"/>
+ </stat_view>
+ </stat_view>
</container_view>
</scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_telehub.xml b/indra/newview/skins/default/xui/en/floater_telehub.xml
index 9d4fb82ec6..7108005f00 100644
--- a/indra/newview/skins/default/xui/en/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/en/floater_telehub.xml
@@ -2,7 +2,7 @@
<!-- Explicit left edge to avoid overlapping build tools -->
<floater
legacy_header_height="18"
- height="250"
+ height="260"
layout="topleft"
name="telehub"
help_topic="telehub"
diff --git a/indra/newview/skins/default/xui/en/floater_test_slapp.xml b/indra/newview/skins/default/xui/en/floater_test_slapp.xml
index 5a13a0147e..35f5961285 100644
--- a/indra/newview/skins/default/xui/en/floater_test_slapp.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_slapp.xml
@@ -17,7 +17,6 @@
follows="left|top|right"
height="16"
name="trusted_txt"
- font="SansSerifMedium"
text_color="white"
layout="topleft"
left="16">
diff --git a/indra/newview/skins/default/xui/en/floater_test_textbox.xml b/indra/newview/skins/default/xui/en/floater_test_textbox.xml
index 023df69f0f..e736fc58b2 100644
--- a/indra/newview/skins/default/xui/en/floater_test_textbox.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_textbox.xml
@@ -99,7 +99,7 @@
font.name="SansSerifSmall"
name="test_text10"
tool_tip="text">
- SansSerifSmall
+ SansSerif
The 华文细黑 brown fox ヒラキjumped over the lazy dog.
</text>
<text
@@ -111,7 +111,7 @@
font.name="SansSerifMedium"
name="test_text11"
tool_tip="text">
- SansSerif
+ SansSerifMedium
The 华文细黑 brown fox ヒラキjumped over the lazy dog.
</text>
<text
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index d3a872c9d5..d94a6c71b5 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -84,11 +84,14 @@
left="10"
name="button focus"
tool_tip="Focus"
- width="35">
- <button.commit_callback
- function="BuildTool.setTool"
- parameter="Focus" />
- </button>
+ width="35"
+ font="DejaVu"
+ font.size="LSmall"
+ pad_bottom="1">
+ <button.commit_callback
+ function="BuildTool.setTool"
+ parameter="Focus" />
+ </button>
<button
follows="left|top"
height="25"
@@ -99,7 +102,10 @@
left_pad="10"
name="button move"
tool_tip="Move"
- width="35">
+ width="35"
+ font="DejaVu"
+ font.size="LSmall"
+ pad_bottom="1">
<button.commit_callback
function="BuildTool.setTool"
parameter="Move" />
@@ -114,7 +120,10 @@
left_pad="10"
name="button edit"
tool_tip="Edit"
- width="35">
+ width="35"
+ font="DejaVu"
+ font.size="LSmall"
+ pad_bottom="1">
<button.commit_callback
function="BuildTool.setTool"
parameter="Edit" />
@@ -129,7 +138,10 @@
left_pad="10"
name="button create"
tool_tip="Create"
- width="35">
+ width="35"
+ font="DejaVu"
+ font.size="LSmall"
+ pad_bottom="1">
<button.commit_callback
function="BuildTool.setTool"
parameter="Create" />
@@ -144,7 +156,10 @@
left_pad="10"
name="button land"
tool_tip="Land"
- width="35">
+ width="35"
+ font="DejaVu"
+ font.size="LSmall"
+ pad_bottom="1">
<button.commit_callback
function="BuildTool.setTool"
parameter="Land" />
@@ -161,15 +176,19 @@
left="8"
name="text status"
top_pad="3"
- width="285">
+ width="285"
+ font="DejaVu"
+ font.size="LSmall">
Drag to move, shift-drag to copy
</text>
<radio_group
layout="topleft"
left="10"
- height="70"
- top="59"
- name="focus_radio_group">
+ height="70"
+ top="59"
+ name="focus_radio_group"
+ font="DejaVu"
+ font.size="LSmall" >
<radio_item
top_pad="6"
label="Zoom"
@@ -198,16 +217,20 @@
top_delta="-2"
left_delta="100"
name="slider zoom"
- width="134">
+ width="134"
+ font="DejaVu"
+ font.size="LSmall">
<slider_bar.commit_callback
function="BuildTool.commitZoom"/>
</slider_bar>
<radio_group
- left="10"
- height="70"
- top="59"
+ left="10"
+ height="70"
+ top="59"
layout="topleft"
- name="move_radio_group">
+ name="move_radio_group"
+ font="DejaVu"
+ font.size="LSmall" >
<radio_item
top_pad="6"
label="Move"
@@ -232,7 +255,9 @@
top="55"
height="70"
layout="topleft"
- name="edit_radio_group">
+ name="edit_radio_group"
+ font="DejaVu"
+ font.size="LSmall" >
<radio_item
label="Move"
layout="topleft"
@@ -263,7 +288,9 @@
label="Edit linked"
layout="topleft"
name="checkbox edit linked parts"
- top_pad="-18">
+ top_pad="-18"
+ font="DejaVu"
+ font.size="LSmall">
<check_box.commit_callback
function="BuildTool.selectComponent"/>
</check_box>
@@ -276,7 +303,10 @@
layout="topleft"
left="143"
name="link_btn"
- width="50">
+ width="50"
+ font="DejaVu"
+ font.size="LSmall"
+ pad_bottom="1">
<button.commit_callback
function="BuildTool.LinkObjects"/>
</button>
@@ -287,7 +317,10 @@
layout="topleft"
left_pad="2"
name="unlink_btn"
- width="90">
+ width="90"
+ font="DejaVu"
+ font.size="LSmall"
+ pad_bottom="1">
<button.commit_callback
function="BuildTool.UnlinkObjects"/>
</button>
@@ -298,10 +331,12 @@
layout="topleft"
left="143"
name="checkbox uniform"
- top="48"
+ top="47"
label_text.wrap="true"
label_text.width="100"
- width="134" />
+ width="134"
+ font="DejaVu"
+ font.size="LSmall" />
<check_box
control_name="ScaleStretchTextures"
height="19"
@@ -310,18 +345,22 @@
layout="topleft"
left="143"
name="checkbox stretch textures"
- top_pad="-4"
+ top_pad="-2"
follows="left|top"
- width="134" />
+ width="134"
+ font="DejaVu"
+ font.size="LSmall" />
<check_box
control_name="SnapEnabled"
height="18"
initial_value="true"
label="Snap"
layout="topleft"
- top_pad="0"
+ top_pad="-1"
name="checkbox snap to grid"
- width="134" />
+ width="134"
+ font="DejaVu"
+ font.size="LSmall"/>
<combo_box
height="20"
layout="topleft"
@@ -331,7 +370,9 @@
top="83"
left="195"
top_pad="0"
- width="60">
+ width="60"
+ drop_down_button.font="DejaVu"
+ drop_down_button.font.size="LSmall">
<combo_box.item
label="World"
name="World"
@@ -577,7 +618,7 @@
layout="topleft"
left_delta="0"
name="checkbox copy selection"
- top_delta="15"
+ top_delta="17"
width="134" />
<check_box
control_name="CreateToolCopyCenters"
@@ -587,7 +628,7 @@
layout="topleft"
left_delta="18"
name="checkbox copy centers"
- top="85"
+ top="92"
width="134" />
<check_box
control_name="CreateToolCopyRotates"
@@ -596,7 +637,7 @@
layout="topleft"
left_delta="0"
name="checkbox copy rotates"
- top_delta="16"
+ top_delta="17"
width="134" />
<radio_group
height="105"
@@ -604,7 +645,9 @@
left="4"
name="land_radio_group"
top="54"
- width="114">
+ width="114"
+ font="DejaVu"
+ font.size="LSmall" >
<radio_item
height="19"
label="Select Land"
@@ -746,7 +789,8 @@
length="1"
height="16"
follows="left|top"
- font="SansSerifSmall"
+ font="DejaVu"
+ font.size="LSmall"
layout="topleft"
left="10"
name="selection_empty"
@@ -760,7 +804,8 @@
length="1"
height="16"
follows="left|top"
- font="SansSerifSmall"
+ font="DejaVu"
+ font.size="LSmall"
layout="topleft"
left="10"
name="selection_faces"
@@ -775,7 +820,8 @@
length="1"
height="16"
follows="left|top"
- font="SansSerifSmall"
+ font="DejaVu"
+ font.size="LSmall"
layout="topleft"
left="10"
name="selection_count"
@@ -830,7 +876,9 @@
tab_height="25"
open_tabs_on_drag_and_drop="true"
top="173"
- width="295">
+ width="295"
+ font="DejaVu"
+ font.size="LSmall">
<panel
border="false"
@@ -904,7 +952,9 @@
left="10"
name="Name:"
top="5"
- width="90">
+ width="90"
+ font="DejaVu"
+ font.size="LSmall">
Name:
</text>
<line_editor
@@ -923,7 +973,9 @@
left="10"
name="Description:"
top_pad="3"
- width="90">
+ width="90"
+ font="DejaVu"
+ font.size="LSmall">
Description:
</text>
<line_editor
@@ -945,7 +997,9 @@
layout="topleft"
name="Creator:"
top_pad="7"
- width="90">
+ width="90"
+ font="DejaVu"
+ font.size="LSmall">
Creator:
</text>
<avatar_icon
@@ -967,7 +1021,6 @@
height="29"
layout="topleft"
name="Creator Name"
- font="SansSerifSmall"
top_delta="-1"
translate="false"
width="170"
@@ -984,7 +1037,9 @@
layout="topleft"
name="Owner:"
top_pad="3"
- width="90">
+ width="90"
+ font="DejaVu"
+ font.size="LSmall">
Owner:
</text>
<avatar_icon
@@ -1015,7 +1070,8 @@
height="29"
layout="topleft"
name="Owner Name"
- font="SansSerifSmall"
+ font="DejaVu"
+ font.size="LSmall"
left_pad="1"
top_delta="-1"
translate="false"
@@ -1033,7 +1089,9 @@
height="18"
name="Group:"
top_pad="3"
- width="75">
+ width="75"
+ font="DejaVu"
+ font.size="LSmall">
Group:
</text>
<name_box
@@ -1053,7 +1111,10 @@
name="button set group"
tab_stop="false"
tool_tip="Choose a group to share this object's permissions"
- width="23" />
+ width="23"
+ font="DejaVu"
+ font.size="LSmall"
+ pad_bottom="1" />
<check_box
height="19"
follows="left|top"
@@ -1063,7 +1124,9 @@
tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."
top_pad="5"
left="100"
- width="87" />
+ width="87"
+ font="DejaVu"
+ font.size="LSmall" />
<button
follows="top|left"
height="23"
@@ -1073,7 +1136,10 @@
name="button deed"
left_pad="19"
tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."
- width="80" />
+ width="80"
+ font="DejaVu"
+ font.size="LSmall"
+ pad_bottom="1" />
<text
type="string"
length="1"
@@ -1083,7 +1149,9 @@
top_pad="10"
left="10"
name="label click action"
- width="82">
+ width="82"
+ font="DejaVu"
+ font.size="LSmall" >
Click to:
</text>
<combo_box
@@ -1093,7 +1161,9 @@
name="clickaction"
width="130"
left_pad="10"
- tool_tip="A click action enables you to interact with an object with a single left click. Each click action has a special cursor indicating what it does. Some click actions have requirements to function. For example Touch and Pay require scripts" >
+ tool_tip="A click action enables you to interact with an object with a single left click. Each click action has a special cursor indicating what it does. Some click actions have requirements to function. For example Touch and Pay require scripts"
+ drop_down_button.font="DejaVu"
+ drop_down_button.font.size="LSmall" >
<combo_box.item
label="Touch (default)"
name="Touch/grab(default)"
@@ -1134,7 +1204,9 @@
name="checkbox for sale"
left="7"
width="97"
- tool_tip="Lets people buy this object, its content or it copy inworld for specified price." />
+ tool_tip="Lets people buy this object, its content or it copy inworld for specified price."
+ font="DejaVu"
+ font.size="LSmall" />
<!-- NEW PRICE SPINNER
Objects are allowed to be for sale for L$0 to invoke buy UI behavior
even though the user gets a free copy.
@@ -1152,7 +1224,9 @@ even though the user gets a free copy.
min_val="0"
height="20"
max_val="999999999"
- tool_tip="Object cost." />
+ tool_tip="Object cost."
+ font="DejaVu"
+ font.size="LSmall" />
<!-- NEW SALE TYPE COMBO BOX -->
<combo_box
left_pad="8"
@@ -1166,7 +1240,9 @@ even though the user gets a free copy.
mouse_opaque="true"
name="sale type"
width="89"
- tool_tip="Select whether purchaser will receive a copy, copy of the content or item itself." >
+ tool_tip="Select whether purchaser will receive a copy, copy of the content or item itself."
+ drop_down_button.font="DejaVu"
+ drop_down_button.font.size="LSmall" >
<combo_box.item
name="Copy"
label="Copy"
@@ -1188,7 +1264,9 @@ even though the user gets a free copy.
layout="topleft"
left="7"
name="search_check"
- tool_tip="Let people see this object in search results" />
+ tool_tip="Let people see this object in search results"
+ font="DejaVu"
+ font.size="LSmall" />
<panel
border="false"
follows="left|top"
@@ -1212,7 +1290,9 @@ even though the user gets a free copy.
follows="left|top|right"
layout="topleft"
name="perm_modify"
- width="264">
+ width="264"
+ font="DejaVu"
+ font.size="LSmall" >
You can modify this object
</text>
<text
@@ -1220,7 +1300,9 @@ even though the user gets a free copy.
follows="left|top"
name="Anyone can:"
width="250"
- left="10">
+ left="10"
+ font="DejaVu"
+ font.size="LSmall" >
Anyone:
</text>
<check_box
@@ -1230,7 +1312,9 @@ even though the user gets a free copy.
name="checkbox allow everyone move"
tool_tip="Anyone can move the object."
left="10"
- width="85" />
+ width="85"
+ font="DejaVu"
+ font.size="LSmall" />
<check_box
height="19"
label="Copy"
@@ -1238,14 +1322,18 @@ even though the user gets a free copy.
left_pad="0"
name="checkbox allow everyone copy"
tool_tip="Anyone can take a copy of the object. Object and all of its contents must be copy and transfer permissive."
- width="90" />
+ width="90"
+ font="DejaVu"
+ font.size="LSmall" />
<text
type="string"
follows="left|top"
height="19"
name="Next owner can:"
width="250"
- left="10">
+ left="10"
+ font="DejaVu"
+ font.size="LSmall" >
Next owner:
</text>
<check_box
@@ -1256,7 +1344,9 @@ even though the user gets a free copy.
height="10"
name="checkbox next owner can modify"
tool_tip="Next owner can edit properties like item name or scale of this object."
- width="85" />
+ width="85"
+ font="DejaVu"
+ font.size="LSmall" />
<check_box
follows="left|top|right"
height="19"
@@ -1265,7 +1355,9 @@ even though the user gets a free copy.
left_pad="0"
name="checkbox next owner can copy"
tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied."
- width="80" />
+ width="80"
+ font="DejaVu"
+ font.size="LSmall" />
<check_box
follows="left|top|right"
height="19"
@@ -1275,7 +1367,9 @@ even though the user gets a free copy.
left_pad="0"
top_delta="0"
tool_tip="Next owner can give away or resell this object."
- width="100" />
+ width="100"
+ font="DejaVu"
+ font.size="LSmall" />
<!-- *NOTE: These "B/O/G/E/N/F fields may overlap "perm_modify" above,
but that's OK, this is used only for debugging. -->
<text
@@ -1288,7 +1382,9 @@ even though the user gets a free copy.
left="230"
name="B:"
height="10"
- width="80">
+ width="80"
+ font="DejaVu"
+ font.size="LSmall" >
B:
</text>
<text
@@ -1301,7 +1397,9 @@ even though the user gets a free copy.
top_pad="2"
name="O:"
height="10"
- width="80">
+ width="80"
+ font="DejaVu"
+ font.size="LSmall" >
O:
</text>
<text
@@ -1314,7 +1412,9 @@ even though the user gets a free copy.
top_pad="2"
name="G:"
height="10"
- width="80">
+ width="80"
+ font="DejaVu"
+ font.size="LSmall" >
G:
</text>
<text
@@ -1327,7 +1427,9 @@ even though the user gets a free copy.
layout="topleft"
name="E:"
height="10"
- width="80">
+ width="80"
+ font="DejaVu"
+ font.size="LSmall" >
E:
</text>
<text
@@ -1340,7 +1442,9 @@ even though the user gets a free copy.
top_pad="2"
name="N:"
height="10"
- width="80">
+ width="80"
+ font="DejaVu"
+ font.size="LSmall" >
N:
</text>
<text
@@ -1353,7 +1457,9 @@ even though the user gets a free copy.
top_pad="2"
name="F:"
height="10"
- width="80">
+ width="80"
+ font="DejaVu"
+ font.size="LSmall" >
F:
</text>
</panel>
@@ -1373,7 +1479,9 @@ even though the user gets a free copy.
name="pathfinding_attributes_label"
top_pad="4"
width="150"
- left="10">
+ left="10"
+ font="DejaVu"
+ font.size="LSmall" >
Pathfinding attributes:
</text>
<text
@@ -1383,7 +1491,9 @@ even though the user gets a free copy.
name="pathfinding_attributes_value"
width="130"
word_wrap="false"
- left_pad="0">
+ left_pad="0"
+ font="DejaVu"
+ font.size="LSmall" >
</text>
</panel>
</panel>
@@ -1408,7 +1518,9 @@ even though the user gets a free copy.
tool_tip="Prevents object from being moved or deleted. Frequently useful during building to avoid unintended edits."
top_pad="5"
left="10"
- width="123" />
+ width="123"
+ font="DejaVu"
+ font.size="LSmall" />
<check_box
height="19"
label="Physical"
@@ -1416,7 +1528,9 @@ even though the user gets a free copy.
name="Physical Checkbox Ctrl"
tool_tip="Allows object to be pushed and affected by gravity"
top_pad="0"
- width="123" />
+ width="123"
+ font="DejaVu"
+ font.size="LSmall" />
<check_box
height="19"
label="Temporary"
@@ -1424,7 +1538,9 @@ even though the user gets a free copy.
name="Temporary Checkbox Ctrl"
tool_tip="Causes object to be deleted 1 minute after creation"
top_pad="0"
- width="123" />
+ width="123"
+ font="DejaVu"
+ font.size="LSmall" />
<check_box
height="19"
label="Phantom"
@@ -1432,7 +1548,9 @@ even though the user gets a free copy.
name="Phantom Checkbox Ctrl"
tool_tip="Causes object to not collide with other objects or avatars"
top_pad="0"
- width="123" />
+ width="123"
+ font="DejaVu"
+ font.size="LSmall" />
<view_border
bevel_style="none"
follows="top|left"
@@ -1441,7 +1559,9 @@ even though the user gets a free copy.
left_delta="0"
name="object_horizontal"
top_pad="10"
- width="95" />
+ width="95"
+ font="DejaVu"
+ font.size="LSmall" />
<menu_button
menu_filename="menu_copy_paste_pos.xml"
follows="top|left"
@@ -1465,7 +1585,9 @@ even though the user gets a free copy.
tool_tip="Position (meters)"
left_pad="8"
top_delta="0"
- width="121">
+ width="121"
+ font="DejaVu"
+ font.size="LSmall" >
Position (m)
</text>
<spinner
@@ -1482,7 +1604,9 @@ even though the user gets a free copy.
name="Pos X"
text_enabled_color="1 0 0.3 .7"
top_pad="8"
- width="87" />
+ width="87"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -1497,7 +1621,9 @@ even though the user gets a free copy.
name="Pos Y"
text_enabled_color="EmphasisColor"
top_pad="3"
- width="87" />
+ width="87"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -1512,7 +1638,9 @@ even though the user gets a free copy.
name="Pos Z"
text_enabled_color="0 0.8 1 .65"
top_pad="3"
- width="87" />
+ width="87"
+ font="DejaVu"
+ font.size="LSmall" />
<menu_button
menu_filename="menu_copy_paste_size.xml"
follows="top|left"
@@ -1525,7 +1653,7 @@ even though the user gets a free copy.
top_pad="13"
name="clipboard_size_btn"
tool_tip="Paste options"
- width="19"/>
+ width="19" />
<text
type="string"
length="1"
@@ -1536,7 +1664,9 @@ even though the user gets a free copy.
top_delta="0"
name="label size"
tool_tip="Size (meters)"
- width="121">
+ width="121"
+ font="DejaVu"
+ font.size="LSmall" >
Size (m)
</text>
<spinner
@@ -1553,7 +1683,9 @@ even though the user gets a free copy.
name="Scale X"
text_enabled_color="1 1 1 1"
top_pad="8"
- width="87" />
+ width="87"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -1568,7 +1700,9 @@ even though the user gets a free copy.
name="Scale Y"
text_enabled_color="1 1 1 1"
top_pad="3"
- width="87" />
+ width="87"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -1583,7 +1717,9 @@ even though the user gets a free copy.
name="Scale Z"
text_enabled_color="1 1 1 1"
top_pad="3"
- width="87" />
+ width="87"
+ font="DejaVu"
+ font.size="LSmall" />
<menu_button
menu_filename="menu_copy_paste_rot.xml"
follows="top|left"
@@ -1607,7 +1743,9 @@ even though the user gets a free copy.
top_delta="0"
name="label rotation"
tool_tip="Rotation (degrees)"
- width="121">
+ width="121"
+ font="DejaVu"
+ font.size="LSmall" >
Rotation (°)
</text>
<spinner
@@ -1625,7 +1763,9 @@ even though the user gets a free copy.
name="Rot X"
text_enabled_color="1 1 1 1"
top_pad="8"
- width="87" />
+ width="87"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
decimal_digits="2"
follows="left|top"
@@ -1641,7 +1781,9 @@ even though the user gets a free copy.
name="Rot Y"
text_enabled_color="1 1 1 1"
top_pad="3"
- width="87" />
+ width="87"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
decimal_digits="2"
follows="left|top"
@@ -1657,7 +1799,9 @@ even though the user gets a free copy.
name="Rot Z"
text_enabled_color="1 1 1 1"
top_pad="3"
- width="87" />
+ width="87"
+ font="DejaVu"
+ font.size="LSmall" />
<!-- <text
type="string"
length="1"
@@ -1686,7 +1830,9 @@ even though the user gets a free copy.
name="comboBaseType"
top="6"
left="125"
- width="125">
+ width="125"
+ drop_down_button.font="DejaVu"
+ drop_down_button.font.size="LSmall" >
<combo_box.item
label="Box"
name="Box"
@@ -1742,7 +1888,9 @@ even though the user gets a free copy.
left="125"
name="text cut"
top_pad="5"
- width="150">
+ width="150"
+ font="DejaVu"
+ font.size="LSmall" >
Path Cut (begin/end)
</text>
<spinner
@@ -1757,7 +1905,9 @@ even though the user gets a free copy.
max_val="0.98"
name="cut begin"
top_pad="4"
- width="68" />
+ width="68"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="16"
@@ -1770,7 +1920,9 @@ even though the user gets a free copy.
min_val="0.02"
name="cut end"
top_delta="0"
- width="68" />
+ width="68"
+ font="DejaVu"
+ font.size="LSmall" />
<text
type="string"
length="1"
@@ -1780,7 +1932,9 @@ even though the user gets a free copy.
left="125"
name="text hollow"
top_pad="7"
- width="68">
+ width="68"
+ font="DejaVu"
+ font.size="LSmall" >
Hollow
</text>
<text
@@ -1791,7 +1945,9 @@ even though the user gets a free copy.
layout="topleft"
left_pad="10"
name="text skew"
- width="63">
+ width="63"
+ font="DejaVu"
+ font.size="LSmall" >
Skew
</text>
<spinner
@@ -1805,7 +1961,9 @@ even though the user gets a free copy.
max_val="95"
name="Scale 1"
top_pad="4"
- width="68" />
+ width="68"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
decimal_digits="2"
follows="left|top"
@@ -1818,7 +1976,9 @@ even though the user gets a free copy.
min_val="-0.95"
name="Skew"
top_delta="0"
- width="68" />
+ width="68"
+ font="DejaVu"
+ font.size="LSmall" />
<text
type="string"
length="1"
@@ -1828,7 +1988,9 @@ even though the user gets a free copy.
left="125"
name="Hollow Shape"
top_pad="7"
- width="150">
+ width="150"
+ font="DejaVu"
+ font.size="LSmall" >
Hollow Shape
</text>
<combo_box
@@ -1837,7 +1999,9 @@ even though the user gets a free copy.
left_delta="0"
name="hole"
top_pad="-2"
- width="150">
+ width="150"
+ drop_down_button.font="DejaVu"
+ drop_down_button.font.size="LSmall" >
<combo_box.item
label="Default"
name="Default"
@@ -1864,7 +2028,9 @@ even though the user gets a free copy.
left_delta="0"
name="text twist"
top_pad="7"
- width="150">
+ width="150"
+ font="DejaVu"
+ font.size="LSmall" >
Twist (begin/end)
</text>
<spinner
@@ -1881,7 +2047,9 @@ even though the user gets a free copy.
min_val="-180"
name="Twist Begin"
top_pad="4"
- width="68" />
+ width="68"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
decimal_digits="0"
follows="left|top"
@@ -1896,7 +2064,9 @@ even though the user gets a free copy.
min_val="-180"
name="Twist End"
top_delta="0"
- width="68" />
+ width="68"
+ font="DejaVu"
+ font.size="LSmall" />
<text
type="string"
length="1"
@@ -1906,7 +2076,9 @@ even though the user gets a free copy.
left="125"
name="scale_taper"
top_pad="7"
- width="150">
+ width="150"
+ font="DejaVu"
+ font.size="LSmall" >
Taper
</text>
<text
@@ -1919,7 +2091,9 @@ even though the user gets a free copy.
left_delta="0"
name="scale_hole"
top_delta="0"
- width="150">
+ width="150"
+ font="DejaVu"
+ font.size="LSmall" >
Hole Size
</text>
<spinner
@@ -1935,7 +2109,9 @@ even though the user gets a free copy.
min_val="-1"
name="Taper Scale X"
top_pad="4"
- width="68" />
+ width="68"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
decimal_digits="2"
follows="left|top"
@@ -1949,7 +2125,9 @@ even though the user gets a free copy.
min_val="-1"
name="Taper Scale Y"
top_delta="0"
- width="68" />
+ width="68"
+ font="DejaVu"
+ font.size="LSmall" />
<text
type="string"
length="1"
@@ -1959,7 +2137,9 @@ even though the user gets a free copy.
left="125"
name="text topshear"
top_pad="5"
- width="141">
+ width="141"
+ font="DejaVu"
+ font.size="LSmall" >
Top Shear
</text>
<spinner
@@ -1976,7 +2156,9 @@ even though the user gets a free copy.
min_val="-0.5"
name="Shear X"
top_pad="4"
- width="68" />
+ width="68"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
decimal_digits="2"
follows="left|top"
@@ -1991,7 +2173,9 @@ even though the user gets a free copy.
min_val="-0.5"
name="Shear Y"
top_delta="0"
- width="68" />
+ width="68"
+ font="DejaVu"
+ font.size="LSmall" />
<text
visible="false"
type="string"
@@ -2002,7 +2186,9 @@ even though the user gets a free copy.
left="125"
name="advanced_cut"
top_pad="7"
- width="150">
+ width="150"
+ font="DejaVu"
+ font.size="LSmall" >
Profile Cut (begin/end)
</text>
<text
@@ -2015,7 +2201,9 @@ even though the user gets a free copy.
left_delta="0"
name="advanced_dimple"
top_delta="0"
- width="150">
+ width="150"
+ font="DejaVu"
+ font.size="LSmall" >
Dimple (begin/end)
</text>
<text
@@ -2027,7 +2215,9 @@ even though the user gets a free copy.
left_delta="0"
name="advanced_slice"
top_delta="0"
- width="150">
+ width="150"
+ font="DejaVu"
+ font.size="LSmall" >
Slice (begin/end)
</text>
<spinner
@@ -2042,7 +2232,9 @@ even though the user gets a free copy.
max_val="0.98"
name="Path Limit Begin"
top_pad="3"
- width="68" />
+ width="68"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -2055,7 +2247,9 @@ even though the user gets a free copy.
min_val="0.02"
name="Path Limit End"
top_delta="0"
- width="68" />
+ width="68"
+ font="DejaVu"
+ font.size="LSmall" />
<text
visible="false"
type="string"
@@ -2066,7 +2260,9 @@ even though the user gets a free copy.
left="125"
name="text taper2"
top_pad="7"
- width="150">
+ width="150"
+ font="DejaVu"
+ font.size="LSmall" >
Taper
</text>
<spinner
@@ -2083,7 +2279,9 @@ even though the user gets a free copy.
min_val="-1"
name="Taper X"
top_pad="3"
- width="68" />
+ width="68"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
visible="false"
decimal_digits="2"
@@ -2098,7 +2296,9 @@ even though the user gets a free copy.
min_val="-1"
name="Taper Y"
top_delta="0"
- width="68" />
+ width="68"
+ font="DejaVu"
+ font.size="LSmall" />
<text
visible="false"
type="string"
@@ -2109,7 +2309,9 @@ even though the user gets a free copy.
left="125"
name="text radius delta"
top_pad="7"
- width="78">
+ width="78"
+ font="DejaVu"
+ font.size="LSmall" >
Radius
</text>
<text
@@ -2121,7 +2323,9 @@ even though the user gets a free copy.
layout="topleft"
left_delta="78"
name="text revolutions"
- width="68">
+ width="68"
+ font="DejaVu"
+ font.size="LSmall" >
Revolutions
</text>
<spinner
@@ -2135,7 +2339,9 @@ even though the user gets a free copy.
min_val="-1"
name="Radius Offset"
top_pad="4"
- width="68" />
+ width="68"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
visible="false"
decimal_digits="2"
@@ -2148,7 +2354,9 @@ even though the user gets a free copy.
min_val="1"
name="Revolutions"
top_delta="0"
- width="68" />
+ width="68"
+ font="DejaVu"
+ font.size="LSmall" />
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -2161,7 +2369,9 @@ even though the user gets a free copy.
tool_tip="Click to choose a picture"
top="70"
visible="false"
- width="145" />
+ width="145"
+ caption_text.font="DejaVu"
+ caption_text.font.size="LSmall" />
<check_box
height="19"
label="Mirror"
@@ -2171,7 +2381,9 @@ even though the user gets a free copy.
tool_tip="Flips sculpted prim along the X axis"
top_pad="8"
visible="false"
- width="130" />
+ width="130"
+ font="DejaVu"
+ font.size="LSmall" />
<check_box
height="19"
label="Inside-out"
@@ -2181,7 +2393,9 @@ even though the user gets a free copy.
tool_tip="Inverts the sculpted prims normals, making it appear inside-out"
top_pad="4"
visible="false"
- width="121" />
+ width="121"
+ font="DejaVu"
+ font.size="LSmall" />
<text
type="string"
length="1"
@@ -2192,7 +2406,9 @@ even though the user gets a free copy.
name="label sculpt type"
top_pad="10"
visible="false"
- width="130">
+ width="130"
+ font="DejaVu"
+ font.size="LSmall" >
Stitching type
</text>
<combo_box
@@ -2202,7 +2418,9 @@ even though the user gets a free copy.
name="sculpt type control"
top_pad="4"
visible="false"
- width="150">
+ width="150"
+ drop_down_button.font="DejaVu"
+ drop_down_button.font.size="LSmall" >
<combo_box.item
label="Sphere"
name="Sphere"
@@ -2259,7 +2477,9 @@ even though the user gets a free copy.
name="select_single"
top="5"
width="252"
- word_wrap="true">
+ word_wrap="true"
+ font="DejaVu"
+ font.size="LSmall" >
Select only one primitive to edit features.
</text>
<text
@@ -2271,7 +2491,9 @@ even though the user gets a free copy.
left="10"
name="edit_object"
top="5"
- width="252">
+ width="252"
+ font="DejaVu"
+ font.size="LSmall" >
Edit object features:
</text>
<check_box
@@ -2282,7 +2504,9 @@ even though the user gets a free copy.
name="Animated Mesh Checkbox Ctrl"
tool_tip="Allows rigged mesh objects to be animated independently"
top_pad="10"
- width="121" />
+ width="121"
+ font="DejaVu"
+ font.size="LSmall" />
<check_box
height="10"
label="Flexible Path"
@@ -2292,7 +2516,9 @@ even though the user gets a free copy.
name="Flexible1D Checkbox Ctrl"
tool_tip="Allows object to flex about the Z axis (Client-side only)"
top_pad="15"
- width="121" />
+ width="121"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -2305,7 +2531,9 @@ even though the user gets a free copy.
max_val="3"
name="FlexNumSections"
top_pad="10"
- width="128" />
+ width="128"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -2319,7 +2547,9 @@ even though the user gets a free copy.
min_val="-10"
name="FlexGravity"
top_pad="4"
- width="128" />
+ width="128"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -2332,7 +2562,9 @@ even though the user gets a free copy.
max_val="10"
name="FlexFriction"
top_pad="4"
- width="128" />
+ width="128"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -2345,7 +2577,9 @@ even though the user gets a free copy.
max_val="10"
name="FlexWind"
top_pad="4"
- width="128" />
+ width="128"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -2358,7 +2592,9 @@ even though the user gets a free copy.
max_val="10"
name="FlexTension"
top_pad="4"
- width="128" />
+ width="128"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -2372,7 +2608,9 @@ even though the user gets a free copy.
min_val="-10"
name="FlexForceX"
top_pad="4"
- width="128" />
+ width="128"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -2386,7 +2624,9 @@ even though the user gets a free copy.
min_val="-10"
name="FlexForceY"
top_pad="4"
- width="128" />
+ width="128"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -2400,7 +2640,9 @@ even though the user gets a free copy.
min_val="-10"
name="FlexForceZ"
top_pad="4"
- width="128" />
+ width="128"
+ font="DejaVu"
+ font.size="LSmall" />
<view_border
bevel_style="none"
follows="top|left"
@@ -2409,7 +2651,9 @@ even though the user gets a free copy.
left="8"
name="object_horizontal"
top_pad="10"
- width="278" />
+ width="278"
+ font="DejaVu"
+ font.size="LSmall" />
<check_box
height="16"
label="Light"
@@ -2418,7 +2662,9 @@ even though the user gets a free copy.
name="Light Checkbox Ctrl"
tool_tip="Causes object to emit light"
top_pad="8"
- width="60" />
+ width="60"
+ font="DejaVu"
+ font.size="LSmall" />
<color_swatch
can_apply_immediately="true"
color="0.5 0.5 0.5 1"
@@ -2430,7 +2676,9 @@ even though the user gets a free copy.
top_pad="-17"
name="colorswatch"
tool_tip="Click to open color picker"
- width="40" />
+ width="40"
+ font="DejaVu"
+ font.size="LSmall" />
<texture_picker
allow_no_texture="true"
top_delta="0"
@@ -2443,7 +2691,9 @@ even though the user gets a free copy.
mouse_opaque="true"
name="light texture control"
tool_tip="Click to choose a projection image (only has effect with deferred rendering enabled)"
- width="32" />
+ width="32"
+ caption_text.font="DejaVu"
+ caption_text.font.size="LSmall" />
<menu_button
menu_filename="menu_copy_paste_light.xml"
follows="top|left"
@@ -2467,7 +2717,9 @@ even though the user gets a free copy.
left="10"
name="Light Intensity"
top_pad="26"
- width="128" />
+ width="128"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner bottom_delta="0"
decimal_digits="3"
follows="left|top"
@@ -2481,7 +2733,9 @@ even though the user gets a free copy.
min_val="0"
mouse_opaque="true"
name="Light FOV"
- width="120" />
+ width="120"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner follows="left|top"
height="19"
initial_value="5"
@@ -2492,7 +2746,9 @@ even though the user gets a free copy.
max_val="20"
name="Light Radius"
top_pad="3"
- width="128" />
+ width="128"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner bottom_delta="0"
decimal_digits="3"
follows="left|top"
@@ -2506,7 +2762,9 @@ even though the user gets a free copy.
min_val="-20"
mouse_opaque="true"
name="Light Focus"
- width="120" />
+ width="120"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner follows="left|top"
height="19"
increment="0.25"
@@ -2518,7 +2776,9 @@ even though the user gets a free copy.
max_val="2"
name="Light Falloff"
top_pad="3"
- width="128" />
+ width="128"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner bottom_delta="0"
decimal_digits="3"
follows="left|top"
@@ -2532,7 +2792,9 @@ even though the user gets a free copy.
min_val="0"
mouse_opaque="true"
name="Light Ambiance"
- width="120" />
+ width="120"
+ font="DejaVu"
+ font.size="LSmall" />
<check_box
height="16"
label="Reflection Probe"
@@ -2541,15 +2803,19 @@ even though the user gets a free copy.
name="Reflection Probe"
tool_tip="Adjusts how objects within this volume receive reflections when PBR is enabled"
top_pad="10"
- width="60" />
+ width="60"
+ font="DejaVu"
+ font.size="LSmall" />
<combo_box
height="19"
top_delta="0"
- left="144"
+ left="144"
follows="left|top"
name="Probe Volume Type"
tool_tip="Choose the probe influence volume"
- width="140">
+ width="140"
+ drop_down_button.font="DejaVu"
+ drop_down_button.font.size="LSmall" >
<combo_box.item
label="Sphere"
name="Sphere"
@@ -2568,7 +2834,9 @@ even though the user gets a free copy.
name="Probe Dynamic"
tool_tip="When enabled, Avatars will appear in reflections within this probe's influence volume."
bottom_delta="19"
- width="60" />
+ width="60"
+ font="DejaVu"
+ font.size="LSmall" />
<text
bottom_delta="-8"
@@ -2580,7 +2848,9 @@ even though the user gets a free copy.
left="10"
name="Probe Update Label"
text_readonly_color="LabelDisabledColor"
- width="100">
+ width="100"
+ font="DejaVu"
+ font.size="LSmall" >
Probe Update
</text>
<combo_box
@@ -2590,7 +2860,9 @@ even though the user gets a free copy.
follows="left|top"
name="Probe Update Type"
tool_tip="Determines how the probe updates. Static updates the slowest and without avatars. Dynamic updates more frequently, with avatars visible in the probes. Mirror (Environment) turns this probe into a realtime planar projected probe that only reflects the environment, but does not calculate ambiance. Mirror (Everything) is similar to Mirror (Environment), but it reflects particles and avatars."
- width="140">
+ width="140"
+ drop_down_button.font="DejaVu"
+ drop_down_button.font.size="LSmall" >
<combo_box.item
label="Static"
name="Static"
@@ -2621,7 +2893,9 @@ even though the user gets a free copy.
min_val="0"
mouse_opaque="true"
name="Probe Ambiance"
- width="120" />
+ width="120"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner bottom_delta="0"
decimal_digits="3"
follows="left|top"
@@ -2635,7 +2909,9 @@ even though the user gets a free copy.
min_val="0"
mouse_opaque="true"
name="Probe Near Clip"
- width="120" />
+ width="120"
+ font="DejaVu"
+ font.size="LSmall" />
<text
type="string"
length="1"
@@ -2644,7 +2920,9 @@ even though the user gets a free copy.
layout="topleft"
name="label physicsshapetype"
top="38"
- width="121">
+ width="121"
+ font="DejaVu"
+ font.size="LSmall" >
Physics Shape Type:
</text>
<combo_box
@@ -2654,13 +2932,17 @@ even though the user gets a free copy.
follows="left|top"
name="Physics Shape Type Combo Ctrl"
tool_tip="Choose the physics shape type"
- width="108"/>
+ width="108"
+ drop_down_button.font="DejaVu"
+ drop_down_button.font.size="LSmall" />
<combo_box
height="19"
layout="topleft"
name="material"
top_pad="5"
- width="150">
+ width="150"
+ drop_down_button.font="DejaVu"
+ drop_down_button.font.size="LSmall" >
<combo_box.item
label="Stone"
name="Stone"
@@ -2703,7 +2985,9 @@ even though the user gets a free copy.
max_val="28"
name="Physics Gravity"
top_pad="10"
- width="132" />
+ width="132"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
@@ -2718,7 +3002,9 @@ even though the user gets a free copy.
min_val="0"
name="Physics Friction"
top_pad="4"
- width="132" />
+ width="132"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
@@ -2734,7 +3020,9 @@ even though the user gets a free copy.
min_val="1"
name="Physics Density"
top_pad="4"
- width="132" />
+ width="132"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
@@ -2749,7 +3037,9 @@ even though the user gets a free copy.
min_val="0"
name="Physics Restitution"
top_pad="8"
- width="132" />
+ width="132"
+ font="DejaVu"
+ font.size="LSmall" />
</panel>
<panel
label="Texture"
@@ -2777,7 +3067,10 @@ even though the user gets a free copy.
left="8"
name="button new script"
top="10"
- width="134" />
+ width="134"
+ font="DejaVu"
+ font.size="LSmall"
+ pad_bottom="1" />
<button
follows="left|top"
height="23"
@@ -2785,7 +3078,10 @@ even though the user gets a free copy.
layout="topleft"
left_pad="8"
name="button permissions"
- width="134" />
+ width="134"
+ font="DejaVu"
+ font.size="LSmall"
+ pad_bottom="1" />
<filter_editor
follows="left|top|right"
label="Enter filter text"
@@ -2822,7 +3118,8 @@ even though the user gets a free copy.
<text
type="string"
length="1"
- font="SansSerifBig"
+ font="DejaVu"
+ font.size="Small"
follows="left|top"
height="19"
layout="topleft"
@@ -2841,7 +3138,9 @@ even though the user gets a free copy.
left="30"
name="label_area_price"
top="48"
- width="150">
+ width="150"
+ font="DejaVu"
+ font.size="LSmall" >
Price: L$[PRICE] for [AREA] m²
</text>
<text
@@ -2853,7 +3152,9 @@ even though the user gets a free copy.
left_delta="0"
name="label_area"
top_delta="0"
- width="150">
+ width="150"
+ font="DejaVu"
+ font.size="LSmall" >
Area: [AREA] m²
</text>
<button
@@ -2865,7 +3166,10 @@ even though the user gets a free copy.
left_delta="0"
name="button about land"
top_pad="4"
- width="125" />
+ width="125"
+ font="DejaVu"
+ font.size="LSmall"
+ pad_bottom="1" />
<check_box
control_name="ShowParcelOwners"
height="19"
@@ -2875,11 +3179,14 @@ even though the user gets a free copy.
name="checkbox show owners"
tool_tip="Colorize the parcels according to the type of owner: &#10;&#10;Green = Your land &#10;Aqua = Your group&apos;s land &#10;Red = Owned by others &#10;Yellow = For sale &#10;Purple = For auction &#10;Grey = Public"
top_pad="8"
- width="205" />
+ width="205"
+ font="DejaVu"
+ font.size="LSmall" />
<text
type="string"
length="1"
- font="SansSerifBig"
+ font="DejaVu"
+ font.size="Small"
follows="left|top"
height="19"
layout="topleft"
@@ -2898,7 +3205,10 @@ even though the user gets a free copy.
left="30"
name="button subdivide land"
top="172"
- width="125" />
+ width="125"
+ font="DejaVu"
+ font.size="LSmall"
+ pad_bottom="1" />
<button
follows="left|top"
height="23"
@@ -2908,11 +3218,15 @@ even though the user gets a free copy.
left_delta="0"
name="button join land"
top_pad="4"
- width="125" />
+ width="125"
+ font="DejaVu"
+ font.size="LSmall"
+ pad_bottom="1" />
<text
type="string"
length="1"
- font="SansSerifBig"
+ font="DejaVu"
+ font.size="Small"
follows="left|top"
height="19"
layout="topleft"
@@ -2931,7 +3245,10 @@ even though the user gets a free copy.
left="30"
name="button buy land"
top="276"
- width="125" />
+ width="125"
+ font="DejaVu"
+ font.size="LSmall"
+ pad_bottom="1" />
<button
follows="left|top"
height="23"
@@ -2941,7 +3258,10 @@ even though the user gets a free copy.
left_delta="0"
name="button abandon land"
top_pad="4"
- width="125" />
+ width="125"
+ font="DejaVu"
+ font.size="LSmall"
+ pad_bottom="1" />
</panel>
<!-- end of tabs -->
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_toybox.xml b/indra/newview/skins/default/xui/en/floater_toybox.xml
index 7fe9830d23..d75d2e0db7 100644
--- a/indra/newview/skins/default/xui/en/floater_toybox.xml
+++ b/indra/newview/skins/default/xui/en/floater_toybox.xml
@@ -16,7 +16,6 @@
width="650">
<text
follows="left|top"
- font="SansSerifMedium"
valign="top"
halign="left"
height="20"
@@ -31,7 +30,6 @@
</text>
<text
follows="left|top"
- font="SansSerifMedium"
valign="top"
halign="left"
height="20"
@@ -49,7 +47,7 @@
button_display_mode="icons_with_text"
follows="all"
left="20"
- button_icon_and_text.button_width.max="140"
+ button_icon_and_text.button_width.max="172"
button_icon_and_text.button_width.min="70"
name="toybox_toolbar"
pad_left="5"
diff --git a/indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml
index c0d260ef59..279a05748d 100644
--- a/indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml
+++ b/indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml
@@ -22,7 +22,7 @@
increment="0.025"
initial_value="0.5"
label="Voice Chat"
- label_width="60"
+ label_width="62"
layout="topleft"
left="15"
top="50"
diff --git a/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml
index 4e75b2b29c..fdc1e64e05 100644
--- a/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml
+++ b/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml
@@ -10,12 +10,12 @@
title="WHITELIST ENTRY"
width="390">
- <text type="string" length="1" bottom="20" follows="top|left" height="15" layout="topleft"
- left="10" name="media_label" top="20">
+ <text type="string" length="1" follows="top|left|right" height="30" layout="topleft"
+ left="10" name="media_label" top="20" right="-10" word_wrap="true">
Enter a URL or URL pattern to add to the list of allowed domains
</text>
- <line_editor bottom_delta="40" enabled="true" follows="left|top" font="SansSerif"
+ <line_editor bottom_delta="15" enabled="true" follows="left|top" font="SansSerif"
height="20" left="10" name="whitelist_entry"
tool_tip="Enter a URL or URL pattern to White List"
width="350" />
diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml
index b0635a2229..4e64b09c1e 100644
--- a/indra/newview/skins/default/xui/en/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_world_map.xml
@@ -167,7 +167,7 @@
follows="top|right"
halign="left"
height="16"
- top_delta="-2"
+ top_delta="-5"
left_pad="7"
layout="topleft"
name="person_label"
@@ -181,9 +181,9 @@
layout="topleft"
left="3"
name="infohub_chk"
- top_pad="3"
+ top_pad="7"
width="22" />
- <icon
+ <icon
follows="top|right"
height="16"
image_name="map_infohub.tga"
@@ -191,7 +191,7 @@
left_pad="0"
mouse_opaque="true"
name="infohub"
- top_delta="0"
+ top_delta="-3"
width="16" />
<text
type="string"
@@ -199,7 +199,7 @@
follows="top|right"
halign="left"
height="16"
- top_delta="2"
+ top_delta="0"
left_pad="3"
layout="topleft"
name="infohub_label"
@@ -213,7 +213,7 @@
layout="topleft"
left="3"
name="land_for_sale_chk"
- top_pad="2"
+ top_pad="8"
width="22" />
<icon
follows="top|right"
@@ -222,16 +222,16 @@
layout="topleft"
mouse_opaque="true"
name="landforsale"
- top_delta="0"
+ top_delta="-3"
left_pad="0"
width="16" />
- <text
+ <text
type="string"
length="1"
follows="top|right"
halign="left"
height="16"
- top_delta="2"
+ top_delta="1"
left_pad="3"
layout="topleft"
name="land_sale_label"
@@ -257,7 +257,7 @@
layout="topleft"
left_pad="0"
name="auction_label"
- top_delta="3"
+ top_delta="1"
width="170">
land auction
</text>
@@ -270,7 +270,7 @@
mouse_opaque="true"
name="square2_owner"
left="20"
- top_pad="-5"
+ top_pad="-2"
width="16" />
<text
type="string"
@@ -280,7 +280,7 @@
layout="topleft"
left_pad="0"
name="by_owner_label"
- top_delta="3"
+ top_delta="0"
width="100">
by owner
</text>
@@ -290,7 +290,7 @@
control_name="MapShowGridCoords"
layout="topleft"
follows="top|right"
- top_pad="2"
+ top_pad="5"
left="3"
height="16"
width="22"
@@ -300,8 +300,8 @@
type="string"
layout="topleft"
follows="top|right"
- top_delta="2"
- left_pad="3"
+ top_delta="-2"
+ left_pad="2"
height="16"
width="220"
halign="left"
@@ -357,7 +357,7 @@
height="16"
layout="topleft"
left="135"
- top_pad="1"
+ top_pad="5"
name="event_chk"
width="22" />
<icon
@@ -367,6 +367,7 @@
layout="topleft"
mouse_opaque="true"
name="event"
+ top_delta="-2"
left_pad="0"
width="18" />
<text
@@ -375,7 +376,7 @@
follows="top|right"
halign="left"
height="16"
- top_delta="2"
+ top_delta="0"
left_pad="3"
layout="topleft"
name="pg_label"
@@ -391,7 +392,7 @@
layout="topleft"
left="135"
name="events_mature_chk"
- top_pad="3"
+ top_pad="7"
width="22" />
<icon
follows="top|right"
@@ -400,16 +401,16 @@
layout="topleft"
mouse_opaque="true"
name="events_mature_icon"
- top_delta="0"
+ top_delta="-2"
left_pad="0"
width="18" />
- <text
+ <text
type="string"
length="1"
follows="top|right"
halign="left"
height="16"
- top_delta="2"
+ top_delta="0"
left_pad="3"
layout="topleft"
name="events_mature_label"
@@ -424,7 +425,7 @@
layout="topleft"
left="135"
name="events_adult_chk"
- top_pad="3"
+ top_pad="7"
width="22" />
<icon
follows="top|right"
@@ -434,15 +435,15 @@
left_pad="0"
mouse_opaque="true"
name="events_adult_icon"
- top_delta="0"
+ top_delta="-2"
width="18" />
- <text
+ <text
type="string"
length="1"
follows="top|right"
halign="left"
height="16"
- top_delta="2"
+ top_delta="0"
left_pad="3"
layout="topleft"
name="events_adult_label"
diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml
index 45ec1e27f1..1ad01ee120 100644
--- a/indra/newview/skins/default/xui/en/fonts.xml
+++ b/indra/newview/skins/default/xui/en/fonts.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<fonts>
- <font name="default" comment="default font files (global fallbacks)">
- <file>DejaVuSans.ttf</file>
+ <font
+ name="default"
+ comment="default font files (global fallbacks)">
+ <file load_collection="true" font_weight="400">InterVariableFont.ttf</file>
+ <file size_delta="-0.5">DejaVuSans.ttf</file>
<file functor="is_emoji">TwemojiSVG.ttf</file>
<os name="Windows">
<file>meiryo.TTC</file>
@@ -31,9 +34,11 @@
</os>
</font>
- <font name="SansSerifBold"
- comment="Name of bold sans-serif font">
- <file>DejaVuSans-Bold.ttf</file>
+ <font
+ name="SansSerifBold"
+ comment="Name of bold sans-serif font">
+ <file load_collection="true" flags="bold" font_weight="700">InterVariableFont.ttf</file>
+ <file size_delta="-0.5">DejaVuSans-Bold.ttf</file>
<os name="Windows">
<file>arialbd.ttf</file>
</os>
@@ -42,8 +47,11 @@
</os>
</font>
- <font name="SansSerif" comment="Name of san-serif font (Truetype file name)">
- <file>DejaVuSans.ttf</file>
+ <font
+ name="SansSerif"
+ comment="Name of san-serif font (Truetype file name)">
+ <file load_collection="true" font_weight="400">InterVariableFont.ttf</file>
+ <file size_delta="-0.5">DejaVuSans.ttf</file>
<os name="Windows">
<file>arial.ttf</file>
</os>
@@ -52,31 +60,38 @@
</os>
</font>
- <font name="SansSerif"
- comment="Name of bold sans-serif font"
- font_style="BOLD">
- <file>DejaVuSans-Bold.ttf</file>
+ <font
+ name="SansSerif"
+ comment="Name of bold sans-serif font"
+ font_style="BOLD">
+ <file load_collection="true" flags="bold" font_weight="700">InterVariableFont.ttf</file>
+ <file size_delta="-0.5">DejaVuSans-Bold.ttf</file>
</font>
- <font name="SansSerif"
- comment="Name of italic sans-serif font"
- font_style="ITALIC">
- <file>DejaVuSans-Oblique.ttf</file>
+ <font
+ name="SansSerif"
+ comment="Name of italic sans-serif font"
+ font_style="ITALIC">
+ <file load_collection="true" font_weight="400">InterItalicVariableFont.ttf</file>
+ <file size_delta="-0.5">DejaVuSans-Oblique.ttf</file>
</font>
- <font name="SansSerif"
- comment="Name of bold italic sans-serif font"
- font_style="BOLD|ITALIC">
- <file>DejaVuSans-BoldOblique.ttf</file>
+ <font
+ name="SansSerif"
+ comment="Name of bold italic sans-serif font"
+ font_style="BOLD|ITALIC">
+ <file load_collection="true" flags="bold" font_weight="700">InterItalicVariableFont.ttf</file>
+ <file size_delta="-0.5">DejaVuSans-BoldOblique.ttf</file>
</font>
<font name="Emoji"
comment="Name of emoji font">
<file>TwemojiSVG.ttf</file>
</font>
-
- <font name="Monospace"
- comment="Name of monospace font">
+
+ <font
+ name="Monospace"
+ comment="Name of monospace font">
<file>DejaVuSansMono.ttf</file>
</font>
@@ -103,9 +118,11 @@
<file>DejaVuSans-BoldOblique.ttf</file>
</font>
- <font name="Helvetica"
- comment="Name of Helvetica font">
- <file>DejaVuSans.ttf</file>
+ <font
+ name="Helvetica"
+ comment="Name of Helvetica font">
+ <file font_weight="400">InterVariableFont.ttf</file>
+ <file size_delta="-0.5">DejaVuSans.ttf</file>
<os name="Windows">
<file>arial.ttf</file>
</os>
@@ -114,10 +131,12 @@
</os>
</font>
- <font name="Helvetica"
- comment="Name of Helvetica font (bold)"
- font_style="BOLD">
- <file>DejaVuSans-Bold.ttf</file>
+ <font
+ name="Helvetica"
+ comment="Name of Helvetica font (bold)"
+ font_style="BOLD">
+ <file flags="bold" font_weight="700">InterVariableFont.ttf</file>
+ <file size_delta="-0.5">DejaVuSans-Bold.ttf</file>
<os name="Windows">
<file>arialbd.ttf</file>
</os>
@@ -126,10 +145,12 @@
</os>
</font>
- <font name="Helvetica"
- comment="Name of Helvetica font (italic)"
- font_style="ITALIC">
- <file>DejaVuSans-Oblique.ttf</file>
+ <font
+ name="Helvetica"
+ comment="Name of Helvetica font (italic)"
+ font_style="ITALIC">
+ <file font_weight="400">InterItalicVariableFont.ttf</file>
+ <file size_delta="-0.5">DejaVuSans-Oblique.ttf</file>
<os name="Windows">
<file>ariali.ttf</file>
</os>
@@ -138,10 +159,12 @@
</os>
</font>
- <font name="Helvetica"
- comment="Name of Helvetica font (bold italic)"
- font_style="BOLD|ITALIC">
- <file>DejaVuSans-BoldOblique.ttf</file>
+ <font
+ name="Helvetica"
+ comment="Name of Helvetica font (bold italic)"
+ font_style="BOLD|ITALIC">
+ <file font_weight="800">InterItalicVariableFont.ttf</file>
+ <file size_delta="-0.5">DejaVuSans-BoldOblique.ttf</file>
<os name="Windows">
<file>arialbi.ttf</file>
</os>
@@ -150,33 +173,38 @@
</os>
</font>
- <font name="OverrideTest"
- comment="Name of font to test overriding">
+ <font
+ name="OverrideTest"
+ comment="Name of font to test overriding">
<file>times.ttf</file>
- <file>DejaVuSans.ttf</file>
+ <file font_weight="400">InterVariableFont.ttf</file>
</font>
<font_size name="Monospace"
- comment="Size for monospaced font (points, or 1/72 of an inch)"
- size="8.0"
- />
+ comment="Size for monospaced font (points, or 1/72 of an inch)"
+ size="8.0"
+ />
<font_size name="Huge"
- comment="Size of huge font (points, or 1/72 of an inch)"
- size="16.0"
- />
+ comment="Size of huge font (points, or 1/72 of an inch)"
+ size="16.0"
+ />
<font_size name="Large"
- comment="Size of large font (points, or 1/72 of an inch)"
- size="10.6"
- />
+ comment="Size of large font (points, or 1/72 of an inch)"
+ size="11.0"
+ />
<font_size name="Medium"
- comment="Size of medium font (points, or 1/72 of an inch)"
- size="8.6"
- />
+ comment="Size of medium font (points, or 1/72 of an inch)"
+ size="10"
+ />
<font_size name="Small"
- comment="Size of small font (points, or 1/72 of an inch)"
- size="7.6"
- />
- <font_size name="SmallLSL"
+ comment="Size of small font (points, or 1/72 of an inch)"
+ size="9"
+ />
+ <font_size name="LSmall"
+ comment="Legacy size of small font (points, or 1/72 of an inch)"
+ size="7.6"
+ />
+<font_size name="SmallLSL"
comment="Size of small font for LSL editor (points, or 1/72 of an inch)"
size="7"
/>
diff --git a/indra/newview/skins/default/xui/en/inspect_group.xml b/indra/newview/skins/default/xui/en/inspect_group.xml
index c190d9610f..226454df7c 100644
--- a/indra/newview/skins/default/xui/en/inspect_group.xml
+++ b/indra/newview/skins/default/xui/en/inspect_group.xml
@@ -9,7 +9,7 @@
bg_opaque_image="Inspector_Background"
can_close="false"
can_minimize="false"
- height="158"
+ height="188"
layout="topleft"
name="inspect_group"
single_instance="true"
@@ -47,7 +47,7 @@
</text>
<text
follows="all"
- height="45"
+ height="65"
left="8"
name="group_details"
use_ellipses="true"
@@ -80,7 +80,7 @@ L$123 to join
height="23"
label="Join"
left="8"
- top="125"
+ top="156"
name="join_btn"
width="103"
commit_callback.function="InspectGroup.Join"/>
@@ -89,7 +89,7 @@ L$123 to join
height="23"
label="Leave"
left="8"
- top="125"
+ top="156"
name="leave_btn"
width="103"
commit_callback.function="InspectGroup.Leave"/>
@@ -98,7 +98,7 @@ L$123 to join
height="23"
label="View Profile"
name="view_profile_btn"
- top="125"
+ top="156"
left="117"
width="103"
commit_callback.function="InspectGroup.ViewProfile" />
diff --git a/indra/newview/skins/default/xui/en/menu_conversation.xml b/indra/newview/skins/default/xui/en/menu_conversation.xml
index 62cdaa5886..5a28f0dde5 100644
--- a/indra/newview/skins/default/xui/en/menu_conversation.xml
+++ b/indra/newview/skins/default/xui/en/menu_conversation.xml
@@ -176,57 +176,60 @@
<on_click function="Group.DoToSelected" parameter="leave_group"/>
<on_enable function="Avatar.EnableItem" parameter="can_leave_group" />
</menu_item_call>
- <menu_item_separator layout="topleft" name="Moderator Options Separator"/>
- <context_menu
- label="Moderator Options"
- layout="topleft"
- name="Moderator Options">
- <menu_item_check
- label="Allow text chat"
- layout="topleft"
- name="AllowTextChat">
- <on_check function="Avatar.CheckItem" parameter="is_allowed_text_chat" />
- <on_click function="Avatar.DoToSelected" parameter="toggle_allow_text_chat" />
- <on_enable function="Avatar.EnableItem" parameter="can_allow_text_chat" />
- </menu_item_check>
- <menu_item_separator layout="topleft" name="moderate_voice_separator" />
- <menu_item_call
- label="Mute this participant"
- layout="topleft"
- name="ModerateVoiceMuteSelected">
- <on_click function="Avatar.DoToSelected" parameter="selected" />
- <on_enable function="Avatar.EnableItem" parameter="can_mute" />
- <on_visible function="Avatar.VisibleItem" parameter="show_mute" />
- </menu_item_call>
+ <menu_item_separator layout="topleft" name="Moderator Options Separator"/>
+ <context_menu
+ label="Moderator Options"
+ layout="topleft"
+ name="Moderator Options">
+ <menu_item_check
+ label="Allow text chat"
+ layout="topleft"
+ name="AllowTextChat">
+ <on_check function="Avatar.CheckItem" parameter="is_allowed_text_chat" />
+ <on_click function="Avatar.DoToSelected" parameter="toggle_allow_text_chat" />
+ <on_enable function="Avatar.EnableItem" parameter="can_allow_text_chat" />
+ <on_visible function="Avatar.VisibleItem" parameter="can_allow_text_chat" />
+ </menu_item_check>
+ <menu_item_separator layout="topleft" name="moderate_voice_separator">
+ <on_visible function="Avatar.VisibleItem" parameter="can_allow_text_chat" />
+ </menu_item_separator>
+ <menu_item_call
+ label="Mute this participant"
+ layout="topleft"
+ name="ModerateVoiceMuteSelected">
+ <on_click function="Avatar.DoToSelected" parameter="selected" />
+ <on_enable function="Avatar.EnableItem" parameter="can_mute" />
+ <on_visible function="Avatar.VisibleItem" parameter="show_mute" />
+ </menu_item_call>
+ <menu_item_call
+ label="Unmute this participant"
+ layout="topleft"
+ name="ModerateVoiceUnMuteSelected">
+ <on_click function="Avatar.DoToSelected" parameter="selected" />
+ <on_enable function="Avatar.EnableItem" parameter="can_unmute" />
+ <on_visible function="Avatar.VisibleItem" parameter="show_unmute" />
+ </menu_item_call>
+ <menu_item_call
+ label="Mute everyone"
+ layout="topleft"
+ name="ModerateVoiceMute">
+ <on_click function="Avatar.DoToSelected" parameter="mute_all" />
+ <on_enable function="Avatar.EnableItem" parameter="can_moderate_voice" />
+ </menu_item_call>
+ <menu_item_call
+ label="Unmute everyone"
+ layout="topleft"
+ name="ModerateVoiceUnmute">
+ <on_click function="Avatar.DoToSelected" parameter="unmute_all" />
+ <on_enable function="Avatar.EnableItem" parameter="can_moderate_voice" />
+ </menu_item_call>
+ </context_menu>
+ <menu_item_separator layout="topleft" name="Group Ban Separator"/>
<menu_item_call
- label="Unmute this participant"
- layout="topleft"
- name="ModerateVoiceUnMuteSelected">
- <on_click function="Avatar.DoToSelected" parameter="selected" />
- <on_enable function="Avatar.EnableItem" parameter="can_unmute" />
- <on_visible function="Avatar.VisibleItem" parameter="show_unmute" />
- </menu_item_call>
- <menu_item_call
- label="Mute everyone"
- layout="topleft"
- name="ModerateVoiceMute">
- <on_click function="Avatar.DoToSelected" parameter="mute_all" />
- <on_enable function="Avatar.EnableItem" parameter="can_moderate_voice" />
- </menu_item_call>
- <menu_item_call
- label="Unmute everyone"
- layout="topleft"
- name="ModerateVoiceUnmute">
- <on_click function="Avatar.DoToSelected" parameter="unmute_all" />
- <on_enable function="Avatar.EnableItem" parameter="can_moderate_voice" />
- </menu_item_call>
- </context_menu>
- <menu_item_separator layout="topleft" name="Group Ban Separator"/>
- <menu_item_call
- label="Ban member"
- layout="topleft"
- name="BanMember">
- <on_click function="Avatar.DoToSelected" parameter="ban_member" />
- <on_enable function="Avatar.EnableItem" parameter="can_ban_member" />
- </menu_item_call>
+ label="Ban member"
+ layout="topleft"
+ name="BanMember">
+ <on_click function="Avatar.DoToSelected" parameter="ban_member" />
+ <on_enable function="Avatar.EnableItem" parameter="can_ban_member" />
+ </menu_item_call>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index fcdea66500..a9adb772e5 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -9228,6 +9228,23 @@ Your voice has been muted by moderator.
</notification>
<notification
+ icon="notifytip.tga"
+ name="NearbyVoiceMutedByModerator"
+ type="notifytip">
+ The moderator has muted your voice chat.
+People in this location will not hear you if you speak.
+ <tag>voice</tag>
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="NearbyVoiceUnmutedByModerator"
+ type="notifytip">
+ Your voice chat can now be heard by people in this location.
+ <tag>voice</tag>
+ </notification>
+
+ <notification
icon="alertmodal.tga"
name="FailedToGetBenefits"
type="alertmodal">
diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
index ca6e94397d..f9b65e3f13 100644
--- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
@@ -61,7 +61,7 @@
left_pad="5"
name="avatar_name"
parse_urls="false"
- top="6"
+ top="5"
use_ellipses="true"
value="(loading)"
width="180" />
diff --git a/indra/newview/skins/default/xui/en/panel_blocked_list_item.xml b/indra/newview/skins/default/xui/en/panel_blocked_list_item.xml
index 5ac0bf54de..6b4312a22a 100644
--- a/indra/newview/skins/default/xui/en/panel_blocked_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_blocked_list_item.xml
@@ -65,7 +65,7 @@
left_pad="5"
name="item_name"
parse_urls="false"
- top="6"
+ top="4"
use_ellipses="true"
width="180" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml
index 4f48911376..dde2df7128 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml
@@ -23,7 +23,7 @@
<text
parse_urls="false"
allow_scroll="false"
- v_pad = "6"
+ v_pad = "4"
read_only = "true"
follows="left|right"
font.style="BOLD"
@@ -49,7 +49,7 @@
left_pad="5"
name="time_box"
right="-5"
- top="7"
+ top="5"
value="23:30"
width="110" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml
index 5406497930..c43f82c0f1 100644
--- a/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml
@@ -109,7 +109,7 @@
image_overlay_alignment="center"
image_pressed="WellButton_Lit"
image_pressed_selected="WellButton_Lit_Selected"
- image_selected="PushButton_Press"
+ image_selected="PushButton_Selected"
label_color="Black"
left="0"
name="Unread"
diff --git a/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml
index 7902588598..90e367543e 100644
--- a/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml
@@ -78,7 +78,7 @@
left="5"
name="conversation_title"
parse_urls="false"
- top="6"
+ top="4"
use_ellipses="true"
value="(loading)"
width="35" />
@@ -86,6 +86,7 @@
auto_update="true"
follows="top|right"
draw_border="false"
+ top="6"
height="16"
layout="topleft"
left_pad="5"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_shape.xml b/indra/newview/skins/default/xui/en/panel_edit_shape.xml
index c1d743c3da..2bd25b43bd 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_shape.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_shape.xml
@@ -15,7 +15,7 @@
<string name="height_value_label_color" translate="false">White</string>
<text
follows="top|left|right"
- font="SansSerifSmallBold"
+ font="SansSerifSmall"
halign="right"
height="12"
layout="topleft"
@@ -36,7 +36,7 @@
layout="topleft"
left="10"
name="accordion_panel"
- top_pad="0"
+ top_pad="5"
width="313">
<accordion
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_experience_search.xml b/indra/newview/skins/default/xui/en/panel_experience_search.xml
index bb07476ad0..7867361623 100644
--- a/indra/newview/skins/default/xui/en/panel_experience_search.xml
+++ b/indra/newview/skins/default/xui/en/panel_experience_search.xml
@@ -47,12 +47,14 @@
<text
name="lbl name part"
left="0"
+ top_pad="1"
follows="top|left|right"
right="-1">
Enter part of the name:
</text>
<line_editor
left="0"
+ top_pad="9"
follows="left|top|right"
name="edit"
height="18"
@@ -121,7 +123,7 @@
draw_heading="true"
left="0"
right="-1"
- height="239"
+ height="236"
top_pad="4"
follows="all"
column_padding="5"
diff --git a/indra/newview/skins/default/xui/en/panel_gltf_material.xml b/indra/newview/skins/default/xui/en/panel_gltf_material.xml
index 45df40bc05..697c6e60b7 100644
--- a/indra/newview/skins/default/xui/en/panel_gltf_material.xml
+++ b/indra/newview/skins/default/xui/en/panel_gltf_material.xml
@@ -7,7 +7,7 @@
top="0"
left="0"
height="768"
- width="247">
+ width="257">
<check_box
follows="left|top"
layout="topleft"
@@ -20,7 +20,7 @@
<panel
border="true"
follows="left|top"
- width="246"
+ width="256"
height="196"
layout="topleft"
left="1"
@@ -175,7 +175,7 @@
<panel
border="true"
follows="left|top"
- width="246"
+ width="256"
height="175"
layout="topleft"
left="1"
@@ -252,7 +252,7 @@
layout="topleft"
left_delta="0"
top_pad="5"
- width="96"
+ width="105"
name="roughness_factor_lbl">
Roughness Factor
</text>
@@ -273,7 +273,7 @@
<panel
border="true"
follows="left|top"
- width="246"
+ width="256"
height="175"
layout="topleft"
left="1"
@@ -343,7 +343,7 @@
<panel
border="true"
follows="left|top"
- width="246"
+ width="256"
height="175"
layout="topleft"
left="1"
diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml
index 74bc7736f9..260dc02ae3 100644
--- a/indra/newview/skins/default/xui/en/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_general.xml
@@ -64,8 +64,7 @@ Hover your mouse over the options for more help.
use_ellipses="true"
width="168" />
<text
- font="SansSerifMedium"
- text_color="white"
+ text_color="white"
type="string"
follows="left|top"
height="16"
diff --git a/indra/newview/skins/default/xui/en/panel_group_list_item.xml b/indra/newview/skins/default/xui/en/panel_group_list_item.xml
index ff6af88707..dff00e4e60 100644
--- a/indra/newview/skins/default/xui/en/panel_group_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_list_item.xml
@@ -44,7 +44,7 @@
layout="topleft"
left_pad="5"
name="group_name"
- top="6"
+ top="4"
use_ellipses="true"
value="Unknown"
width="242" />
diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml
index 1162dcf20d..2ecc4585ba 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -28,7 +28,7 @@ You can turn off Notices on the General tab.
left="5"
name="lbl2"
right="-1"
- top="5"
+ top="3"
width="300">
Notices are kept for 14 days.
Maximum 200 per group daily
@@ -42,7 +42,7 @@ Maximum 200 per group daily
left="0"
right="-1"
name="notice_list"
- top_pad="0"
+ top_pad="6"
width="304">
<scroll_list.columns
label=""
@@ -276,7 +276,6 @@ Maximum 200 per group daily
width="313">
<text
type="string"
- font="SansSerifMedium"
height="16"
layout="topleft"
left="10"
diff --git a/indra/newview/skins/default/xui/en/panel_hint.xml b/indra/newview/skins/default/xui/en/panel_hint.xml
index 7442136761..741ed5af41 100644
--- a/indra/newview/skins/default/xui/en/panel_hint.xml
+++ b/indra/newview/skins/default/xui/en/panel_hint.xml
@@ -3,7 +3,6 @@
width="205"
height="34">
<text name="hint_title"
- font="SansSerifMedium"
left="8"
right="180"
top="8"
diff --git a/indra/newview/skins/default/xui/en/panel_hint_image.xml b/indra/newview/skins/default/xui/en/panel_hint_image.xml
index d712245df8..3e3205531f 100644
--- a/indra/newview/skins/default/xui/en/panel_hint_image.xml
+++ b/indra/newview/skins/default/xui/en/panel_hint_image.xml
@@ -4,7 +4,6 @@
height="40"
layout="topleft">
<text name="hint_title"
- font="SansSerifMedium"
left="8"
right="290"
top="8"
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index 27b74a46ce..482cbef236 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -6,7 +6,7 @@
name="panel_login"
focus_root="true"
background_visible="true"
- bg_opaque_color="0.16 0.16 0.16 1"
+ bg_opaque_color="DkGrayLogin"
background_opaque="true"
width="1024">
<panel.string
@@ -18,182 +18,379 @@
https://join.secondlife.com/
</panel.string>
<layout_stack
- follows="left|right|top"
- height="172"
- left="0"
- name="ui_stack"
- orientation="horizontal"
- top="10"
- width="1024">
+ follows="all"
+ layout="topleft"
+ orientation="horizontal"
+ name="main_stack"
+ border_size="0"
+ animate="false"
+ top="0"
+ left="0"
+ height="768"
+ width="1024">
+ <layout_panel
+ auto_resize="true"
+ user_resize="false"
+ layout="topleft"
+ name="left_spacer"
+ background_visible="false"
+ min_width="0"
+ expanded_min_dim="0"
+ width="1">
+ </layout_panel>
<layout_panel
- height="172"
- auto_resize="true"
- name="ui_elastic_pad_left"
- width="32" />
+ auto_resize="false"
+ user_resize="false"
+ layout="topleft"
+ name="center_stage"
+ background_visible="true"
+ bg_opaque_color="DkGrayLogin"
+ background_opaque="true"
+ width="1008"
+ height="768">
+ <layout_stack
+ follows="all"
+ layout="topleft"
+ orientation="horizontal"
+ name="ui_stack"
+ border_size="0"
+ animate="false"
+ top="0"
+ left="0"
+ height="768"
+ width="1008">
+ <layout_panel
+ auto_resize="false"
+ user_resize="false"
+ layout="topleft"
+ name="ui_container"
+ width="300"
+ height="768"
+ background_visible="true"
+ bg_opaque_color="PanelDark"
+ background_opaque="true">
+ <icon
+ height="77"
+ width="160"
+ image_name="login_sl_logo_horizontal"
+ layout="topleft"
+ follows="left|top"
+ left="70"
+ top="39"
+ name="sl_logo_small" />
+ <icon
+ left="40"
+ top_pad="30"
+ width="220"
+ height="28"
+ image_name="TextField_Active"
+ layout="topleft"
+ follows="left|top"
+ name="text_field_bg1" />
+ <combo_box
+ left="40"
+ top_delta="0"
+ allow_text_entry="true"
+ follows="left|top"
+ layout="topleft"
+ height="28"
+ label="Username"
+ combo_editor.font="SansSerifLarge"
+ max_chars="128"
+ combo_editor.commit_on_focus_lost="false"
+ combo_editor.prevalidator="ascii"
+ tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine"
+ name="username_combo"
+ width="220">
+ <combo_box.combo_button
+ image_overlay="ComboButton_Arrow"
+ image_overlay_right_delta="10"
+ image_unselected="ComboButton_Transparent"
+ hover_glow_amount="0"
+ image_selected="ComboButton_Transparent"
+ image_disabled="ComboButton_Transparent" />
+ <combo_box.combo_editor
+ background_image="TextField_Transparent"
+ background_image_disabled="TextField_Transparent"
+ background_image_focused="TextField_Transparent"
+ draw_focus_border="false"
+ text_pad_left="8"
+ bg_image_always_focused="true"/>
+ </combo_box>
+ <check_box
+ follows="left|top"
+ font="SansSerifMedium"
+ label_text.text_color="White"
+ top_pad="3"
+ layout="topleft"
+ height="24"
+ label="Remember username"
+ word_wrap="down"
+ check_button.bottom="3"
+ name="remember_name"
+ tool_tip="Already remembered user can be forgotten from Me &gt; Preferences &gt; Advanced &gt; Remembered Usernames."
+ width="198">
+ <check_box.label_text left="23"/>
+ <check_box.check_button
+ image_selected="Checkbox_Slim_On"
+ image_unselected="Checkbox_Slim_Off"
+ image_pressed="Checkbox_Slim_Off"
+ image_pressed_selected="Checkbox_Slim_Off"/>
+ </check_box>
+ <line_editor
+ follows="left|top"
+ height="28"
+ top_pad="20"
+ max_length_chars="16"
+ text_pad_left="8"
+ name="password_edit"
+ label="Password"
+ bg_image_always_focused="true"
+ font="SansSerifLarge"
+ is_password="true"
+ select_on_focus="true"
+ draw_focus_border="false"
+ commit_on_focus_lost="false"
+ width="220" />
+ <check_box
+ control_name="RememberPassword"
+ follows="left|top"
+ font="SansSerifMedium"
+ label_text.text_color="White"
+ height="24"
+ top_pad="3"
+ label="Remember password"
+ word_wrap="down"
+ check_button.bottom="3"
+ name="remember_password"
+ width="165">
+ <check_box.label_text left="23"/>
+ <check_box.check_button
+ image_selected="Checkbox_Slim_On"
+ image_unselected="Checkbox_Slim_Off"
+ image_pressed="Checkbox_Slim_Off"
+ image_pressed_selected="Checkbox_Slim_Off"/>
+ </check_box>
+ <text
+ follows="left|top"
+ font="SansSerif"
+ text_color="White"
+ height="12"
+ name="location_text"
+ top_pad="18"
+ width="120"
+ valign="center">
+ Start here
+ </text>
+ <icon
+ top_pad="6"
+ width="220"
+ height="28"
+ image_name="TextField_Active"
+ layout="topleft"
+ follows="left|top"
+ name="text_field_bg2" />
+ <combo_box
+ allow_text_entry="true"
+ control_name="NextLoginLocation"
+ follows="left|top"
+ label="My favorite places"
+ height="28"
+ max_chars="128"
+ combo_editor.font="SansSerifLarge"
+ top_delta="0"
+ name="start_location_combo"
+ width="220"
+ combo_button.scale_image="true">
+ <combo_box.combo_button
+ image_overlay="ComboButton_Arrow"
+ hover_glow_amount="0"
+ image_overlay_right_delta="10"
+ image_unselected="ComboButton_Transparent"
+ image_selected="ComboButton_Transparent"
+ image_disabled="ComboButton_Transparent" />
+ <combo_box.combo_editor
+ background_image="TextField_Transparent"
+ background_image_disabled="TextField_Transparent"
+ background_image_focused="TextField_Transparent"
+ draw_focus_border="false"
+ text_pad_left="8"
+ bg_image_always_focused="true"/>
+ <combo_box.item
+ label="My last location"
+ name="MyLastLocation"
+ value="last" />
+ <combo_box.item
+ label="My home"
+ name="MyHome"
+ value="home" />
+ </combo_box>
+ <layout_stack
+ follows="left|top"
+ layout="topleft"
+ orientation="vertical"
+ name="login_stack"
+ border_size="0"
+ animate="false"
+ top_pad="0"
+ left="0"
+ height="218"
+ width="300">
+ <layout_panel
+ auto_resize="false"
+ user_resize="false"
+ layout="topleft"
+ name="grid_panel"
+ background_visible="false"
+ height="64"
+ width="300">
+ <text
+ follows="left|top"
+ font="SansSerif"
+ text_color="white"
+ height="12"
+ name="grid_text"
+ top="18"
+ left="40"
+ width="120"
+ valign="center">
+ Grid
+ </text>
+ <combo_box
+ allow_text_entry="false"
+ font="SansSerifTiny"
+ follows="left|top"
+ height="28"
+ top_pad="6"
+ left="40"
+ max_chars="128"
+ label="Select grid"
+ layout="topleft"
+ name="server_combo"
+ width="220">
+ <combo_box.drop_down_button
+ pad_bottom="1"
+ pad_left="10"
+ font="SansSerifLarge"
+ label_color="Black"
+ label_color_selected="Black"
+ draw_focus_border="false"
+ image_overlay="ComboButton_Arrow"
+ image_overlay_right_delta="10"
+ image_unselected="TextField_Active"
+ image_selected="TextField_Active"
+ image_pressed="TextField_Active"
+ image_pressed_selected="TextField_Active"/>
+ </combo_box>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ user_resize="false"
+ layout="topleft"
+ name="login_panel"
+ background_visible="false"
+ height="172"
+ width="300">
+ <button
+ follows="left|top"
+ image_unselected="PushButton_Login"
+ image_pressed="PushButton_Login_Pressed"
+ image_hover_unselected="PushButton_Login_Over"
+ label="Log in"
+ label_color="Black"
+ label_color_disabled="Black"
+ font="SansSerifLarge"
+ font.style="BOLD"
+ name="connect_btn"
+ draw_focus_border="false"
+ hover_hand_cursor="true"
+ enabled="true"
+ width="220"
+ height="30"
+ left="40"
+ top="25"
+ pad_bottom="1" />
+ <text
+ follows="left|top"
+ font="SansSerifMedium"
+ text_color="EmphasisColor"
+ height="15"
+ name="forgot_password_text"
+ left="60"
+ top_pad="9"
+ width="180"
+ halign="center">
+ Need help logging in?
+ </text>
+ <button
+ follows="left|top"
+ image_unselected="PushButton_Sign"
+ image_pressed="PushButton_Sign_Pressed"
+ image_hover_unselected="PushButton_Sign_Over"
+ label="Create account"
+ label_color="White"
+ label_color_disabled="Black"
+ font="SansSerifMedium"
+ font.style="BOLD"
+ name="sign_btn"
+ draw_focus_border="false"
+ hover_hand_cursor="true"
+ width="220"
+ height="35"
+ left="40"
+ top_pad="25"
+ pad_bottom="1" />
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ user_resize="false"
+ layout="topleft"
+ name="middle_gutter"
+ min_width="18"
+ max_width="18"
+ expanded_min_dim="18"
+ width="18"
+ height="768"
+ background_visible="true"
+ bg_opaque_color="DkGrayLogin"
+ background_opaque="true">
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ user_resize="false"
+ layout="topleft"
+ name="web_container"
+ width="690"
+ height="768"
+ background_visible="true"
+ bg_opaque_color="DkGrayLogin"
+ background_opaque="true">
+ <web_browser
+ tab_stop="false"
+ trusted_content="true"
+ bg_opaque_color="DkGrayLogin"
+ border_visible="false"
+ follows="all"
+ left="0"
+ top="0"
+ right="-1"
+ bottom="-1"
+ name="login_html"
+ start_url="" />
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
<layout_panel
- auto_resize="false"
- follows="left|right|top"
- name="ui_container"
- width="1011"
- left="0"
- top="0"
- height="172">
- <icon
- height="73"
- width="165"
- image_name="login_sl_logo"
- left="0"
- top="25"
- name="sl_logo_small" />
- <combo_box
- left_pad="22"
- bottom_delta="-7"
- allow_text_entry="true"
- follows="left|top"
- height="32"
- label="Username"
- combo_editor.font="SansSerifLarge"
- max_chars="128"
- combo_editor.commit_on_focus_lost="false"
- combo_editor.prevalidator="ascii"
- tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine"
- name="username_combo"
- width="206">
- <combo_box.combo_editor
- text_pad_left="8"
- bg_image_always_focused="true"/>
- </combo_box>
- <line_editor
- follows="left|top"
- height="32"
- left_pad="15"
- max_length_chars="16"
- text_pad_left="8"
- name="password_edit"
- label="Password"
- bg_image_always_focused="true"
- font="SansSerifLarge"
- is_password="true"
- select_on_focus="true"
- commit_on_focus_lost="false"
- bottom_delta="0"
- width="165" />
- <combo_box
- allow_text_entry="true"
- control_name="NextLoginLocation"
- follows="left|top"
- label="My favorite places"
- height="32"
- max_chars="128"
- combo_editor.font="SansSerifLarge"
- left_pad="15"
- bottom_delta="0"
- name="start_location_combo"
- width="175"
- combo_button.scale_image="true">
- <combo_box.combo_editor
- bg_image_always_focused="true"
- text_pad_left="8"/>
- <combo_box.item
- label="My last location"
- name="MyLastLocation"
- value="last" />
- <combo_box.item
- label="My home"
- name="MyHome"
- value="home" />
- </combo_box>
- <button
- follows="left|top"
- image_unselected="PushButton_Login"
- image_pressed="PushButton_Login_Pressed"
- image_hover_unselected="PushButton_Login_Over"
- label="Log In"
- label_color="White"
- font="SansSerifMedium"
- name="connect_btn"
- enabled="true"
- width="120"
- height="32"
- left_pad="15"
- bottom_delta="0" />
- <text
- follows="left|top"
- font="SansSerifLarge"
- font.style="BOLD"
- text_color="EmphasisColor"
- height="34"
- name="sign_up_text"
- left_pad="10"
- width="200"
- valign="center">
- Sign up
- </text>
- <check_box
- follows="left|top"
- font="SansSerifMedium"
- left="185"
- bottom_delta="21"
- height="24"
- label="Remember me"
- word_wrap="down"
- check_button.bottom="3"
- name="remember_name"
- tool_tip="Already remembered user can be forgotten from Me &gt; Preferences &gt; Advanced &gt; Remembered Usernames."
- width="198" />
- <check_box
- control_name="RememberPassword"
- follows="left|top"
- font="SansSerifMedium"
- height="24"
- left="408"
- bottom_delta="0"
- label="Remember password"
- word_wrap="down"
- check_button.bottom="3"
- name="remember_password"
- width="165" />
- <combo_box
- allow_text_entry="false"
- font="SansSerifTiny"
- follows="left|top"
- height="26"
- left="588"
- bottom_delta="8"
- max_chars="128"
- label="Select grid"
- layout="topleft"
- name="server_combo"
- width="149" />
- <text
- follows="left|top"
- font="SansSerifMedium"
- text_color="EmphasisColor"
- height="16"
- name="forgot_password_text"
- left="778"
- bottom_delta="-8"
- width="120"
- halign="center">
- Password help
- </text>
- </layout_panel>
- <layout_panel
- height="172"
- auto_resize="true"
- name="ui_elastic_pad_right"
- width="32" />
+ auto_resize="true"
+ user_resize="false"
+ layout="topleft"
+ name="right_spacer"
+ background_visible="false"
+ min_width="0"
+ expanded_min_dim="0"
+ width="1">
+ </layout_panel>
</layout_stack>
- <web_browser
- tab_stop="false"
- trusted_content="true"
- bg_opaque_color="Black"
- border_visible="false"
- follows="all"
- left="0"
- name="login_html"
- start_url=""
- top="154"
- height="600"
- width="1024" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_login_first.xml b/indra/newview/skins/default/xui/en/panel_login_first.xml
deleted file mode 100644
index d6ac71db94..0000000000
--- a/indra/newview/skins/default/xui/en/panel_login_first.xml
+++ /dev/null
@@ -1,262 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel
- follows="all"
- height="768"
- layout="topleft"
- name="panel_login"
- focus_root="true"
- background_visible="true"
- bg_opaque_color="0.16 0.16 0.16 1"
- background_opaque="true"
- width="1024">
- <panel.string
- name="forgot_password_url">
- http://secondlife.com/account/request.php
- </panel.string>
- <panel.string
- name="sign_up_url">
- https://join.secondlife.com/
- </panel.string>
- <layout_stack
- follows="left|right|top|bottom"
- width="1024"
- height="768"
- left="0"
- name="logo_stack"
- orientation="vertical"
- top="0">
- <layout_panel
- height="18"
- auto_resize="false"
- name="page_top"
- width="1024" />
- <!-- start of logo stack -->
- <layout_panel
- height="130"
- min_height="10"
- auto_resize="false"
- name="parent_panel"
- width="1024">
- <layout_stack
- follows="left|right|top|bottom"
- height="100"
- left="0"
- name="logo_stack"
- orientation="horizontal"
- top="0"
- width="1024">
- <layout_panel
- height="110"
- min_height="10"
- auto_resize="true"
- name="logo_left"
- width="300" />
- <layout_panel
- auto_resize="false"
- follows="left|right|top"
- name="logo_container"
- width="225"
- left="0"
- top="0"
- height="105">
- <icon
- height="94"
- image_name="login_sl_logo"
- left="0"
- name="sl_logo"
- top="0" />
- </layout_panel>
- <layout_panel
- height="100"
- name="logo_right"
- auto_resize="true"
- width="300" />
- </layout_stack>
- </layout_panel>
- <!-- end of logo stack -->
- <!-- start of widget stack -->
- <layout_panel
- height="100"
- min_height="10"
- auto_resize="false"
- name="parent_panel2"
- width="1024">
- <layout_stack
- follows="left|right|top|bottom"
- height="80"
- left="0"
- name="widget_stack"
- orientation="horizontal"
- top="0"
- width="1024">
- <layout_panel
- height="80"
- min_height="10"
- auto_resize="true"
- name="widget_left"
- width="200" />
- <layout_panel
- auto_resize="false"
- follows="left|right|top"
- name="widget_container"
- width="730"
- left="0"
- top="0"
- height="80">
- <combo_box
- allow_text_entry="true"
- follows="left|bottom"
- height="32"
- left="42"
- label="Username"
- combo_editor.font="SansSerifLarge"
- max_chars="128"
- top="0"
- combo_editor.prevalidator="ascii"
- tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine"
- name="username_combo"
- width="232">
- <combo_box.combo_editor
- text_pad_left="8" />
- <combo_box.combo_button
- visible ="false"/>
- <combo_box.drop_down_button
- visible ="false"/>
- </combo_box>
- <line_editor
- follows="left|top"
- width="200"
- height="32"
- left="262"
- max_length_chars="16"
- name="password_edit"
- label="Password"
- text_pad_left="8"
- font="SansSerifLarge"
- is_password="true"
- select_on_focus="true"
- commit_on_focus_lost="false"
- top="0" />
- <button
- follows="left|top"
- image_unselected="PushButton_Login"
- image_pressed="PushButton_Login_Pressed"
- image_hover_unselected="PushButton_Login_Over"
- label="Log In"
- label_color="White"
- font="SansSerifLarge"
- name="connect_btn"
- left_pad="15"
- width="120"
- height="32"
- top="0" />
- <text
- follows="left|top"
- font="SansSerifLarge"
- font.style="BOLD"
- text_color="EmphasisColor"
- height="34"
- name="sign_up_text"
- left_pad="10"
- top="0"
- width="200"
- valign="center">
- Sign up
- </text>
- <check_box
- follows="left|top"
- font="SansSerifLarge"
- left="42"
- top="32"
- height="24"
- label="Remember me"
- word_wrap="down"
- check_button.bottom="3"
- name="remember_name"
- tool_tip="Already remembered user can be forgotten from Me &gt; Preferences &gt; Advanced &gt; Remembered Usernames."
- width="198" />
- <check_box
- control_name="RememberPassword"
- follows="left|top"
- font="SansSerifLarge"
- height="24"
- left="262"
- bottom_delta="0"
- label="Remember password"
- word_wrap="down"
- check_button.bottom="3"
- name="remember_password"
- width="198" />
- <text
- follows="left|top"
- font="SansSerifLarge"
- text_color="EmphasisColor"
- height="16"
- name="forgot_password_text"
- left="492"
- top="34"
- width="200">
- Forgotten password
- </text>
- </layout_panel>
- <layout_panel
- height="100"
- name="widget_right"
- auto_resize="true"
- width="200" />
- </layout_stack>
- </layout_panel>
- <!-- end of widget stack -->
- <!-- start of images stack -->
- <layout_panel
- height="500"
- min_height="10"
- auto_resize="false"
- name="parent_panel3"
- width="1024">
- <layout_stack
- follows="left|right|top|bottom"
- height="500"
- left="0"
- name="images_stack"
- orientation="horizontal"
- top="0"
- width="1024">
- <layout_panel
- height="500"
- min_height="10"
- auto_resize="true"
- name="images_left"
- width="96" />
- <layout_panel
- auto_resize="false"
- follows="left|right|top"
- name="images_container"
- width="675"
- left="0"
- top="0"
- height="500">
- <icon
- height="450"
- width="675"
- image_name="first_login_image"
- left="0"
- name="image_left"
- top="0" />
- </layout_panel>
- <layout_panel
- height="100"
- name="images_right"
- auto_resize="true"
- width="96" />
- </layout_stack>
- </layout_panel>
- <!-- end of images stack -->
- <layout_panel
- height="400"
- min_height="10"
- auto_resize="true"
- name="page_bottom"
- width="1024" />
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index 6e1e6facbe..a302d44e83 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -34,7 +34,6 @@
left="12"
right="-12"
name="ItemcountText"
- font="SansSerifMedium"
text_color="InventoryItemLinkColor"
use_ellipses="true"
top_pad="0">
diff --git a/indra/newview/skins/default/xui/en/panel_marketplace_listings.xml b/indra/newview/skins/default/xui/en/panel_marketplace_listings.xml
index 61cd6a83d4..371147b28a 100644
--- a/indra/newview/skins/default/xui/en/panel_marketplace_listings.xml
+++ b/indra/newview/skins/default/xui/en/panel_marketplace_listings.xml
@@ -108,7 +108,6 @@
left="2"
width="306"
halign="center"
- font="SansSerifMedium"
font_shadow="hard"
valign="top">
Drop folders here to create new listings
diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
index 85cf4419a3..4d924a6c24 100644
--- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
@@ -89,7 +89,7 @@
image_hover_unselected="PushButton_Over"
image_bottom_pad="1"
layout="topleft"
- left="10"
+ left="9"
name="back_btn"
tool_tip="Go back to previous location"
top="2"
@@ -102,7 +102,7 @@
image_hover_unselected="PushButton_Over"
image_bottom_pad="1"
layout="topleft"
- left_pad="0"
+ left_pad="1"
name="forward_btn"
tool_tip="Go forward one location"
top_delta="0"
diff --git a/indra/newview/skins/default/xui/en/panel_notification_list_item.xml b/indra/newview/skins/default/xui/en/panel_notification_list_item.xml
index 80db209b59..c6e2c124d1 100644
--- a/indra/newview/skins/default/xui/en/panel_notification_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_notification_list_item.xml
@@ -63,7 +63,8 @@
use_ellipses="true" word_wrap="false" mouse_opaque="false" name="sender_or_fee_box" visible="false">
Sender: "Resident R e s i d e n t R e s i d e n t"
</text>
- <text allow_scroll="false" font="SansSerifSmall" top="0" right="-5" width="95" height="13" follows="right" halign="right" layout="topleft" left_pad="5"
+ <!-- Old DejaVu font is used to avoid overlapping with sender name -->
+ <text allow_scroll="false" font="DejaVu" font.size="LSmall" top="0" right="-5" width="100" height="13" follows="right" halign="right" layout="topleft" left_pad="5"
name="notification_time" value="2014/12/24 23:30" />
</panel>
</panel>
@@ -105,7 +106,8 @@
use_ellipses="true" word_wrap="false" mouse_opaque="false" name="sender_or_fee_box_exp" visible="false">
Sender: "Resident R e s i d e n t R e s i d e n t"
</text>
- <text allow_scroll="false" font="SansSerifSmall" top="0" right="-1" width="95" height="13" follows="right" halign="right" layout="topleft" left_pad="5"
+ <!-- Old DejaVu font is used to avoid overlapping with sender name -->
+ <text allow_scroll="false" font="DejaVu" font.size="LSmall" top="0" right="-1" width="100" height="13" follows="right" halign="right" layout="topleft" left_pad="5"
name="notification_time_exp" value="2014/12/24 23:30" />
</panel>
<panel border="false" left="0" height="115" width="230" bevel_style="none" follows="all" layout="topleft" name="notification_text_panel_exp" visible="true">
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
index a0e3344304..4cd9d27841 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -216,7 +216,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap
<button
follows="left|bottom"
height="22"
- image_pressed="PushButton_Press"
+ image_pressed="PushButton_Selected"
image_pressed_selected="PushButton_Selected_Press"
image_selected="PushButton_Selected_Press"
is_toggle="true"
@@ -251,7 +251,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap
follows="bottom|right"
height="22"
image_overlay="Search_Icon"
- image_pressed="PushButton_Press"
+ image_pressed="PushButton_Selected"
image_pressed_selected="PushButton_Selected_Press"
image_selected="PushButton_Selected_Press"
is_toggle="true"
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 1be34550fa..d43045ebaa 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -183,6 +183,7 @@ Learn about [https://community.secondlife.com/knowledgebase/joining-and-particip
increment="1"
follows="left|top"
left="5"
+ top_pad="5"
min_val="0"
max_val="4096"
label="Range:"
@@ -199,13 +200,13 @@ Learn about [https://community.secondlife.com/knowledgebase/joining-and-particip
<layout_stack
clip="false"
follows="all"
- height="410"
+ height="406"
layout="topleft"
left="0"
mouse_opaque="false"
orientation="vertical"
right="-1"
- top_pad="0">
+ top_pad="3">
<layout_panel
height="142"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_performance_autoadjustments.xml b/indra/newview/skins/default/xui/en/panel_performance_autoadjustments.xml
index 9f930d1557..1bea605d91 100644
--- a/indra/newview/skins/default/xui/en/panel_performance_autoadjustments.xml
+++ b/indra/newview/skins/default/xui/en/panel_performance_autoadjustments.xml
@@ -144,7 +144,7 @@
<button
follows="top|left"
height="22"
- image_pressed="PushButton_Press"
+ image_pressed="PushButton_Selected"
image_pressed_selected="PushButton_Selected_Press"
image_selected="PushButton_Selected_Press"
label="Auto-adjust now"
@@ -157,7 +157,7 @@
<button
follows="top|left"
height="22"
- image_pressed="PushButton_Press"
+ image_pressed="PushButton_Selected"
image_pressed_selected="PushButton_Selected_Press"
image_selected="PushButton_Selected_Press"
label="Cancel"
@@ -183,7 +183,7 @@
follows="top|left"
height="20"
initial_value="true"
- image_pressed="PushButton_Press"
+ image_pressed="PushButton_Selected"
image_pressed_selected="PushButton_Selected_Press"
image_selected="PushButton_Selected_Press"
is_toggle="true"
diff --git a/indra/newview/skins/default/xui/en/panel_performance_preferences.xml b/indra/newview/skins/default/xui/en/panel_performance_preferences.xml
index 5031784644..df14a66515 100644
--- a/indra/newview/skins/default/xui/en/panel_performance_preferences.xml
+++ b/indra/newview/skins/default/xui/en/panel_performance_preferences.xml
@@ -91,7 +91,7 @@
layout="topleft"
left_pad="40"
name="fastest_lbl"
- width="40">
+ width="42">
Fastest
</text>
<radio_group
@@ -240,7 +240,7 @@
left_pad="10"
top_delta="1"
name="farther_lbl"
- width="40">
+ width="45">
Farther
</text>
<text
@@ -284,7 +284,7 @@
top_delta="0"
left="160"
name="enhancements_desc"
- width="350">
+ width="375">
Shadows significantly improve visual quality but can reduce speed.
</text>
<text
@@ -307,7 +307,8 @@
left_delta="150"
top_delta="0"
name="ShadowDetail"
- width="150">
+ width="153">
+ <combo_box.drop_down_button pad_right="20" />
<combo_box.item
label="None"
name="0"
@@ -417,7 +418,7 @@
top_delta="3"
left_pad="10"
name="photo_dist_det_desc"
- width="180">
+ width="192">
(Enter value between 0.0 and 4.0)
</text>
<text
@@ -426,7 +427,7 @@
height="18"
layout="topleft"
top="80"
- left="213"
+ left="215"
name="0_lbl"
width="7">
0
@@ -446,7 +447,7 @@
font="SansSerifSmall"
height="18"
layout="topleft"
- left_pad="30"
+ left_pad="29"
name="2_lbl"
width="7">
2
@@ -468,7 +469,7 @@
layout="topleft"
left_pad="30"
name="4_lbl"
- width="7">
+ width="8">
4
</text>
<text
@@ -476,7 +477,7 @@
font="SansSerifSmall"
height="18"
layout="topleft"
- left_pad="30"
+ left_pad="29"
name="5_lbl"
width="7">
5
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index 86999b1afb..d9d362bbd4 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -13,18 +13,6 @@
name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left="33"
- name="Cache:"
- top_pad="10"
- width="100">
- Cache:
- </text>
<spinner
control_name="CacheSize"
decimal_digits="0"
@@ -33,14 +21,14 @@
increment="64"
initial_value="1024"
label="Cache size (896 - 32768MB)"
- label_width="150"
+ label_width="170"
layout="topleft"
- left="80"
+ left="33"
max_val="32768"
min_val="896"
top_pad="10"
name="cachesizespinner"
- width="210" />
+ width="230" />
<text
type="string"
length="1"
@@ -59,7 +47,7 @@
label="Clear Cache"
label_selected="Clear Cache"
layout="topleft"
- left_pad="20"
+ left_pad="25"
name="clear_cache"
top_delta="0"
width="100">
@@ -72,7 +60,7 @@
follows="left|top"
height="10"
layout="topleft"
- left="80"
+ left="33"
name="Cache location"
top_pad="5"
width="300">
@@ -86,7 +74,7 @@
font="SansSerif"
height="23"
layout="topleft"
- left="80"
+ left="33"
max_length_bytes="4096"
name="cache_location"
top_pad="5"
@@ -113,7 +101,7 @@
left_pad="3"
name="default_cache_location"
top_delta="0"
- width="100">
+ width="104">
<button.commit_callback
function="Pref.ResetCache" />
</button>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
index 08b3ef69b6..6d1b952639 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
@@ -110,7 +110,8 @@
left="255"
max_chars="135"
name="time_format_combobox"
- width="70">
+ width="71">
+ <combo_box.drop_down_button pad_right="22" />
<combo_box.item
enabled="true"
label="1:00 PM"
@@ -244,7 +245,7 @@
height="20"
layout="topleft"
left="35"
- top_pad="0"
+ top_pad="5"
name="Name_Tag_Preference">
<radio_item
label="Off"
@@ -304,7 +305,7 @@
name="display_names_check"
width="100"
tool_tip="Check to use display names in chat, IM, name tags, etc."
- top_pad="3"/>
+ top_pad="5"/>
<check_box
control_name="NameTagShowFriends"
enabled_control="AvatarNameTagMode"
@@ -319,7 +320,7 @@
layout="topleft"
control_name="GroupTitlesTagMode"
enabled_control="AvatarNameTagMode"
- left="39"
+ left="38"
top_pad="3"
name="group_title"
width="130">
@@ -344,7 +345,7 @@
layout="topleft"
left="30"
name="inworld_typing_rg_label"
- top_pad="4"
+ top_pad="5"
width="400">
Pressing letter keys:
</text>
@@ -353,7 +354,7 @@
height="34"
layout="topleft"
left="35"
- top_pad="0"
+ top_pad="5"
name="inworld_typing_preference">
<radio_item
label="Starts local chat"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index bf07ae4d68..0f44366947 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -104,7 +104,7 @@
layout="topleft"
left="65"
name="FasterText"
- top_pad="4"
+ top_pad="10"
width="80">
Faster
</text>
@@ -114,14 +114,14 @@
follows="left|top"
height="12"
layout="topleft"
- left_delta="360"
+ left_delta="363"
name="BetterText"
top_delta="0"
width="100">
Better
</text>
<icon
- color="DkGray"
+ color="DkGray0"
height="14"
image_name="Rounded_Square"
layout="topleft"
@@ -130,7 +130,7 @@
top_delta="-2"
width="2" />
<icon
- color="DkGray"
+ color="DkGray0"
height="14"
image_name="Rounded_Square"
layout="topleft"
@@ -138,7 +138,7 @@
name="LowMidGraphicsDivet"
width="2" />
<icon
- color="DkGray"
+ color="DkGray0"
height="14"
image_name="Rounded_Square"
layout="topleft"
@@ -147,7 +147,7 @@
top_delta="0"
width="2" />
<icon
- color="DkGray"
+ color="DkGray0"
height="14"
image_name="Rounded_Square"
layout="topleft"
@@ -156,7 +156,7 @@
top_delta="0"
width="2" />
<icon
- color="DkGray"
+ color="DkGray0"
height="14"
image_name="Rounded_Square"
layout="topleft"
@@ -165,7 +165,7 @@
top_delta="0"
width="2" />
<icon
- color="DkGray"
+ color="DkGray0"
height="14"
image_name="Rounded_Square"
layout="topleft"
@@ -174,7 +174,7 @@
top_delta="0"
width="2" />
<icon
- color="DkGray"
+ color="DkGray0"
height="14"
image_name="Rounded_Square"
layout="topleft"
@@ -216,15 +216,15 @@
min_val="64"
max_val="512"
name="DrawDistance"
- top_delta="40"
- width="427" />
+ top_delta="34"
+ width="428" />
<text
type="string"
length="1"
follows="left|top"
height="12"
layout="topleft"
- left_delta="427"
+ left_delta="425"
name="DrawDistanceMeterText2"
top_delta="0"
width="128">
@@ -286,7 +286,7 @@
initial_value="101"
increment="1"
label="Avatar maximum complexity:"
- label_width="165"
+ label_width="187"
layout="topleft"
left="30"
min_val="1"
@@ -294,7 +294,7 @@
name="IndirectMaxComplexity"
show_text="false"
top_delta="28"
- width="300">
+ width="394">
<slider.commit_callback
function="Pref.UpdateIndirectMaxComplexity"
parameter="IndirectMaxComlexityText" />
@@ -306,7 +306,7 @@
height="16"
layout="topleft"
top_delta="0"
- left_delta="304"
+ left_delta="398"
text_readonly_color="LabelDisabledColor"
name="IndirectMaxComplexityText"
width="65">
@@ -329,7 +329,7 @@
label_width="240"
left="30"
top_delta="20"
- width="393">
+ width="394">
<slider.commit_callback
function="Pref.UpdateIndirectMaxNonImpostors"
parameter="IndirectNonImpostorsText" />
@@ -341,7 +341,7 @@
height="16"
layout="topleft"
top_delta="0"
- left_delta="397"
+ left_delta="398"
text_readonly_color="LabelDisabledColor"
name="IndirectMaxNonImpostorsText"
width="65">
@@ -369,7 +369,7 @@
increment="0.1"
initial_value="160"
label="Brightness (exposure)"
- label_width="145"
+ label_width="187"
layout="topleft"
left="30"
min_val="0.5"
@@ -377,7 +377,7 @@
name="RenderExposure"
show_text="true"
top_pad="14"
- width="260">
+ width="424">
</slider>
<!-- End of Basic Settings block -->
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
index 1c00837073..8b60be30f9 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -10,6 +10,7 @@
top="1"
width="517">
+ <!-- remove "hide_tabs" param when Discord tab is actually used -->
<tab_container
top_pad="0"
enabled="true"
@@ -18,6 +19,7 @@
width="517"
left_delta="0"
name="privacy_tab_container"
+ hide_tabs="true"
tab_position="top"
tab_stop="false">
<panel
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
index 258c49785e..2036ed75ca 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -170,7 +170,7 @@
left="30"
name="Software updates:"
mouse_opaque="false"
- top_pad="5"
+ top_pad="8"
width="300">
Software updates:
</text>
@@ -180,7 +180,7 @@
height="23"
layout="topleft"
left_delta="50"
- top_pad="5"
+ top_pad="10"
name="updater_service_combobox"
width="300">
<combo_box.item
@@ -197,29 +197,29 @@
value="0" />
</combo_box>
<check_box
- top_delta="4"
+ top_pad="10"
enabled="true"
follows="left|top"
+ layout="topleft"
height="14"
control_name="UpdaterWillingToTest"
label="Willing to update to Beta"
left_delta="0"
mouse_opaque="true"
name="update_willing_to_test"
- width="400"
- top_pad="5"/>
+ width="400"/>
<check_box
- top_delta="4"
+ top_pad="8"
enabled="true"
follows="left|top"
+ layout="topleft"
height="14"
control_name="UpdaterShowReleaseNotes"
label="Show Release Notes after update"
left_delta="0"
mouse_opaque="true"
name="update_show_release_notes"
- width="400"
- top_pad="5"/>
+ width="400"/>
<text
type="string"
length="1"
@@ -229,7 +229,7 @@
left="30"
name="Proxy Settings:"
mouse_opaque="false"
- top_pad="5"
+ top_pad="8"
width="300">
Proxy Settings:
</text>
@@ -242,8 +242,7 @@
layout="topleft"
left_delta="50"
name="set_proxy"
- top_pad="5"
- >
+ top_pad="10" >
<button.commit_callback
function="Pref.Proxy" />
</button>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
index 52413abe74..1dcbf4e666 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -319,7 +319,7 @@
top_delta="25"
name="Listen media from"
height="15"
- width="165"
+ width="180"
halign="right">
Hear media and sounds from
</text>
@@ -327,7 +327,7 @@
control_name="MediaSoundsEarLocation"
follows="left|top"
layout="topleft"
- left_pad="5"
+ left_pad="10"
width="130"
height="23"
top_delta="-4"
@@ -346,7 +346,7 @@
layout="topleft"
height="15"
left="23"
- width="165"
+ width="180"
name="media_autoplay_label"
halign="right">
Auto-play media
@@ -357,7 +357,7 @@
follows="left|top"
layout="topleft"
height="23"
- left_delta="170"
+ left_delta="190"
top_delta="-4"
name="media_auto_play_combo"
width="130">
@@ -379,7 +379,7 @@
layout="topleft"
height="15"
left="23"
- width="165"
+ width="180"
name="media_firstinteract_label"
halign="right">
Media first-interact
@@ -390,11 +390,12 @@
follows="left|top"
layout="topleft"
height="23"
- left_delta="170"
+ left_delta="190"
top_delta="-4"
width="130"
name="media_first_interact_combo"
tool_tip="This setting controls which media (once loaded) does not require a first click to focus before interaction can begin. This allows clicks to be passed directly to media bypassing the focus click requirement. Each option also inherits the previous ones.">
+ <combo_box.drop_down_button pad_right="19" />
<item
label="Disabled"
name="media_first_click_none"
@@ -457,7 +458,7 @@
layout="topleft"
follows="left"
height="15"
- width="165"
+ width="187"
name="noise_suppression_label"
left="23"
top_delta="22"
@@ -469,7 +470,7 @@
enabled_control="EnableVoiceChat"
follows="left|top"
layout="topleft"
- left_delta="170"
+ left_delta="190"
top_delta="-6"
width="130"
height="23"
@@ -503,7 +504,7 @@
left="23"
top_delta="30"
name="Listen from"
- width="165"
+ width="180"
height="15"
halign="right">
Hear voice from
@@ -513,7 +514,7 @@
control_name="VoiceEarLocation"
follows="left|top"
layout="topleft"
- left_delta="170"
+ left_delta="190"
top_delta="-6"
width="130"
height="23"
@@ -545,7 +546,7 @@
tool_tip="Check to enable voice echo cancellation"
label="Echo Cancellation"
layout="topleft"
- left="260"
+ left="275"
name="enable_echo_cancellation"
top_pad="-15"
width="200"/>
@@ -558,7 +559,7 @@
layout="topleft"
left="20"
name="push_to_talk_toggle_check"
- width="237"
+ width="245"
tool_tip="When in toggle mode, press and release the trigger key ONCE to switch your microphone on or off. When not in toggle mode, the microphone broadcasts your voice only while the trigger is being held down."
top_pad="5"/>
<check_box
@@ -569,7 +570,7 @@
label="Automatic Gain Control"
layout="topleft"
name="voice_automatic_gain_control"
- left="260"
+ left="275"
top_pad="-15"
width="200"/>
<check_box
@@ -591,7 +592,7 @@
label="Show voice dot above avatars"
layout="topleft"
name="voice_dot_visualizer"
- left="260"
+ left="275"
top_pad="-15"
width="200"/>
<button
@@ -603,7 +604,7 @@
label="Voice Input/Output devices"
layout="topleft"
left="20"
- top_pad="0"
+ top_pad="1"
name="device_settings_btn"
width="200">
</button>
diff --git a/indra/newview/skins/default/xui/en/panel_region_experiences.xml b/indra/newview/skins/default/xui/en/panel_region_experiences.xml
index 199dca4853..5e9ebabba7 100644
--- a/indra/newview/skins/default/xui/en/panel_region_experiences.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_experiences.xml
@@ -13,7 +13,6 @@
<panel.string
name="trusted_estate_text">
Any Experience may be Key.
-
Key Experiences have permission to run on this estate.
Additionally, if the estate does not allow public access, Residents participating in any Key Experience may enter the estate and can remain as long as they are in a Key Experience.
diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml
index 47e1e669d1..4e624276cc 100644
--- a/indra/newview/skins/default/xui/en/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_general.xml
@@ -67,12 +67,12 @@
</text>
<text
follows="left|top"
- font="SansSerif"
+ font="SansSerifSmall"
height="20"
layout="topleft"
- left_delta="50"
+ left_delta="53"
name="version_channel_text"
- top_delta="0"
+ top_delta="1"
width="400">
unknown
</text>
@@ -81,7 +81,7 @@
font="SansSerif"
height="20"
layout="topleft"
- top_delta="0"
+ top_delta="-1"
right="-100"
name="grid_position_lbl"
width="80">
diff --git a/indra/newview/skins/default/xui/en/panel_region_terrain.xml b/indra/newview/skins/default/xui/en/panel_region_terrain.xml
index 73e0a1000f..dd9907dc1f 100644
--- a/indra/newview/skins/default/xui/en/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_terrain.xml
@@ -42,7 +42,7 @@
max_val="100"
name="water_height_spin"
top="40"
- width="180" />
+ width="190" />
<spinner
follows="left|top"
height="20"
@@ -54,7 +54,7 @@
max_val="100"
name="terrain_raise_spin"
top="40"
- width="180" />
+ width="190" />
<spinner
follows="left|top"
height="20"
@@ -67,7 +67,7 @@
min_val="-100"
name="terrain_lower_spin"
top="60"
- width="180" />
+ width="190" />
<view_border
bevel_style="none"
follows="top|left"
@@ -330,7 +330,7 @@
follows="left|top"
height="20"
layout="topleft"
- left_pad="10"
+ left_pad="15"
name="height_text_lbl7"
top_delta="0"
width="100">
@@ -349,7 +349,7 @@
min_val="-500"
name="height_start_spin_1"
top_delta="15"
- width="100" />
+ width="105" />
<!-- northeast low-->
<spinner
follows="left|top"
@@ -363,7 +363,7 @@
min_val="-500"
name="height_start_spin_3"
top_delta="0"
- width="100" />
+ width="105" />
<!-- northwest high-->
<spinner
follows="left|top"
@@ -377,7 +377,7 @@
min_val="-500"
name="height_range_spin_1"
top_delta="20"
- width="100" />
+ width="105" />
<!-- northeast high-->
<spinner
follows="left|top"
@@ -391,7 +391,7 @@
min_val="-500"
name="height_range_spin_3"
top_delta="0"
- width="100" />
+ width="105" />
<text
follows="left|top"
height="20"
@@ -406,7 +406,7 @@
follows="left|top"
height="20"
layout="topleft"
- left_pad="10"
+ left_pad="15"
name="height_text_lbl9"
top_delta="0"
width="100">
@@ -425,7 +425,7 @@
min_val="-500"
name="height_start_spin_0"
top_delta="15"
- width="100" />
+ width="105" />
<!-- southeast low-->
<spinner
follows="left|top"
@@ -439,7 +439,7 @@
min_val="-500"
name="height_start_spin_2"
top_delta="0"
- width="100" />
+ width="105" />
<!--southwest high-->
<spinner
follows="left|top"
@@ -453,7 +453,7 @@
min_val="-500"
name="height_range_spin_0"
top_delta="20"
- width="100" />
+ width="105" />
<!-- southeast high-->
<spinner
follows="left|top"
@@ -467,7 +467,7 @@
min_val="-500"
name="height_range_spin_2"
top_delta="0"
- width="100" />
+ width="105" />
<!-- Terrain Download/Upload/Bake buttons -->
<button
follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml b/indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml
index a29cdb5b41..c03d6a9745 100644
--- a/indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml
+++ b/indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml
@@ -35,7 +35,7 @@
layout="topleft"
left_delta="15"
top_pad="15"
- width="80">
+ width="86">
Ambient Color:
</text>
<color_swatch
@@ -53,9 +53,9 @@
follows="left"
height="10"
layout="topleft"
- left_delta="90"
+ left_delta="110"
top_delta="-15"
- width="80">
+ width="86">
Blue Horizon:
</text>
<color_swatch
@@ -73,9 +73,9 @@
follows="left"
height="10"
layout="topleft"
- left_delta="90"
+ left_delta="110"
top_delta="-15"
- width="80">
+ width="86">
Blue Density:
</text>
<color_swatch
@@ -166,7 +166,7 @@
layout="topleft"
left_delta="-5"
top_delta="25"
- width="80">
+ width="90">
Moisture Level:
</text>
<slider
@@ -190,7 +190,7 @@
layout="topleft"
left_delta="-5"
top_delta="25"
- width="80">
+ width="90">
Droplet Radius:
</text>
<slider
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index 16111758cc..2d3a8618ed 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -91,7 +91,7 @@
left="0"
name="balance"
tool_tip="L$ [AMT]&#10;Click to refresh your L$ balance.&#10;Double-click to display or hide your L$ balance."
- v_pad="4"
+ v_pad="2"
top="0"
wrap="false"
value="L$??"
@@ -102,7 +102,7 @@
follows="right|top|bottom"
image_hover_unselected="PushButton_Over"
image_unselected="PushButton_Off"
- image_pressed="PushButton_Press"
+ image_pressed="PushButton_Selected"
height="18"
label="Buy L$"
label_color="White"
@@ -122,7 +122,7 @@
image_overlay_alignment="left"
image_hover_unselected="PushButton_Over"
image_unselected="PushButton_Off"
- image_pressed="PushButton_Press"
+ image_pressed="PushButton_Selected"
height="18"
label="Shop"
label_color="White"
@@ -140,7 +140,7 @@
follows="right|top"
halign="right"
height="16"
- top="5"
+ top="3"
layout="topleft"
left_pad="0"
name="TimeText"
diff --git a/indra/newview/skins/default/xui/en/panel_tools_texture.xml b/indra/newview/skins/default/xui/en/panel_tools_texture.xml
index 1c70383bf9..5ff02de6f6 100644
--- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml
+++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml
@@ -51,7 +51,9 @@
name="color label"
text_readonly_color="LabelDisabledColor"
top="6"
- width="64">
+ width="64"
+ font="DejaVu"
+ font.size="LSmall" >
Color
</text>
<!-- label is blank because control places it below the box -->
@@ -77,7 +79,9 @@
name="color trans"
text_readonly_color="LabelDisabledColor"
top="6"
- width="110">
+ width="110"
+ font="DejaVu"
+ font.size="LSmall" >
Transparency %
</text>
<spinner
@@ -91,7 +95,9 @@
max_val="100"
name="ColorTrans"
top_pad="4"
- width="80" />
+ width="80"
+ font="DejaVu"
+ font.size="LSmall" />
<text
type="string"
length="1"
@@ -102,7 +108,9 @@
name="glow label"
text_readonly_color="LabelDisabledColor"
top="6"
- width="80">
+ width="80"
+ font="DejaVu"
+ font.size="LSmall" >
Glow
</text>
<spinner
@@ -114,7 +122,9 @@
left_delta="0"
name="glow"
top_pad="4"
- width="77" />
+ width="77"
+ font="DejaVu"
+ font.size="LSmall" />
<check_box
height="19"
label="Full Bright"
@@ -122,7 +132,9 @@
left="7"
name="checkbox fullbright"
top_pad="4"
- width="81" />
+ width="81"
+ font="DejaVu"
+ font.size="LSmall" />
<check_box
height="19"
label="Hide water"
@@ -130,7 +142,9 @@
left="172"
top_delta="0"
name="checkbox_hide_water"
- width="81" />
+ width="81"
+ font="DejaVu"
+ font.size="LSmall" />
<view_border
bevel_style="none"
follows="top|left"
@@ -139,7 +153,9 @@
left="8"
name="object_horizontal"
top_pad="4"
- width="278" />
+ width="278"
+ font="DejaVu"
+ font.size="LSmall" />
<text
type="string"
length="1"
@@ -149,7 +165,9 @@
left="12"
top_pad="12"
name="label_matmedia"
- width="90">
+ width="90"
+ font="DejaVu"
+ font.size="LSmall" >
Material
</text>
<combo_box
@@ -158,7 +176,9 @@
left="10"
name="combobox matmedia"
top_pad="5"
- width="90">
+ width="90"
+ drop_down_button.font="DejaVu"
+ drop_down_button.font.size="LSmall" >
<combo_box.item
label="Textures"
name="Materials"
@@ -179,7 +199,9 @@
top_delta="-20"
width="150"
visible = "false"
- name="radio_material_type">
+ name="radio_material_type"
+ font="DejaVu"
+ font.size="LSmall" >
<radio_item
label="Texture (diffuse)"
name="Texture (diffuse)"
@@ -209,7 +231,9 @@
top_delta="0"
width="150"
visible = "false"
- name="radio_pbr_type">
+ name="radio_pbr_type"
+ font="DejaVu"
+ font.size="LSmall" >
<radio_item
label="Complete material"
name="Complete material"
@@ -270,7 +294,9 @@
name="checkbox_sync_settings"
tool_tip="Adjust all maps repeats simultaneously"
top_pad="19"
- width="160" />
+ width="160"
+ font="DejaVu"
+ font.size="LSmall" />
<texture_picker
can_apply_immediately="true"
allow_no_texture="true"
@@ -282,7 +308,9 @@
name="pbr_control"
tool_tip="Click to choose a pbr material"
top_pad="5"
- width="64" />
+ width="64"
+ caption_text.font="DejaVu"
+ caption_text.font.size="LSmall" />
<button
follows="left|top"
height="23"
@@ -291,7 +319,9 @@
top_delta="0"
name="pbr_from_inventory"
label="Choose from inventory"
- width="140"/>
+ width="140"
+ font="DejaVu"
+ font.size="LSmall" />
<text
visible="false"
type="string"
@@ -303,7 +333,9 @@
left_delta="0"
name="material_permissions_loading_label"
text_readonly_color="LabelDisabledColor"
- width="160">
+ width="160"
+ font="DejaVu"
+ font.size="LSmall" >
Loading contents...
</text>
<button
@@ -314,7 +346,9 @@
top_delta="0"
name="edit_selected_pbr"
label="Edit Selected"
- width="140"/>
+ width="140"
+ font="DejaVu"
+ font.size="LSmall" />
<button
follows="left|top"
height="23"
@@ -323,7 +357,9 @@
top_pad="4"
name="save_selected_pbr"
label="Save to inventory"
- width="140"/>
+ width="140"
+ font="DejaVu"
+ font.size="LSmall" />
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -336,7 +372,9 @@
name="texture control"
tool_tip="Click to choose a picture"
top_delta="-54"
- width="64" />
+ width="64"
+ caption_text.font="DejaVu"
+ caption_text.font.size="LSmall" />
<text
type="string"
length="1"
@@ -347,7 +385,9 @@
name="label alphamode"
text_readonly_color="LabelDisabledColor"
top_delta="0"
- width="90">
+ width="90"
+ font="DejaVu"
+ font.size="LSmall" >
Alpha mode
</text>
<combo_box
@@ -356,7 +396,9 @@
left_delta="0"
name="combobox alphamode"
top_pad="4"
- width="120">
+ width="120"
+ drop_down_button.font="DejaVu"
+ drop_down_button.font.size="LSmall">
<combo_box.item
label="None"
name="None"
@@ -384,7 +426,9 @@
name="label maskcutoff"
text_readonly_color="LabelDisabledColor"
top_pad="4"
- width="90">
+ width="90"
+ font="DejaVu"
+ font.size="LSmall" >
Mask cutoff
</text>
<spinner
@@ -399,7 +443,9 @@
left_delta="0"
increment="1"
name="maskcutoff"
- width="80" />
+ width="80"
+ font="DejaVu"
+ font.size="LSmall" />
<texture_picker
allow_no_texture="true"
can_apply_immediately="true"
@@ -413,7 +459,9 @@
name="bumpytexture control"
tool_tip="Click to choose a picture"
top_delta="-55"
- width="64" />
+ width="64"
+ caption_text.font="DejaVu"
+ caption_text.font.size="LSmall" />
<text
type="string"
length="1"
@@ -424,7 +472,9 @@
name="label bumpiness"
text_readonly_color="LabelDisabledColor"
top_delta="0"
- width="90">
+ width="90"
+ font="DejaVu"
+ font.size="LSmall" >
Bumpiness
</text>
<combo_box
@@ -433,7 +483,9 @@
left_delta="0"
name="combobox bumpiness"
top_pad="4"
- width="90">
+ width="90"
+ drop_down_button.font="DejaVu"
+ drop_down_button.font.size="LSmall" >
<combo_box.item
label="None"
name="None"
@@ -527,7 +579,9 @@
name="shinytexture control"
tool_tip="Click to choose a picture"
top_delta="-14"
- width="64" />
+ width="64"
+ caption_text.font="DejaVu"
+ caption_text.font.size="LSmall" />
<text
type="string"
length="1"
@@ -538,7 +592,9 @@
left_pad="10"
text_readonly_color="LabelDisabledColor"
top_delta="4"
- width="90">
+ width="90"
+ font="DejaVu"
+ font.size="LSmall" >
Shininess
</text>
<combo_box
@@ -547,7 +603,9 @@
left_pad="10"
name="combobox shininess"
top_delta="-6"
- width="90">
+ width="90"
+ drop_down_button.font="DejaVu"
+ drop_down_button.font.size="LSmall" >
<combo_box.item
label="None"
name="None"
@@ -582,7 +640,9 @@
name="label glossiness"
text_readonly_color="LabelDisabledColor"
top_pad="7"
- width="116">
+ width="116"
+ font="DejaVu"
+ font.size="LSmall" >
Glossiness
</text>
<spinner
@@ -597,7 +657,9 @@
top_delta="-4"
left_pad="10"
name="glossiness"
- width="64" />
+ width="64"
+ font="DejaVu"
+ font.size="LSmall" />
<text
type="string"
length="1"
@@ -608,7 +670,9 @@
name="label environment"
text_readonly_color="LabelDisabledColor"
top_pad="8"
- width="116">
+ width="116"
+ font="DejaVu"
+ font.size="LSmall" >
Environment
</text>
<spinner
@@ -623,7 +687,9 @@
top_delta="-4"
left_pad="10"
name="environment"
- width="64" />
+ width="64"
+ font="DejaVu"
+ font.size="LSmall" />
<text
type="string"
length="1"
@@ -634,7 +700,9 @@
name="label shinycolor"
text_readonly_color="LabelDisabledColor"
top_pad="8"
- width="116">
+ width="116"
+ font="DejaVu"
+ font.size="LSmall" >
Color
</text>
<!-- label is blank because control places it below the box -->
@@ -658,7 +726,9 @@
use_ellipses="true"
read_only="true"
name="media_info"
- width="280">
+ width="280"
+ font="DejaVu"
+ font.size="LSmall" >
URL of chosen media, if any, goes here
</text>
<button
@@ -670,7 +740,9 @@
top_pad="4"
tool_tip="Add Media"
label="Choose..."
- width="85"/>
+ width="85"
+ font="DejaVu"
+ font.size="LSmall" />
<button
follows="top|left"
height="18"
@@ -680,7 +752,9 @@
tool_tip="Delete this media texture"
top_delta="0"
label="Remove"
- width="85"/>
+ width="85"
+ font="DejaVu"
+ font.size="LSmall" />
<button
follows="left|top"
height="18"
@@ -691,7 +765,9 @@
name="button align"
top_delta="0"
tool_tip="Align media texture (must load first)"
- width="85" />
+ width="85"
+ font="DejaVu"
+ font.size="LSmall" />
<text
type="string"
length="1"
@@ -702,7 +778,9 @@
name="tex gen"
text_readonly_color="LabelDisabledColor"
top_pad="46"
- width="140">
+ width="140"
+ font="DejaVu"
+ font.size="LSmall" >
Mapping
</text>
<combo_box
@@ -711,7 +789,9 @@
left_pad="0"
name="combobox texgen"
top_pad="-13"
- width="125">
+ width="125"
+ drop_down_button.font="DejaVu"
+ drop_down_button.font.size="LSmall" >
<combo_box.item
label="Default"
name="Default"
@@ -733,7 +813,9 @@
max_val="10000"
name="TexScaleU"
top_pad="5"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -745,7 +827,9 @@
min_val="-10000"
max_val="10000"
name="TexScaleV"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
decimal_digits="1"
follows="left|top"
@@ -758,7 +842,9 @@
max_val="100"
min_val="-100"
name="rptctrl"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
decimal_digits="2"
follows="left|top"
@@ -772,7 +858,9 @@
max_val="360"
min_val="-360"
name="TexRot"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -784,7 +872,9 @@
min_val="-1"
max_val="1"
name="TexOffsetU"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -796,7 +886,9 @@
min_val="-1"
max_val="1"
name="TexOffsetV"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -809,7 +901,9 @@
max_val="10000"
name="bumpyScaleU"
top_delta="-115"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -821,7 +915,9 @@
min_val="-10000"
max_val="10000"
name="bumpyScaleV"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
decimal_digits="2"
follows="left|top"
@@ -836,7 +932,9 @@
max_val="360"
min_val="-360"
name="bumpyRot"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -848,7 +946,9 @@
min_val="-1"
max_val="1"
name="bumpyOffsetU"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -860,7 +960,9 @@
min_val="-1"
max_val="1"
name="bumpyOffsetV"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -873,7 +975,9 @@
max_val="10000"
name="shinyScaleU"
top_delta="-115"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -885,7 +989,9 @@
min_val="-10000"
max_val="10000"
name="shinyScaleV"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
decimal_digits="2"
follows="left|top"
@@ -900,7 +1006,9 @@
max_val="360"
min_val="-360"
name="shinyRot"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -912,7 +1020,9 @@
min_val="-1"
max_val="1"
name="shinyOffsetU"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -924,7 +1034,9 @@
min_val="-1"
max_val="1"
name="shinyOffsetV"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<check_box
follows="top|left"
height="16"
@@ -935,7 +1047,9 @@
name="checkbox planar align"
tool_tip="Align textures on all selected faces with the last selected face. Requires Planar texture mapping."
top_delta="20"
- width="260" />
+ width="260"
+ font="DejaVu"
+ font.size="LSmall" />
<button
follows="left|top"
layout="topleft"
@@ -946,7 +1060,9 @@
label_selected="Align current texture layers"
name="button align textures"
tool_tip="Align current texture layers"
- width="66" />
+ width="66"
+ font="DejaVu"
+ font.size="LSmall" />
<web_browser
visible="false"
enabled="false"
@@ -972,7 +1088,9 @@
max_val="10000"
name="gltfTextureScaleU"
top_delta="34"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -984,7 +1102,9 @@
min_val="-10000"
max_val="10000"
name="gltfTextureScaleV"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
decimal_digits="1"
follows="left|top"
@@ -997,7 +1117,9 @@
max_val="100"
min_val="-100"
name="gltfRptctrl"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -1009,7 +1131,9 @@
min_val="-360"
max_val="360"
name="gltfTextureRotation"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -1021,7 +1145,9 @@
min_val="-999"
max_val="999"
name="gltfTextureOffsetU"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<spinner
follows="left|top"
height="19"
@@ -1033,6 +1159,8 @@
min_val="-999"
max_val="999"
name="gltfTextureOffsetV"
- width="265" />
+ width="265"
+ font="DejaVu"
+ font.size="LSmall" />
<!-- END PBR Material texture transform parameters -->
</panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
index a16b0b58da..bc0350c446 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -29,7 +29,7 @@ width="333">
background_visible="true"
bg_opaque_color="DkGray2"
left="10"
- top="5"
+ top="0"
follows="left|top|right"
layout="topleft"
width="307"
@@ -50,25 +50,15 @@ width="333">
layout="topleft"
name="openoutfit_btn"
visible="false" />
- <icon
- follows="top|left"
- height="31"
- image_name="Shirt_Large"
- name="outfit_icon"
- mouse_opaque="false"
- visible="true"
- left="1"
- top="0"
- width="31" />
<text
- font="SansSerifSmall"
+ font="SansSerifSmallBold"
text_color="EmphasisColor"
width="300"
height="13"
follows="top|left|right"
layout="topleft"
- left="35"
- top="3"
+ left="5"
+ top="0"
mouse_opaque="false"
name="currentlook_status" >
(Status)
@@ -76,7 +66,7 @@ width="333">
<text
font="SansSerifLargeBold"
height="20"
- left="35"
+ left="5"
parse_urls="false"
text_color="White"
top="15"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
index de47e05291..3fc22d69ca 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -69,7 +69,6 @@
<button
control_name="InventoryInboxToggleState"
label="Received items"
- font="SansSerifMedium"
name="inbox_btn"
height="35"
image_unselected="MarketplaceBtn_Off"
@@ -92,7 +91,6 @@
top="10"
right="-20"
name="inbox_fresh_new_count"
- font="SansSerifMedium"
halign="right"
top_pad="0">
[NUM] new
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index e022f29b76..b8e71928dc 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -116,6 +116,8 @@ Voice Server Version: [VOICE_VERSION]
<string name="AgniGridLabel">Second Life Main Grid (Agni)</string>
<string name="AditiGridLabel">Second Life Beta Test Grid (Aditi)</string>
+ <string name="AgniGridLabelShort">Agni (production)</string>
+ <string name="AditiGridLabelShort">Aditi (beta)</string>
<string name="ViewerDownloadURL">http://secondlife.com/download</string>
<string name="LoginFailedViewerNotPermitted">
@@ -3008,6 +3010,9 @@ If this message persists, restart your computer.
[APP_NAME] appears to have frozen or crashed on the previous run.
Would you like to send a crash report?
</string>
+ <string name="MBFreezeDetected">
+ [APP_NAME] appears to have frozen. If this issue occurs regularly, please contact support at https://support.secondlife.com.
+ </string>
<string name="MBAlert">Notification</string>
<string name="MBNoDirectX">
[APP_NAME] is unable to detect DirectX 9.0b or greater.
diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml
index 090447a6a2..c7669e81af 100644
--- a/indra/newview/skins/default/xui/en/widgets/button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/button.xml
@@ -11,7 +11,7 @@
image_top_pad="0"
image_bottom_pad="0"
imgoverlay_label_space="1"
- label_color="ButtonLabelColor"
+ label_color="White"
label_color_selected="ButtonLabelSelectedColor"
label_color_disabled="ButtonLabelDisabledColor"
label_color_disabled_selected="ButtonLabelSelectedDisabledColor"
@@ -21,9 +21,10 @@
font="SansSerifSmall"
hover_glow_amount="0.15"
halign="center"
- pad_bottom="1"
+ pad_bottom="2"
height="23"
scale_image="true"
+ label_shadow="false"
handle_right_mouse="true"
use_draw_context_alpha="true"
held_down_delay.seconds="0.5"
diff --git a/indra/newview/skins/default/xui/en/widgets/conversation_view_participant.xml b/indra/newview/skins/default/xui/en/widgets/conversation_view_participant.xml
index cf995e5833..ebe2fa07e2 100644
--- a/indra/newview/skins/default/xui/en/widgets/conversation_view_participant.xml
+++ b/indra/newview/skins/default/xui/en/widgets/conversation_view_participant.xml
@@ -9,7 +9,7 @@
left_pad="0"
icon_pad="10"
icon_width="20"
- text_pad="7"
+ text_pad="5"
text_pad_right="4"
arrow_size="12"
max_folder_item_overlap="2"
diff --git a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
index 604f62b099..3a0f43de3d 100644
--- a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
@@ -7,10 +7,10 @@
select_on_focus="true"
text_tentative_color="TextFgTentativeColor"
highlight_text_field="true"
- background_image="TextField_Search_Off"
- background_image_disabled="TextField_Search_Disabled"
- background_image_focused="TextField_Search_Active"
- background_image_highlight="TextField_Search_Highlight">
+ background_image="TextField_Off"
+ background_image_disabled="TextField_Disabled"
+ background_image_focused="TextField_Active"
+ background_image_highlight="TextField_Highlight">
<search_button label=""
top_pad="4"
left_pad="4"
diff --git a/indra/newview/skins/default/xui/en/widgets/floater.xml b/indra/newview/skins/default/xui/en/widgets/floater.xml
index 11758556d6..73c6dc5d7a 100644
--- a/indra/newview/skins/default/xui/en/widgets/floater.xml
+++ b/indra/newview/skins/default/xui/en/widgets/floater.xml
@@ -9,7 +9,9 @@
bg_alpha_image="Window_Background"
background_visible="true"
background_opaque="false"
+ header_font="SansSerif"
header_height="25"
+ header_vpad="5"
close_image="Icon_Close_Foreground"
restore_image="Icon_Restore_Foreground"
minimize_image="Icon_Minimize_Foreground"
diff --git a/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml b/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml
index 50c5285e04..671cb37ca3 100644
--- a/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml
+++ b/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml
@@ -3,16 +3,21 @@
folder_arrow_image="Folder_Arrow"
favorite_image="Inv_Favorite_Star_Full"
favorite_content_image="Inv_Favorite_Star_Content"
- folder_indentation="8"
- item_height="20"
+ folder_indentation="10"
+ item_height="21"
item_top_pad="4"
selection_image="Rounded_Square"
mouse_opaque="true"
follows="left|top|right"
left_pad="5"
- icon_pad="2"
+ icon_pad="4"
icon_width="16"
- text_pad="1"
+ text_pad="5"
text_pad_right="4"
+ text_pad_top="0"
arrow_size="12"
max_folder_item_overlap="2"/>
+
+<!-- Potential properties not included above:
+ arrow_pad_top
+-->
diff --git a/indra/newview/skins/default/xui/en/widgets/gesture_combo_list.xml b/indra/newview/skins/default/xui/en/widgets/gesture_combo_list.xml
index 14cd3e159c..499152f060 100644
--- a/indra/newview/skins/default/xui/en/widgets/gesture_combo_list.xml
+++ b/indra/newview/skins/default/xui/en/widgets/gesture_combo_list.xml
@@ -10,7 +10,7 @@
mouse_opaque="false"
scale_image="true"
image_selected="PushButton_Selected_Press"
- image_pressed="PushButton_Press"
+ image_pressed="PushButton_Selected"
image_pressed_selected="PushButton_Selected_Press"
image_unselected="PushButton_Off"
image_disabled="PushButton_Disabled"
diff --git a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml
index 865c145022..41ef9d2b8a 100644
--- a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml
+++ b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml
@@ -6,7 +6,7 @@
folder_indentation="8"
item_height="20"
item_top_pad="4"
- selection_image="Rounded_Square"
+ selection_image="Square_Selection"
left_pad="5"
icon_pad="2"
icon_width="16"
diff --git a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_item.xml b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_item.xml
index 09cbb1d3ab..ad4249da4e 100644
--- a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_item.xml
+++ b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_item.xml
@@ -2,7 +2,7 @@
<inbox_folder_view_item
item_height="20"
item_top_pad="4"
- selection_image="Rounded_Square"
+ selection_image="Square_Selection"
>
<new_badge
label="New"
diff --git a/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml b/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml
index ce36a39a21..b00b8a241b 100644
--- a/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml
+++ b/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml
@@ -17,7 +17,7 @@
<worn_style
font="SansSerifSmall"
font.style="BOLD"
- color="EmphasisColor" />
+ color="WornOutfitTextColor" />
<item_icon
height="16"
follows="top|left"
diff --git a/indra/newview/skins/default/xui/en/widgets/line_editor.xml b/indra/newview/skins/default/xui/en/widgets/line_editor.xml
index ae642e1da5..cf6dc0a8c0 100644
--- a/indra/newview/skins/default/xui/en/widgets/line_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/line_editor.xml
@@ -11,7 +11,7 @@
text_pad_left="2"
text_readonly_color="TextFgReadOnlyColor"
text_tentative_color="TextFgTentativeColor"
- highlight_color="EmphasisColor"
+ highlight_color="SelectionColor"
preedit_bg_color="White"
mouse_opaque="true"
name="line_editor"
diff --git a/indra/newview/skins/default/xui/en/widgets/panel_camera_item.xml b/indra/newview/skins/default/xui/en/widgets/panel_camera_item.xml
index ea49b750d1..6824080b49 100644
--- a/indra/newview/skins/default/xui/en/widgets/panel_camera_item.xml
+++ b/indra/newview/skins/default/xui/en/widgets/panel_camera_item.xml
@@ -55,7 +55,6 @@
width="30" />
<panel_camera_item.text
follows="top|left|right"
- font="SansSerifMedium"
height="15"
layout="topleft"
left ="38"
diff --git a/indra/newview/skins/default/xui/en/widgets/search_editor.xml b/indra/newview/skins/default/xui/en/widgets/search_editor.xml
index 51144c92b6..8294b96799 100644
--- a/indra/newview/skins/default/xui/en/widgets/search_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/search_editor.xml
@@ -8,10 +8,10 @@
select_on_focus="true"
text_tentative_color="TextFgTentativeColor"
highlight_text_field="true"
- background_image="TextField_Search_Off"
- background_image_disabled="TextField_Search_Disabled"
- background_image_focused="TextField_Search_Active"
- background_image_highlight="TextField_Search_Highlight">
+ background_image="TextField_Off"
+ background_image_disabled="TextField_Disabled"
+ background_image_focused="TextField_Active"
+ background_image_highlight="TextField_Highlight">
<search_button
top_pad="4"
left_pad="4"
diff --git a/indra/newview/skins/default/xui/en/widgets/simple_text_editor.xml b/indra/newview/skins/default/xui/en/widgets/simple_text_editor.xml
index b99010e17a..041470d0d2 100644
--- a/indra/newview/skins/default/xui/en/widgets/simple_text_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/simple_text_editor.xml
@@ -15,12 +15,12 @@
default_color="TextDefaultColor"
text_color="TextFgColor"
text_readonly_color="TextFgReadOnlyColor"
- text_selected_color="White"
+ text_selected_color="Black"
h_pad="6"
v_pad="4"
bg_visible="true"
bg_readonly_color="TextBgReadOnlyColor"
bg_writeable_color="TextBgWriteableColor"
- bg_selected_color="EmphasisColor"
+ bg_selected_color="SelectionColor"
bg_focus_color="TextBgFocusColor">
</simple_text_editor>
diff --git a/indra/newview/skins/default/xui/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
index 22955fe73d..63613d34cb 100644
--- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml
+++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
@@ -6,10 +6,11 @@ label_pad_left - padding to the left of tab button labels
<tab_container name="tab_container"
mouse_opaque="false"
tab_min_width="60"
- tab_max_width="150"
+ tab_max_width="160"
use_custom_icon_ctrl="false"
halign="center"
- font="SansSerifSmall"
+ font="SansSerif"
+ font.size="Small"
tab_height="21"
label_pad_bottom="1"
label_pad_left="4">
@@ -19,22 +20,22 @@ label_pad_left - padding to the left of tab button labels
tab_left_image_flash
tab_top_image_flash
-->
- <first_tab tab_top_image_unselected="TabTop_Left_Off"
- tab_top_image_selected="TabTop_Left_Selected"
+ <first_tab tab_top_image_unselected="TabTop_First_Flat_Off"
+ tab_top_image_selected="TabTop_First_Flat_Selected"
tab_bottom_image_unselected="Toolbar_Left_Off"
tab_bottom_image_selected="Toolbar_Left_Selected"
- tab_left_image_unselected="SegmentedBtn_Left_Disabled"
- tab_left_image_selected="SegmentedBtn_Left_Selected_Over"/>
- <middle_tab tab_top_image_unselected="TabTop_Middle_Off"
- tab_top_image_selected="TabTop_Middle_Selected"
+ tab_left_image_unselected="TabLeft_Flat_Off"
+ tab_left_image_selected="TabLeft_Flat_Selected"/>
+ <middle_tab tab_top_image_unselected="TabTop_Middle_Flat_Off"
+ tab_top_image_selected="TabTop_Middle_Flat_Selected"
tab_bottom_image_unselected="Toolbar_Middle_Off"
tab_bottom_image_selected="Toolbar_Middle_Selected"
- tab_left_image_unselected="SegmentedBtn_Left_Disabled"
- tab_left_image_selected="SegmentedBtn_Left_Selected_Over"/>
- <last_tab tab_top_image_unselected="TabTop_Right_Off"
- tab_top_image_selected="TabTop_Right_Selected"
+ tab_left_image_unselected="TabLeft_Flat_Off"
+ tab_left_image_selected="TabLeft_Flat_Selected"/>
+ <last_tab tab_top_image_unselected="TabTop_Last_Flat_Off"
+ tab_top_image_selected="TabTop_Last_Flat_Selected"
tab_bottom_image_unselected="Toolbar_Right_Off"
tab_bottom_image_selected="Toolbar_Right_Selected"
- tab_left_image_unselected="SegmentedBtn_Left_Disabled"
- tab_left_image_selected="SegmentedBtn_Left_Selected_Over"/>
+ tab_left_image_unselected="TabLeft_Flat_Off"
+ tab_left_image_selected="TabLeft_Flat_Selected"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/en/widgets/toolbar.xml b/indra/newview/skins/default/xui/en/widgets/toolbar.xml
index 8345911525..a038fe5181 100644
--- a/indra/newview/skins/default/xui/en/widgets/toolbar.xml
+++ b/indra/newview/skins/default/xui/en/widgets/toolbar.xml
@@ -15,16 +15,17 @@
<button_icon_and_text imgoverlay_label_space="7"
label_color_selected="White"
halign="left"
- image_pressed="PushButton_Press"
+ image_pressed="PushButton_Selected"
image_pressed_selected="PushButton_Selected_Press"
image_selected="PushButton_Selected_Press"
image_disabled_selected="PushButton_Selected_Disabled"
image_disabled="PushButton_Disabled"
button_width.min="70"
- button_width.max="140"
+ button_width.max="172"
desired_height="24"
pad_left="10"
pad_right="10"
+ pad_bottom="1"
follows="left|top"
chrome="true"
image_overlay_alignment="left"
@@ -37,7 +38,7 @@
pad_right="10"
image_bottom_pad="10"
image_top_pad="10"
- image_pressed="PushButton_Press"
+ image_pressed="PushButton_Selected"
image_pressed_selected="PushButton_Selected_Press"
image_selected="PushButton_Selected_Press"
image_disabled_selected="PushButton_Selected_Disabled"
diff --git a/indra/newview/skins/default/xui/en/widgets/wearable_outfit_list_item.xml b/indra/newview/skins/default/xui/en/widgets/wearable_outfit_list_item.xml
index aa235e103b..a0b119ed72 100644
--- a/indra/newview/skins/default/xui/en/widgets/wearable_outfit_list_item.xml
+++ b/indra/newview/skins/default/xui/en/widgets/wearable_outfit_list_item.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<inventory_list_item
follows="top|right|left"
- height="20"
+ height="21"
name="inventory_item"
tab_stop="false"
hover_image="ListItem_Over"
@@ -17,7 +17,7 @@
<worn_style
font="SansSerifSmall"
font.style="BOLD"
- color="EmphasisColor" />
+ color="WornOutfitTextColor" />
<item_icon
height="16"
follows="top|left"
@@ -25,18 +25,18 @@
layout="topleft"
left="0"
name="item_icon"
- top="0"
+ top="1"
width="16" />
<item_name
follows="left|right"
- height="20"
+ height="21"
layout="topleft"
left="21"
parse_urls="false"
use_ellipses="true"
name="item_name"
text_color="white"
- top="4"
+ top="2"
value="..."
width="359" />
<add_btn
diff --git a/indra/newview/skins/default/xui/es/panel_login_first.xml b/indra/newview/skins/default/xui/es/panel_login_first.xml
deleted file mode 100644
index ccb6858351..0000000000
--- a/indra/newview/skins/default/xui/es/panel_login_first.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<panel name="panel_login">
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php?lang=es
- </panel.string>
- <panel.string name="sign_up_url">
- https://join.secondlife.com/
- </panel.string>
- <layout_stack name="logo_stack">
- <layout_panel name="parent_panel2">
- <layout_stack name="widget_stack">
- <layout_panel name="widget_container">
- <combo_box label="Nombre de usuario" name="username_combo" tool_tip="El nombre de usuario que elegiste al registrarte, como bobsmith12 o Steller Sunshine"/>
- <line_editor label="Contraseña" name="password_edit"/>
- <button label="Iniciar sesión" name="connect_btn"/>
- <check_box label="Recordarme" name="remember_check"/>
- <text name="forgot_password_text">
- Contraseña olvidada
- </text>
- <text name="sign_up_text">
- Regístrate
- </text>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="parent_panel3">
- <layout_stack name="images_stack">
- <layout_panel name="images_container">
- <text name="image_caption_left">
- Tu primer destino es la Isla de aprendizaje. ¡Encuentra el portal de salida!
- </text>
- <text name="image_caption_right">
- A continuación, puedes explorar la Isla social y hablar con otros residentes nuevos.
- </text>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_login_first.xml b/indra/newview/skins/default/xui/fr/panel_login_first.xml
deleted file mode 100644
index 8f40d0230c..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_login_first.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<panel name="panel_login">
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php?lang=fr
- </panel.string>
- <panel.string name="sign_up_url">
- https://join.secondlife.com/
- </panel.string>
- <layout_stack name="logo_stack">
- <layout_panel name="parent_panel2">
- <layout_stack name="widget_stack">
- <layout_panel name="widget_container">
- <combo_box label="Nom d&apos;utilisateur" name="username_combo" tool_tip="Nom d&apos;utilisateur que vous avez choisi lors de votre inscription (par exemple, bobsmith12 ou Steller Sunshine)."/>
- <line_editor label="Mot de passe" name="password_edit"/>
- <button label="Connexion" name="connect_btn"/>
- <check_box font="SansSerifSmall" label="Mémoriser mes informations" name="remember_check"/>
- <text name="forgot_password_text">
- Mot de passe oublié
- </text>
- <text name="sign_up_text">
- S&apos;inscrire
- </text>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="parent_panel3">
- <layout_stack name="images_stack">
- <layout_panel name="images_container">
- <text name="image_caption_left">
- Votre première étape est Learning Island. Trouvez le portail de sortie.
- </text>
- <text name="image_caption_right">
- Puis explorez Social Island et faites la connaissance d&apos;autres résidents.
- </text>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_login_first.xml b/indra/newview/skins/default/xui/it/panel_login_first.xml
deleted file mode 100644
index 5b04fd411a..0000000000
--- a/indra/newview/skins/default/xui/it/panel_login_first.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<panel name="panel_login">
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php?lang=it
- </panel.string>
- <panel.string name="sign_up_url">
- http://join.secondlife.com/
- </panel.string>
- <layout_stack name="logo_stack">
- <layout_panel name="parent_panel2">
- <layout_stack name="widget_stack">
- <layout_panel name="widget_container">
- <combo_box label="Nome utente" name="username_combo" tool_tip="Il nome utente che hai scelto durante la registrazione, come roby12 o Stella Solare"/>
- <line_editor label="Password" name="password_edit"/>
- <button label="Accedi" name="connect_btn"/>
- <check_box label="Ricordami" name="remember_check"/>
- <text name="forgot_password_text">
- Password dimenticata
- </text>
- <text name="sign_up_text">
- Registrati
- </text>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="parent_panel3">
- <layout_stack name="images_stack">
- <layout_panel name="images_container">
- <text name="image_caption_left">
- Il primo passo è a Learning Island. Trova il portale di uscita!
- </text>
- <text name="image_caption_right">
- Quindi esplora Social Island e incontra altri nuovi residenti.
- </text>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/ja/fonts.xml b/indra/newview/skins/default/xui/ja/fonts.xml
index 2085e916c8..7abb3593b6 100644
--- a/indra/newview/skins/default/xui/ja/fonts.xml
+++ b/indra/newview/skins/default/xui/ja/fonts.xml
@@ -2,11 +2,9 @@
<fonts>
<font name="default" comment="default font files (global fallbacks)">
<file>
- NotoSansCJKjp-Medium.otf
- </file>
- <file>
- DejaVuSans.ttf
+ NotoSansCJKjp-SemiBold.otf
</file>
+ <file load_collection="true" font_weight="400">InterVariableFont.ttf</file>
<os name="Windows">
<file load_collection="true">
YuGothM.ttc
@@ -41,7 +39,7 @@
</os>
<os name="Mac">
<file>
- YuGothic-Medium.otf
+ YuGothic-SemiBold.otf
</file>
<file>
ヒラギノ角ゴシック W3.ttc
@@ -82,9 +80,7 @@
<file>
NotoSansCJKjp-Bold.otf
</file>
- <file>
- DejaVuSans-Bold.ttf
- </file>
+ <file load_collection="true" font_weight="700" flags="bold">InterVariableFont.ttf</file>
<os name="Windows">
<file load_collection="true">
YuGothB.ttc
@@ -104,11 +100,9 @@
</font>
<font name="SansSerif" comment="Name of san-serif font (Truetype file name)">
<file>
- NotoSansCJKjp-Bold.otf
- </file>
- <file>
- DejaVuSans.ttf
+ NotoSansCJKjp-SemiBold.otf
</file>
+ <file load_collection="true" font_weight="400">InterVariableFont.ttf</file>
<os name="Windows">
<file>
arial.ttf
@@ -121,19 +115,13 @@
</os>
</font>
<font name="SansSerif" comment="Name of bold sans-serif font" font_style="BOLD">
- <file>
- DejaVuSans-Bold.ttf
- </file>
+ <file load_collection="true" font_weight="700" flags="bold">InterVariableFont.ttf</file>
</font>
<font name="SansSerif" comment="Name of italic sans-serif font" font_style="ITALIC">
- <file>
- DejaVuSans-Oblique.ttf
- </file>
+ <file load_collection="true" font_weight="400">InterItalicVariableFont.ttf</file>
</font>
<font name="SansSerif" comment="Name of bold italic sans-serif font" font_style="BOLD|ITALIC">
- <file>
- DejaVuSans-BoldOblique.ttf
- </file>
+ <file load_collection="true" flags="bold" font_weight="700">InterItalicVariableFont.ttf</file>
</font>
<font name="Monospace" comment="Name of monospace font">
<file>
@@ -144,29 +132,25 @@
</file>
</font>
<font name="DejaVu" comment="Name of DejaVu font">
- <file>
- DejaVuSans.ttf
- </file>
+ <file>DejaVuSans.ttf</file>
</font>
<font name="DejaVu" comment="Name of DejaVu font (bold)" font_style="BOLD">
- <file>
- DejaVuSans-Bold.ttf
- </file>
+ <file>
+ DejaVuSans-Bold.ttf
+ </file>
</font>
<font name="DejaVu" comment="Name of DejaVu font (italic)" font_style="ITALIC">
- <file>
- DejaVuSans-Oblique.ttf
- </file>
+ <file>
+ DejaVuSans-Oblique.ttf
+ </file>
</font>
<font name="DejaVu" comment="Name of DejaVu font (bold italic)" font_style="BOLD|ITALIC">
- <file>
- DejaVuSans-BoldOblique.ttf
- </file>
+ <file>
+ DejaVuSans-BoldOblique.ttf
+ </file>
</font>
<font name="Helvetica" comment="Name of Helvetica font">
- <file>
- DejaVuSans.ttf
- </file>
+ <file load_collection="true" font_weight="400">InterVariableFont.ttf</file>
<os name="Windows">
<file>
arial.ttf
@@ -179,9 +163,7 @@
</os>
</font>
<font name="Helvetica" comment="Name of Helvetica font (bold)" font_style="BOLD">
- <file>
- DejaVuSans-Bold.ttf
- </file>
+ <file load_collection="true" font_weight="700" flags="bold">InterVariableFont.ttf</file>
<os name="Windows">
<file>
arialbd.ttf
@@ -194,9 +176,7 @@
</os>
</font>
<font name="Helvetica" comment="Name of Helvetica font (italic)" font_style="ITALIC">
- <file>
- DejaVuSans-Oblique.ttf
- </file>
+ <file load_collection="true" font_weight="400">InterItalicVariableFont.ttf</file>
<os name="Windows">
<file>
ariali.ttf
@@ -209,9 +189,7 @@
</os>
</font>
<font name="Helvetica" comment="Name of Helvetica font (bold italic)" font_style="BOLD|ITALIC">
- <file>
- DejaVuSans-BoldOblique.ttf
- </file>
+ <file load_collection="true" flags="bold" font_weight="700">InterItalicVariableFont.ttf</file>
<os name="Windows">
<file>
arialbi.ttf
@@ -227,13 +205,11 @@
<file>
times.ttf
</file>
- <file>
- DejaVuSans.ttf
- </file>
+ <file font_weight="400">InterVariableFont.ttf</file>
</font>
<font_size name="Monospace" comment="Size for monospaced font (points, or 1/72 of an inch)" size="8.0"/>
<font_size name="Huge" comment="Size of huge font (points, or 1/72 of an inch)" size="16.0"/>
- <font_size name="Large" comment="Size of large font (points, or 1/72 of an inch)" size="10.6"/>
- <font_size name="Medium" comment="Size of medium font (points, or 1/72 of an inch)" size="8.6"/>
- <font_size name="Small" comment="Size of small font (points, or 1/72 of an inch)" size="7.6"/>
+ <font_size name="Large" comment="Size of large font (points, or 1/72 of an inch)" size="11"/>
+ <font_size name="Medium" comment="Size of medium font (points, or 1/72 of an inch)" size="9"/>
+ <font_size name="Small" comment="Size of small font (points, or 1/72 of an inch)" size="8"/>
</fonts>
diff --git a/indra/newview/skins/default/xui/ja/panel_login_first.xml b/indra/newview/skins/default/xui/ja/panel_login_first.xml
deleted file mode 100644
index 0f987fc816..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_login_first.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_login">
- <panel.string name="forgot_password_url">
- https://secondlife.com/my/account/request.php?lang=ja-JP
- </panel.string>
- <panel.string name="sign_up_url">
- https://join.secondlife.com/?lang=ja
- </panel.string>
- <layout_stack name="logo_stack">
- <layout_panel name="page_top"/>
- <layout_panel name="parent_panel">
- <layout_stack name="logo_stack">
- <layout_panel name="logo_left"/>
- <layout_panel name="logo_container">
- <icon name="sl_logo"/>
- </layout_panel>
- <layout_panel auto_resize="true"/>
- </layout_stack>
- </layout_panel>
- <layout_panel name="parent_panel2">
- <layout_stack name="widget_stack">
- <layout_panel name="widget_left"/>
- <layout_panel name="widget_container">
- <combo_box label="ユーザ名" tool_tip="登録時に自分で選んだユーザー名(例:bobsmith12、Steller Sunshineなど)" name="username_combo">
- <combo_box.combo_editor/>
- <combo_box.combo_button/>
- <combo_box.drop_down_button/>
- </combo_box>
- <line_editor name="password_edit" label="パスワード"/>
- <button label="ログイン" name="connect_btn"/>
- <text name="sign_up_text" valign="center">
- サインアップ
- </text>
- <check_box label="ユーザ名を記憶" name="remember_name" tool_tip="すでに記憶されているユーザーは、「私」>「初期設定」>「詳細設定」>「記憶されたユーザー名」から削除できます。"/>
- <check_box label="パスワード記憶" name="remember_password"/>
- <text name="forgot_password_text">
- パスワードを忘れましたか?
- </text>
- </layout_panel>
- <layout_panel name="widget_right"/>
- </layout_stack>
- </layout_panel>
- <layout_panel name="parent_panel3">
- <layout_stack name="images_stack">
- <layout_panel name="images_left"/>
- <layout_panel name="images_container">
- <icon name="image_left"/>
- </layout_panel>
- <layout_panel name="images_right"/>
- </layout_stack>
- </layout_panel>
- <layout_panel name="page_bottom"/>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_login_first.xml b/indra/newview/skins/default/xui/pl/panel_login_first.xml
deleted file mode 100644
index 0604ecbcff..0000000000
--- a/indra/newview/skins/default/xui/pl/panel_login_first.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="panel_login">
- <layout_stack name="logo_stack">
- <layout_panel name="parent_panel2">
- <layout_stack name="widget_stack">
- <layout_panel name="widget_container">
- <combo_box label="Użytkownik" tool_tip="Nazwa użytkownika wybrana przy rejestracji, np. bobsmith12 lub Steller Sunshine" name="username_combo" />
- <line_editor name="password_edit" label="Hasło" />
- <button label="Zaloguj" name="connect_btn" />
- <check_box label="Zapamiętaj mnie" name="remember_check" />
- <text name="forgot_password_text">
- Zapomniałem/am hasła
- </text>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="parent_panel3">
- <layout_stack name="images_stack">
- <layout_panel name="images_container">
- <text name="image_caption_left">
- Wyspa Nauki to Twój pierwszy krok. Znajdź portal z wyjściem!
- </text>
- <text name="image_caption_right">
- Potem zwiedź Wyspę Towarzyską i poznaj innych nowych rezydentów!
- </text>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_login_first.xml b/indra/newview/skins/default/xui/pt/panel_login_first.xml
deleted file mode 100644
index 86c61163bc..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_login_first.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<panel name="panel_login">
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php?lang=pt
- </panel.string>
- <panel.string name="sign_up_url">
- https://join.secondlife.com/
- </panel.string>
- <layout_stack name="logo_stack">
- <layout_panel name="parent_panel2">
- <layout_stack name="widget_stack">
- <layout_panel name="widget_container">
- <combo_box label="Nome de usuário" name="username_combo" tool_tip="O nome de usuário que você escolheu ao fazer seu cadastro, como zecazc12 ou Magia Solar"/>
- <line_editor label="Senha" name="password_edit"/>
- <button label="Login" name="connect_btn"/>
- <check_box label="Lembrar-me" name="remember_check"/>
- <text name="forgot_password_text">
- Senha esquecida
- </text>
- <text name="sign_up_text">
- Cadastre-se
- </text>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="parent_panel3">
- <layout_stack name="images_stack">
- <layout_panel name="images_container">
- <text name="image_caption_left">
- Sua primeira parada é a Ilha da Educação. Encontre o portal de saída!
- </text>
- <text name="image_caption_right">
- Em seguida, explore a Ilha Social e encontre novos residentes!
- </text>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_login_first.xml b/indra/newview/skins/default/xui/ru/panel_login_first.xml
deleted file mode 100644
index 5db81ea7ca..0000000000
--- a/indra/newview/skins/default/xui/ru/panel_login_first.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<panel name="panel_login">
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php
- </panel.string>
- <panel.string name="sign_up_url">
- https://join.secondlife.com/
- </panel.string>
- <layout_stack name="logo_stack">
- <layout_panel name="parent_panel2">
- <layout_stack name="widget_stack">
- <layout_panel name="widget_container">
- <combo_box label="Имя пользователя" name="username_combo" tool_tip="Имя пользователя, которое вы выбрали при регистрации, например, «bobsmith12» или «Steller Sunshine»"/>
- <line_editor label="Пароль" name="password_edit"/>
- <button label="Войти" name="connect_btn"/>
- <check_box label="Запомнить меня" name="remember_check"/>
- <text name="forgot_password_text">
- Забытый пароль
- </text>
- <text name="sign_up_text">
- Регистрация
- </text>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="parent_panel3">
- <layout_stack name="images_stack">
- <layout_panel name="images_container">
- <text name="image_caption_left">
- Ваш первый шаг – Учебный остров. Найдите портал выхода!
- </text>
- <text name="image_caption_right">
- Затем исследуйте Социальный остров и познакомьтесь с другими новичками!
- </text>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_login_first.xml b/indra/newview/skins/default/xui/tr/panel_login_first.xml
deleted file mode 100644
index 1fc80c2b97..0000000000
--- a/indra/newview/skins/default/xui/tr/panel_login_first.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<panel name="panel_login">
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php
- </panel.string>
- <panel.string name="sign_up_url">
- https://join.secondlife.com/
- </panel.string>
- <layout_stack name="logo_stack">
- <layout_panel name="parent_panel2">
- <layout_stack name="widget_stack">
- <layout_panel name="widget_container">
- <combo_box label="Kullanıcı Adı" name="username_combo" tool_tip="Kaydolduğunuzda seçtiğiniz kullanıcı adı, örn. mustafayalcin12 veya Faruk Gungoren"/>
- <line_editor label="Parola" name="password_edit"/>
- <button label="Oturum Aç" name="connect_btn"/>
- <check_box label="Beni hatırla" name="remember_check"/>
- <text name="forgot_password_text">
- Parolamı unuttum
- </text>
- <text name="sign_up_text">
- Kaydol
- </text>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="parent_panel3">
- <layout_stack name="images_stack">
- <layout_panel name="images_container">
- <text name="image_caption_left">
- Başlangıç yeriniz Eğitim Adası. Haydi çıkış portalını bulun!
- </text>
- <text name="image_caption_right">
- Sonra da Sosyal Ada&apos;yı keşfe çıkın ve diğer LS sakinleriyle tanışın!
- </text>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_login_first.xml b/indra/newview/skins/default/xui/zh/panel_login_first.xml
deleted file mode 100644
index 4d72fcdd03..0000000000
--- a/indra/newview/skins/default/xui/zh/panel_login_first.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<panel name="panel_login">
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php
- </panel.string>
- <panel.string name="sign_up_url">
- http://join.secondlife.com/
- </panel.string>
- <layout_stack name="logo_stack">
- <layout_panel name="parent_panel2">
- <layout_stack name="widget_stack">
- <layout_panel name="widget_container">
- <combo_box label="使用者名稱" name="username_combo" tool_tip="使用者名稱是你註冊時所挑選的,例如 bobsmith12 或 Steller Sunshine"/>
- <line_editor label="密碼" name="password_edit"/>
- <button label="登入" name="connect_btn"/>
- <check_box label="記得我" name="remember_check"/>
- <text name="forgot_password_text">
- 忘記密碼
- </text>
- <text name="sign_up_text">
- 註冊
- </text>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="parent_panel3">
- <layout_stack name="images_stack">
- <layout_panel name="images_container">
- <text name="image_caption_left">
- 你在「學習島」的第一步。 找到離開的傳送門!
- </text>
- <text name="image_caption_right">
- 接著,到「社交島」探索,認識新的居民朋友!
- </text>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/tests/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp
index 94cf0fcf10..1cbb8b50eb 100644
--- a/indra/newview/tests/llviewernetwork_test.cpp
+++ b/indra/newview/tests/llviewernetwork_test.cpp
@@ -236,7 +236,7 @@ namespace tut
std::string("https://secondlife.com/helpers/"));
ensure_equals("Agni login page",
LLGridManager::getInstance()->getLoginPage("util.agni.lindenlab.com"),
- std::string("https://viewer-splash.secondlife.com/"));
+ std::string("https://viewer-splash-v2.secondlife.com/"));
ensure("Agni is a system grid",
LLGridManager::getInstance()->isSystemGrid("util.agni.lindenlab.com"));
@@ -261,7 +261,7 @@ namespace tut
std::string("https://secondlife.aditi.lindenlab.com/helpers/"));
ensure_equals("Aditi login page",
LLGridManager::getInstance()->getLoginPage("util.aditi.lindenlab.com"),
- std::string("https://viewer-splash.secondlife.com/"));
+ std::string("https://viewer-splash-v2.secondlife.com/"));
ensure("Aditi is a system grid",
LLGridManager::getInstance()->isSystemGrid("util.aditi.lindenlab.com"));
}
@@ -309,7 +309,7 @@ namespace tut
std::string("https://secondlife.com/helpers/"));
ensure_equals("Agni login page",
LLGridManager::getInstance()->getLoginPage("util.agni.lindenlab.com"),
- std::string("https://viewer-splash.secondlife.com/"));
+ std::string("https://viewer-splash-v2.secondlife.com/"));
ensure("Agni is a system grid",
LLGridManager::getInstance()->isSystemGrid("util.agni.lindenlab.com"));
@@ -333,7 +333,7 @@ namespace tut
std::string("https://secondlife.aditi.lindenlab.com/helpers/"));
ensure_equals("Aditi login page",
LLGridManager::getInstance()->getLoginPage("util.aditi.lindenlab.com"),
- std::string("https://viewer-splash.secondlife.com/"));
+ std::string("https://viewer-splash-v2.secondlife.com/"));
ensure("Aditi is a system grid",
LLGridManager::getInstance()->isSystemGrid("util.aditi.lindenlab.com"));
@@ -422,7 +422,7 @@ namespace tut
std::string("https://secondlife.com/helpers/"));
ensure_equals("getLoginPage",
LLGridManager::getInstance()->getLoginPage(),
- std::string("https://viewer-splash.secondlife.com/"));
+ std::string("https://viewer-splash-v2.secondlife.com/"));
ensure_equals("update url base for Agni", // relies on agni being the default
std::string("https://update.secondlife.com/update"),
LLGridManager::getInstance()->getUpdateServiceURL());