From 406927f6293efa416b174cfa1c88689aab9615f7 Mon Sep 17 00:00:00 2001 From: Adam Moss Date: Wed, 14 Oct 2009 10:40:56 +0000 Subject: [PATCH] Merge a big bunch of fixes from maint-viewer. Hooray. svn merge -r136066:136073 svn+ssh://svn.lindenlab.com/svn/linden/branches/maint-viewer/maint-viewer-24-qa-9 DEV-8553 New Server Tools - Prep Land For Sale DEV-32942 (QAR-1521) Bad border crossings or TP / Ruthing issues DEV-32942 (QAR-1521) Bad border crossings or TP / Ruthing issues DEV-33239 VWR-13816: Resizing the Search Window Causes the Results to Refresh back to First Page DEV-27746 Running a dev build of Second Life will make console window show up on non-dev builds (Windows) DEV-33209 Linux 1.24.0.120778 client fails to run DEV-29123 SVC-3871: Crash of viewer when clicking on ghost objects at (0,0,0) on a sim DEV-35433 Attempting to upload wrong file type crashes viewer DEV-33499 viewer2009 is not using KDU DEV-33912 Griefing viewer crashes others' viewers with malformed sound files DEV-3784 VWR-138: Animation Priority not working correctly, Can't create new AOs DEV-20678 VWR-9069: Region variable says 'Region Name' in AR if no object is selected DEV-19934 Help->About Second Life doesn't differentiate between 32- and 64-bit Vista DEV-6604 Restored folders have 'Purge Item' and 'Restore Item' options DEV-12867 VWR-5717: Selected Text is not replaced by Input text when Japanese IME is on DEV-11894 Notecards/Texture windows don't open completely when opened from inventory DEV-10641 VWR-4955: Local Chat doesn't show end of last conversation DEV-30039 VWR-12620: Viewer build fails on Linux when compiled with -O2 (--type=Release) DEV-20944 VWR-9065: (intermittent) Right Click >profile on avatar does not display profile DEV-24828 Menu accelerator prefixes shouldn't be hard-coded DEV-34529 VWR-14267: Clicking send in an IM window does not add the sent text to the line editor history DEV-34124 Invite to group, search by name will not show resident if their first name is two characters DEV-20930 VWR-9248: On Mac: the "--url" option causes a command line parsing error DEV-35306 Adult keyword filter triggers multiple warnings DEV-35503 VWR-3595: "Second Life requires True Color (32-bit) to run in a window" message is incorrect DEV-35656 VWR-12995: FTBFS: error: format '%-3d' expects type 'int', but argument 3 has type 'size_t' DEV-30043 VWR-12533: Linux viewer build for OpenAL fails during packaging unless FMOD library is available DEV-31898 VWR-13202: Right clicking mouse triggers arrow key control events DEV-32610 Keyboard shortcuts on OSX viewer overridden by OSX DEV-27067 Coverity Prevent: EVALUATION_ORDER defects DEV-26188 VWR-2242: Specially formatted .BVH file can cause avatar distortion DEV-25475 About Land dialog no longer shows Area: field DEV-19897 OSX Viewer Installer (for an RC) opens with poor positioning DEV-22837 Inventory> Search Recent Items highlighting incorrect characters DEV-21709 VWR-9377: Mapping will default to leave exact sim name listing first. (Searching Gar forces Gar to come up and not Garden of Dreams) DEV-23079 implement volume serial for linux client DEV-13930 VWR-6432: Space Navigator operation with vehicles is broken DEV-27666 VWR-10829: Linux Viewer: CLICK_ACTION_PAY shows CLICK_ACTION_PLAY icon DEV-23670 Viewer crashes on startup if installed into a custom folder with Korean, Japanese or Chinese characters in path DEV-19313 VWR-8454: PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS not highlighted in script editor DEV-19918 VWR-8885: Move character/*.xml files to source bundle DEV-25555 VWR-11172: A source coding mistake prevents number-pad keys from specifying Ctrl+digit shortcuts on Windows DEV-8536 VWR-4057: Multi-line chat display bug - first character in line missing DEV-29592 Mac LLFastTimer uses wall clock instead of Intel PMU DEV-29644 VWR-12587: Cmake install target has a hard coded secondlife-bin reference remaining DEV-25320 VWR-11128: Python not always detected by develop.py DEV-30040 VWR-12617: Poor type name that violates Coding Standard breaks compatibility with system header files DEV-30380 indra/newview/res-sdl/toolpay.BMP is modified during ./develop.py configure DEV-31247 VWR-12763: non-portable printf specifier used with size_t causes FTBFS on 64bit (due to -Werror) DEV-29565 VWR-12569: A comment in lluistring.h contains undefined UTF-8 code sequences DEV-22100 VWR-9620: send_parcel_select_objects in newview/llfloaterland.cpp uses the wrong datatype for the ReturnType field causing a warning DEV-31911 Selected objects / primitives should be greyed out when nothing is selected DEV-3667 Windows: Accelerator keys should be "Ctrl+X" rather than "Ctrl-X" DEV-27223 disable gstreamer on 64-bit linux DEV-8172 We Need a Linden Sale Option to Sell Land to Anyone DEV-25511 VWR-10311: Enable LipSync by default DEV-20443 Revamp group creation confirmation dialog to be more communicative DEV-20132 VWR-7800: Joystick / SpaceNavigator. Camera should remain in position when exiting flycam mode into avatar mode. DEV-18420 VWR-8393: Have build scripts copy fmod from an external location DEV-24841 VWR-10717: Right Space Navigator button should toggle fly in avatar movment, not jump/flyup. DEV-28457 change auto-populate value in buy L$ window from 1000 to 2000 DEV-15545 VWR-3725: Please add resize option to the SEARCH window UI --- doc/contributions.txt | 56 +++- indra/cmake/00-Common.cmake | 2 + indra/cmake/LLWindow.cmake | 2 +- indra/cmake/Python.cmake | 4 + indra/linux_crash_logger/CMakeLists.txt | 2 +- indra/llaudio/llaudiodecodemgr.cpp | 35 ++- indra/llaudio/llvorbisencode.cpp | 6 +- indra/llaudio/llvorbisencode.h | 11 + indra/llcharacter/llbvhloader.cpp | 13 + indra/llcharacter/llbvhloader.h | 7 +- indra/llcharacter/llgesture.cpp | 2 +- indra/llcharacter/lljointsolverrp3.cpp | 2 +- indra/llcommon/llerror.h | 4 +- indra/llcommon/llstring.h | 1 + indra/llcommon/llsys.cpp | 39 ++- indra/llimage/llimage.cpp | 2 +- indra/llinventory/llparcel.cpp | 1 - indra/llmath/llvolume.cpp | 2 +- indra/llmessage/lltemplatemessagebuilder.cpp | 4 +- indra/llmessage/lltemplatemessagereader.cpp | 7 +- indra/llrender/CMakeLists.txt | 2 + indra/llrender/llcubemap.cpp | 2 +- indra/llrender/llfontfreetype.cpp | 5 +- indra/llrender/llfontgl.cpp | 1 + indra/llrender/llglheaders.h | 4 - indra/llrender/llimagegl.cpp | 2 +- indra/llui/lllineeditor.cpp | 64 ++-- indra/llui/lllineeditor.h | 5 +- indra/llui/llmenugl.cpp | 42 +-- indra/llui/llresmgr.cpp | 8 + indra/llui/lluistring.h | 4 +- indra/llvfs/CMakeLists.txt | 1 + indra/llvfs/lldir.cpp | 16 +- indra/llvfs/lldir.h | 1 + indra/llvfs/lldir_mac.cpp | 3 +- indra/llvfs/lldir_win32.cpp | 21 +- indra/llvfs/lldirguard.h | 78 +++++ indra/llwindow/llkeyboard.cpp | 69 ++++- indra/llwindow/llkeyboard.h | 9 +- indra/llwindow/llkeyboardwin32.cpp | 2 +- indra/llwindow/llwindowmacosx.cpp | 6 +- indra/llwindow/llwindowsdl.cpp | 18 +- indra/llxuixml/lltrans.h | 5 + indra/newview/CMakeLists.txt | 11 +- indra/newview/app_settings/keywords.ini | 1 + indra/newview/app_settings/settings.xml | 15 +- .../installers/darwin/firstlook-dmg/_DS_Store | Bin 12292 -> 12292 bytes .../darwin/publicnightly-dmg/_DS_Store | Bin 12292 -> 12292 bytes .../darwin/releasecandidate-dmg/_DS_Store | Bin 12292 -> 12292 bytes indra/newview/llagent.cpp | 21 +- indra/newview/llagent.h | 4 +- indra/newview/llappviewer.cpp | 20 +- indra/newview/llappviewerlinux.cpp | 26 +- indra/newview/llappviewerlinux.h | 5 +- indra/newview/llappviewerlinux_api_dbus.cpp | 6 +- indra/newview/llappviewermacosx.cpp | 19 +- indra/newview/lldrawpoolwater.cpp | 2 +- indra/newview/llfloateranimpreview.cpp | 10 +- indra/newview/llfloaterauction.cpp | 293 +++++++++++++++++- indra/newview/llfloaterauction.h | 16 +- indra/newview/llfloateravatarpicker.cpp | 11 +- indra/newview/llfloateravatarpicker.h | 2 +- indra/newview/llfloatergesture.cpp | 25 +- indra/newview/llfloaterland.cpp | 4 +- indra/newview/llfloaterreporter.cpp | 1 + indra/newview/llfloatersellland.cpp | 2 +- indra/newview/llfloatertools.cpp | 5 + indra/newview/llfloaterworldmap.cpp | 40 +-- indra/newview/llfloaterworldmap.h | 1 - indra/newview/llimpanel.cpp | 2 + indra/newview/llinventorybridge.cpp | 2 + indra/newview/llinventoryfilter.cpp | 7 + indra/newview/llmaniprotate.cpp | 4 +- indra/newview/llpanelgroup.cpp | 8 +- indra/newview/llpanelgroupgeneral.cpp | 2 +- indra/newview/llpreviewgesture.cpp | 2 +- indra/newview/llpreviewscript.cpp | 4 +- indra/newview/llpreviewtexture.cpp | 113 ++++++- indra/newview/llpreviewtexture.h | 6 +- indra/newview/llselectmgr.cpp | 2 +- indra/newview/llsky.cpp | 3 + indra/newview/llsky.h | 6 +- indra/newview/llstartup.cpp | 7 + indra/newview/lltexturefetch.cpp | 2 +- indra/newview/llviewercamera.cpp | 5 +- indra/newview/llviewercontrol.cpp | 2 +- indra/newview/llviewerjoystick.cpp | 87 ++++-- indra/newview/llviewerjoystick.h | 5 +- indra/newview/llviewermedia.cpp | 1 + indra/newview/llviewermenu.cpp | 92 ++++++ indra/newview/llviewermenufile.cpp | 2 +- indra/newview/llviewerobjectlist.cpp | 99 ++++-- indra/newview/llviewerwindow.cpp | 5 - indra/newview/llvoiceclient.cpp | 28 +- indra/newview/llvosky.cpp | 2 +- indra/newview/llvosky.h | 2 +- indra/newview/llwaterparammanager.cpp | 2 +- indra/newview/llwlparammanager.cpp | 2 +- indra/newview/llxmlrpctransaction.cpp | 10 +- indra/newview/llxmlrpctransaction.h | 6 +- indra/newview/pipeline.cpp | 6 +- indra/newview/res-sdl/arrow.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/arrowcop.BMP | Bin 0 -> 3126 bytes indra/newview/res-sdl/arrowcopmulti.BMP | Bin 0 -> 3126 bytes indra/newview/res-sdl/arrowdrag.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/circleandline.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/cross.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/hand.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/ibeam.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/ll_icon.BMP | Bin 0 -> 5174 bytes indra/newview/res-sdl/llarrow.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/llarrowdrag.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/llarrowdragmulti.BMP | Bin 0 -> 3126 bytes indra/newview/res-sdl/llarrowlocked.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/llgrablocked.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/llno.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/llnolocked.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/lltoolcamera.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/lltoolcreate.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/lltoolfocus.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/lltoolgrab.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/lltoolland.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/lltoolpan.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/lltoolpipette.BMP | Bin 0 -> 3126 bytes indra/newview/res-sdl/lltoolrotate.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/lltoolscale.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/lltooltranslate.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/lltoolzoomin.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/lltoolzoomout.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/sizenesw.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/sizens.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/sizenwse.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/sizewe.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/toolmediaopen.BMP | Bin 0 -> 3128 bytes indra/newview/res-sdl/toolpause.BMP | Bin 0 -> 3128 bytes indra/newview/res-sdl/toolpickobject.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/toolpickobject2.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/toolpickobject3.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/toolplay.BMP | Bin 0 -> 3128 bytes indra/newview/res-sdl/wait.BMP | Bin 0 -> 2102 bytes indra/newview/res-sdl/working.BMP | Bin 0 -> 2102 bytes .../skins/default/xui/en/floater_auction.xml | 42 ++- .../xui/en/floater_preview_texture.xml | 62 +++- .../skins/default/xui/en/floater_tools.xml | 2 - .../default/xui/en/floater_world_map.xml | 3 +- .../skins/default/xui/en/menu_viewer.xml | 69 ++++- .../skins/default/xui/en/notifications.xml | 30 +- .../default/xui/en/panel_group_general.xml | 2 +- .../xui/en/panel_preferences_advanced.xml | 29 +- .../newview/skins/default/xui/en/strings.xml | 16 +- indra/newview/viewer_manifest.py | 16 +- indra/test/lltut.h | 2 +- install.xml | 18 +- 153 files changed, 1468 insertions(+), 459 deletions(-) create mode 100644 indra/llvfs/lldirguard.h create mode 100644 indra/newview/res-sdl/arrow.BMP create mode 100644 indra/newview/res-sdl/arrowcop.BMP create mode 100644 indra/newview/res-sdl/arrowcopmulti.BMP create mode 100644 indra/newview/res-sdl/arrowdrag.BMP create mode 100644 indra/newview/res-sdl/circleandline.BMP create mode 100644 indra/newview/res-sdl/cross.BMP create mode 100644 indra/newview/res-sdl/hand.BMP create mode 100644 indra/newview/res-sdl/ibeam.BMP create mode 100644 indra/newview/res-sdl/ll_icon.BMP create mode 100644 indra/newview/res-sdl/llarrow.BMP create mode 100644 indra/newview/res-sdl/llarrowdrag.BMP create mode 100644 indra/newview/res-sdl/llarrowdragmulti.BMP create mode 100644 indra/newview/res-sdl/llarrowlocked.BMP create mode 100644 indra/newview/res-sdl/llgrablocked.BMP create mode 100644 indra/newview/res-sdl/llno.BMP create mode 100644 indra/newview/res-sdl/llnolocked.BMP create mode 100644 indra/newview/res-sdl/lltoolcamera.BMP create mode 100644 indra/newview/res-sdl/lltoolcreate.BMP create mode 100644 indra/newview/res-sdl/lltoolfocus.BMP create mode 100644 indra/newview/res-sdl/lltoolgrab.BMP create mode 100644 indra/newview/res-sdl/lltoolland.BMP create mode 100644 indra/newview/res-sdl/lltoolpan.BMP create mode 100644 indra/newview/res-sdl/lltoolpipette.BMP create mode 100644 indra/newview/res-sdl/lltoolrotate.BMP create mode 100644 indra/newview/res-sdl/lltoolscale.BMP create mode 100644 indra/newview/res-sdl/lltooltranslate.BMP create mode 100644 indra/newview/res-sdl/lltoolzoomin.BMP create mode 100644 indra/newview/res-sdl/lltoolzoomout.BMP create mode 100644 indra/newview/res-sdl/sizenesw.BMP create mode 100644 indra/newview/res-sdl/sizens.BMP create mode 100644 indra/newview/res-sdl/sizenwse.BMP create mode 100644 indra/newview/res-sdl/sizewe.BMP create mode 100644 indra/newview/res-sdl/toolmediaopen.BMP create mode 100644 indra/newview/res-sdl/toolpause.BMP create mode 100644 indra/newview/res-sdl/toolpickobject.BMP create mode 100644 indra/newview/res-sdl/toolpickobject2.BMP create mode 100644 indra/newview/res-sdl/toolpickobject3.BMP create mode 100644 indra/newview/res-sdl/toolplay.BMP create mode 100644 indra/newview/res-sdl/wait.BMP create mode 100644 indra/newview/res-sdl/working.BMP diff --git a/doc/contributions.txt b/doc/contributions.txt index 9b3087a0ac..6b51e2649e 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -1,7 +1,7 @@ Linden Lab would like to acknowledge source code contributions from the -following residents. The Second Life resident name is given below, +following residents. The Second Life resident name is given below, along with the issue identifier corresponding to the patches we've -received from them. To see more about these contributions, visit the +received from them. To see more about these contributions, visit the browsable version: http://wiki.secondlife.com/wiki/Source_contributions Able Whitman @@ -25,19 +25,25 @@ Aimee Trescothick VWR-6348 VWR-6358 VWR-6360 + VWR-6432 VWR-6550 VWR-6583 VWR-6482 VWR-7109 VWR-7383 + VWR-7800 + VWR-8008 VWR-8341 VWR-8430 VWR-8482 VWR-9255 + VWR-10717 VWR-10990 VWR-11100 VWR-11111 - VWR-11844 + VWR-11844 + VWR-14267 + VWR-14278 VWR-14087 Alejandro Rosenthal VWR-1184 @@ -45,9 +51,11 @@ Aleric Inglewood VWR-10001 VWR-10759 VWR-10837 + VWR-12691 VWR-13996 + VWR-14426 Ales Beaumont - VWR-9352 + VWR-9352 Alissa Sabre VWR-81 VWR-83 @@ -69,7 +77,7 @@ Alissa Sabre VWR-1351 VWR-1353 VWR-1410 - VWR-1843 + VWR-1843 VWR-2116 VWR-2826 VWR-3290 @@ -77,19 +85,25 @@ Alissa Sabre VWR-3857 VWR-4010 VWR-5575 - VWR-5929 - VWR-6384 - VWR-6385 + VWR-5717 + VWR-5929 + VWR-6384 + VWR-6385 VWR-6386 - VWR-6430 + VWR-6430 VWR-6858 - VWR-6668 - VWR-7086 - VWR-7087 - VWR-7153 - VWR-7168 + VWR-6668 + VWR-7086 + VWR-7087 + VWR-7153 + VWR-7168 VWR-9190 VWR-10728 + VWR-11172 + VWR-12569 + VWR-12617 + VWR-12620 + VWR-12789 Angus Boyd VWR-592 Ann Congrejo @@ -147,6 +161,7 @@ Carjay McGinnis VWR-4212 VWR-6154 VWR-9400 + VWR-9620 Catherine Pfeffer VWR-1282 VWR-8624 @@ -294,6 +309,7 @@ Kerutsen Sellery VWR-1350 Khyota Wulluf VWR-2085 + VWR-8885 VWR-9256 VWR-9966 Kunnis Basiat @@ -336,6 +352,7 @@ McCabe Maxsted VWR-7877 VWR-7893 VWR-8080 + VWR-8454 VWR-8689 VWR-9007 Michelle2 Zenovka @@ -350,6 +367,7 @@ Michelle2 Zenovka VWR-5082 VWR-5659 VWR-7831 + VWR-8885 VWR-8889 VWR-8310 VWR-9499 @@ -464,7 +482,7 @@ Pf Shan CT-321 princess niven VWR-5733 - CT-85 + CT-85 CT-320 CT-352 Renault Clio @@ -481,7 +499,11 @@ Ringo Tuxing Robin Cornelius VWR-2488 VWR-9557 + VWR-11128 + VWR-12533 VWR-12587 + VWR-12763 + VWR-12995 Ryozu Kojima VWR-53 VWR-287 @@ -564,12 +586,16 @@ TBBle Kurosawa VWR-1892 Teardrops Fall VWR-5366 +Techwolf Lupindo + SNOW-92 + VWR-12385 tenebrous pau VWR-247 Tharax Ferraris VWR-605 Thickbrick Sleaford VWR-7109 + VWR-9287 VWR-13947 Thraxis Epsilon SVC-371 diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index 2a70263446..b168c08552 100644 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -170,6 +170,8 @@ if (LINUX) if (NOT STANDALONE) # this stops us requiring a really recent glibc at runtime add_definitions(-fno-stack-protector) + # linking can be so slow - give us a chance to figure out why + set(CMAKE_CXX_LINK_FLAGS "-Wl,--stats,--no-keep-memory") endif (NOT STANDALONE) endif (VIEWER) diff --git a/indra/cmake/LLWindow.cmake b/indra/cmake/LLWindow.cmake index c0efa27f6e..a5b9cf47a4 100644 --- a/indra/cmake/LLWindow.cmake +++ b/indra/cmake/LLWindow.cmake @@ -13,9 +13,9 @@ if (STANDALONE) SDL_LIBRARY ) else (STANDALONE) - use_prebuilt_binary(SDL) use_prebuilt_binary(mesa) if (LINUX AND VIEWER) + use_prebuilt_binary(SDL) set (SDL_FOUND TRUE) set (SDL_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/i686-linux) set (SDL_LIBRARY SDL) diff --git a/indra/cmake/Python.cmake b/indra/cmake/Python.cmake index 4f86d3234e..0901c1b7a2 100644 --- a/indra/cmake/Python.cmake +++ b/indra/cmake/Python.cmake @@ -13,6 +13,10 @@ if (WINDOWS) [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath] [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath] [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.6\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath] ) elseif (EXISTS /etc/debian_version) # On Debian and Ubuntu, avoid Python 2.4 if possible. diff --git a/indra/linux_crash_logger/CMakeLists.txt b/indra/linux_crash_logger/CMakeLists.txt index 6f6754ed7a..4b19e28066 100644 --- a/indra/linux_crash_logger/CMakeLists.txt +++ b/indra/linux_crash_logger/CMakeLists.txt @@ -38,7 +38,7 @@ list(APPEND linux_crash_logger_SOURCE_FILES ${linux_crash_logger_HEADER_FILES} ) -list(APPEND CMAKE_EXE_LINKER_FLAGS -Wl,--as-needed) +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed") add_executable(linux-crash-logger ${linux_crash_logger_SOURCE_FILES}) diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp index 099c4eba40..ae959eaa81 100644 --- a/indra/llaudio/llaudiodecodemgr.cpp +++ b/indra/llaudio/llaudiodecodemgr.cpp @@ -43,6 +43,8 @@ #include "llassetstorage.h" #include "llrefcount.h" +#include "llvorbisencode.h" + #include "vorbis/codec.h" #include "vorbis/vorbisfile.h" @@ -218,11 +220,42 @@ BOOL LLVorbisDecodeState::initDecode() return(FALSE); } - size_t size_guess = (size_t)ov_pcm_total(&mVF, -1); + S32 sample_count = ov_pcm_total(&mVF, -1); + size_t size_guess = (size_t)sample_count; vorbis_info* vi = ov_info(&mVF, -1); size_guess *= vi->channels; size_guess *= 2; size_guess += 2048; + + bool abort_decode = false; + + if( vi->channels < 1 || vi->channels > LLVORBIS_CLIP_MAX_CHANNELS ) + { + abort_decode = true; + llwarns << "Bad channel count: " << vi->channels << llendl; + } + + if( (size_t)sample_count > LLVORBIS_CLIP_REJECT_SAMPLES ) + { + abort_decode = true; + llwarns << "Illegal sample count: " << sample_count << llendl; + } + + if( size_guess > LLVORBIS_CLIP_REJECT_SIZE ) + { + abort_decode = true; + llwarns << "Illegal sample size: " << size_guess << llendl; + } + + if( abort_decode ) + { + llwarns << "Canceling initDecode. Bad asset: " << mUUID << llendl; + llwarns << "Bad asset encoded by: " << ov_comment(&mVF,-1)->vendor << llendl; + delete mInFilep; + mInFilep = NULL; + return FALSE; + } + mWAVBuffer.reserve(size_guess); mWAVBuffer.resize(WAV_HEADER_SIZE); diff --git a/indra/llaudio/llvorbisencode.cpp b/indra/llaudio/llvorbisencode.cpp index 8ee082a245..0c1ad8191c 100644 --- a/indra/llaudio/llvorbisencode.cpp +++ b/indra/llaudio/llvorbisencode.cpp @@ -162,13 +162,13 @@ S32 check_for_invalid_wav_formats(const std::string& in_fname, std::string& erro return(LLVORBISENC_PCM_FORMAT_ERR); } - if ((num_channels < 1) || (num_channels > 2)) + if ((num_channels < 1) || (num_channels > LLVORBIS_CLIP_MAX_CHANNELS)) { error_msg = "SoundFileInvalidChannelCount"; return(LLVORBISENC_MULTICHANNEL_ERR); } - if (sample_rate != 44100) + if (sample_rate != LLVORBIS_CLIP_SAMPLE_RATE) { error_msg = "SoundFileInvalidSampleRate"; return(LLVORBISENC_UNSUPPORTED_SAMPLE_RATE); @@ -188,7 +188,7 @@ S32 check_for_invalid_wav_formats(const std::string& in_fname, std::string& erro F32 clip_length = (F32)raw_data_length/(F32)bytes_per_sec; - if (clip_length > 10.0f) + if (clip_length > LLVORBIS_CLIP_MAX_TIME) { error_msg = "SoundFileInvalidTooLong"; return(LLVORBISENC_CLIP_TOO_LONG); diff --git a/indra/llaudio/llvorbisencode.h b/indra/llaudio/llvorbisencode.h index ff5ce3a053..6531c1919e 100644 --- a/indra/llaudio/llvorbisencode.h +++ b/indra/llaudio/llvorbisencode.h @@ -45,6 +45,17 @@ const S32 LLVORBISENC_UNSUPPORTED_SAMPLE_RATE = 8; // unsupported sample ra const S32 LLVORBISENC_UNSUPPORTED_WORD_SIZE = 9; // unsupported word size const S32 LLVORBISENC_CLIP_TOO_LONG = 10; // source file is too long +const F32 LLVORBIS_CLIP_MAX_TIME = 10.0f; +const U8 LLVORBIS_CLIP_MAX_CHANNELS = 2; +const U32 LLVORBIS_CLIP_SAMPLE_RATE = 44100; +const U32 LLVORBIS_CLIP_MAX_SAMPLES_PER_CHANNEL = (U32)(LLVORBIS_CLIP_MAX_TIME * LLVORBIS_CLIP_SAMPLE_RATE); +const U32 LLVORBIS_CLIP_MAX_SAMPLES = LLVORBIS_CLIP_MAX_SAMPLES_PER_CHANNEL * LLVORBIS_CLIP_MAX_CHANNELS; +const size_t LLVORBIS_CLIP_MAX_SAMPLE_DATA = LLVORBIS_CLIP_MAX_SAMPLES * 2; // 2 = 16-bit + +// Treat anything this long as a bad asset. A little fudge factor at the end: +// Make that a lot of fudge factor. We're allowing 30 sec for now - 3x legal upload +const size_t LLVORBIS_CLIP_REJECT_SAMPLES = LLVORBIS_CLIP_MAX_SAMPLES * 3; +const size_t LLVORBIS_CLIP_REJECT_SIZE = LLVORBIS_CLIP_MAX_SAMPLE_DATA * 3; S32 check_for_invalid_wav_formats(const std::string& in_fname, std::string& error_msg); S32 encode_vorbis_file(const std::string& in_fname, const std::string& out_fname); diff --git a/indra/llcharacter/llbvhloader.cpp b/indra/llcharacter/llbvhloader.cpp index 24391eb8f3..3dd54b4760 100644 --- a/indra/llcharacter/llbvhloader.cpp +++ b/indra/llcharacter/llbvhloader.cpp @@ -91,7 +91,9 @@ const char *LLBVHLoader::ST_NO_XLT_EASEIN = "Can't get easeIn values."; const char *LLBVHLoader::ST_NO_XLT_EASEOUT = "Can't get easeOut values."; const char *LLBVHLoader::ST_NO_XLT_HAND = "Can't get hand morph value."; const char *LLBVHLoader::ST_NO_XLT_EMOTE = "Can't read emote name."; +const char *LLBVHLoader::ST_BAD_ROOT = "Illegal ROOT joint."; */ + //------------------------------------------------------------------------ // find_next_whitespace() //------------------------------------------------------------------------ @@ -777,6 +779,17 @@ ELoadStatus LLBVHLoader::loadBVHFile(const char *buffer, char* error_text, S32 & return E_ST_NO_NAME; } + //--------------------------------------------------------------- + // we require the root joint be "hip" - DEV-26188 + //--------------------------------------------------------------- + const char* FORCED_ROOT_NAME = "hip"; + if ( (mJoints.size() == 0 ) && ( !strstr(jointName, FORCED_ROOT_NAME) ) ) + { + strncpy(error_text, line.c_str(), 127); /* Flawfinder: ignore */ + return E_ST_BAD_ROOT; + } + + //---------------------------------------------------------------- // add a set of keyframes for this joint //---------------------------------------------------------------- diff --git a/indra/llcharacter/llbvhloader.h b/indra/llcharacter/llbvhloader.h index ecdfc95478..85ab035e61 100644 --- a/indra/llcharacter/llbvhloader.h +++ b/indra/llcharacter/llbvhloader.h @@ -216,7 +216,8 @@ typedef enum e_load_status E_ST_NO_XLT_EASEIN, E_ST_NO_XLT_EASEOUT, E_ST_NO_XLT_HAND, - E_ST_NO_XLT_EMOTE + E_ST_NO_XLT_EMOTE, + E_ST_BAD_ROOT } ELoadStatus; //------------------------------------------------------------------------ @@ -235,7 +236,7 @@ public: /* // Status Codes - typedef const char *Status; + typedef const char *status_t; static const char *ST_OK; static const char *ST_EOF; static const char *ST_NO_CONSTRAINT; @@ -267,6 +268,7 @@ public: static const char *ST_NO_XLT_EASEOUT; static const char *ST_NO_XLT_HAND; static const char *ST_NO_XLT_EMOTE; + static const char *ST_BAD_ROOT; */ // Loads the specified translation table. ELoadStatus loadTranslationTable(const char *fileName); @@ -325,6 +327,7 @@ protected: BOOL mInitialized; ELoadStatus mStatus; + // computed values F32 mDuration; }; diff --git a/indra/llcharacter/llgesture.cpp b/indra/llcharacter/llgesture.cpp index 4ee29fe100..83e4e35b00 100644 --- a/indra/llcharacter/llgesture.cpp +++ b/indra/llcharacter/llgesture.cpp @@ -304,7 +304,7 @@ BOOL LLGestureList::trigger(KEY key, MASK mask) } else { - llwarns << "NULL gesture in gesture list (" << i << ")" << llendl + llwarns << "NULL gesture in gesture list (" << i << ")" << llendl; } } return FALSE; diff --git a/indra/llcharacter/lljointsolverrp3.cpp b/indra/llcharacter/lljointsolverrp3.cpp index 0ea92a2d77..6599a76b16 100644 --- a/indra/llcharacter/lljointsolverrp3.cpp +++ b/indra/llcharacter/lljointsolverrp3.cpp @@ -211,7 +211,7 @@ void LLJointSolverRP3::solve() //------------------------------------------------------------------------- LLVector3 abacCompOrthoVec = abVec - acVec * ((abVec * acVec)/(acVec * acVec)); -// llinfos << "abacCompOrthoVec : " << abacCompOrthoVec << llendl +// llinfos << "abacCompOrthoVec : " << abacCompOrthoVec << llendl; //------------------------------------------------------------------------- // compute the normal of the original ABC plane (and store for later) diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h index 6794be4904..37e922d4b7 100644 --- a/indra/llcommon/llerror.h +++ b/indra/llcommon/llerror.h @@ -239,7 +239,7 @@ typedef LLError::NoClassInfo _LL_CLASS_TO_LOG; */ #define lllog(level, broadTag, narrowTag, once) \ - { \ + do { \ static LLError::CallSite _site( \ level, __FILE__, __LINE__, typeid(_LL_CLASS_TO_LOG), __FUNCTION__, broadTag, narrowTag, once);\ if (_site.shouldLog()) \ @@ -252,7 +252,7 @@ typedef LLError::NoClassInfo _LL_CLASS_TO_LOG; LLError::End(); \ LLError::Log::flush(_out, _site); \ } \ - } + } while(0) // DEPRECATED: Use the new macros that allow tags and *look* like macros. #define lldebugs lllog(LLError::LEVEL_DEBUG, NULL, NULL, false) diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index 8f70726a9e..eca7e922fd 100644 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -34,6 +34,7 @@ #define LL_LLSTRING_H #include +#include #include #include #include "llsd.h" diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 4d03c4d40d..4737421289 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -124,9 +124,42 @@ LLOSInfo::LLOSInfo() : } else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0) { - if(osvi.wProductType == VER_NT_WORKSTATION) - mOSStringSimple = "Microsoft Windows Vista "; - else mOSStringSimple = "Microsoft Windows Vista Server "; + ///get native system info if available.. + typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); ///function pointer for loading GetNativeSystemInfo + SYSTEM_INFO si; //System Info object file contains architecture info + PGNSI pGNSI; //pointer object + ZeroMemory(&si, sizeof(SYSTEM_INFO)); //zero out the memory in information + pGNSI = (PGNSI) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo"); //load kernel32 get function + if(NULL != pGNSI) //check if it has failed + pGNSI(&si); //success + else + GetSystemInfo(&si); //if it fails get regular system info + //(Warning: If GetSystemInfo it may result in incorrect information in a WOW64 machine, if the kernel fails to load) + + //msdn microsoft finds 32 bit and 64 bit flavors this way.. + //http://msdn.microsoft.com/en-us/library/ms724429(VS.85).aspx (example code that contains quite a few more flavors + //of windows than this code does (in case it is needed for the future) + if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 ) //check for 64 bit + { + if(osvi.wProductType == VER_NT_WORKSTATION) + mOSStringSimple = "Microsoft Windows Vista 64-bit "; + else + mOSStringSimple = "Microsoft Windows Vista Server 64-bit "; + } + else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL ) + { + if(osvi.wProductType == VER_NT_WORKSTATION) + mOSStringSimple = "Microsoft Windows Vista 32-bit "; + else + mOSStringSimple = "Microsoft Windows Vista Server 32-bit "; + } + else // PROCESSOR_ARCHITECTURE_IA64 || PROCESSOR_ARCHITECTURE_UNKNOWN not checked + { + if(osvi.wProductType == VER_NT_WORKSTATION) + mOSStringSimple = "Microsoft Windows Vista "; + else + mOSStringSimple = "Microsoft Windows Vista Server "; + } } else // Use the registry on early versions of Windows NT. { diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index 488f3bf78d..9bbc55509d 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -159,7 +159,7 @@ U8* LLImageBase::allocateData(S32 size) size = mWidth * mHeight * mComponents; if (size <= 0) { - llerrs << llformat("LLImageBase::allocateData called with bad dimentions: %dx%dx%d",mWidth,mHeight,mComponents) << llendl; + llerrs << llformat("LLImageBase::allocateData called with bad dimensions: %dx%dx%d",mWidth,mHeight,mComponents) << llendl; } } else if (size <= 0 || (size > 4096*4096*16 && sSizeOverride == FALSE)) diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp index e48690908e..f208d82084 100644 --- a/indra/llinventory/llparcel.cpp +++ b/indra/llinventory/llparcel.cpp @@ -706,7 +706,6 @@ void LLParcel::packMessage(LLSD& msg) msg["category"] = (U8)mCategory; msg["auth_buyer_id"] = mAuthBuyerID; msg["snapshot_id"] = mSnapshotID; - msg["snapshot_id"] = mSnapshotID; msg["user_location"] = ll_sd_from_vector3(mUserLocation); msg["user_look_at"] = ll_sd_from_vector3(mUserLookAt); msg["landing_type"] = (U8)mLandingType; diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 5cc0a596fd..b8ef92f9a9 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -4273,7 +4273,7 @@ LLFaceID LLVolume::generateFaceMask() } break; default: - llerrs << "Unknown profile!" << llendl + llerrs << "Unknown profile!" << llendl; break; } diff --git a/indra/llmessage/lltemplatemessagebuilder.cpp b/indra/llmessage/lltemplatemessagebuilder.cpp index e6419807ff..6400310c46 100644 --- a/indra/llmessage/lltemplatemessagebuilder.cpp +++ b/indra/llmessage/lltemplatemessagebuilder.cpp @@ -728,9 +728,9 @@ static S32 buildBlock(U8* buffer, S32 buffer_size, const LLMessageBlock* templat // out gracefully from this function. XXXTBD llerrs << "buildBlock failed. " << "Attempted to pack " - << result + mvci.getSize() + << (result + mvci.getSize()) << " bytes into a buffer with size " - << buffer_size << "." << llendl + << buffer_size << "." << llendl; } } } diff --git a/indra/llmessage/lltemplatemessagereader.cpp b/indra/llmessage/lltemplatemessagereader.cpp index 8c9eb7ed42..6682575ca5 100644 --- a/indra/llmessage/lltemplatemessagereader.cpp +++ b/indra/llmessage/lltemplatemessagereader.cpp @@ -678,12 +678,7 @@ BOOL LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender // default to 0s. U32 size = mvci.getSize(); - std::vector data(size); - if(size) - { - // Nonsense test to get past GCC 4.3.1 bug with -O3 - memset(&(data[0]), 0, size); - } + std::vector data(size, 0); cur_data_block->addData(mvci.getName(), &(data[0]), size, mvci.getType()); } diff --git a/indra/llrender/CMakeLists.txt b/indra/llrender/CMakeLists.txt index aac650bec9..5c13df9f81 100644 --- a/indra/llrender/CMakeLists.txt +++ b/indra/llrender/CMakeLists.txt @@ -9,6 +9,7 @@ include(LLCommon) include(LLImage) include(LLMath) include(LLRender) +include(LLVFS) include(LLWindow) include(LLXML) include(LLVFS) @@ -19,6 +20,7 @@ include_directories( ${LLIMAGE_INCLUDE_DIRS} ${LLMATH_INCLUDE_DIRS} ${LLRENDER_INCLUDE_DIRS} + ${LLVFS_INCLUDE_DIRS} ${LLWINDOW_INCLUDE_DIRS} ${LLXML_INCLUDE_DIRS} ${LLVFS_INCLUDE_DIRS} diff --git a/indra/llrender/llcubemap.cpp b/indra/llrender/llcubemap.cpp index 754d90c854..08a96b4e31 100644 --- a/indra/llrender/llcubemap.cpp +++ b/indra/llrender/llcubemap.cpp @@ -106,7 +106,7 @@ void LLCubeMap::initGL() } else { - llwarns << "Using cube map without extension!" << llendl + llwarns << "Using cube map without extension!" << llendl; } } diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index 44e997340e..1246cfc44b 100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -364,7 +364,7 @@ BOOL LLFontFreetype::addChar(llwchar wch) const glyph_index = FT_Get_Char_Index(mFTFace, wch); if (glyph_index == 0) { - //llinfos << "Trying to add glyph from fallback font!" << llendl + //llinfos << "Trying to add glyph from fallback font!" << llendl; font_vector_t::const_iterator iter; for(iter = mFallbackFonts.begin(); iter != mFallbackFonts.end(); iter++) { @@ -534,11 +534,10 @@ void LLFontFreetype::renderGlyph(U32 glyph_index) const void LLFontFreetype::reset(F32 vert_dpi, F32 horz_dpi) { resetBitmapCache(); + loadFace(mName, mPointSize, vert_dpi ,horz_dpi, mFontBitmapCachep->getNumComponents(), mIsFallback); if (!mIsFallback) { // This is the head of the list - need to rebuild ourself and all fallbacks. - loadFace(mName, mPointSize, vert_dpi ,horz_dpi, mFontBitmapCachep->getNumComponents(), mIsFallback); - if (mFallbackFonts.empty()) { llwarns << "LLFontGL::reset(), no fallback fonts present" << llendl; diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index f7bab3de67..2d7b9760e8 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -44,6 +44,7 @@ #include "llstl.h" #include "v4color.h" #include "lltexture.h" +#include "lldir.h" // Third party library includes #include diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h index c7178a5552..f33ae7d8f0 100644 --- a/indra/llrender/llglheaders.h +++ b/indra/llrender/llglheaders.h @@ -53,8 +53,6 @@ # include "GL/glxext.h" //# define GLH_EXT_GET_PROC_ADDRESS(p) glXGetProcAddressARB((const GLubyte*)(p)) # define GLH_EXT_GET_PROC_ADDRESS(p) glXGetProcAddress((const GLubyte*)(p)) -// the X headers define 'Status'. Undefine to avoid confusion. -#undef Status // The __APPLE__ kludge is to make glh_extensions.h not symbol-clash horribly // This header is distributed with SL. You'll find it in linden/libraries/include/GL/ @@ -277,8 +275,6 @@ extern PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT; // Use glXGetProcAddressARB instead of glXGetProcAddress - the ARB symbol // is considered 'legacy' but works on more machines. # define GLH_EXT_GET_PROC_ADDRESS(p) glXGetProcAddressARB((const GLubyte*)(p)) -// Whee, the X headers define 'Status'. Undefine to avoid confusion. -#undef Status #endif // LL_LINUX && !LL_MESA_HEADLESS #if LL_LINUX && defined(WINGDIAPI) diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index dd64d753c7..e5fea5b995 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -428,7 +428,7 @@ void LLImageGL::setSize(S32 width, S32 height, S32 ncomponents) // Check if dimensions are a power of two! if (!checkSize(width,height)) { - llerrs << llformat("Texture has non power of two dimention: %dx%d",width,height) << llendl; + llerrs << llformat("Texture has non power of two dimension: %dx%d",width,height) << llendl; } if (mTexName) diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 693ea5bb45..0db515ab41 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -148,6 +148,7 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p) mBgImage( p.background_image ), mBgImageDisabled( p.background_image_disabled ), mBgImageFocused( p.background_image_focused ), + mHaveHistory(FALSE), mReplaceNewlinesWithSpaces( TRUE ), mLabel(p.label), mCursorColor(p.cursor_color()), @@ -164,13 +165,8 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p) mTripleClickTimer.reset(); setText(p.default_text()); - // line history support: - // - initialize line history list - mLineHistory.insert( mLineHistory.end(), "" ); - // - disable line history by default - mHaveHistory = FALSE; - // - reset current history line pointer - mCurrentHistoryLine = 0; + // Initialize current history line iterator + mCurrentHistoryLine = mLineHistory.begin(); LLRect border_rect(getLocalRect()); // adjust for gl line drawing glitch @@ -278,16 +274,31 @@ void LLLineEditor::updateHistory() // reset current history line number. // Be sure only to remember lines that are not empty and that are // different from the last on the list. - if( mHaveHistory && mText.length() && ( mLineHistory.empty() || getText() != mLineHistory.back() ) ) + if( mHaveHistory && getLength() ) { - // discard possible empty line at the end of the history - // inserted by setText() - if( !mLineHistory.back().length() ) + if( !mLineHistory.empty() ) { - mLineHistory.pop_back(); + // When not empty, last line of history should always be blank. + if( mLineHistory.back().empty() ) + { + // discard the empty line + mLineHistory.pop_back(); + } + else + { + LL_WARNS("") << "Last line of history was not blank." << LL_ENDL; + } } - mLineHistory.insert( mLineHistory.end(), getText() ); - mCurrentHistoryLine = mLineHistory.size() - 1; + + // Add text to history, ignoring duplicates + if( mLineHistory.empty() || getText() != mLineHistory.back() ) + { + mLineHistory.push_back( getText() ); + } + + // Restore the blank line and set mCurrentHistoryLine to point at it + mLineHistory.push_back( "" ); + mCurrentHistoryLine = mLineHistory.end() - 1; } } @@ -357,11 +368,8 @@ void LLLineEditor::setText(const LLStringExplicit &new_text) } setCursor(llmin((S32)mText.length(), getCursor())); - // Newly set text goes always in the last line of history. - // Possible empty strings (as with chat line) will be deleted later. - mLineHistory.insert( mLineHistory.end(), new_text ); // Set current history line to end of history. - mCurrentHistoryLine = mLineHistory.size() - 1; + mCurrentHistoryLine = mLineHistory.end() - 1; mPrevText = mText; } @@ -1254,9 +1262,9 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask) case KEY_UP: if( mHaveHistory && ( MASK_CONTROL == mask ) ) { - if( mCurrentHistoryLine > 0 ) + if( mCurrentHistoryLine > mLineHistory.begin() ) { - mText.assign( mLineHistory[ --mCurrentHistoryLine ] ); + mText.assign( *(--mCurrentHistoryLine) ); setCursor(llmin((S32)mText.length(), getCursor())); } else @@ -1271,9 +1279,9 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask) case KEY_DOWN: if( mHaveHistory && ( MASK_CONTROL == mask ) ) { - if( !mLineHistory.empty() && mCurrentHistoryLine < mLineHistory.size() - 1 ) + if( !mLineHistory.empty() && mCurrentHistoryLine < mLineHistory.end() - 1 ) { - mText.assign( mLineHistory[ ++mCurrentHistoryLine ] ); + mText.assign( *(++mCurrentHistoryLine) ); setCursor(llmin((S32)mText.length(), getCursor())); } else @@ -2291,14 +2299,20 @@ BOOL LLLineEditor::hasPreeditString() const void LLLineEditor::resetPreedit() { - if (hasPreeditString()) + if (hasSelection()) { - if (hasSelection()) + if (hasPreeditString()) { llwarns << "Preedit and selection!" << llendl; deselect(); } - + else + { + deleteSelection(); + } + } + if (hasPreeditString()) + { const S32 preedit_pos = mPreeditPositions.front(); mText.erase(preedit_pos, mPreeditPositions.back() - preedit_pos); mText.insert(preedit_pos, mPreeditOverwrittenWString); diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 48d68b9935..6e81969f00 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -286,8 +286,9 @@ protected: // line history support: BOOL mHaveHistory; // flag for enabled line history - std::vector mLineHistory; // line history storage - U32 mCurrentHistoryLine; // currently browsed history line + typedef std::vector line_history_t; + line_history_t mLineHistory; // line history storage + line_history_t::iterator mCurrentHistoryLine; // currently browsed history line LLViewBorder* mBorder; const LLFontGL* mGLFont; diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 14bee0465c..cf013efca0 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -279,47 +279,7 @@ BOOL LLMenuItemGL::addToAcceleratorList(std::list *listp) // the current accelerator key and mask to the provided string. void LLMenuItemGL::appendAcceleratorString( std::string& st ) const { - // break early if this is a silly thing to do. - if( KEY_NONE == mAcceleratorKey ) - { - return; - } - - // Append any masks -#ifdef LL_DARWIN - // Standard Mac names for modifier keys in menu equivalents - // We could use the symbol characters, but they only exist in certain fonts. - if( mAcceleratorMask & MASK_CONTROL ) - { - if ( mAcceleratorMask & MASK_MAC_CONTROL ) - { - st.append( "Ctrl-" ); - } - else - { - st.append( "Cmd-" ); // Symbol would be "\xE2\x8C\x98" - } - } - if( mAcceleratorMask & MASK_ALT ) - st.append( "Opt-" ); // Symbol would be "\xE2\x8C\xA5" - if( mAcceleratorMask & MASK_SHIFT ) - st.append( "Shift-" ); // Symbol would be "\xE2\x8C\xA7" -#else - if( mAcceleratorMask & MASK_CONTROL ) - st.append( "Ctrl-" ); - if( mAcceleratorMask & MASK_ALT ) - st.append( "Alt-" ); - if( mAcceleratorMask & MASK_SHIFT ) - st.append( "Shift-" ); -#endif - - std::string keystr = LLKeyboard::stringFromKey( mAcceleratorKey ); - if ((mAcceleratorMask & MASK_NORMALKEYS) && - (keystr[0] == '-' || keystr[0] == '=')) - { - st.append( " " ); - } - st.append( keystr ); + st = LLKeyboard::stringFromAccelerator( mAcceleratorMask, mAcceleratorKey ); LL_DEBUGS("HotKeys") << "appendAcceleratorString: " << st << LL_ENDL; } diff --git a/indra/llui/llresmgr.cpp b/indra/llui/llresmgr.cpp index a4e23a605b..ed870d46d5 100644 --- a/indra/llui/llresmgr.cpp +++ b/indra/llui/llresmgr.cpp @@ -279,6 +279,14 @@ std::string LLResMgr::getMonetaryString( S32 input ) const void LLResMgr::getIntegerString( std::string& output, S32 input ) const { + // handle special case of input value being zero + if (input == 0) + { + output = "0"; + return; + } + + // *NOTE: this method does not handle negative input integers correctly S32 fraction = 0; std::string fraction_string; S32 remaining_count = input; diff --git a/indra/llui/lluistring.h b/indra/llui/lluistring.h index aedeca27cb..195f21a6a7 100644 --- a/indra/llui/lluistring.h +++ b/indra/llui/lluistring.h @@ -51,9 +51,9 @@ // llinfos << mMessage.getString() << llendl; // outputs "Welcome Steve to Second Life" // mMessage.setArg("[USERNAME]", "Joe"); // llinfos << mMessage.getString() << llendl; // outputs "Welcome Joe to Second Life" -// mMessage = "Recepci￳n a la [SECONDLIFE] [USERNAME]" +// mMessage = "Bienvenido a la [SECONDLIFE] [USERNAME]" // mMessage.setArg("[SECONDLIFE]", "Segunda Vida"); -// llinfos << mMessage.getString() << llendl; // outputs "Recepci￳n a la Segunda Vida Joe" +// llinfos << mMessage.getString() << llendl; // outputs "Bienvenido a la Segunda Vida Joe" // Implementation Notes: // Attempting to have operator[](const std::string& s) return mArgs[s] fails because we have diff --git a/indra/llvfs/CMakeLists.txt b/indra/llvfs/CMakeLists.txt index cc0297e3dc..0de3fa33f9 100644 --- a/indra/llvfs/CMakeLists.txt +++ b/indra/llvfs/CMakeLists.txt @@ -23,6 +23,7 @@ set(llvfs_HEADER_FILES CMakeLists.txt lldir.h + lldirguard.h lllfsthread.h llpidlock.h llvfile.h diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index 745e53c980..781321e5e4 100644 --- a/indra/llvfs/lldir.cpp +++ b/indra/llvfs/lldir.cpp @@ -404,6 +404,12 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd prefix = getExecutableDir(); break; + case LL_PATH_FONTS: + prefix = getAppRODataDir(); + prefix += mDirDelimiter; + prefix += "fonts"; + break; + default: llassert(0); } @@ -419,6 +425,11 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd filename = subdir1 + mDirDelimiter + filename; } + if (prefix.empty()) + { + llwarns << "prefix is empty, possible bad filename" << llendl; + } + std::string expanded_filename; if (!filename.empty()) { @@ -673,11 +684,6 @@ void LLDir::dumpCurrentDirectories() LL_DEBUGS2("AppInit","Directories") << " CAFile: " << getCAFile() << LL_ENDL; LL_DEBUGS2("AppInit","Directories") << " SkinBaseDir: " << getSkinBaseDir() << LL_ENDL; LL_DEBUGS2("AppInit","Directories") << " SkinDir: " << getSkinDir() << LL_ENDL; - -#if LL_LIBXUL_ENABLED - LL_DEBUGS2("AppInit","Directories") << " HTML Path: " << getExpandedFilename( LL_PATH_HTML, "" ) << llendl; - LL_DEBUGS2("AppInit","Directories") << " Mozilla Profile Path: " << getExpandedFilename( LL_PATH_MOZILLA_PROFILE, "" ) << llendl; -#endif } diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h index 6c9fea6b6a..07c814769e 100644 --- a/indra/llvfs/lldir.h +++ b/indra/llvfs/lldir.h @@ -60,6 +60,7 @@ typedef enum ELLPath // LL_PATH_HTML = 16, LL_PATH_EXECUTABLE = 16, LL_PATH_DEFAULT_SKIN = 17, + LL_PATH_FONTS = 18, LL_PATH_LAST } ELLPath; diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp index 346f7dd8ed..7bc6f63e1f 100644 --- a/indra/llvfs/lldir_mac.cpp +++ b/indra/llvfs/lldir_mac.cpp @@ -68,7 +68,8 @@ static void CFStringRefToLLString(CFStringRef stringRef, std::string &llString, { if (stringRef) { - long bufferSize = CFStringGetLength(stringRef) + 1; + long stringSize = CFStringGetLength(stringRef) + 1; + long bufferSize = CFStringGetMaximumSizeForEncoding(stringSize,kCFStringEncodingUTF8); char* buffer = new char[bufferSize]; memset(buffer, 0, bufferSize); if (CFStringGetCString(stringRef, buffer, bufferSize, kCFStringEncodingUTF8)) diff --git a/indra/llvfs/lldir_win32.cpp b/indra/llvfs/lldir_win32.cpp index 3e302764de..4c376f11a5 100644 --- a/indra/llvfs/lldir_win32.cpp +++ b/indra/llvfs/lldir_win32.cpp @@ -121,17 +121,22 @@ LLDir_Win32::LLDir_Win32() GetCurrentDirectory(MAX_PATH, w_str); mExecutableDir = utf16str_to_utf8str(llutf16string(w_str)); #endif - - // When running in a dev tree, app_settings is under indra/newview/ - // but in production it is under Program Files/SecondLife/ - // Attempt to detect which one we're using. JC - if (mExecutableDir.find("indra") != std::string::npos) - mAppRODataDir = getCurPath(); - else - mAppRODataDir = mExecutableDir; + + mAppRODataDir = "."; mSkinBaseDir = mAppRODataDir + mDirDelimiter + "skins"; + if (mExecutableDir.find("indra") == std::string::npos) + { + // Running from installed directory. Make sure current + // directory isn't something crazy (e.g. if invoking from + // command line). + SetCurrentDirectory(utf8str_to_utf16str(mExecutableDir).c_str()); + GetCurrentDirectory(MAX_PATH, w_str); + mWorkingDir = utf16str_to_utf8str(llutf16string(w_str)); + } + llinfos << "mAppRODataDir = " << mAppRODataDir << llendl; + // Build the default cache directory mDefaultCacheDir = buildSLOSCacheDir(); diff --git a/indra/llvfs/lldirguard.h b/indra/llvfs/lldirguard.h new file mode 100644 index 0000000000..85366120d8 --- /dev/null +++ b/indra/llvfs/lldirguard.h @@ -0,0 +1,78 @@ +/** + * @file lldirguard.h + * @brief Protect working directory from being changed in scope. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_DIRGUARD_H +#define LL_DIRGUARD_H + +#include "linden_common.h" +#include "llerror.h" + +#if LL_WINDOWS +class LLDirectoryGuard +{ +public: + LLDirectoryGuard() + { + mOrigDirLen = GetCurrentDirectory(MAX_PATH, mOrigDir); + } + + ~LLDirectoryGuard() + { + mFinalDirLen = GetCurrentDirectory(MAX_PATH, mFinalDir); + if ((mOrigDirLen!=mFinalDirLen) || + (wcsncmp(mOrigDir,mFinalDir,mOrigDirLen)!=0)) + { + // Dir has changed + std::string mOrigDirUtf8 = utf16str_to_utf8str(llutf16string(mOrigDir)); + std::string mFinalDirUtf8 = utf16str_to_utf8str(llutf16string(mFinalDir)); + llinfos << "Resetting working dir from " << mFinalDirUtf8 << " to " << mOrigDirUtf8 << llendl; + SetCurrentDirectory(mOrigDir); + } + } + +private: + TCHAR mOrigDir[MAX_PATH]; + DWORD mOrigDirLen; + TCHAR mFinalDir[MAX_PATH]; + DWORD mFinalDirLen; +}; +#else // No-op outside Windows. +class LLDirectoryGuard +{ +public: + LLDirectoryGuard() {} + ~LLDirectoryGuard() {} +}; +#endif + + +#endif diff --git a/indra/llwindow/llkeyboard.cpp b/indra/llwindow/llkeyboard.cpp index f0f618aef1..16cbf815e0 100644 --- a/indra/llwindow/llkeyboard.cpp +++ b/indra/llwindow/llkeyboard.cpp @@ -36,7 +36,6 @@ #include "llwindowcallbacks.h" - // // Globals // @@ -46,6 +45,8 @@ LLKeyboard *gKeyboard = NULL; //static std::map LLKeyboard::sKeysToNames; std::map LLKeyboard::sNamesToKeys; +LLKeyStringTranslatorFunc* LLKeyboard::mStringTranslator = NULL; // Used for l10n + PC/Mac/Linux accelerator labeling + // // Class Implementation @@ -346,6 +347,65 @@ std::string LLKeyboard::stringFromKey(KEY key) } +//static +std::string LLKeyboard::stringFromAccelerator( MASK accel_mask, KEY key ) +{ + std::string res; + + // break early if this is a silly thing to do. + if( KEY_NONE == key ) + { + return res; + } + + LLKeyStringTranslatorFunc *trans = gKeyboard->mStringTranslator; + + if( trans == NULL ) + { + llerrs << "No mKeyStringTranslator" << llendl; + return res; + } + + // Append any masks +#ifdef LL_DARWIN + // Standard Mac names for modifier keys in menu equivalents + // We could use the symbol characters, but they only exist in certain fonts. + if( accel_mask & MASK_CONTROL ) + { + if ( accel_mask & MASK_MAC_CONTROL ) + { + res.append( trans("accel-mac-control") ); + } + else + { + res.append( trans("accel-mac-command") ); // Symbol would be "\xE2\x8C\x98" + } + } + if( accel_mask & MASK_ALT ) + res.append( trans("accel-mac-option") ); // Symbol would be "\xE2\x8C\xA5" + if( accel_mask & MASK_SHIFT ) + res.append( trans("accel-mac-shift") ); // Symbol would be "\xE2\x8C\xA7" +#else + if( accel_mask & MASK_CONTROL ) + res.append( trans("accel-win-control") ); + if( accel_mask & MASK_ALT ) + res.append( trans("accel-win-alt") ); + if( accel_mask & MASK_SHIFT ) + res.append( trans("accel-win-shift") ); +#endif + std::string key_string = LLKeyboard::stringFromKey(key); + if ((accel_mask & MASK_NORMALKEYS) && + (key_string[0] == '-' || key_string[0] == '=' || key_string[0] == '+')) + { + res.append( " " ); + } + + std::string keystr = stringFromKey( key ); + res.append( keystr ); + + return res; +} + //static BOOL LLKeyboard::maskFromString(const std::string& str, MASK *mask) @@ -396,3 +456,10 @@ BOOL LLKeyboard::maskFromString(const std::string& str, MASK *mask) return FALSE; } } + + +//static +void LLKeyboard::setStringTranslatorFunc( LLKeyStringTranslatorFunc *trans_func ) +{ + mStringTranslator = trans_func; +} diff --git a/indra/llwindow/llkeyboard.h b/indra/llwindow/llkeyboard.h index 0261bcbeb3..d545034070 100644 --- a/indra/llwindow/llkeyboard.h +++ b/indra/llwindow/llkeyboard.h @@ -47,7 +47,8 @@ enum EKeystate }; typedef void (*LLKeyFunc)(EKeystate keystate); - +typedef std::string (LLKeyStringTranslatorFunc)(const char *label); + enum EKeyboardInsertMode { LL_KIM_INSERT, @@ -111,7 +112,7 @@ public: static BOOL maskFromString(const std::string& str, MASK *mask); // False on failure static BOOL keyFromString(const std::string& str, KEY *key); // False on failure static std::string stringFromKey(KEY key); - + static std::string stringFromAccelerator( MASK accel_mask, KEY key ); e_numpad_distinct getNumpadDistinct() { return mNumpadDistinct; } void setNumpadDistinct(e_numpad_distinct val) { mNumpadDistinct = val; } @@ -119,6 +120,8 @@ public: F32 getKeyElapsedTime( KEY key ); // Returns time in seconds since key was pressed. S32 getKeyElapsedFrameCount( KEY key ); // Returns time in frames since key was pressed. + static void setStringTranslatorFunc( LLKeyStringTranslatorFunc *trans_func ); + protected: void addKeyName(KEY key, const std::string& name); @@ -136,6 +139,8 @@ protected: KEY mCurTranslatedKey; KEY mCurScanKey; // Used during the scanKeyboard() + static LLKeyStringTranslatorFunc* mStringTranslator; // Used for l10n + PC/Mac/Linux accelerator labeling + e_numpad_distinct mNumpadDistinct; EKeyboardInsertMode mInsertMode; diff --git a/indra/llwindow/llkeyboardwin32.cpp b/indra/llwindow/llkeyboardwin32.cpp index ea11e0537e..35a3e7621a 100644 --- a/indra/llwindow/llkeyboardwin32.cpp +++ b/indra/llwindow/llkeyboardwin32.cpp @@ -65,7 +65,7 @@ LLKeyboardWin32::LLKeyboardWin32() // numpad number keys for (cur_char = 0x60; cur_char <= 0x69; cur_char++) { - mTranslateKeyMap[cur_char] = (KEY)('0' + (0x60 - cur_char)); + mTranslateKeyMap[cur_char] = (KEY)('0' + (cur_char - 0x60)); } diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index 7137c93476..96e5a1b7ca 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -1389,11 +1389,11 @@ void LLWindowMacOSX::setMouseClipping( BOOL b ) if(b) { - // llinfos << "setMouseClipping(TRUE)" << llendl + // llinfos << "setMouseClipping(TRUE)" << llendl; } else { - // llinfos << "setMouseClipping(FALSE)" << llendl + // llinfos << "setMouseClipping(FALSE)" << llendl; } adjustCursorDecouple(); @@ -1411,7 +1411,7 @@ BOOL LLWindowMacOSX::setCursorPosition(const LLCoordWindow position) CGPoint newPosition; - // llinfos << "setCursorPosition(" << screen_pos.mX << ", " << screen_pos.mY << ")" << llendl + // llinfos << "setCursorPosition(" << screen_pos.mX << ", " << screen_pos.mY << ")" << llendl; newPosition.x = screen_pos.mX; newPosition.y = screen_pos.mY; diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 00a8d429ba..9f03c8f695 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -70,7 +70,7 @@ extern BOOL gDebugWindowProc; const S32 MAX_NUM_RESOLUTIONS = 200; // static variable for ATI mouse cursor crash work-around: -static bool ATIbug = false; +static bool ATIbug = false; // // LLWindowSDL @@ -219,8 +219,7 @@ LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks, #endif // LL_X11 #if LL_GTK - // We MUST be the first to initialize GTK, i.e. we have to beat - // our embedded Mozilla to the punch so that GTK doesn't get badly + // We MUST be the first to initialize GTK so that GTK doesn't get badly // initialized with a non-C locale and cause lots of serious random // weirdness. ll_try_gtk_init(); @@ -674,12 +673,12 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B glGetIntegerv(GL_DEPTH_BITS, &depthBits); glGetIntegerv(GL_STENCIL_BITS, &stencilBits); - llinfos << "GL buffer:" << llendl - llinfos << " Red Bits " << S32(redBits) << llendl - llinfos << " Green Bits " << S32(greenBits) << llendl - llinfos << " Blue Bits " << S32(blueBits) << llendl - llinfos << " Alpha Bits " << S32(alphaBits) << llendl - llinfos << " Depth Bits " << S32(depthBits) << llendl + llinfos << "GL buffer:" << llendl; + llinfos << " Red Bits " << S32(redBits) << llendl; + llinfos << " Green Bits " << S32(greenBits) << llendl; + llinfos << " Blue Bits " << S32(blueBits) << llendl; + llinfos << " Alpha Bits " << S32(alphaBits) << llendl; + llinfos << " Depth Bits " << S32(depthBits) << llendl; llinfos << " Stencil Bits " << S32(stencilBits) << llendl; GLint colorBits = redBits + greenBits + blueBits + alphaBits; @@ -2252,6 +2251,7 @@ BOOL LLWindowSDL::dialogColorPicker( F32 *r, F32 *g, F32 *b) GtkColorSelection *colorsel = GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG(win)->colorsel); GdkColor color, orig_color; + orig_color.pixel = 0; orig_color.red = guint16(65535 * *r); orig_color.green= guint16(65535 * *g); orig_color.blue = guint16(65535 * *b); diff --git a/indra/llxuixml/lltrans.h b/indra/llxuixml/lltrans.h index 79df5802e5..856b9e04fc 100644 --- a/indra/llxuixml/lltrans.h +++ b/indra/llxuixml/lltrans.h @@ -103,6 +103,11 @@ public: return findString(result, xml_desc, empty); } + static std::string getKeyboardString(const char* keystring) + { + // These map directly - no need to specialize + return getString( ll_safe_string(keystring) ); + } // get the default args static const LLStringUtil::format_map_t& getDefaultArgs() diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index b9e5664ff7..c402c3979a 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1025,7 +1025,7 @@ endif (DARWIN) if (LINUX) LIST(APPEND viewer_SOURCE_FILES llappviewerlinux.cpp) LIST(APPEND viewer_SOURCE_FILES llappviewerlinux_api_dbus.cpp) - LIST(APPEND CMAKE_EXE_LINKER_FLAGS -Wl,--as-needed) + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed") set(viewer_LIBRARIES Xinerama @@ -1113,7 +1113,9 @@ if (WINDOWS) SOURCE_GROUP("Resource Files" FILES ${viewer_RESOURCE_FILES}) - list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES}) + if (NOT STANDALONE) + list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES}) + endif (NOT STANDALONE) find_library(DINPUT_LIBRARY dinput8 ${DIRECTX_LIBRARY_DIR}) find_library(DXGUID_LIBRARY dxguid ${DIRECTX_LIBRARY_DIR}) @@ -1223,8 +1225,9 @@ source_group("Character File" FILES ${viewer_CHARACTER_FILES}) set_source_files_properties(${viewer_CHARACTER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) - -list(APPEND viewer_SOURCE_FILES ${viewer_CHARACTER_FILES}) +if (NOT STANDALONE) + list(APPEND viewer_SOURCE_FILES ${viewer_CHARACTER_FILES}) +endif (NOT STANDALONE) if (WINDOWS) file(GLOB viewer_INSTALLER_FILES installers/windows/*.nsi) diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini index 5d52158298..544f1c598e 100644 --- a/indra/newview/app_settings/keywords.ini +++ b/indra/newview/app_settings/keywords.ini @@ -459,6 +459,7 @@ PARCEL_FLAG_ALLOW_LANDMARK Used with llGetParcelFlags to find if a parcel allo PARCEL_FLAG_ALLOW_TERRAFORM Used with llGetParcelFlags to find if a parcel allows anyone to terraform the land PARCEL_FLAG_ALLOW_DAMAGE Used with llGetParcelFlags to find if a parcel allows damage PARCEL_FLAG_ALLOW_CREATE_OBJECTS Used with llGetParcelFlags to find if a parcel allows anyone to create objects +PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS Used with llGetParcelFlags to find if a parcel allows group members or objects to create objects PARCEL_FLAG_USE_ACCESS_GROUP Used with llGetParcelFlags to find if a parcel limits access to a group PARCEL_FLAG_USE_ACCESS_LIST Used with llGetParcelFlags to find if a parcel limits access to a list of residents PARCEL_FLAG_USE_BAN_LIST Used with llGetParcelFlags to find if a parcel uses a ban list diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index d05fd955db..467e1e8342 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1599,7 +1599,7 @@ Cursor3D Comment - Tread Joystick values as absolute positions (not deltas). + Treat Joystick values as absolute positions (not deltas). Persist 1 Type @@ -3851,6 +3851,17 @@ Value + JoystickMouselookYaw + + Comment + Pass joystick yaw to scripts in Mouselook. + Persist + 1 + Type + Boolean + Value + 1 + JoystickRunThreshold Comment @@ -4158,7 +4169,7 @@ Type Boolean Value - 0 + 1 LipSyncOoh diff --git a/indra/newview/installers/darwin/firstlook-dmg/_DS_Store b/indra/newview/installers/darwin/firstlook-dmg/_DS_Store index 6c5a3f3452cd273cc2c471151b9953ee844c4735..408a4d49925b8f6c31a1050e2f4e6c27bee6b0f0 100644 GIT binary patch delta 65 zcmZokXi3=MEnvcs!jQt)&lHiFoL9yG0gMcKY30S`Ir(|%K!L+R3>GQND9*?)0&=uB J*9)}D0{|wE5Q_i+ delta 65 zcmZokXi3=MEnvd<_fI6V$UooAiuZ#f#7#Z}^%8Sc$^7GPx0uz83EK-(HoRMDyGQND9*?)0&=uB J*9)}D0{|wE5Q_i+ delta 65 zcmZokXi3=MEnvdb{YQ{_(LdJA 0) + if (mag > 0) { - setControlFlags(AGENT_CONTROL_PITCH_POS ); + setControlFlags(AGENT_CONTROL_PITCH_POS); } - else if (direction < 0) + else if (mag < 0) { setControlFlags(AGENT_CONTROL_PITCH_NEG); } @@ -2509,10 +2509,10 @@ void LLAgent::propagate(const F32 dt) // handle rotation based on keyboard levels const F32 YAW_RATE = 90.f * DEG_TO_RAD; // radians per second - yaw( YAW_RATE * mYawKey * dt ); + yaw(YAW_RATE * mYawKey * dt); const F32 PITCH_RATE = 90.f * DEG_TO_RAD; // radians per second - pitch(PITCH_RATE * (F32) mPitchKey * dt); + pitch(PITCH_RATE * mPitchKey * dt); // handle auto-land behavior if (mAvatarObject.notNull()) @@ -2537,7 +2537,7 @@ void LLAgent::propagate(const F32 dt) mLeftKey = 0; mUpKey = 0; mYawKey = 0.f; - mPitchKey = 0; + mPitchKey = 0.f; } //----------------------------------------------------------------------------- @@ -3168,6 +3168,7 @@ void LLAgent::updateCamera() mFollowCam.copyParams(*current_cam); mFollowCam.setSubjectPositionAndRotation( mAvatarObject->getRenderPosition(), avatarRotationForFollowCam ); mFollowCam.update(); + LLViewerJoystick::getInstance()->setCameraNeedsUpdate(true); } else { @@ -4245,7 +4246,7 @@ void LLAgent::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL camera_ani { if(avatar_animate) { - // Remove any pitch from the avatar + // Remove any pitch from the avatar LLVector3 at = mFrameAgent.getAtAxis(); at.mV[VZ] = 0.f; at.normalize(); diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 5ca630f8d1..b334874e6e 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -471,7 +471,7 @@ private: S32 mLeftKey; S32 mUpKey; F32 mYawKey; - S32 mPitchKey; + F32 mPitchKey; //-------------------------------------------------------------------- // Movement from user input @@ -486,7 +486,7 @@ public: void moveLeftNudge(S32 direction); void moveUp(S32 direction); void moveYaw(F32 mag, bool reset_view = true); - void movePitch(S32 direction); + void movePitch(F32 mag); //-------------------------------------------------------------------- // Orbit diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index d47b994322..785179f7b3 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -686,8 +686,12 @@ bool LLAppViewer::init() LLUI::setupPaths(); LLTransUtil::parseStrings("strings.xml", default_trans_args); LLTransUtil::parseLanguageStrings("language_settings.xml"); - LLWeb::initClass(); // do this after LLUI + + // LLKeyboard relies on LLUI to know what some accelerator keys are called. + LLKeyboard::setStringTranslatorFunc( LLTrans::getKeyboardString ); + LLWeb::initClass(); // do this after LLUI + // Provide the text fields with callbacks for opening Urls LLUrlAction::setOpenURLCallback(&LLWeb::loadURL); LLUrlAction::setOpenURLInternalCallback(&LLWeb::loadURLInternal); @@ -1802,8 +1806,18 @@ bool LLAppViewer::initConfiguration() gSavedSettings.setString("VersionChannelName", LL_CHANNEL); #ifndef LL_RELEASE_FOR_DOWNLOAD - gSavedSettings.setBOOL("ShowConsoleWindow", TRUE); - gSavedSettings.setBOOL("AllowMultipleViewers", TRUE); + // provide developer build only overrides for these control variables that are not + // persisted to settings.xml + LLControlVariable* c = gSavedSettings.getControl("ShowConsoleWindow"); + if (c) + { + c->setValue(true, false); + } + c = gSavedSettings.getControl("AllowMultipleViewers"); + if (c) + { + c->setValue(true, false); + } #endif //*FIX:Mani - Set default to disabling watchdog mainloop diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index ed291c16a8..d34bcb4a68 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -188,7 +188,7 @@ static inline BOOL do_basic_glibc_backtrace() for (i = 0; i < size; i++) { // the format of the StraceFile is very specific, to allow (kludgy) machine-parsing - fprintf(StraceFile, "%-3d ", i); + fprintf(StraceFile, "%-3lu ", (unsigned long)i); fprintf(StraceFile, "%-32s\t", "unknown"); fprintf(StraceFile, "%p ", stackarray[i]); fprintf(StraceFile, "%s\n", strings[i]); @@ -263,7 +263,7 @@ static inline BOOL do_elfio_glibc_backtrace() for (btpos = 0; btpos < btsize; ++btpos) { // the format of the StraceFile is very specific, to allow (kludgy) machine-parsing - fprintf(StraceFile, "%-3d ", btpos); + fprintf(StraceFile, "%-3ld ", (long)btpos); int symidx; for (symidx = 0; symidx < nSymNo; ++symidx) { @@ -354,7 +354,7 @@ bool LLAppViewerLinux::init() bool LLAppViewerLinux::restoreErrorTrap() { - // *NOTE:Mani there is a case for implementing this or the mac. + // *NOTE:Mani there is a case for implementing this on the mac. // Linux doesn't need it to my knowledge. return true; } @@ -727,8 +727,26 @@ std::string LLAppViewerLinux::generateSerialNumber() { char serial_md5[MD5HEX_STR_SIZE]; serial_md5[0] = 0; + std::string best; + std::string uuiddir("/dev/disk/by-uuid/"); - // TODO + // trawl /dev/disk/by-uuid looking for a good-looking UUID to grab + std::string this_name; + BOOL wrap = FALSE; + while (gDirUtilp->getNextFileInDir(uuiddir, "*", this_name, wrap)) + { + if (this_name.length() > best.length() || + (this_name.length() == best.length() && + this_name > best)) + { + // longest (and secondarily alphabetically last) so far + best = this_name; + } + } + + // we don't return the actual serial number, just a hash of it. + LLMD5 md5( reinterpret_cast(best.c_str()) ); + md5.hex_digest(serial_md5); return serial_md5; } diff --git a/indra/newview/llappviewerlinux.h b/indra/newview/llappviewerlinux.h index 365fcfeb6b..230c0dc24b 100644 --- a/indra/newview/llappviewerlinux.h +++ b/indra/newview/llappviewerlinux.h @@ -33,9 +33,12 @@ #ifndef LL_LLAPPVIEWERLINUX_H #define LL_LLAPPVIEWERLINUX_H -#if LL_DBUS_ENABLED extern "C" { # include +} + +#if LL_DBUS_ENABLED +extern "C" { # include # include } diff --git a/indra/newview/llappviewerlinux_api_dbus.cpp b/indra/newview/llappviewerlinux_api_dbus.cpp index ee160d0151..da67493e67 100644 --- a/indra/newview/llappviewerlinux_api_dbus.cpp +++ b/indra/newview/llappviewerlinux_api_dbus.cpp @@ -41,9 +41,9 @@ extern "C" { #include "apr_dso.h" } -#define DEBUGMSG(...) lldebugs << llformat(__VA_ARGS__) << llendl -#define INFOMSG(...) llinfos << llformat(__VA_ARGS__) << llendl -#define WARNMSG(...) llwarns << llformat(__VA_ARGS__) << llendl +#define DEBUGMSG(...) do { lldebugs << llformat(__VA_ARGS__) << llendl; } while(0) +#define INFOMSG(...) do { llinfos << llformat(__VA_ARGS__) << llendl; } while(0) +#define WARNMSG(...) do { llwarns << llformat(__VA_ARGS__) << llendl; } while(0) #define LL_DBUS_SYM(REQUIRED, DBUSSYM, RTN, ...) RTN (*ll##DBUSSYM)(__VA_ARGS__) = NULL #include "llappviewerlinux_api_dbus_syms_raw.inc" diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 2b3939d92f..1282e437f2 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -159,15 +159,7 @@ bool LLAppViewerMacOSX::initParseCommandLine(LLCommandLineParser& clp) clp.addOptionDesc("psn", NULL, 1, "MacOSX process serial number"); clp.setCustomParser(parse_psn); - // First parse the command line, not often used on the mac. - if(clp.parseCommandLine(gArgC, gArgV) == false) - { - return false; - } - - // Now read in the args from arguments txt. - // Succesive calls to clp.parse... will NOT override earlier - // options. + // First read in the args from arguments txt. const char* filename = "arguments.txt"; llifstream ifs(filename, llifstream::binary); if (!ifs.is_open()) @@ -180,7 +172,14 @@ bool LLAppViewerMacOSX::initParseCommandLine(LLCommandLineParser& clp) { return false; } - + + // Then parse the user's command line, so that any --url arg can appear last + // Succesive calls to clp.parse... will NOT override earlier options. + if(clp.parseCommandLine(gArgC, gArgV) == false) + { + return false; + } + // Get the user's preferred language string based on the Mac OS localization mechanism. // To add a new localization: // go to the "Resources" section of the project diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp index f56359afc3..21e17cc207 100644 --- a/indra/newview/lldrawpoolwater.cpp +++ b/indra/newview/lldrawpoolwater.cpp @@ -369,7 +369,7 @@ void LLDrawPoolWater::shade() LLVector3 light_dir; LLColor3 light_color; - if (gSky.getSunDirection().mV[2] > NIGHTTIME_ELEVATION_COS) + if (gSky.getSunDirection().mV[2] > LLSky::NIGHTTIME_ELEVATION_COS) { light_dir = gSky.getSunDirection(); light_dir.normVec(); diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp index c062e6ccf2..55b7ed0c99 100644 --- a/indra/newview/llfloateranimpreview.cpp +++ b/indra/newview/llfloateranimpreview.cpp @@ -426,8 +426,8 @@ void LLFloaterAnimPreview::resetMotion() LLUUID base_id = mIDList[childGetValue("preview_base_anim").asString()]; avatarp->deactivateAllMotions(); - avatarp->startMotion(base_id, BASE_ANIM_TIME_OFFSET); avatarp->startMotion(mMotionID, 0.0f); + avatarp->startMotion(base_id, BASE_ANIM_TIME_OFFSET); childSetValue("playback_slider", 0.0f); // Set pose @@ -638,10 +638,10 @@ void LLFloaterAnimPreview::onCommitBaseAnim(LLUICtrl* ctrl, void* data) BOOL paused = avatarp->areAnimationsPaused(); // stop all other possible base motions - avatarp->stopMotion(ANIM_AGENT_STAND, TRUE); - avatarp->stopMotion(ANIM_AGENT_WALK, TRUE); - avatarp->stopMotion(ANIM_AGENT_SIT, TRUE); - avatarp->stopMotion(ANIM_AGENT_HOVER, TRUE); + avatarp->stopMotion(previewp->mIDList["Standing"], TRUE); + avatarp->stopMotion(previewp->mIDList["Walking"], TRUE); + avatarp->stopMotion(previewp->mIDList["Sitting"], TRUE); + avatarp->stopMotion(previewp->mIDList["Flying"], TRUE); previewp->resetMotion(); diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp index da2a4d9d93..cb0d304aa0 100644 --- a/indra/newview/llfloaterauction.cpp +++ b/indra/newview/llfloaterauction.cpp @@ -33,6 +33,7 @@ #include "llviewerprecompiledheaders.h" #include "llfloaterauction.h" +#include "llfloaterregioninfo.h" #include "lldir.h" #include "llgl.h" @@ -56,6 +57,7 @@ #include "llviewercontrol.h" #include "llui.h" #include "llrender.h" +#include "llsdutil.h" ///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs @@ -77,7 +79,9 @@ LLFloaterAuction::LLFloaterAuction(const LLSD& key) { // LLUICtrlFactory::getInstance()->buildFloater(this, "floater_auction.xml"); mCommitCallbackRegistrar.add("ClickSnapshot", boost::bind(&LLFloaterAuction::onClickSnapshot, this)); - mCommitCallbackRegistrar.add("ClickOK", boost::bind(&LLFloaterAuction::onClickOK, this)); + mCommitCallbackRegistrar.add("ClickSellToAnyone", boost::bind(&LLFloaterAuction::onClickSellToAnyone, this)); + mCommitCallbackRegistrar.add("ClickStartAuction", boost::bind(&LLFloaterAuction::onClickStartAuction, this)); + mCommitCallbackRegistrar.add("ClickResetParcel", boost::bind(&LLFloaterAuction::onClickResetParcel, this)); } // Destroys the object @@ -97,6 +101,8 @@ void LLFloaterAuction::onOpen(const LLSD& key) void LLFloaterAuction::initialize() { + mParcelUpdateCapUrl.clear(); + mParcelp = LLViewerParcelMgr::getInstance()->getParcelSelection(); LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion(); LLParcel* parcelp = mParcelp->getParcel(); @@ -104,10 +110,23 @@ void LLFloaterAuction::initialize() { mParcelHost = region->getHost(); mParcelID = parcelp->getLocalID(); + mParcelUpdateCapUrl = region->getCapability("ParcelPropertiesUpdate"); childSetText("parcel_text", parcelp->getName()); childEnable("snapshot_btn"); - childEnable("ok_btn"); + childEnable("reset_parcel_btn"); + childEnable("start_auction_btn"); + + LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate(); + if (panel) + { // Only enable "Sell to Anyone" on Teen grid or if we don't know the ID yet + U32 estate_id = panel->getEstateID(); + childSetEnabled("sell_to_anyone_btn", (estate_id == ESTATE_TEEN || estate_id == 0)); + } + else + { // Don't have the panel up, so don't know if we're on the teen grid or not. Default to enabling it + childEnable("sell_to_anyone_btn"); + } } else { @@ -122,8 +141,11 @@ void LLFloaterAuction::initialize() } mParcelID = -1; childSetEnabled("snapshot_btn", false); - childSetEnabled("ok_btn", false); + childSetEnabled("reset_parcel_btn", false); + childSetEnabled("sell_to_anyone_btn", false); + childSetEnabled("start_auction_btn", false); } + mImageID.setNull(); mImage = NULL; } @@ -205,7 +227,7 @@ void LLFloaterAuction::onClickSnapshot(void* data) } // static -void LLFloaterAuction::onClickOK(void* data) +void LLFloaterAuction::onClickStartAuction(void* data) { LLFloaterAuction* self = (LLFloaterAuction*)(data); @@ -244,11 +266,264 @@ void LLFloaterAuction::onClickOK(void* data) msg->sendReliable(self->mParcelHost); // clean up floater, and get out - self->mImageID.setNull(); - self->mImage = NULL; - self->mParcelID = -1; - self->mParcelHost.invalidate(); - self->closeFloater(); + self->cleanupAndClose(); +} + + +void LLFloaterAuction::cleanupAndClose() +{ + mImageID.setNull(); + mImage = NULL; + mParcelID = -1; + mParcelHost.invalidate(); + closeFloater(); +} + + + +// static glue +void LLFloaterAuction::onClickResetParcel(void* data) +{ + LLFloaterAuction* self = (LLFloaterAuction*)(data); + if (self) + { + self->doResetParcel(); + } +} + + +// Reset all the values for the parcel in preparation for a sale +void LLFloaterAuction::doResetParcel() +{ + LLParcel* parcelp = mParcelp->getParcel(); + LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion(); + + if (parcelp + && region + && !mParcelUpdateCapUrl.empty()) + { + LLSD body; + std::string empty; + + // request new properties update from simulator + U32 message_flags = 0x01; + body["flags"] = ll_sd_from_U32(message_flags); + + // Set all the default parcel properties for auction + body["local_id"] = parcelp->getLocalID(); + + U32 parcel_flags = PF_ALLOW_LANDMARK | + PF_ALLOW_FLY | + PF_CREATE_GROUP_OBJECTS | + PF_ALLOW_ALL_OBJECT_ENTRY | + PF_ALLOW_GROUP_OBJECT_ENTRY | + PF_ALLOW_GROUP_SCRIPTS | + PF_RESTRICT_PUSHOBJECT | + PF_SOUND_LOCAL | + PF_ALLOW_VOICE_CHAT | + PF_USE_ESTATE_VOICE_CHAN; + + body["parcel_flags"] = ll_sd_from_U32(parcel_flags); + + // Build a parcel name like "Ahern (128,128) PG 4032m" + std::ostringstream parcel_name; + LLVector3 center_point( parcelp->getCenterpoint() ); + center_point.snap(0); // Get rid of fractions + parcel_name << region->getName() + << " (" + << (S32) center_point.mV[VX] + << "," + << (S32) center_point.mV[VY] + << ") " + << region->getSimAccessString() + << " " + << parcelp->getArea() + << "m"; + + std::string new_name(parcel_name.str().c_str()); + body["name"] = new_name; + childSetText("parcel_text", new_name); // Set name in dialog as well, since it won't get updated otherwise + + body["sale_price"] = (S32) 0; + body["description"] = empty; + body["music_url"] = empty; + body["media_url"] = empty; + body["media_desc"] = empty; + body["media_type"] = std::string("none/none"); + body["media_width"] = (S32) 0; + body["media_height"] = (S32) 0; + body["auto_scale"] = (S32) 0; + body["media_loop"] = (S32) 0; + body["obscure_media"] = (S32) 0; + body["obscure_music"] = (S32) 0; + body["media_id"] = LLUUID::null; + body["group_id"] = MAINTENANCE_GROUP_ID; // Use maintenance group + body["pass_price"] = (S32) 10; // Defaults to $10 + body["pass_hours"] = 0.0f; + body["category"] = (U8) LLParcel::C_NONE; + body["auth_buyer_id"] = LLUUID::null; + body["snapshot_id"] = LLUUID::null; + body["user_location"] = ll_sd_from_vector3( LLVector3::zero ); + body["user_look_at"] = ll_sd_from_vector3( LLVector3::zero ); + body["landing_type"] = (U8) LLParcel::L_DIRECT; + + llinfos << "Sending parcel update to reset for auction via capability to: " + << mParcelUpdateCapUrl << llendl; + LLHTTPClient::post(mParcelUpdateCapUrl, body, new LLHTTPClient::Responder()); + + // Send a message to clear the object return time + LLMessageSystem *msg = gMessageSystem; + msg->newMessageFast(_PREHASH_ParcelSetOtherCleanTime); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_ParcelData); + msg->addS32Fast(_PREHASH_LocalID, parcelp->getLocalID()); + msg->addS32Fast(_PREHASH_OtherCleanTime, 5); // 5 minute object auto-return + + msg->sendReliable(region->getHost()); + + // Clear the access lists + clearParcelAccessLists(parcelp, region); + } +} + + + +void LLFloaterAuction::clearParcelAccessLists(LLParcel* parcel, LLViewerRegion* region) +{ + if (!region || !parcel) return; + + LLUUID transactionUUID; + transactionUUID.generate(); + + LLMessageSystem* msg = gMessageSystem; + + // Clear access list + // parcel->mAccessList.clear(); + + msg->newMessageFast(_PREHASH_ParcelAccessListUpdate); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); + msg->nextBlockFast(_PREHASH_Data); + msg->addU32Fast(_PREHASH_Flags, AL_ACCESS); + msg->addS32(_PREHASH_LocalID, parcel->getLocalID() ); + msg->addUUIDFast(_PREHASH_TransactionID, transactionUUID); + msg->addS32Fast(_PREHASH_SequenceID, 1); // sequence_id + msg->addS32Fast(_PREHASH_Sections, 0); // num_sections + + // pack an empty block since there will be no data + msg->nextBlockFast(_PREHASH_List); + msg->addUUIDFast(_PREHASH_ID, LLUUID::null ); + msg->addS32Fast(_PREHASH_Time, 0 ); + msg->addU32Fast(_PREHASH_Flags, 0 ); + + msg->sendReliable( region->getHost() ); + + // Send message for empty ban list + //parcel->mBanList.clear(); + msg->newMessageFast(_PREHASH_ParcelAccessListUpdate); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); + msg->nextBlockFast(_PREHASH_Data); + msg->addU32Fast(_PREHASH_Flags, AL_BAN); + msg->addS32(_PREHASH_LocalID, parcel->getLocalID() ); + msg->addUUIDFast(_PREHASH_TransactionID, transactionUUID); + msg->addS32Fast(_PREHASH_SequenceID, 1); // sequence_id + msg->addS32Fast(_PREHASH_Sections, 0); // num_sections + + // pack an empty block since there will be no data + msg->nextBlockFast(_PREHASH_List); + msg->addUUIDFast(_PREHASH_ID, LLUUID::null ); + msg->addS32Fast(_PREHASH_Time, 0 ); + msg->addU32Fast(_PREHASH_Flags, 0 ); + + msg->sendReliable( region->getHost() ); +} + + + +// static - 'Sell to Anyone' clicked, throw up a confirmation dialog +void LLFloaterAuction::onClickSellToAnyone(void* data) +{ + LLFloaterAuction* self = (LLFloaterAuction*)(data); + if (self) + { + LLParcel* parcelp = self->mParcelp->getParcel(); + + // Do a confirmation + S32 sale_price = parcelp->getArea(); // Selling for L$1 per meter + S32 area = parcelp->getArea(); + + LLSD args; + args["LAND_SIZE"] = llformat("%d", area); + args["SALE_PRICE"] = llformat("%d", sale_price); + args["NAME"] = "Anyone"; + + LLNotification::Params params("ConfirmLandSaleChange"); // Re-use existing dialog + params.substitutions(args) + .functor.function(boost::bind(&LLFloaterAuction::onSellToAnyoneConfirmed, self, _1, _2)); + + params.name("ConfirmLandSaleToAnyoneChange"); + + // ask away + LLNotifications::instance().add(params); + } +} + + +// Sell confirmation clicked +bool LLFloaterAuction::onSellToAnyoneConfirmed(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + if (option == 0) + { + doSellToAnyone(); + } + + return false; +} + + + +// Reset all the values for the parcel in preparation for a sale +void LLFloaterAuction::doSellToAnyone() +{ + LLParcel* parcelp = mParcelp->getParcel(); + LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion(); + + if (parcelp + && region + && !mParcelUpdateCapUrl.empty()) + { + LLSD body; + std::string empty; + + // request new properties update from simulator + U32 message_flags = 0x01; + body["flags"] = ll_sd_from_U32(message_flags); + + // Set all the default parcel properties for auction + body["local_id"] = parcelp->getLocalID(); + + // Set 'for sale' flag + U32 parcel_flags = parcelp->getParcelFlags() | PF_FOR_SALE; + // Ensure objects not included + parcel_flags &= ~PF_FOR_SALE_OBJECTS; + body["parcel_flags"] = ll_sd_from_U32(parcel_flags); + + body["sale_price"] = parcelp->getArea(); // Sell for L$1 per square meter + body["auth_buyer_id"] = LLUUID::null; // To anyone + + llinfos << "Sending parcel update to sell to anyone for L$1 via capability to: " + << mParcelUpdateCapUrl << llendl; + LLHTTPClient::post(mParcelUpdateCapUrl, body, new LLHTTPClient::Responder()); + + // clean up floater, and get out + cleanupAndClose(); + } } diff --git a/indra/newview/llfloaterauction.h b/indra/newview/llfloaterauction.h index 1acc08057c..c599af782d 100644 --- a/indra/newview/llfloaterauction.h +++ b/indra/newview/llfloaterauction.h @@ -45,6 +45,8 @@ // Class which holds the functionality to start auctions. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLParcelSelection; +class LLParcel; +class LLViewerRegion; class LLFloaterAuction : public LLFloater { @@ -62,16 +64,28 @@ private: void initialize(); static void onClickSnapshot(void* data); - static void onClickOK(void* data); + static void onClickResetParcel(void* data); + static void onClickSellToAnyone(void* data); // Sell to anyone clicked + bool onSellToAnyoneConfirmed(const LLSD& notification, const LLSD& response); // Sell confirmation clicked + static void onClickStartAuction(void* data); /*virtual*/ BOOL postBuild(); + + void doResetParcel(); + void doSellToAnyone(); + void clearParcelAccessLists( LLParcel* parcel, LLViewerRegion* region ); + void cleanupAndClose(); + private: + LLTransactionID mTransactionID; LLAssetID mImageID; LLPointer mImage; LLSafeHandle mParcelp; S32 mParcelID; LLHost mParcelHost; + + std::string mParcelUpdateCapUrl; // "ParcelPropertiesUpdate" capability }; diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index 890d863db7..ccfe7d4b64 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -69,7 +69,7 @@ LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(callback_t callback, // Default constructor LLFloaterAvatarPicker::LLFloaterAvatarPicker(const LLSD& key) : LLFloater(key), - mResultsReturned(FALSE), + mNumResultsReturned(0), mCallback(NULL), mCallbackUserdata(NULL), mNearMeListComplete(FALSE), @@ -314,7 +314,7 @@ void LLFloaterAvatarPicker::find() getChild("SearchResults")->setCommentText(getString("searching")); childSetEnabled("Select", FALSE); - mResultsReturned = FALSE; + mNumResultsReturned = 0; } void LLFloaterAvatarPicker::setAllowMultiple(BOOL allow_multiple) @@ -349,9 +349,10 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void* LLScrollListCtrl* search_results = floater->getChild("SearchResults"); // clear "Searching" label on first results - search_results->deleteAllItems(); - - floater->mResultsReturned = TRUE; + if (floater->mNumResultsReturned++ == 0) + { + search_results->deleteAllItems(); + } BOOL found_one = FALSE; S32 num_new_rows = msg->getNumberOfBlocks("Data"); diff --git a/indra/newview/llfloateravatarpicker.h b/indra/newview/llfloateravatarpicker.h index f3b9aefb9c..85aacb68a5 100644 --- a/indra/newview/llfloateravatarpicker.h +++ b/indra/newview/llfloateravatarpicker.h @@ -76,7 +76,7 @@ private: virtual BOOL handleKeyHere(KEY key, MASK mask); LLUUID mQueryID; - BOOL mResultsReturned; + int mNumResultsReturned; BOOL mNearMeListComplete; BOOL mCloseOnSelect; diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index e0fe87f9ae..1300103423 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -211,25 +211,16 @@ void LLFloaterGesture::buildGestureList() std::string key_string = LLKeyboard::stringFromKey(gesture->mKey); std::string buffer; + if (gesture->mKey == KEY_NONE) { - if (gesture->mKey == KEY_NONE) - { - buffer = "---"; - key_string = "~~~"; // alphabetize to end - } - else - { - if (gesture->mMask & MASK_CONTROL) buffer.append("Ctrl-"); - if (gesture->mMask & MASK_ALT) buffer.append("Alt-"); - if (gesture->mMask & MASK_SHIFT) buffer.append("Shift-"); - if ((gesture->mMask & (MASK_CONTROL|MASK_ALT|MASK_SHIFT)) && - (key_string[0] == '-' || key_string[0] == '=')) - { - buffer.append(" "); - } - buffer.append(key_string); - } + buffer = "---"; + key_string = "~~~"; // alphabetize to end } + else + { + buffer = LLKeyboard::stringFromAccelerator( gesture->mMask, gesture->mKey ); + } + element["columns"][1]["column"] = "shortcut"; element["columns"][1]["value"] = buffer; element["columns"][1]["font"]["name"] = "SANSSERIF"; diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index a378a511b5..c1031ee437 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -105,7 +105,7 @@ public: // LLFloaterLand //--------------------------------------------------------------------------- -void send_parcel_select_objects(S32 parcel_local_id, S32 return_type, +void send_parcel_select_objects(S32 parcel_local_id, U32 return_type, uuid_list_t* return_ids = NULL) { LLMessageSystem *msg = gMessageSystem; @@ -123,7 +123,7 @@ void send_parcel_select_objects(S32 parcel_local_id, S32 return_type, msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID()); msg->nextBlockFast(_PREHASH_ParcelData); msg->addS32Fast(_PREHASH_LocalID, parcel_local_id); - msg->addS32Fast(_PREHASH_ReturnType, return_type); + msg->addU32Fast(_PREHASH_ReturnType, return_type); // Throw all return ids into the packet. // TODO: Check for too many ids. diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 1ec869da73..70a3ad5252 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -143,6 +143,7 @@ BOOL LLFloaterReporter::postBuild() LLViewerRegion *regionp = gAgent.getRegion(); if (regionp) { + childSetText("sim_field", regionp->getName()); pos -= regionp->getOriginGlobal(); } setPosBox(pos); diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp index 43d31aa30a..2d8ccd1aef 100644 --- a/indra/newview/llfloatersellland.cpp +++ b/indra/newview/llfloatersellland.cpp @@ -47,7 +47,7 @@ #include "llviewerwindow.h" // defined in llfloaterland.cpp -void send_parcel_select_objects(S32 parcel_local_id, S32 return_type, +void send_parcel_select_objects(S32 parcel_local_id, U32 return_type, uuid_list_t* return_ids = NULL); enum Badge { BADGE_OK, BADGE_NOTE, BADGE_WARN, BADGE_ERROR }; diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index b64d8ab334..e00b352c9b 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -417,6 +417,11 @@ void LLFloaterTools::refresh() LLResMgr::getInstance()->getIntegerString(prim_count_string, LLSelectMgr::getInstance()->getSelection()->getObjectCount()); childSetTextArg("prim_count", "[COUNT]", prim_count_string); + // disable the object and prim counts if nothing selected + bool have_selection = ! LLSelectMgr::getInstance()->getSelection()->isEmpty(); + childSetEnabled("obj_count", have_selection); + childSetEnabled("prim_count", have_selection); + // Refresh child tabs mPanelPermissions->refresh(); mPanelObject->refresh(); diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index d653d44f8c..b7e8835fb8 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -49,6 +49,7 @@ #include "llfirstuse.h" #include "llfloaterreg.h" // getTypedInstance() #include "llfocusmgr.h" +#include "llinventorymodel.h" #include "lllandmarklist.h" #include "lllineeditor.h" #include "llregionhandle.h" @@ -57,7 +58,7 @@ #include "lltabcontainer.h" #include "lltextbox.h" #include "lltracker.h" -#include "llinventorymodel.h" +#include "lltrans.h" #include "llviewerinventory.h" // LLViewerInventoryItem #include "llviewermenu.h" #include "llviewerregion.h" @@ -151,7 +152,6 @@ LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key) mFriendObserver(NULL), mCompletingRegionName(""), mWaitingForTracker(FALSE), - mExactMatch(FALSE), mIsClosing(FALSE), mSetToUserPosition(TRUE), mTrackedLocation(0,0,0), @@ -903,7 +903,6 @@ void LLFloaterWorldMap::clearLocationSelection(BOOL clear_ui) } LLWorldMap::getInstance()->mIsTrackingCommit = FALSE; mCompletingRegionName = ""; - mExactMatch = FALSE; } @@ -1163,7 +1162,6 @@ void LLFloaterWorldMap::onLocationCommit() LLStringUtil::toLower(str); mCompletingRegionName = str; LLWorldMap::getInstance()->mIsTrackingCommit = TRUE; - mExactMatch = FALSE; if (str.length() >= 3) { LLWorldMap::getInstance()->sendNamedRegionRequest(str); @@ -1418,11 +1416,10 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim) LLScrollListCtrl *list = getChild("search_results"); list->operateOnAll(LLCtrlListInterface::OP_DELETE); - LLSD selected_value = list->getSelectedValue(); - S32 name_length = mCompletingRegionName.length(); - BOOL match_found = FALSE; + LLSD match; + S32 num_results = 0; std::map::const_iterator it; for (it = LLWorldMap::getInstance()->mSimInfoMap.begin(); it != LLWorldMap::getInstance()->mSimInfoMap.end(); ++it) @@ -1434,15 +1431,11 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim) if (sim_name_lower.substr(0, name_length) == mCompletingRegionName) { - if (LLWorldMap::getInstance()->mIsTrackingCommit) + if (sim_name_lower == mCompletingRegionName) { - if (sim_name_lower == mCompletingRegionName) - { - selected_value = sim_name; - match_found = TRUE; - } + match = sim_name; } - + LLSD value; value["id"] = sim_name; value["columns"][0]["column"] = "sim_name"; @@ -1451,29 +1444,24 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim) num_results++; } } - - list->selectByValue(selected_value); if (found_null_sim) { mCompletingRegionName = ""; } - if (match_found) + // if match found, highlight it and go + if (!match.isUndefined()) { - mExactMatch = TRUE; + list->selectByValue(match); childSetFocus("search_results"); onCommitSearchResult(); } - else if (!mExactMatch && num_results > 0) + + // if we found nothing, say "none" + if (num_results == 0) { - list->selectFirstItem(); // select first item by default - childSetFocus("search_results"); - onCommitSearchResult(); - } - else if (num_results == 0) - { - list->setCommentText(std::string("None found.")); + list->setCommentText(LLTrans::getString("worldmap_results_none_found")); list->operateOnAll(LLCtrlListInterface::OP_DESELECT); } } diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h index 6d5b7543d4..20a8e6d321 100644 --- a/indra/newview/llfloaterworldmap.h +++ b/indra/newview/llfloaterworldmap.h @@ -174,7 +174,6 @@ protected: std::string mCompletingRegionName; std::string mLastRegionName; BOOL mWaitingForTracker; - BOOL mExactMatch; BOOL mIsClosing; BOOL mSetToUserPosition; diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index 99f331d087..c2d515f158 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -1654,6 +1654,8 @@ void LLFloaterIMPanel::sendMsg() LLWString text = mInputEditor->getConvertedText(); if(!text.empty()) { + // store sent line in history, duplicates will get filtered + if (mInputEditor) mInputEditor->updateHistory(); // Truncate and convert to UTF8 for transport std::string utf8_text = wstring_to_utf8str(text); utf8_text = utf8str_truncate(utf8_text, MAX_MSG_BUF_SIZE - 1); diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index d4a9324208..1880a574a7 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2316,6 +2316,8 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); + mItems.clear(); //adding code to clear out member Items (which means Items should not have other data here at this point) + mDisabledItems.clear(); //adding code to clear out disabled members from previous if (lost_and_found_id == mUUID) { // This is the lost+found folder. diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index b4d3f4575b..7ec8d3d003 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -131,6 +131,13 @@ BOOL LLInventoryFilter::check(LLFolderViewItem* item) && (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos) && ((listener->getPermissionMask() & mFilterOps.mPermissions) == mFilterOps.mPermissions) && (listener->getCreationDate() >= earliest && listener->getCreationDate() <= mFilterOps.mMaxDate); + + BOOL is_folder = (dynamic_cast(item) != NULL); + if (is_folder && mFilterOps.mShowFolderState == LLInventoryFilter::SHOW_ALL_FOLDERS) + { + passed = TRUE; + } + return passed; } diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp index 14a8b7cb59..c99e67be3f 100644 --- a/indra/newview/llmaniprotate.cpp +++ b/indra/newview/llmaniprotate.cpp @@ -1234,9 +1234,9 @@ LLVector3 LLManipRotate::getConstraintAxis() else { #ifndef LL_RELEASE_FOR_DOWNLOAD - llerrs << "Got bogus hit part in LLManipRotate::getConstraintAxis():" << mManipPart << llendl + llerrs << "Got bogus hit part in LLManipRotate::getConstraintAxis():" << mManipPart << llendl; #else - llwarns << "Got bogus hit part in LLManipRotate::getConstraintAxis():" << mManipPart << llendl + llwarns << "Got bogus hit part in LLManipRotate::getConstraintAxis():" << mManipPart << llendl; #endif axis.mV[0] = 1.f; } diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index e2281743c9..206d8428be 100644 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -101,14 +101,13 @@ void LLPanelGroupTab::handleClickHelp() } LLPanelGroup::LLPanelGroup() -: LLPanel() - ,LLGroupMgrObserver( LLUUID() ) - ,mAllowEdit(TRUE) +: LLPanel(), + LLGroupMgrObserver( LLUUID() ), + mAllowEdit( TRUE ) { // Set up the factory callbacks. // Roles sub tabs LLGroupMgr::getInstance()->addObserver(this); - } @@ -247,6 +246,7 @@ void LLPanelGroup::onBackBtnClick() } } + void LLPanelGroup::onBtnCreate() { LLPanelGroupGeneral* panel_general = findChild("group_general_tab_panel"); diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index 0331fad60c..a6b67d668a 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -186,7 +186,7 @@ BOOL LLPanelGroupGeneral::postBuild() } mIncompleteMemberDataStr = getString("incomplete_member_data_str"); - + // If the group_id is null, then we are creating a new group if (mGroupID.isNull()) { diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index 32ed20bd56..ab2afb8056 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -1178,7 +1178,7 @@ void LLPreviewGesture::onSaveComplete(const LLUUID& asset_uuid, void* user_data, else { llwarns << "Inventory item for gesture " << info->mItemUUID - << " is no longer in agent inventory." << llendl + << " is no longer in agent inventory." << llendl; } } else diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 19bb60b237..ac7abf1448 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -1260,7 +1260,7 @@ void LLPreviewLSL::onSaveComplete(const LLUUID& asset_uuid, void* user_data, S32 else { llwarns << "Inventory item for script " << info->mItemUUID - << " is no longer in agent inventory." << llendl + << " is no longer in agent inventory." << llendl; } // Find our window and close it if requested. @@ -1383,6 +1383,7 @@ void LLPreviewLSL::onLoadComplete( LLVFS *vfs, const LLUUID& asset_uuid, LLAsset delete item_uuid; } + /// --------------------------------------------------------------------------- /// LLLiveLSLEditor /// --------------------------------------------------------------------------- @@ -2145,6 +2146,7 @@ void LLLiveLSLEditor::processScriptRunningReply(LLMessageSystem* msg, void**) } } + void LLLiveLSLEditor::onMonoCheckboxClicked(LLUICtrl*, void* userdata) { LLLiveLSLEditor* self = static_cast(userdata); diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 9d7338c111..9c21faa3be 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -38,6 +38,7 @@ #include "llagent.h" #include "llbutton.h" +#include "llcombobox.h" #include "llfilepicker.h" #include "llfloaterreg.h" #include "llimagetga.h" @@ -57,6 +58,10 @@ const S32 CLIENT_RECT_VPAD = 4; const F32 SECONDS_TO_SHOW_FILE_SAVED_MSG = 8.f; +const F32 PREVIEW_TEXTURE_MAX_ASPECT = 200.f; +const F32 PREVIEW_TEXTURE_MIN_ASPECT = 0.005f; + + LLPreviewTexture::LLPreviewTexture(const LLSD& key) : LLPreview( key ), mLoadingFullImage( FALSE ), @@ -65,7 +70,8 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key) mIsCopyable(FALSE), mUpdateDimensions(TRUE), mLastHeight(0), - mLastWidth(0) + mLastWidth(0), + mAspectRatio(0.f) { const LLInventoryItem *item = getItem(); if(item) @@ -144,6 +150,10 @@ BOOL LLPreviewTexture::postBuild() } } + childSetCommitCallback("combo_aspect_ratio", onAspectRatioCommit, this); + LLComboBox* combo = getChild("combo_aspect_ratio"); + combo->setCurrentByIndex(0); + return LLPreview::postBuild(); } @@ -369,8 +379,13 @@ void LLPreviewTexture::updateDimensions() S32 max_client_width = gViewerWindow->getWindowWidth() - horiz_pad; S32 max_client_height = gViewerWindow->getWindowHeight() - vert_pad; + if (mAspectRatio > 0.f) + { + client_height = llceil((F32)client_width / mAspectRatio); + } + while ((client_width > max_client_width) || - (client_height > max_client_height ) ) + (client_height > max_client_height )) { client_width /= 2; client_height /= 2; @@ -383,12 +398,12 @@ void LLPreviewTexture::updateDimensions() childSetTextArg("dimensions", "[WIDTH]", llformat("%d", mImage->getFullWidth())); childSetTextArg("dimensions", "[HEIGHT]", llformat("%d", mImage->getFullHeight())); - // add space for dimensions + // add space for dimensions and aspect ratio S32 info_height = 0; - LLRect dim_rect; - childGetRect("dimensions", dim_rect); - S32 dim_height = dim_rect.getHeight(); - info_height += dim_height + CLIENT_RECT_VPAD; + LLRect aspect_rect; + childGetRect("combo_aspect_ratio", aspect_rect); + S32 aspect_height = aspect_rect.getHeight(); + info_height += aspect_height + CLIENT_RECT_VPAD; view_height += info_height; S32 button_height = 0; @@ -445,24 +460,96 @@ void LLPreviewTexture::updateDimensions() else { client_width = getRect().getWidth() - horiz_pad; - client_height = getRect().getHeight() - vert_pad; + if (mAspectRatio > 0) + { + client_height = llround(client_width / mAspectRatio); + } + else + { + client_height = getRect().getHeight() - vert_pad; + } } - S32 max_height = getRect().getHeight() - PREVIEW_BORDER - button_height + S32 max_height = getRect().getHeight() - PREVIEW_BORDER - button_height - CLIENT_RECT_VPAD - info_height - CLIENT_RECT_VPAD - PREVIEW_HEADER_SIZE; - S32 max_width = getRect().getWidth() - horiz_pad; - client_height = llclamp(client_height, 1, max_height); - client_width = llclamp(client_width, 1, max_width); + if (mAspectRatio > 0.f) + { + max_height = llmax(max_height, 1); + + if (client_height > max_height) + { + client_height = max_height; + client_width = llround(client_height * mAspectRatio); + } + } + else + { + S32 max_width = getRect().getWidth() - horiz_pad; + + client_height = llclamp(client_height, 1, max_height); + client_width = llclamp(client_width, 1, max_width); + } LLRect window_rect(0, getRect().getHeight(), getRect().getWidth(), 0); window_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD); window_rect.mBottom += PREVIEW_BORDER + button_height + CLIENT_RECT_VPAD + info_height + CLIENT_RECT_VPAD; - mClientRect.setLeftTopAndSize(window_rect.getCenterX() - (client_width / 2), window_rect.mTop, client_width, client_height); + mClientRect.setLeftTopAndSize(window_rect.getCenterX() - (client_width / 2), window_rect.mTop, client_width, client_height); + + // Hide the aspect ratio label if the window is too narrow + // Assumes the label should be to the right of the dimensions + LLRect dim_rect, aspect_label_rect; + childGetRect("aspect_ratio", aspect_label_rect); + childGetRect("dimensions", dim_rect); + childSetVisible("aspect_ratio", dim_rect.mRight < aspect_label_rect.mLeft); } +// Return true if everything went fine, false if we somewhat modified the ratio as we bumped on border values +bool LLPreviewTexture::setAspectRatio(const F32 width, const F32 height) +{ + mUpdateDimensions = TRUE; + + // We don't allow negative width or height. Also, if height is positive but too small, we reset to default + // A default 0.f value for mAspectRatio means "unconstrained" in the rest of the code + if ((width <= 0.f) || (height <= F_APPROXIMATELY_ZERO)) + { + mAspectRatio = 0.f; + return false; + } + + // Compute and store the ratio + F32 ratio = width / height; + mAspectRatio = llclamp(ratio, PREVIEW_TEXTURE_MIN_ASPECT, PREVIEW_TEXTURE_MAX_ASPECT); + + // Return false if we clamped the value, true otherwise + return (ratio == mAspectRatio); +} + + +void LLPreviewTexture::onAspectRatioCommit(LLUICtrl* ctrl, void* userdata) +{ + LLPreviewTexture* self = (LLPreviewTexture*) userdata; + + std::string ratio(ctrl->getValue().asString()); + std::string::size_type separator(ratio.find_first_of(":/\\")); + + if (std::string::npos == separator) { + // If there's no separator assume we want an unconstrained ratio + self->setAspectRatio( 0.f, 0.f ); + return; + } + + F32 width, height; + std::istringstream numerator(ratio.substr(0, separator)); + std::istringstream denominator(ratio.substr(separator + 1)); + numerator >> width; + denominator >> height; + + self->setAspectRatio( width, height ); +} + void LLPreviewTexture::loadAsset() { mImage = LLViewerTextureManager::getFetchedTexture(mImageID, MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h index 9ace304fa6..520626b49f 100644 --- a/indra/newview/llpreviewtexture.h +++ b/indra/newview/llpreviewtexture.h @@ -38,6 +38,7 @@ #include "llframetimer.h" #include "llviewertexture.h" +class LLComboBox; class LLImageRaw; class LLPreviewTexture : public LLPreview @@ -71,7 +72,9 @@ public: protected: void init(); /* virtual */ BOOL postBuild(); - + bool setAspectRatio(const F32 width, const F32 height); + static void onAspectRatioCommit(LLUICtrl*,void* userdata); + private: void updateDimensions(); LLUUID mImageID; @@ -88,6 +91,7 @@ private: S32 mLastHeight; S32 mLastWidth; + F32 mAspectRatio; BOOL mUpdateDimensions; }; diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index d163ceb30e..288cf728b9 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -545,7 +545,7 @@ BOOL LLSelectMgr::removeObjectFromSelections(const LLUUID &id) object_found = TRUE; break; // must break here, may have removed multiple objects from list } - else if (object->isAvatar()) + else if (object->isAvatar() && object->getParent() && ((LLViewerObject*)object->getParent())->mID == id) { // It's possible the item being removed has an avatar sitting on it // So remove the avatar that is sitting on the object. diff --git a/indra/newview/llsky.cpp b/indra/newview/llsky.cpp index a49b07c5d9..de99cb86fa 100644 --- a/indra/newview/llsky.cpp +++ b/indra/newview/llsky.cpp @@ -66,6 +66,9 @@ F32 elevation_from_vector(const LLVector3 &v); LLSky gSky; // ---------------- LLSky ---------------- +const F32 LLSky::NIGHTTIME_ELEVATION = -8.0f; // degrees +const F32 LLSky::NIGHTTIME_ELEVATION_COS = (F32)sin(NIGHTTIME_ELEVATION*DEG_TO_RAD); + ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llsky.h b/indra/newview/llsky.h index abd4205e6c..d7796dea83 100644 --- a/indra/newview/llsky.h +++ b/indra/newview/llsky.h @@ -42,9 +42,6 @@ #include "llvosky.h" #include "llvoground.h" -const F32 NIGHTTIME_ELEVATION = -8.0f; // degrees -const F32 NIGHTTIME_ELEVATION_COS = (F32)sin(NIGHTTIME_ELEVATION*DEG_TO_RAD); - class LLViewerCamera; class LLVOWLSky; @@ -111,6 +108,9 @@ public: // Legacy stuff LLVector3 mSunDefaultPosition; + static const F32 NIGHTTIME_ELEVATION; // degrees + static const F32 NIGHTTIME_ELEVATION_COS; + protected: BOOL mOverrideSimSunPosition; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 62435c6288..9cd3acf13e 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -977,6 +977,13 @@ bool idle_startup() LLFile::mkdir(gDirUtilp->getChatLogsDir()); LLFile::mkdir(gDirUtilp->getPerAccountChatLogsDir()); + // chat history must be loaded AFTER chat directories are defined. + if (!gNoRender && gSavedPerAccountSettings.getBOOL("LogShowHistory")) + { + LLFloaterChat::loadHistory(); + } + + //good as place as any to create user windlight directories std::string user_windlight_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight", "")); LLFile::mkdir(user_windlight_path_name.c_str()); diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 63af170fa9..88fc7f98c0 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -1371,7 +1371,7 @@ bool LLTextureFetch::createRequest(const std::string& filename, const LLUUID& id } else if (w*h*c > 0) { - // If the requester knows the dimentions of the image, + // If the requester knows the dimensions of the image, // this will calculate how much data we need without having to parse the header desired_size = LLImageJ2C::calcDataSizeJ2C(w, h, c, desired_discard); diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp index ee6ef6ffee..f65baea6ca 100644 --- a/indra/newview/llviewercamera.cpp +++ b/indra/newview/llviewercamera.cpp @@ -120,9 +120,8 @@ void LLViewerCamera::updateCameraLocation(const LLVector3 ¢er, const LLVector3 &up_direction, const LLVector3 &point_of_interest) { - // do not update if we are in build mode AND avatar didn't move - if (LLToolMgr::getInstance()->inBuildMode() - && !LLViewerJoystick::getInstance()->getCameraNeedsUpdate()) + // do not update if avatar didn't move + if (!LLViewerJoystick::getInstance()->getCameraNeedsUpdate()) { return; } diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index fa82612114..b71291f834 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -688,7 +688,7 @@ static LLCachedControl test_BrowserHomePage("BrowserHomePage", "hah void test_cached_control() { -#define TEST_LLCC(T, V) if((T)mySetting_##T != V) llerrs << "Fail "#T << llendl +#define do { TEST_LLCC(T, V) if((T)mySetting_##T != V) llerrs << "Fail "#T << llendl; } while(0) TEST_LLCC(U32, 666); TEST_LLCC(S32, (S32)-666); TEST_LLCC(F32, (F32)-666.666); diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp index b919e3d1c1..b593fbfb00 100644 --- a/indra/newview/llviewerjoystick.cpp +++ b/indra/newview/llviewerjoystick.cpp @@ -414,14 +414,41 @@ void LLViewerJoystick::agentFly(F32 inc) } // ----------------------------------------------------------------------------- -void LLViewerJoystick::agentRotate(F32 pitch_inc, F32 yaw_inc) +void LLViewerJoystick::agentPitch(F32 pitch_inc) { - LLQuaternion new_rot; - pitch_inc = gAgent.clampPitchToLimits(-pitch_inc); - const LLQuaternion qx(pitch_inc, gAgent.getLeftAxis()); - const LLQuaternion qy(-yaw_inc, gAgent.getReferenceUpVector()); - new_rot.setQuat(qx * qy); - gAgent.rotate(new_rot); + if (pitch_inc < 0) + { + gAgent.setControlFlags(AGENT_CONTROL_PITCH_POS); + } + else if (pitch_inc > 0) + { + gAgent.setControlFlags(AGENT_CONTROL_PITCH_NEG); + } + + gAgent.pitch(-pitch_inc); +} + +// ----------------------------------------------------------------------------- +void LLViewerJoystick::agentYaw(F32 yaw_inc) +{ + // Cannot steer some vehicles in mouselook if the script grabs the controls + if (gAgent.cameraMouselook() && !gSavedSettings.getBOOL("JoystickMouselookYaw")) + { + gAgent.rotate(-yaw_inc, gAgent.getReferenceUpVector()); + } + else + { + if (yaw_inc < 0) + { + gAgent.setControlFlags(AGENT_CONTROL_YAW_POS); + } + else if (yaw_inc > 0) + { + gAgent.setControlFlags(AGENT_CONTROL_YAW_NEG); + } + + gAgent.yaw(-yaw_inc); + } } // ----------------------------------------------------------------------------- @@ -595,12 +622,38 @@ void LLViewerJoystick::moveAvatar(bool reset) } bool is_zero = true; + static bool button_held = false; if (mBtn[1] == 1) { - agentJump(); + // If AutomaticFly is enabled, then button1 merely causes a + // jump (as the up/down axis already controls flying) if on the + // ground, or cease flight if already flying. + // If AutomaticFly is disabled, then button1 toggles flying. + if (gSavedSettings.getBOOL("AutomaticFly")) + { + if (!gAgent.getFlying()) + { + gAgent.moveUp(1); + } + else if (!button_held) + { + button_held = true; + gAgent.setFlying(FALSE); + } + } + else if (!button_held) + { + button_held = true; + gAgent.setFlying(!gAgent.getFlying()); + } + is_zero = false; } + else + { + button_held = false; + } F32 axis_scale[] = { @@ -758,11 +811,13 @@ void LLViewerJoystick::moveAvatar(bool reset) { if (gAgent.getFlying()) { - agentRotate(eff_rx, eff_ry); + agentPitch(eff_rx); + agentYaw(eff_ry); } else { - agentRotate(eff_rx, 2.f * eff_ry); + agentPitch(eff_rx); + agentYaw(2.f * eff_ry); } } } @@ -771,7 +826,8 @@ void LLViewerJoystick::moveAvatar(bool reset) agentSlide(sDelta[X_I]); // move sideways agentFly(sDelta[Y_I]); // up/down & crouch agentPush(sDelta[Z_I]); // forward/back - agentRotate(sDelta[RX_I], sDelta[RY_I]); // pitch & turn + agentPitch(sDelta[RX_I]); // pitch + agentYaw(sDelta[RY_I]); // turn } } @@ -963,15 +1019,10 @@ bool LLViewerJoystick::toggleFlycam() moveFlycam(true); } - else if (!LLToolMgr::getInstance()->inBuildMode()) - { - moveAvatar(true); - } else { - // we are in build mode, exiting from the flycam mode: since we are - // going to keep the flycam POV for the main camera until the avatar - // moves, we need to track this situation. + // Exiting from the flycam mode: since we are going to keep the flycam POV for + // the main camera until the avatar moves, we need to track this situation. setCameraNeedsUpdate(false); setNeedsReset(true); } diff --git a/indra/newview/llviewerjoystick.h b/indra/newview/llviewerjoystick.h index b565ed5696..a3904bd2c3 100644 --- a/indra/newview/llviewerjoystick.h +++ b/indra/newview/llviewerjoystick.h @@ -82,8 +82,9 @@ protected: void agentSlide(F32 inc); void agentPush(F32 inc); void agentFly(F32 inc); - void agentRotate(F32 pitch_inc, F32 turn_inc); - void agentJump(); + void agentPitch(F32 pitch_inc); + void agentYaw(F32 yaw_inc); + void agentJump(); void resetDeltas(S32 axis[]); #if LIB_NDOF static NDOF_HotPlugResult HotPlugAddCallback(NDOF_Device *dev); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 2b972614f1..b8e945a7b8 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -1000,6 +1000,7 @@ BOOL LLViewerMediaImpl::handleMouseUp(S32 x, S32 y, MASK mask) return TRUE; } + ////////////////////////////////////////////////////////////////////////////////////////// void LLViewerMediaImpl::navigateHome() { diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index b4e0d88e79..c2def610dc 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -4733,6 +4733,96 @@ class LLToolsSnapObjectXY : public view_listener_t } }; +// Determine if the option to cycle between linked prims is shown +class LLToolsEnableSelectNextPart : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + bool new_value = (gSavedSettings.getBOOL("EditLinkedParts") && + !LLSelectMgr::getInstance()->getSelection()->isEmpty()); + return new_value; + } +}; + +// Cycle selection through linked children in selected object. +// FIXME: Order of children list is not always the same as sim's idea of link order. This may confuse +// resis. Need link position added to sim messages to address this. +class LLToolsSelectNextPart : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + S32 object_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount(); + if (gSavedSettings.getBOOL("EditLinkedParts") && object_count) + { + LLViewerObject* selected = LLSelectMgr::getInstance()->getSelection()->getFirstObject(); + if (selected && selected->getRootEdit()) + { + bool fwd = (userdata.asString() == "next"); + bool prev = (userdata.asString() == "previous"); + bool ifwd = (userdata.asString() == "includenext"); + bool iprev = (userdata.asString() == "includeprevious"); + LLViewerObject* to_select = NULL; + LLViewerObject::child_list_t children = selected->getRootEdit()->getChildren(); + children.push_front(selected->getRootEdit()); // need root in the list too + + for (LLViewerObject::child_list_t::iterator iter = children.begin(); iter != children.end(); ++iter) + { + if ((*iter)->isSelected()) + { + if (object_count > 1 && (fwd || prev)) // multiple selection, find first or last selected if not include + { + to_select = *iter; + if (fwd) + { + // stop searching if going forward; repeat to get last hit if backward + break; + } + } + else if ((object_count == 1) || (ifwd || iprev)) // single selection or include + { + if (fwd || ifwd) + { + ++iter; + while (iter != children.end() && ((*iter)->isAvatar() || (ifwd && (*iter)->isSelected()))) + { + ++iter; // skip sitting avatars and selected if include + } + } + else // backward + { + iter = (iter == children.begin() ? children.end() : iter); + --iter; + while (iter != children.begin() && ((*iter)->isAvatar() || (iprev && (*iter)->isSelected()))) + { + --iter; // skip sitting avatars and selected if include + } + } + iter = (iter == children.end() ? children.begin() : iter); + to_select = *iter; + break; + } + } + } + + if (to_select) + { + if (gFocusMgr.childHasKeyboardFocus(gFloaterTools)) + { + gFocusMgr.setKeyboardFocus(NULL); // force edit toolbox to commit any changes + } + if (fwd || prev) + { + LLSelectMgr::getInstance()->deselectAll(); + } + LLSelectMgr::getInstance()->selectObjectOnly(to_select); + return true; + } + } + } + return true; + } +}; + // in order to link, all objects must have the same owner, and the // agent must have the ability to modify all of the objects. However, // we're not answering that question with this method. The question @@ -7729,6 +7819,7 @@ void initialize_menus() view_listener_t::addMenu(new LLToolsEditLinkedParts(), "Tools.EditLinkedParts"); view_listener_t::addMenu(new LLToolsSnapObjectXY(), "Tools.SnapObjectXY"); view_listener_t::addMenu(new LLToolsUseSelectionForGrid(), "Tools.UseSelectionForGrid"); + view_listener_t::addMenu(new LLToolsSelectNextPart(), "Tools.SelectNextPart"); view_listener_t::addMenu(new LLToolsLink(), "Tools.Link"); view_listener_t::addMenu(new LLToolsUnlink(), "Tools.Unlink"); view_listener_t::addMenu(new LLToolsStopAllAnimations(), "Tools.StopAllAnimations"); @@ -7742,6 +7833,7 @@ void initialize_menus() view_listener_t::addMenu(new LLToolsSelectedScriptAction(), "Tools.SelectedScriptAction"); view_listener_t::addMenu(new LLToolsEnableToolNotPie(), "Tools.EnableToolNotPie"); + view_listener_t::addMenu(new LLToolsEnableSelectNextPart(), "Tools.EnableSelectNextPart"); view_listener_t::addMenu(new LLToolsEnableLink(), "Tools.EnableLink"); view_listener_t::addMenu(new LLToolsEnableUnlink(), "Tools.EnableUnlink"); view_listener_t::addMenu(new LLToolsEnableBuyOrTake(), "Tools.EnableBuyOrTake"); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 1cfeec5627..d3a9e1cef8 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -219,7 +219,7 @@ const std::string upload_pick(void* data) args["EXTENSION"] = ext; args["VALIDS"] = valid_extensions; LLNotifications::instance().add("InvalidFileExtension", args); - return NULL; + return std::string(); } }//end else (non-null extension) diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index acdc2c2513..1d982265ca 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -174,11 +174,28 @@ BOOL LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject &object) U32 port = region_host.getPort(); U64 ipport = (((U64)ip) << 32) | (U64)port; U32 index = sIPAndPortToIndex[ipport]; - + + // llinfos << "Removing object from table, local ID " << local_id << ", ip " << ip << ":" << port << llendl; + U64 indexid = (((U64)index) << 32) | (U64)local_id; - return sIndexAndLocalIDToUUID.erase(indexid) > 0 ? TRUE : FALSE; + + std::map::iterator iter = sIndexAndLocalIDToUUID.find(indexid); + if (iter == sIndexAndLocalIDToUUID.end()) + { + return FALSE; + } + + // Found existing entry + if (iter->second == object.getID()) + { // Full UUIDs match, so remove the entry + sIndexAndLocalIDToUUID.erase(iter); + return TRUE; + } + // UUIDs did not match - this would zap a valid entry, so don't erase it + //llinfos << "Tried to erase entry where id in table (" + // << iter->second << ") did not match object " << object.getID() << llendl; } - + return FALSE ; } @@ -200,6 +217,9 @@ void LLViewerObjectList::setUUIDAndLocal(const LLUUID &id, U64 indexid = (((U64)index) << 32) | (U64)local_id; sIndexAndLocalIDToUUID[indexid] = id; + + //llinfos << "Adding object to table, full ID " << id + // << ", local ID " << local_id << ", ip " << ip << ":" << port << llendl; } S32 gFullObjectUpdates = 0; @@ -246,8 +266,8 @@ void LLViewerObjectList::processUpdateCore(LLViewerObject* objectp, { if ( LLToolMgr::getInstance()->getCurrentTool() != LLToolPie::getInstance() ) { - //llinfos << "DEBUG selecting " << objectp->mID << " " - // << objectp->mLocalID << llendl; + // llinfos << "DEBUG selecting " << objectp->mID << " " + // << objectp->mLocalID << llendl; LLSelectMgr::getInstance()->selectObjectAndFamily(objectp); dialog_refresh_all(); } @@ -294,7 +314,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, { size = mesgsys->getReceiveSize(); } -// llinfos << "Received terse " << num_objects << " in " << size << " byte (" << size/num_objects << ")" << llendl; + // llinfos << "Received terse " << num_objects << " in " << size << " byte (" << size/num_objects << ")" << llendl; } else { @@ -308,7 +328,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, size = mesgsys->getReceiveSize(); } -// llinfos << "Received " << num_objects << " in " << size << " byte (" << size/num_objects << ")" << llendl; + // llinfos << "Received " << num_objects << " in " << size << " byte (" << size/num_objects << ")" << llendl; gFullObjectUpdates += num_objects; } @@ -318,7 +338,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, if (!regionp) { - llwarns << "Object update from unknown region!" << llendl; + llwarns << "Object update from unknown region! " << region_handle << llendl; return; } @@ -357,7 +377,6 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, U8 compbuffer[2048]; S32 uncompressed_length = 2048; S32 compressed_length; - compressed_dp.reset(); U32 flags = 0; @@ -398,7 +417,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, gMessageSystem->getSenderPort()); if (fullid.isNull()) { - //llwarns << "update for unknown localid " << local_id << " host " << gMessageSystem->getSender() << llendl; + // llwarns << "update for unknown localid " << local_id << " host " << gMessageSystem->getSender() << ":" << gMessageSystem->getSenderPort() << llendl; mNumUnknownUpdates++; } } @@ -412,7 +431,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, gMessageSystem->getSenderPort()); if (fullid.isNull()) { - //llwarns << "update for unknown localid " << local_id << " host " << gMessageSystem->getSender() << llendl; + // llwarns << "update for unknown localid " << local_id << " host " << gMessageSystem->getSender() << llendl; mNumUnknownUpdates++; } } @@ -420,19 +439,43 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, { mesgsys->getUUIDFast(_PREHASH_ObjectData, _PREHASH_FullID, fullid, i); mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, local_id, i); - // llinfos << "Full Update, obj " << local_id << ", global ID" << fullid << "from " << mesgsys->getSender() << llendl; + // llinfos << "Full Update, obj " << local_id << ", global ID" << fullid << "from " << mesgsys->getSender() << llendl; } objectp = findObject(fullid); // This looks like it will break if the local_id of the object doesn't change // upon boundary crossing, but we check for region id matching later... - if (objectp && (objectp->mLocalID != local_id)) + // Reset object local id and region pointer if things have changed + if (objectp && + ((objectp->mLocalID != local_id) || + (objectp->getRegion() != regionp))) { + //if (objectp->getRegion()) + //{ + // llinfos << "Local ID change: Removing object from table, local ID " << objectp->mLocalID + // << ", id from message " << local_id << ", from " + // << LLHost(objectp->getRegion()->getHost().getAddress(), objectp->getRegion()->getHost().getPort()) + // << ", full id " << fullid + // << ", objects id " << objectp->getID() + // << ", regionp " << (U32) regionp << ", object region " << (U32) objectp->getRegion() + // << llendl; + //} removeFromLocalIDTable(*objectp); setUUIDAndLocal(fullid, local_id, gMessageSystem->getSenderIP(), gMessageSystem->getSenderPort()); + + if (objectp->mLocalID != local_id) + { // Update local ID in object with the one sent from the region + objectp->mLocalID = local_id; + } + + if (objectp->getRegion() != regionp) + { // Object changed region, so update it + objectp->setRegion(regionp); + objectp->updateRegion(regionp); // for LLVOAvatar + } } if (!objectp) @@ -441,7 +484,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, { if (update_type == OUT_TERSE_IMPROVED) { - // llinfos << "terse update for an unknown object:" << fullid << llendl; + // llinfos << "terse update for an unknown object:" << fullid << llendl; continue; } } @@ -452,7 +495,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, { if (update_type != OUT_FULL) { -// llinfos << "terse update for an unknown object:" << fullid << llendl; + // llinfos << "terse update for an unknown object:" << fullid << llendl; continue; } @@ -462,7 +505,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, if (mDeadObjects.find(fullid) != mDeadObjects.end()) { mNumDeadObjectUpdates++; - //llinfos << "update for a dead object:" << fullid << llendl; + // llinfos << "update for a dead object:" << fullid << llendl; continue; } #endif @@ -475,20 +518,6 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, justCreated = TRUE; mNumNewObjects++; } - else - { - if (objectp->getRegion() != regionp) - { - // Object has changed region! Update lookup tables, set region pointer. - removeFromLocalIDTable(*objectp); - setUUIDAndLocal(fullid, - local_id, - gMessageSystem->getSenderIP(), - gMessageSystem->getSenderPort()); - objectp->setRegion(regionp); - } - objectp->updateRegion(regionp); // for LLVOAvatar - } if (objectp->isDead()) @@ -623,7 +652,7 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent) mCurLazyUpdateIndex = 0; } - mCurBin = (++mCurBin) % NUM_BINS; + mCurBin = (mCurBin + 1) % NUM_BINS; LLVOAvatar::cullAvatarsByPixelArea(); } @@ -808,6 +837,14 @@ void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp) // Remove from object map so noone can look it up. mUUIDObjectMap.erase(objectp->mID); + + //if (objectp->getRegion()) + //{ + // llinfos << "cleanupReferences removing object from table, local ID " << objectp->mLocalID << ", ip " + // << objectp->getRegion()->getHost().getAddress() << ":" + // << objectp->getRegion()->getHost().getPort() << llendl; + //} + removeFromLocalIDTable(*objectp); if (objectp->onActiveList()) diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 3cc379821a..273ca8bd1a 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1502,11 +1502,6 @@ void LLViewerWindow::initWorldUI() // currently needs to happen before initializing chat or IM LLFloaterReg::getInstance("communicate"); - if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") ) - { - LLFloaterChat::loadHistory(); - } - LLRect morph_view_rect = full_window; morph_view_rect.stretch( -STATUS_BAR_HEIGHT ); morph_view_rect.mTop = full_window.mTop - 32; diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index 6401389c8f..ca028269fe 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -1664,7 +1664,6 @@ void LLVoiceClient::stateMachine() // SLIM SDK: these arguments are no longer necessary. // std::string args = " -p tcp -h -c"; std::string args; - std::string cmd; std::string loglevel = gSavedSettings.getString("VivoxDebugLevel"); if(loglevel.empty()) @@ -1679,17 +1678,18 @@ void LLVoiceClient::stateMachine() #if LL_WINDOWS PROCESS_INFORMATION pinfo; - STARTUPINFOA sinfo; + STARTUPINFOW sinfo; memset(&sinfo, 0, sizeof(sinfo)); - std::string exe_dir = gDirUtilp->getAppRODataDir(); - cmd = "SLVoice.exe"; - cmd += args; - - // So retarded. Windows requires that the second parameter to CreateProcessA be a writable (non-const) string... - char *args2 = new char[args.size() + 1]; - strcpy(args2, args.c_str()); - if(!CreateProcessA(exe_path.c_str(), args2, NULL, NULL, FALSE, 0, NULL, exe_dir.c_str(), &sinfo, &pinfo)) + std::string exe_dir = gDirUtilp->getExecutableDir(); + + llutf16string exe_path16 = utf8str_to_utf16str(exe_path); + llutf16string exe_dir16 = utf8str_to_utf16str(exe_dir); + llutf16string args16 = utf8str_to_utf16str(args); + // Create a writeable copy to keep Windows happy. + U16 *argscpy_16 = new U16[args16.size() + 1]; + wcscpy_s(argscpy_16,args16.size()+1,args16.c_str()); + if(!CreateProcessW(exe_path16.c_str(), argscpy_16, NULL, NULL, FALSE, 0, NULL, exe_dir16.c_str(), &sinfo, &pinfo)) { // DWORD dwErr = GetLastError(); } @@ -1701,7 +1701,7 @@ void LLVoiceClient::stateMachine() CloseHandle(pinfo.hThread); // stops leaks - nothing else } - delete[] args2; + delete[] argscpy_16; #else // LL_WINDOWS // This should be the same for mac and linux { @@ -4972,7 +4972,7 @@ void LLVoiceClient::sessionState::removeAllParticipants() if(!mParticipantsByUUID.empty()) { - LL_ERRS("Voice") << "Internal error: empty URI map, non-empty UUID map" << LL_ENDL + LL_ERRS("Voice") << "Internal error: empty URI map, non-empty UUID map" << LL_ENDL; } } @@ -6488,7 +6488,7 @@ void LLVoiceClient::deleteSession(sessionState *session) { if(iter->second != session) { - LL_ERRS("Voice") << "Internal error: session mismatch" << LL_ENDL + LL_ERRS("Voice") << "Internal error: session mismatch" << LL_ENDL; } mSessionsByHandle.erase(iter); } @@ -6528,7 +6528,7 @@ void LLVoiceClient::deleteAllSessions() if(!mSessionsByHandle.empty()) { - LL_ERRS("Voice") << "Internal error: empty session map, non-empty handle map" << LL_ENDL + LL_ERRS("Voice") << "Internal error: empty session map, non-empty handle map" << LL_ENDL; } } diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp index 33b86660fa..d44c543266 100644 --- a/indra/newview/llvosky.cpp +++ b/indra/newview/llvosky.cpp @@ -965,7 +965,7 @@ void LLVOSky::calcAtmospherics(void) // and vary_sunlight will work properly with moon light F32 lighty = unclamped_lightnorm[1]; - if(lighty < NIGHTTIME_ELEVATION_COS) + if(lighty < LLSky::NIGHTTIME_ELEVATION_COS) { lighty = -lighty; } diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h index 466cdfdcd0..62c934fb41 100644 --- a/indra/newview/llvosky.h +++ b/indra/newview/llvosky.h @@ -147,7 +147,7 @@ protected: static S32 getResolution() { return sResolution; } static S32 getCurrent() { return sCurrent; } - static S32 stepCurrent() { return (sCurrent = ++sCurrent % 2); } + static S32 stepCurrent() { return (sCurrent = (sCurrent + 1) % 2); } static S32 getNext() { return ((sCurrent+1) % 2); } static S32 getWhich(const BOOL curr) { return curr ? sCurrent : getNext(); } diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp index 136ffe607d..c8cc6a3d8e 100644 --- a/indra/newview/llwaterparammanager.cpp +++ b/indra/newview/llwaterparammanager.cpp @@ -304,7 +304,7 @@ void LLWaterParamManager::update(LLViewerCamera * cam) mWaterPlane = LLVector4(enorm.v[0], enorm.v[1], enorm.v[2], -ep.dot(enorm)); LLVector3 sunMoonDir; - if (gSky.getSunDirection().mV[2] > NIGHTTIME_ELEVATION_COS) + if (gSky.getSunDirection().mV[2] > LLSky::NIGHTTIME_ELEVATION_COS) { sunMoonDir = gSky.getSunDirection(); } diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp index 4bf64816c7..1581153c19 100644 --- a/indra/newview/llwlparammanager.cpp +++ b/indra/newview/llwlparammanager.cpp @@ -317,7 +317,7 @@ void LLWLParamManager::propagateParameters(void) { mLightDir = sunDir; } - else if(sunDir.mV[1] < 0 && sunDir.mV[1] > NIGHTTIME_ELEVATION_COS) + else if(sunDir.mV[1] < 0 && sunDir.mV[1] > LLSky::NIGHTTIME_ELEVATION_COS) { // clamp v1 to 0 so sun never points up and causes weirdness on some machines LLVector3 vec(sunDir.mV[0], sunDir.mV[1], sunDir.mV[2]); diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index a2fd0f0d9c..58ff84a8a6 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -150,11 +150,11 @@ XMLRPC_VALUE LLXMLRPCValue::getValue() const class LLXMLRPCTransaction::Impl { public: - typedef LLXMLRPCTransaction::Status Status; + typedef LLXMLRPCTransaction::EStatus EStatus; LLCurlEasyRequest* mCurlRequest; - Status mStatus; + EStatus mStatus; CURLcode mCurlCode; std::string mStatusMessage; std::string mStatusURI; @@ -176,7 +176,7 @@ public: bool process(); - void setStatus(Status code, + void setStatus(EStatus code, const std::string& message = "", const std::string& uri = ""); void setCurlStatus(CURLcode); @@ -385,7 +385,7 @@ bool LLXMLRPCTransaction::Impl::process() return false; } -void LLXMLRPCTransaction::Impl::setStatus(Status status, +void LLXMLRPCTransaction::Impl::setStatus(EStatus status, const std::string& message, const std::string& uri) { mStatus = status; @@ -509,7 +509,7 @@ bool LLXMLRPCTransaction::process() return impl.process(); } -LLXMLRPCTransaction::Status LLXMLRPCTransaction::status(int* curlCode) +LLXMLRPCTransaction::EStatus LLXMLRPCTransaction::status(int* curlCode) { if (curlCode) { diff --git a/indra/newview/llxmlrpctransaction.h b/indra/newview/llxmlrpctransaction.h index 528451fcb2..c835423d67 100644 --- a/indra/newview/llxmlrpctransaction.h +++ b/indra/newview/llxmlrpctransaction.h @@ -100,7 +100,7 @@ public: ~LLXMLRPCTransaction(); - typedef enum { + typedef enum e_status { StatusNotStarted, StatusStarted, StatusDownloading, @@ -108,12 +108,12 @@ public: StatusCURLError, StatusXMLRPCError, StatusOtherError - } Status; + } EStatus; bool process(); // run the request a little, returns true when done - Status status(int* curlCode); + EStatus status(int* curlCode); // return status, and extended CURL code, if code isn't null std::string statusMessage(); // return a message string, suitable for showing the user diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index c736d0ccc8..3800b9223d 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -35,7 +35,7 @@ #include "pipeline.h" // library includes -#include "llaudioengine.h" // For MAX_BUFFERS for debugging. +#include "llaudioengine.h" // For debugging. #include "imageids.h" #include "llerror.h" #include "llviewercontrol.h" @@ -4289,7 +4289,7 @@ void LLPipeline::setupAvatarLights(BOOL for_edit) } } F32 backlight_mag; - if (gSky.getSunDirection().mV[2] >= NIGHTTIME_ELEVATION_COS) + if (gSky.getSunDirection().mV[2] >= LLSky::NIGHTTIME_ELEVATION_COS) { backlight_mag = BACKLIGHT_DAY_MAGNITUDE_OBJECT; } @@ -4475,7 +4475,7 @@ void LLPipeline::setupHWLights(LLDrawPool* pool) // Light 0 = Sun or Moon (All objects) { - if (gSky.getSunDirection().mV[2] >= NIGHTTIME_ELEVATION_COS) + if (gSky.getSunDirection().mV[2] >= LLSky::NIGHTTIME_ELEVATION_COS) { mSunDir.setVec(gSky.getSunDirection()); mSunDiffuse.setVec(gSky.getSunDiffuseColor()); diff --git a/indra/newview/res-sdl/arrow.BMP b/indra/newview/res-sdl/arrow.BMP new file mode 100644 index 0000000000000000000000000000000000000000..a8f6da64b573f4136d742e98fbce372b389fa966 GIT binary patch literal 2102 zcmeH`XE+vY6vuyxtcp<4qG2>iQnXP@k=Y(r3Z+7%U0O6KLMas*geL7}_0XVFv}h`{ zl=ga`=gIYc;_>DE_@3*!$94bi|GCb6&biI3jpY!Vu{7ujcUrYWidrD1wUd-^6%ElM zB}Jn~jcDAsG1Ah~$jHdhq)8KGWo40*lS5u!9t8yj6crU|+O#Rnnl+<&^X4ciDWR;a zOp6vRP*G7qRaF%=H8oncY)PwDt!Ul4HR|f>XlQ8ArcE2#wrxwhcI{~2zC9f}bU;&6 z6D=(*I(F(-6#-MiDHM-O`T>`AX) zz0lX!$H2gV-o1NcXlO{EK7BAUGNNzaz8D)D)30AY`uFdTiHQlOrlt%SFo1yr2Qp~T zAO;T}%#a~N7&>$)!-fsR%*+gPb8{>#EEqm~I3q@kz|zu^kt0VkYSbvKtgIM4dNgCk zjKSL48XFrM#*Q6}t*tF~c6Qj?+vDKifTN=$PEJmY8#j*eC>mm*_UzfrnKK6;A0OtKEA%b`1$$a@9)oo1q%oW2p}*pkcA5u5)>4~ zqD6~Xym&E7mMmfE(xoh0wv6S=m$PEU3RbRM$*NVW2o4Tr_3G8ES+j<J9n~c*Dm7X;@G`=H+%N%Vej6(#K*^zkdQ!PVj}zY?PLG` z{Tw)OfP)7Ql9ZH0a&j_<4jm#TC56<~RMOJYIDGgpM~)of=+UDbJ9doY$B%R3#0k>V z)5*xl;N;1ZoH})i)2B~!=FAz+o;}OCbLTjJ{yY~hT;Srxi(I;NiOZKSlbM-GR#q0- z+1cdeir|pU>5+SGjiW8rQF1=f;g26ciLtSXju-n>V?2>lU|f z-=?Ujh&y-gaQE(Aii?XWDJkLJy?flhf1d{r9`NwtLmoYPL}_U$Wo2bNe*BmxPoD7f z=~JFPd&cwU&w26U1?A=CynOkRSFc`CQBgrLn-o1Or`}gmu zuCC_8hYx)G_>r2L8a{pc#OKeS`SRrpU%!6k+qZ9g|NfmHKYsA@=TCn9`o-_xzxng$ zkLZ2>+kcP&Bxh2XYl$}+s6_)6UyHANIqv-#IQ>bu`SWn|@thY=;PuCf literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/arrowcopmulti.BMP b/indra/newview/res-sdl/arrowcopmulti.BMP new file mode 100644 index 0000000000000000000000000000000000000000..48f153cef662b9cfab38df3ab11264837c3fdbc7 GIT binary patch literal 3126 zcmeH@F%H5o3`N5X8w(>NC+Gp#xi`0hFMjz-<0P$BM`FNIT-&jqe{+9Kr}VK2{)Tg% z&mmn9!Ek>*^01K7^KYIP_&(dp*MnU2g8N!C^ekpPiRD)-D8fA8xffG~{8nW@AB5br z7e&Ona{UEog(4?URneB;I2V+CRtr`4P@ z^}5m6#qX2_UrKjT+j3T_x|zT*Y*3|=bX>EzxVh4o$ER_j^-*{F9pP)ii$Ud zKUr8pQc$2qjT$H_Dx##MM9rEtQC3!_R;^m7sHjl8c5PHuRZ&w@qfVVVsH>}^p`n4M zrY2fiTGXvumwNT;QNMnD8Z>A?!-fsf*4Cy`qee7t+?Xa!nxLbjgRZVFdU|^3>+93B zX;YdtYleY=0fvT#7#SJSym@n4v}i%gmMv-3suitUx5n7mm^N+N(6((`+O=y(`}XZI zF)_i^)RYb#I?%CWM>=)tMCZ<(F*7rxOP4Nm?b;P{b91_N>qhtP-LbH+z|zu^9zA+s zWo1Rro;~T+s~6VR*7WY(n?8N|U}Iy0t*tF~c6Qj?+vDKiK;OQ7>DR9x{rmT4z<>b^ z95|3cg9hQ~=*Zx~gBdbp2t$Vs#mUKuVZ(+oeE4uij2OYlks}#3Y80bKk7mr6F^nBM zmT}|8;q2^;i;D~6$B)O=)fG24HzrJ&fV;ap6DLk&(xgdDo;(>34-Y&&J@NAL!rR*$ zA0Hp4OqqhOuP=UneoUP@6@Pz!rcIm1^y$-?F=GZZXU-%bAb`NYKxWOFMNm)>vuDp{ z&YU^SojaF#^X4&s{(KfJSir)C3t6;i5sMcuCO9~lB}x-EnCL&<;w{P2_ZBz zlocyhuyW-}!otD`4-Y3IB7(@sNLH;{#p>0oiHeG1&6+i=UAvZb>(;S;{dzWR*uch( z8`-pJ6VcJp#Kgp~dGltrY}vxrty|f)Z5!LSZ)eAj9qin>lU=)Zv3vJ!_Uzfi-o1N? zjg4jBzJ2W9zn=pK4sh_`K@J@{#Noq-IdbF(M~@!m*s)_AKYpAOCr)tkqVJ zr#W-x3}?@tB`z+G`1p9vojXTDLIUT{pXb7b3tYT-kxQ2@aryFP5)%_iN=hO*IhiY0 zu5k70RjysT#`WvhNl8iJ#*G`?ym=FmNW`sMx43=#HmRwpq@|^io}NxdMh2OgnPg>U zap%q*?%uu2y?gh#fB!z&+1WgJ@PLO8AM)tYBXV+b$j!~=@#DuldGds(PoMJa*)yI$ zf6j{+FL?R#C9ht+;`Qs-ym|A6w{PF_?%g}`^76>f&*%O7_k8&9fsY?Q^6AqjK7am9 zK|uk9g@t_i@`a+JB8rQPDJdzTw6v73U%&G0+c(O}%J}~MJLTo&R8&;(I0_(LXq?b(sJF literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/circleandline.BMP b/indra/newview/res-sdl/circleandline.BMP new file mode 100644 index 0000000000000000000000000000000000000000..284ae8b7d51ab1321fbdeea11d93c43321c5728a GIT binary patch literal 2102 zcmeH^cUaC{7{@esK2q@*NLQc^T%(13;w8zL<&O`}GQXxz9lO`0^JY15|2$jH#FSu zI(0%(Q4u92B|3NROqVWQP*zr^YuB!H>(-6#-MgcrqJpZbDr#zKsH>}^p`k&K9zD?1 z)TC$6o@i-l(W_T4diU;4pFVx)+qW;;+S>H%*AE>X9dvbd>EFLU0|pF0Pfw450|zo_ z&>#j69?Xy-L(tdPXXwzO7#J8}XlTf=VZ#_cd^jUUj9}!*kr){nF>2H(MvorNm@#88 zHa2GL*s++Hm@sbKIL413kEy9CW@cuXo0~IX!UQZVEU>h+Wa7k$Oqw(aD=RCkt*x=K zv0?J$$=KT3GG)pXrcRy8v}x0rK7BfNc6Q8|F@u>iXEJNnEbQ&=nLT?pbLPy!!NCDX zM@O8ToR~XzF7xKi!`a!H`Sa(qV8H@hTwHKE%^KFOUCX+4>sY^jJsUP`VB^M( zY}&Mm&6_u~Wy=<}ZrzHPmlxjN-fY{pjqTgF*g9e|GNN$*x_y z*u8r<0RaI71_rWc&mQ*f-OIjx``EvKKL-vR;NZc796EG}!-o$O6cj{oa4<)X9O3BE zqlAQn5E>fFv17+Le*8FLVPS-ahjZe@2~M6oNkl{hr%s*X^y$-_Idg`{$Vj51qKJ-; zCMG6^*w|R&;^K&pk0&7^fwO1Nl9-rCQc@D<&Yk1@`SV=3aDj^#FLLS9B`#mS%#|xw zNKQ^BB_)N_)Kt>a(ztr{D(UIzT)TFS>({SyfmDJkLg>({(_^M+yzU-(?)S|Nc#R zc{vpo6~g!ZKmPj_5VW$Q&Q}QgEEsi3L{KOYNNUL;#KQEIIcf+*SQM>YAc$6G72%o= zVlKqueKiwtNQBeHr$2(KNF}b5SK+$27}vr@A#r7@%>K9wcEY>Wo>-%TBL1fWHF#wL cae-@Mu|qYRzxfM);oti!lne9!^P1@V7thjLp8x;= literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/cross.BMP b/indra/newview/res-sdl/cross.BMP new file mode 100644 index 0000000000000000000000000000000000000000..0b4672d4d61f54cbc0a4cb603e9081525bd3e0d5 GIT binary patch literal 2102 zcmeH|cQ6oa9LGOOMnoBr22CS`N=rngDJi3b>~>0ngd|Nug9Z)Jpv($cm8>$Fv`b5S z(4-{N-TOy(ulJAlu6ys^@7?#F-~E2~{C@ZSKF>Xmk%_JdKcOoKDvgoSFADIh(3qDN zYbFAX#U?f_0s^#Z)r!`wTO%kaNSiio5E2qXSXdYl5fMa1MQPi%En;F~h>MHUu3bAM zBqWfOl%#$8_H^jb0Vyddq@|^ik&!`GR+f$(J0d41hrGNzojP?wK|z7eojcQ|OBcF! z?Mk<9-B46iL`g}B?%li7qel;V_UuWoUcKnuyElFM^g&r!85I>3R8>_`Q&XdF-@d4; ztD~Wzfu^P={rdGoOG^uFZEbXPbm-r|KLZ8~VBo-k=<4b+XwV=A4<5{rAww8CbST4y z4MR^)kKx0Iqpz=zfq?-dMvTDF&=4adBSwxK$*57I7(IG4#>U2s88e2lW5+UX+&IRM zAJ2pd6PP%0A|@s#Oqw(aQ&UqWPo9jKnHf{2OkwKOshFFaV_{)|rKKfSR#r@#HjU}i zr(X3w6@ zoH=utJ9jSg=FMaN{P`?cuz-aN7vkpT#-c@wSiE>K?(Xg^S+azsOP8{2*)oLgMKKT0jvTD^T{QUe_y?QnN{{F04vxb0x0M@Qu%er;z zSigQf8#ZiUSbt~JpZDafP?SzGe z5gs1SjvYJLxpODGcI{&K?%hO0L=YJn$(}uX*t>Tx`}XZ)|Ni|%MMZJozyYG8qlt-$ z;o!l896EG}!-o%ZZf-8; z&YdGKFOU5EdtxDk>_te*HQ(ZrtGJ&70i1b&K1#Z*%9)9q!(}%e{N|xPSjXm6eq| zc<_LS4;>8PIzI@56SFd>e`ZaIfyy5NJ zx4e7zj_T@aYHDhD|NcE6K78Qg$B%sa^oh@(KlA0w7iw#3sjI8w>({S*`}U3c`g*>9 z|4u_gLzBM$@$Wg%_?rH0Gg@%`&((ka1T@ZX#&0T`Zp&ZzU1dxAn;ZT)egANN3+MNn IE&uhz4{@k^761SM literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/hand.BMP b/indra/newview/res-sdl/hand.BMP new file mode 100644 index 0000000000000000000000000000000000000000..2a092fbb7feb8f112168a0b95d50401a4db897b1 GIT binary patch literal 2102 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 literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/llarrow.BMP b/indra/newview/res-sdl/llarrow.BMP new file mode 100644 index 0000000000000000000000000000000000000000..a8f6da64b573f4136d742e98fbce372b389fa966 GIT binary patch literal 2102 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 literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/llarrowdragmulti.BMP b/indra/newview/res-sdl/llarrowdragmulti.BMP new file mode 100644 index 0000000000000000000000000000000000000000..fb528bc92d20e8ad39c1f6a74709d4986c4ba6cb GIT binary patch literal 3126 zcmeH_F%kkH3`Mcl&c@Qx6YK%(y|=g0KYsng5?~2}m6;)aLh?vhueaq8Ubetru+Hzb z3nwTT&X0R8212<1&GQ1EXWRJoAXmBIKDG=ws~XRykC D7dn)m literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/llarrowlocked.BMP b/indra/newview/res-sdl/llarrowlocked.BMP new file mode 100644 index 0000000000000000000000000000000000000000..0aaa441ab1f77ecaba93139c4434a97561777806 GIT binary patch literal 2102 zcmdUvcT`V(9LHa&6hfpVAv+<2rdcw}2-!t8sWd2LmZYWZjIy^fQ%F{RWp6TCM$-;0 zJ@-}~htn^AKIi$I^Sz&Y@9X=%pY=W0)KXuOQqz|MZQ)LrF)YR0dU%x);>gqIT&;Sh$4H`CVh^D3{jT$wgapT4`Y0?BO zEiIZhZA!Cd&1l}dIW1bWpk>RJv})Cg)~#Ekt*uR)Hf_++(V=bIwzO;4j`r=_qpPb+ zhYlU+*s&v>I(0%%Pmj)>JJY307rJ)sioU)+1_lNg8X96`WQ4J?F(xJ^bnDiQ?%li7 zqel;V_UuWoUcKnuyEmq$rkI(T(Wg%z%+1Z|+qWSLx(bK*f6ZDtQbCgI3q@kVC2Y=SX)~&YSbu3j~>mKF=H4zb}Zw@ zjbr@y@l2R70UH||Y;A3sIB_DACQZW5&W_2GCo^Tr6sAs{%Cu?Im_B_vGiJ%?(TSa zc(7o>0v0Y@$f8Ay@bvU#@#4iSS+azsOP8{2*)o({ek!v;2P z+{mU)o7lX0GohiOY}vAfty{OUZQC}sZ{JQ>SQz2q;q2J4gPl8fvTN5acJJQJo;`cm zyLT`9_U&W;{{0*{aDamc4|3?xAr2ot%#kBUIC}Ib5fKqYMn-b%*fEYDKhB90CpdZX zB&SZD;`Hg$L`6k$=FAzQqoaw5iQ(+ovz$A3j`Qcw6B`@Lg$oymi;Lsp#fx0JbcxHC zFLUL}6|P>rN_>1g*REYdB9V}gkU(N$BG<29=f;g2+`M^{Teog;`}S?_+_}TuyLY*F z?;iK>-{--D2RwZEkVlUm@%Zs$o;-QN)2B~KN=o9{vu8Yi{+t&tUhwkeOOlh5Nl8f| zH8qvAv^3Jw(|Psk6|Y~v=FOWoynXwYjEoF2Gc(D`$|5^Eo1B~+a&vQe_wF6<-@oU> zhYx)G_>oVaKJoeUXTE&-LS9}TU%!6k+qZ9g|Nfo){Co-u3Mecrq^PKf;^Ja{{P;mh zNr_nB|HXuK%S=kbC1rmzO8yHDlFH%>z2+}m+#u9fVftmG`a2gp@O$~C1O7Q_F@xW+ zM95n>;bL5|Yl8oyc|uaZ@E=Tk6r{p8%jFewfl5DTqE_UhRUj{oUB0Cv{EJtpE-S4x nK!xgmxfJzJE)|!>mySz$C0OK@VS!hQ%jPGgHt}`kYKi0@sG()n literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/llgrablocked.BMP b/indra/newview/res-sdl/llgrablocked.BMP new file mode 100644 index 0000000000000000000000000000000000000000..847439670f94de1aedda70d2cbcd3ad27d31c8dc GIT binary patch literal 2102 zcmd^*7{@<~lBj4SR7g7&qEOP5_TGv_Qc9Bw?L^U(iuRygb#aRYO5Rf$G((qo}Bel9CcNYSf@+&6?Dz zRSRWhWmHsDs9n1@b?VfiZr!@nt5=Wu_3P81K?52#Y>29=Dr#zKsH>~fs8J&{G&IoE z)I>{5i^h!`)1*lgnl^2Uwzf7pIy&g;>e8%PGxYTIXx_XzEn2joWy_YdYSoI?ty|Nk zO&i*_ZA-g$?a>_Ms(`b31eepOiWDZ+_^Jdx^%(R z)D$x_GtAA+>Dsj`-MV$d!oq^?-MeFHX-SVBJ?Po9C%t<0qId7!^y$-wzJ2>*Wo1Rb ze*Lhvwx)mo{tOr}fPn)CGHB2s1`i(0kRd}DI&>(*h7Du*@ZpRYF@ljJM>1;EC`OMS z&6qJ`7&~?>iXX4`G!mL@dm_2(ouCA`knKOsEbLTQ|-aO{d zpU;8?3s|^tA#QGNxVyWvXwf1TFJ8=&B}?$|@W9j46E80>mM&e&vSrIyzI-_=R;*y< z%9X5IwTjiNSF>i#8oa%|S-W;EK0ZG9`uehN-8$BSbt?e@0c_j0jljS_wr}6gjvYJLxpOB$K|uru2eWI}E_UzU&7M7b*t>Tx z`}XZ)|Ni|PIB;>VKFpCLM>u-)C?O#sgocK4?AS4mA3x5C6DK%%@+7BD zo#OQA)0{bThO=kSa_-zY&YwTeg$ozBc<~~aE?wgC<;z^Ta)ql`uM!p(#Zr{GmojZ3(NJt7Kj;N2u38d*`WMl^aw)Bl3y#HYi4O=#M537D z>nR5%OyDKBR4G{%)mMUJB+in}k^`k!{EG=8p33esK2q@*NLQc^T%(13;w8zL<&O`}GQXxz9lO`0^JY15|2$jH#FSu zI(0%(Q4u92B|3NROqVWQP*zr^YuB!H>(-6#-MgcrqJpZbDr#zKsH>}^p`k&K9zD?1 z)TC$6o@i-l(W_T4diU;4pFVx)+qW;;+S>H%*AE>X9dvbd>EFLU0|pF0Pfw450|zo_ z&>#j69?Xy-L(tdPXXwzO7#J8}XlTf=VZ#_cd^jUUj9}!*kr){nF>2H(MvorNm@#88 zHa2GL*s++Hm@sbKIL413kEy9CW@cuXo0~IX!UQZVEU>h+Wa7k$Oqw(aD=RCkt*x=K zv0?J$$=KT3GG)pXrcRy8v}x0rK7BfNc6Q8|F@u>iXEJNnEbQ&=nLT?pbLPy!!NCDX zM@O8ToR~XzF7xKi!`a!H`Sa(qV8H@hTwHKE%^KFOUCX+4>sY^jJsUP`VB^M( zY}&Mm&6_u~Wy=<}ZrzHPmlxjN-fY{pjqTgF*g9e|GNN$*x_y z*u8r<0RaI71_rWc&mQ*f-OIjx``EvKKL-vR;NZc796EG}!-o$O6cj{oa4<)X9O3BE zqlAQn5E>fFv17+Le*8FLVPS-ahjZe@2~M6oNkl{hr%s*X^y$-_Idg`{$Vj51qKJ-; zCMG6^*w|R&;^K&pk0&7^fwO1Nl9-rCQc@D<&Yk1@`SV=3aDj^#FLLS9B`#mS%#|xw zNKQ^BB_)N_)Kt>a(ztr{D(UIzT)TFS>({SyfmDJkLg>({(_^M+yzU-(?)S|Nc#R zc{vpo6~g!ZKmPj_5VW$Q&Q}QgEEsi3L{KOYNNUL;#KQEIIcf+*SQM>YAc$6G72%o= zVlKqueKiwtNQBeHr$2(KNF}b5SK+$27}vr@A#r7@%>K9wcEY>Wo>-%TBL1fWHF#wL cae-@Mu|qYRzxfM);oti!lne9!^P1@V7thjLp8x;= literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/llnolocked.BMP b/indra/newview/res-sdl/llnolocked.BMP new file mode 100644 index 0000000000000000000000000000000000000000..61f0170cb34615a7b0c46c41a1bee31f8e6be555 GIT binary patch literal 2102 zcmd^^-?^^yobma7&wcLuT-Rf2X&{HF8OVTU=}cYRr4R!V6@R2kN1+RY zloZm^(p0Nf4H+33s#mX$tgI|GYSchZPL7&2Yf`ILE#&3psa?A^b?VeXK|z7Kb?c(2 zs7Sqf^{8LJK1xbTG-%L(h7B8{tgMWRiVCW#sx)fUh{lZ@)1*lgnl^1pvu4duQ&XdP z^X90ltJ9)I3tF~pNvl?^Xx+Ls8X6k3Y14+bZQG)$sY$zb?a(Px^%(7zyL!-L%MeDijk2K-MV$7d-v}2=+OgX zV`F;u?1_nq3B7vtqId7!n3|emW@bj8K7Huhw=ezr^`n3P{tOr}fPn)CVs38Eph1JM zu&}_=(h@5xE3B=p89aC}Lxv2&#>NI)TU&+>9g3Zu9rpJ23>!9#;lqbBV#EkWjvUFT zQKJ|=dNgCkjA889u{bz5;OOYcxN+lfa&p4i*_rX<$1`EV1SU?L$fQY=aB*>A^5n_5 zy1FuD$`qzfoyxRn({OWhWBT;zxVyXK;o-rI88etUb0)K9&0_ZK+02KK0ZG9`uehD$r6?>UCOd$%UHgAIV)DI zz|YT*l`B`WYSk+I{rw3D2w?T<)vQ^whQPo;)~;PkP*4!T!NIIsw~qDe*Rx^620}tY z2n`J-EG&$T8#fXj9!^9=1d)-EL`6jr9UaZ4O`F)fc{4FFF>Kkgg{@n+vTfTowr}6g zjvYJLxpODGcI_fIHkRGHce7{D9^&HS*t>Tx`}XZ4K0cm=gar2Q-_L;q2S`jzC>D!bB42L z&vNeEInJLyPikr^7cN}j;>C-krKNG{(j_imzRZ;?SGaohD%Y-ETNg zo}SLFTerA<`!;v(+~MxsyWG2XkNfxUlaY}@W@aW29z5XT!-qV2^oXpiEFM38%#$Zi zc>44y&z?OaJ3E`4oE&mW0Sq7AX2>>}lo(%mw>2v_zBA_*6;WL|Erg3HAf06XOD)0vv3&aKf6H6le7N$~sA%x^@{^l+d3&&TriPpaW DY!W${ literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/lltoolcamera.BMP b/indra/newview/res-sdl/lltoolcamera.BMP new file mode 100644 index 0000000000000000000000000000000000000000..c961d7a49c749cf414b3399d1a07824ff9ae369b GIT binary patch literal 2102 zcmeH{cT~@P6vtmF36YUiM#E^3&=PGUBN>$3!)1^xn zx_0eKw{G2#laoVUULFMn1r!w(>E69NJ$m$@XV0GW>eUM+B_))Vl~GYqK~+_i-o1O% zr%xZ$)YRzPw=e4I>h$Z^kN*ApGhn~~G&D5O)YL>vOABpnZFF>W7&vesy1Kdy8Z?N( zg9oFhr-#12J_ZH`7#bR4WMqV~u`wnlCJY%egrP%+GHlo|h7TW(si`R=MvP$O$dQa1 zHHy)rM`LDY#+Wfh+#LCKwi4!McZEcN>jSZ6~ zO=9xo$=KT3GG)pX?Ck8AI&~`c_V!GhHVp>{2c}P-&Wsr|aCCHJ=FFMQnl+2rvu87B z&K#VaoN#t_#>K@2S65fu+}xNucP{Sk?#!Dv4-XFy=Fgvxr>7@gUS4>6d$VA{0(^XY z@b&d&;lhP1TC@m1KR*^PUW~uLKTDP@As`@trAwC*7#PU1Wy@H;d^tfuK?DZ}6A}`_ ziWMtZxpF0|R;^<7>eZ}Svxc>6*RpQiI@YgW&xQ>f*tl^cp`oFKg@v(c()g0;gPS*Ra_iPDZr{Gm zojZ59d-pE)?%g9hJDZ%G9PZ!0Pi}554<0<=;lqbKdi03Lj~|nlmq&hnK2M%J;px+- zJbU(x=g*(>;>8PIzI@56SFb22DB$($*SvZ2hPQ9uQdn5XyLay>Dk`G5xR{cX65hXm z&xa2m`1tW7rKP2O`t*sivNFoc%c-cS;PdCteEIT)uV26N?b|mhD=Vq0s^a_i?^IV; z^W(>ln)Cf{|E38DU*v`bA-uH)uT6jj4Fujm2LTe0+W6;|+ENSfU w)-?Z3p76ZCLX9|q)l2(D>XLd=n+fM3P*rPxt^BX>-zW6<`3T2ZzvU176Ubak<^TWy literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/lltoolcreate.BMP b/indra/newview/res-sdl/lltoolcreate.BMP new file mode 100644 index 0000000000000000000000000000000000000000..08a4a9322d9873617fe4a73e60174df884b042cd GIT binary patch literal 2102 zcmd^;cQ_YZ6vscJkTRkzWJFU_rDP-_3N39^w535sLRJcyl@Xz6P$`P`AXI4Yp|nfd zsK`(HD=*LU{`tP=dCooexu5$z_ntcp%(cX*Gc6I&sO>4$yAbuDj@CCqwNc=LAS6Vy zX3Y>57Dhxwgyzkg)1pNSL`6jr6B9#RT%49ITOuJLL914+Xx+Lsl9G~0Nl76sEsczf z3~k!9K~`24IXOAnwrxwhcI{~2zC9f}bf9C$j&$nOiO!unBQGycmo8mUP*6ZoQ4u92 zCAxO)in6jYDk>_ds;Z)ON+sS2Qy^I5QYvNing{k!-frG`0(NA=;$zF z#0YeCb z>CBihgPAjDGHcc>Y;0_>wYA00&W_o$XESHc9OllQi@m))4h{~?n>Ua7^XIc*!2%X8 zT*#tDi&(sPF-w*#!O_u?rAwFM(;Hq!@~nlPfxtOyjZ_}J>K5l`1ttX>+6f3pCA7I{%qK= zfq;MjHg4R=rcIj&3=AYFD2U+TU^Z{wOh`xwp`oFKg@q9w9!^9=1d)-EY}vAfty{OU zZQC}YqN0e7jwU81hS=Cxwr}4~TwEOS@$u}~v4ez!1QHVyNlHp$=gyt%+O>=1DMn(pinVB3p za)hHtkCK&@MRs;J$BrH2`0?YMIB|lLCr@(f)G1D%KFygkXE=NIEa%Rh({(_^Mn%A<>lpk`0#;` zA3yTx(+yzU-@Q&UqTsPDgM zP1Hr>g*S0B|3h3OcqEO~E#Qsdyn20u*CJrQy+K?DYk6G?!8ZQ3KNw8Tq8ko?;`t|u65Y`R-Q48WfSz}C~`Pcjx&<2?E literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/lltoolfocus.BMP b/indra/newview/res-sdl/lltoolfocus.BMP new file mode 100644 index 0000000000000000000000000000000000000000..afb90a95e31fdda2bce51e3acabcbb8b85343c6e GIT binary patch literal 2102 zcmeH|XEYFM7{`A~(Nu(xXh|v*p->?jQlUu8YN&)%l4wh1v_sKEX`z&gO2cf@)L zp+g5ccI=3#s3>A$Vsz@%32||8BqSt|l$4}%=gvq;Ng*vQjf{*8UAlBZR#uj-UArPD zCx^VeJl(o=qkH%6^ytxpo;`cgt5+`+6cp&)yElr8iuCEz2PGvX`u6QhzkdDb-@iY~ z%F3vysGzE<%76g_7&vesYHDhztE)3;&>%E4G|<%4L`zGH!Gi}gWXKS-wYAaF(Lq;N zm!U(4GHlo|h7TW(o}M21`uZ3c7%*bQ2n-DkF)}h@FJ4=mlrEmtYGEJm8@E|iq)%Evu4d2)~;R4x^?UD_V#A|`t|tu_^@Ha z1~zWo$fix3@b&e@&(9Bke}4i30@%EHGh4Q7Ve8hdY}>Yt?c2ArW5*75?%c_)UAqVj z3?wKhh~VI0cJJQJo;`aA2?-%IG?cx2_p)!_KKAe5&w&F6IC$_NhYlSgEG&%h@Ngm` zA~<~bFh`CYAu=+OqeqW&?AS4mA3x5C6DK%%@+47FQA9^a6B84|sZ*yoefl)9v9X*v zbB42L&k`3G$GLOoIDh^;7cN{NK0cm=gaj^LyvU_Xm$-cSGKqgb?bFM0Kaf6#TZ*uF_EpFew&7C`UxO?|585tR5W@d8l z-aYQ$zt4jQ4|w?SA&(wC;_>6hJbChjtgI}aK7GowXU};4{5daPyx`@_m%MuQitOxc za&mIW&CTWY>(}Jv<&mGCPeDNeZ{ED2u&|J#q9Tfmizz87;qBYEl$MtA?%g}yzkg3z zSsCT!kX=*Z2$m1C-@WnE(I) literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/lltoolgrab.BMP b/indra/newview/res-sdl/lltoolgrab.BMP new file mode 100644 index 0000000000000000000000000000000000000000..f2ac68bf3cce2c148bbb6de92e75657a5ca513a1 GIT binary patch literal 2102 zcmd^X7>CaWQYb6gm6a_GyCo4qG7~~p!)PEQ+5=e?4O?Vu2-#UFWn^T8LX>RT z-W2_=Xj3C#6n+zlF*k2Em5T|UNVS52^BwNL|Iru zl954HRu(xqIppQ#sZym1RjXE|TD58@C@4_9dUX^P6;V=BqDGAx)T~*PTD5AStgMWR ziVC%B*QQRLI@GOOmwNT;QNMnDR8>`J(4YZoYHBoW*pNnz8qv6MW12K+Ler*AY1XV6 z&6_tzU0odw4GlCkHEGeJ1ua{)q*bd{v~Jy+Hf`FVrKLsNwry$Gt{v^$x2Hpg4s`6; zkxrdD(YbSHx^(G+wzf81yLLrKM+aS9UG((y(AU?eTeog>@7|prJ$lfyXHRP7F~ zz3J1Z4+aJX7#bR4WMqV~u`wnlCiLyw7gJMH`t|FFnVA{=`}b$SfB~4Bn=^3WKn4vO z#Nfe$v9PdU$dDln9Xga@!-ipLY02>6!?CimV#J6Mj2t4}$@7vA39`1ttX>+6f3pCA7I z{saUB5EvLpP*4!dmoI00oS+iyhYuB!2-MV#zgoF?p8cJAL z80*)sXTydKgolR{5fMRTWF%2hQEc3}kxiR6v3c`mwrttL)~#FFwrv~Rw{K_1jvYit zN3(P1PIm3uMNCW#yLazq&z?Q(-Mg24`}VPa|9%b}IKaV!2RU@;5V5hb#KpxCA0JOb zLIQ^mA0{y|kt0WraP;U=jvYHjQc@Dfk00m6i4&YWd6HA7PI3D5Y0jKE!`ZWENls4Y z+_`g{KYyMJ7cOw|;zcf9xJt5>{!{hBv# z-thMATi(5U$NTs1`S9TbA3uJisHlifpFZ*V^Jl(%`NG$)U-|a!8{fZw=f{s9{QUWo zU%!4)TwE;7_uq%`)2Yl=V4{l^|DB6rWd}-I1uBYvC`i#i4wTuJbe26*%5EuPTgHT3 zjwLrM>N1>CGElK#QCgKADaWEuObAh`=oM8GTs(>t{}W4#OLq(MQrZ&ge_@j5QhgOF z0{p BhjRb` literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/lltoolland.BMP b/indra/newview/res-sdl/lltoolland.BMP new file mode 100644 index 0000000000000000000000000000000000000000..64e63656250c5a7056f20f0725971206fd8d077f GIT binary patch literal 2102 zcmeH|hgZ*U6vtl?B|@T%C@Hd%P?TsWBV}hqsFbZpMTwTsFp5fK3ndy;_xri`bDwk1`RJQyh*M=6qM#y(6l#_THAEF#<3t2| z<*M97L}<{U0Sy~AL{wCiMvWTLxN&2|#KaI67pF;+CP+v~(6nh&nl)>Nq@*Oxn>VLL zix#wO*%B!!DO$B^g|xIZty{OIO`A5z$jBfoD@)t9ZE4r89qrqCvMHJ$v?~SFc|5 z?%f+zRaN@*>4Tb@8h!irMO|H;e*OBbihh6b9NnhYE`kU@h6p{1pTwzf8d z2Ms0|SN)8-}5wAx1_<3?Dw65hF%0a^y%xjT(iq zu`#1ZkH*Br1XEK}#*7)m*s)_7H*Or`$B$>igb7TXIFU({CShh~#^lM9nKESxQ>RX4 z+O%nyo0~Iz`gCT@n1O|b1v6*PWY(-%%$_|POG`_vtgNuMwr0+pIoR0PU~6m3+_`g^ zH*X&E=g()sf(0yGxR6DQ7O{BoVwNmff}Ncm_V)HHUAmNI%a-Bb;K1_b%W-sc#L3AC zXJ=eZ`Rvt|wM?(TSac;M;jiI)Ehj1HQh#`1$$a@9$4QKmZ#zZe-J@O>Ex0nJrtk5EvLpP*4zCw{B(I zwrvCl2NMz!LTG3x+qZ8gEGJ9e;h=T5@I!`ZcK7rS@wX3w5I?A^PUef##YfB$|C z95}$ig9nL-h~UtnLmWPQm?KAy5E&UsR8$m4j~*pDI+|n0j&c0>abjX(h>eXUE-sGv z_;^m7IKj!2CrL<1ATcqKq@*NHojS$o)2BIe<_u@gp5@%Rb0jAxlai9c`Sa(waNzg(u8^9VN?KYP>FMcYWMpvl>Q$~?yT-{--D2RwZEkVlUm@%Zs$o;-QN)2B~)_UswYpFiitix<3n z`I4-xEV8q+dG+cQuV23=CntwDZ{Cobn@e6^9&g{iB|kr(ckkZu{{4GCeE7h}j~^*0 zD4?*gkfNd@ii?XWDJkL8r%!zT{FyIbzVP+ySH6AwMrmm&Wo2c2|NfmHKYsA@=TFMZ z%c-cSsO;~r{e6KyzCiUKqQ?JDRbNnhs+CeXX4O_n)`q_qR8%PhPB@sgcLdWaz^kVA zkNofQ|5ILYS7>$03qfI2OQ#7jK_pBi6jVjk%>U+v-PPpzSC#+pb&J$(zTRgDlhlLj J9V#_-fnOJ?KV|>` literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/lltoolpan.BMP b/indra/newview/res-sdl/lltoolpan.BMP new file mode 100644 index 0000000000000000000000000000000000000000..ffbef21ec74db5e9ea6e262640df17f9594a8435 GIT binary patch literal 2102 zcmeH{c{G+=6vltb6jD-}C`!>lq-2alNhz8%QJEr@A(f&?r2&x!&9g)knlm(#1~jQO z8PZ7eKvC}ZeYe(P-O4}rpS#xGYwdUMb)K`&e)jXe@3FAemqujz;-D$WRDZY_KL8Q> z;~^%9LKg-xF&Z>zK*NR&5f>LnLP7#bNlB!nq>z@Drct9t$jHbbD=UkfoE(iCH%4Aw zo+eG2(6nh&6ciL_)~p$dii$LE-kcUKTA-w)M9Y>fY1OI~ty{OIO`A5fZQB-QWo1-U zRA|?(9qrqCvMHIyyS&>gv+7XHWF>^yt;A7rlG;Mqgi_K7IONU|@iup&>>_Mi?6# zV`5^0si`S_`}W1m%nWmLbNcn`hlPa&{rmUF($W$uD=P*J7{I`R1F^QYX3(HP*x1-G zc<^9`3>kv0tt~@`4rSP|Vc6N(VQ+8G@ZrN5F=7NGM~-CFs8Ng_JsJlG2gZyU!`QK7 z88>bm?U0rc=bHm-;ohehM;Njtc zr>7@Vr%uJo%Zq8#rZIi`bY{$$fw#9eK0ZG9`ugJM=f}*MGx7KLXV$D)%$_})IdkR^ z5D>uJxpSE}ZytexfdmBwF@OGi7A#mmaBwgoAt5YWxRB7$P!=s(#Nx$^S+ZmaVPRn` zUAmNI%a*Zx`EpjQSV4GrI1v#ML`Fuka^*^*qN0e7j%L-WRm8-^uzK}s)~s2>+O=z0 zw{9J=v9YXQzn%>nHn4HyMmBBQ#OBSL*|KE|Teogy+qP|N-@ct4J9e;h=T3I*+QshO zyNQd7W6z#F#K*_8ckf;j5)w#EOl04_eeB=Ap92RDaPZ(k4jno~Qc@Dh$;qUoq;UA~ zVU8R*!qKBgId<$A$B!T9#EBD}Jb98+r%sWYno3$)8tLijWMpJ;`t)heoH@hUvu8PX z?i}aOpXb7b3uIg(u5k70RdRB2$j!|qFE5X4*RFB> z`gLyHxWUbvH@S7|7Ww)4+`fIAJ9qAI_wHQ^3JSP)?;iK>-{--D2RwZEkVlUmQCL_= zQBe`a#l@7Al<@fRV@gX)dGh25PoF;J*|TRnfBu{oFJAESeD;h-!uPzvdw9{nLKgqMmxe zukz>q!VRJ`YVjAW)G`76x*ugNOq7b|t5g1yu`mh;ughG}ua^B&nEyUrSD{+c{GHYV F{{?v~N|FEo literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/lltoolpipette.BMP b/indra/newview/res-sdl/lltoolpipette.BMP new file mode 100644 index 0000000000000000000000000000000000000000..2d27118289e22acaf863e508f18aa66d40f210c6 GIT binary patch literal 3126 zcmeH^F%H5o3`N5X8w(>NC+Gp#xi_~8E{4cT9P4F>1X3cUa)17RZk_vMJEiy9@!NF__o&qv)Vr1V@1OyE1MiQ|$MIcIGIzG&E@WND#YhVvjWyM^-QIqxr43vkc7 zWew^t2Bp^oKQ*w~>n_Y9N)cq?k)^pcA#dBt#-($qi`+8Is6650#>5AX8*$KvaZerZPv7 zp-@VtiSOKdYkhyzz3cn)J8SK|&pOY3fA8;o_c_PZTvrM4rK(S|}(eP`h?*6crVzQ>P9}N=nqNTNh^8 zY}k-SjT)hRYo=;+Y7b7#7A=|b18UFp`X z8{NBir$>(-^z7M_UcGwJyLWH;^yx$2zJ2M}uOI#U_eWP(7d<^a1`HU0zP>&N1_l@! z8e(K*#K3_A88m1R#>U1B9y}Nm6BA5LO&Ky|2t$VsW!SJ`3?Dw65hF%0a^y%xjT*)1 z(W4nNW(;O#W|*6sGj{A)#*G`t`0?YJFku1{Cr)J2q)AMkJQ)iM3#Lq&f~BP;Q>RYF z%E}6BYip)Wo5u9%)3LF!VaALZ*xK4MbLLF!?Ch8|YZkL-&&J-~o;h>oFn8`;=FOYO z{Q2{7aByJ3f(0yGxR6DQ7O{BoVjLYES+ZmaPEJlZJ3F&<=~9+0TZW5^3(J=;$JN!9 z6)RTY=H|xAl`C1bY89(juV&4fHMqOGvv%!TJUl#Dw{9Jto}R2nHsIyu#m0>r z*|cdBn>TM}%a$!{-MW=++qSWN`*wEh*ul=7JK42s7rS@wX3w5I?A^PUef##YfB$|C z95{ftw>LgMKKT0ja`50m{QUgz_xI<}p+g)#e3*cM00IL8IdbF(M~@yQC@6^F;9x>R zLI@2F<=C-f96x@Xu&^*roH)VBlP5WK>J+C>pXSV&GlYkSbN1|6&Ye3)L_`GV&!6YQ zg$rD~c#%t&E)f|SNmNu6(b3Vw#Kds<@@1}Exx&?}SBZ^{<=VAtT)%#uxVSjtJ_hFzvj)GH@toOmh|*= z-o1Or`}gn3$jBfwGm{S=KJfA5N3ycA`1I)$pFe-*%a<>F{rZ*c>}+y!a`^V`8{fZw z=f{s9 ziVFVx`NQA8e?|5Ek1p}=NV*@ymZf?Yupl4|DGCA-h-9w5MG}fsE&y@AYK|8r6{VJv zUx*cUh{S8QSE-#O5~yyiDs>G+@~A4j`UbI@bSxwkVq|flXELy)AQ>-`C{_j*Ym2y) z!mGGciAsI($yBdiQkpCS|IJ@bXYz07Wqn1mdM8p4xO8zbmx(3kC$UoFEIT?W=^ti4 BW&;2K literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/lltoolscale.BMP b/indra/newview/res-sdl/lltoolscale.BMP new file mode 100644 index 0000000000000000000000000000000000000000..882515e5e3c1a7450f967775f0080c7b64e7a0b2 GIT binary patch literal 2102 zcmb`HcQ{sk7{@=NGD=HBC8LzmCM_}&rL?sqMOp136=jqWkroQkUYZ&jqGeSmqe+vd z(xmBq2Jh9?>v{fq?{odeIiGWn@BKU1F|#(1M`Q+apd;96R1X=dfrwU5GJ;h&go}&} zb?VeXR#p}{IXUXqtxLUn^{8LJKJxPNC@3hPsHljNk`fIXG@xO_hA1m5)2LA+8aHlC zlO|1Q+O#Rnnl(d3MTO?go71923tF~pNvl?^P*qi>b?er&Y14+bZQG)zrbfGV?NC=& zM?*scO-)U-w6tj7zC9f}bU<5Mn~ohj(y3D?baZs++_^Jdx^zKTSC_6`yV9*&H@bK4 zPLCcv=-IO;y?XVcckkZl>FJ@buTP&oeK0UEpl{#4^y}A;{{8ziV88$d4jhP~p&>>_ zMhqG>2xDVoOiWBLH8sV|%#6W<2V-t-&X6HPu&}Ve($bQlLx(bK*f6ZDtQbCgI3q@k zz}niHkt0VkYSbu3j~>mKF=H4zb}Zw@jbr@y@z~hdFk!+3CQh8lq)C&QJb5xxrcA-s z)|RPLr($Pk$FynFu(!8o`t<3{m@xwf2L~J-9ho_ECbMSE!pX@AXJ=lWuY}l}YjT<+zY11Y)Z{Ez7EnA3)h#)dD zlBlRCwr<_Zwr$&pj*ccKCWhG9ShjE9PF!3Z@$vEO*s+71J9n~c*DiMN-p!spd)T{o zFZ=fGWB>mB95`@*g9i_C=+Ge&5)wFk_%KI~9O3BEqZ~VSjN`|TbK=Aa5)%_SdGaKu zPMzZP>C>D!bB3g(B+i~a%eiysIDh^;7cN{NIXRh&7cY{Ml0s@~Dwi%@;_~IoT)A?E zt5>gb?bir|pHD$S0fmKy+_`gyyLaz$@7_J`-@ng;2M>7o@F7J-MHCko^XSnd9zTA}lP6Dj z`t&K!o;~CF^XHV5lu%k)%8M5-c=_@ruU@_4_3PKXdGm(1Z{Jc@R>r$`?|A?IJ>})) zeE9Hzj~_qs>C-1ZfBwvuFJJij^(z$>6;xJM^6lFj3KNR0_Ot>n4k4i|ssxwNBy;gAQn)CG6fUSwYJ5rg5lE`8t~P(M zv>N&U%`a??D0KDoSN}x#uV;VWO6H1$X5#fmkV|O zsiq(r5R78P1D zQ%1x4oCjU+)$4is=e@7%cYf!b&-s4uan5xNjkV+vhn6g;iO!TOmkgCaOe+sEqFq?R zCL=?Q8a1d{vnH~#vdGEFQL9!hYS*rfyu3Vh>eQib-MZAPSC9Jj>(ih?0~$7LNTWuL zXxz9l3JMA|Y0`wIO`FoJSu>h9Z%&IAEoj-YC9PVuLQzqX)~#F9rcE2#wrxwhcI{A7 zQlfqP_9!bWqoSfhhYlT3RaK>9$BuOB)QQfWJJY307u3|$=-Ra_-MV$7d-v}2=+T3o zJ$s_Au1>FBz3AP$HyRom^y$-wzJ2?msi{f7e*MtW(n4EXoBsX#qobpPuC6Wv1`J@} zz=7!L>7lQ$kAZ;!g9Z&^@ZiB18X7WW$Pk7O9m=p_!x%n%I7UWBj2JP3kt0VkYSbu3 zj~>mKF=H?`HfHSDv5Xrxj`8EiV`5^$gb5RvIB_DACQV}UIRx%Cu?I zFf%j5+}xb$)2B0I#tbYhESNcSCYF|#SXo&yYt}4g&z{YkIdhmhcP{hh&13%j`B+<9 zvtYpjY;0_>wY6p8!i6kav@*4h{}1S+azsOP8{2*)o1`vTD^TR)~#dx`t@wsuz`&mH?nEd zCN^*0jJvx#TefUr>(;Go+qRAE+qbi0#}0Px+=+*W2cDjuczJoTYu7Hky}jAJdpABl zKKT0j;^*hbo;`cmyLT`9_U&W;{{0*{aDamc4|3?xAr2ot%#kBUIC}Ib$BrH2`0?YM zIB^1he}7J%Jjtn3r#OB3G-uA7;q2M7oI7`p^XJcV;lc$jUcAVqOP2@;2;lPN%Uro~ zg}}f-f`Wp$di5&7!NG)tgb*4UN?2GJ*REaT`t|GFxN(E<@Ngm`BDi_;Cbw?g;`Z&^ zL`Ft(=gu9XqN0e7jwU81hP!v~5*r)Ky?gh#fB!yladA9&@PPREcoGs4c=+%kj~+eZ z@#DuNCMNRa$rGMFeM(YN63NNQq@<*fnwrY9XU};4{5daPyx`@_m%MuQinO#e($mv< z{rWX;-n`-M+qYz7WRRJeNmf=C@7}%R{rmTP`0#;`A3yTx(W{zI~&(xR{cX5=u);DJv`E`}gns`0<0EKY#M; z*DuP;%Z2{_*Z7Me(lh?0B+3mr{F0&3{%dzWy!$@8rb8lE#IBipKJ%ZM}$i5aT&)vHDCOq#iYv0O46= AuK)l5 literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/lltoolzoomin.BMP b/indra/newview/res-sdl/lltoolzoomin.BMP new file mode 100644 index 0000000000000000000000000000000000000000..e4e46cc70281c40f2b09e0536e80ee282712c4de GIT binary patch literal 2102 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 OLjd4UCjZt=5cm)KU57CM literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/sizenwse.BMP b/indra/newview/res-sdl/sizenwse.BMP new file mode 100644 index 0000000000000000000000000000000000000000..6d069fa7658e571f4bd1f7cd71e0fa3b6708f8d4 GIT binary patch literal 2102 zcmeH{XIKwh7{-68RI-aQA`zizi6W&%$X;!dBxIIRMB1`tg;12eD$&rAtV$^gWfx7O zLgDRSK9=|W@_zGN=ef?gp8I~D`<(m3F)-5-r!lldK&jy*|2u{F4K&oHB%2bU22hZK zO-P7Vty&>0ER2YV2%@5*v~JxRF)=a3#l?}3kf2SQHb_cJ(zb0|+O=y(`}XbW(4hkz zJ9eZ~r%rV4+!-k;DWs*P>C&YOUAuNgMn(o%Sy{Su>qhtP-RaSz2R(cCL{3hQUcGwJ zyLWHo<>l$qrwmN=ghIIFLbu1~GW>V3d`WQBhH0 z$dDln9Xb?MRaMl~)KFJfM?*scO-)UP4I74*mKMW@4`;-P5ol{`qobq4$dMx%HEI;P zy1I-WJsLedJ@obU88c=K1_lNg8X96`WQ4J?F(xJ^j2%0capT5eYHG^(@#C2=VFD8; zPQ=X2j7gIwF?sT2rc9Z_)TvXMHf_~B>uy^lXf`WqBw{IW& z_wVPxfdd>oc#uPf4iOw2%;Cd_IdbF(M~@yQBqW4m$BuFQ_;F60I6-J=C}Ck?oIH7w zQ>RW59v)6aLyE?l_4#fulYbmn? zNTQ;mh>nit+O=!M#Kds@`gLyHxIt`eEOBvh#K*^zkdVO5n>R^JOe85OiR9#DQc_Y# zO-<$2ty`p}rE&ZAZPL@zxpU_ZckkZi-o1O=zkiL@%Zs$o;-O%ettd$1qD2P`jltSp7H$oa|#O!DJm-B#fulbeEE`B zuU_%`^=sa|dBfYcZ+Z9b9mU1Pl$4b4{{4GCeE2|VX(?r8Wt5kfQ&CYtWo0E*RaJca z_>oVaKJoeUXTE&-LUnaDH8nNV*4Fa%>sP*g`^NY0->IvsqrSeLA3uKZ^XE@~{rV+% z-{1JJ4m5q2EwcrV{?XG$Ld%{vz=GA1Koi_N4(Y$UTfiG93x+o^n~8?zf7AZs(**s^ WD>sQX;(sJGn%m6H{+9kv2mS$!#fbO- literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/sizewe.BMP b/indra/newview/res-sdl/sizewe.BMP new file mode 100644 index 0000000000000000000000000000000000000000..878df453a4a9ed6ff177d690f1aab46e51c71dfc GIT binary patch literal 2102 zcmeH{cT^8-6vsa)lqjhbp^$`7p)%4i8dMUZ$S9d9*%TEO$|wzGRfN#8nzFT!UC5|Z z%AQ4$e)M|J(R)sRzvsB;+;i`9zjr?OIgg>4mMA|-O9WKwHKhg?q5-J4ON;+vgz7;7 z3xtpm&6+hsSXdYl5fPd3~Os#Pn*#l>mex;1Uuv_V2b0!c|p z+O}+AJo*;=-an1 z{rdHzfB*idtE;1-p@F8RCIbcxVBo-k3>q{DEiEmywYAaF(P8l5!3-HPgrP%+GHlo| zbaizZK72TOdV1*V>tkSGfT5uwBSws1IM8#>NI) zTU(}1oyxRn)3CF%WBT;z%$PBQnKNfHYt}66?d@@JaA5ZA**H2nGH1>l=FXkVym|AO zKYu<87A#=l!i6|FIk9NbBAlI_adB~B@#4j}y1KGt$r6?>UCOd$%UHgAIV)DIVCBk{ ztXj2-)vH&tX3ZMh+}vXX<=ZC+)KU=nJVe8hdY}>Yt?c28#5D-9MU?4ko>>wy8h~VI0LPA0a z4Gm@I&YgsXg%KVe&aPd%*u8r&Cr+H;TNA>((u9 z-@eVAJ9oHy_b&JD-6KCgpMrt{?%%)9g9i_I`0ycxg@rtN^oYlgAM@nN6P`YON>Nb} z#l^*xl$7x7*)vK@ODQWWqrAMF=g*&0QBgr({T;)YMR0Tg$g^-}wIhJ9Tw+ zg8BZ^|KtYvwXFuxsA(Fu`H%d=p?=-JzI%c42UdR+yoP_Nv4a5n9bZ@1C_z*4f&#ze a8>j!-LBo9i)t;bU6Z1D}>93*b8~6b<0EaOE literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/toolmediaopen.BMP b/indra/newview/res-sdl/toolmediaopen.BMP new file mode 100644 index 0000000000000000000000000000000000000000..ac4b231994c1f3ccd69b04c35759fac271b1dbc4 GIT binary patch literal 3128 zcmeH{y$-@K41^8o1``t_BTs;s*?Di?3Qj$+EH^SVI7mpfl+?}7ch2?aay@Tlj1&4J z+Tqz&vPUMe#{6!>HV&Y>EwMQ8pANiU;mS4TK;YhMk@eO5l24C#n)Lb!SBVt!0Rd18 zwi4uX9(jk$o=3@5qSVkjfmiw7=-@X|WBI9_qQ_vZX8VZM02 zNSGoqj*llJ;CcP(Cr3-7xMfX^a1=bJbTy%hgV*>ba1@JtD|nG_2><2V!WEyxON(uo UUkGY>vcKlGWEIHc;HWtF1ys3!wEzGB literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/toolpickobject.BMP b/indra/newview/res-sdl/toolpickobject.BMP new file mode 100644 index 0000000000000000000000000000000000000000..25469fc3a86c94b64c87866a6c1fdc227d41e7d8 GIT binary patch literal 2102 zcmdUvcQn^)7{EVDqN2T#kTjH3N=qpc(NHQXWktIrG?CKKBGS&Nv}h{HY9d9_FxmrA zMn*<;e?Q!=dk*ej_uO-zbKdX!eBaOWJnu8kd9@7G#iD8Rq)8LR#KdUYv?=1^;z&qH(5zWAnm2Dwixw@Al$1nDN{W^( zThgjkD_Xa1O`A4tXxp|e?b@}Yef#!w=+J?V9XrygQztri?o5|1UFh1iE7H=^$jHbb zD=SO4ZrzZRlcRh0?#Ro_qoAOGqM{-_dh|d^Nr|34d!nqYOs`(O=-sA&37__vs7&~?>or{^78T01NWB&a4n46npVPS!#r6pEYR#;nGvtYpjY;0_> zwY6p8!i6kaw1~xv7qeu^5|%Dq%Ccq4SiXEYD^{#v<;s=V+1asb)hg`m?ODBgH4Y9A zI66Aw(;Go+qRAE+qbi0#|}I^JlMH&C%bm-V)yRd?Af!2y?giK>FJ4=mlyl??ZeyK z8y_DZ_V3@1udgo$4jka%!Gjz+bcn-;4|C+m5sn@`%CTd|IDY&%etv%V`}-3R5I|sH zASX_o;N;1ZoH})ipr9a5pFYi*GiNw^_AKYlo#XuZ^8^P66A}`_g$ozBc<~~aE?wgC z<;z^Ta)ql`uM!#>%C&3PxPJXQVPRq1xN(E<@NjP4yh%hv1d)-EL`6jr9UVJvc=+%kj~+cDF)@*(q$D0c zeoS(5GEbg7Atfb+r%#{q?AbG(KYz}P7cWRnO(iWYjr8<%GBPrF`SK;NUcKV=>({(_ z^Mb zULN`R`4kisP*_;Vw{PDlDk`G5xR{cX5=u);`TqSoWo2cQmzPsfQ9)&8B|m=r;OEbu z{QC7vSl|CoXgF;_VGSDm18)FVg>8rn3>v@!Mm@Z`B%yDe$qS!p!JGt8IJBC-T7&x= zuWPQq<5x$h^I>?0 P799T9yuQ5t_47XfnucV} literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/toolpickobject2.BMP b/indra/newview/res-sdl/toolpickobject2.BMP new file mode 100644 index 0000000000000000000000000000000000000000..09df69e675e89c8797bf03c3a96095248e45fd3f GIT binary patch literal 2102 zcmeH{cUX>X7>Ca^iHf9*hP04Ph&D+}*`ts>%c!griX??78D&&bX2VK$l)X0O|+xo$1o03thW*rCYad7#SJSy?b|h^yop)o;@)(Hl|mvUi9wW z8xs=~OifKOGc&{7+#CxF3oI=yv9hwFPoF;Y?b{b?Yis)T>xYev4gLG~$JW*sJ3Bk< z?d@@JaKO>gkpTk+;N;|lv$Hb;2M%P=pg{~CJeVOvhA?#KP=*Z~#_-|888Ko6BS(&8 z)TmLoxVYfz>dNTRqZu=13}eTR#m&u)apT4@e*AbQOqjsLi4&PLX%dqsPiD%LDNLO@ zm1)zaF@5@UX3Utu%$YNBcX!9b!-H9~W-)vAZ05|F!`!)Z@$~e>%gYOIZ*S(!o5%e5 z^I5Q90Sgx{WYMBU`1ts+c=2Lu!NI|-UcH)-kPt#cLs_$C4Qtn~W!<`UgoTB%e*JnjY}i0}csLOe z5p3MJk;uqMHf`F(=FOYgvSkZfw{9gWDvIdnXtr(J#`f*o*|B2>J9q9RCMJg1*jVD? z;@Guo7xD4&?B2bbgoFeV6BF69XAgV#?q%P;eeB=Ap92RDaPZ(kl9G~0PEIBzC56<~ zR1O_F#Noq-IdbF(M~@!m*s)`zrKNHF_;J$H(>ZbC1Se0Pg|^7Hd~@!|z9U%uqkt5>{!{hBv#-cV3bz}vTPDJ(3csHlkI;$lil zN+>NY<=wk?ynp|m4jA4RWHJ|>#OlE#x*x0|Jt#zcCknE UckzG9F6^zCV!Z literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/toolpickobject3.BMP b/indra/newview/res-sdl/toolpickobject3.BMP new file mode 100644 index 0000000000000000000000000000000000000000..fc286980501efa6815696413f6c8e268b37ae1d5 GIT binary patch literal 2102 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 EJFbFWmH+?% literal 0 HcmV?d00001 diff --git a/indra/newview/res-sdl/working.BMP b/indra/newview/res-sdl/working.BMP new file mode 100644 index 0000000000000000000000000000000000000000..26dec59afe10818db0cff219f91d41dc647dd754 GIT binary patch literal 2102 zcmeH{cQ}`87{@q>0cll2lSDEkz`0Xi2opc9gb4SeLA(B_%p{?o5|1T~Jn5Mny%1u3fvLs;Wx2ZrxB*Q=@zL?)2!Ua6&Wsr|m^pJMvu4d=_Uzf%+S)Q_&K%~>or|5F z9rpJ2%$qk42L}fn9UYlJe?Cr5PApik0B2`s7A{9dkvV^5em*VQ` z%Ccq4SiXEYD^{#v<;s<;TD1x{H#b(VUX8oEJ8Rag!NbD?Pft(Qu3gKzb?aEaemxsD zY+&QYjd*!^;qC2>kB<+&zP|YR`Qh*H&!$bA*t~f&TefUr>(;Go+qRAE+qbi0#}0Px z+(|${0D*yl?Ao=9-Me=a6cogsJ$u-@cQ5<)?PLG`{Tw)OfP)7Qa_G<@f`fxOeE2X& zjvOH*B!tk=P{P8(IC}Ib$BrE%JUpC;hzKGhBZ-QNB04&nTwEOS@$n=iByjHBInJLy&xH#YxOnj*mo8l*F)@*(q$Dn1 zzRZ;?S4d7y=IYg}T)TFS>({SyFM0NcaQt`@AKfn10Ftn$fHM($jHbbGc%K{tSqv#vw8gZF;AX6Atxt?+}vF9^7454 z^eNAtJtIFqpXbk?^Wwz|3JMA+EG(p`sEC&@U-IhJD~gMYDJdzTw6v76vNB%3eoc9K zITaNZym|A6%F0Trs;YSV_AT$;z2p7+_k8&9fsY?Q^6AqjK7anqmoH!V`t>W{zI~&* zx|*7r8ft56h4cL%DJivee?q7g{Wbn2|Fc}QfdC8c;zx)S2=N~Z;r`bif3Tl|-!8Qd z2}TrJ2o{m`Lh!e|z6DYB^#*n2zxP)^pHL<6_|;wTEcC7qQTQ(c(fH>J{vj99(|_aW EJFbFWmH+?% literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/xui/en/floater_auction.xml b/indra/newview/skins/default/xui/en/floater_auction.xml index 29f8b49794..fb0994b4cd 100644 --- a/indra/newview/skins/default/xui/en/floater_auction.xml +++ b/indra/newview/skins/default/xui/en/floater_auction.xml @@ -1,9 +1,9 @@ + width="150"> + + diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml index a243cb399e..5ee136c422 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml @@ -49,7 +49,7 @@ layout="topleft" left="80" name="Discard" - top="302" + top="283" width="100" /> + width="222" + sort_column="1"> + shortcut="control|M" + use_mac_ctrl="true"> @@ -981,6 +982,57 @@ + + + + + + + + + + + + + + + + + + + shortcut="control|shift|3" + use_mac_ctrl="true"> @@ -1615,7 +1668,8 @@ label="Debug Console" layout="topleft" name="Debug Console" - shortcut="control|shift|4"> + shortcut="control|shift|4" + use_mac_ctrl="true"> @@ -1627,7 +1681,8 @@ label="Fast Timers" layout="topleft" name="Fast Timers" - shortcut="control|shift|9"> + shortcut="control|shift|9" + use_mac_ctrl="true"> @@ -1639,7 +1694,8 @@ label="Memory" layout="topleft" name="Memory" - shortcut="control|shift|0"> + shortcut="control|shift|0" + use_mac_ctrl="true"> @@ -1651,7 +1707,8 @@ label="Notifications Console" layout="topleft" name="Notifications" - shortcut="control|shift|5"> + shortcut="control|shift|5" + use_mac_ctrl="true"> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 91c19badfa..217178a5ef 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -483,6 +483,20 @@ Joining this group costs L$[COST]. You do not have enough L$ to join this group. + +Creating this group will cost L$100. +Groups need more than one member, or they are deleted forever. +Please invite members within 48 hours. + + + - + - - -Creating this group will cost L$100. -Groups need more than one member, or they are deleted forever. -Please invite members within 48 hours. - - 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 9a4480127d..6f01202680 100644 --- a/indra/newview/skins/default/xui/en/panel_group_general.xml +++ b/indra/newview/skins/default/xui/en/panel_group_general.xml @@ -212,4 +212,4 @@ Hover your mouse over the options for more help. value="Not Mature" /> - \ No newline at end of file + 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 06ecfdc995..f7d7d52b68 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -217,7 +217,7 @@ My Avatar: width="237" top_pad="0"/> - - - \ No newline at end of file + diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index f620e8f2d7..360fd3c2db 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -230,8 +230,10 @@ Yes (Happy) Yes + Loading... Offline + None found. OK @@ -2110,6 +2112,15 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh Add Landmark... Edit Landmark... + + Ctrl- + Cmd- + Opt- + Shift- + Ctrl+ + Alt+ + Shift+ + File Saved Receiving @@ -2225,9 +2236,8 @@ Running in window. Can't find suitable pixel format Can't get pixel format description - [APP_NAME] requires True Color (32-bit) to run in a window. -Please go to Control Panels > Display > Settings and set the screen to 32-bit color. -Alternately, if you choose to run fullscreen, [APP_NAME] will automatically adjust the screen each time it runs. + [APP_NAME] requires True Color (32-bit) to run. +Please go to your computer's display settings and set the color mode to 32-bit. [APP_NAME] is unable to run because it can't get an 8 bit alpha channel. Usually this is due to video card driver issues. diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 545fa29675..89f916937b 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -696,20 +696,30 @@ class Linux_i686Manifest(LinuxManifest): #self.path("secondlife-i686.supp") if self.prefix("../../libraries/i686-linux/lib_release_client", dst="lib"): - #self.path("libkdu_v42R.so", "libkdu.so") - self.path("libfmod-3.75.so") self.path("libapr-1.so.0") self.path("libaprutil-1.so.0") self.path("libdb-4.2.so") self.path("libcrypto.so.0.9.7") self.path("libexpat.so.1") self.path("libssl.so.0.9.7") - self.path("libuuid.so", "libuuid.so.1") + self.path("libuuid.so.1") self.path("libSDL-1.2.so.0") self.path("libELFIO.so") self.path("libopenjpeg.so.1.3.0", "libopenjpeg.so.1.3") self.path("libalut.so") self.path("libopenal.so", "libopenal.so.1") + try: + self.path("libkdu_v42R.so", "libkdu.so") + pass + except: + print "Skipping libkdu_v42R.so - not found" + pass + try: + self.path("libfmod-3.75.so") + pass + except: + print "Skipping libkdu_v42R.so - not found" + pass self.end_prefix("lib") # Vivox runtimes diff --git a/indra/test/lltut.h b/indra/test/lltut.h index 47ea9d3f9e..bbb437c3f9 100644 --- a/indra/test/lltut.h +++ b/indra/test/lltut.h @@ -74,7 +74,7 @@ namespace tut inline void ensure_memory_matches(const char* msg,const void* actual, U32 actual_len, const void* expected,U32 expected_len) { if((expected_len != actual_len) || - (memcmp(actual, expected, actual_len) != 0)) + (std::memcmp(actual, expected, actual_len) != 0)) { std::stringstream ss; ss << (msg?msg:"") << (msg?": ":"") << "not equal"; diff --git a/install.xml b/install.xml index e7a7648345..44224664ca 100644 --- a/install.xml +++ b/install.xml @@ -53,26 +53,12 @@ lgpl packages - darwin - - md5sum - 40b8a63b553d91304588fba6796d7cc1 - url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.5-darwin-20091006.tar.bz2 - linux md5sum - 298fd8a3351f6a8d757d205a1e9ad82f + fce0ff7d2cdf0f36c1647e6a3916e29e url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.12-linux-20091006.tar.bz2 - - windows - - md5sum - 33bb17ecbef6cdadff533d97135f3a56 - url - http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.5-windows-20091006.tar.bz2 + http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.12-linux-20090218.tar.bz2