Merge. Refresh from viewer-release after SSA.

Mon, 26 Aug 2013 17:53:30 -0400

author
Monty Brandenberg <monty@lindenlab.com>
date
Mon, 26 Aug 2013 17:53:30 -0400
changeset 40716
8d3faebc1328
parent 40715
b0fe9917d9bd
parent 37890
0568de92960a
child 40717
461a27e3b944

Merge. Refresh from viewer-release after SSA.

indra/newview/llmeshrepository.cpp file | annotate | diff | revisions
indra/newview/llmeshrepository.h file | annotate | diff | revisions
     1.1 --- a/.hgtags	Thu Jul 18 17:27:31 2013 -0400
     1.2 +++ b/.hgtags	Mon Aug 26 17:53:30 2013 -0400
     1.3 @@ -56,11 +56,11 @@
     1.4  54d772d8687c69b1d773f6ce14bbc7bdc9d6c05f 2.5.0-beta2
     1.5  54d772d8687c69b1d773f6ce14bbc7bdc9d6c05f DRTVWR-33--2.5.0beta2
     1.6  54d772d8687c69b1d773f6ce14bbc7bdc9d6c05f DRTVWR-33_2.5.0-beta2
     1.7 +b542f8134a2bb5dd054ff4e509a44b2ee463b1bf nat-eventapi2-base
     1.8  b723921b5c711bd24dbe77dc76ef488b544dac78 2.5.0-beta3
     1.9  b723921b5c711bd24dbe77dc76ef488b544dac78 2.5.0-release
    1.10  b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-31_2.5.0-release
    1.11  b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-34_2.5.0-beta3
    1.12 -b542f8134a2bb5dd054ff4e509a44b2ee463b1bf nat-eventapi2-base
    1.13  63a6aedfce785a6c760377bf685b2dae616797d2 2.5.1-start
    1.14  4dede9ae1ec74d41f6887719f6f1de7340d8578d 2.5.1-release
    1.15  4dede9ae1ec74d41f6887719f6f1de7340d8578d DRTVWR-37_2.5.1-release
    1.16 @@ -458,7 +458,9 @@
    1.17  9b1b6f33aa5394b27bb652b31b5cb81ef6060370 3.5.2-release
    1.18  a277b841729f2a62ba1e34acacc964bc13c1ad6f 3.5.3-release
    1.19  fb1630153bac5552046ea914af3f14deabc1def8 3.6.0-materials-beta1
    1.20 -69429d81ae4dd321eda2607901ef0a0fde71b54c 3.6.0-release
    1.21 -69429d81ae4dd321eda2607901ef0a0fde71b54c 3.6.0-release
    1.22  0a56f33ad6aa112032b14a41dad759ad377bdde9 3.6.0-release
    1.23  75cf8e855ae1af6895a35da475314c2b5acf1850 3.6.1-release
    1.24 +f6741d5fe8d632651424484df0fe0cb4a01e9fbe 3.6.2-release
    1.25 +fe4f7c5e9fd27e09d03deb1cc9ab3e5093f6309e 3.6.3-release
    1.26 +83357f31d8dbf048a8bfdc323f363bf4d588aca1 CHOP-951-a
    1.27 +91ed595b716f14f07409595b734fda891a59379e 3.6.4-release
     2.1 --- a/BuildParams	Thu Jul 18 17:27:31 2013 -0400
     2.2 +++ b/BuildParams	Mon Aug 26 17:53:30 2013 -0400
     2.3 @@ -26,6 +26,9 @@
     2.4  Linux.gcc_version = /usr/bin/gcc-4.6
     2.5  Linux.cxx_version = /usr/bin/g++-4.6
     2.6  
     2.7 +# Setup default sourceid so Windows can pick up the TeamCity override
     2.8 +sourceid = ""
     2.9 +
    2.10  ################################################################
    2.11  ####      Examples of how to set the viewer_channel         ####
    2.12  #
    2.13 @@ -131,17 +134,6 @@
    2.14  viewer-materials.build_CYGWIN_Debug = false
    2.15  viewer-materials.build_viewer_update_version_manager = false
    2.16  
    2.17 -# viewer-chui
    2.18 -#
    2.19 -# ========================================
    2.20 -
    2.21 -viewer-chui.viewer_channel = "Project Viewer - CHUI"
    2.22 -viewer-chui.login_channel = "Project Viewer - CHUI"
    2.23 -viewer-chui.viewer_grid = agni
    2.24 -viewer-chui.build_debug_release_separately = true
    2.25 -viewer-chui.build_CYGWIN_Debug = false
    2.26 -viewer-chui.build_viewer_update_version_manager = false
    2.27 -
    2.28  # =================================================================
    2.29  # asset delivery 2010 projects
    2.30  # =================================================================
     3.1 --- a/autobuild.xml	Thu Jul 18 17:27:31 2013 -0400
     3.2 +++ b/autobuild.xml	Mon Aug 26 17:53:30 2013 -0400
     3.3 @@ -522,9 +522,9 @@
     3.4              <key>archive</key>
     3.5              <map>
     3.6                <key>hash</key>
     3.7 -	      <string>91752db72202807cffb33c1ec3fd90fc</string>
     3.8 +              <string>91752db72202807cffb33c1ec3fd90fc</string>
     3.9                <key>url</key>
    3.10 -	      <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmodex-private/rev/276321/arch/CYGWIN/installer/fmodex-4.44-windows-20130521.tar.bz2</string>
    3.11 +              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmodex-private/rev/276321/arch/CYGWIN/installer/fmodex-4.44-windows-20130521.tar.bz2</string>
    3.12              </map>
    3.13              <key>name</key>
    3.14              <string>windows</string>
    3.15 @@ -761,9 +761,9 @@
    3.16            <map>
    3.17              <key>archive</key>
    3.18              <map>
    3.19 -           <key>hash</key>
    3.20 -	      <string>aff5566e04003de0383941981198e04e</string>
    3.21 -          <key>url</key>
    3.22 +              <key>hash</key>
    3.23 +              <string>aff5566e04003de0383941981198e04e</string>
    3.24 +              <key>url</key>
    3.25                <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/273073/arch/Darwin/installer/google_breakpad-0.0.0-rev1099-darwin-20130329.tar.bz2</string>
    3.26              </map>
    3.27              <key>name</key>
    3.28 @@ -773,9 +773,9 @@
    3.29            <map>
    3.30              <key>archive</key>
    3.31              <map>
    3.32 -             <key>hash</key>
    3.33 -	         <string>52257e5eb166a0b69c9c0c38f6e1920e</string>
    3.34 -             <key>url</key>
    3.35 +              <key>hash</key>
    3.36 +              <string>52257e5eb166a0b69c9c0c38f6e1920e</string>
    3.37 +              <key>url</key>
    3.38                <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/273079/arch/Linux/installer/google_breakpad-0.0.0-rev1099-linux-20130329.tar.bz2</string>
    3.39              </map>
    3.40              <key>name</key>
    3.41 @@ -786,7 +786,7 @@
    3.42              <key>archive</key>
    3.43              <map>
    3.44                <key>hash</key>
    3.45 -	      <string>d812a6dfcabe6528198a3191068dac09</string>
    3.46 +              <string>d812a6dfcabe6528198a3191068dac09</string>
    3.47                <key>url</key>
    3.48                <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/273073/arch/CYGWIN/installer/google_breakpad-0.0.0-rev1099-windows-20130329.tar.bz2</string>
    3.49              </map>
    3.50 @@ -879,42 +879,6 @@
    3.51            </map>
    3.52          </map>
    3.53        </map>
    3.54 -      <key>gperftools</key>
    3.55 -      <map>
    3.56 -        <key>license</key>
    3.57 -        <string>bsd</string>
    3.58 -        <key>license_file</key>
    3.59 -        <string>LICENSES/gperftools.txt</string>
    3.60 -        <key>name</key>
    3.61 -        <string>gperftools</string>
    3.62 -        <key>platforms</key>
    3.63 -        <map>
    3.64 -          <key>linux</key>
    3.65 -          <map>
    3.66 -            <key>archive</key>
    3.67 -            <map>
    3.68 -              <key>hash</key>
    3.69 -              <string>8aedfdcf670348c18a9991ae1b384a61</string>
    3.70 -              <key>url</key>
    3.71 -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/262672/arch/Linux/installer/gperftools-2.0-linux-20120727.tar.bz2</string>
    3.72 -            </map>
    3.73 -            <key>name</key>
    3.74 -            <string>linux</string>
    3.75 -          </map>
    3.76 -          <key>windows</key>
    3.77 -          <map>
    3.78 -            <key>archive</key>
    3.79 -            <map>
    3.80 -              <key>hash</key>
    3.81 -              <string>f62841804acb91e1309603a84f3f0ce8</string>
    3.82 -              <key>url</key>
    3.83 -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/262672/arch/CYGWIN/installer/gperftools-2.0-windows-20120727.tar.bz2</string>
    3.84 -            </map>
    3.85 -            <key>name</key>
    3.86 -            <string>windows</string>
    3.87 -          </map>
    3.88 -        </map>
    3.89 -      </map>
    3.90        <key>gstreamer</key>
    3.91        <map>
    3.92          <key>license</key>
    3.93 @@ -1844,9 +1808,9 @@
    3.94              <key>archive</key>
    3.95              <map>
    3.96                <key>hash</key>
    3.97 -              <string>24e735ae005f3ce7a21a09cc02cece17</string>
    3.98 +              <string>2994f1e028fb200c454c12b5f7ca9108</string>
    3.99                <key>url</key>
   3.100 -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/231678/arch/Darwin/installer/slvoice-3.2.0002.10426-darwin-20110601.tar.bz2</string>
   3.101 +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/270464/arch/Darwin/installer/slvoice-4.5.0009.17865-darwin-20130215.tar.bz2</string>
   3.102              </map>
   3.103              <key>name</key>
   3.104              <string>darwin</string>
   3.105 @@ -1856,9 +1820,9 @@
   3.106              <key>archive</key>
   3.107              <map>
   3.108                <key>hash</key>
   3.109 -              <string>8a0bc982367d6fdc20a28b391cd40566</string>
   3.110 +              <string>957773fff7148ffaca42b1ea4a18d192</string>
   3.111                <key>url</key>
   3.112 -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/231678/arch/Linux/installer/slvoice-3.2.0002.10426-linux-20110601.tar.bz2</string>
   3.113 +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/270512/arch/Linux/installer/slvoice-4.5.0009.17865-linux-20130216.tar.bz2</string>
   3.114              </map>
   3.115              <key>name</key>
   3.116              <string>linux</string>
   3.117 @@ -1868,9 +1832,9 @@
   3.118              <key>archive</key>
   3.119              <map>
   3.120                <key>hash</key>
   3.121 -              <string>1e821cc7d25eabad013b7f3db260dd6b</string>
   3.122 +              <string>24710eda136bfd42d6333e5609c2c74f</string>
   3.123                <key>url</key>
   3.124 -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/231678/arch/CYGWIN/installer/slvoice-3.2.0002.10426-windows-20110601.tar.bz2</string>
   3.125 +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/270464/arch/CYGWIN/installer/slvoice-4.5.0009.17865-windows-20130214.tar.bz2</string>
   3.126              </map>
   3.127              <key>name</key>
   3.128              <string>windows</string>
   3.129 @@ -2567,7 +2531,7 @@
   3.130                    <string>"Visual Studio 10"</string>
   3.131                    <string>-DUNATTENDED:BOOL=ON</string>
   3.132                    <string>-DUSE_KDU=FALSE</string>
   3.133 -                  </array>
   3.134 +                </array>
   3.135                </map>
   3.136                <key>name</key>
   3.137                <string>DebugOS</string>
   3.138 @@ -2655,7 +2619,7 @@
   3.139                    <string>-DUNATTENDED:BOOL=ON</string>
   3.140                    <string>-DINSTALL_PROPRIETARY=FALSE</string>
   3.141                    <string>-DUSE_KDU=FALSE</string>
   3.142 -                  </array>
   3.143 +                </array>
   3.144                </map>
   3.145                <key>name</key>
   3.146                <string>RelWithDebInfoOS</string>
   3.147 @@ -2742,7 +2706,7 @@
   3.148                    <string>-DUNATTENDED:BOOL=ON</string>
   3.149                    <string>-DINSTALL_PROPRIETARY=FALSE</string>
   3.150                    <string>-DUSE_KDU=FALSE</string>
   3.151 -                  </array>
   3.152 +                </array>
   3.153                </map>
   3.154                <key>name</key>
   3.155                <string>ReleaseOS</string>
     4.1 --- a/doc/contributions.txt	Thu Jul 18 17:27:31 2013 -0400
     4.2 +++ b/doc/contributions.txt	Mon Aug 26 17:53:30 2013 -0400
     4.3 @@ -175,7 +175,11 @@
     4.4  	STORM-1685
     4.5  	STORM-1713
     4.6  	STORM-1899
     4.7 +	MAINT-2368
     4.8 +	STORM-1931
     4.9  Aralara Rajal
    4.10 +Arare Chantilly
    4.11 +	CHUIBUG-191
    4.12  Ardy Lay
    4.13  	STORM-859
    4.14  	VWR-19499
    4.15 @@ -301,6 +305,8 @@
    4.16  Cinder Roxley
    4.17      BUG-2326
    4.18      STORM-1703
    4.19 +	STORM-1948
    4.20 +    STORM-1952
    4.21  Clara Young
    4.22  Coaldust Numbers
    4.23      VWR-1095
    4.24 @@ -312,6 +318,7 @@
    4.25  	VWR-10579
    4.26  	VWR-25120
    4.27  	STORM-1075
    4.28 +	STORM-1919
    4.29  Cypren Christenson
    4.30  	STORM-417
    4.31  Dante Tucker
    4.32 @@ -404,6 +411,7 @@
    4.33  Geenz Spad
    4.34  	STORM-1823
    4.35  	STORM-1900
    4.36 +	STORM-1905
    4.37  	NORSPEC-229
    4.38  Gene Frostbite
    4.39  GeneJ Composer
    4.40 @@ -479,6 +487,7 @@
    4.41  Hitomi Tiponi
    4.42  	STORM-1741
    4.43  	STORM-1862
    4.44 +	BUG-1067
    4.45  Holger Gilruth
    4.46  Horatio Freund
    4.47  Hoze Menges
    4.48 @@ -499,6 +508,8 @@
    4.49  	STORM-959
    4.50  	STORM-1175
    4.51  	STORM-1708
    4.52 +	STORM-1855
    4.53 +	VWR-20553
    4.54  Imnotgoing Sideways
    4.55  Inma Rau
    4.56  Innula Zenovka
    4.57 @@ -642,12 +653,16 @@
    4.58  	STORM-1793
    4.59  	STORM-1810
    4.60  	STORM-1877
    4.61 +	STORM-1892
    4.62 +	STORM-1894
    4.63  	STORM-1860
    4.64  	STORM-1852
    4.65  	STORM-1870
    4.66  	STORM-1872
    4.67  	STORM-1858
    4.68  	STORM-1862
    4.69 +	STORM-1918
    4.70 +	STORM-1953
    4.71  	OPEN-161
    4.72  Kadah Coba
    4.73  	STORM-1060
    4.74 @@ -686,6 +701,7 @@
    4.75  	STORM-800
    4.76  	STORM-1001
    4.77  	STORM-1175
    4.78 +	STORM-1905
    4.79      VWR-24217
    4.80  	STORM-1804
    4.81  Kolor Fall
    4.82 @@ -695,6 +711,7 @@
    4.83  	VWR-82
    4.84  	VWR-102
    4.85  Lance Corrimal
    4.86 +	STORM-1910
    4.87  	VWR-25269
    4.88  Latif Khalifa
    4.89  	VWR-5370
    4.90 @@ -749,9 +766,11 @@
    4.91  Marine Kelley
    4.92      CHUIBUG-134
    4.93      STORM-281
    4.94 +    STORM-1910
    4.95  MartinRJ Fayray
    4.96      STORM-1844
    4.97      STORM-1845
    4.98 +    STORM-1911
    4.99      STORM-1934
   4.100  Matthew Anthony
   4.101  Matthew Dowd
   4.102 @@ -903,6 +922,8 @@
   4.103  	MAINT-873
   4.104  	SUN-72
   4.105  	BUG-2432
   4.106 +	BUG-3605
   4.107 +	CHUIBUG-197
   4.108  Nicky Perian
   4.109  	OPEN-1
   4.110  	STORM-1087
   4.111 @@ -1045,6 +1066,7 @@
   4.112  Satomi Ahn
   4.113  	STORM-501
   4.114  	STORM-229
   4.115 +	VWR-20553
   4.116  	VWR-24502
   4.117  Scrim Pinion
   4.118  Scrippy Scofield
   4.119 @@ -1214,6 +1236,8 @@
   4.120  	STORM-1684
   4.121  	STORM-1819
   4.122  Tony Kembia
   4.123 +Tonya Souther
   4.124 +	STORM-1905
   4.125  Torben Trautman
   4.126  TouchaHoney Perhaps
   4.127  TraductoresAnonimos Alter
     5.1 --- a/indra/cmake/BuildVersion.cmake	Thu Jul 18 17:27:31 2013 -0400
     5.2 +++ b/indra/cmake/BuildVersion.cmake	Mon Aug 26 17:53:30 2013 -0400
     5.3 @@ -18,7 +18,7 @@
     5.4             find_program(MERCURIAL hg)
     5.5             if (DEFINED MERCURIAL)
     5.6                execute_process(
     5.7 -                 COMMAND ${MERCURIAL} log -r tip --template "{p1rev}"
     5.8 +                 COMMAND ${MERCURIAL} log -r tip --template "{rev}"
     5.9                   OUTPUT_VARIABLE VIEWER_VERSION_REVISION
    5.10                   OUTPUT_STRIP_TRAILING_WHITESPACE
    5.11                   )
     6.1 --- a/indra/cmake/Copy3rdPartyLibs.cmake	Thu Jul 18 17:27:31 2013 -0400
     6.2 +++ b/indra/cmake/Copy3rdPartyLibs.cmake	Mon Aug 26 17:53:30 2013 -0400
     6.3 @@ -20,6 +20,7 @@
     6.4      set(vivox_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
     6.5      set(vivox_files
     6.6          SLVoice.exe
     6.7 +        ca-bundle.crt
     6.8          libsndfile-1.dll
     6.9          vivoxplatform.dll
    6.10          vivoxsdk.dll
    6.11 @@ -195,6 +196,7 @@
    6.12      set(vivox_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
    6.13      set(vivox_files
    6.14          SLVoice
    6.15 +        ca-bundle.crt
    6.16          libsndfile.dylib
    6.17          libvivoxoal.dylib
    6.18          libortp.dylib
    6.19 @@ -241,6 +243,7 @@
    6.20          libvivoxplatform.so
    6.21          libvivoxsdk.so
    6.22          SLVoice
    6.23 +        # ca-bundle.crt   #No cert for linux.  It is actually still 3.2SDK.
    6.24         )
    6.25      # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
    6.26      # or ARCH_PREBUILT_DIRS
     7.1 --- a/indra/edit-me-to-trigger-new-build.txt	Thu Jul 18 17:27:31 2013 -0400
     7.2 +++ b/indra/edit-me-to-trigger-new-build.txt	Mon Aug 26 17:53:30 2013 -0400
     7.3 @@ -3,3 +3,4 @@
     7.4  
     7.5  
     7.6  
     7.7 +
     8.1 --- a/indra/lib/python/indra/util/llmanifest.py	Thu Jul 18 17:27:31 2013 -0400
     8.2 +++ b/indra/lib/python/indra/util/llmanifest.py	Mon Aug 26 17:53:30 2013 -0400
     8.3 @@ -392,11 +392,21 @@
     8.4              raise ManifestError, "Should be something at path " + path
     8.5          self.created_paths.append(path)
     8.6  
     8.7 -    def put_in_file(self, contents, dst):
     8.8 +    def put_in_file(self, contents, dst, src=None):
     8.9          # write contents as dst
    8.10 -        f = open(self.dst_path_of(dst), "wb")
    8.11 -        f.write(contents)
    8.12 -        f.close()
    8.13 +        dst_path = self.dst_path_of(dst)
    8.14 +        f = open(dst_path, "wb")
    8.15 +        try:
    8.16 +            f.write(contents)
    8.17 +        finally:
    8.18 +            f.close()
    8.19 +
    8.20 +        # Why would we create a file in the destination tree if not to include
    8.21 +        # it in the installer? The default src=None (plus the fact that the
    8.22 +        # src param is last) is to preserve backwards compatibility.
    8.23 +        if src:
    8.24 +            self.file_list.append([src, dst_path])
    8.25 +        return dst_path
    8.26  
    8.27      def replace_in(self, src, dst=None, searchdict={}):
    8.28          if dst == None:
     9.1 --- a/indra/llcommon/tests/llprocess_test.cpp	Thu Jul 18 17:27:31 2013 -0400
     9.2 +++ b/indra/llcommon/tests/llprocess_test.cpp	Mon Aug 26 17:53:30 2013 -0400
     9.3 @@ -608,9 +608,6 @@
     9.4      void object::test<5>()
     9.5      {
     9.6          set_test_name("exit(2)");
     9.7 -#if LL_WINDOWS
     9.8 -		skip("MAINT-2302: This frequently (though not always) fails on Windows.");
     9.9 -#endif
    9.10          PythonProcessLauncher py(get_test_name(),
    9.11                                   "import sys\n"
    9.12                                   "sys.exit(2)\n");
    9.13 @@ -622,10 +619,7 @@
    9.14      template<> template<>
    9.15      void object::test<6>()
    9.16      {
    9.17 -        set_test_name("syntax_error:");
    9.18 -#if LL_WINDOWS
    9.19 -		skip("MAINT-2302: This frequently (though not always) fails on Windows.");
    9.20 -#endif
    9.21 +        set_test_name("syntax_error");
    9.22          PythonProcessLauncher py(get_test_name(),
    9.23                                   "syntax_error:\n");
    9.24          py.mParams.files.add(LLProcess::FileParam()); // inherit stdin
    9.25 @@ -647,9 +641,6 @@
    9.26      void object::test<7>()
    9.27      {
    9.28          set_test_name("explicit kill()");
    9.29 -#if LL_WINDOWS
    9.30 -		skip("MAINT-2302: This frequently (though not always) fails on Windows.");
    9.31 -#endif
    9.32          PythonProcessLauncher py(get_test_name(),
    9.33                                   "from __future__ import with_statement\n"
    9.34                                   "import sys, time\n"
    9.35 @@ -694,9 +685,6 @@
    9.36      void object::test<8>()
    9.37      {
    9.38          set_test_name("implicit kill()");
    9.39 -#if LL_WINDOWS
    9.40 -		skip("MAINT-2302: This frequently (though not always) fails on Windows.");
    9.41 -#endif
    9.42          NamedTempFile out("out", "not started");
    9.43          LLProcess::handle phandle(0);
    9.44          {
    10.1 --- a/indra/llimage/llimage.cpp	Thu Jul 18 17:27:31 2013 -0400
    10.2 +++ b/indra/llimage/llimage.cpp	Mon Aug 26 17:53:30 2013 -0400
    10.3 @@ -689,8 +689,17 @@
    10.4  	}
    10.5  }
    10.6  
    10.7 +LLPointer<LLImageRaw> LLImageRaw::duplicate()
    10.8 +{
    10.9 +	if(getNumRefs() < 2)
   10.10 +	{
   10.11 +		return this; //nobody else refences to this image, no need to duplicate.
   10.12 +	}
   10.13  
   10.14 -
   10.15 +	//make a duplicate
   10.16 +	LLPointer<LLImageRaw> dup = new LLImageRaw(getData(), getWidth(), getHeight(), getComponents());
   10.17 +	return dup; 
   10.18 +}
   10.19  
   10.20  // Src and dst can be any size.  Src and dst can each have 3 or 4 components.
   10.21  void LLImageRaw::copy(LLImageRaw* src)
    11.1 --- a/indra/llimage/llimage.h	Thu Jul 18 17:27:31 2013 -0400
    11.2 +++ b/indra/llimage/llimage.h	Mon Aug 26 17:53:30 2013 -0400
    11.3 @@ -30,6 +30,7 @@
    11.4  #include "lluuid.h"
    11.5  #include "llstring.h"
    11.6  #include "llthread.h"
    11.7 +#include "llpointer.h"
    11.8  
    11.9  const S32 MIN_IMAGE_MIP =  2; // 4x4, only used for expand/contract power of 2
   11.10  const S32 MAX_IMAGE_MIP = 11; // 2048x2048
   11.11 @@ -214,6 +215,9 @@
   11.12  
   11.13  	// Copy operations
   11.14  	
   11.15 +	//duplicate this raw image if refCount > 1.
   11.16 +	LLPointer<LLImageRaw> duplicate();
   11.17 +
   11.18  	// Src and dst can be any size.  Src and dst can each have 3 or 4 components.
   11.19  	void copy( LLImageRaw* src );
   11.20  
    12.1 --- a/indra/llmath/llcamera.cpp	Thu Jul 18 17:27:31 2013 -0400
    12.2 +++ b/indra/llmath/llcamera.cpp	Mon Aug 26 17:53:30 2013 -0400
    12.3 @@ -42,6 +42,11 @@
    12.4  	mPlaneCount(6),
    12.5  	mFrustumCornerDist(0.f)
    12.6  {
    12.7 +	for (U32 i = 0; i < PLANE_MASK_NUM; i++)
    12.8 +	{
    12.9 +		mPlaneMask[i] = PLANE_MASK_NONE;
   12.10 +	}
   12.11 +
   12.12  	calculateFrustumPlanes();
   12.13  } 
   12.14  
   12.15 @@ -52,6 +57,11 @@
   12.16  	mPlaneCount(6),
   12.17  	mFrustumCornerDist(0.f)
   12.18  {
   12.19 +	for (U32 i = 0; i < PLANE_MASK_NUM; i++)
   12.20 +	{
   12.21 +		mPlaneMask[i] = PLANE_MASK_NONE;
   12.22 +	}
   12.23 +
   12.24  	mAspect = llclamp(aspect_ratio, MIN_ASPECT_RATIO, MAX_ASPECT_RATIO);
   12.25  	mNearPlane = llclamp(near_plane, MIN_NEAR_PLANE, MAX_NEAR_PLANE);
   12.26  	if(far_plane < 0) far_plane = DEFAULT_FAR_PLANE;
   12.27 @@ -87,14 +97,14 @@
   12.28  
   12.29  void LLCamera::setUserClipPlane(LLPlane& plane)
   12.30  {
   12.31 -	mPlaneCount = 7;
   12.32 -	mAgentPlanes[6] = plane;
   12.33 -	mPlaneMask[6] = plane.calcPlaneMask();
   12.34 +	mPlaneCount = AGENT_PLANE_USER_CLIP_NUM;
   12.35 +	mAgentPlanes[AGENT_PLANE_USER_CLIP] = plane;
   12.36 +	mPlaneMask[AGENT_PLANE_USER_CLIP] = plane.calcPlaneMask();
   12.37  }
   12.38  
   12.39  void LLCamera::disableUserClipPlane()
   12.40  {
   12.41 -	mPlaneCount = 6;
   12.42 +	mPlaneCount = AGENT_PLANE_NO_USER_CLIP_NUM;
   12.43  }
   12.44  
   12.45  void LLCamera::setView(F32 vertical_fov_rads) 
   12.46 @@ -161,31 +171,33 @@
   12.47  
   12.48  // ---------------- test methods  ---------------- 
   12.49  
   12.50 +static	const LLVector4a sFrustumScaler[] = 
   12.51 +{
   12.52 +	LLVector4a(-1,-1,-1),
   12.53 +	LLVector4a( 1,-1,-1),
   12.54 +	LLVector4a(-1, 1,-1),
   12.55 +	LLVector4a( 1, 1,-1),
   12.56 +	LLVector4a(-1,-1, 1),
   12.57 +	LLVector4a( 1,-1, 1),
   12.58 +	LLVector4a(-1, 1, 1),
   12.59 +	LLVector4a( 1, 1, 1)		// 8 entries
   12.60 +};
   12.61 +
   12.62  S32 LLCamera::AABBInFrustum(const LLVector4a &center, const LLVector4a& radius) 
   12.63  {
   12.64 -	static const LLVector4a scaler[] = {
   12.65 -		LLVector4a(-1,-1,-1),
   12.66 -		LLVector4a( 1,-1,-1),
   12.67 -		LLVector4a(-1, 1,-1),
   12.68 -		LLVector4a( 1, 1,-1),
   12.69 -		LLVector4a(-1,-1, 1),
   12.70 -		LLVector4a( 1,-1, 1),
   12.71 -		LLVector4a(-1, 1, 1),
   12.72 -		LLVector4a( 1, 1, 1)
   12.73 -	};
   12.74 -
   12.75  	U8 mask = 0;
   12.76  	bool result = false;
   12.77  	LLVector4a rscale, maxp, minp;
   12.78  	LLSimdScalar d;
   12.79 -	for (U32 i = 0; i < mPlaneCount; i++)
   12.80 +	U32 max_planes = llmin(mPlaneCount, (U32) AGENT_PLANE_USER_CLIP_NUM);		// mAgentPlanes[] size is 7
   12.81 +	for (U32 i = 0; i < max_planes; i++)
   12.82  	{
   12.83  		mask = mPlaneMask[i];
   12.84 -		if (mask != 0xff)
   12.85 +		if (mask < PLANE_MASK_NUM)
   12.86  		{
   12.87  			const LLPlane& p(mAgentPlanes[i]);
   12.88  			p.getAt<3>(d);
   12.89 -			rscale.setMul(radius, scaler[mask]);
   12.90 +			rscale.setMul(radius, sFrustumScaler[mask]);
   12.91  			minp.setSub(center, rscale);
   12.92  			d = -d;
   12.93  			if (p.dot3(minp).getF32() > d) 
   12.94 @@ -207,29 +219,19 @@
   12.95  
   12.96  S32 LLCamera::AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius) 
   12.97  {
   12.98 -	static const LLVector4a scaler[] = {
   12.99 -		LLVector4a(-1,-1,-1),
  12.100 -		LLVector4a( 1,-1,-1),
  12.101 -		LLVector4a(-1, 1,-1),
  12.102 -		LLVector4a( 1, 1,-1),
  12.103 -		LLVector4a(-1,-1, 1),
  12.104 -		LLVector4a( 1,-1, 1),
  12.105 -		LLVector4a(-1, 1, 1),
  12.106 -		LLVector4a( 1, 1, 1)
  12.107 -	};
  12.108 -
  12.109  	U8 mask = 0;
  12.110  	bool result = false;
  12.111  	LLVector4a rscale, maxp, minp;
  12.112  	LLSimdScalar d;
  12.113 -	for (U32 i = 0; i < mPlaneCount; i++)
  12.114 +	U32 max_planes = llmin(mPlaneCount, (U32) AGENT_PLANE_USER_CLIP_NUM);		// mAgentPlanes[] size is 7
  12.115 +	for (U32 i = 0; i < max_planes; i++)
  12.116  	{
  12.117  		mask = mPlaneMask[i];
  12.118 -		if ((i != 5) && (mask != 0xff))
  12.119 +		if ((i != 5) && (mask < PLANE_MASK_NUM))
  12.120  		{
  12.121  			const LLPlane& p(mAgentPlanes[i]);
  12.122  			p.getAt<3>(d);
  12.123 -			rscale.setMul(radius, scaler[mask]);
  12.124 +			rscale.setMul(radius, sFrustumScaler[mask]);
  12.125  			minp.setSub(center, rscale);
  12.126  			d = -d;
  12.127  			if (p.dot3(minp).getF32() > d) 
  12.128 @@ -369,7 +371,7 @@
  12.129  	bool res = false;
  12.130  	for (int i = 0; i < 6; i++)
  12.131  	{
  12.132 -		if (mPlaneMask[i] != 0xff)
  12.133 +		if (mPlaneMask[i] != PLANE_MASK_NONE)
  12.134  		{
  12.135  			float d = mAgentPlanes[i].dist(sphere_center);
  12.136  
  12.137 @@ -541,14 +543,14 @@
  12.138  		return;
  12.139  	}
  12.140  
  12.141 -	mPlaneMask[idx] = 0xff;
  12.142 +	mPlaneMask[idx] = PLANE_MASK_NONE;
  12.143  	mAgentPlanes[idx].clear();
  12.144  }
  12.145  
  12.146  void LLCamera::calcAgentFrustumPlanes(LLVector3* frust)
  12.147  {
  12.148  	
  12.149 -	for (int i = 0; i < 8; i++)
  12.150 +	for (int i = 0; i < AGENT_FRUSTRUM_NUM; i++)
  12.151  	{
  12.152  		mAgentFrustum[i] = frust[i];
  12.153  	}
  12.154 @@ -560,22 +562,22 @@
  12.155  	//order of planes is important, keep most likely to fail in the front of the list
  12.156  
  12.157  	//near - frust[0], frust[1], frust[2]
  12.158 -	mAgentPlanes[2] = planeFromPoints(frust[0], frust[1], frust[2]);
  12.159 +	mAgentPlanes[AGENT_PLANE_NEAR] = planeFromPoints(frust[0], frust[1], frust[2]);
  12.160  
  12.161  	//far  
  12.162 -	mAgentPlanes[5] = planeFromPoints(frust[5], frust[4], frust[6]);
  12.163 +	mAgentPlanes[AGENT_PLANE_FAR] = planeFromPoints(frust[5], frust[4], frust[6]);
  12.164  
  12.165  	//left  
  12.166 -	mAgentPlanes[0] = planeFromPoints(frust[4], frust[0], frust[7]);
  12.167 +	mAgentPlanes[AGENT_PLANE_LEFT] = planeFromPoints(frust[4], frust[0], frust[7]);
  12.168  
  12.169  	//right  
  12.170 -	mAgentPlanes[1] = planeFromPoints(frust[1], frust[5], frust[6]);
  12.171 +	mAgentPlanes[AGENT_PLANE_RIGHT] = planeFromPoints(frust[1], frust[5], frust[6]);
  12.172  
  12.173  	//top  
  12.174 -	mAgentPlanes[4] = planeFromPoints(frust[3], frust[2], frust[6]);
  12.175 +	mAgentPlanes[AGENT_PLANE_TOP] = planeFromPoints(frust[3], frust[2], frust[6]);
  12.176  
  12.177  	//bottom  
  12.178 -	mAgentPlanes[3] = planeFromPoints(frust[1], frust[0], frust[4]);
  12.179 +	mAgentPlanes[AGENT_PLANE_BOTTOM] = planeFromPoints(frust[1], frust[0], frust[4]);
  12.180  
  12.181  	//cache plane octant facing mask for use in AABBInFrustum
  12.182  	for (U32 i = 0; i < mPlaneCount; i++)
  12.183 @@ -635,7 +637,7 @@
  12.184  	LLVector3 center = mOrigin - mXAxis*mNearPlane;
  12.185  	mWorldPlanePos = center;
  12.186  	LLVector3 pnorm;	
  12.187 -	for (int p=0; p<4; p++)
  12.188 +	for (int p = 0; p < PLANE_NUM; p++)
  12.189  	{
  12.190  		mLocalPlanes[p].getVector3(pnorm);
  12.191  		LLVector3 norm = rotateToAbsolute(pnorm);
    13.1 --- a/indra/llmath/llcamera.h	Thu Jul 18 17:27:31 2013 -0400
    13.2 +++ b/indra/llmath/llcamera.h	Mon Aug 26 17:53:30 2013 -0400
    13.3 @@ -76,26 +76,39 @@
    13.4  		PLANE_RIGHT = 1,
    13.5  		PLANE_BOTTOM = 2,
    13.6  		PLANE_TOP = 3,
    13.7 -		PLANE_NUM = 4
    13.8 +		PLANE_NUM = 4,
    13.9 +		PLANE_MASK_NONE = 0xff		// Disable this plane
   13.10  	};
   13.11  	enum {
   13.12  		PLANE_LEFT_MASK = (1<<PLANE_LEFT),
   13.13  		PLANE_RIGHT_MASK = (1<<PLANE_RIGHT),
   13.14  		PLANE_BOTTOM_MASK = (1<<PLANE_BOTTOM),
   13.15  		PLANE_TOP_MASK = (1<<PLANE_TOP),
   13.16 -		PLANE_ALL_MASK = 0xf
   13.17 +		PLANE_ALL_MASK = 0xf,
   13.18 +	};
   13.19 +
   13.20 +	enum
   13.21 +	{	// Indexes to mAgentPlanes[] and mPlaneMask[]
   13.22 +		AGENT_PLANE_LEFT = 0,
   13.23 +		AGENT_PLANE_RIGHT = 1,
   13.24 +		AGENT_PLANE_NEAR = 2,
   13.25 +		AGENT_PLANE_BOTTOM = 3,
   13.26 +		AGENT_PLANE_TOP = 4,
   13.27 +		AGENT_PLANE_FAR = 5,
   13.28 +		AGENT_PLANE_USER_CLIP = 6
   13.29 +	};
   13.30 +	enum
   13.31 +	{	// Sizes for mAgentPlanes[].  7th entry is special case for user clip
   13.32 +		AGENT_PLANE_NO_USER_CLIP_NUM = 6,
   13.33 +		AGENT_PLANE_USER_CLIP_NUM = 7,
   13.34 +		PLANE_MASK_NUM = 8			// 7 actually used, 8 is for alignment
   13.35  	};
   13.36  
   13.37  	enum
   13.38  	{
   13.39 -		AGENT_PLANE_LEFT = 0,
   13.40 -		AGENT_PLANE_RIGHT,
   13.41 -		AGENT_PLANE_NEAR,
   13.42 -		AGENT_PLANE_BOTTOM,
   13.43 -		AGENT_PLANE_TOP,
   13.44 -		AGENT_PLANE_FAR,
   13.45 +		AGENT_FRUSTRUM_NUM = 8
   13.46  	};
   13.47 -
   13.48 +	
   13.49  	enum {
   13.50  		HORIZ_PLANE_LEFT = 0,
   13.51  		HORIZ_PLANE_RIGHT = 1,
   13.52 @@ -108,15 +121,15 @@
   13.53  	};
   13.54  
   13.55  private:
   13.56 -	LL_ALIGN_16(LLPlane mAgentPlanes[7]);  //frustum planes in agent space a la gluUnproject (I'm a bastard, I know) - DaveP
   13.57 -	U8 mPlaneMask[8];         // 8 for alignment	
   13.58 +	LL_ALIGN_16(LLPlane mAgentPlanes[AGENT_PLANE_USER_CLIP_NUM]);  //frustum planes in agent space a la gluUnproject (I'm a bastard, I know) - DaveP
   13.59 +	U8 mPlaneMask[PLANE_MASK_NUM];         // 8 for alignment	
   13.60  	
   13.61  	F32 mView;					// angle between top and bottom frustum planes in radians.
   13.62  	F32 mAspect;				// width/height
   13.63  	S32 mViewHeightInPixels;	// for ViewHeightInPixels() only
   13.64  	F32 mNearPlane;
   13.65  	F32 mFarPlane;
   13.66 -	LL_ALIGN_16(LLPlane mLocalPlanes[4]);
   13.67 +	LL_ALIGN_16(LLPlane mLocalPlanes[PLANE_NUM]);
   13.68  	F32 mFixedDistance;			// Always return this distance, unless < 0
   13.69  	LLVector3 mFrustCenter;		// center of frustum and radius squared for ultra-quick exclusion test
   13.70  	F32 mFrustRadiusSquared;
   13.71 @@ -128,7 +141,7 @@
   13.72  
   13.73  	LLVector3 mWorldPlanePos;		// Position of World Planes (may be offset from camera)
   13.74  public:
   13.75 -	LLVector3 mAgentFrustum[8];  //8 corners of 6-plane frustum
   13.76 +	LLVector3 mAgentFrustum[AGENT_FRUSTRUM_NUM];  //8 corners of 6-plane frustum
   13.77  	F32	mFrustumCornerDist;		//distance to corner of frustum against far clip plane
   13.78  	LLPlane& getAgentPlane(U32 idx) { return mAgentPlanes[idx]; }
   13.79  
    14.1 --- a/indra/llmessage/llcurl.cpp	Thu Jul 18 17:27:31 2013 -0400
    14.2 +++ b/indra/llmessage/llcurl.cpp	Mon Aug 26 17:53:30 2013 -0400
    14.3 @@ -72,7 +72,8 @@
    14.4  
    14.5  static const U32 EASY_HANDLE_POOL_SIZE		= 5;
    14.6  static const S32 MULTI_PERFORM_CALL_REPEAT	= 5;
    14.7 -static const S32 CURL_REQUEST_TIMEOUT = 30; // seconds per operation
    14.8 +static const S32 CURL_REQUEST_TIMEOUT = 120; // seconds per operation
    14.9 +static const S32 CURL_CONNECT_TIMEOUT = 30; //seconds to wait for a connection
   14.10  static const S32 MAX_ACTIVE_REQUEST_COUNT = 100;
   14.11  
   14.12  // DEBUG //
   14.13 @@ -517,6 +518,7 @@
   14.14  	//don't verify host name so urls with scrubbed host names will work (improves DNS performance)
   14.15  	setopt(CURLOPT_SSL_VERIFYHOST, 0);
   14.16  	setopt(CURLOPT_TIMEOUT, llmax(time_out, CURL_REQUEST_TIMEOUT));
   14.17 +	setopt(CURLOPT_CONNECTTIMEOUT, CURL_CONNECT_TIMEOUT);
   14.18  
   14.19  	setoptString(CURLOPT_URL, url);
   14.20  
    15.1 --- a/indra/llplugin/slplugin/slplugin-objc.mm	Thu Jul 18 17:27:31 2013 -0400
    15.2 +++ b/indra/llplugin/slplugin/slplugin-objc.mm	Mon Aug 26 17:53:30 2013 -0400
    15.3 @@ -115,7 +115,7 @@
    15.4      
    15.5  }
    15.6  
    15.7 -void LLCocoaPlugin::updateWindows()  //SPATTERS give this a better name.
    15.8 +void LLCocoaPlugin::updateWindows()  
    15.9  {
   15.10  //    NSArray* window_list = [NSApp orderedWindows];
   15.11  //    NSWindow* current_window = [window_list objectAtIndex:0];
    16.1 --- a/indra/llprimitive/llmodel.cpp	Thu Jul 18 17:27:31 2013 -0400
    16.2 +++ b/indra/llprimitive/llmodel.cpp	Mon Aug 26 17:53:30 2013 -0400
    16.3 @@ -628,25 +628,41 @@
    16.4  			if (v)
    16.5  			{
    16.6  				U32 v_idx = idx[j*stride+v_offset]*3;
    16.7 +				v_idx = llclamp(v_idx, (U32) 0, (U32) v->getCount());
    16.8  				vert.getPosition().set(v->get(v_idx),
    16.9  								v->get(v_idx+1),
   16.10  								v->get(v_idx+2));
   16.11  			}
   16.12  			
   16.13 -			if (n)
   16.14 +			//bounds check n and t lookups because some FBX to DAE converters
   16.15 +			//use negative indices and empty arrays to indicate data does not exist
   16.16 +			//for a particular channel
   16.17 +			if (n && n->getCount() > 0)
   16.18  			{
   16.19  				U32 n_idx = idx[j*stride+n_offset]*3;
   16.20 +				n_idx = llclamp(n_idx, (U32) 0, (U32) n->getCount());
   16.21  				vert.getNormal().set(n->get(n_idx),
   16.22  								n->get(n_idx+1),
   16.23  								n->get(n_idx+2));
   16.24  			}
   16.25 +			else
   16.26 +			{
   16.27 +				vert.getNormal().clear();
   16.28 +			}
   16.29 +
   16.30  			
   16.31 -			if (t)
   16.32 +			if (t && t->getCount() > 0)
   16.33  			{
   16.34  				U32 t_idx = idx[j*stride+t_offset]*2;
   16.35 +				t_idx = llclamp(t_idx, (U32) 0, (U32) t->getCount());
   16.36  				vert.mTexCoord.setVec(t->get(t_idx),
   16.37  								t->get(t_idx+1));								
   16.38  			}
   16.39 +			else
   16.40 +			{
   16.41 +				vert.mTexCoord.clear();
   16.42 +			}
   16.43 +
   16.44  						
   16.45  			verts.push_back(vert);
   16.46  		}
    17.1 --- a/indra/llrender/llgl.cpp	Thu Jul 18 17:27:31 2013 -0400
    17.2 +++ b/indra/llrender/llgl.cpp	Mon Aug 26 17:53:30 2013 -0400
    17.3 @@ -1154,7 +1154,8 @@
    17.4  	// Misc
    17.5  	glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, (GLint*) &mGLMaxVertexRange);
    17.6  	glGetIntegerv(GL_MAX_ELEMENTS_INDICES, (GLint*) &mGLMaxIndexRange);
    17.7 -	
    17.8 +	glGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint*) &mGLMaxTextureSize);
    17.9 +
   17.10  #if (LL_WINDOWS || LL_LINUX || LL_SOLARIS) && !LL_MESA_HEADLESS
   17.11  	LL_DEBUGS("RenderInit") << "GL Probe: Getting symbols" << LL_ENDL;
   17.12  	if (mHasVertexBufferObject)
    18.1 --- a/indra/llrender/llgl.h	Thu Jul 18 17:27:31 2013 -0400
    18.2 +++ b/indra/llrender/llgl.h	Mon Aug 26 17:53:30 2013 -0400
    18.3 @@ -155,6 +155,7 @@
    18.4  	S32 mVRAM; // VRAM in MB
    18.5  	S32 mGLMaxVertexRange;
    18.6  	S32 mGLMaxIndexRange;
    18.7 +	S32 mGLMaxTextureSize;
    18.8  	
    18.9  	void getPixelFormat(); // Get the best pixel format
   18.10  
    19.1 --- a/indra/llrender/llrendertarget.cpp	Thu Jul 18 17:27:31 2013 -0400
    19.2 +++ b/indra/llrender/llrendertarget.cpp	Mon Aug 26 17:53:30 2013 -0400
    19.3 @@ -117,8 +117,8 @@
    19.4  
    19.5  bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, S32 samples)
    19.6  {
    19.7 -	resx = llmin(resx, (U32) 4096);
    19.8 -	resy = llmin(resy, (U32) 4096);
    19.9 +	resx = llmin(resx, (U32) gGLManager.mGLMaxTextureSize);
   19.10 +	resy = llmin(resy, (U32) gGLManager.mGLMaxTextureSize);
   19.11  
   19.12  	stop_glerror();
   19.13  	release();
    20.1 --- a/indra/llui/llbutton.cpp	Thu Jul 18 17:27:31 2013 -0400
    20.2 +++ b/indra/llui/llbutton.cpp	Mon Aug 26 17:53:30 2013 -0400
    20.3 @@ -644,7 +644,7 @@
    20.4      //  Cancel sticking of color, if the button is pressed,
    20.5  	//  or when a flashing of the previously selected button is ended
    20.6  	if (mFlashingTimer
    20.7 -		&& ((selected && !mFlashingTimer->isFlashingInProgress()) || pressed))
    20.8 +		&& ((selected && !mFlashingTimer->isFlashingInProgress() && !mForceFlashing) || pressed))
    20.9  	{
   20.10  		mFlashing = false;
   20.11  	}
   20.12 @@ -971,8 +971,9 @@
   20.13  	}
   20.14  }
   20.15  
   20.16 -void LLButton::setFlashing(bool b)	
   20.17 +void LLButton::setFlashing(bool b, bool force_flashing/* = false */)
   20.18  { 
   20.19 +	mForceFlashing = force_flashing;
   20.20  	if (mFlashingTimer)
   20.21  	{
   20.22  		mFlashing = b; 
    21.1 --- a/indra/llui/llbutton.h	Thu Jul 18 17:27:31 2013 -0400
    21.2 +++ b/indra/llui/llbutton.h	Mon Aug 26 17:53:30 2013 -0400
    21.3 @@ -201,7 +201,7 @@
    21.4  	void			setToggleState(BOOL b);
    21.5  
    21.6  	void			setHighlight(bool b);
    21.7 -	void			setFlashing( bool b );
    21.8 +	void			setFlashing( bool b, bool force_flashing = false );
    21.9  	BOOL			getFlashing() const		{ return mFlashing; }
   21.10      LLFlashTimer*   getFlashTimer() {return mFlashingTimer;}
   21.11  
   21.12 @@ -378,7 +378,7 @@
   21.13  
   21.14  	LLFrameTimer				mFrameTimer;
   21.15  	LLFlashTimer *				mFlashingTimer;
   21.16 -
   21.17 +	bool                        mForceFlashing; // Stick flashing color even if button is pressed
   21.18  	bool						mHandleRightMouse;
   21.19  };
   21.20  
    22.1 --- a/indra/llui/llchatentry.cpp	Thu Jul 18 17:27:31 2013 -0400
    22.2 +++ b/indra/llui/llchatentry.cpp	Mon Aug 26 17:53:30 2013 -0400
    22.3 @@ -62,9 +62,9 @@
    22.4  {
    22.5  	if(mIsExpandable)
    22.6  	{
    22.7 +		reflow();
    22.8  		expandText();
    22.9  	}
   22.10 -
   22.11  	LLTextEditor::draw();
   22.12  }
   22.13  
   22.14 @@ -158,19 +158,21 @@
   22.15      resetLabel();
   22.16  }
   22.17  
   22.18 -bool LLChatEntry::useLabel()
   22.19 +bool LLChatEntry::useLabel() const
   22.20  {
   22.21      return !getLength() && !mLabel.empty();
   22.22  }
   22.23  
   22.24  void LLChatEntry::onFocusReceived()
   22.25  {
   22.26 -
   22.27 +	LLUICtrl::onFocusReceived();
   22.28 +	updateAllowingLanguageInput();
   22.29  }
   22.30  
   22.31  void LLChatEntry::onFocusLost()
   22.32  {
   22.33 -
   22.34 +	LLTextEditor::focusLostHelper();
   22.35 +	LLUICtrl::onFocusLost();
   22.36  }
   22.37  
   22.38  BOOL LLChatEntry::handleSpecialKey(const KEY key, const MASK mask)
    23.1 --- a/indra/llui/llchatentry.h	Thu Jul 18 17:27:31 2013 -0400
    23.2 +++ b/indra/llui/llchatentry.h	Mon Aug 26 17:53:30 2013 -0400
    23.3 @@ -56,14 +56,14 @@
    23.4  	LLChatEntry(const Params& p);
    23.5      /*virtual*/ void    beforeValueChange();
    23.6      /*virtual*/ void    onValueChange(S32 start, S32 end);
    23.7 -    /*virtual*/ bool    useLabel();
    23.8 +    /*virtual*/ bool    useLabel() const;
    23.9  
   23.10  public:
   23.11  
   23.12  	virtual void	draw();
   23.13  	virtual	void	onCommit();
   23.14 -    /*virtual*/ void	onFocusReceived();
   23.15 -    /*virtual*/ void	onFocusLost();
   23.16 +	/*virtual*/ void	onFocusReceived();
   23.17 +	/*virtual*/ void	onFocusLost();
   23.18  
   23.19  	void enableSingleLineMode(bool single_line_mode);
   23.20  	boost::signals2::connection setTextExpandedCallback(const commit_signal_t::slot_type& cb);
    24.1 --- a/indra/llui/llfloater.cpp	Thu Jul 18 17:27:31 2013 -0400
    24.2 +++ b/indra/llui/llfloater.cpp	Mon Aug 26 17:53:30 2013 -0400
    24.3 @@ -507,22 +507,11 @@
    24.4  {
    24.5  	LLFloaterReg::removeInstance(mInstanceName, mKey);
    24.6  	
    24.7 -//	delete mNotificationContext;
    24.8 -//	mNotificationContext = NULL;
    24.9 -
   24.10 -	//// am I not hosted by another floater?
   24.11 -	//if (mHostHandle.isDead())
   24.12 -	//{
   24.13 -	//	LLFloaterView* parent = (LLFloaterView*) getParent();
   24.14 -
   24.15 -	//	if( parent )
   24.16 -	//	{
   24.17 -	//		parent->removeChild( this );
   24.18 -	//	}
   24.19 -	//}
   24.20 -
   24.21 -	// Just in case we might still have focus here, release it.
   24.22 -	releaseFocus();
   24.23 +	if( gFocusMgr.childHasKeyboardFocus(this))
   24.24 +	{
   24.25 +		// Just in case we might still have focus here, release it.
   24.26 +		releaseFocus();
   24.27 +	}
   24.28  
   24.29  	// This is important so that floaters with persistent rects (i.e., those
   24.30  	// created with rect control rather than an LLRect) are restored in their
   24.31 @@ -1486,6 +1475,7 @@
   24.32  	}
   24.33  }
   24.34  
   24.35 +/*virtual*/
   24.36  BOOL LLFloater::isFrontmost()
   24.37  {
   24.38  	LLFloaterView* floater_view = getParentByType<LLFloaterView>();
   24.39 @@ -1504,7 +1494,7 @@
   24.40  		floaterp->setRect(gFloaterView->findNeighboringPosition(this, floaterp));
   24.41  		floaterp->setSnapTarget(getHandle());
   24.42  	}
   24.43 -	gFloaterView->adjustToFitScreen(floaterp, FALSE);
   24.44 +	gFloaterView->adjustToFitScreen(floaterp, FALSE, TRUE);
   24.45  	if (floaterp->isFrontmost())
   24.46  	{
   24.47  		// make sure to bring self and sibling floaters to front
   24.48 @@ -2735,7 +2725,7 @@
   24.49  
   24.50  const S32 FLOATER_MIN_VISIBLE_PIXELS = 16;
   24.51  
   24.52 -void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_outside)
   24.53 +void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_outside, BOOL snap_in_toolbars/* = false*/)
   24.54  {
   24.55  	if (floater->getParent() != this)
   24.56  	{
   24.57 @@ -2788,7 +2778,7 @@
   24.58  	}
   24.59  
   24.60  	// move window fully onscreen
   24.61 -	if (floater->translateIntoRect( getSnapRect(), allow_partial_outside ? FLOATER_MIN_VISIBLE_PIXELS : S32_MAX ))
   24.62 +	if (floater->translateIntoRect( snap_in_toolbars ? getSnapRect() : gFloaterView->getRect(), allow_partial_outside ? FLOATER_MIN_VISIBLE_PIXELS : S32_MAX ))
   24.63  	{
   24.64  		floater->clearSnapTarget();
   24.65  	}
   24.66 @@ -3258,6 +3248,11 @@
   24.67      return ! isMinimized() && isInVisibleChain();
   24.68  }
   24.69  
   24.70 +bool LLFloater::isDetachedAndNotMinimized()
   24.71 +{
   24.72 +	return !getHost() && !isMinimized();
   24.73 +}
   24.74 +
   24.75  /* static */
   24.76  bool LLFloater::isShown(const LLFloater* floater)
   24.77  {
    25.1 --- a/indra/llui/llfloater.h	Thu Jul 18 17:27:31 2013 -0400
    25.2 +++ b/indra/llui/llfloater.h	Mon Aug 26 17:53:30 2013 -0400
    25.3 @@ -238,6 +238,7 @@
    25.4  	void			center();
    25.5  
    25.6  	LLMultiFloater* getHost();
    25.7 +	bool isDetachedAndNotMinimized();
    25.8  
    25.9  	void			applyTitle();
   25.10  	std::string		getCurrentTitle() const;
   25.11 @@ -261,7 +262,7 @@
   25.12  	static bool     isVisible(const LLFloater* floater);
   25.13  	static bool     isMinimized(const LLFloater* floater);
   25.14  	BOOL			isFirstLook() { return mFirstLook; } // EXT-2653: This function is necessary to prevent overlapping for secondary showed toasts
   25.15 -	BOOL			isFrontmost();
   25.16 +	virtual BOOL	isFrontmost();
   25.17  	BOOL			isDependent()					{ return !mDependeeHandle.isDead(); }
   25.18  	void			setCanMinimize(BOOL can_minimize);
   25.19  	void			setCanClose(BOOL can_close);
   25.20 @@ -528,7 +529,7 @@
   25.21  	LLRect			findNeighboringPosition( LLFloater* reference_floater, LLFloater* neighbor );
   25.22  
   25.23  	// Given a child of gFloaterView, make sure this view can fit entirely onscreen.
   25.24 -	void			adjustToFitScreen(LLFloater* floater, BOOL allow_partial_outside);
   25.25 +	void			adjustToFitScreen(LLFloater* floater, BOOL allow_partial_outside, BOOL snap_in_toolbars = false);
   25.26  
   25.27  	void			setMinimizePositionVerticalOffset(S32 offset) { mMinimizePositionVOffset = offset; }
   25.28  	void			getMinimizePosition( S32 *left, S32 *bottom);
    26.1 --- a/indra/llui/llfloaterreg.cpp	Thu Jul 18 17:27:31 2013 -0400
    26.2 +++ b/indra/llui/llfloaterreg.cpp	Mon Aug 26 17:53:30 2013 -0400
    26.3 @@ -356,8 +356,8 @@
    26.4  {
    26.5  	std::string controlname = getRectControlName(name);
    26.6  	LLFloater::getControlGroup()->declareRect(controlname, LLRect(),
    26.7 -												 llformat("Window Size for %s", name.c_str()),
    26.8 -												 TRUE);
    26.9 +											  llformat("Window Size for %s", name.c_str()),
   26.10 +											  LLControlVariable::PERSIST_NONDFT);
   26.11  	return controlname;
   26.12  }
   26.13  
   26.14 @@ -367,7 +367,7 @@
   26.15  	LLFloater::getControlGroup()->declareF32(controlname, 
   26.16  											10.f,
   26.17  											llformat("Window X Position for %s", name.c_str()),
   26.18 -											TRUE);
   26.19 +											LLControlVariable::PERSIST_NONDFT);
   26.20  	return controlname;
   26.21  }
   26.22  
   26.23 @@ -377,7 +377,7 @@
   26.24  	LLFloater::getControlGroup()->declareF32(controlname,
   26.25  											10.f,
   26.26  											llformat("Window Y Position for %s", name.c_str()),
   26.27 -											TRUE);
   26.28 +											LLControlVariable::PERSIST_NONDFT);
   26.29  
   26.30  	return controlname;
   26.31  }
   26.32 @@ -404,7 +404,7 @@
   26.33  	std::string controlname = getVisibilityControlName(name);
   26.34  	LLFloater::getControlGroup()->declareBOOL(controlname, FALSE,
   26.35  												 llformat("Window Visibility for %s", name.c_str()),
   26.36 -												 TRUE);
   26.37 +												 LLControlVariable::PERSIST_NONDFT);
   26.38  	return controlname;
   26.39  }
   26.40  
   26.41 @@ -414,7 +414,7 @@
   26.42  	std::string controlname = getDockStateControlName(name);
   26.43  	LLFloater::getControlGroup()->declareBOOL(controlname, TRUE,
   26.44  												 llformat("Window Docking state for %s", name.c_str()),
   26.45 -												 TRUE);
   26.46 +												 LLControlVariable::PERSIST_NONDFT);
   26.47  	return controlname;
   26.48  
   26.49  }
    27.1 --- a/indra/llui/llfolderview.cpp	Thu Jul 18 17:27:31 2013 -0400
    27.2 +++ b/indra/llui/llfolderview.cpp	Mon Aug 26 17:53:30 2013 -0400
    27.3 @@ -323,9 +323,11 @@
    27.4  
    27.5  void LLFolderView::filter( LLFolderViewFilter& filter )
    27.6  {
    27.7 +    // Entry point of inventory filtering (CHUI-849)
    27.8  	LLFastTimer t2(FTM_FILTER);
    27.9 -	filter.setFilterCount(llclamp(LLUI::sSettingGroups["config"]->getS32("FilterItemsPerFrame"), 1, 5000));
   27.10 +    filter.resetTime(llclamp(LLUI::sSettingGroups["config"]->getS32(mParentPanel->getVisible() ? "FilterItemsMaxTimePerFrameVisible" : "FilterItemsMaxTimePerFrameUnvisible"), 1, 100));
   27.11  
   27.12 +    // Note: we filter the model, not the view
   27.13  	getViewModelItem()->filter(filter);
   27.14  }
   27.15  
   27.16 @@ -661,7 +663,7 @@
   27.17  
   27.18  		// get preferable text height...
   27.19  		S32 pixel_height = mStatusTextBox->getTextPixelHeight();
   27.20 -		bool height_changed = local_rect.getHeight() != pixel_height;
   27.21 +		bool height_changed = (local_rect.getHeight() < pixel_height);
   27.22  		if (height_changed)
   27.23  		{
   27.24  			// ... if it does not match current height, lets rearrange current view.
   27.25 @@ -1601,15 +1603,17 @@
   27.26  	{
   27.27  		mNeedsAutoSelect = TRUE;
   27.28  	}
   27.29 -	// filter to determine visibility before arranging
   27.30 +    
   27.31 +	// Filter to determine visibility before arranging
   27.32  	filter(getFolderViewModel()->getFilter());
   27.33 -	// Clear the modified setting on the filter only if the filter count is non-zero after running the filter process
   27.34 -	// Note: if the filter count is zero, then the filter most likely halted before completing the entire set of items
   27.35 -	if (getFolderViewModel()->getFilter().isModified() && (getFolderViewModel()->getFilter().getFilterCount() > 0))
   27.36 +    
   27.37 +	// Clear the modified setting on the filter only if the filter finished after running the filter process
   27.38 +	// Note: if the filter count has timed out, that means the filter halted before completing the entire set of items
   27.39 +    if (getFolderViewModel()->getFilter().isModified() && (!getFolderViewModel()->getFilter().isTimedOut()))
   27.40  	{
   27.41  		getFolderViewModel()->getFilter().clearModified();
   27.42  	}
   27.43 -
   27.44 +    
   27.45  	// automatically show matching items, and select first one if we had a selection
   27.46  	if (mNeedsAutoSelect)
   27.47  	{
   27.48 @@ -1649,11 +1653,13 @@
   27.49  
   27.50    BOOL is_visible = isInVisibleChain();
   27.51  
   27.52 -  //Puts folders/items in proper positions
   27.53 -  if ( is_visible )
   27.54 +  // Puts folders/items in proper positions
   27.55 +  // arrange() takes the model filter flag into account and call sort() if necessary (CHUI-849)
   27.56 +  // It also handles the open/close folder animation
   27.57 +  if (is_visible)
   27.58    {
   27.59      sanitizeSelection();
   27.60 -    if( needsArrange() )
   27.61 +    if (needsArrange())
   27.62      {
   27.63        S32 height = 0;
   27.64        S32 width = 0;
    28.1 --- a/indra/llui/llfolderviewitem.cpp	Thu Jul 18 17:27:31 2013 -0400
    28.2 +++ b/indra/llui/llfolderviewitem.cpp	Mon Aug 26 17:53:30 2013 -0400
    28.3 @@ -274,6 +274,7 @@
    28.4  	}
    28.5  
    28.6  	mLabelWidthDirty = true;
    28.7 +    // Dirty the filter flag of the model from the view (CHUI-849)
    28.8  	vmi.dirtyFilter();
    28.9  }
   28.10  
   28.11 @@ -943,11 +944,17 @@
   28.12  
   28.13  static LLFastTimer::DeclareTimer FTM_ARRANGE("Arrange");
   28.14  
   28.15 -// Finds width and height of this object and its children. Also
   28.16 -// makes sure that this view and its children are the right size.
   28.17 +// Make everything right and in the right place ready for drawing (CHUI-849)
   28.18 +// * Sort everything correctly if necessary
   28.19 +// * Turn widgets visible/invisible according to their model filtering state
   28.20 +// * Takes animation state into account for opening/closing of folders (this makes widgets visible/invisible)
   28.21 +// * Reposition visible widgets so that they line up correctly with no gap
   28.22 +// * Compute the width and height of the current folder and its children
   28.23 +// * Makes sure that this view and its children are the right size
   28.24  S32 LLFolderViewFolder::arrange( S32* width, S32* height )
   28.25  {
   28.26 -	// sort before laying out contents
   28.27 +	// Sort before laying out contents
   28.28 +    // Note that we sort from the root (CHUI-849)
   28.29  	getRoot()->getFolderViewModel()->sort(this);
   28.30  
   28.31  	LLFastTimer t2(FTM_ARRANGE);
   28.32 @@ -1613,16 +1620,13 @@
   28.33  }
   28.34  
   28.35  void LLFolderViewFolder::requestArrange()
   28.36 -{ 
   28.37 -	if ( mLastArrangeGeneration != -1)
   28.38 -	{
   28.39 -		mLastArrangeGeneration = -1; 
   28.40 -		// flag all items up to root
   28.41 -		if (mParentFolder)
   28.42 -		{
   28.43 -			mParentFolder->requestArrange();
   28.44 -		}
   28.45 -	}
   28.46 +{
   28.47 +    mLastArrangeGeneration = -1;
   28.48 +    // flag all items up to root
   28.49 +    if (mParentFolder)
   28.50 +    {
   28.51 +        mParentFolder->requestArrange();
   28.52 +    }
   28.53  }
   28.54  
   28.55  void LLFolderViewFolder::toggleOpen()
    29.1 --- a/indra/llui/llfolderviewitem.h	Thu Jul 18 17:27:31 2013 -0400
    29.2 +++ b/indra/llui/llfolderviewitem.h	Mon Aug 26 17:53:30 2013 -0400
    29.3 @@ -316,7 +316,6 @@
    29.4  	F32			mAutoOpenCountdown;
    29.5  	S32			mLastArrangeGeneration;
    29.6  	S32			mLastCalculatedWidth;
    29.7 -	S32			mMostFilteredDescendantGeneration;
    29.8  	bool		mNeedsSort;
    29.9  
   29.10  public:
    30.1 --- a/indra/llui/llfolderviewmodel.cpp	Thu Jul 18 17:27:31 2013 -0400
    30.2 +++ b/indra/llui/llfolderviewmodel.cpp	Mon Aug 26 17:53:30 2013 -0400
    30.3 @@ -48,7 +48,7 @@
    30.4  
    30.5  void LLFolderViewModelCommon::filter()
    30.6  {
    30.7 -	getFilter().setFilterCount(llclamp(LLUI::sSettingGroups["config"]->getS32("FilterItemsPerFrame"), 1, 5000));
    30.8 +    getFilter().resetTime(llclamp(LLUI::sSettingGroups["config"]->getS32("FilterItemsMaxTimePerFrameVisible"), 1, 100));
    30.9  	mFolderView->getViewModelItem()->filter(getFilter());
   30.10  }
   30.11  
    31.1 --- a/indra/llui/llfolderviewmodel.h	Thu Jul 18 17:27:31 2013 -0400
    31.2 +++ b/indra/llui/llfolderviewmodel.h	Mon Aug 26 17:53:30 2013 -0400
    31.3 @@ -87,12 +87,11 @@
    31.4  	virtual void 				setModified(EFilterModified behavior = FILTER_RESTART) = 0;
    31.5  
    31.6  	// +-------------------------------------------------------------------+
    31.7 -	// + Count
    31.8 +	// + Time
    31.9  	// +-------------------------------------------------------------------+
   31.10 -	virtual void 				setFilterCount(S32 count) = 0;
   31.11 -	virtual S32 				getFilterCount() const = 0;
   31.12 -	virtual void 				decrementFilterCount() = 0;
   31.13 -
   31.14 +	virtual void 				resetTime(S32 timeout) = 0;
   31.15 +    virtual bool                isTimedOut() = 0;
   31.16 +    
   31.17  	// +-------------------------------------------------------------------+
   31.18  	// + Default
   31.19  	// +-------------------------------------------------------------------+
   31.20 @@ -308,26 +307,28 @@
   31.21  	virtual bool potentiallyVisible()
   31.22  	{
   31.23  		return passedFilter() // we've passed the filter
   31.24 -			|| getLastFilterGeneration() < mRootViewModel.getFilter().getFirstSuccessGeneration() // or we don't know yet
   31.25 +			|| (getLastFilterGeneration() < mRootViewModel.getFilter().getFirstSuccessGeneration()) // or we don't know yet
   31.26  			|| descendantsPassedFilter();
   31.27  	}
   31.28  
   31.29  	virtual bool passedFilter(S32 filter_generation = -1) 
   31.30  	{ 
   31.31 -		if (filter_generation < 0) 
   31.32 +		if (filter_generation < 0)
   31.33 +        {
   31.34  			filter_generation = mRootViewModel.getFilter().getFirstSuccessGeneration();
   31.35 -
   31.36 -		bool passed_folder_filter = mPassedFolderFilter && mLastFolderFilterGeneration >= filter_generation;
   31.37 -		bool passed_filter = mPassedFilter && mLastFilterGeneration >= filter_generation;
   31.38 -		return passed_folder_filter
   31.39 -				&& (descendantsPassedFilter(filter_generation)
   31.40 -					|| passed_filter);
   31.41 +        }
   31.42 +		bool passed_folder_filter = mPassedFolderFilter && (mLastFolderFilterGeneration >= filter_generation);
   31.43 +		bool passed_filter = mPassedFilter && (mLastFilterGeneration >= filter_generation);
   31.44 +		return passed_folder_filter && (passed_filter || descendantsPassedFilter(filter_generation));
   31.45  	}
   31.46  
   31.47  	virtual bool descendantsPassedFilter(S32 filter_generation = -1)
   31.48  	{ 
   31.49 -		if (filter_generation < 0) filter_generation = mRootViewModel.getFilter().getFirstSuccessGeneration();
   31.50 -		return mMostFilteredDescendantGeneration >= filter_generation; 
   31.51 +		if (filter_generation < 0)
   31.52 +        {
   31.53 +            filter_generation = mRootViewModel.getFilter().getFirstSuccessGeneration();
   31.54 +        }
   31.55 +		return mMostFilteredDescendantGeneration >= filter_generation;
   31.56  	}
   31.57  
   31.58  
    32.1 --- a/indra/llui/lllayoutstack.cpp	Thu Jul 18 17:27:31 2013 -0400
    32.2 +++ b/indra/llui/lllayoutstack.cpp	Mon Aug 26 17:53:30 2013 -0400
    32.3 @@ -214,8 +214,15 @@
    32.4  	open_time_constant("open_time_constant", 0.02f),
    32.5  	close_time_constant("close_time_constant", 0.03f),
    32.6  	resize_bar_overlap("resize_bar_overlap", 1),
    32.7 -	border_size("border_size", LLCachedControl<S32>(*LLUI::sSettingGroups["config"], "UIResizeBarHeight", 0))
    32.8 -{}
    32.9 +	border_size("border_size", LLCachedControl<S32>(*LLUI::sSettingGroups["config"], "UIResizeBarHeight", 0)),
   32.10 +	show_drag_handle("show_drag_handle", false),
   32.11 +	drag_handle_first_indent("drag_handle_first_indent", 0),
   32.12 +	drag_handle_second_indent("drag_handle_second_indent", 0),
   32.13 +	drag_handle_thickness("drag_handle_thickness", 5),
   32.14 +	drag_handle_shift("drag_handle_shift", 2)
   32.15 +{
   32.16 +	addSynonym(border_size, "drag_handle_gap");
   32.17 +}
   32.18  
   32.19  LLLayoutStack::LLLayoutStack(const LLLayoutStack::Params& p) 
   32.20  :	LLView(p),
   32.21 @@ -227,8 +234,14 @@
   32.22  	mClip(p.clip),
   32.23  	mOpenTimeConstant(p.open_time_constant),
   32.24  	mCloseTimeConstant(p.close_time_constant),
   32.25 -	mResizeBarOverlap(p.resize_bar_overlap)
   32.26 -{}
   32.27 +	mResizeBarOverlap(p.resize_bar_overlap),
   32.28 +	mShowDragHandle(p.show_drag_handle),
   32.29 +	mDragHandleFirstIndent(p.drag_handle_first_indent),
   32.30 +	mDragHandleSecondIndent(p.drag_handle_second_indent),
   32.31 +	mDragHandleThickness(p.drag_handle_thickness),
   32.32 +	mDragHandleShift(p.drag_handle_shift)
   32.33 +{
   32.34 +}
   32.35  
   32.36  LLLayoutStack::~LLLayoutStack()
   32.37  {
   32.38 @@ -262,6 +275,26 @@
   32.39  			drawChild(panelp, 0, 0, !clip_rect.isEmpty());
   32.40  		}
   32.41  	}
   32.42 +
   32.43 +	const LLView::child_list_t * child_listp = getChildList();
   32.44 +	BOOST_FOREACH(LLView * childp, * child_listp)
   32.45 +	{
   32.46 +		LLResizeBar * resize_barp = dynamic_cast<LLResizeBar*>(childp);
   32.47 +		if (resize_barp && resize_barp->isShowDragHandle() && resize_barp->getVisible() && resize_barp->getRect().isValid())
   32.48 +		{
   32.49 +			LLRect screen_rect = resize_barp->calcScreenRect();
   32.50 +			if (LLUI::getRootView()->getLocalRect().overlaps(screen_rect) && LLUI::sDirtyRect.overlaps(screen_rect))
   32.51 +			{
   32.52 +				LLUI::pushMatrix();
   32.53 +				{
   32.54 +					const LLRect& rb_rect(resize_barp->getRect());
   32.55 +					LLUI::translate(rb_rect.mLeft, rb_rect.mBottom);
   32.56 +					resize_barp->draw();
   32.57 +				}
   32.58 +				LLUI::popMatrix();
   32.59 +			}
   32.60 +		}
   32.61 +	}
   32.62  }
   32.63  
   32.64  void LLLayoutStack::removeChild(LLView* view)
   32.65 @@ -390,7 +423,6 @@
   32.66  	BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
   32.67  	{
   32.68  		F32 panel_dim = llmax(panelp->getExpandedMinDim(), panelp->mTargetDim);
   32.69 -		F32 panel_visible_dim = panelp->getVisibleDim();
   32.70  
   32.71  		LLRect panel_rect;
   32.72  		if (mOrientation == HORIZONTAL)
   32.73 @@ -407,27 +439,61 @@
   32.74  										getRect().getWidth(),
   32.75  										llround(panel_dim));
   32.76  		}
   32.77 +
   32.78 +		LLRect resize_bar_rect(panel_rect);
   32.79 +		LLResizeBar * resize_barp = panelp->getResizeBar();
   32.80 +		bool show_drag_handle = resize_barp->isShowDragHandle();
   32.81 +		F32 panel_spacing = (F32)mPanelSpacing * panelp->getVisibleAmount();
   32.82 +		F32 panel_visible_dim = panelp->getVisibleDim();
   32.83 +		S32 panel_spacing_round = (S32)(llround(panel_spacing));
   32.84 +
   32.85 +		if (mOrientation == HORIZONTAL)
   32.86 +		{
   32.87 +			cur_pos += panel_visible_dim + panel_spacing;
   32.88 +
   32.89 +			if (show_drag_handle && panel_spacing_round > mDragHandleThickness)
   32.90 +			{
   32.91 +				resize_bar_rect.mLeft = panel_rect.mRight + mDragHandleShift;
   32.92 +				resize_bar_rect.mRight = resize_bar_rect.mLeft + mDragHandleThickness;
   32.93 +			}
   32.94 +			else
   32.95 +			{
   32.96 +				resize_bar_rect.mLeft = panel_rect.mRight - mResizeBarOverlap;
   32.97 +				resize_bar_rect.mRight = panel_rect.mRight + panel_spacing_round + mResizeBarOverlap;
   32.98 +			}
   32.99 +
  32.100 +			if (show_drag_handle)
  32.101 +			{
  32.102 +				resize_bar_rect.mBottom += mDragHandleSecondIndent;
  32.103 +				resize_bar_rect.mTop -= mDragHandleFirstIndent;
  32.104 +			}
  32.105 +
  32.106 +		}
  32.107 +		else //VERTICAL
  32.108 +		{
  32.109 +			cur_pos -= panel_visible_dim + panel_spacing;
  32.110 +
  32.111 +			if (show_drag_handle && panel_spacing_round > mDragHandleThickness)
  32.112 +			{
  32.113 +				resize_bar_rect.mTop = panel_rect.mBottom - mDragHandleShift;
  32.114 +				resize_bar_rect.mBottom = resize_bar_rect.mTop - mDragHandleThickness;
  32.115 +			}
  32.116 +			else
  32.117 +			{
  32.118 +				resize_bar_rect.mTop = panel_rect.mBottom + mResizeBarOverlap;
  32.119 +				resize_bar_rect.mBottom = panel_rect.mBottom - panel_spacing_round - mResizeBarOverlap;
  32.120 +			}
  32.121 +
  32.122 +			if (show_drag_handle)
  32.123 +			{
  32.124 +				resize_bar_rect.mLeft += mDragHandleFirstIndent;
  32.125 +				resize_bar_rect.mRight -= mDragHandleSecondIndent;
  32.126 +			}
  32.127 +		}
  32.128 +
  32.129  		panelp->setIgnoreReshape(true);
  32.130  		panelp->setShape(panel_rect);
  32.131  		panelp->setIgnoreReshape(false);
  32.132 -
  32.133 -		LLRect resize_bar_rect(panel_rect);
  32.134 -
  32.135 -		F32 panel_spacing = (F32)mPanelSpacing * panelp->getVisibleAmount();
  32.136 -		if (mOrientation == HORIZONTAL)
  32.137 -		{
  32.138 -			resize_bar_rect.mLeft = panel_rect.mRight - mResizeBarOverlap;
  32.139 -			resize_bar_rect.mRight = panel_rect.mRight + (S32)(llround(panel_spacing)) + mResizeBarOverlap;
  32.140 -
  32.141 -			cur_pos += panel_visible_dim + panel_spacing;
  32.142 -		}
  32.143 -		else //VERTICAL
  32.144 -		{
  32.145 -			resize_bar_rect.mTop = panel_rect.mBottom + mResizeBarOverlap;
  32.146 -			resize_bar_rect.mBottom = panel_rect.mBottom - (S32)(llround(panel_spacing)) - mResizeBarOverlap;
  32.147 -
  32.148 -			cur_pos -= panel_visible_dim + panel_spacing;
  32.149 -		}
  32.150  		panelp->mResizeBar->setShape(resize_bar_rect);
  32.151  	}
  32.152  
  32.153 @@ -475,14 +541,13 @@
  32.154  	{
  32.155  		if (lp->mResizeBar == NULL)
  32.156  		{
  32.157 -			LLResizeBar::Side side = (mOrientation == HORIZONTAL) ? LLResizeBar::RIGHT : LLResizeBar::BOTTOM;
  32.158 -
  32.159  			LLResizeBar::Params resize_params;
  32.160  			resize_params.name("resize");
  32.161  			resize_params.resizing_view(lp);
  32.162  			resize_params.min_size(lp->getRelevantMinDim());
  32.163 -			resize_params.side(side);
  32.164 +			resize_params.side((mOrientation == HORIZONTAL) ? LLResizeBar::RIGHT : LLResizeBar::BOTTOM);
  32.165  			resize_params.snapping_enabled(false);
  32.166 +			resize_params.show_drag_handle(mShowDragHandle);
  32.167  			LLResizeBar* resize_bar = LLUICtrlFactory::create<LLResizeBar>(resize_params);
  32.168  			lp->mResizeBar = resize_bar;
  32.169  			LLView::addChild(resize_bar, 0);
  32.170 @@ -864,3 +929,4 @@
  32.171  		previous_visible_panelp = visible_panelp;
  32.172  	}
  32.173  }
  32.174 +
    33.1 --- a/indra/llui/lllayoutstack.h	Thu Jul 18 17:27:31 2013 -0400
    33.2 +++ b/indra/llui/lllayoutstack.h	Mon Aug 26 17:53:30 2013 -0400
    33.3 @@ -62,6 +62,11 @@
    33.4  		Optional<F32>			open_time_constant,
    33.5  								close_time_constant;
    33.6  		Optional<S32>			resize_bar_overlap;
    33.7 +		Optional<bool>			show_drag_handle;
    33.8 +		Optional<S32>			drag_handle_first_indent;
    33.9 +		Optional<S32>			drag_handle_second_indent;
   33.10 +		Optional<S32>			drag_handle_thickness;
   33.11 +		Optional<S32>			drag_handle_shift;
   33.12  
   33.13  		Params();
   33.14  	};
   33.15 @@ -126,6 +131,11 @@
   33.16  	F32  mCloseTimeConstant;
   33.17  	bool mNeedsLayout;
   33.18  	S32  mResizeBarOverlap;
   33.19 +	bool mShowDragHandle;
   33.20 +	S32  mDragHandleFirstIndent;
   33.21 +	S32  mDragHandleSecondIndent;
   33.22 +	S32  mDragHandleThickness;
   33.23 +	S32  mDragHandleShift;
   33.24  }; // end class LLLayoutStack
   33.25  
   33.26  
    34.1 --- a/indra/llui/llmenugl.cpp	Thu Jul 18 17:27:31 2013 -0400
    34.2 +++ b/indra/llui/llmenugl.cpp	Mon Aug 26 17:53:30 2013 -0400
    34.3 @@ -3146,6 +3146,13 @@
    34.4  	const S32 CURSOR_HEIGHT = 22;		// Approximate "normal" cursor size
    34.5  	const S32 CURSOR_WIDTH = 12;
    34.6  
    34.7 +	if (menu->getChildList()->empty())
    34.8 +	{
    34.9 +		return;
   34.10 +	}
   34.11 +
   34.12 +	menu->setVisible( TRUE );
   34.13 +
   34.14  	//Do not show menu if all menu items are disabled
   34.15  	BOOL item_enabled = false;
   34.16  	for (LLView::child_list_t::const_iterator itor = menu->getChildList()->begin();
   34.17 @@ -3156,8 +3163,9 @@
   34.18  		item_enabled = item_enabled || menu_item->getEnabled();
   34.19  	}
   34.20  
   34.21 -	if(menu->getChildList()->empty() || !item_enabled)
   34.22 +	if(!item_enabled)
   34.23  	{
   34.24 +		menu->setVisible( FALSE );
   34.25  		return;
   34.26  	}
   34.27  
   34.28 @@ -3173,8 +3181,6 @@
   34.29  		menu->mFirstVisibleItem = NULL;
   34.30  	}
   34.31  
   34.32 -	menu->setVisible( TRUE );
   34.33 -
   34.34  	// Fix menu rect if needed.
   34.35  	menu->needsArrange();
   34.36  	menu->arrangeAndClear();
    35.1 --- a/indra/llui/llnotifications.cpp	Thu Jul 18 17:27:31 2013 -0400
    35.2 +++ b/indra/llui/llnotifications.cpp	Mon Aug 26 17:53:30 2013 -0400
    35.3 @@ -214,7 +214,7 @@
    35.4  		}
    35.5  		else
    35.6  		{
    35.7 -			LLUI::sSettingGroups["ignores"]->declareBOOL(name, show_notification, "Show notification with this name", TRUE);
    35.8 +			LLUI::sSettingGroups["ignores"]->declareBOOL(name, show_notification, "Show notification with this name", LLControlVariable::PERSIST_NONDFT);
    35.9  			mIgnoreSetting = LLUI::sSettingGroups["ignores"]->getControl(name);
   35.10  		}
   35.11  	}
    36.1 --- a/indra/llui/llresizebar.cpp	Thu Jul 18 17:27:31 2013 -0400
    36.2 +++ b/indra/llui/llresizebar.cpp	Mon Aug 26 17:53:30 2013 -0400
    36.3 @@ -28,14 +28,53 @@
    36.4  
    36.5  #include "llresizebar.h"
    36.6  
    36.7 +#include "lllocalcliprect.h"
    36.8  #include "llmath.h"
    36.9  #include "llui.h"
   36.10  #include "llmenugl.h"
   36.11  #include "llfocusmgr.h"
   36.12  #include "llwindow.h"
   36.13  
   36.14 +class LLImagePanel : public LLPanel
   36.15 +{
   36.16 +public:
   36.17 +	struct Params :	public LLInitParam::Block<Params, LLPanel::Params>
   36.18 +	{
   36.19 +		Optional<bool> horizontal;
   36.20 +		Params() : horizontal("horizontal", false) {}
   36.21 +	};
   36.22 +	LLImagePanel(const Params& p) : LLPanel(p), mHorizontal(p.horizontal) {}
   36.23 +	virtual ~LLImagePanel() {}
   36.24 +
   36.25 +	void draw()
   36.26 +	{
   36.27 +		const LLRect& parent_rect = getParent()->getRect();
   36.28 +		const LLRect& rect = getRect();
   36.29 +		LLRect clip_rect( -rect.mLeft, parent_rect.getHeight() - rect.mBottom - 2
   36.30 +						 , parent_rect.getWidth() - rect.mLeft - (mHorizontal ? 2 : 0), -rect.mBottom);
   36.31 +		LLLocalClipRect clip(clip_rect);
   36.32 +		LLPanel::draw();
   36.33 +	}
   36.34 +
   36.35 +private:
   36.36 +	bool mHorizontal;
   36.37 +};
   36.38 +
   36.39 +static LLDefaultChildRegistry::Register<LLImagePanel> t1("resize_bar_image_panel");
   36.40 +
   36.41 +LLResizeBar::Params::Params()
   36.42 +:	max_size("max_size", S32_MAX),
   36.43 +	snapping_enabled("snapping_enabled", true),
   36.44 +	resizing_view("resizing_view"),
   36.45 +	side("side"),
   36.46 +	allow_double_click_snapping("allow_double_click_snapping", true),
   36.47 +	show_drag_handle("show_drag_handle", false)
   36.48 +{
   36.49 +	name = "resize_bar";
   36.50 +}
   36.51 +
   36.52  LLResizeBar::LLResizeBar(const LLResizeBar::Params& p)
   36.53 -:	LLView(p),
   36.54 +:	LLPanel(p),
   36.55  	mDragLastScreenX( 0 ),
   36.56  	mDragLastScreenY( 0 ),
   36.57  	mLastMouseScreenX( 0 ),
   36.58 @@ -46,7 +85,9 @@
   36.59  	mSnappingEnabled(p.snapping_enabled),
   36.60  	mAllowDoubleClickSnapping(p.allow_double_click_snapping),
   36.61  	mResizingView(p.resizing_view),
   36.62 -	mResizeListener(NULL)
   36.63 +	mResizeListener(NULL),
   36.64 +	mShowDragHandle(p.show_drag_handle),
   36.65 +	mImagePanel(NULL)
   36.66  {
   36.67  	setFollowsNone();
   36.68  	// set up some generically good follow code.
   36.69 @@ -75,8 +116,37 @@
   36.70  	default:
   36.71  		break;
   36.72  	}
   36.73 +
   36.74 +	if (mShowDragHandle)
   36.75 +	{
   36.76 +		LLViewBorder::Params border_params;
   36.77 +		border_params.border_thickness = 1;
   36.78 +		border_params.highlight_light_color = LLUIColorTable::instance().getColor("ResizebarBorderLight");
   36.79 +		border_params.shadow_dark_color = LLUIColorTable::instance().getColor("ResizebarBorderDark");
   36.80 +
   36.81 +		addBorder(border_params);
   36.82 +		setBorderVisible(TRUE);
   36.83 +
   36.84 +		LLImagePanel::Params image_panel;
   36.85 +		mDragHandleImage = LLUI::getUIImage(LLResizeBar::RIGHT == mSide ? "Vertical Drag Handle" : "Horizontal Drag Handle");
   36.86 +		image_panel.bg_alpha_image = mDragHandleImage;
   36.87 +		image_panel.background_visible = true;
   36.88 +		image_panel.horizontal = (LLResizeBar::BOTTOM == mSide);
   36.89 +		mImagePanel = LLUICtrlFactory::create<LLImagePanel>(image_panel);
   36.90 +		setImagePanel(mImagePanel);
   36.91 +	}
   36.92  }
   36.93  
   36.94 +BOOL LLResizeBar::postBuild()
   36.95 +{
   36.96 +	if (mShowDragHandle)
   36.97 +	{
   36.98 +		setBackgroundVisible(TRUE);
   36.99 +		setTransparentColor(LLUIColorTable::instance().getColor("ResizebarBody"));
  36.100 +	}
  36.101 +
  36.102 +	return LLPanel::postBuild();
  36.103 +}
  36.104  
  36.105  BOOL LLResizeBar::handleMouseDown(S32 x, S32 y, MASK mask)
  36.106  {
  36.107 @@ -342,3 +412,39 @@
  36.108  	return TRUE;
  36.109  }
  36.110  
  36.111 +void LLResizeBar::setImagePanel(LLPanel * panelp)
  36.112 +{
  36.113 +	const LLView::child_list_t * children = getChildList();
  36.114 +	if (getChildCount() == 2)
  36.115 +	{
  36.116 +		LLPanel * image_panelp = dynamic_cast<LLPanel*>(children->back());
  36.117 +		if (image_panelp)
  36.118 +		{
  36.119 +			removeChild(image_panelp);
  36.120 +			delete image_panelp;
  36.121 +		}
  36.122 +	}
  36.123 +
  36.124 +	addChild(panelp);
  36.125 +	sendChildToBack(panelp);
  36.126 +}
  36.127 +
  36.128 +LLPanel * LLResizeBar::getImagePanel() const
  36.129 +{
  36.130 +	return getChildCount() > 0 ? (LLPanel *)getChildList()->back() : NULL;
  36.131 +}
  36.132 +
  36.133 +void LLResizeBar::draw()
  36.134 +{
  36.135 +	if (mShowDragHandle)
  36.136 +	{
  36.137 +		S32 image_width = mDragHandleImage->getTextureWidth();
  36.138 +		S32 image_height = mDragHandleImage->getTextureHeight();
  36.139 +		const LLRect& panel_rect = getRect();
  36.140 +		S32 image_left = (panel_rect.getWidth() - image_width) / 2 - 1;
  36.141 +		S32 image_bottom = (panel_rect.getHeight() - image_height) / 2;
  36.142 +		mImagePanel->setRect(LLRect(image_left, image_bottom + image_height, image_left + image_width, image_bottom));
  36.143 +	}
  36.144 +
  36.145 +	LLPanel::draw();
  36.146 +}
    37.1 --- a/indra/llui/llresizebar.h	Thu Jul 18 17:27:31 2013 -0400
    37.2 +++ b/indra/llui/llresizebar.h	Mon Aug 26 17:53:30 2013 -0400
    37.3 @@ -27,15 +27,14 @@
    37.4  #ifndef LL_RESIZEBAR_H
    37.5  #define LL_RESIZEBAR_H
    37.6  
    37.7 -#include "llview.h"
    37.8 -#include "llcoord.h"
    37.9 +#include "llpanel.h"
   37.10  
   37.11 -class LLResizeBar : public LLView
   37.12 +class LLResizeBar : public LLPanel
   37.13  {
   37.14  public:
   37.15  	enum Side { LEFT, TOP, RIGHT, BOTTOM };
   37.16  
   37.17 -	struct Params : public LLInitParam::Block<Params, LLView::Params>
   37.18 +	struct Params : public LLInitParam::Block<Params, LLPanel::Params>
   37.19  	{
   37.20  		Mandatory<LLView*> resizing_view;
   37.21  		Mandatory<Side>	side;
   37.22 @@ -44,24 +43,19 @@
   37.23  		Optional<S32>	max_size;
   37.24  		Optional<bool>	snapping_enabled;
   37.25  		Optional<bool>	allow_double_click_snapping;
   37.26 +		Optional<bool>	show_drag_handle;
   37.27  
   37.28 -		Params()
   37.29 -		:	max_size("max_size", S32_MAX),
   37.30 -			snapping_enabled("snapping_enabled", true),
   37.31 -			resizing_view("resizing_view"),
   37.32 -			side("side"),
   37.33 -			allow_double_click_snapping("allow_double_click_snapping", true)
   37.34 -		{
   37.35 -			name = "resize_bar";
   37.36 -		}
   37.37 +		Params();
   37.38  	};
   37.39  
   37.40  protected:
   37.41  	LLResizeBar(const LLResizeBar::Params& p);
   37.42  	friend class LLUICtrlFactory;
   37.43 +
   37.44 +	/*virtual*/ BOOL postBuild();
   37.45  public:
   37.46  
   37.47 -//	virtual void	draw();  No appearance
   37.48 +	virtual void	draw();
   37.49  	virtual BOOL	handleHover(S32 x, S32 y, MASK mask);
   37.50  	virtual BOOL	handleMouseDown(S32 x, S32 y, MASK mask);
   37.51  	virtual BOOL	handleMouseUp(S32 x, S32 y, MASK mask);
   37.52 @@ -72,20 +66,26 @@
   37.53  	void			setAllowDoubleClickSnapping(BOOL allow) { mAllowDoubleClickSnapping = allow; }
   37.54  	bool			canResize() { return getEnabled() && mMaxSize > mMinSize; }
   37.55  	void            setResizeListener(boost::function<void(void*)> listener) {mResizeListener = listener;}
   37.56 +	BOOL			isShowDragHandle() const { return mShowDragHandle; }
   37.57 +	void			setImagePanel(LLPanel * panelp);
   37.58 +	LLPanel *		getImagePanel() const;
   37.59  
   37.60  private:
   37.61 -	S32				mDragLastScreenX;
   37.62 -	S32				mDragLastScreenY;
   37.63 -	S32				mLastMouseScreenX;
   37.64 -	S32				mLastMouseScreenY;
   37.65 -	LLCoordGL		mLastMouseDir;
   37.66 -	S32				mMinSize;
   37.67 -	S32				mMaxSize;
   37.68 -	const Side		mSide;
   37.69 -	BOOL			mSnappingEnabled;
   37.70 -	BOOL			mAllowDoubleClickSnapping;
   37.71 -	LLView*			mResizingView;
   37.72 -	boost::function<void(void*)>  mResizeListener;
   37.73 +	S32								mDragLastScreenX;
   37.74 +	S32								mDragLastScreenY;
   37.75 +	S32								mLastMouseScreenX;
   37.76 +	S32								mLastMouseScreenY;
   37.77 +	LLCoordGL						mLastMouseDir;
   37.78 +	S32								mMinSize;
   37.79 +	S32								mMaxSize;
   37.80 +	const Side						mSide;
   37.81 +	BOOL							mSnappingEnabled;
   37.82 +	BOOL							mAllowDoubleClickSnapping;
   37.83 +	BOOL							mShowDragHandle;
   37.84 +	LLView*							mResizingView;
   37.85 +	boost::function<void(void*)>	mResizeListener;
   37.86 +	LLPointer<LLUIImage>			mDragHandleImage;
   37.87 +	LLPanel *						mImagePanel;
   37.88  };
   37.89  
   37.90  #endif  // LL_RESIZEBAR_H
    38.1 --- a/indra/llui/llscrolllistcolumn.cpp	Thu Jul 18 17:27:31 2013 -0400
    38.2 +++ b/indra/llui/llscrolllistcolumn.cpp	Mon Aug 26 17:53:30 2013 -0400
    38.3 @@ -236,7 +236,8 @@
    38.4  		// tell scroll list to layout columns again
    38.5  		// do immediate update to get proper feedback to resize handle
    38.6  		// which needs to know how far the resize actually went
    38.7 -		mColumn->mParentCtrl->updateColumns();
    38.8 +		const bool force_update = true;
    38.9 +		mColumn->mParentCtrl->updateColumns(force_update);
   38.10  	}
   38.11  }
   38.12  
    39.1 --- a/indra/llui/llscrolllistctrl.cpp	Thu Jul 18 17:27:31 2013 -0400
    39.2 +++ b/indra/llui/llscrolllistctrl.cpp	Mon Aug 26 17:53:30 2013 -0400
    39.3 @@ -615,7 +615,6 @@
    39.4  
    39.5  		if (mColumnWidthsDirty)
    39.6  		{
    39.7 -			mColumnWidthsDirty = false;
    39.8  			// update max content width for this column, by looking at all items
    39.9  			column->mMaxContentWidth = column->mHeader ? LLFontGL::getFontSansSerifSmall()->getWidth(column->mLabel) + mColumnPadding + HEADING_TEXT_PADDING : 0;
   39.10  			item_list::iterator iter;
   39.11 @@ -629,6 +628,7 @@
   39.12  		}
   39.13  		max_item_width += column->mMaxContentWidth;
   39.14  	}
   39.15 +	mColumnWidthsDirty = false;
   39.16  
   39.17  	return max_item_width;
   39.18  }
   39.19 @@ -643,7 +643,7 @@
   39.20  		if (!column) continue;
   39.21  
   39.22  		// update column width
   39.23 -		S32 new_width = column->getWidth();
   39.24 +		S32 new_width = 0;
   39.25  		if (column->mRelWidth >= 0)
   39.26  		{
   39.27  			new_width = (S32)llround(column->mRelWidth*mItemListRect.getWidth());
   39.28 @@ -652,6 +652,10 @@
   39.29  		{
   39.30  			new_width = (mItemListRect.getWidth() - mTotalStaticColumnWidth - mTotalColumnPadding) / mNumDynamicWidthColumns;
   39.31  		}
   39.32 +		else
   39.33 +		{
   39.34 +			new_width = column->getWidth();
   39.35 +		}
   39.36  
   39.37  		if (column->getWidth() != new_width)
   39.38  		{
   39.39 @@ -693,9 +697,9 @@
   39.40  }
   39.41  
   39.42  
   39.43 -void LLScrollListCtrl::updateColumns()
   39.44 +void LLScrollListCtrl::updateColumns(bool force_update)
   39.45  {
   39.46 -	if (!mColumnsDirty)
   39.47 +	if (!mColumnsDirty && !force_update)
   39.48  		return;
   39.49  
   39.50  	mColumnsDirty = false;
   39.51 @@ -749,7 +753,7 @@
   39.52  	}
   39.53  
   39.54  	// propagate column widths to individual cells
   39.55 -	if (columns_changed_width)
   39.56 +	if (columns_changed_width || force_update)
   39.57  	{
   39.58  		item_list::iterator iter;
   39.59  		for (iter = mItemList.begin(); iter != mItemList.end(); iter++)
   39.60 @@ -1179,10 +1183,10 @@
   39.61  // Selects first enabled item of the given name.
   39.62  // Returns false if item not found.
   39.63  // Calls getItemByLabel in order to combine functionality
   39.64 -BOOL LLScrollListCtrl::selectItemByLabel(const std::string& label, BOOL case_sensitive)
   39.65 +BOOL LLScrollListCtrl::selectItemByLabel(const std::string& label, BOOL case_sensitive, S32 column/* = 0*/)
   39.66  {
   39.67  	deselectAllItems(TRUE); 	// ensure that no stale items are selected, even if we don't find a match
   39.68 -	LLScrollListItem* item = getItemByLabel(label, case_sensitive);
   39.69 +	LLScrollListItem* item = getItemByLabel(label, case_sensitive, column);
   39.70  
   39.71  	bool found = NULL != item;
   39.72  	if(found)
    40.1 --- a/indra/llui/llscrolllistctrl.h	Thu Jul 18 17:27:31 2013 -0400
    40.2 +++ b/indra/llui/llscrolllistctrl.h	Mon Aug 26 17:53:30 2013 -0400
    40.3 @@ -241,7 +241,7 @@
    40.4  	// one of which can be selected at a time.
    40.5  	virtual LLScrollListItem* addSimpleElement(const std::string& value, EAddPosition pos = ADD_BOTTOM, const LLSD& id = LLSD());
    40.6  
    40.7 -	BOOL			selectItemByLabel( const std::string& item, BOOL case_sensitive = TRUE );		// FALSE if item not found
    40.8 +	BOOL			selectItemByLabel( const std::string& item, BOOL case_sensitive = TRUE, S32 column = 0 );		// FALSE if item not found
    40.9  	BOOL			selectItemByPrefix(const std::string& target, BOOL case_sensitive = TRUE);
   40.10  	BOOL			selectItemByPrefix(const LLWString& target, BOOL case_sensitive = TRUE);
   40.11  	LLScrollListItem*  getItemByLabel( const std::string& item, BOOL case_sensitive = TRUE, S32 column = 0 );
   40.12 @@ -342,7 +342,7 @@
   40.13  
   40.14  	static void onClickColumn(void *userdata);
   40.15  
   40.16 -	virtual void updateColumns();
   40.17 +	virtual void updateColumns(bool force_update = false);
   40.18  	S32 calcMaxContentWidth();
   40.19  	bool updateColumnWidths();
   40.20  
    41.1 --- a/indra/llui/lltextbase.cpp	Thu Jul 18 17:27:31 2013 -0400
    41.2 +++ b/indra/llui/lltextbase.cpp	Mon Aug 26 17:53:30 2013 -0400
    41.3 @@ -180,6 +180,7 @@
    41.4  LLTextBase::LLTextBase(const LLTextBase::Params &p) 
    41.5  :	LLUICtrl(p, LLTextViewModelPtr(new LLTextViewModel)),
    41.6  	mURLClickSignal(NULL),
    41.7 +	mIsFriendSignal(NULL),
    41.8  	mMaxTextByteLength( p.max_text_length ),
    41.9  	mFont(p.font),
   41.10  	mFontShadow(p.font_shadow),
   41.11 @@ -653,6 +654,10 @@
   41.12  			mSpellCheckEnd = end;
   41.13  		}
   41.14  	}
   41.15 +	else
   41.16 +	{
   41.17 +		mMisspellRanges.clear();
   41.18 +	}
   41.19  
   41.20  	LLTextSegmentPtr cur_segment = *seg_iter;
   41.21  
   41.22 @@ -1850,7 +1855,17 @@
   41.23  
   41.24  	static LLPointer<LLIndexSegment> index_segment = new LLIndexSegment();
   41.25  
   41.26 -	if (index > getLength()) { return mSegments.end(); }
   41.27 +	S32 text_len = 0;
   41.28 +	if (!useLabel())
   41.29 +	{
   41.30 +		text_len = getLength();
   41.31 +	}
   41.32 +	else
   41.33 +	{
   41.34 +		text_len = mLabel.getWString().length();
   41.35 +	}
   41.36 +
   41.37 +	if (index > text_len) { return mSegments.end(); }
   41.38  
   41.39  	// when there are no segments, we return the end iterator, which must be checked by caller
   41.40  	if (mSegments.size() <= 1) { return mSegments.begin(); }
   41.41 @@ -1866,7 +1881,17 @@
   41.42  {
   41.43  	static LLPointer<LLIndexSegment> index_segment = new LLIndexSegment();
   41.44  
   41.45 -	if (index > getLength()) { return mSegments.end(); }
   41.46 +	S32 text_len = 0;
   41.47 +	if (!useLabel())
   41.48 +	{
   41.49 +		text_len = getLength();
   41.50 +	}
   41.51 +	else
   41.52 +	{
   41.53 +		text_len = mLabel.getWString().length();
   41.54 +	}
   41.55 +
   41.56 +	if (index > text_len) { return mSegments.end(); }
   41.57  
   41.58  	// when there are no segments, we return the end iterator, which must be checked by caller
   41.59  	if (mSegments.size() <= 1) { return mSegments.begin(); }
   41.60 @@ -1916,9 +1941,12 @@
   41.61  	registrar.add("Url.OpenInternal", boost::bind(&LLUrlAction::openURLInternal, url));
   41.62  	registrar.add("Url.OpenExternal", boost::bind(&LLUrlAction::openURLExternal, url));
   41.63  	registrar.add("Url.Execute", boost::bind(&LLUrlAction::executeSLURL, url));
   41.64 +	registrar.add("Url.Block", boost::bind(&LLUrlAction::blockObject, url));
   41.65  	registrar.add("Url.Teleport", boost::bind(&LLUrlAction::teleportToLocation, url));
   41.66  	registrar.add("Url.ShowProfile", boost::bind(&LLUrlAction::showProfile, url));
   41.67  	registrar.add("Url.AddFriend", boost::bind(&LLUrlAction::addFriend, url));
   41.68 +	registrar.add("Url.RemoveFriend", boost::bind(&LLUrlAction::removeFriend, url));
   41.69 +	registrar.add("Url.SendIM", boost::bind(&LLUrlAction::sendIM, url));
   41.70  	registrar.add("Url.ShowOnMap", boost::bind(&LLUrlAction::showLocationOnMap, url));
   41.71  	registrar.add("Url.CopyLabel", boost::bind(&LLUrlAction::copyLabelToClipboard, url));
   41.72  	registrar.add("Url.CopyUrl", boost::bind(&LLUrlAction::copyURLToClipboard, url));
   41.73 @@ -1927,6 +1955,19 @@
   41.74  	delete mPopupMenu;
   41.75  	mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>(xui_file, LLMenuGL::sMenuContainer,
   41.76  																		 LLMenuHolderGL::child_registry_t::instance());	
   41.77 +	if (mIsFriendSignal)
   41.78 +	{
   41.79 +		bool isFriend = *(*mIsFriendSignal)(LLUUID(LLUrlAction::getUserID(url)));
   41.80 +		LLView* addFriendButton = mPopupMenu->getChild<LLView>("add_friend");
   41.81 +		LLView* removeFriendButton = mPopupMenu->getChild<LLView>("remove_friend");
   41.82 +
   41.83 +		if (addFriendButton && removeFriendButton)
   41.84 +		{
   41.85 +			addFriendButton->setEnabled(!isFriend);
   41.86 +			removeFriendButton->setEnabled(isFriend);
   41.87 +		}
   41.88 +	}
   41.89 +	
   41.90  	if (mPopupMenu)
   41.91  	{
   41.92  		mPopupMenu->show(x, y);
   41.93 @@ -2096,7 +2137,7 @@
   41.94  	}
   41.95  }
   41.96  
   41.97 -bool LLTextBase::useLabel()
   41.98 +bool LLTextBase::useLabel() const
   41.99  {
  41.100      return !getLength() && !mLabel.empty() && !hasFocus();
  41.101  }
  41.102 @@ -2602,21 +2643,18 @@
  41.103  void LLTextBase::changeLine( S32 delta )
  41.104  {
  41.105  	S32 line = getLineNumFromDocIndex(mCursorPos);
  41.106 -
  41.107 -	S32 new_line = line;
  41.108 -	if( (delta < 0) && (line > 0 ) )
  41.109 -	{
  41.110 -		new_line = line - 1;
  41.111 -	}
  41.112 -	else if( (delta > 0) && (line < (getLineCount() - 1)) )
  41.113 -	{
  41.114 -		new_line = line + 1;
  41.115 -	}
  41.116 -
  41.117 -	LLRect visible_region = getVisibleDocumentRect();
  41.118 -
  41.119 -	S32 new_cursor_pos = getDocIndexFromLocalCoord(mDesiredXPixel, mLineInfoList[new_line].mRect.mBottom + mVisibleTextRect.mBottom - visible_region.mBottom, TRUE);
  41.120 -	setCursorPos(new_cursor_pos, true);
  41.121 +	S32 max_line_nb = getLineCount() - 1;
  41.122 +	max_line_nb = (max_line_nb < 0 ? 0 : max_line_nb);
  41.123 +    
  41.124 +	S32 new_line = llclamp(line + delta, 0, max_line_nb);
  41.125 +
  41.126 +    if (new_line != line)
  41.127 +    {
  41.128 +        LLRect visible_region = getVisibleDocumentRect();
  41.129 +        S32 new_cursor_pos = getDocIndexFromLocalCoord(mDesiredXPixel,
  41.130 +                                                       mLineInfoList[new_line].mRect.mBottom + mVisibleTextRect.mBottom - visible_region.mBottom, TRUE);
  41.131 +        setCursorPos(new_cursor_pos, true);
  41.132 +    }
  41.133  }
  41.134  
  41.135  bool LLTextBase::scrolledToStart()
  41.136 @@ -2910,6 +2948,15 @@
  41.137  	return mURLClickSignal->connect(cb);
  41.138  }
  41.139  
  41.140 +boost::signals2::connection LLTextBase::setIsFriendCallback(const is_friend_signal_t::slot_type& cb)
  41.141 +{
  41.142 +	if (!mIsFriendSignal)
  41.143 +	{
  41.144 +		mIsFriendSignal = new is_friend_signal_t();
  41.145 +	}
  41.146 +	return mIsFriendSignal->connect(cb);
  41.147 +}
  41.148 +
  41.149  //
  41.150  // LLTextSegment
  41.151  //
  41.152 @@ -3203,7 +3250,7 @@
  41.153  		: LLFontGL::ONLY_WORD_BOUNDARIES;
  41.154  	
  41.155  	
  41.156 -	LLWString offsetString(text.c_str() + segment_offset + mStart);
  41.157 +	S32 offsetLength = text.length() - (segment_offset + mStart);
  41.158  
  41.159  	if(getLength() < segment_offset + mStart)
  41.160  	{ 
  41.161 @@ -3211,13 +3258,13 @@
  41.162  						<< segment_offset << "\tmStart:\t" << mStart << "\tsegments\t" << mEditor.mSegments.size() << "\tmax_chars\t" << max_chars << llendl;
  41.163  	}
  41.164  
  41.165 -	if(offsetString.length() + 1 < max_chars)
  41.166 +	if( (offsetLength + 1) < max_chars)
  41.167  	{
  41.168 -		llinfos << "offsetString.length() + 1 < max_chars\t max_chars:\t" << max_chars << "\toffsetString.length():\t" << offsetString.length() << " getLength() : "
  41.169 +		llinfos << "offsetString.length() + 1 < max_chars\t max_chars:\t" << max_chars << "\toffsetLength:\t" << offsetLength << " getLength() : "
  41.170  			<< getLength() << "\tsegment_offset:\t" << segment_offset << "\tmStart:\t" << mStart << "\tsegments\t" << mEditor.mSegments.size() << llendl;
  41.171  	}
  41.172  	
  41.173 -	S32 num_chars = mStyle->getFont()->maxDrawableChars(offsetString.c_str(), 
  41.174 +	S32 num_chars = mStyle->getFont()->maxDrawableChars( text.c_str() + (segment_offset + mStart),
  41.175  												(F32)num_pixels,
  41.176  												max_chars, 
  41.177  												word_wrap_style);
    42.1 --- a/indra/llui/lltextbase.h	Thu Jul 18 17:27:31 2013 -0400
    42.2 +++ b/indra/llui/lltextbase.h	Mon Aug 26 17:53:30 2013 -0400
    42.3 @@ -258,6 +258,8 @@
    42.4  	friend class LLNormalTextSegment;
    42.5  	friend class LLUICtrlFactory;
    42.6  
    42.7 +	typedef boost::signals2::signal<bool (const LLUUID& user_id)> is_friend_signal_t;
    42.8 +
    42.9  	struct LineSpacingParams : public LLInitParam::ChoiceBlock<LineSpacingParams>
   42.10  	{
   42.11  		Alternative<F32>	multiple;
   42.12 @@ -434,6 +436,7 @@
   42.13  	virtual void			appendImageSegment(const LLStyle::Params& style_params);
   42.14  	virtual void			appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo);
   42.15  	boost::signals2::connection setURLClickedCallback(const commit_signal_t::slot_type& cb);
   42.16 +	boost::signals2::connection setIsFriendCallback(const is_friend_signal_t::slot_type& cb);
   42.17  
   42.18  	void					setWordWrap(bool wrap);
   42.19  	LLScrollContainer*		getScrollContainer() const { return mScroller; }
   42.20 @@ -507,7 +510,7 @@
   42.21  	void							initFromParams(const Params& p);
   42.22      virtual void					beforeValueChange();
   42.23  	virtual void					onValueChange(S32 start, S32 end);
   42.24 -    virtual bool                    useLabel();
   42.25 +    virtual bool                    useLabel() const;
   42.26  
   42.27  	// draw methods
   42.28  	void							drawSelectionBackground(); // draws the black box behind the selected text
   42.29 @@ -648,6 +651,9 @@
   42.30  	// Fired when a URL link is clicked
   42.31  	commit_signal_t*			mURLClickSignal;
   42.32  
   42.33 +	// Used to check if user with given ID is avatar's friend
   42.34 +	is_friend_signal_t*         mIsFriendSignal;
   42.35 +
   42.36  	LLUIString					mLabel;	// text label that is visible when no user text provided
   42.37  };
   42.38  
    43.1 --- a/indra/llui/lltexteditor.cpp	Thu Jul 18 17:27:31 2013 -0400
    43.2 +++ b/indra/llui/lltexteditor.cpp	Mon Aug 26 17:53:30 2013 -0400
    43.3 @@ -1125,7 +1125,8 @@
    43.4  	}
    43.5  }
    43.6  
    43.7 -void LLTextEditor::addLineBreakChar()
    43.8 +
    43.9 +void LLTextEditor::addLineBreakChar(BOOL group_together)
   43.10  {
   43.11  	if( !getEnabled() )
   43.12  	{
   43.13 @@ -1143,7 +1144,7 @@
   43.14  	LLStyleConstSP sp(new LLStyle(LLStyle::Params()));
   43.15  	LLTextSegmentPtr segment = new LLLineBreakTextSegment(sp, mCursorPos);
   43.16  
   43.17 -	S32 pos = execute(new TextCmdAddChar(mCursorPos, FALSE, '\n', segment));
   43.18 +	S32 pos = execute(new TextCmdAddChar(mCursorPos, group_together, '\n', segment));
   43.19  	
   43.20  	setCursorPos(mCursorPos + pos);
   43.21  }
   43.22 @@ -1484,21 +1485,28 @@
   43.23  	std::basic_string<llwchar>::size_type start = 0;
   43.24  	std::basic_string<llwchar>::size_type pos = clean_string.find('\n',start);
   43.25  	
   43.26 -	while(pos!=-1)
   43.27 +	while((pos != -1) && (pos != clean_string.length() -1))
   43.28  	{
   43.29  		if(pos!=start)
   43.30  		{
   43.31  			std::basic_string<llwchar> str = std::basic_string<llwchar>(clean_string,start,pos-start);
   43.32 -			setCursorPos(mCursorPos + insert(mCursorPos, str, FALSE, LLTextSegmentPtr()));
   43.33 +			setCursorPos(mCursorPos + insert(mCursorPos, str, TRUE, LLTextSegmentPtr()));
   43.34  		}
   43.35 -		addLineBreakChar();
   43.36 -		
   43.37 +		addLineBreakChar(TRUE);			// Add a line break and group with the next addition.
   43.38 +
   43.39  		start = pos+1;
   43.40  		pos = clean_string.find('\n',start);
   43.41  	}
   43.42  
   43.43 -	std::basic_string<llwchar> str = std::basic_string<llwchar>(clean_string,start,clean_string.length()-start);
   43.44 -	setCursorPos(mCursorPos + insert(mCursorPos, str, FALSE, LLTextSegmentPtr()));
   43.45 +	if (pos != start)
   43.46 +	{
   43.47 +		std::basic_string<llwchar> str = std::basic_string<llwchar>(clean_string,start,clean_string.length()-start);
   43.48 +		setCursorPos(mCursorPos + insert(mCursorPos, str, FALSE, LLTextSegmentPtr()));
   43.49 +	}
   43.50 +	else
   43.51 +	{
   43.52 +		addLineBreakChar(FALSE);		// Add a line break and end the grouping.
   43.53 +	}
   43.54  }
   43.55  
   43.56  // copy selection to primary
   43.57 @@ -1964,8 +1972,7 @@
   43.58  	updateAllowingLanguageInput();
   43.59  }
   43.60  
   43.61 -// virtual, from LLView
   43.62 -void LLTextEditor::onFocusLost()
   43.63 +void LLTextEditor::focusLostHelper()
   43.64  {
   43.65  	updateAllowingLanguageInput();
   43.66  
   43.67 @@ -1982,7 +1989,11 @@
   43.68  
   43.69  	// Make sure cursor is shown again
   43.70  	getWindow()->showCursorFromMouseMove();
   43.71 -
   43.72 +}
   43.73 +
   43.74 +void LLTextEditor::onFocusLost()
   43.75 +{
   43.76 +	focusLostHelper();
   43.77  	LLTextBase::onFocusLost();
   43.78  }
   43.79  
   43.80 @@ -2128,12 +2139,17 @@
   43.81  					continue;
   43.82  				}
   43.83  
   43.84 -				S32 preedit_left = mVisibleTextRect.mLeft;
   43.85 +				line_info& line = mLineInfoList[cur_line];
   43.86 +				LLRect text_rect(line.mRect);
   43.87 +				text_rect.mRight = mDocumentView->getRect().getWidth(); // clamp right edge to document extents
   43.88 +				text_rect.translate(mDocumentView->getRect().mLeft, mDocumentView->getRect().mBottom); // adjust by scroll position
   43.89 +
   43.90 +				S32 preedit_left = text_rect.mLeft;
   43.91  				if (left > line_start)
   43.92  				{
   43.93  					preedit_left += mFont->getWidth(text, line_start, left - line_start);
   43.94  				}
   43.95 -				S32 preedit_right = mVisibleTextRect.mLeft;
   43.96 +				S32 preedit_right = text_rect.mLeft;
   43.97  				if (right < line_end)
   43.98  				{
   43.99  					preedit_right += mFont->getWidth(text, line_start, right - line_start);
  43.100 @@ -2146,18 +2162,18 @@
  43.101  				if (mPreeditStandouts[i])
  43.102  				{
  43.103  					gl_rect_2d(preedit_left + preedit_standout_gap,
  43.104 -							line_y + preedit_standout_position,
  43.105 -							preedit_right - preedit_standout_gap - 1,
  43.106 -							line_y + preedit_standout_position - preedit_standout_thickness,
  43.107 -							(mCursorColor.get() * preedit_standout_brightness + mWriteableBgColor.get() * (1 - preedit_standout_brightness)).setAlpha(1.0f));
  43.108 +							   text_rect.mBottom + mFont->getDescenderHeight() - 1,
  43.109 +							   preedit_right - preedit_standout_gap - 1,
  43.110 +							   text_rect.mBottom + mFont->getDescenderHeight() - 1 - preedit_standout_thickness,
  43.111 +							   (mCursorColor.get() * preedit_standout_brightness + mWriteableBgColor.get() * (1 - preedit_standout_brightness)).setAlpha(1.0f));
  43.112  				}
  43.113  				else
  43.114  				{
  43.115  					gl_rect_2d(preedit_left + preedit_marker_gap,
  43.116 -							line_y + preedit_marker_position,
  43.117 -							preedit_right - preedit_marker_gap - 1,
  43.118 -							line_y + preedit_marker_position - preedit_marker_thickness,
  43.119 -							(mCursorColor.get() * preedit_marker_brightness + mWriteableBgColor.get() * (1 - preedit_marker_brightness)).setAlpha(1.0f));
  43.120 +							   text_rect.mBottom + mFont->getDescenderHeight() - 1,
  43.121 +							   preedit_right - preedit_marker_gap - 1,
  43.122 +							   text_rect.mBottom + mFont->getDescenderHeight() - 1 - preedit_marker_thickness,
  43.123 +							   (mCursorColor.get() * preedit_marker_brightness + mWriteableBgColor.get() * (1 - preedit_marker_brightness)).setAlpha(1.0f));
  43.124  				}
  43.125  			}
  43.126  		}
  43.127 @@ -2240,12 +2256,13 @@
  43.128  		LLRect clip_rect(mVisibleTextRect);
  43.129  		clip_rect.stretch(1);
  43.130  		LLLocalClipRect clip(clip_rect);
  43.131 -		drawPreeditMarker();
  43.132  	}
  43.133  
  43.134  	LLTextBase::draw();
  43.135  	drawLineNumbers();
  43.136  
  43.137 +    drawPreeditMarker();
  43.138 +
  43.139  	//RN: the decision was made to always show the orange border for keyboard focus but do not put an insertion caret
  43.140  	// when in readonly mode
  43.141  	mBorder->setKeyboardFocusHighlight( hasFocus() );// && !mReadOnly);
  43.142 @@ -2695,14 +2712,20 @@
  43.143  
  43.144  void LLTextEditor::resetPreedit()
  43.145  {
  43.146 +    if (hasSelection())
  43.147 +    {
  43.148 +		if (hasPreeditString())
  43.149 +        {
  43.150 +            llwarns << "Preedit and selection!" << llendl;
  43.151 +            deselect();
  43.152 +        }
  43.153 +        else
  43.154 +        {
  43.155 +            deleteSelection(TRUE);
  43.156 +        }
  43.157 +    }
  43.158  	if (hasPreeditString())
  43.159  	{
  43.160 -		if (hasSelection())
  43.161 -		{
  43.162 -			llwarns << "Preedit and selection!" << llendl;
  43.163 -			deselect();
  43.164 -		}
  43.165 -
  43.166  		setCursorPos(mPreeditPositions.front());
  43.167  		removeStringNoUndo(mCursorPos, mPreeditPositions.back() - mCursorPos);
  43.168  		insertStringNoUndo(mCursorPos, mPreeditOverwrittenWString);
  43.169 @@ -2750,7 +2773,10 @@
  43.170  	{
  43.171  		mPreeditOverwrittenWString.clear();
  43.172  	}
  43.173 -	insertStringNoUndo(insert_preedit_at, mPreeditWString);
  43.174 +    
  43.175 +	segment_vec_t segments;
  43.176 +	//pass empty segments to let "insertStringNoUndo" make new LLNormalTextSegment and insert it, if needed.
  43.177 +	insertStringNoUndo(insert_preedit_at, mPreeditWString, &segments); 
  43.178  
  43.179  	mPreeditStandouts = preedit_standouts;
  43.180  
    44.1 --- a/indra/llui/lltexteditor.h	Thu Jul 18 17:27:31 2013 -0400
    44.2 +++ b/indra/llui/lltexteditor.h	Mon Aug 26 17:53:30 2013 -0400
    44.3 @@ -248,13 +248,14 @@
    44.4  	// Undoable operations
    44.5  	void			addChar(llwchar c); // at mCursorPos
    44.6  	S32				addChar(S32 pos, llwchar wc);
    44.7 -	void			addLineBreakChar();
    44.8 +	void			addLineBreakChar(BOOL group_together = FALSE);
    44.9  	S32				overwriteChar(S32 pos, llwchar wc);
   44.10  	void			removeChar();
   44.11  	S32 			removeChar(S32 pos);
   44.12  	S32				insert(S32 pos, const LLWString &wstr, bool group_with_next_op, LLTextSegmentPtr segment);
   44.13  	S32				remove(S32 pos, S32 length, bool group_with_next_op);
   44.14  	
   44.15 +	void			focusLostHelper();
   44.16  	void			updateAllowingLanguageInput();
   44.17  	BOOL			hasPreeditString() const;
   44.18  
    45.1 --- a/indra/llui/lltoolbar.cpp	Thu Jul 18 17:27:31 2013 -0400
    45.2 +++ b/indra/llui/lltoolbar.cpp	Mon Aug 26 17:53:30 2013 -0400
    45.3 @@ -381,7 +381,7 @@
    45.4  	return (command_button != NULL);
    45.5  }
    45.6  
    45.7 -bool LLToolBar::flashCommand(const LLCommandId& commandId, bool flash)
    45.8 +bool LLToolBar::flashCommand(const LLCommandId& commandId, bool flash, bool force_flashing/* = false */)
    45.9  {
   45.10  	LLButton * command_button = NULL;
   45.11  
   45.12 @@ -391,7 +391,7 @@
   45.13  		if (it != mButtonMap.end())
   45.14  		{
   45.15  			command_button = it->second;
   45.16 -			command_button->setFlashing(flash ? TRUE : FALSE);
   45.17 +			command_button->setFlashing((BOOL)(flash),(BOOL)(force_flashing));
   45.18  		}
   45.19  	}
   45.20  
    46.1 --- a/indra/llui/lltoolbar.h	Thu Jul 18 17:27:31 2013 -0400
    46.2 +++ b/indra/llui/lltoolbar.h	Mon Aug 26 17:53:30 2013 -0400
    46.3 @@ -192,7 +192,7 @@
    46.4  	bool hasCommand(const LLCommandId& commandId) const;	// is this command bound to a button in this toolbar
    46.5  	bool enableCommand(const LLCommandId& commandId, bool enabled);	// enable/disable button bound to the specified command, if it exists in this toolbar
    46.6  	bool stopCommandInProgress(const LLCommandId& commandId);	// stop command if it is currently active
    46.7 -	bool flashCommand(const LLCommandId& commandId, bool flash); // flash button associated with given command, if in this toolbar
    46.8 +	bool flashCommand(const LLCommandId& commandId, bool flash, bool force_flashing = false); // flash button associated with given command, if in this toolbar
    46.9  
   46.10  	void setStartDragCallback(tool_startdrag_callback_t cb)   { mStartDragItemCallback  = cb; } // connects drag and drop behavior to external logic
   46.11  	void setHandleDragCallback(tool_handledrag_callback_t cb) { mHandleDragItemCallback = cb; }
    47.1 --- a/indra/llui/llurlaction.cpp	Thu Jul 18 17:27:31 2013 -0400
    47.2 +++ b/indra/llui/llurlaction.cpp	Mon Aug 26 17:53:30 2013 -0400
    47.3 @@ -170,6 +170,30 @@
    47.4  	return id_str;
    47.5  }
    47.6  
    47.7 +std::string LLUrlAction::getObjectId(std::string url)
    47.8 +{
    47.9 +	LLURI uri(url);
   47.10 +	LLSD path_array = uri.pathArray();
   47.11 +	std::string id_str;
   47.12 +	if (path_array.size() >= 3)
   47.13 +	{
   47.14 +		id_str = path_array.get(2).asString();
   47.15 +	}
   47.16 +	return id_str;
   47.17 +}
   47.18 +
   47.19 +std::string LLUrlAction::getObjectName(std::string url)
   47.20 +{
   47.21 +	LLURI uri(url);
   47.22 +	LLSD query_map = uri.queryMap();
   47.23 +	std::string name;
   47.24 +	if (query_map.has("name"))
   47.25 +	{
   47.26 +		name = query_map["name"].asString();
   47.27 +	}
   47.28 +	return name;
   47.29 +}
   47.30 +
   47.31  void LLUrlAction::sendIM(std::string url)
   47.32  {
   47.33  	std::string id_str = getUserID(url);
   47.34 @@ -188,3 +212,21 @@
   47.35  	}
   47.36  }
   47.37  
   47.38 +void LLUrlAction::removeFriend(std::string url)
   47.39 +{
   47.40 +	std::string id_str = getUserID(url);
   47.41 +	if (LLUUID::validate(id_str))
   47.42 +	{
   47.43 +		executeSLURL("secondlife:///app/agent/" + id_str + "/removefriend");
   47.44 +	}
   47.45 +}
   47.46 +
   47.47 +void LLUrlAction::blockObject(std::string url)
   47.48 +{
   47.49 +	std::string object_id = getObjectId(url);
   47.50 +	std::string object_name = getObjectName(url);
   47.51 +	if (LLUUID::validate(object_id))
   47.52 +	{
   47.53 +		executeSLURL("secondlife:///app/agent/" + object_id + "/block/" + object_name);
   47.54 +	}
   47.55 +}
    48.1 --- a/indra/llui/llurlaction.h	Thu Jul 18 17:27:31 2013 -0400
    48.2 +++ b/indra/llui/llurlaction.h	Mon Aug 26 17:53:30 2013 -0400
    48.3 @@ -77,8 +77,12 @@
    48.4  	/// if the Url specifies an SL command in the form like 'app/{cmd}/{id}/*', show its profile
    48.5  	static void showProfile(std::string url);
    48.6  	static std::string getUserID(std::string url);
    48.7 +	static std::string getObjectName(std::string url);
    48.8 +	static std::string getObjectId(std::string url);
    48.9  	static void sendIM(std::string url);
   48.10  	static void addFriend(std::string url);
   48.11 +	static void removeFriend(std::string url);
   48.12 +	static void blockObject(std::string url);
   48.13  
   48.14  	/// specify the callbacks to enable this class's functionality
   48.15  	typedef boost::function<void (const std::string&)> url_callback_t;
    49.1 --- a/indra/llui/llurlentry.cpp	Thu Jul 18 17:27:31 2013 -0400
    49.2 +++ b/indra/llui/llurlentry.cpp	Mon Aug 26 17:53:30 2013 -0400
    49.3 @@ -504,6 +504,10 @@
    49.4  	{
    49.5  		return LLTrans::getString("SLappAgentRequestFriend") + " " + full_name;
    49.6  	}
    49.7 +	if (LLStringUtil::endsWith(url, "/removefriend"))
    49.8 +	{
    49.9 +		return LLTrans::getString("SLappAgentRemoveFriend") + " " + full_name;
   49.10 +	}
   49.11  	return full_name;
   49.12  }
   49.13  
    50.1 --- a/indra/llvfs/lldir.h	Thu Jul 18 17:27:31 2013 -0400
    50.2 +++ b/indra/llvfs/lldir.h	Mon Aug 26 17:53:30 2013 -0400
    50.3 @@ -32,7 +32,7 @@
    50.4  #define MAX_PATH MAXPATHLEN
    50.5  #endif
    50.6  
    50.7 -// these numbers *may* get serialized (really??), so we need to be explicit
    50.8 +// these numbers are read from settings_files.xml, so we need to be explicit
    50.9  typedef enum ELLPath
   50.10  {
   50.11  	LL_PATH_NONE = 0,
    51.1 --- a/indra/llvfs/lldir_mac.cpp	Thu Jul 18 17:27:31 2013 -0400
    51.2 +++ b/indra/llvfs/lldir_mac.cpp	Mon Aug 26 17:53:30 2013 -0400
    51.3 @@ -134,7 +134,7 @@
    51.4  		
    51.5  		{
    51.6              mOSCacheDir = *cachedir;
    51.7 -            //SPATTERS TODO:  This changes from ~/Library/Cache/Secondlife to ~/Library/Cache/com.app.secondlife/Secondlife.  Last dir level could go away.
    51.8 +            //Aura TODO:  This changes from ~/Library/Cache/Secondlife to ~/Library/Cache/com.app.secondlife/Secondlife.  Last dir level could go away.
    51.9              CreateDirectory(mOSCacheDir, secondLifeString, NULL);
   51.10  		}
   51.11  		
    52.1 --- a/indra/llvfs/llvfs_objc.mm	Thu Jul 18 17:27:31 2013 -0400
    52.2 +++ b/indra/llvfs/llvfs_objc.mm	Mon Aug 26 17:53:30 2013 -0400
    52.3 @@ -58,7 +58,7 @@
    52.4      if ([paths count])
    52.5      {
    52.6          path = [paths objectAtIndex:0];
    52.7 -        //SPATTERS HACK:  Always attempt to create directory, ignore errors.
    52.8 +        //HACK:  Always attempt to create directory, ignore errors.
    52.9          NSError *error = nil;
   52.10  
   52.11          [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error];
    53.1 --- a/indra/llwindow/llwindowwin32.cpp	Thu Jul 18 17:27:31 2013 -0400
    53.2 +++ b/indra/llwindow/llwindowwin32.cpp	Mon Aug 26 17:53:30 2013 -0400
    53.3 @@ -159,9 +159,8 @@
    53.4  LLWinImm::LLWinImm() : mHImmDll(NULL)
    53.5  {
    53.6  	// Check system metrics 
    53.7 -	if ( !GetSystemMetrics( SM_DBCSENABLED ) )
    53.8 +	if ( !GetSystemMetrics( SM_IMMENABLED ) )
    53.9  		return;
   53.10 -	
   53.11  
   53.12  	mHImmDll = LoadLibraryA("Imm32");
   53.13  	if (mHImmDll != NULL)
   53.14 @@ -3500,19 +3499,11 @@
   53.15  
   53.16  void LLWindowWin32::interruptLanguageTextInput()
   53.17  {
   53.18 -	if (mPreeditor)
   53.19 +	if (mPreeditor && LLWinImm::isAvailable())
   53.20  	{
   53.21 -		if (LLWinImm::isAvailable())
   53.22 -		{
   53.23 -			HIMC himc = LLWinImm::getContext(mWindowHandle);
   53.24 -			LLWinImm::notifyIME(himc, NI_COMPOSITIONSTR, CPS_COMPLETE, 0);
   53.25 -			LLWinImm::releaseContext(mWindowHandle, himc);
   53.26 -		}
   53.27 -
   53.28 -		// Win32 document says there will be no composition string
   53.29 -		// after NI_COMPOSITIONSTR returns.  The following call to
   53.30 -		// resetPreedit should be a NOP unless IME goes mad...
   53.31 -		mPreeditor->resetPreedit();
   53.32 +		HIMC himc = LLWinImm::getContext(mWindowHandle);
   53.33 +		LLWinImm::notifyIME(himc, NI_COMPOSITIONSTR, CPS_COMPLETE, 0);
   53.34 +		LLWinImm::releaseContext(mWindowHandle, himc);
   53.35  	}
   53.36  }
   53.37  
    54.1 --- a/indra/llxml/llcontrol.cpp	Thu Jul 18 17:27:31 2013 -0400
    54.2 +++ b/indra/llxml/llcontrol.cpp	Mon Aug 26 17:53:30 2013 -0400
    54.3 @@ -132,14 +132,14 @@
    54.4  
    54.5  LLControlVariable::LLControlVariable(const std::string& name, eControlType type,
    54.6  							 LLSD initial, const std::string& comment,
    54.7 -							 bool persist, bool hidefromsettingseditor)
    54.8 +							 ePersist persist, bool hidefromsettingseditor)
    54.9  	: mName(name),
   54.10  	  mComment(comment),
   54.11  	  mType(type),
   54.12  	  mPersist(persist),
   54.13  	  mHideFromSettingsEditor(hidefromsettingseditor)
   54.14  {
   54.15 -	if (mPersist && mComment.empty())
   54.16 +	if ((persist != PERSIST_NO) && mComment.empty())
   54.17  	{
   54.18  		llerrs << "Must supply a comment for control " << mName << llendl;
   54.19  	}
   54.20 @@ -260,7 +260,7 @@
   54.21  	}
   54.22  }
   54.23  
   54.24 -void LLControlVariable::setPersist(bool state)
   54.25 +void LLControlVariable::setPersist(ePersist state)
   54.26  {
   54.27  	mPersist = state;
   54.28  }
   54.29 @@ -292,10 +292,29 @@
   54.30  	}
   54.31  }
   54.32  
   54.33 -bool LLControlVariable::isSaveValueDefault()
   54.34 -{ 
   54.35 -    return (mValues.size() ==  1) 
   54.36 -        || ((mValues.size() > 1) && llsd_compare(mValues[1], mValues[0]));
   54.37 +bool LLControlVariable::shouldSave(bool nondefault_only)
   54.38 +{
   54.39 +	// This method is used to decide whether we should save a given
   54.40 +	// variable. Two of the three values of mPersist are easy.
   54.41 +	if (mPersist == PERSIST_NO)
   54.42 +		return false;
   54.43 +
   54.44 +	if (mPersist == PERSIST_ALWAYS)
   54.45 +		return true;
   54.46 +
   54.47 +	// PERSIST_NONDFT
   54.48 +	// If caller doesn't need us to filter, just save.
   54.49 +	if (! nondefault_only)
   54.50 +		return true;
   54.51 +
   54.52 +	// PERSIST_NONDFT: caller only wants us to save this variable if its value
   54.53 +	// differs from default.
   54.54 +	if (isDefault())                // never been altered
   54.55 +		return false;
   54.56 +
   54.57 +	// We've set at least one other value: compare it to default. Save only if
   54.58 +	// they differ.
   54.59 +	return ! llsd_compare(getSaveValue(), getDefault());
   54.60  }
   54.61  
   54.62  LLSD LLControlVariable::getSaveValue() const
   54.63 @@ -355,12 +374,12 @@
   54.64  	return mTypeString[typeenum];
   54.65  }
   54.66  
   54.67 -BOOL LLControlGroup::declareControl(const std::string& name, eControlType type, const LLSD initial_val, const std::string& comment, BOOL persist, BOOL hidefromsettingseditor)
   54.68 +LLControlVariable* LLControlGroup::declareControl(const std::string& name, eControlType type, const LLSD initial_val, const std::string& comment, LLControlVariable::ePersist persist, BOOL hidefromsettingseditor)
   54.69  {
   54.70  	LLControlVariable* existing_control = getControl(name);
   54.71  	if (existing_control)
   54.72   	{
   54.73 -		if (persist && existing_control->isType(type))
   54.74 +		if ((persist != LLControlVariable::PERSIST_NO) && existing_control->isType(type))
   54.75  		{
   54.76  			if (!existing_control->llsd_compare(existing_control->getDefault(), initial_val))
   54.77  			{
   54.78 @@ -374,66 +393,66 @@
   54.79  		{
   54.80  			llwarns << "Control named " << name << " already exists, ignoring new declaration." << llendl;
   54.81  		}
   54.82 - 		return TRUE;
   54.83 + 		return existing_control;
   54.84  	}
   54.85  
   54.86  	// if not, create the control and add it to the name table
   54.87  	LLControlVariable* control = new LLControlVariable(name, type, initial_val, comment, persist, hidefromsettingseditor);
   54.88  	mNameTable[name] = control;	
   54.89 -	return TRUE;
   54.90 +	return control;
   54.91  }
   54.92  
   54.93 -BOOL LLControlGroup::declareU32(const std::string& name, const U32 initial_val, const std::string& comment, BOOL persist)
   54.94 +LLControlVariable* LLControlGroup::declareU32(const std::string& name, const U32 initial_val, const std::string& comment, LLControlVariable::ePersist persist)
   54.95  {
   54.96  	return declareControl(name, TYPE_U32, (LLSD::Integer) initial_val, comment, persist);
   54.97  }
   54.98  
   54.99 -BOOL LLControlGroup::declareS32(const std::string& name, const S32 initial_val, const std::string& comment, BOOL persist)
  54.100 +LLControlVariable* LLControlGroup::declareS32(const std::string& name, const S32 initial_val, const std::string& comment, LLControlVariable::ePersist persist)
  54.101  {
  54.102  	return declareControl(name, TYPE_S32, initial_val, comment, persist);
  54.103  }
  54.104  
  54.105 -BOOL LLControlGroup::declareF32(const std::string& name, const F32 initial_val, const std::string& comment, BOOL persist)
  54.106 +LLControlVariable* LLControlGroup::declareF32(const std::string& name, const F32 initial_val, const std::string& comment, LLControlVariable::ePersist persist)
  54.107  {
  54.108  	return declareControl(name, TYPE_F32, initial_val, comment, persist);
  54.109  }
  54.110  
  54.111 -BOOL LLControlGroup::declareBOOL(const std::string& name, const BOOL initial_val, const std::string& comment, BOOL persist)
  54.112 +LLControlVariable* LLControlGroup::declareBOOL(const std::string& name, const BOOL initial_val, const std::string& comment, LLControlVariable::ePersist persist)
  54.113  {
  54.114  	return declareControl(name, TYPE_BOOLEAN, initial_val, comment, persist);
  54.115  }
  54.116  
  54.117 -BOOL LLControlGroup::declareString(const std::string& name, const std::string& initial_val, const std::string& comment, BOOL persist)
  54.118 +LLControlVariable* LLControlGroup::declareString(const std::string& name, const std::string& initial_val, const std::string& comment, LLControlVariable::ePersist persist)
  54.119  {
  54.120  	return declareControl(name, TYPE_STRING, initial_val, comment, persist);
  54.121  }
  54.122  
  54.123 -BOOL LLControlGroup::declareVec3(const std::string& name, const LLVector3 &initial_val, const std::string& comment, BOOL persist)
  54.124 +LLControlVariable* LLControlGroup::declareVec3(const std::string& name, const LLVector3 &initial_val, const std::string& comment, LLControlVariable::ePersist persist)
  54.125  {
  54.126  	return declareControl(name, TYPE_VEC3, initial_val.getValue(), comment, persist);
  54.127  }
  54.128  
  54.129 -BOOL LLControlGroup::declareVec3d(const std::string& name, const LLVector3d &initial_val, const std::string& comment, BOOL persist)
  54.130 +LLControlVariable* LLControlGroup::declareVec3d(const std::string& name, const LLVector3d &initial_val, const std::string& comment, LLControlVariable::ePersist persist)
  54.131  {
  54.132  	return declareControl(name, TYPE_VEC3D, initial_val.getValue(), comment, persist);
  54.133  }
  54.134  
  54.135 -BOOL LLControlGroup::declareRect(const std::string& name, const LLRect &initial_val, const std::string& comment, BOOL persist)
  54.136 +LLControlVariable* LLControlGroup::declareRect(const std::string& name, const LLRect &initial_val, const std::string& comment, LLControlVariable::ePersist persist)
  54.137  {
  54.138  	return declareControl(name, TYPE_RECT, initial_val.getValue(), comment, persist);
  54.139  }
  54.140  
  54.141 -BOOL LLControlGroup::declareColor4(const std::string& name, const LLColor4 &initial_val, const std::string& comment, BOOL persist )
  54.142 +LLControlVariable* LLControlGroup::declareColor4(const std::string& name, const LLColor4 &initial_val, const std::string& comment, LLControlVariable::ePersist persist )
  54.143  {
  54.144  	return declareControl(name, TYPE_COL4, initial_val.getValue(), comment, persist);
  54.145  }
  54.146  
  54.147 -BOOL LLControlGroup::declareColor3(const std::string& name, const LLColor3 &initial_val, const std::string& comment, BOOL persist )
  54.148 +LLControlVariable* LLControlGroup::declareColor3(const std::string& name, const LLColor3 &initial_val, const std::string& comment, LLControlVariable::ePersist persist )
  54.149  {
  54.150  	return declareControl(name, TYPE_COL3, initial_val.getValue(), comment, persist);
  54.151  }
  54.152  
  54.153 -BOOL LLControlGroup::declareLLSD(const std::string& name, const LLSD &initial_val, const std::string& comment, BOOL persist )
  54.154 +LLControlVariable* LLControlGroup::declareLLSD(const std::string& name, const LLSD &initial_val, const std::string& comment, LLControlVariable::ePersist persist )
  54.155  {
  54.156  	return declareControl(name, TYPE_LLSD, initial_val, comment, persist);
  54.157  }
  54.158 @@ -664,11 +683,11 @@
  54.159  			switch(declare_as)
  54.160  			{
  54.161  			case TYPE_COL4:
  54.162 -				declareColor4(name, LLColor4::white, LLStringUtil::null, NO_PERSIST);
  54.163 +				declareColor4(name, LLColor4::white, LLStringUtil::null, LLControlVariable::PERSIST_NO);
  54.164  				break;
  54.165  			case TYPE_STRING:
  54.166  			default:
  54.167 -				declareString(name, LLStringUtil::null, LLStringUtil::null, NO_PERSIST);
  54.168 +				declareString(name, LLStringUtil::null, LLStringUtil::null, LLControlVariable::PERSIST_NO);
  54.169  				break;
  54.170  			}
  54.171  		}
  54.172 @@ -805,21 +824,12 @@
  54.173  		{
  54.174  			llwarns << "Tried to save invalid control: " << iter->first << llendl;
  54.175  		}
  54.176 -
  54.177 -		if( control && control->isPersisted() )
  54.178 +		else if( control->shouldSave(nondefault_only) )
  54.179  		{
  54.180 -			if (!(nondefault_only && (control->isSaveValueDefault())))
  54.181 -			{
  54.182 -				settings[iter->first]["Type"] = typeEnumToString(control->type());
  54.183 -				settings[iter->first]["Comment"] = control->getComment();
  54.184 -				settings[iter->first]["Value"] = control->getSaveValue();
  54.185 -				++num_saved;
  54.186 -			}
  54.187 -			else
  54.188 -			{
  54.189 -				// Debug spam
  54.190 -				// llinfos << "Skipping " << control->getName() << llendl;
  54.191 -			}
  54.192 +			settings[iter->first]["Type"] = typeEnumToString(control->type());
  54.193 +			settings[iter->first]["Comment"] = control->getComment();
  54.194 +			settings[iter->first]["Value"] = control->getSaveValue();
  54.195 +			++num_saved;
  54.196  		}
  54.197  	}
  54.198  	llofstream file;
  54.199 @@ -862,13 +872,14 @@
  54.200  	
  54.201  	for(LLSD::map_const_iterator itr = settings.beginMap(); itr != settings.endMap(); ++itr)
  54.202  	{
  54.203 -		bool persist = true;
  54.204 +		LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT;
  54.205  		std::string const & name = itr->first;
  54.206  		LLSD const & control_map = itr->second;
  54.207  		
  54.208  		if(control_map.has("Persist")) 
  54.209  		{
  54.210 -			persist = control_map["Persist"].asInteger();
  54.211 +			persist = control_map["Persist"].asInteger()?
  54.212 +					  LLControlVariable::PERSIST_NONDFT : LLControlVariable::PERSIST_NO;
  54.213  		}
  54.214  		
  54.215  		// Sometimes we want to use the settings system to provide cheap persistence, but we
  54.216 @@ -887,6 +898,8 @@
  54.217  		LLControlVariable* existing_control = getControl(name);
  54.218  		if(existing_control)
  54.219  		{
  54.220 +			// set_default_values is true when we're loading the initial,
  54.221 +			// immutable files from app_settings, e.g. settings.xml.
  54.222  			if(set_default_values)
  54.223  			{
  54.224  				// Override all previously set properties of this control.
  54.225 @@ -908,6 +921,9 @@
  54.226  			}
  54.227  			else if(existing_control->isPersisted())
  54.228  			{
  54.229 +				// save_values is specifically false for (e.g.)
  54.230 +				// SessionSettingsFile and UserSessionSettingsFile -- in other
  54.231 +				// words, for a file that's supposed to be transient.
  54.232  				existing_control->setValue(control_map["Value"], save_values);
  54.233  			}
  54.234  			// *NOTE: If not persisted and not setting defaults, 
  54.235 @@ -915,6 +931,39 @@
  54.236  		}
  54.237  		else
  54.238  		{
  54.239 +			// We've never seen this control before. Either we're loading up
  54.240 +			// the initial set of default settings files (set_default_values)
  54.241 +			// -- or we're loading user settings last saved by a viewer that
  54.242 +			// supports a superset of the variables we know.
  54.243 +			// CHOP-962: if we're loading an unrecognized user setting, make
  54.244 +			// sure we save it later. If you try an experimental viewer, tweak
  54.245 +			// a new setting, briefly revert to an old viewer, then return to
  54.246 +			// the new one, we don't want the old viewer to discard the
  54.247 +			// setting you changed.
  54.248 +			if (! set_default_values)
  54.249 +			{
  54.250 +				// Using PERSIST_ALWAYS insists that saveToFile() (which calls
  54.251 +				// LLControlVariable::shouldSave()) must save this control
  54.252 +				// variable regardless of its value. We can safely set this
  54.253 +				// LLControlVariable persistent because the 'persistent' flag
  54.254 +				// is not itself persisted!
  54.255 +				persist = LLControlVariable::PERSIST_ALWAYS;
  54.256 +				// We want to mention unrecognized user settings variables
  54.257 +				// (e.g. from a newer version of the viewer) in the log. But
  54.258 +				// we also arrive here for Boolean variables generated by
  54.259 +				// the notifications subsystem when the user checks "Don't
  54.260 +				// show me this again." These aren't declared in settings.xml;
  54.261 +				// they're actually named for the notification they suppress.
  54.262 +				// We don't want to mention those. Apologies, this is a bit of
  54.263 +				// a hack: we happen to know that user settings go into an
  54.264 +				// LLControlGroup whose name is "Global".
  54.265 +				if (getKey() == "Global")
  54.266 +				{
  54.267 +					LL_INFOS("LLControlGroup") << "preserving unrecognized " << getKey()
  54.268 +											   << " settings variable " << name << LL_ENDL;
  54.269 +				}
  54.270 +			}
  54.271 +
  54.272  			declareControl(name, 
  54.273  						   typeStringToEnum(control_map["Type"].asString()), 
  54.274  						   control_map["Value"], 
  54.275 @@ -923,7 +972,7 @@
  54.276  						   hidefromsettingseditor
  54.277  						   );
  54.278  		}
  54.279 -		
  54.280 +
  54.281  		++validitems;
  54.282  	}
  54.283  
    55.1 --- a/indra/llxml/llcontrol.h	Thu Jul 18 17:27:31 2013 -0400
    55.2 +++ b/indra/llxml/llcontrol.h	Mon Aug 26 17:53:30 2013 -0400
    55.3 @@ -72,8 +72,6 @@
    55.4  class LLColor4;
    55.5  class LLColor3;
    55.6  
    55.7 -const BOOL NO_PERSIST = FALSE;
    55.8 -
    55.9  typedef enum e_control_type
   55.10  {
   55.11  	TYPE_U32 = 0,
   55.12 @@ -100,21 +98,28 @@
   55.13  	typedef boost::signals2::signal<bool(LLControlVariable* control, const LLSD&), boost_boolean_combiner> validate_signal_t;
   55.14  	typedef boost::signals2::signal<void(LLControlVariable* control, const LLSD&, const LLSD&)> commit_signal_t;
   55.15  
   55.16 +	enum ePersist
   55.17 +	{
   55.18 +		PERSIST_NO,                 // don't save this var
   55.19 +		PERSIST_NONDFT,             // save this var if differs from default
   55.20 +		PERSIST_ALWAYS              // save this var even if has default value
   55.21 +	};
   55.22 +
   55.23  private:
   55.24  	std::string		mName;
   55.25  	std::string		mComment;
   55.26  	eControlType	mType;
   55.27 -	bool			mPersist;
   55.28 +	ePersist		mPersist;
   55.29  	bool			mHideFromSettingsEditor;
   55.30  	std::vector<LLSD> mValues;
   55.31 -	
   55.32 +
   55.33  	commit_signal_t mCommitSignal;
   55.34  	validate_signal_t mValidateSignal;
   55.35  	
   55.36  public:
   55.37  	LLControlVariable(const std::string& name, eControlType type,
   55.38  					  LLSD initial, const std::string& comment,
   55.39 -					  bool persist = true, bool hidefromsettingseditor = false);
   55.40 +					  ePersist persist = PERSIST_NONDFT, bool hidefromsettingseditor = false);
   55.41  
   55.42  	virtual ~LLControlVariable();
   55.43  	
   55.44 @@ -131,8 +136,8 @@
   55.45  	validate_signal_t* getValidateSignal() { return &mValidateSignal; }
   55.46  
   55.47  	bool isDefault() { return (mValues.size() == 1); }
   55.48 -	bool isSaveValueDefault();
   55.49 -	bool isPersisted() { return mPersist; }
   55.50 +	bool shouldSave(bool nondefault_only);
   55.51 +	bool isPersisted() { return mPersist != PERSIST_NO; }
   55.52  	bool isHiddenFromSettingsEditor() { return mHideFromSettingsEditor; }
   55.53  	LLSD get()			const	{ return getValue(); }
   55.54  	LLSD getValue()		const	{ return mValues.back(); }
   55.55 @@ -142,7 +147,7 @@
   55.56  	void set(const LLSD& val)	{ setValue(val); }
   55.57  	void setValue(const LLSD& value, bool saved_value = TRUE);
   55.58  	void setDefaultValue(const LLSD& value);
   55.59 -	void setPersist(bool state);
   55.60 +	void setPersist(ePersist);
   55.61  	void setHiddenFromSettingsEditor(bool hide);
   55.62  	void setComment(const std::string& comment);
   55.63  
   55.64 @@ -207,19 +212,19 @@
   55.65  		virtual void apply(const std::string& name, LLControlVariable* control) = 0;
   55.66  	};
   55.67  	void applyToAll(ApplyFunctor* func);
   55.68 -	
   55.69 -	BOOL declareControl(const std::string& name, eControlType type, const LLSD initial_val, const std::string& comment, BOOL persist, BOOL hidefromsettingseditor = FALSE);
   55.70 -	BOOL declareU32(const std::string& name, U32 initial_val, const std::string& comment, BOOL persist = TRUE);
   55.71 -	BOOL declareS32(const std::string& name, S32 initial_val, const std::string& comment, BOOL persist = TRUE);
   55.72 -	BOOL declareF32(const std::string& name, F32 initial_val, const std::string& comment, BOOL persist = TRUE);
   55.73 -	BOOL declareBOOL(const std::string& name, BOOL initial_val, const std::string& comment, BOOL persist = TRUE);
   55.74 -	BOOL declareString(const std::string& name, const std::string &initial_val, const std::string& comment, BOOL persist = TRUE);
   55.75 -	BOOL declareVec3(const std::string& name, const LLVector3 &initial_val,const std::string& comment,  BOOL persist = TRUE);
   55.76 -	BOOL declareVec3d(const std::string& name, const LLVector3d &initial_val, const std::string& comment, BOOL persist = TRUE);
   55.77 -	BOOL declareRect(const std::string& name, const LLRect &initial_val, const std::string& comment, BOOL persist = TRUE);
   55.78 -	BOOL declareColor4(const std::string& name, const LLColor4 &initial_val, const std::string& comment, BOOL persist = TRUE);
   55.79 -	BOOL declareColor3(const std::string& name, const LLColor3 &initial_val, const std::string& comment, BOOL persist = TRUE);
   55.80 -	BOOL declareLLSD(const std::string& name, const LLSD &initial_val, const std::string& comment, BOOL persist = TRUE);
   55.81 +
   55.82 +	LLControlVariable* declareControl(const std::string& name, eControlType type, const LLSD initial_val, const std::string& comment, LLControlVariable::ePersist persist, BOOL hidefromsettingseditor = FALSE);
   55.83 +	LLControlVariable* declareU32(const std::string& name, U32 initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);
   55.84 +	LLControlVariable* declareS32(const std::string& name, S32 initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);
   55.85 +	LLControlVariable* declareF32(const std::string& name, F32 initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);
   55.86 +	LLControlVariable* declareBOOL(const std::string& name, BOOL initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);
   55.87 +	LLControlVariable* declareString(const std::string& name, const std::string &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);
   55.88 +	LLControlVariable* declareVec3(const std::string& name, const LLVector3 &initial_val,const std::string& comment,  LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);
   55.89 +	LLControlVariable* declareVec3d(const std::string& name, const LLVector3d &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);
   55.90 +	LLControlVariable* declareRect(const std::string& name, const LLRect &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);
   55.91 +	LLControlVariable* declareColor4(const std::string& name, const LLColor4 &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);
   55.92 +	LLControlVariable* declareColor3(const std::string& name, const LLColor3 &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);
   55.93 +	LLControlVariable* declareLLSD(const std::string& name, const LLSD &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT);
   55.94  
   55.95  	std::string getString(const std::string& name);
   55.96  	std::string getText(const std::string& name);
   55.97 @@ -368,7 +373,7 @@
   55.98  		init_value = convert_to_llsd(default_value);
   55.99  		if(type < TYPE_COUNT)
  55.100  		{
  55.101 -			group.declareControl(name, type, init_value, comment, FALSE);
  55.102 +			group.declareControl(name, type, init_value, comment, LLControlVariable::PERSIST_NO);
  55.103  			return true;
  55.104  		}
  55.105  		return false;
    56.1 --- a/indra/llxml/tests/llcontrol_test.cpp	Thu Jul 18 17:27:31 2013 -0400
    56.2 +++ b/indra/llxml/tests/llcontrol_test.cpp	Mon Aug 26 17:53:30 2013 -0400
    56.3 @@ -128,7 +128,11 @@
    56.4  	template<> template<>
    56.5  	void control_group_t::test<3>()
    56.6  	{
    56.7 -		int results = mCG->loadFromFile(mTestConfigFile.c_str());
    56.8 +		// Pass default_values = true. This tells loadFromFile() we're loading
    56.9 +		// a default settings file that declares variables, rather than a user
   56.10 +		// settings file. When loadFromFile() encounters an unrecognized user
   56.11 +		// settings variable, it forcibly preserves it (CHOP-962).
   56.12 +		int results = mCG->loadFromFile(mTestConfigFile.c_str(), true);
   56.13  		LLControlVariable* control = mCG->getControl("TestSetting");
   56.14  		LLSD new_value = 13;
   56.15  		control->setValue(new_value, FALSE);
    57.1 --- a/indra/lscript/lscript_compile/indra.l	Thu Jul 18 17:27:31 2013 -0400
    57.2 +++ b/indra/lscript/lscript_compile/indra.l	Mon Aug 26 17:53:30 2013 -0400
    57.3 @@ -336,6 +336,8 @@
    57.4  "ATTACH_HUD_BOTTOM_LEFT" { count(); yylval.ival = 36; return(INTEGER_CONSTANT); }
    57.5  "ATTACH_HUD_BOTTOM"		{ count(); yylval.ival = 37; return(INTEGER_CONSTANT); }
    57.6  "ATTACH_HUD_BOTTOM_RIGHT"	{ count(); yylval.ival = 38; return(INTEGER_CONSTANT); }
    57.7 +"ATTACH_NECK"   { count(); yylval.ival = 39; return(INTEGER_CONSTANT); }
    57.8 +"ATTACH_AVATAR_CENTER"   { count(); yylval.ival = 40; return(INTEGER_CONSTANT); }
    57.9  
   57.10  "LAND_LEVEL"		{ count(); yylval.ival = E_LANDBRUSH_LEVEL; return(INTEGER_CONSTANT); }
   57.11  "LAND_RAISE"		{ count(); yylval.ival = E_LANDBRUSH_RAISE; return(INTEGER_CONSTANT); }
    58.1 --- a/indra/newview/CMakeLists.txt	Thu Jul 18 17:27:31 2013 -0400
    58.2 +++ b/indra/newview/CMakeLists.txt	Mon Aug 26 17:53:30 2013 -0400
    58.3 @@ -229,6 +229,7 @@
    58.4      llfloaterfonttest.cpp
    58.5      llfloatergesture.cpp
    58.6      llfloatergodtools.cpp
    58.7 +    llfloatergotoline.cpp
    58.8      llfloatergroupinvite.cpp
    58.9      llfloatergroups.cpp
   58.10      llfloaterhandler.cpp
   58.11 @@ -812,6 +813,7 @@
   58.12      llfloaterfonttest.h
   58.13      llfloatergesture.h
   58.14      llfloatergodtools.h
   58.15 +    llfloatergotoline.h
   58.16      llfloatergroupinvite.h
   58.17      llfloatergroups.h
   58.18      llfloaterhandler.h
   58.19 @@ -1670,6 +1672,7 @@
   58.20        ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/zlib1.dll
   58.21        ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxplatform.dll
   58.22        ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxoal.dll
   58.23 +      ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ca-bundle.crt
   58.24        ${GOOGLE_PERF_TOOLS_SOURCE}
   58.25        ${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt
   58.26        ${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt
    59.1 --- a/indra/newview/VIEWER_VERSION.txt	Thu Jul 18 17:27:31 2013 -0400
    59.2 +++ b/indra/newview/VIEWER_VERSION.txt	Mon Aug 26 17:53:30 2013 -0400
    59.3 @@ -1,1 +1,1 @@
    59.4 -3.6.2
    59.5 +3.6.5
    60.1 --- a/indra/newview/app_settings/cmd_line.xml	Thu Jul 18 17:27:31 2013 -0400
    60.2 +++ b/indra/newview/app_settings/cmd_line.xml	Mon Aug 26 17:53:30 2013 -0400
    60.3 @@ -22,7 +22,8 @@
    60.4      <map>
    60.5        <key>count</key>
    60.6        <integer>1</integer>
    60.7 -      <!-- Special case. Not mapped to a setting. -->
    60.8 +      <key>map-to</key>
    60.9 +      <string>CmdLineChannel</string>
   60.10      </map>
   60.11  
   60.12      <key>console</key>
   60.13 @@ -96,6 +97,8 @@
   60.14  0 - low, 1 - medium, 2 - high, 3 - ultra</string>
   60.15        <key>count</key>
   60.16        <integer>1</integer>
   60.17 +      <key>map-to</key>
   60.18 +      <string>RenderQualityPerformance</string>
   60.19      </map>
   60.20  
   60.21      <key>grid</key>
   60.22 @@ -108,6 +111,16 @@
   60.23        <string>CmdLineGridChoice</string>
   60.24      </map>
   60.25  
   60.26 +    <key>update-service</key>
   60.27 +    <map>
   60.28 +      <key>desc</key>
   60.29 +      <string>Override the url base for the update query.</string>
   60.30 +      <key>count</key>
   60.31 +      <integer>1</integer>
   60.32 +      <key>map-to</key>
   60.33 +      <string>CmdLineUpdateService</string>
   60.34 +    </map>
   60.35 +
   60.36      <key>help</key>
   60.37      <map>
   60.38        <key>desc</key>
   60.39 @@ -370,7 +383,8 @@
   60.40        <boolean>true</boolean>
   60.41        <key>last_option</key>
   60.42        <boolean>true</boolean>
   60.43 -      <!-- Special case. Not mapped to a setting. -->
   60.44 +      <key>map-to</key>
   60.45 +      <string>CmdLineLoginLocation</string>
   60.46      </map>
   60.47  
   60.48      <key>url</key>
   60.49 @@ -381,7 +395,8 @@
   60.50        <integer>1</integer>
   60.51        <key>last_option</key>
   60.52        <boolean>true</boolean>
   60.53 -      <!-- Special case. Not mapped to a setting. -->
   60.54 +      <key>map-to</key>
   60.55 +      <string>CmdLineLoginLocation</string>
   60.56      </map>
   60.57  
   60.58      <key>usersessionsettings</key>
    61.1 --- a/indra/newview/app_settings/keywords.ini	Thu Jul 18 17:27:31 2013 -0400
    61.2 +++ b/indra/newview/app_settings/keywords.ini	Mon Aug 26 17:53:30 2013 -0400
    61.3 @@ -274,7 +274,8 @@
    61.4  ATTACH_BELLY		Passed to llAttachToAvatar to attach task to belly
    61.5  ATTACH_LEFT_PEC		Passed to llAttachToAvatar to attach task to left pectoral
    61.6  ATTACH_RIGHT_PEC	Passed to llAttachToAvatar to attach task to right pectoral
    61.7 -
    61.8 +ATTACH_NECK			Passed to llAttachToAvatar to attach task to neck
    61.9 +ATTACH_AVATAR_CENTER	Passed to llAttachToAvatar to attach task to avatar center
   61.10  LAND_LEVEL			Passed to llModifyLand to level terrain
   61.11  LAND_RAISE			Passed to llModifyLand to raise terrain
   61.12  LAND_LOWER			Passed to llModifyLand to lower terrain
    62.1 --- a/indra/newview/app_settings/settings.xml	Thu Jul 18 17:27:31 2013 -0400
    62.2 +++ b/indra/newview/app_settings/settings.xml	Mon Aug 26 17:53:30 2013 -0400
    62.3 @@ -126,6 +126,17 @@
    62.4        <key>Value</key>
    62.5        <integer>1</integer>
    62.6      </map>
    62.7 +    <key>AnalyzePerformance</key>
    62.8 +    <map>
    62.9 +      <key>Comment</key>
   62.10 +      <string>Request performance analysis for a particular viewer run</string>
   62.11 +      <key>Persist</key>
   62.12 +      <integer>0</integer>
   62.13 +      <key>Type</key>
   62.14 +      <string>Boolean</string>
   62.15 +      <key>Value</key>
   62.16 +      <integer>0</integer>
   62.17 +    </map>
   62.18      <key>AnimateTextures</key>
   62.19      <map>
   62.20        <key>Comment</key>
   62.21 @@ -1738,6 +1749,17 @@
   62.22        <key>Value</key>
   62.23        <integer>0</integer>
   62.24      </map>
   62.25 +    <key>CmdLineChannel</key>
   62.26 +    <map>
   62.27 +      <key>Comment</key>
   62.28 +      <string>Command line specified channel name</string>
   62.29 +      <key>Persist</key>
   62.30 +      <integer>0</integer>
   62.31 +      <key>Type</key>
   62.32 +      <string>String</string>
   62.33 +      <key>Value</key>
   62.34 +      <string />
   62.35 +    </map>
   62.36      <key>CmdLineDisableVoice</key>
   62.37      <map>
   62.38        <key>Comment</key>
   62.39 @@ -1760,6 +1782,17 @@
   62.40        <key>Value</key>
   62.41        <string />
   62.42      </map>
   62.43 +    <key>CmdLineUpdateService</key>
   62.44 +    <map>
   62.45 +      <key>Comment</key>
   62.46 +      <string>Override the url base for the update query.</string>
   62.47 +      <key>Persist</key>
   62.48 +      <integer>0</integer>
   62.49 +      <key>Type</key>
   62.50 +      <string>String</string>
   62.51 +      <key>Value</key>
   62.52 +      <string />
   62.53 +    </map>
   62.54      <key>CmdLineHelperURI</key>
   62.55      <map>
   62.56        <key>Comment</key>
   62.57 @@ -1784,6 +1817,17 @@
   62.58          <string />
   62.59        </array>
   62.60      </map>
   62.61 +    <key>CmdLineLoginLocation</key>
   62.62 +    <map>
   62.63 +      <key>Comment</key>
   62.64 +      <string>Startup destination requested on command line</string>
   62.65 +      <key>Persist</key>
   62.66 +      <integer>0</integer>
   62.67 +      <key>Type</key>
   62.68 +      <string>String</string>
   62.69 +      <key>Value</key>
   62.70 +      <string/>
   62.71 +    </map>
   62.72      <key>ConnectAsGod</key>
   62.73      <map>
   62.74        <key>Comment</key>
   62.75 @@ -1916,6 +1960,17 @@
   62.76        <key>Value</key>
   62.77        <integer>262144</integer>
   62.78      </map>
   62.79 +    <key>CrashOnStartup</key>
   62.80 +    <map>
   62.81 +      <key>Comment</key>
   62.82 +      <string>User-requested crash on viewer startup</string>
   62.83 +      <key>Persist</key>
   62.84 +      <integer>0</integer>
   62.85 +      <key>Type</key>
   62.86 +      <string>Boolean</string>
   62.87 +      <key>Value</key>
   62.88 +      <integer>0</integer>
   62.89 +    </map>
   62.90      <key>CreateToolCopyCenters</key>
   62.91      <map>
   62.92        <key>Comment</key>
   62.93 @@ -2158,6 +2213,17 @@
   62.94        <key>Value</key>
   62.95        <integer>0</integer>
   62.96      </map>
   62.97 +    <key>DebugSession</key>
   62.98 +    <map>
   62.99 +      <key>Comment</key>
  62.100 +      <string>Request debugging for a particular viewer session</string>
  62.101 +      <key>Persist</key>
  62.102 +      <integer>0</integer>
  62.103 +      <key>Type</key>
  62.104 +      <string>Boolean</string>
  62.105 +      <key>Value</key>
  62.106 +      <integer>0</integer>
  62.107 +    </map>
  62.108      <key>DebugShowColor</key>
  62.109      <map>
  62.110        <key>Comment</key>
  62.111 @@ -2972,6 +3038,17 @@
  62.112        <key>Value</key>
  62.113        <integer>0</integer>
  62.114      </map>
  62.115 +    <key>DisableCrashLogger</key>
  62.116 +    <map>
  62.117 +      <key>Comment</key>
  62.118 +      <string>Do not send crash report to Linden server</string>
  62.119 +      <key>Persist</key>
  62.120 +      <integer>0</integer>
  62.121 +      <key>Type</key>
  62.122 +      <string>Boolean</string>
  62.123 +      <key>Value</key>
  62.124 +      <integer>0</integer>
  62.125 +    </map>
  62.126      <key>DisableMouseWarp</key>
  62.127      <map>
  62.128        <key>Comment</key>
  62.129 @@ -3489,16 +3566,27 @@
  62.130          <key>Value</key>
  62.131              <real>10.0</real>
  62.132          </map>
  62.133 -    <key>FilterItemsPerFrame</key>
  62.134 -    <map>
  62.135 -      <key>Comment</key>
  62.136 -      <string>Maximum number of inventory items to match against search filter every frame (lower to increase framerate while searching, higher to improve search speed)</string>
  62.137 -      <key>Persist</key>
  62.138 -      <integer>1</integer>
  62.139 -      <key>Type</key>
  62.140 -      <string>S32</string>
  62.141 -      <key>Value</key>
  62.142 -      <integer>500</integer>
  62.143 +    <key>FilterItemsMaxTimePerFrameVisible</key>
  62.144 +    <map>
  62.145 +        <key>Comment</key>
  62.146 +        <string>Max time devoted to items filtering per frame for visible inventory listings (in milliseconds)</string>
  62.147 +        <key>Persist</key>
  62.148 +        <integer>1</integer>
  62.149 +        <key>Type</key>
  62.150 +        <string>S32</string>
  62.151 +        <key>Value</key>
  62.152 +        <integer>10</integer>
  62.153 +    </map>
  62.154 +    <key>FilterItemsMaxTimePerFrameUnvisible</key>
  62.155 +    <map>
  62.156 +        <key>Comment</key>
  62.157 +        <string>Max time devoted to items filtering per frame for non visible inventory listings (in milliseconds)</string>
  62.158 +        <key>Persist</key>
  62.159 +        <integer>1</integer>
  62.160 +        <key>Type</key>
  62.161 +        <string>S32</string>
  62.162 +        <key>Value</key>
  62.163 +        <integer>1</integer>
  62.164      </map>
  62.165      <key>FindLandArea</key>
  62.166      <map>
  62.167 @@ -5217,6 +5305,28 @@
  62.168        <key>Value</key>
  62.169        <integer>0</integer>
  62.170      </map>
  62.171 +    <key>LogMetrics</key>
  62.172 +    <map>
  62.173 +      <key>Comment</key>
  62.174 +      <string>Log viewer metrics</string>
  62.175 +      <key>Persist</key>
  62.176 +      <integer>0</integer>
  62.177 +      <key>Type</key>
  62.178 +      <string>String</string>
  62.179 +      <key>Value</key>
  62.180 +      <string/>
  62.181 +    </map>
  62.182 +    <key>LogPerformance</key>
  62.183 +    <map>
  62.184 +      <key>Comment</key>
  62.185 +      <string>Log performance analysis for a particular viewer run</string>
  62.186 +      <key>Persist</key>
  62.187 +      <integer>0</integer>
  62.188 +      <key>Type</key>
  62.189 +      <string>Boolean</string>
  62.190 +      <key>Value</key>
  62.191 +      <integer>0</integer>
  62.192 +    </map>
  62.193      <key>LogTextureNetworkTraffic</key>
  62.194      <map>
  62.195        <key>Comment</key>
  62.196 @@ -6394,6 +6504,17 @@
  62.197        <key>Value</key>
  62.198        <integer>0</integer>
  62.199      </map>
  62.200 +    <key>NoQuickTime</key>
  62.201 +    <map>
  62.202 +      <key>Comment</key>
  62.203 +      <string>Disable QuickTime for a particular viewer run</string>
  62.204 +      <key>Persist</key>
  62.205 +      <integer>0</integer>
  62.206 +      <key>Type</key>
  62.207 +      <string>Boolean</string>
  62.208 +      <key>Value</key>
  62.209 +      <integer>0</integer>
  62.210 +    </map>
  62.211      <key>NoVerifySSLCert</key>
  62.212      <map>
  62.213        <key>Comment</key>
  62.214 @@ -6430,7 +6551,10 @@
  62.215      <key>NotificationConferenceIMOptions</key>
  62.216      <map>
  62.217        <key>Comment</key>
  62.218 -      <string>Specifies how the UI responds to Conference IM Notifications.</string>
  62.219 +      <string>
  62.220 +        Specifies how the UI responds to Conference IM Notifications.
  62.221 +        Allowed values: [openconversations,toast,flash,noaction]
  62.222 +      </string>
  62.223        <key>Persist</key>
  62.224        <integer>1</integer>
  62.225        <key>Type</key>
  62.226 @@ -6441,7 +6565,10 @@
  62.227      <key>NotificationFriendIMOptions</key>
  62.228      <map>
  62.229        <key>Comment</key>
  62.230 -      <string>Specifies how the UI responds to Friend IM Notifications.</string>
  62.231 +      <string>
  62.232 +        Specifies how the UI responds to Friend IM Notifications.
  62.233 +        Allowed values: [openconversations,toast,flash,noaction]
  62.234 +      </string>
  62.235        <key>Persist</key>
  62.236        <integer>1</integer>
  62.237        <key>Type</key>
  62.238 @@ -6452,7 +6579,10 @@
  62.239      <key>NotificationGroupChatOptions</key>
  62.240      <map>
  62.241        <key>Comment</key>
  62.242 -      <string>Specifies how the UI responds to Group Chat Notifications.</string>
  62.243 +      <string>
  62.244 +        Specifies how the UI responds to Group Chat Notifications.
  62.245 +        Allowed values: [openconversations,toast,flash,noaction]
  62.246 +      </string>
  62.247        <key>Persist</key>
  62.248        <integer>1</integer>
  62.249        <key>Type</key>
  62.250 @@ -6463,7 +6593,10 @@
  62.251      <key>NotificationNearbyChatOptions</key>
  62.252      <map>
  62.253        <key>Comment</key>
  62.254 -      <string>Specifies how the UI responds to Nearby Chat Notifications.</string>
  62.255 +      <string>
  62.256 +        Specifies how the UI responds to Nearby Chat Notifications.
  62.257 +        Allowed values: [openconversations,toast,flash,noaction]
  62.258 +      </string>
  62.259        <key>Persist</key>
  62.260        <integer>1</integer>
  62.261        <key>Type</key>
  62.262 @@ -6474,7 +6607,24 @@
  62.263      <key>NotificationNonFriendIMOptions</key>
  62.264      <map>
  62.265        <key>Comment</key>
  62.266 -      <string>Specifies how the UI responds to Non Friend IM Notifications.</string>
  62.267 +      <string>
  62.268 +        Specifies how the UI responds to Non Friend IM Notifications.
  62.269 +        Allowed values: [openconversations,toast,flash,noaction]
  62.270 +      </string>
  62.271 +      <key>Persist</key>
  62.272 +      <integer>1</integer>
  62.273 +      <key>Type</key>
  62.274 +      <string>String</string>
  62.275 +      <key>Value</key>
  62.276 +      <string>toast</string>
  62.277 +    </map>  
  62.278 +    <key>NotificationObjectIMOptions</key>
  62.279 +    <map>
  62.280 +      <key>Comment</key>
  62.281 +      <string>
  62.282 +        Specifies how the UI responds to Object IM Notifications.
  62.283 +        Allowed values: [openconversations,toast,flash,noaction]
  62.284 +      </string>
  62.285        <key>Persist</key>
  62.286        <integer>1</integer>
  62.287        <key>Type</key>
  62.288 @@ -6987,6 +7137,17 @@
  62.289        <key>Value</key>
  62.290        <real>90.0</real>
  62.291      </map>
  62.292 +    <key>PlayChatAnim</key>
  62.293 +    <map>
  62.294 +      <key>Comment</key>
  62.295 +      <string>Your avatar plays the chat animation whenever you say, shout or whisper something in nearby chat</string>
  62.296 +      <key>Persist</key>
  62.297 +      <integer>1</integer>
  62.298 +      <key>Type</key>
  62.299 +      <string>Boolean</string>
  62.300 +      <key>Value</key>
  62.301 +      <integer>1</integer>
  62.302 +    </map>
  62.303      <key>PlayTypingAnim</key>
  62.304      <map>
  62.305        <key>Comment</key>
  62.306 @@ -7020,6 +7181,72 @@
  62.307        <key>Value</key>
  62.308        <integer>0</integer>
  62.309      </map>  
  62.310 +    <key>PlaySoundFriendIM</key>
  62.311 +    <map>
  62.312 +      <key>Comment</key>
  62.313 +      <string>Plays a sound when friend's IM received.</string>
  62.314 +      <key>Persist</key>
  62.315 +      <integer>1</integer>
  62.316 +      <key>Type</key>
  62.317 +      <string>Boolean</string>
  62.318 +      <key>Value</key>
  62.319 +      <integer>0</integer>
  62.320 +    </map>
  62.321 +    <key>PlaySoundNonFriendIM</key>
  62.322 +    <map>
  62.323 +      <key>Comment</key>
  62.324 +      <string>Plays a sound when non-friend's IM received.</string>
  62.325 +      <key>Persist</key>
  62.326 +      <integer>1</integer>
  62.327 +      <key>Type</key>
  62.328 +      <string>Boolean</string>
  62.329 +      <key>Value</key>
  62.330 +      <integer>0</integer>
  62.331 +    </map>
  62.332 +    <key>PlaySoundConferenceIM</key>
  62.333 +    <map>
  62.334 +      <key>Comment</key>
  62.335 +      <string>Plays a sound when conference IM received.</string>
  62.336 +      <key>Persist</key>
  62.337 +      <integer>1</integer>
  62.338 +      <key>Type</key>
  62.339 +      <string>Boolean</string>
  62.340 +      <key>Value</key>
  62.341 +      <integer>0</integer>
  62.342 +    </map>
  62.343 +    <key>PlaySoundGroupChatIM</key>
  62.344 +    <map>
  62.345 +      <key>Comment</key>
  62.346 +      <string>Plays a sound when group chat IM received.</string>
  62.347 +      <key>Persist</key>
  62.348 +      <integer>1</integer>
  62.349 +      <key>Type</key>
  62.350 +      <string>Boolean</string>
  62.351 +      <key>Value</key>
  62.352 +      <integer>0</integer>
  62.353 +    </map>
  62.354 +    <key>PlaySoundNearbyChatIM</key>
  62.355 +    <map>
  62.356 +      <key>Comment</key>
  62.357 +      <string>Plays a sound when nearby chat IM received.</string>
  62.358 +      <key>Persist</key>
  62.359 +      <integer>1</integer>
  62.360 +      <key>Type</key>
  62.361 +      <string>Boolean</string>
  62.362 +      <key>Value</key>
  62.363 +      <integer>0</integer>
  62.364 +    </map>
  62.365 +    <key>PlaySoundObjectIM</key>
  62.366 +    <map>
  62.367 +      <key>Comment</key>
  62.368 +      <string>Plays a sound when IM fom an object received.</string>
  62.369 +      <key>Persist</key>
  62.370 +      <integer>1</integer>
  62.371 +      <key>Type</key>
  62.372 +      <string>Boolean</string>
  62.373 +      <key>Value</key>
  62.374 +      <integer>0</integer>
  62.375 +    </map>
  62.376      <key>PlaySoundNewConversation</key>
  62.377      <map>
  62.378        <key>Comment</key>
  62.379 @@ -8446,6 +8673,18 @@
  62.380      <integer>0</integer>
  62.381    </map>
  62.382  
  62.383 +  <key>RenderDepthOfFieldInEditMode</key>
  62.384 +  <map>
  62.385 +    <key>Comment</key>
  62.386 +    <string>Whether to use depth of field effect when in edit mode</string>
  62.387 +    <key>Persist</key>
  62.388 +    <integer>1</integer>
  62.389 +    <key>Type</key>
  62.390 +    <string>Boolean</string>
  62.391 +    <key>Value</key>
  62.392 +    <integer>0</integer>
  62.393 +  </map>
  62.394 +
  62.395    <key>CameraDoFResScale</key>
  62.396    <map>
  62.397      <key>Comment</key>
  62.398 @@ -9642,6 +9881,17 @@
  62.399        <key>Value</key>
  62.400        <integer>1</integer>
  62.401      </map>
  62.402 +    <key>ReplaySession</key>
  62.403 +    <map>
  62.404 +      <key>Comment</key>
  62.405 +      <string>Request replay of previously-recorded pilot file</string>
  62.406 +      <key>Persist</key>
  62.407 +      <integer>0</integer>
  62.408 +      <key>Type</key>
  62.409 +      <string>Boolean</string>
  62.410 +      <key>Value</key>
  62.411 +      <integer>0</integer>
  62.412 +    </map>
  62.413      <key>RotateRight</key>
  62.414      <map>
  62.415        <key>Comment</key>
  62.416 @@ -12858,12 +13108,13 @@
  62.417      <key>UserLoginInfo</key>
  62.418      <map>
  62.419        <key>Comment</key>
  62.420 -      <string>Users loging data.</string>
  62.421 +      <string>User login data.</string>
  62.422        <key>Persist</key>
  62.423        <integer>1</integer>
  62.424        <key>Type</key>
  62.425        <string>LLSD</string>
  62.426        <key>Value</key>
  62.427 +      <string/>
  62.428      </map>
  62.429      <key>VFSOldSize</key>
  62.430      <map>
    63.1 --- a/indra/newview/app_settings/settings_files.xml	Thu Jul 18 17:27:31 2013 -0400
    63.2 +++ b/indra/newview/app_settings/settings_files.xml	Mon Aug 26 17:53:30 2013 -0400
    63.3 @@ -4,6 +4,9 @@
    63.4      <file name="Global"
    63.5            file_name="settings.xml"
    63.6            required="true"/>
    63.7 +    <file name="Global"
    63.8 +          file_name="settings_install.xml"
    63.9 +          required="false"/>
   63.10      <file name="PerAccount"
   63.11            file_name="settings_per_account.xml"
   63.12            required="true"/>
    64.1 --- a/indra/newview/app_settings/settings_minimal.xml	Thu Jul 18 17:27:31 2013 -0400
    64.2 +++ b/indra/newview/app_settings/settings_minimal.xml	Mon Aug 26 17:53:30 2013 -0400
    64.3 @@ -1,1 +1,4 @@
    64.4 -<llsd/>
    64.5 \ No newline at end of file
    64.6 +<?xml version="1.0"?>
    64.7 +<llsd>
    64.8 +  <undef/>
    64.9 +</llsd>
    65.1 --- a/indra/newview/app_settings/settings_per_account.xml	Thu Jul 18 17:27:31 2013 -0400
    65.2 +++ b/indra/newview/app_settings/settings_per_account.xml	Mon Aug 26 17:53:30 2013 -0400
    65.3 @@ -109,18 +109,7 @@
    65.4              <string>Boolean</string>
    65.5          <key>Value</key>
    65.6              <integer>0</integer>
    65.7 -    </map>
    65.8 -    <key>DisplayDestinationsOnInitialRun</key>
    65.9 -        <map>
   65.10 -        <key>Comment</key>
   65.11 -          <string>Display the destinations guide when a user first launches Second Life.</string>
   65.12 -        <key>Persist</key>
   65.13 -          <integer>1</integer>
   65.14 -        <key>Type</key>
   65.15 -          <string>Boolean</string>
   65.16 -        <key>Value</key>
   65.17 -          <integer>1</integer>
   65.18 -        </map>
   65.19 +    </map>    
   65.20      <key>LastInventoryInboxActivity</key>
   65.21          <map>
   65.22          <key>Comment</key>
    66.1 --- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl	Thu Jul 18 17:27:31 2013 -0400
    66.2 +++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl	Mon Aug 26 17:53:30 2013 -0400
    66.3 @@ -45,3 +45,4 @@
    66.4  		
    66.5  	return mat;
    66.6  }
    66.7 +
    67.1 --- a/indra/newview/gpu_table.txt	Thu Jul 18 17:27:31 2013 -0400
    67.2 +++ b/indra/newview/gpu_table.txt	Mon Aug 26 17:53:30 2013 -0400
    67.3 @@ -38,7 +38,7 @@
    67.4  ATI All-in-Wonder 7500					.*ATI.*All-in-Wonder 75.*							0	1	0	0
    67.5  ATI All-in-Wonder 8500					.*ATI.*All-in-Wonder 85.*							0	1	0	0
    67.6  ATI All-in-Wonder 9200					.*ATI.*All-in-Wonder 92.*							0	1	0	0
    67.7 -ATI All-in-Wonder 9xxx					.*ATI.*All-in-Wonder 9.*				1	1	0	0
    67.8 +ATI All-in-Wonder 9xxx					.*ATI.*All-in-Wonder 9.*							1	1	0	2.1
    67.9  ATI All-in-Wonder HD					.*ATI.*All-in-Wonder HD.*							1	1	1	3.3
   67.10  ATI All-in-Wonder X600					.*ATI.*All-in-Wonder X6.*							1	1	0	0
   67.11  ATI All-in-Wonder X800					.*ATI.*All-in-Wonder X8.*							1	1	1	2.1
   67.12 @@ -46,162 +46,132 @@
   67.13  ATI All-in-Wonder X1900					.*ATI.*All-in-Wonder X19.*							3	1	0	0
   67.14  ATI All-in-Wonder PCI-E					.*ATI.*All-in-Wonder.*PCI-E.*						1	1	0	0
   67.15  ATI All-in-Wonder Radeon				.*ATI.*All-in-Wonder Radeon.*						0	1	0	0
   67.16 -ATI ASUS ARES							.*ATI.*ASUS.*ARES.*						3	1	0	0
   67.17 -ATI ASUS A9xxx							.*ATI.*ASUS.*A9.*						1	1	0	0
   67.18 -ATI ASUS AH24xx							.*ATI.*ASUS.*AH24.*						1	1	1	3.3
   67.19 -ATI ASUS AH26xx							.*ATI.*ASUS.*AH26.*						1	1	1	3.3
   67.20 -ATI ASUS AH34xx							.*ATI.*ASUS.*AH34.*						1	1	1	3.3
   67.21 -ATI ASUS AH36xx							.*ATI.*ASUS.*AH36.*						1	1	1	3.3
   67.22 -ATI ASUS AH46xx							.*ATI.*ASUS.*AH46.*						2	1	1	3.3
   67.23 -ATI ASUS AX3xx							.*ATI.*ASUS.*AX3.*						1	1	0	0
   67.24 -ATI ASUS AX5xx							.*ATI.*ASUS.*AX5.*						1	1	0	0
   67.25 -ATI ASUS AX8xx							.*ATI.*ASUS.*AX8.*						2	1	0	0
   67.26 -ATI ASUS EAH24xx						.*ATI.*ASUS.*EAH24.*					2	1	0	0
   67.27 -ATI ASUS EAH26xx						.*ATI.*ASUS.*EAH26.*					3	1	0	0
   67.28 -ATI ASUS EAH29xx						.*ATI.*ASUS.*EAH29.*					3	1	0	0
   67.29 -ATI ASUS EAH34xx						.*ATI.*ASUS.*EAH34.*					1	1	0	0
   67.30 -ATI ASUS EAH36xx						.*ATI.*ASUS.*EAH36.*					2	1	0	0
   67.31 -ATI ASUS EAH38xx						.*ATI.*ASUS.*EAH38.*					2	1	1	3.3
   67.32 -ATI ASUS EAH43xx						.*ATI.*ASUS.*EAH43.*					2	1	1	3.3
   67.33 -ATI ASUS EAH45xx						.*ATI.*ASUS.*EAH45.*					2	1	0	0
   67.34 -ATI ASUS EAH48xx						.*ATI.*ASUS.*EAH48.*					3	1	1	3.3
   67.35 -ATI ASUS EAH57xx						.*ATI.*ASUS.*EAH57.*					3	1	1	4.1
   67.36 -ATI ASUS EAH58xx						.*ATI.*ASUS.*EAH58.*					5	1	1	4.1
   67.37 -ATI ASUS EAH62xx						.*ATI.*ASUS.*EAH62.*					2	1	0	0
   67.38 -ATI ASUS EAH63xx						.*ATI.*ASUS.*EAH63.*					2	1	0	0
   67.39 -ATI ASUS EAH64xx						.*ATI.*ASUS.*EAH64.*					2	1	0	0
   67.40 -ATI ASUS EAH65xx						.*ATI.*ASUS.*EAH65.*					2	1	0	4.1
   67.41 -ATI ASUS EAH66xx						.*ATI.*ASUS.*EAH66.*					3	1	0	4.1
   67.42 -ATI ASUS EAH67xx						.*ATI.*ASUS.*EAH67.*					3	1	0	0
   67.43 -ATI ASUS EAH68xx						.*ATI.*ASUS.*EAH68.*					5	1	0	4
   67.44 -ATI ASUS EAH69xx						.*ATI.*ASUS.*EAH69.*					5	1	0	4.1
   67.45 -ATI ASUS Radeon X1xxx					.*ATI.*ASUS.*X1.*						2	1	1	2.1
   67.46 -ATI Radeon X7xx							.*ATI.*ASUS.*X7.*						1	1	0	0
   67.47 -ATI Radeon X19xx						.*ATI.*(Radeon|Diamond) X19.* ?.*		2	1	1	2.1
   67.48 -ATI Radeon X18xx						.*ATI.*(Radeon|Diamond) X18.* ?.*		3	1	1	2.1
   67.49 +ATI Radeon X1300						.*ATI.*(ASUS|Radeon).*X13.*							2	1	1	2.1
   67.50 +ATI Radeon X1500						.*ATI.*(ASUS|Radeon).*X15.*							2	1	1	2.1
   67.51 +ATI Radeon X1600						.*ATI.*(ASUS|Radeon).*X16.*							2	1	1	2.1
   67.52 +ATI Radeon X1700						.*ATI.*(ASUS|Radeon).*X17.*							2	1	1	2.1
   67.53 +ATI Radeon X1800						.*ATI.*(Radeon|Diamond) X18.* ?.*					3	1	1	2.1
   67.54 +ATI Radeon X1900						.*ATI.*(Radeon|Diamond|ASUS) X19.* ?.*				2	1	1	2.1
   67.55  ATI Radeon X17xx						.*ATI.*(Radeon|Diamond) X17.* ?.*					1	1	1	2.1
   67.56 -ATI Radeon X16xx						.*ATI.*(Radeon|Diamond) X16.* ?.*		1	1	1	2.1
   67.57 -ATI Radeon X15xx						.*ATI.*(Radeon|Diamond) X15.* ?.*		1	1	1	2.1
   67.58 -ATI Radeon X13xx						.*ATI.*(Radeon|Diamond) X13.* ?.*		1	1	1	2.1
   67.59 -ATI Radeon X1xxx						.*ATI.*(Radeon|Diamond) X1.. ?.*		0	1	1	2.1
   67.60 -ATI Radeon X2xxx						.*ATI.*(Radeon|Diamond) X2.. ?.*		1	1	1	2.1
   67.61 +ATI Radeon X16xx						.*ATI.*(Radeon|Diamond) X17.* ?.*					1	1	1	2.1
   67.62 +ATI Radeon X28xx						.*ATI.*(Radeon|Diamond) X28.. ?.*					1	1	1	2.1
   67.63  ATI Display Adapter						.*ATI.*display adapter.*							1	1	1	4.1
   67.64  ATI FireGL 5200							.*ATI.*FireGL V52.*									1	1	1	2.1
   67.65  ATI FireGL 5xxx							.*ATI.*FireGL V5.*									2	1	1	3.3
   67.66  ATI FireGL								.*ATI.*Fire.*GL.*									4	1	1	4.2
   67.67 -ATI FirePro M3900						.*ATI.*FirePro.*M39.*					2	1	0	0
   67.68 +ATI FirePro M3900						.*ATI.*FirePro.*M39.*								2	1	0	4.1
   67.69  ATI FirePro M5800						.*ATI.*FirePro.*M58.*								3	1	0	0
   67.70  ATI FirePro M7740						.*ATI.*FirePro.*M77.*								3	1	0	0
   67.71  ATI FirePro M7820						.*ATI.*FirePro.*M78.*								5	1	1	4.2
   67.72 -ATI FireMV								.*ATI.*FireMV.*							0	1	1	1.3
   67.73 +ATI FireMV								.*ATI.*FireMV.*										0	1	1	3.2
   67.74  ATI Generic								.*ATI.*Generic.*									0	0	0	0
   67.75  ATI Hercules 9800						.*ATI.*Hercules.* 9800.*							1	1	0	0
   67.76 -ATI IGP 340M							.*ATI.*IGP.*340M.*						0	0	0	0
   67.77 +ATI IGP 340M							.*ATI.*IGP.* 34[0-9]M.*								0	0	0	1.3
   67.78  ATI M52									.*ATI.*M52.*										1	1	0	0
   67.79  ATI M54									.*ATI.*M54.*										1	1	0	0
   67.80  ATI M56									.*ATI.*M56.*										1	1	0	0
   67.81  ATI M71									.*ATI.*M71.*										1	1	0	0
   67.82  ATI M72									.*ATI.*M72.*										1	1	0	0
   67.83  ATI M76									.*ATI.*M76.*										3	1	0	0
   67.84 -ATI Radeon HD 64xx						.*ATI.*AMD Radeon.* HD [67]4..[MG]		2	1	1	4.2
   67.85 -ATI Radeon HD 65xx						.*ATI.*AMD Radeon.* HD [67]5..[MG]		2	1	1	4.2
   67.86 -ATI Radeon HD 66xx						.*ATI.*AMD Radeon.* HD [67]6..[MG]		3	1	1	4.2
   67.87 -ATI Radeon HD 7100						.*ATI.*AMD Radeon.* HD 71.*				2	1	0	0
   67.88 -ATI Radeon HD 7200						.*ATI.*AMD Radeon.* HD 72.*				2	1	0	0
   67.89 -ATI Radeon HD 7300						.*ATI.*AMD Radeon.* HD 73.*				2	1	0	4.2
   67.90 -ATI Radeon HD 7400						.*ATI.*AMD Radeon.* HD 74.*				2	1	0	4.2
   67.91 -ATI Radeon HD 7500						.*ATI.*AMD Radeon.* HD 75.*				3	1	1	4.2
   67.92 -ATI Radeon HD 7600						.*ATI.*AMD Radeon.* HD 76.*				3	1	0	4.2
   67.93 -ATI Radeon HD 7700						.*ATI.*AMD Radeon.* HD 77.*				4	1	1	4.2
   67.94 -ATI Radeon HD 7800						.*ATI.*AMD Radeon.* HD 78.*				5	1	1	4.2
   67.95 -ATI Radeon HD 7900						.*ATI.*AMD Radeon.* HD 79.*				5	1	1	4.2
   67.96 -ATI ASUS HD7100							.*ATI.*ASUS.* HD71.*					2	1	0	0
   67.97 -ATI ASUS HD7200							.*ATI.*ASUS.* HD72.*					2	1	0	0
   67.98 -ATI ASUS HD7300							.*ATI.*ASUS.* HD73.*					2	1	0	0
   67.99 -ATI ASUS HD7400							.*ATI.*ASUS.* HD74.*					2	1	0	0
  67.100 -ATI ASUS HD7500							.*ATI.*ASUS.* HD75.*					3	1	1	4.2
  67.101 -ATI ASUS HD7600							.*ATI.*ASUS.* HD76.*					3	1	0	0
  67.102 -ATI ASUS HD7700							.*ATI.*ASUS.* HD77.*					4	1	1	4.2
  67.103 -ATI ASUS HD7800							.*ATI.*ASUS.* HD78.*					5	1	1	4.2
  67.104 -ATI ASUS HD7900							.*ATI.*ASUS.* HD79.*					5	1	1	4.2
  67.105 +ATI Radeon HD 6300M						.*ATI.*AMD Radeon.* (HD|HD )63..M					2	1	1	4.2
  67.106 +ATI Radeon HD 6400M						.*ATI.*AMD Radeon.* (HD|HD )64..M					2	1	1	4.2
  67.107 +ATI Radeon HD 6500M						.*ATI.*AMD Radeon.* (HD|HD )65..M					2	1	1	4.2
  67.108 +ATI Radeon HD 6600M						.*ATI.*AMD Radeon.* (HD 6|6)6..M					3	1	1	4.2
  67.109 +ATI Radeon HD 6700M						.*ATI.*AMD Radeon.* (HD|HD )67..M					3	1	1	4.2
  67.110 +ATI Radeon HD 6800M						.*ATI.*AMD Radeon.* (HD|HD )68..M					3	1	1	4.2
  67.111 +ATI Radeon HD 6300G						.*ATI.*AMD Radeon.* (HD|HD )63..G					2	1	1	4.2
  67.112 +ATI Radeon HD 6400G						.*ATI.*AMD Radeon.* (HD|HD )64..G					2	1	1	4.2
  67.113 +ATI Radeon HD 6500G						.*ATI.*AMD Radeon.* (HD|HD )65..G					2	1	1	4.2
  67.114 +ATI Radeon HD 6600G						.*ATI.*AMD Radeon.* (HD|HD )66..G					3	1	1	4.2
  67.115 +ATI Radeon HD 7100						.*ATI.*(Radeon|ASUS).* (HD|HD )71.*					2	1	0	0
  67.116 +ATI Radeon HD 7200						.*ATI.*(Radeon|ASUS).* (HD|HD )72.*					2	1	0	4.2
  67.117 +ATI Radeon HD 7300						.*ATI.*(Radeon|ASUS).* (HD|HD )73.*					2	1	0	4.2
  67.118 +ATI Radeon HD 7400						.*ATI.*(Radeon|ASUS).* (HD|HD )74.*					2	1	0	4.2
  67.119 +ATI Radeon HD 7500						.*ATI.*(Radeon|ASUS).* (HD|HD )75.*					3	1	1	4.2
  67.120 +ATI Radeon HD 7600						.*ATI.*(Radeon|ASUS).* (HD|HD )76.*					3	1	0	4.2
  67.121 +ATI Radeon HD 7700						.*ATI.*(Radeon|ASUS).* (HD|HD )77.*					4	1	1	4.2
  67.122 +ATI Radeon HD 7800						.*ATI.*(Radeon|ASUS).* (HD|HD )78.*					5	1	1	4.2
  67.123 +ATI Radeon HD 7900						.*ATI.*(Radeon|ASUS).* (HD|HD )79.*					5	1	1	4.2
  67.124 +ATI Radeon HD 7000 Series				.*ATI.*(Radeon|ASUS).* (HD|HD )7000 Series.*		3	1	1	4.2
  67.125  ATI Mobility Radeon 4100				.*ATI.*Mobility.* 41..								1	1	1	3.3
  67.126 +ATI Mobility Radeon 5000				.*ATI.*Mobility.* 50..								1	1	1	4.2
  67.127  ATI Mobility Radeon 7xxx				.*ATI.*Mobility.*Radeon 7.*							0	1	1	1.3
  67.128  ATI Mobility Radeon 8xxx				.*ATI.*Mobility.*Radeon 8.*							0	1	0	0
  67.129  ATI Mobility Radeon 9800				.*ATI.*Mobility.* 98.*								1	1	0	0
  67.130  ATI Mobility Radeon 9700				.*ATI.*Mobility.* 97.*								0	1	1	2.1
  67.131  ATI Mobility Radeon 9600				.*ATI.*Mobility.* 96.*								1	1	1	2.1
  67.132 -ATI Mobility Radeon HD 530v				.*ATI.*Mobility.*HD *530v.*				1	1	1	3.3
  67.133 -ATI Mobility Radeon HD 540v				.*ATI.*Mobility.*HD *540v.*				1	1	1	3.3
  67.134 -ATI Mobility Radeon HD 545v				.*ATI.*Mobility.*HD *545v.*				2	1	1	4
  67.135 -ATI Mobility Radeon HD 550v				.*ATI.*Mobility.*HD *550v.*				3	1	1	4
  67.136 -ATI Mobility Radeon HD 560v				.*ATI.*Mobility.*HD *560v.*				3	1	1	3.2
  67.137 -ATI Mobility Radeon HD 565v				.*ATI.*Mobility.*HD *565v.*				3	1	1	3.3
  67.138 -ATI Mobility Radeon HD 2300				.*ATI.*Mobility.*HD *23.*				0	1	1	2.1
  67.139 -ATI Mobility Radeon HD 2400				.*ATI.*Mobility.*HD *24.*				1	1	1	3.3
  67.140 -ATI Mobility Radeon HD 2600				.*ATI.*Mobility.*HD *26.*				1	1	1	3.3
  67.141 -ATI Mobility Radeon HD 2700				.*ATI.*Mobility.*HD *27.*				3	1	0	0
  67.142 -ATI Mobility Radeon HD 3100				.*ATI.*Mobility.*HD *31.*				0	1	0	0
  67.143 -ATI Mobility Radeon HD 3200				.*ATI.*Mobility.*HD *32.*				0	1	0	0
  67.144 -ATI Mobility Radeon HD 3400				.*ATI.*Mobility.*HD *34.*				1	1	1	3.3
  67.145 -ATI Mobility Radeon HD 3600				.*ATI.*Mobility.*HD *36.*				1	1	1	4
  67.146 -ATI Mobility Radeon HD 3800				.*ATI.*Mobility.*HD *38.*				3	1	1	3.3
  67.147 -ATI Mobility Radeon HD 4200				.*ATI.*Mobility.*HD *42.*				1	1	1	4
  67.148 -ATI Mobility Radeon HD 4300				.*ATI.*Mobility.*HD *43.*				1	1	1	4
  67.149 -ATI Mobility Radeon HD 4500				.*ATI.*Mobility.*HD *45.*				1	1	1	4
  67.150 -ATI Mobility Radeon HD 4600				.*ATI.*Mobility.*HD *46.*				2	1	1	3.3
  67.151 -ATI Mobility Radeon HD 4800				.*ATI.*Mobility.*HD *48.*				3	1	1	3.3
  67.152 -ATI Mobility Radeon HD 5100				.*ATI.*Mobility.*HD *51.*				3	1	1	3.2
  67.153 -ATI Mobility Radeon HD 5300				.*ATI.*Mobility.*HD *53.*				3	1	0	0
  67.154 -ATI Mobility Radeon HD 5400				.*ATI.*Mobility.*HD *54.*				2	1	1	4.2
  67.155 -ATI Mobility Radeon HD 5500				.*ATI.*Mobility.*HD *55.*				3	1	0	0
  67.156 -ATI Mobility Radeon HD 5600				.*ATI.*Mobility.*HD *56.*				3	1	1	4.2
  67.157 -ATI Mobility Radeon HD 5700				.*ATI.*Mobility.*HD *57.*				3	1	1	4.1
  67.158 -ATI Mobility Radeon HD 6200				.*ATI.*Mobility.*HD *62.*				3	1	0	0
  67.159 -ATI Mobility Radeon HD 6300				.*ATI.*Mobility.*HD *63.*				3	1	1	4.2
  67.160 -ATI Mobility Radeon HD 6400M			.*ATI.*Mobility.*HD *64.*				3	1	0	0
  67.161 -ATI Mobility Radeon HD 6500M			.*ATI.*Mobility.*HD *65.*				5	1	1	4.2
  67.162 -ATI Mobility Radeon HD 6600M			.*ATI.*Mobility.*HD *66.*				5	1	0	0
  67.163 -ATI Mobility Radeon HD 6700M			.*ATI.*Mobility.*HD *67.*				5	1	0	0
  67.164 -ATI Mobility Radeon HD 6800M			.*ATI.*Mobility.*HD *68.*				5	1	0	0
  67.165 -ATI Mobility Radeon HD 6900M			.*ATI.*Mobility.*HD *69.*				5	1	0	0
  67.166 -ATI Radeon HD 2300						.*ATI.*Radeon HD *23..					0	1	1	3.3
  67.167 -ATI Radeon HD 2400						.*ATI.*Radeon HD *24..					1	1	1	4
  67.168 -ATI Radeon HD 2600						.*ATI.*Radeon HD *26..					2	1	1	3.3
  67.169 -ATI Radeon HD 2900						.*ATI.*Radeon HD *29..					3	1	1	3.3
  67.170 -ATI Radeon HD 3000						.*ATI.*Radeon HD *30..					0	1	0	0
  67.171 -ATI Radeon HD 3100						.*ATI.*Radeon HD *31..					1	1	0	0
  67.172 -ATI Radeon HD 3200						.*ATI.*Radeon HD *32..					1	1	1	4
  67.173 -ATI Radeon HD 3300						.*ATI.*Radeon HD *33..					1	1	1	3.3
  67.174 -ATI Radeon HD 3400						.*ATI.*Radeon HD *34..					1	1	1	4
  67.175 -ATI Radeon HD 3500						.*ATI.*Radeon HD *35..					2	1	0	0
  67.176 -ATI Radeon HD 3600						.*ATI.*Radeon HD *36..					3	1	1	3.3
  67.177 -ATI Radeon HD 3700						.*ATI.*Radeon HD *37..					3	1	0	0
  67.178 +ATI Mobility Radeon HD 530v				.*ATI.*Mobility.*HD 530v.*							1	1	1	3.3
  67.179 +ATI Mobility Radeon HD 540v				.*ATI.*Mobility.*HD 540v.*							1	1	1	3.3
  67.180 +ATI Mobility Radeon HD 545v				.*ATI.*Mobility.*HD 545v.*							2	1	1	4
  67.181 +ATI Mobility Radeon HD 550v				.*ATI.*Mobility.*HD 550v.*							3	1	1	4
  67.182 +ATI Mobility Radeon HD 560v				.*ATI.*Mobility.*HD 560v.*							3	1	1	3.2
  67.183 +ATI Mobility Radeon HD 565v				.*ATI.*Mobility.*HD 565v.*							3	1	1	3.3
  67.184 +ATI Mobility Radeon HD 2300				.*ATI.*Mobility.*HD 23.*							0	1	1	2.1
  67.185 +ATI Mobility Radeon HD 2400				.*ATI.*Mobility.*HD 24.*							1	1	1	3.3
  67.186 +ATI Mobility Radeon HD 2600				.*ATI.*Mobility.*HD 26.*							1	1	1	3.3
  67.187 +ATI Mobility Radeon HD 2700				.*ATI.*Mobility.*HD 27.*							3	1	0	0
  67.188 +ATI Mobility Radeon HD 3100				.*ATI.*Mobility.*HD 31.*							0	1	0	0
  67.189 +ATI Mobility Radeon HD 3200				.*ATI.*Mobility.*HD 32.*							0	1	0	0
  67.190 +ATI Mobility Radeon HD 3400				.*ATI.*Mobility.*HD 34.*							1	1	1	4
  67.191 +ATI Mobility Radeon HD 3600				.*ATI.*Mobility.*HD 36.*							1	1	1	4
  67.192 +ATI Mobility Radeon HD 3800				.*ATI.*Mobility.*HD 38.*							3	1	1	3.3
  67.193 +ATI Mobility Radeon HD 4200				.*ATI.*Mobility.*HD 42.*							1	1	1	4
  67.194 +ATI Mobility Radeon HD 4300				.*ATI.*Mobility.*(HD |HD)43.*						1	1	1	4
  67.195 +ATI Mobility Radeon HD 4500				.*ATI.*Mobility.*HD 45.*							1	1	1	4
  67.196 +ATI Mobility Radeon HD 4600				.*ATI.*Mobility.*HD 46.*							2	1	1	3.3
  67.197 +ATI Mobility Radeon HD 4800				.*ATI.*Mobility.*HD 48.*							3	1	1	3.3
  67.198 +ATI Mobility Radeon HD 5000 Series		.*ATI.*Mobility.*HD 50.*							3	1	1	3.2
  67.199 +ATI Mobility Radeon HD 5100				.*ATI.*Mobility.*HD 51.*							3	1	1	3.2
  67.200 +ATI Mobility Radeon HD 5300				.*ATI.*Mobility.*HD 53.*							3	1	0	0
  67.201 +ATI Mobility Radeon HD 5400				.*ATI.*Mobility.*HD 54.*							2	1	1	4.2
  67.202 +ATI Mobility Radeon HD 5500				.*ATI.*Mobility.*HD 55.*							3	1	0	4.2
  67.203 +ATI Mobility Radeon HD 5600				.*ATI.*Mobility.*HD 56.*							3	1	1	4.2
  67.204 +ATI Mobility Radeon HD 5700				.*ATI.*Mobility.*HD 57.*							3	1	1	4.1
  67.205 +ATI Mobility Radeon HD 6200				.*ATI.*Mobility.*HD 62.*							3	1	0	0
  67.206 +ATI Mobility Radeon HD 6300				.*ATI.*Mobility.*HD 63.*							3	1	1	4.2
  67.207 +ATI Mobility Radeon HD 6400M			.*ATI.*Mobility.*HD 64.*							3	1	0	0
  67.208 +ATI Mobility Radeon HD 6500M			.*ATI.*Mobility.*HD 65.*							5	1	1	4.2
  67.209 +ATI Mobility Radeon HD 6600M			.*ATI.*Mobility.*HD 66.*							5	1	0	0
  67.210 +ATI Mobility Radeon HD 6700M			.*ATI.*Mobility.*HD 67.*							5	1	0	0
  67.211 +ATI Mobility Radeon HD 6800M			.*ATI.*Mobility.*HD 68.*							5	1	0	0
  67.212 +ATI Mobility Radeon HD 6900M			.*ATI.*Mobility.*HD 69.*							5	1	0	0
  67.213 +ATI Mobility Radeon Graphics			.*ATI Mobility Radeon Graphics.*					1	1	0	4
  67.214 +ATI Radeon HD 2300						.*ATI.*Radeon.* (HD|HD )23..						0	1	1	3.3
  67.215 +ATI Radeon HD 2400						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)24..				1	1	1	4
  67.216 +ATI Radeon HD 2600						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)26..				2	1	1	4
  67.217 +ATI Radeon HD 2900						.*ATI.*Radeon.* (HD|HD )29..						3	1	1	3.3
  67.218 +ATI Radeon HD 3000						.*ATI.*Radeon.* (HD|HD )30..						0	1	0	0
  67.219 +ATI Radeon HD 3100						.*ATI.*Radeon.* (HD|HD )31..						1	1	0	0
  67.220 +ATI Radeon HD 3200						.*ATI.*Radeon.* (HD|HD )32..						1	1	1	4
  67.221 +ATI Radeon HD 3300						.*ATI.*Radeon.* (HD|HD )33..						1	1	1	3.3
  67.222 +ATI Radeon HD 3400						.*ATI.*(Radeon|ASUS).* (HD|HD |AH|EAH)34..			1	1	1	4
  67.223 +ATI Radeon HD 3500						.*ATI.*Radeon.* (HD|HD )35..						2	1	0	0
  67.224 +ATI Radeon HD 3600						.*ATI.*(Radeon|ASUS).* (HD|HD |AH|EAH)36..			3	1	1	4
  67.225 +ATI Radeon HD 3700						.*ATI.*Radeon.* (HD|HD )37..						3	1	0	3.3
  67.226  ATI HD3700								.*ATI.* HD37..										3	1	0	3.3
  67.227 -ATI Radeon HD 3800						.*ATI.*Radeon HD *38..					3	1	1	4
  67.228 -ATI Radeon HD 4100						.*ATI.*Radeon HD *41..					1	1	0	0
  67.229 -ATI Radeon HD 4200						.*ATI.*Radeon HD *42..					1	1	1	4
  67.230 -ATI Radeon HD 4300						.*ATI.*Radeon HD *43..					2	1	1	4
  67.231 -ATI Radeon HD 4400						.*ATI.*Radeon HD *44..					2	1	0	0
  67.232 -ATI Radeon HD 4500						.*ATI.*Radeon HD *45..					2	1	1	3.3
  67.233 -ATI Radeon HD 4600						.*ATI.*Radeon HD *46..					3	1	1	4
  67.234 -ATI Radeon HD 4700						.*ATI.*Radeon HD *47..					3	1	1	3.3
  67.235 -ATI Radeon HD 4800						.*ATI.*Radeon HD *48..					3	1	1	4
  67.236 -ATI ASUS EAH5400						.*ATI.*ASUS EAH54..						3	1	1	4.2
  67.237 -ATI Radeon HD 5400						.*ATI.*Radeon HD *54..					3	1	1	4.2
  67.238 -ATI Radeon HD 5500						.*ATI.*Radeon HD *55..					3	1	1	4.2
  67.239 -ATI ASUS EAH5500						.*ATI.*ASUS EAH55..						3	1	1	4.2
  67.240 -ATI Radeon HD 5600						.*ATI.*Radeon HD *56..					3	1	1	4.2
  67.241 -ATI Radeon HD 5700						.*ATI.*Radeon HD *57..					3	1	1	4.2
  67.242 -ATI Radeon HD 5800						.*ATI.*Radeon HD *58..					4	1	1	4.2
  67.243 -ATI Radeon HD 5900						.*ATI.*Radeon HD *59..					4	1	1	4.2
  67.244 -ATI Radeon HD 6200						.*ATI.*Radeon HD *62..					0	1	1	4.2
  67.245 -ATI Radeon HD 6300						.*ATI.*Radeon HD *63..					1	1	1	4.2
  67.246 -ATI Radeon HD 6400						.*ATI.*Radeon HD *64..					3	1	1	4.2
  67.247 -ATI Radeon HD 6500						.*ATI.*Radeon HD *65..					3	1	1	4.2
  67.248 -ATI Radeon HD 6600						.*ATI.*Radeon HD *66..					3	1	1	4.2
  67.249 -ATI Radeon HD 6700						.*ATI.*Radeon HD *67..					3	1	1	4.2
  67.250 -ATI Radeon HD 6800						.*ATI.*Radeon HD *68..					4	1	1	4.2
  67.251 -ATI Radeon HD 6900						.*ATI.*Radeon HD *69..					5	1	1	4.2
  67.252 +ATI Radeon HD 3800						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)38..				3	1	1	4
  67.253 +ATI Radeon HD 4100						.*ATI.*Radeon.* (HD|HD )41..						1	1	0	0
  67.254 +ATI Radeon HD 4200						.*ATI.*Radeon.* (HD|HD )42..						1	1	1	4
  67.255 +ATI Radeon HD 4300						.*ATI.*(Radeon|ASUS).* (HD4|HD 4|EAH4|4)3..			2	1	1	4
  67.256 +ATI Radeon HD 4400						.*ATI.*Radeon.* (HD|HD )44..						2	1	0	0
  67.257 +ATI Radeon HD 4500						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)45..				2	1	1	3.3
  67.258 +ATI Radeon HD 4600						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)46..				3	1	1	4
  67.259 +ATI Radeon HD 4700						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)47..				3	1	1	3.3
  67.260 +ATI Radeon HD 4800						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)48..				3	1	1	4
  67.261 +ATI Radeon HD 5400						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)54..				3	1	1	4.2
  67.262 +ATI Radeon HD 5500						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)55..				3	1	1	4.2
  67.263 +ATI Radeon HD 5600						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)56..				3	1	1	4.2
  67.264 +ATI Radeon HD 5700						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)57..				3	1	1	4.2
  67.265 +ATI Radeon HD 5800						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)58..				4	1	1	4.2
  67.266 +ATI Radeon HD 5900						.*ATI.*Radeon.* (HD|HD )59..						4	1	1	4.2
  67.267 +ATI Radeon HD 6200						.*ATI.*Radeon.* (HD|HD )62..						0	1	1	4.2
  67.268 +ATI Radeon HD 6300						.*ATI.*Radeon.* (HD|HD )63..						1	1	1	4.2
  67.269 +ATI Radeon HD 6400						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)64..				3	1	1	4.2
  67.270 +ATI Radeon HD 6500						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)65..				3	1	1	4.2
  67.271 +ATI Radeon HD 6600						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)66..				3	1	1	4.2
  67.272 +ATI Radeon HD 6700						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)67..				3	1	1	4.2
  67.273 +ATI Radeon HD 6800						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)68..				4	1	1	4.2
  67.274 +ATI Radeon HD 6900						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)69..				5	1	1	4.2
  67.275  ATI Radeon OpenGL						.*ATI.*Radeon OpenGL.*								0	0	0	0
  67.276  ATI Radeon 2100							.*ATI.*Radeon 21..									0	1	1	2.1
  67.277  ATI Radeon 3000							.*ATI.*Radeon 30..									1	1	1	4
  67.278 @@ -219,17 +189,21 @@
  67.279  ATI Radeon RV250						.*ATI.*RV250.*										0	1	0	0
  67.280  ATI Radeon RV600						.*ATI.*RV6.*										1	1	0	0
  67.281  ATI Radeon RX700						.*ATI.*RX70.*										1	1	0	0
  67.282 -ATI Radeon RX800						.*ATI.*Radeon *RX80.*					2	1	0	0
  67.283 +ATI Radeon RX800						.*ATI.*Radeon RX80.*								2	1	0	0
  67.284  ATI RS880M								.*ATI.*RS880M										1	1	0	0
  67.285  ATI Radeon RX9550						.*ATI.*RX9550.*										1	1	0	0
  67.286  ATI Radeon VE							.*ATI.*Radeon.*VE.*									0	0	0	0
  67.287 -ATI Radeon X300							.*ATI.*Radeon *X3.*						1	1	1	2.1
  67.288 +ATI Radeon X300							.*ATI.*Radeon X3.*									1	1	1	2.1
  67.289  ATI Radeon X400							.*ATI.*Radeon ?X4.*									0	1	0	0
  67.290  ATI Radeon X500							.*ATI.*Radeon ?X5.*									1	1	1	2.1
  67.291 -ATI Radeon X600							.*ATI.*Radeon ?X6.*						1	1	1	2.1
  67.292 +ATI Radeon X600							.*ATI.*(Radeon |ASUS Extreme A)X6.*					1	1	1	2.1
  67.293  ATI Radeon X700							.*ATI.*Radeon ?X7.*									2	1	1	2.1
  67.294  ATI Radeon X800							.*ATI.*Radeon ?X8.*									1	1	1	2.1
  67.295  ATI Radeon X900							.*ATI.*Radeon ?X9.*									2	1	0	0
  67.296 +ATI Radeon X1000						.*ATI.*Radeon ?X10.*								2	1	0	2.1
  67.297 +ATI Radeon X1200						.*ATI.*Radeon ?X12.*								2	1	0	2.1
  67.298 +ATI Radeon X1400						.*ATI.*Radeon ?X14.*								2	1	0	2.1
  67.299 +ATI Radeon X2300						.*ATI.*Radeon ?X23.*								2	1	0	2.1
  67.300  ATI Radeon Xpress						.*ATI.*Radeon Xpress.*								0	1	1	2.1
  67.301  ATI Rage 128							.*ATI.*Rage 128.*									0	1	0	0
  67.302  ATI R300 (9700)							.*R300.*											0	1	1	2.1
  67.303 @@ -248,41 +222,43 @@
  67.304  ATI RX480 (Xpress 200P)					.*RX480.*											0	1	0	0
  67.305  ATI RX700								.*RX700.*											1	1	0	0
  67.306  AMD ANTILLES (HD 6990)					.*(AMD|ATI).*Antilles.*								3	1	0	0
  67.307 +ATI ROBSON								.*(AMD|ATI).*ROBSON.*								3	1	0	4
  67.308  AMD BARTS (HD 6800)						.*(AMD|ATI).*Barts.*								3	1	1	2.1
  67.309 +AMD WRESTLER							.*(AMD|ATI).*WRESTLER.*								3	1	1	4
  67.310 +AMD SUMO								.*(AMD|ATI).*SUMO.*									3	1	1	4.1
  67.311  AMD CAICOS (HD 6400)					.*(AMD|ATI).*Caicos.*								3	1	0	0
  67.312  AMD CAYMAN (HD 6900)					.*(AMD|ATI).*(Cayman|CAYMAM).*						3	1	0	0
  67.313 -AMD CEDAR (HD 5450)						.*(AMD|ATI).*Cedar.*					2	1	0	0
  67.314 +AMD CEDAR (HD 5450)						.*(AMD|ATI).*Cedar.*								2	1	0	2.1
  67.315  AMD CYPRESS (HD 5800)					.*(AMD|ATI).*Cypress.*								3	1	0	0
  67.316  AMD HEMLOCK (HD 5970)					.*(AMD|ATI).*Hemlock.*								3	1	0	0
  67.317  AMD JUNIPER (HD 5700)					.*(AMD|ATI).*Juniper.*								3	1	0	0
  67.318  AMD PARK								.*(AMD|ATI).*Park.*									3	1	0	0
  67.319 -AMD REDWOOD (HD 5500/5600)				.*(AMD|ATI).*Redwood.*					3	1	0	0
  67.320 -AMD TURKS (HD 6500/6600)				.*(AMD|ATI).*Turks.*					3	1	0	0
  67.321 +AMD REDWOOD (HD 5500/5600)				.*(AMD|ATI).*Redwood.*								3	1	0	1.4
  67.322 +AMD TURKS (HD 6500/6600)				.*(AMD|ATI).*Turks.*								3	1	0	2.1
  67.323  AMD RS780 (HD 3200)						.*RS780.*											0	1	1	2.1
  67.324  AMD RS880 (HD 4200)						.*RS880.*											0	1	1	3.2
  67.325  AMD RV610 (HD 2400)						.*RV610.*											1	1	0	0
  67.326  AMD RV620 (HD 3400)						.*RV620.*											1	1	0	0
  67.327  AMD RV630 (HD 2600)						.*RV630.*											2	1	0	0
  67.328 -AMD RV635 (HD 3600)						.*RV635.*								3	1	0	0
  67.329 +AMD RV635 (HD 3600)						.*RV635.*											3	1	0	1.4
  67.330  AMD RV670 (HD 3800)						.*RV670.*											3	1	0	0
  67.331  AMD R680 (HD 3870 X2)					.*R680.*											3	1	0	0
  67.332  AMD R700 (HD 4800 X2)					.*R700.*											3	1	0	0
  67.333  AMD RV710 (HD 4300)						.*RV710.*											0	1	1	1.4
  67.334 -AMD RV730 (HD 4600)						.*RV730.*								3	1	0	0
  67.335 +AMD RV730 (HD 4600)						.*RV730.*											3	1	0	1.4
  67.336  AMD RV740 (HD 4700)						.*RV740.*											3	1	0	0
  67.337  AMD RV770 (HD 4800)						.*RV770.*											3	1	0	0
  67.338  AMD RV790 (HD 4800)						.*RV790.*											3	1	0	0
  67.339  ATI 760G/Radeon 3000					.*ATI.*AMD 760G.*									1	1	1	3.3
  67.340  ATI 780L/Radeon 3000					.*ATI.*AMD 780L.*									1	1	0	0
  67.341  ATI Radeon DDR							.*ATI.*Radeon ?DDR.*								0	1	0	0
  67.342 -ATI FirePro 2000						.*ATI.*FirePro 2.*						2	1	1	4.1
  67.343 +ATI FirePro 2000						.*ATI.*FirePro 2.*									2	1	1	4.2
  67.344  ATI FirePro 3000						.*ATI.*FirePro V3.*									2	1	0	0
  67.345 -ATI FirePro 4000						.*ATI.*FirePro V4.*						2	1	0	0
  67.346 +ATI FirePro 4000						.*ATI.*FirePro V4.*									2	1	0	4.1
  67.347  ATI FirePro 5000						.*ATI.*FirePro V5.*									3	1	0	0
  67.348  ATI FirePro 7000						.*ATI.*FirePro V7.*									3	1	0	0
  67.349  ATI FirePro M							.*ATI.*FirePro M.*									3	1	1	4.2
  67.350  ATI R300 (9700)							.*R300.*											0	1	1	2.1
  67.351 -ATI Radeon								.*ATI.*(Diamond|Radeon).*				0	1	0	4.2
  67.352  Intel X3100								.*Intel.*X3100.*									1	1	1	2.1
  67.353  Intel GMA 3600							.*Intel.* 3600.*									0	1	1	3
  67.354  Intel 830M								.*Intel.*830M										0	0	0	0
  67.355 @@ -308,8 +284,6 @@
  67.356  Intel HD Graphics 2000					.*Intel.*HD Graphics 2.*							2	1	0	4
  67.357  Intel HD Graphics 3000					.*Intel.*HD Graphics 3.*							3	1	1	3.1
  67.358  Intel HD Graphics 4000					.*Intel.*HD Graphics 4.*							3	1	1	4
  67.359 -Intel HD2000							.*Intel.*HD2000.*						2	1	0	0
  67.360 -Intel HD3000							.*Intel.*HD3000.*						3	1	0	0
  67.361  Intel HD Graphics						.*Intel.*HD Graphics.*								2	1	1	4
  67.362  Intel Mobile 4 Series					.*Intel.*Mobile.* 4 Series.*						0	1	1	2.1
  67.363  Intel 4 Series Internal					.*Intel.* 4 Series Internal.*						1	1	1	2.1
  67.364 @@ -322,113 +296,109 @@
  67.365  Intel B45/B43							.*Intel.*B4.*										1	1	1	2.1
  67.366  Intel 3D-Analyze						.*Intel.*3D-Analyze.*								2	1	0	0
  67.367  Matrox									.*Matrox.*											0	0	0	0
  67.368 -Mesa									.*Mesa.*								1	0	1	2.1
  67.369 +Mesa									.*Mesa.*											1	0	1	3
  67.370  Gallium									.*Gallium.*											1	1	1	2.1
  67.371 -NVIDIA G100M							.*NVIDIA .*100M.*						4	1	1	3.3
  67.372 -NVIDIA G102M							.*NVIDIA .*102M.*						1	1	1	3.3
  67.373 -NVIDIA G103M							.*NVIDIA .*103M.*						2	1	1	3.3
  67.374 -NVIDIA G105M							.*NVIDIA .*105M.*						2	1	1	3.3
  67.375 -NVIDIA G 110M							.*NVIDIA .*110M.*						1	1	1	3.3
  67.376 -NVIDIA G 120M							.*NVIDIA .*120M.*						1	1	1	3.3
  67.377 -NVIDIA G 205M							.*NVIDIA .*205M.*						1	1	0	0
  67.378 -NVIDIA G 410M							.*NVIDIA .*410M.*						3	1	1	4.2
  67.379 -NVIDIA GT 120M							.*NVIDIA .*GT *12*M.*					3	1	1	3.3
  67.380 -NVIDIA GT 130M							.*NVIDIA .*GT *13*M.*					3	1	1	3.3
  67.381 -NVIDIA GT 140M							.*NVIDIA .*GT *14*M.*					3	1	1	3.3
  67.382 -NVIDIA GT 150M							.*NVIDIA .*GTS *15*M.*					2	1	0	0
  67.383 -NVIDIA GTS 160M							.*NVIDIA .*GTS *16*M.*					2	1	0	0
  67.384 -NVIDIA G210M							.*NVIDIA .*G21*M.*						3	1	0	0
  67.385 -NVIDIA GT 220M							.*NVIDIA .*GT *22*M.*					3	1	1	3.3
  67.386 -NVIDIA GT 230M							.*NVIDIA .*GT *23*M.*					3	1	1	3.3
  67.387 -NVIDIA GT 240M							.*NVIDIA .*GT *24*M.*					3	1	1	3.3
  67.388 -NVIDIA GTS 250M							.*NVIDIA .*GTS *25*M.*					3	1	0	0
  67.389 -NVIDIA GTS 260M							.*NVIDIA .*GTS *26*M.*					3	1	0	0
  67.390 -NVIDIA GTX 260M							.*NVIDIA .*GTX *26*M.*					3	1	0	0
  67.391 -NVIDIA GTX 270M							.*NVIDIA .*GTX *27*M.*					3	1	0	0
  67.392 -NVIDIA GTX 280M							.*NVIDIA .*GTX *28*M.*					3	1	0	0
  67.393 -NVIDIA 300M								.*NVIDIA .*30*M.*						3	1	1	4.2
  67.394 -NVIDIA G 310M							.*NVIDIA .*31*M.*						2	1	0	0
  67.395 -NVIDIA GT 320M							.*NVIDIA .*GT *32*M.*					3	1	0	0
  67.396 -NVIDIA GT 325M							.*NVIDIA .*GT *32*M.*					3	1	1	3.3
  67.397 -NVIDIA GT 330M							.*NVIDIA .*GT *33*M.*					3	1	1	3.3
  67.398 -NVIDIA GT 340M							.*NVIDIA .*GT *34*M.*					4	1	1	3.3
  67.399 -NVIDIA GTS 350M							.*NVIDIA .*GTS *35*M.*					4	1	1	3.3
  67.400 -NVIDIA GTS 360M							.*NVIDIA .*GTS *360M.*					5	1	1	3.3
  67.401 -NVIDIA 405M								.*NVIDIA .* 40*M.*						2	1	0	4.2
  67.402 -NVIDIA 410M								.*NVIDIA .* 41*M.*						3	1	0	0
  67.403 -NVIDIA GT 415M							.*NVIDIA .*GT *41*M.*					3	1	1	4.2
  67.404 -NVIDIA GT 420M							.*NVIDIA .*GT *42*M.*					3	1	1	4.2
  67.405 -NVIDIA GT 430M							.*NVIDIA .*GT *43*M.*					3	1	1	4.2
  67.406 -NVIDIA GT 440M							.*NVIDIA .*GT *44*M.*					3	1	1	4.2
  67.407 -NVIDIA GT 450M							.*NVIDIA .*GT *45*M.*					3	1	0	0
  67.408 -NVIDIA GTX 460M							.*NVIDIA .*GTX *46*M.*					4	1	1	4.2
  67.409 -NVIDIA GTX 470M							.*NVIDIA .*GTX *47*M.*					3	1	0	0
  67.410 -NVIDIA GTX 480M							.*NVIDIA .*GTX *48*M.*					3	1	1	4.2
  67.411 -NVIDIA GT 520M							.*NVIDIA .*GT *52*M.*					3	1	1	4.2
  67.412 -NVIDIA GT 530M							.*NVIDIA .*GT *53*M.*					3	1	1	4.2
  67.413 -NVIDIA GT 540M							.*NVIDIA .*GT *54*M.*					3	1	1	4.2
  67.414 -NVIDIA GT 550M							.*NVIDIA .*GT *55*M.*					3	1	1	4.2
  67.415 -NVIDIA GTX 560M							.*NVIDIA .*GTX *56*M.*					3	1	0	0
  67.416 -NVIDIA GTX 570M							.*NVIDIA .*GTX *57*M.*					5	1	0	0
  67.417 -NVIDIA GTX 580M							.*NVIDIA .*GTX *58*M.*					5	1	1	4.2
  67.418 -NVIDIA 610M								.*NVIDIA.* 61*M.*						3	1	1	4.2
  67.419 -NVIDIA GT 620M							.*NVIDIA .*GT *62*M.*					3	1	0	0
  67.420 -NVIDIA GT 630M							.*NVIDIA .*GT *63*M.*					3	1	0	0
  67.421 -NVIDIA GT 640M							.*NVIDIA .*GT *64*M.*					3	1	0	0
  67.422 -NVIDIA GT 650M							.*NVIDIA .*GT *65*M.*					3	1	0	0
  67.423 -NVIDIA GTX 660M							.*NVIDIA .*GTX *66*M.*					5	1	0	0
  67.424 -NVIDIA GTX 670M							.*NVIDIA .*GTX *67*M.*					5	1	1	4.2
  67.425 -NVIDIA GTX 680M							.*NVIDIA .*GTX *68*M.*					5	1	0	0
  67.426 -NVIDIA GTX 690M							.*NVIDIA .*GTX *69*M.*					5	1	0	0
  67.427 +NVIDIA G100M							.*NVIDIA .* 10[0-9]M.*								4	1	1	3.3
  67.428 +NVIDIA G 110M							.*NVIDIA .* 11[0-9]M.*								1	1	1	3.3
  67.429 +NVIDIA G 120M							.*NVIDIA .* 12[0-9]M.*								1	1	1	3.3
  67.430 +NVIDIA G 200M							.*NVIDIA .* 20[0-9]M.*								1	1	0	0
  67.431 +NVIDIA G 410M							.*NVIDIA .* 41[0-9]M.*								3	1	1	4.2
  67.432 +NVIDIA GT 130M							.*NVIDIA .*GT 13[0-9]M.*							3	1	1	3.3
  67.433 +NVIDIA GT 140M							.*NVIDIA .*GT 14[0-9]M.*							3	1	1	3.3
  67.434 +NVIDIA GT 150M							.*NVIDIA .*GTS 15[0-9]M.*							2	1	0	0
  67.435 +NVIDIA GTS 160M							.*NVIDIA .*GTS 16[0-9]M.*							2	1	0	0
  67.436 +NVIDIA G210M							.*NVIDIA .*G21[0-9]M.*								3	1	0	3.3
  67.437 +NVIDIA GT 220M							.*NVIDIA .*GT 22[0-9]M.*							3	1	1	3.3
  67.438 +NVIDIA GT 230M							.*NVIDIA .*GT 23[0-9]M.*							3	1	1	3.3
  67.439 +NVIDIA GT 240M							.*NVIDIA .*GT 24[0-9]M.*							3	1	1	3.3
  67.440 +NVIDIA GTS 250M							.*NVIDIA .*GTS 25[0-9]M.*							3	1	0	3.3
  67.441 +NVIDIA GTS 260M							.*NVIDIA .*GTS 26[0-9]M.*							3	1	0	0
  67.442 +NVIDIA GTX 260M							.*NVIDIA .*GTX 26[0-9]M.*							3	1	0	3.3
  67.443 +NVIDIA GTX 270M							.*NVIDIA .*GTX 27[0-9]M.*							3	1	0	0
  67.444 +NVIDIA GTX 280M							.*NVIDIA .*GTX 28[0-9]M.*							3	1	0	3.3
  67.445 +NVIDIA 300M								.*NVIDIA .*GT 30[0-9]M.*							3	1	1	4.2
  67.446 +NVIDIA G 310M							.*NVIDIA .* 31[0-9]M.*								2	1	0	3.3
  67.447 +NVIDIA GT 320M							.*NVIDIA .* 32[0-9]M.*								3	1	0	3.3
  67.448 +NVIDIA GT 330M							.*NVIDIA .*GT 33[0-9]M.*							3	1	1	3.3
  67.449 +NVIDIA GT 340M							.*NVIDIA .*GT 34[0-9]M.*							4	1	1	3.3
  67.450 +NVIDIA GTS 350M							.*NVIDIA .*GTS 35[0-9]M.*							4	1	1	3.3
  67.451 +NVIDIA GTS 360M							.*NVIDIA .*GTS 36[0-9]M.*							5	1	1	3.3
  67.452 +NVIDIA 400M								.*NVIDIA .* 40[0-9]M.*								2	1	0	0
  67.453 +NVIDIA 410M								.*NVIDIA .* 41[0-9]M.*								3	1	0	0
  67.454 +NVIDIA GT 420M							.*NVIDIA .*GT 42[0-9]M.*							3	1	1	4.2
  67.455 +NVIDIA GT 430M							.*NVIDIA .*GT 43[0-9]M.*							3	1	1	4.2
  67.456 +NVIDIA GT 440M							.*NVIDIA .*GT 44[0-9]M.*							3	1	1	4.2
  67.457 +NVIDIA GT 450M							.*NVIDIA .*GT 45[0-9]M.*							3	1	0	0
  67.458 +NVIDIA GTX 460M							.*NVIDIA .*GTX 46[0-9]M.*							4	1	1	4.3
  67.459 +NVIDIA GTX 470M							.*NVIDIA .*GTX 47[0-9]M.*							3	1	0	4.2
  67.460 +NVIDIA GTX 480M							.*NVIDIA .*GTX 48[0-9]M.*							3	1	1	4.2
  67.461 +NVIDIA GT 520M							.*NVIDIA .*GT 52[0-9]M.*							3	1	1	4.2
  67.462 +NVIDIA GT 530M							.*NVIDIA .*GT 53[0-9]M.*							3	1	1	4.2
  67.463 +NVIDIA GT 540M							.*NVIDIA .*GT 54[0-9]M.*							3	1	1	4.2
  67.464 +NVIDIA GT 550M							.*GeForce GT 55[0-9]M.*								3	1	1	4.2
  67.465 +NVIDIA GTX 560M							.*NVIDIA .*GTX 56[0-9]M.*							3	1	0	4.2
  67.466 +NVIDIA GTX 570M							.*NVIDIA .*GTX 57[0-9]M.*							5	1	0	4.2
  67.467 +NVIDIA GTX 580M							.*NVIDIA .*GTX 58[0-9]M.*							5	1	1	4.2
  67.468 +NVIDIA 610M								.*NVIDIA.* 61[0-9]M.*								3	1	1	4.2
  67.469 +NVIDIA GT 620M							.*NVIDIA .*GT 62[0-9]M.*							3	1	0	4.2
  67.470 +NVIDIA GT 630M							.*NVIDIA .*GT 63[0-9]M.*							3	1	0	4.2
  67.471 +NVIDIA GT 640M							.*NVIDIA .*GT 64[0-9]M.*							3	1	0	4.2
  67.472 +NVIDIA GT 650M							.*NVIDIA .*GT 65[0-9]M.*							3	1	0	4.2
  67.473 +NVIDIA GTX 660M							.*NVIDIA .*GTX 66[0-9]M.*							5	1	0	4.3
  67.474 +NVIDIA GTX 670M							.*NVIDIA .*GTX 67[0-9]M.*							5	1	1	4.2
  67.475 +NVIDIA GTX 680M							.*NVIDIA .*GTX 68[0-9]M.*							5	1	0	4.2
  67.476 +NVIDIA GTX 690M							.*NVIDIA .*GTX 69[0-9]M.*							5	1	0	0
  67.477  NVIDIA G100								.*NVIDIA .*G10.*									3	1	1	4.2
  67.478 -NVIDIA GT 120							.*NVIDIA .*GT *12.*						2	1	0	3
  67.479 -NVIDIA GT 130							.*NVIDIA .*GT *13.*						2	1	0	3.3
  67.480 -NVIDIA GTS 150							.*NVIDIA .*GTS *15.*					2	1	0	0
  67.481 +NVIDIA GT 120							.*NVIDIA .*GT 12.*									2	1	0	3.3
  67.482 +NVIDIA GT 130							.*NVIDIA .*GT 13.*									2	1	0	3.3
  67.483 +NVIDIA GT 140							.*NVIDIA .*GT 14.*									2	1	0	3.3
  67.484 +NVIDIA GTS 150							.*NVIDIA .*GTS 15.*									2	1	0	0
  67.485  NVIDIA 200								.*NVIDIA .*GeForce 20.*								2	1	1	3.3
  67.486  NVIDIA G200								.*NVIDIA .*GeForce G20.*							2	1	1	3.3
  67.487  NVIDIA G210								.*NVIDIA .*GeForce G210.*							3	1	1	3.3
  67.488  NVIDIA 210								.*NVIDIA .*GeForce 210.*							3	1	1	3.3
  67.489 -NVIDIA GT 220							.*NVIDIA .*GT *22.*						2	1	1	3.3
  67.490 -NVIDIA GT 230							.*NVIDIA .*GT *23.*						2	1	1	3.3
  67.491 -NVIDIA GT 240							.*NVIDIA .*GT *24.*						4	1	1	3.3
  67.492 -NVIDIA GTS 240							.*NVIDIA .*GTS *24.*					4	1	1	3.3
  67.493 -NVIDIA GTS 250							.*NVIDIA .*GTS *25.*					4	1	1	3.3
  67.494 -NVIDIA GTX 260							.*NVIDIA .*GTX *26.*					4	1	1	3.3
  67.495 -NVIDIA GTX 270							.*NVIDIA .*GTX *27.*					4	1	0	3.3
  67.496 -NVIDIA GTX 280							.*NVIDIA .*GTX *28.*					4	1	1	3.3
  67.497 -NVIDIA GTX 290							.*NVIDIA .*GTX *29.*					5	1	0	3.3
  67.498 +NVIDIA GT 220							.*NVIDIA .*GT 22.*									2	1	1	3.3
  67.499 +NVIDIA GT 230							.*NVIDIA .*GT 23.*									2	1	1	3.3
  67.500 +NVIDIA GT 240							.*NVIDIA .*GT 24.*									4	1	1	3.3
  67.501 +NVIDIA GTS 240							.*NVIDIA .*GTS 24.*									4	1	1	3.3
  67.502 +NVIDIA GTS 250							.*NVIDIA .*GTS 25.*									4	1	1	3.3
  67.503 +NVIDIA GTX 260							.*NVIDIA .*GTX 26.*									4	1	1	3.3
  67.504 +NVIDIA GTX 270							.*NVIDIA .*GTX 27.*									4	1	0	3.3
  67.505 +NVIDIA GTX 280							.*NVIDIA .*GTX 28.*									4	1	1	3.3
  67.506 +NVIDIA GTX 290							.*NVIDIA .*GTX 29.*									5	1	0	3.3
  67.507  NVIDIA 310								.*NVIDIA .*GeForce 310.*							3	1	1	3.3
  67.508  NVIDIA 315								.*NVIDIA .*GeForce 315.*							3	1	1	3.3
  67.509 -NVIDIA GT 320							.*NVIDIA .*GT *32.*						3	1	0	3.3
  67.510 -NVIDIA GT 330							.*NVIDIA .*GT *33.*						3	1	0	3.3
  67.511 -NVIDIA GT 340							.*NVIDIA .*GT *34.*						3	1	0	0
  67.512 +NVIDIA GT 320							.*NVIDIA .*GT 32.*									3	1	0	3.3
  67.513 +NVIDIA GT 330							.*NVIDIA .*GT 33.*									3	1	0	3.3
  67.514 +NVIDIA GT 340							.*NVIDIA .*GT 34.*									3	1	0	3.3
  67.515  NVIDIA 405								.*NVIDIA .* 405.*									3	1	0	3.3
  67.516 -NVIDIA GT 420							.*NVIDIA .*GT *42.*						3	1	1	4.2
  67.517 -NVIDIA GT 430							.*NVIDIA .*GT *43.*						3	1	1	4.2
  67.518 -NVIDIA GT 440							.*NVIDIA .*GT *44.*						4	1	0	4.2
  67.519 -NVIDIA GTS 450							.*NVIDIA .*GTS *45.*					4	1	1	4.2
  67.520 -NVIDIA GTX 460							.*NVIDIA .*GTX *46.*					5	1	1	4.3
  67.521 -NVIDIA GTX 470							.*NVIDIA .*GTX *47.*					5	1	1	4.2
  67.522 -NVIDIA GTX 480							.*NVIDIA .*GTX *48.*					5	1	1	4.2
  67.523 -NVIDIA 510								.*NVIDIA .* 510.*						3	1	0	0
  67.524 -NVIDIA GT 520							.*NVIDIA .*GT *52.*						3	1	1	4.2
  67.525 -NVIDIA GT 530							.*NVIDIA .*GT *53.*						3	1	1	4.2
  67.526 -NVIDIA GT 540							.*NVIDIA .*GT *54.*						3	1	1	4.2
  67.527 -NVIDIA GTX 550							.*NVIDIA .*GTX *55.*					5	1	1	4.3
  67.528 -NVIDIA GTX 560							.*NVIDIA .*GTX *56.*					5	1	1	4.2
  67.529 -NVIDIA GTX 570							.*NVIDIA .*GTX *57.*					5	1	1	4.2
  67.530 -NVIDIA GTX 580							.*NVIDIA .*GTX *58.*					5	1	1	4.3
  67.531 -NVIDIA GTX 590							.*NVIDIA .*GTX *59.*					5	1	1	4.2
  67.532 -NVIDIA GT 610							.*NVIDIA .*GT *61.*						3	1	1	4.2
  67.533 -NVIDIA GT 620							.*NVIDIA .*GT *62.*						3	1	0	4.2
  67.534 -NVIDIA GT 630							.*NVIDIA .*GT *63.*						3	1	0	4.2
  67.535 -NVIDIA GT 640							.*NVIDIA .*GT *64.*						3	1	0	4.3
  67.536 -NVIDIA GT 650							.*NVIDIA .*GT *65.*						3	1	1	4.2
  67.537 -NVIDIA GTX 650							.*NVIDIA .*GTX *65.*					3	1	1	4.2
  67.538 -NVIDIA GTX 660							.*NVIDIA .*GTX *66.*					5	1	0	4.3
  67.539 -NVIDIA GTX 670							.*NVIDIA .*GTX *67.*					5	1	1	4.2
  67.540 -NVIDIA GTX 680							.*NVIDIA .*GTX *68.*					5	1	1	4.2
  67.541 -NVIDIA GTX 690							.*NVIDIA .*GTX *69.*					5	1	1	4.2
  67.542 +NVIDIA GT 420							.*NVIDIA .*GT 42.*									3	1	1	4.2
  67.543 +NVIDIA GT 430							.*NVIDIA .*GT 43.*									3	1	1	4.3
  67.544 +NVIDIA GT 440							.*NVIDIA .*GT 44.*									4	1	0	4.3
  67.545 +NVIDIA GTS 450							.*NVIDIA .*GTS 45.*									4	1	1	4.2
  67.546 +NVIDIA GTX 460							.*NVIDIA .*GTX 46.*									5	1	1	4.3
  67.547 +NVIDIA GTX 470							.*NVIDIA .*GTX 47.*									5	1	1	4.2
  67.548 +NVIDIA GTX 480							.*NVIDIA .*GTX 48.*									5	1	1	4.2
  67.549 +NVIDIA 510								.*NVIDIA .* 510.*									3	1	0	4.2
  67.550 +NVIDIA GT 520							.*NVIDIA .*GT 52.*									3	1	1	4.2
  67.551 +NVIDIA GT 530							.*NVIDIA .*GT 53.*									3	1	1	4.2
  67.552 +NVIDIA GT 540							.*NVIDIA .*GT 54.*									3	1	1	4.2
  67.553 +NVIDIA GTX 550							.*NVIDIA .*GTX 55.*									5	1	1	4.3
  67.554 +NVIDIA GTX 560							.*NVIDIA .*GTX 56.*									5	1	1	4.3
  67.555 +NVIDIA GTX 570							.*NVIDIA .*GTX 57.*									5	1	1	4.2
  67.556 +NVIDIA GTX 580							.*NVIDIA .*GTX 58.*									5	1	1	4.3
  67.557 +NVIDIA GTX 590							.*NVIDIA .*GTX 59.*									5	1	1	4.2
  67.558 +NVIDIA 605								.*NVIDIA .* 605.*									3	1	1	4.2
  67.559 +NVIDIA GT 610							.*NVIDIA .*GT 61.*									3	1	1	4.2
  67.560 +NVIDIA GT 620							.*NVIDIA .*GT 62.*									3	1	0	4.2
  67.561 +NVIDIA GT 630							.*NVIDIA .*GT 63.*									3	1	0	4.2
  67.562 +NVIDIA GT 640							.*NVIDIA .*GT 64.*									3	1	0	4.2
  67.563 +NVIDIA GT 650							.*NVIDIA .*GT 65.*									3	1	1	4.2
  67.564 +NVIDIA GTX 650							.*NVIDIA .*GTX 65.*									3	1	1	4.2
  67.565 +NVIDIA GTX 660							.*NVIDIA .*GTX 66.*									5	1	0	4.3
  67.566 +NVIDIA GTX 670							.*NVIDIA .*GTX 67.*									5	1	1	4.2
  67.567 +NVIDIA GTX 680							.*NVIDIA .*GTX 68.*									5	1	1	4.2
  67.568 +NVIDIA GTX 690							.*NVIDIA .*GTX 69.*									5	1	1	4.2
  67.569  NVIDIA C51								.*NVIDIA .*C51.*									0	1	1	2
  67.570  NVIDIA G72								.*NVIDIA .*G72.*									1	1	0	0
  67.571  NVIDIA G73								.*NVIDIA .*G73.*									1	1	0	0
  67.572 @@ -437,13 +407,7 @@
  67.573  NVIDIA G92								.*NVIDIA .*G92.*									3	1	0	0
  67.574  NVIDIA GeForce							.*GeForce 256.*										0	0	0	0
  67.575  NVIDIA GeForce 2						.*GeForce ?2 ?.*									0	1	1	1.5
  67.576 -NVIDIA GeForce 3						.*GeForce ?3 ?.*						2	1	1	2.1
  67.577 -NVIDIA GeForce 3 Ti						.*GeForce ?3 Ti.*						0	1	0	0
  67.578  NVIDIA GeForce 4						.*NVIDIA .*GeForce ?4.*								0	1	1	1.5
  67.579 -NVIDIA GeForce 4 Go						.*NVIDIA .*GeForce ?4.*Go.*				0	1	0	0
  67.580 -NVIDIA GeForce 4 MX						.*NVIDIA .*GeForce ?4 MX.*				0	1	0	0
  67.581 -NVIDIA GeForce 4 PCX					.*NVIDIA .*GeForce ?4 PCX.*				0	1	0	0
  67.582 -NVIDIA GeForce 4 Ti						.*NVIDIA .*GeForce ?4 Ti.*				0	1	0	0
  67.583  NVIDIA GeForce 6100						.*NVIDIA .*GeForce 61.*								3	1	1	4.2
  67.584  NVIDIA GeForce 6200						.*NVIDIA .*GeForce 62.*								0	1	1	2.1
  67.585  NVIDIA GeForce 6500						.*NVIDIA .*GeForce 65.*								1	1	1	2.1
  67.586 @@ -458,33 +422,33 @@
  67.587  NVIDIA GeForce 7600						.*NVIDIA .*GeForce 76.*								2	1	1	2.1
  67.588  NVIDIA GeForce 7800						.*NVIDIA .*GeForce 78.*								2	1	1	2.1
  67.589  NVIDIA GeForce 7900						.*NVIDIA .*GeForce 79.*								3	1	1	2.1
  67.590 -NVIDIA GeForce 8100						.*NVIDIA .*GeForce 81.*					1	1	0	0
  67.591 -NVIDIA GeForce 8200M					.*NVIDIA .*GeForce 8200M.*				1	1	0	3.3
  67.592 -NVIDIA GeForce 8200						.*NVIDIA .*GeForce 82.*					1	1	0	2.1
  67.593 +NVIDIA GeForce 8100						.*NVIDIA .*GeForce 81.*								1	1	0	3.3
  67.594 +NVIDIA GeForce 8200M					.*NVIDIA .*GeForce 820[0-9]M.*						1	1	0	3.3
  67.595 +NVIDIA GeForce 8200						.*NVIDIA .*GeForce 82.*								1	1	0	3.3
  67.596  NVIDIA GeForce 8300						.*NVIDIA .*GeForce 83.*								3	1	1	3.3
  67.597 -NVIDIA GeForce 8400M					.*NVIDIA .*GeForce 8400M.*				1	1	1	3.3
  67.598 +NVIDIA GeForce 8400M					.*NVIDIA .*GeForce 840[0-9]M.*						1	1	1	3.3
  67.599  NVIDIA GeForce 8400						.*NVIDIA .*GeForce 84.*								2	1	1	3.3
  67.600  NVIDIA GeForce 8500						.*NVIDIA .*GeForce 85.*								2	1	1	3.3
  67.601 -NVIDIA GeForce 8600M					.*NVIDIA .*GeForce 8600M.*				2	1	1	3.3
  67.602 +NVIDIA GeForce 8600M					.*NVIDIA .*GeForce 860[0-9]M.*						2	1	1	3.3
  67.603  NVIDIA GeForce 8600						.*NVIDIA .*GeForce 86.*								3	1	1	3.3
  67.604 -NVIDIA GeForce 8700M					.*NVIDIA .*GeForce 8700M.*				2	1	1	3.3
  67.605 +NVIDIA GeForce 8700M					.*NVIDIA .*GeForce 870[0-9]M.*						2	1	1	3.3
  67.606  NVIDIA GeForce 8700						.*NVIDIA .*GeForce 87.*								3	1	0	0
  67.607 -NVIDIA GeForce 8800M					.*NVIDIA .*GeForce 8800M.*				2	1	1	3.3
  67.608 +NVIDIA GeForce 8800M					.*NVIDIA .*GeForce 880[0-9]M.*						2	1	1	3.3
  67.609  NVIDIA GeForce 8800						.*NVIDIA .*GeForce 88.*								3	1	1	3.3
  67.610 -NVIDIA GeForce 9100M					.*NVIDIA .*GeForce 9100M.*				0	1	0	0
  67.611 +NVIDIA GeForce 9100M					.*NVIDIA .*GeForce 910[0-9]M.*						0	1	0	3.3
  67.612  NVIDIA GeForce 9100						.*NVIDIA .*GeForce 91.*								0	1	0	3.3
  67.613 -NVIDIA GeForce 9200M					.*NVIDIA .*GeForce 9200M.*				1	1	0	3.1
  67.614 +NVIDIA GeForce 9200M					.*NVIDIA .*GeForce 920[0-9]M.*						1	1	0	3.3
  67.615  NVIDIA GeForce 9200						.*NVIDIA .*GeForce 92.*								1	1	0	3.3
  67.616 -NVIDIA GeForce 9300M					.*NVIDIA .*GeForce 9300M.*				1	1	1	3.3
  67.617 +NVIDIA GeForce 9300M					.*NVIDIA .*GeForce 930[0-9]M.*						1	1	1	3.3
  67.618  NVIDIA GeForce 9300						.*NVIDIA .*GeForce 93.*								1	1	1	3.3
  67.619 -NVIDIA GeForce 9400M					.*NVIDIA .*GeForce 9400M.*				2	1	1	3.3
  67.620 +NVIDIA GeForce 9400M					.*NVIDIA .*GeForce 940[0-9]M.*						2	1	1	3.3
  67.621  NVIDIA GeForce 9400						.*NVIDIA .*GeForce 94.*								3	1	1	3.3
  67.622 -NVIDIA GeForce 9500M					.*NVIDIA .*GeForce 9500M.*				1	1	1	3.3
  67.623 +NVIDIA GeForce 9500M					.*NVIDIA .*GeForce 950[0-9]M.*						1	1	1	3.3
  67.624  NVIDIA GeForce 9500						.*NVIDIA .*GeForce 95.*								3	1	1	3.3
  67.625 -NVIDIA GeForce 9600M					.*NVIDIA .*GeForce 9600M.*				2	1	1	3.3
  67.626 +NVIDIA GeForce 9600M					.*NVIDIA .*GeForce 960[0-9]M.*						2	1	1	3.3
  67.627  NVIDIA GeForce 9600						.*NVIDIA .*GeForce 96.*								3	1	1	3.3
  67.628 -NVIDIA GeForce 9700M					.*NVIDIA .*GeForce 9700M.*				0	1	1	3.3
  67.629 -NVIDIA GeForce 9800M					.*NVIDIA .*GeForce 9800M.*				2	1	1	3.3
  67.630 +NVIDIA GeForce 9700M					.*NVIDIA .*GeForce 970[0-9]M.*						0	1	1	3.3
  67.631 +NVIDIA GeForce 9800M					.*NVIDIA .*GeForce 980[0-9]M.*						2	1	1	3.3
  67.632  NVIDIA GeForce 9800						.*NVIDIA .*GeForce 98.*								3	1	1	3.3
  67.633  NVIDIA GeForce FX 5100					.*NVIDIA .*GeForce FX 51.*							0	1	0	0
  67.634  NVIDIA GeForce FX 5200					.*NVIDIA .*GeForce FX 52.*							0	1	0	2.1
  67.635 @@ -495,7 +459,7 @@
  67.636  NVIDIA GeForce FX 5800					.*NVIDIA .*GeForce FX 58.*							1	1	0	0
  67.637  NVIDIA GeForce FX 5900					.*NVIDIA .*GeForce FX 59.*							1	1	1	2.1
  67.638  NVIDIA GeForce FX Go5100				.*NVIDIA .*GeForce FX Go51.*						0	1	0	0
  67.639 -NVIDIA GeForce FX Go5200				.*NVIDIA .*GeForce FX Go52.*			0	1	0	0
  67.640 +NVIDIA GeForce FX Go5200				.*NVIDIA .*GeForce FX Go52.*						0	1	0	1.5
  67.641  NVIDIA GeForce FX Go5300				.*NVIDIA .*GeForce FX Go53.*						0	1	0	0
  67.642  NVIDIA GeForce FX Go5500				.*NVIDIA .*GeForce FX Go55.*						0	1	0	0
  67.643  NVIDIA GeForce FX Go5600				.*NVIDIA .*GeForce FX Go56.*						0	1	1	2.1
  67.644 @@ -504,13 +468,13 @@
  67.645  NVIDIA GeForce FX Go5900				.*NVIDIA .*GeForce FX Go59.*						1	1	0	0
  67.646  NVIDIA GeForce FX Go5xxx				.*NVIDIA .*GeForce FX Go.*							0	1	0	0
  67.647  NVIDIA GeForce Go 6100					.*NVIDIA .*GeForce Go 61.*							0	1	1	2.1
  67.648 -NVIDIA GeForce Go 6200					.*NVIDIA .*GeForce Go 62.*				0	1	0	0
  67.649 -NVIDIA GeForce Go 6400					.*NVIDIA .*GeForce Go 64.*				1	1	1	2
  67.650 +NVIDIA GeForce Go 6200					.*NVIDIA .*GeForce Go 62.*							0	1	0	1.5
  67.651 +NVIDIA GeForce Go 6400					.*NVIDIA .*GeForce Go 64.*							1	1	1	2.1
  67.652  NVIDIA GeForce Go 6500					.*NVIDIA .*GeForce Go 65.*							1	1	0	0
  67.653  NVIDIA GeForce Go 6600					.*NVIDIA .*GeForce Go 66.*							0	1	1	2.1
  67.654  NVIDIA GeForce Go 6700					.*NVIDIA .*GeForce Go 67.*							1	1	0	0
  67.655  NVIDIA GeForce Go 6800					.*NVIDIA .*GeForce Go 68.*							0	1	1	2.1
  67.656 -NVIDIA GeForce Go 7200					.*NVIDIA .*GeForce Go 72.*				1	1	0	0
  67.657 +NVIDIA GeForce Go 7200					.*NVIDIA .*GeForce Go 72.*							1	1	0	2.1
  67.658  NVIDIA GeForce Go 7300 LE				.*NVIDIA .*GeForce Go 73.*LE.*						1	1	0	0
  67.659  NVIDIA GeForce Go 7300					.*NVIDIA .*GeForce Go 73.*							1	1	1	2.1
  67.660  NVIDIA GeForce Go 7400					.*NVIDIA .*GeForce Go 74.*							1	1	1	2.1
  67.661 @@ -528,9 +492,9 @@
  67.662  NVIDIA NB9E								.*NVIDIA .*NB9E.*									3	1	0	0
  67.663  NVIDIA NB9M								.*NVIDIA .*NB9M.*									1	1	0	0
  67.664  NVIDIA NB9P								.*NVIDIA .*NB9P.*									2	1	0	0
  67.665 -NVIDIA N10								.*NVIDIA .*N10.*						1	1	0	0
  67.666 -NVIDIA GeForce PCX						.*GeForce PCX.*							0	1	0	0
  67.667 -NVIDIA Generic							.*NVIDIA .*Unknown.*					0	0	0	3
  67.668 +NVIDIA N10								.*NVIDIA .*N10.*									1	1	0	2.1
  67.669 +NVIDIA GeForce PCX						.*GeForce PCX.*										0	1	0	1.5
  67.670 +NVIDIA Generic							.*NVIDIA .*Unknown.*								0	0	0	2.1
  67.671  NVIDIA NV17								.*NVIDIA .*NV17.*									0	1	0	0
  67.672  NVIDIA NV34								.*NVIDIA .*NV34.*									0	1	0	0
  67.673  NVIDIA NV35								.*NVIDIA .*NV35.*									0	1	0	0
  67.674 @@ -540,7 +504,7 @@
  67.675  NVIDIA NV44								.*NVIDIA .*NV44.*									1	1	0	0
  67.676  NVIDIA nForce							.*NVIDIA .*nForce.*									0	0	0	3.3
  67.677  NVIDIA MCP51							.*NVIDIA .*MCP51.*									1	1	0	0
  67.678 -NVIDIA MCP61							.*NVIDIA .*MCP61.*						1	1	0	0
  67.679 +NVIDIA MCP61							.*NVIDIA .*MCP61.*									1	1	0	2.1
  67.680  NVIDIA MCP67							.*NVIDIA .*MCP67.*									1	1	0	0
  67.681  NVIDIA MCP68							.*NVIDIA .*MCP68.*									1	1	0	0
  67.682  NVIDIA MCP73							.*NVIDIA .*MCP73.*									1	1	0	0
  67.683 @@ -548,44 +512,44 @@
  67.684  NVIDIA MCP78							.*NVIDIA .*MCP78.*									1	1	0	0
  67.685  NVIDIA MCP79							.*NVIDIA .*MCP79.*									1	1	0	0
  67.686  NVIDIA MCP7A							.*NVIDIA .*MCP7A.*									1	1	0	0
  67.687 -NVIDIA Quadro2							.*Quadro2.*								0	1	0	0
  67.688 -NVIDIA Quadro 1000M						.*Quadro.*1000M.*						2	1	0	4.2
  67.689 -NVIDIA Quadro 2000 M/D					.*Quadro.*2000.*						3	1	0	4.2
  67.690 -NVIDIA Quadro 3000M						.*Quadro.*3000M.*						3	1	0	0
  67.691 -NVIDIA Quadro 4000M						.*Quadro.*4000M.*						3	1	0	0
  67.692 -NVIDIA Quadro 4000						.*Quadro *4000.*						3	1	0	4.2
  67.693 -NVIDIA Quadro 50x0 M					.*Quadro.*50.0.*						3	1	0	0
  67.694 +NVIDIA Quadro2							.*Quadro2.*											0	1	0	1.5
  67.695 +NVIDIA Quadro 1000M						.*Quadro.* (K1|1)00[0-9]M.*							2	1	0	4.2
  67.696 +NVIDIA Quadro 2000 M/D					.*Quadro.* (K2|2)000.*								3	1	0	4.2
  67.697 +NVIDIA Quadro 3000M						.*Quadro.* (K3|3)00[0-9]M.*							3	1	0	4.2
  67.698 +NVIDIA Quadro 4000M						.*Quadro.* (K4|4)00[0-9]M.*							3	1	0	4.2
  67.699 +NVIDIA Quadro 4000						.*Quadro 4000.*										3	1	0	4.2
  67.700 +NVIDIA Quadro 50x0 M					.*Quadro.* 50.0.*									3	1	0	4.2
  67.701  NVIDIA Quadro 6000						.*Quadro.* 6000.*									3	1	0	0
  67.702  NVIDIA Quadro 400						.*Quadro.* 400.*									2	1	0	3.3
  67.703 -NVIDIA Quadro 600						.*Quadro.*600.*							2	1	0	3.3
  67.704 -NVIDIA Quadro4							.*Quadro4.*								0	1	0	0
  67.705 +NVIDIA Quadro 600						.*Quadro.* 600.*									2	1	0	4.2
  67.706 +NVIDIA Quadro4							.*Quadro4.*											0	1	0	1.5
  67.707  NVIDIA Quadro DCC						.*Quadro DCC.*										0	1	0	0
  67.708  NVIDIA Quadro CX						.*Quadro.*CX.*										3	1	0	0
  67.709 -NVIDIA Quadro FX 770M					.*Quadro.*FX *770M.*					2	1	0	0
  67.710 -NVIDIA Quadro FX 1500M					.*Quadro.*FX *1500M.*					1	1	0	2.1
  67.711 -NVIDIA Quadro FX 1600M					.*Quadro.*FX *1600M.*					2	1	0	0
  67.712 -NVIDIA Quadro FX 2500M					.*Quadro.*FX *2500M.*					2	1	0	0
  67.713 -NVIDIA Quadro FX 2700M					.*Quadro.*FX *2700M.*					3	1	0	0
  67.714 -NVIDIA Quadro FX 2800M					.*Quadro.*FX *2800M.*					3	1	0	3.3
  67.715 -NVIDIA Quadro FX 3500					.*Quadro.*FX *3500.*					2	1	0	2.1
  67.716 -NVIDIA Quadro FX 3600					.*Quadro.*FX *3600.*					3	1	0	0
  67.717 -NVIDIA Quadro FX 3700					.*Quadro.*FX *3700.*					3	1	0	3.3
  67.718 -NVIDIA Quadro FX 3800					.*Quadro.*FX *3800.*					3	1	0	3.2
  67.719 -NVIDIA Quadro FX 4500					.*Quadro.*FX *45.*						3	1	0	0
  67.720 -NVIDIA Quadro FX 880M					.*Quadro.*FX *880M.*					3	1	0	3.3
  67.721 -NVIDIA Quadro FX 4800					.*NVIDIA .*Quadro *FX *4800.*			3	1	0	0
  67.722 +NVIDIA Quadro FX 770M					.*Quadro.*FX 77[0-9]M.*								2	1	0	3.3
  67.723 +NVIDIA Quadro FX 1500M					.*Quadro.*FX 150[0-9]M.*							1	1	0	2.1
  67.724 +NVIDIA Quadro FX 1600M					.*Quadro.*FX 160[0-9]M.*							2	1	0	3.3
  67.725 +NVIDIA Quadro FX 2500M					.*Quadro.*FX 250[0-9]M.*							2	1	0	2.1
  67.726 +NVIDIA Quadro FX 2700M					.*Quadro.*FX 270[0-9]M.*							3	1	0	3.3
  67.727 +NVIDIA Quadro FX 2800M					.*Quadro.*FX 280[0-9]M.*							3	1	0	3.3
  67.728 +NVIDIA Quadro FX 3500					.*Quadro.*FX 3500.*									2	1	0	2.1
  67.729 +NVIDIA Quadro FX 3600					.*Quadro.*FX 3600.*									3	1	0	3.3
  67.730 +NVIDIA Quadro FX 3700					.*Quadro.*FX 3700.*									3	1	0	3.3
  67.731 +NVIDIA Quadro FX 3800					.*Quadro.*FX 3800.*									3	1	0	3.3
  67.732 +NVIDIA Quadro FX 4500					.*Quadro.*FX 45.*									3	1	0	2.1
  67.733 +NVIDIA Quadro FX 880M					.*Quadro.*FX 88[0-9]M.*								3	1	0	3.3
  67.734 +NVIDIA Quadro FX 4800					.*NVIDIA .*Quadro FX 4800.*							3	1	0	3.1
  67.735  NVIDIA Quadro FX						.*Quadro FX.*										1	1	0	3.3
  67.736 -NVIDIA Quadro NVS 1xxM					.*Quadro NVS *1.[05]M.*					0	1	1	3.3
  67.737 -NVIDIA Quadro NVS 300M					.*NVIDIA .*NVS *300M.*					2	1	0	0
  67.738 -NVIDIA Quadro NVS 320M					.*NVIDIA .*NVS *320M.*					2	1	0	0
  67.739 -NVIDIA Quadro NVS 2100M					.*NVIDIA .*NVS *2100M.*					2	1	0	0
  67.740 -NVIDIA Quadro NVS 3100M					.*NVIDIA .*NVS *3100M.*					2	1	0	0
  67.741 -NVIDIA Quadro NVS 4200M					.*NVIDIA .*NVS *4200M.*					2	1	0	4.1
  67.742 -NVIDIA Quadro NVS 5100M					.*NVIDIA .*NVS *5100M.*					2	1	0	0
  67.743 -NVIDIA Quadro NVS						.*NVIDIA .*NVS							0	1	0	3.2
  67.744 +NVIDIA Quadro NVS 1xxM					.*Quadro NVS 1.[05]M.*								0	1	1	3.3
  67.745 +NVIDIA Quadro NVS 300M					.*NVIDIA .*NVS 30[0-9]M.*							2	1	0	0
  67.746 +NVIDIA Quadro NVS 320M					.*NVIDIA .*NVS 32[0-9]M.*							2	1	0	0
  67.747 +NVIDIA Quadro NVS 2100M					.*NVIDIA .*NVS 210[0-9]M.*							2	1	0	3.3
  67.748 +NVIDIA Quadro NVS 3100M					.*NVIDIA .*NVS 310[0-9]M.*							2	1	0	3.3
  67.749 +NVIDIA Quadro NVS 4200M					.*NVIDIA .*NVS 420[0-9]M.*							2	1	0	4.2
  67.750 +NVIDIA Quadro NVS 5100M					.*NVIDIA .*NVS 510[0-9]M.*							2	1	0	0
  67.751 +NVIDIA Quadro NVS						.*NVIDIA .*NVS										0	1	0	4.2
  67.752  NVIDIA Corporation N12P					.*NVIDIA .*N12P.*									1	1	1	4.1
  67.753 -NVIDIA Corporation N11M					.*NVIDIA .*N11M.*						2	1	0	0
  67.754 -NVIDIA RIVA TNT							.*RIVA TNT.*							0	0	0	0
  67.755 +NVIDIA Corporation N11M					.*NVIDIA .*N11M.*									2	1	0	3.1
  67.756 +NVIDIA RIVA TNT							.*RIVA TNT.*										0	0	0	1.5
  67.757  S3										.*S3 Graphics.*										0	0	1	1.4
  67.758  SiS										SiS.*												0	0	1	1.5
  67.759  Trident									Trident.*											0	0	0	0
    68.1 --- a/indra/newview/linux_tools/wrapper.sh	Thu Jul 18 17:27:31 2013 -0400
    68.2 +++ b/indra/newview/linux_tools/wrapper.sh	Mon Aug 26 17:53:30 2013 -0400
    68.3 @@ -121,37 +121,21 @@
    68.4  
    68.5  export LD_LIBRARY_PATH="$PWD/lib:${LD_LIBRARY_PATH}"
    68.6  
    68.7 -# Have to deal specially with gridargs.dat; typical contents look like:
    68.8 -# --channel "Second Life Test"  --settings settings_test.xml
    68.9 -# Simply embedding $(<etc/gridargs.dat) into a command line treats each of
   68.10 -# Second, Life and Developer as separate args -- no good. We need bash to
   68.11 -# process quotes using eval.
   68.12 -# First, check if we have been instructed to skip reading in gridargs.dat:
   68.13 -skip_gridargs=false
   68.14 -argnum=0
   68.15 +# Copy "$@" to ARGS array specifically to delete the --skip-gridargs switch.
   68.16 +# The gridargs.dat file is no more, but we still want to avoid breaking
   68.17 +# scripts that invoke this one with --skip-gridargs.
   68.18 +ARGS=()
   68.19  for ARG in "$@"; do
   68.20 -    if [ "--skip-gridargs" == "$ARG" ]; then
   68.21 -        skip_gridargs=true
   68.22 -    else
   68.23 -        ARGS[$argnum]="$ARG"
   68.24 -        argnum=$(($argnum+1))
   68.25 +    if [ "--skip-gridargs" != "$ARG" ]; then
   68.26 +        ARGS[${#ARGS[*]}]="$ARG"
   68.27      fi
   68.28  done
   68.29  
   68.30 -# Second, read it without scanning, then scan that string. Break quoted words
   68.31 -# into a bash array. Note that if gridargs.dat is empty, or contains only
   68.32 -# whitespace, the resulting gridargs array will be empty -- zero entries --
   68.33 -# therefore "${gridargs[@]}" entirely vanishes from the command line below,
   68.34 -# just as we want.
   68.35 -if ! $skip_gridargs ; then
   68.36 -    eval gridargs=("$(<etc/gridargs.dat)")
   68.37 -fi
   68.38 -
   68.39  # Run the program.
   68.40  # Don't quote $LL_WRAPPER because, if empty, it should simply vanish from the
   68.41 -# command line. But DO quote "$@": preserve separate args as individually
   68.42 -# quoted. Similar remarks about the contents of gridargs.
   68.43 -$LL_WRAPPER bin/do-not-directly-run-secondlife-bin "${gridargs[@]}" "${ARGS[@]}"
   68.44 +# command line. But DO quote "${ARGS[@]}": preserve separate args as
   68.45 +# individually quoted.
   68.46 +$LL_WRAPPER bin/do-not-directly-run-secondlife-bin "${ARGS[@]}"
   68.47  LL_RUN_ERR=$?
   68.48  
   68.49  # Handle any resulting errors
    69.1 --- a/indra/newview/llagent.cpp	Thu Jul 18 17:27:31 2013 -0400
    69.2 +++ b/indra/newview/llagent.cpp	Mon Aug 26 17:53:30 2013 -0400
    69.3 @@ -46,6 +46,7 @@
    69.4  #include "llenvmanager.h"
    69.5  #include "llfirstuse.h"
    69.6  #include "llfloatercamera.h"
    69.7 +#include "llfloaterimcontainer.h"
    69.8  #include "llfloaterreg.h"
    69.9  #include "llfloatertools.h"
   69.10  #include "llgroupactions.h"
   69.11 @@ -91,6 +92,7 @@
   69.12  #include "llworld.h"
   69.13  #include "llworldmap.h"
   69.14  #include "stringize.h"
   69.15 +#include "boost/foreach.hpp"
   69.16  
   69.17  using namespace LLAvatarAppearanceDefines;
   69.18  
   69.19 @@ -433,7 +435,7 @@
   69.20  {
   69.21  	mMoveTimer.start();
   69.22  
   69.23 -	gSavedSettings.declareBOOL("SlowMotionAnimation", FALSE, "Declared in code", FALSE);
   69.24 +	gSavedSettings.declareBOOL("SlowMotionAnimation", FALSE, "Declared in code", LLControlVariable::PERSIST_NO);
   69.25  	gSavedSettings.getControl("SlowMotionAnimation")->getSignal()->connect(boost::bind(&handleSlowMotionAnimation, _2));
   69.26  	
   69.27  	// *Note: this is where LLViewerCamera::getInstance() used to be constructed.
   69.28 @@ -2037,7 +2039,16 @@
   69.29  			{
   69.30  				skip_list.insert(LLFloaterReg::findInstance("mini_map"));
   69.31  			}
   69.32 -		
   69.33 +
   69.34 +			LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container");
   69.35 +			LLFloaterIMContainer::floater_list_t conversations;
   69.36 +			im_box->getDetachedConversationFloaters(conversations);
   69.37 +			BOOST_FOREACH(LLFloater* conversation, conversations)
   69.38 +			{
   69.39 +				llinfos << "skip_list.insert(session_floater): " << conversation->getTitle() << llendl;
   69.40 +				skip_list.insert(conversation);
   69.41 +			}
   69.42 +
   69.43  			gFloaterView->popVisibleAll(skip_list);
   69.44  #endif
   69.45  			mViewsPushed = FALSE;
    70.1 --- a/indra/newview/llappviewer.cpp	Thu Jul 18 17:27:31 2013 -0400
    70.2 +++ b/indra/newview/llappviewer.cpp	Mon Aug 26 17:53:30 2013 -0400
    70.3 @@ -668,7 +668,6 @@
    70.4  	mSecondInstance(false),
    70.5  	mSavedFinalSnapshot(false),
    70.6  	mSavePerAccountSettings(false),		// don't save settings on logout unless login succeeded.
    70.7 -	mForceGraphicsDetail(false),
    70.8  	mQuitRequested(false),
    70.9  	mLogoutRequestSent(false),
   70.10  	mYieldTime(-1),
   70.11 @@ -2307,17 +2306,24 @@
   70.12  	LLUIColorTable::instance().loadFromSettings();
   70.13  }
   70.14  
   70.15 +namespace
   70.16 +{
   70.17 +    void handleCommandLineError(LLControlGroupCLP& clp)
   70.18 +    {
   70.19 +		llwarns << "Error parsing command line options. Command Line options ignored."  << llendl;
   70.20 +
   70.21 +		llinfos << "Command line usage:\n" << clp << llendl;
   70.22 +
   70.23 +		OSMessageBox(STRINGIZE(LLTrans::getString("MBCmdLineError") << clp.getErrorMessage()),
   70.24 +					 LLStringUtil::null,
   70.25 +					 OSMB_OK);
   70.26 +    }
   70.27 +} // anonymous namespace
   70.28 +
   70.29  bool LLAppViewer::initConfiguration()
   70.30  {	
   70.31  	//Load settings files list
   70.32  	std::string settings_file_list = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "settings_files.xml");
   70.33 -	//LLControlGroup settings_control("SettingsFiles");
   70.34 -	//llinfos << "Loading settings file list " << settings_file_list << llendl;
   70.35 -	//if (0 == settings_control.loadFromFile(settings_file_list))
   70.36 -	//{
   70.37 - //       llerrs << "Cannot load default configuration file " << settings_file_list << llendl;
   70.38 -	//}
   70.39 -
   70.40  	LLXMLNodePtr root;
   70.41  	BOOL success  = LLXMLNode::parseFile(settings_file_list, root, NULL);
   70.42  	if (!success)
   70.43 @@ -2376,9 +2382,7 @@
   70.44  	{
   70.45  		c->setValue(true, false);
   70.46  	}
   70.47 -#endif
   70.48 -
   70.49 -#ifndef	LL_RELEASE_FOR_DOWNLOAD
   70.50 +
   70.51  	gSavedSettings.setBOOL("QAMode", TRUE );
   70.52  	gSavedSettings.setS32("WatchdogEnabled", 0);
   70.53  #endif
   70.54 @@ -2414,13 +2418,7 @@
   70.55  
   70.56  	if(!initParseCommandLine(clp))
   70.57  	{
   70.58 -		llwarns	<< "Error parsing command line options.	Command	Line options ignored."  << llendl;
   70.59 -		
   70.60 -		llinfos	<< "Command	line usage:\n" << clp << llendl;
   70.61 -
   70.62 -		std::ostringstream msg;
   70.63 -		msg << LLTrans::getString("MBCmdLineError") << clp.getErrorMessage();
   70.64 -		OSMessageBox(msg.str(),LLStringUtil::null,OSMB_OK);
   70.65 +		handleCommandLineError(clp);
   70.66  		return false;
   70.67  	}
   70.68  	
   70.69 @@ -2467,12 +2465,16 @@
   70.70  	loadSettingsFromDirectory("UserSession");
   70.71  
   70.72  	// - apply command line settings 
   70.73 -	clp.notify(); 
   70.74 +	if (! clp.notify())
   70.75 +	{
   70.76 +		handleCommandLineError(clp);
   70.77 +		return false;
   70.78 +	}
   70.79  
   70.80  	// Register the core crash option as soon as we can
   70.81  	// if we want gdb post-mortem on cores we need to be up and running
   70.82  	// ASAP or we might miss init issue etc.
   70.83 -	if(clp.hasOption("disablecrashlogger"))
   70.84 +	if(gSavedSettings.getBOOL("DisableCrashLogger"))
   70.85  	{
   70.86  		llwarns << "Crashes will be handled by system, stack trace logs and crash logger are both disabled" << llendl;
   70.87  		LLAppViewer::instance()->disableCrashlogger();
   70.88 @@ -2545,91 +2547,52 @@
   70.89          }
   70.90      }
   70.91  
   70.92 -    if(clp.hasOption("channel"))
   70.93 -    {
   70.94 -		LLVersionInfo::resetChannel(clp.getOption("channel")[0]);
   70.95 +	std::string CmdLineChannel(gSavedSettings.getString("CmdLineChannel"));
   70.96 +	if(! CmdLineChannel.empty())
   70.97 +	{
   70.98 +		LLVersionInfo::resetChannel(CmdLineChannel);
   70.99  	}
  70.100  
  70.101  	// If we have specified crash on startup, set the global so we'll trigger the crash at the right time
  70.102 -	if(clp.hasOption("crashonstartup"))
  70.103 -	{
  70.104 -		gCrashOnStartup = TRUE;
  70.105 -	}
  70.106 -
  70.107 -	if (clp.hasOption("logperformance"))
  70.108 +	gCrashOnStartup = gSavedSettings.getBOOL("CrashOnStartup");
  70.109 +
  70.110 +	if (gSavedSettings.getBOOL("LogPerformance"))
  70.111  	{
  70.112  		LLFastTimer::sLog = TRUE;
  70.113  		LLFastTimer::sLogName = std::string("performance");		
  70.114  	}
  70.115 -	
  70.116 -	if (clp.hasOption("logmetrics"))
  70.117 - 	{
  70.118 - 		LLFastTimer::sMetricLog = TRUE ;
  70.119 -		// '--logmetrics' can be specified with a named test metric argument so the data gathering is done only on that test
  70.120 -		// In the absence of argument, every metric is gathered (makes for a rather slow run and hard to decipher report...)
  70.121 -		std::string test_name = clp.getOption("logmetrics")[0];
  70.122 +
  70.123 +	std::string test_name(gSavedSettings.getString("LogMetrics"));
  70.124 +	if (! test_name.empty())
  70.125 +	{
  70.126 +		LLFastTimer::sMetricLog = TRUE ;
  70.127 +		// '--logmetrics' is specified with a named test metric argument so the data gathering is done only on that test
  70.128 +		// In the absence of argument, every metric would be gathered (makes for a rather slow run and hard to decipher report...)
  70.129  		llinfos << "'--logmetrics' argument : " << test_name << llendl;
  70.130 -		if (test_name == "")
  70.131 +		LLFastTimer::sLogName = test_name;
  70.132 + 	}
  70.133 +
  70.134 +	if (clp.hasOption("graphicslevel"))
  70.135 +	{
  70.136 +		// User explicitly requested --graphicslevel on the command line. We
  70.137 +		// expect this switch has already set RenderQualityPerformance. Check
  70.138 +		// that value for validity.
  70.139 +		U32 graphicslevel = gSavedSettings.getU32("RenderQualityPerformance");
  70.140 +		if (LLFeatureManager::instance().isValidGraphicsLevel(graphicslevel))
  70.141  		{
  70.142 -			llwarns << "No '--logmetrics' argument given, will output all metrics to " << DEFAULT_METRIC_NAME << llendl;
  70.143 -			LLFastTimer::sLogName = DEFAULT_METRIC_NAME;
  70.144 +			// graphicslevel is valid: save it and engage it later. Capture
  70.145 +			// the requested value separately from the settings variable
  70.146 +			// because, if this is the first run, LLViewerWindow's constructor
  70.147 +			// will call LLFeatureManager::applyRecommendedSettings(), which
  70.148 +			// overwrites this settings variable!
  70.149 +			mForceGraphicsLevel = graphicslevel;
  70.150  		}
  70.151 -		else
  70.152 -		{
  70.153 -			LLFastTimer::sLogName = test_name;
  70.154 -		}
  70.155 - 	}
  70.156 -
  70.157 -	if (clp.hasOption("graphicslevel"))
  70.158 -	{
  70.159 -		const LLCommandLineParser::token_vector_t& value = clp.getOption("graphicslevel");
  70.160 -        if(value.size() != 1)
  70.161 -        {
  70.162 -			llwarns << "Usage: -graphicslevel <0-3>" << llendl;
  70.163 -        }
  70.164 -        else
  70.165 -        {
  70.166 -			std::string detail = value.front();
  70.167 -			mForceGraphicsDetail = TRUE;
  70.168 -			
  70.169 -			switch (detail.c_str()[0])
  70.170 -			{
  70.171 -				case '0': 
  70.172 -					gSavedSettings.setU32("RenderQualityPerformance", 0);		
  70.173 -					break;
  70.174 -				case '1': 
  70.175 -					gSavedSettings.setU32("RenderQualityPerformance", 1);		
  70.176 -					break;
  70.177 -				case '2': 
  70.178 -					gSavedSettings.setU32("RenderQualityPerformance", 2);		
  70.179 -					break;
  70.180 -				case '3': 
  70.181 -					gSavedSettings.setU32("RenderQualityPerformance", 3);		
  70.182 -					break;
  70.183 -				default:
  70.184 -					mForceGraphicsDetail = FALSE;
  70.185 -					llwarns << "Usage: -graphicslevel <0-3>" << llendl;
  70.186 -					break;
  70.187 -			}
  70.188 -        }
  70.189 -	}
  70.190 -
  70.191 -	if (clp.hasOption("analyzeperformance"))
  70.192 -	{
  70.193 -		LLFastTimerView::sAnalyzePerformance = TRUE;
  70.194 -	}
  70.195 -
  70.196 -	if (clp.hasOption("replaysession"))
  70.197 -	{
  70.198 -		gAgentPilot.setReplaySession(TRUE);
  70.199 -	}
  70.200 -
  70.201 -	if (clp.hasOption("nonotifications"))
  70.202 -	{
  70.203 -		gSavedSettings.getControl("IgnoreAllNotifications")->setValue(true, false);
  70.204 -	}
  70.205 -	
  70.206 -	if (clp.hasOption("debugsession"))
  70.207 +	}
  70.208 +
  70.209 +	LLFastTimerView::sAnalyzePerformance = gSavedSettings.getBOOL("AnalyzePerformance");
  70.210 +	gAgentPilot.setReplaySession(gSavedSettings.getBOOL("ReplaySession"));
  70.211 +
  70.212 +	if (gSavedSettings.getBOOL("DebugSession"))
  70.213  	{
  70.214  		gDebugSession = TRUE;
  70.215  		gDebugGL = TRUE;
  70.216 @@ -2654,20 +2617,16 @@
  70.217      // What can happen is that someone can use IE (or potentially 
  70.218      // other browsers) and do the rough equivalent of command 
  70.219      // injection and steal passwords. Phoenix. SL-55321
  70.220 -    if(clp.hasOption("url"))
  70.221 -    {
  70.222 -		LLStartUp::setStartSLURL(LLSLURL(clp.getOption("url")[0]));
  70.223 -		if(LLStartUp::getStartSLURL().getType() == LLSLURL::LOCATION) 
  70.224 +	std::string CmdLineLoginLocation(gSavedSettings.getString("CmdLineLoginLocation"));
  70.225 +	if(! CmdLineLoginLocation.empty())
  70.226 +	{
  70.227 +		LLSLURL start_slurl(CmdLineLoginLocation);
  70.228 +		LLStartUp::setStartSLURL(start_slurl);
  70.229 +		if(start_slurl.getType() == LLSLURL::LOCATION) 
  70.230  		{  
  70.231 -			LLGridManager::getInstance()->setGridChoice(LLStartUp::getStartSLURL().getGrid());
  70.232 -			
  70.233 -		}  
  70.234 -    }
  70.235 -    else if(clp.hasOption("slurl"))
  70.236 -    {
  70.237 -		LLSLURL start_slurl(clp.getOption("slurl")[0]);
  70.238 -		LLStartUp::setStartSLURL(start_slurl);
  70.239 -    }
  70.240 +			LLGridManager::getInstance()->setGridChoice(start_slurl.getGrid());
  70.241 +		}
  70.242 +	}
  70.243  
  70.244  	const LLControlVariable* skinfolder = gSavedSettings.getControl("SkinCurrent");
  70.245  	if(skinfolder && LLStringUtil::null != skinfolder->getValue().asString())
  70.246 @@ -2810,9 +2769,8 @@
  70.247  		LL_DEBUGS("AppInit")<<"set start from NextLoginLocation: "<<nextLoginLocation<<LL_ENDL;
  70.248  		LLStartUp::setStartSLURL(LLSLURL(nextLoginLocation));
  70.249  	}
  70.250 -	else if (   (   clp.hasOption("login") || clp.hasOption("autologin"))
  70.251 -			 && !clp.hasOption("url")
  70.252 -			 && !clp.hasOption("slurl"))
  70.253 +	else if ((clp.hasOption("login") || clp.hasOption("autologin"))
  70.254 +			 && gSavedSettings.getString("CmdLineLoginLocation").empty())
  70.255  	{
  70.256  		// If automatic login from command line with --login switch
  70.257  		// init StartSLURL location.
  70.258 @@ -3048,13 +3006,19 @@
  70.259  void LLAppViewer::initUpdater()
  70.260  {
  70.261  	// Initialize the updater service.
  70.262 -	// Generate URL to the udpater service
  70.263  	// Get Channel
  70.264  	// Get Version
  70.265 -	std::string url = gSavedSettings.getString("UpdaterServiceURL");
  70.266 +
  70.267 +	/*****************************************************************
  70.268 +	 * Previously, the url was derived from the settings 
  70.269 +	 *    UpdaterServiceURL
  70.270 +	 *    UpdaterServicePath
  70.271 +	 * it is now obtained from the grid manager.  The settings above
  70.272 +	 * are no longer used.
  70.273 +	 *****************************************************************/
  70.274  	std::string channel = LLVersionInfo::getChannel();
  70.275  	std::string version = LLVersionInfo::getVersion();
  70.276 -	std::string service_path = gSavedSettings.getString("UpdaterServicePath");
  70.277 +
  70.278  	U32 check_period = gSavedSettings.getU32("UpdaterServiceCheckPeriod");
  70.279  	bool willing_to_test;
  70.280  	LL_DEBUGS("UpdaterService") << "channel " << channel << LL_ENDL;
  70.281 @@ -3079,9 +3043,7 @@
  70.282  	}
  70.283  
  70.284  	mUpdater->setAppExitCallback(boost::bind(&LLAppViewer::forceQuit, this));
  70.285 -	mUpdater->initialize(url, 
  70.286 -						 service_path, 
  70.287 -						 channel, 
  70.288 +	mUpdater->initialize(channel, 
  70.289  						 version,
  70.290  						 gPlatform,
  70.291  						 getOSInfo().getOSVersionString(),
  70.292 @@ -3186,11 +3148,12 @@
  70.293  	// Initialize GL stuff
  70.294  	//
  70.295  
  70.296 -	if (mForceGraphicsDetail)
  70.297 -	{
  70.298 -		LLFeatureManager::getInstance()->setGraphicsLevel(gSavedSettings.getU32("RenderQualityPerformance"), false);
  70.299 -	}
  70.300 -			
  70.301 +	if (mForceGraphicsLevel)
  70.302 +	{
  70.303 +		LLFeatureManager::getInstance()->setGraphicsLevel(*mForceGraphicsLevel, false);
  70.304 +		gSavedSettings.setU32("RenderQualityPerformance", *mForceGraphicsLevel);
  70.305 +	}
  70.306 +
  70.307  	// Set this flag in case we crash while initializing GL
  70.308  	gSavedSettings.setBOOL("RenderInitError", TRUE);
  70.309  	gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
  70.310 @@ -4599,11 +4562,6 @@
  70.311  				llinfos << "Dead object updates: " << gObjectList.mNumDeadObjectUpdates << llendl;
  70.312  				gObjectList.mNumDeadObjectUpdates = 0;
  70.313  			}
  70.314 -			if (gObjectList.mNumUnknownKills)
  70.315 -			{
  70.316 -				llinfos << "Kills on unknown objects: " << gObjectList.mNumUnknownKills << llendl;
  70.317 -				gObjectList.mNumUnknownKills = 0;
  70.318 -			}
  70.319  			if (gObjectList.mNumUnknownUpdates)
  70.320  			{
  70.321  				llinfos << "Unknown object updates: " << gObjectList.mNumUnknownUpdates << llendl;
    71.1 --- a/indra/newview/llappviewer.h	Thu Jul 18 17:27:31 2013 -0400
    71.2 +++ b/indra/newview/llappviewer.h	Mon Aug 26 17:53:30 2013 -0400
    71.3 @@ -32,6 +32,7 @@
    71.4  #include "llsys.h"			// for LLOSInfo
    71.5  #include "lltimer.h"
    71.6  #include "llappcorehttp.h"
    71.7 +#include <boost/optional.hpp>
    71.8  
    71.9  class LLCommandLineParser;
   71.10  class LLFrameTimer;
   71.11 @@ -258,7 +259,7 @@
   71.12  	bool mSavedFinalSnapshot;
   71.13  	bool mSavePerAccountSettings;		// only save per account settings if login succeeded
   71.14  
   71.15 -	bool mForceGraphicsDetail;
   71.16 +	boost::optional<U32> mForceGraphicsLevel;
   71.17  
   71.18      bool mQuitRequested;				// User wants to quit, may have modified documents open.
   71.19      bool mLogoutRequestSent;			// Disconnect message sent to simulator, no longer safe to send messages to the sim.
    72.1 --- a/indra/newview/llappviewermacosx.cpp	Thu Jul 18 17:27:31 2013 -0400
    72.2 +++ b/indra/newview/llappviewermacosx.cpp	Mon Aug 26 17:53:30 2013 -0400
    72.3 @@ -148,28 +148,13 @@
    72.4  	// The next two lines add the support for parsing the mac -psn_XXX arg.
    72.5  	clp.addOptionDesc("psn", NULL, 1, "MacOSX process serial number");
    72.6  	clp.setCustomParser(parse_psn);
    72.7 -	
    72.8 -    // First read in the args from arguments txt.
    72.9 -    const char* filename = "arguments.txt";
   72.10 -	llifstream ifs(filename, llifstream::binary);
   72.11 -	if (!ifs.is_open())
   72.12 -	{
   72.13 -		llwarns << "Unable to open file" << filename << llendl;
   72.14 -		return false;
   72.15 -	}
   72.16 -	
   72.17 -	if(clp.parseCommandLineFile(ifs) == false)
   72.18 +
   72.19 +	// parse the user's command line
   72.20 +	if(clp.parseCommandLine(gArgC, gArgV) == false)
   72.21  	{
   72.22  		return false;
   72.23  	}
   72.24  
   72.25 -	// Then parse the user's command line, so that any --url arg can appear last
   72.26 -	// Succesive calls to clp.parse... will NOT override earlier options. 
   72.27 -	if(clp.parseCommandLine(gArgC, gArgV) == false)
   72.28 -	{
   72.29 -		return false;
   72.30 -	}
   72.31 -    	
   72.32  	// Get the user's preferred language string based on the Mac OS localization mechanism.
   72.33  	// To add a new localization:
   72.34  		// go to the "Resources" section of the project
    73.1 --- a/indra/newview/llchannelmanager.cpp	Thu Jul 18 17:27:31 2013 -0400
    73.2 +++ b/indra/newview/llchannelmanager.cpp	Mon Aug 26 17:53:30 2013 -0400
    73.3 @@ -139,8 +139,6 @@
    73.4  	}
    73.5  
    73.6  	LLPersistentNotificationStorage::getInstance()->loadNotifications();
    73.7 -
    73.8 -	LLDoNotDisturbNotificationStorage::getInstance()->initialize();
    73.9  	LLDoNotDisturbNotificationStorage::getInstance()->loadNotifications();
   73.10  }
   73.11  
    74.1 --- a/indra/newview/llchatbar.cpp	Thu Jul 18 17:27:31 2013 -0400
    74.2 +++ b/indra/newview/llchatbar.cpp	Mon Aug 26 17:53:30 2013 -0400
    74.3 @@ -381,7 +381,7 @@
    74.4  			if (!utf8_revised_text.empty())
    74.5  			{
    74.6  				// Chat with animation
    74.7 -				sendChatFromViewer(utf8_revised_text, type, TRUE);
    74.8 +				sendChatFromViewer(utf8_revised_text, type, gSavedSettings.getBOOL("PlayChatAnim"));
    74.9  			}
   74.10  		}
   74.11  	}
    75.1 --- a/indra/newview/llchathistory.cpp	Thu Jul 18 17:27:31 2013 -0400
    75.2 +++ b/indra/newview/llchathistory.cpp	Mon Aug 26 17:53:30 2013 -0400
    75.3 @@ -628,6 +628,7 @@
    75.4  	editor_params.enabled = false; // read only
    75.5  	editor_params.show_context_menu = "true";
    75.6  	mEditor = LLUICtrlFactory::create<LLTextEditor>(editor_params, this);
    75.7 +	mEditor->setIsFriendCallback(LLAvatarActions::isFriend);
    75.8  }
    75.9  
   75.10  LLSD LLChatHistory::getValue() const
    76.1 --- a/indra/newview/llchatitemscontainerctrl.cpp	Thu Jul 18 17:27:31 2013 -0400
    76.2 +++ b/indra/newview/llchatitemscontainerctrl.cpp	Mon Aug 26 17:53:30 2013 -0400
    76.3 @@ -323,12 +323,11 @@
    76.4  			return TRUE;
    76.5  		else
    76.6  		{
    76.7 -			(LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat"))->showHistory();
    76.8 +			LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat")->showHistory();
    76.9  			return FALSE;
   76.10  		}
   76.11  	}
   76.12 -
   76.13 -	(LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat"))->showHistory();
   76.14 +	LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat")->showHistory();
   76.15  	return LLPanel::handleMouseUp(x,y,mask);
   76.16  }
   76.17  
    77.1 --- a/indra/newview/llcommandlineparser.cpp	Thu Jul 18 17:27:31 2013 -0400
    77.2 +++ b/indra/newview/llcommandlineparser.cpp	Mon Aug 26 17:53:30 2013 -0400
    77.3 @@ -38,16 +38,23 @@
    77.4  #endif
    77.5  
    77.6  #include <boost/program_options.hpp>
    77.7 +#include <boost/lexical_cast.hpp>
    77.8  #include <boost/bind.hpp>
    77.9 -#include<boost/tokenizer.hpp>
   77.10 +#include <boost/tokenizer.hpp>
   77.11 +#include <boost/assign/list_of.hpp>
   77.12  
   77.13  #if _MSC_VER
   77.14  #   pragma warning(pop)
   77.15  #endif
   77.16  
   77.17  #include "llsdserialize.h"
   77.18 +#include "llerror.h"
   77.19 +#include "stringize.h"
   77.20 +#include <string>
   77.21 +#include <set>
   77.22  #include <iostream>
   77.23  #include <sstream>
   77.24 +#include <typeinfo>
   77.25  
   77.26  #include "llcontrol.h"
   77.27  
   77.28 @@ -63,10 +70,22 @@
   77.29  // This could be good or bad, and probably won't matter for most use cases.
   77.30  namespace 
   77.31  {
   77.32 +    // List of command-line switches that can't map-to settings variables.
   77.33 +    // Going forward, we want every new command-line switch to map-to some
   77.34 +    // settings variable. This list is used to validate that.
   77.35 +    const std::set<std::string> unmapped_options = boost::assign::list_of
   77.36 +        ("help")
   77.37 +        ("set")
   77.38 +        ("setdefault")
   77.39 +        ("settings")
   77.40 +        ("sessionsettings")
   77.41 +        ("usersessionsettings")
   77.42 +    ;
   77.43 +
   77.44      po::options_description gOptionsDesc;
   77.45      po::positional_options_description gPositionalOptions;
   77.46  	po::variables_map gVariableMap;
   77.47 -    
   77.48 +
   77.49      const LLCommandLineParser::token_vector_t gEmptyValue;
   77.50  
   77.51      void read_file_into_string(std::string& str, const std::basic_istream < char >& file)
   77.52 @@ -384,9 +403,19 @@
   77.53      return parseCommandLineString(args);
   77.54  }
   77.55  
   77.56 -void LLCommandLineParser::notify()
   77.57 +bool LLCommandLineParser::notify()
   77.58  {
   77.59 -    po::notify(gVariableMap);    
   77.60 +    try
   77.61 +    {
   77.62 +        po::notify(gVariableMap);
   77.63 +        return true;
   77.64 +    }
   77.65 +    catch (const LLCLPError& e)
   77.66 +    {
   77.67 +        llwarns << "Caught Error: " << e.what() << llendl;
   77.68 +        mErrorMsg = e.what();
   77.69 +        return false;
   77.70 +    }
   77.71  }
   77.72  
   77.73  void LLCommandLineParser::printOptions() const
   77.74 @@ -428,43 +457,129 @@
   77.75  //----------------------------------------------------------------------------
   77.76  // LLControlGroupCLP defintions
   77.77  //----------------------------------------------------------------------------
   77.78 +namespace {
   77.79 +LLCommandLineParser::token_vector_t::value_type
   77.80 +onevalue(const std::string& option,
   77.81 +         const LLCommandLineParser::token_vector_t& value)
   77.82 +{
   77.83 +    if (value.empty())
   77.84 +    {
   77.85 +        // What does it mean when the user specifies a command-line switch
   77.86 +        // that requires a value, but omits the value? Complain.
   77.87 +        throw LLCLPError(STRINGIZE("No value specified for --" << option << "!"));
   77.88 +    }
   77.89 +    else if (value.size() > 1)
   77.90 +    {
   77.91 +        llwarns << "Ignoring extra tokens specified for --"
   77.92 +                << option << "." << llendl; 
   77.93 +    }
   77.94 +    return value[0];
   77.95 +}
   77.96 +
   77.97 +void badvalue(const std::string& option,
   77.98 +              const std::string& varname,
   77.99 +              const std::string& type,
  77.100 +              const std::string& value)
  77.101 +{
  77.102 +    // If the user passes an unusable value for a command-line switch, it
  77.103 +    // seems like a really bad idea to just ignore it, even with a log
  77.104 +    // warning.
  77.105 +    throw LLCLPError(STRINGIZE("Invalid value specified by command-line switch '" << option
  77.106 +                               << "' for variable '" << varname << "' of type " << type
  77.107 +                               << ": '" << value << "'"));
  77.108 +}
  77.109 +
  77.110 +template <typename T>
  77.111 +T convertTo(const std::string& option,
  77.112 +            const std::string& varname,
  77.113 +            const LLCommandLineParser::token_vector_t::value_type& value)
  77.114 +{
  77.115 +    try
  77.116 +    {
  77.117 +        return boost::lexical_cast<T>(value);
  77.118 +    }
  77.119 +    catch (const boost::bad_lexical_cast&)
  77.120 +    {
  77.121 +        badvalue(option, varname, typeid(T).name(), value);
  77.122 +        // bogus return; compiler unaware that badvalue() won't return
  77.123 +        return T();
  77.124 +    }
  77.125 +}
  77.126 +
  77.127  void setControlValueCB(const LLCommandLineParser::token_vector_t& value, 
  77.128 -                       const std::string& opt_name, 
  77.129 -                       LLControlGroup* ctrlGroup)
  77.130 +                       const std::string& option, 
  77.131 +                       LLControlVariable* ctrl)
  77.132  {
  77.133 -    // *FIX: Do sematic conversion here.
  77.134 +    // *FIX: Do semantic conversion here.
  77.135      // LLSD (ImplString) Is no good for doing string to type conversion for...
  77.136      // booleans
  77.137      // compound types
  77.138      // ?...
  77.139  
  77.140 -    LLControlVariable* ctrl = ctrlGroup->getControl(opt_name);
  77.141      if(NULL != ctrl)
  77.142      {
  77.143          switch(ctrl->type())
  77.144          {
  77.145          case TYPE_BOOLEAN:
  77.146 -            if(value.size() > 1)
  77.147 +            if (value.empty())
  77.148              {
  77.149 -                llwarns << "Ignoring extra tokens." << llendl; 
  77.150 +                // Boolean-valued command-line switches are unusual. If you
  77.151 +                // simply specify the switch without an explicit value, we can
  77.152 +                // infer you mean 'true'.
  77.153 +                ctrl->setValue(LLSD(true), false);
  77.154              }
  77.155 -              
  77.156 -            if(value.size() > 0)
  77.157 +            else
  77.158              {
  77.159 +                // Only call onevalue() AFTER handling value.empty() case!
  77.160 +                std::string token(onevalue(option, value));
  77.161 +            
  77.162                  // There's a token. check the string for true/false/1/0 etc.
  77.163                  BOOL result = false;
  77.164 -                BOOL gotSet = LLStringUtil::convertToBOOL(value[0], result);
  77.165 -                if(gotSet)
  77.166 +                BOOL gotSet = LLStringUtil::convertToBOOL(token, result);
  77.167 +                if (gotSet)
  77.168                  {
  77.169                      ctrl->setValue(LLSD(result), false);
  77.170                  }
  77.171 +                else
  77.172 +                {
  77.173 +                    badvalue(option, ctrl->getName(), "bool", token);
  77.174 +                }
  77.175 +            }
  77.176 +            break;
  77.177 +
  77.178 +        case TYPE_U32:
  77.179 +        {
  77.180 +            std::string token(onevalue(option, value));
  77.181 +            // To my surprise, for an unsigned target, lexical_cast() doesn't
  77.182 +            // complain about an input string such as "-17". In that case, you
  77.183 +            // get a very large positive result. So for U32, make sure there's
  77.184 +            // no minus sign!
  77.185 +            if (token.find('-') == std::string::npos)
  77.186 +            {
  77.187 +                ctrl->setValue(LLSD::Integer(convertTo<U32>(option, ctrl->getName(), token)),
  77.188 +                               false);
  77.189              }
  77.190              else
  77.191              {
  77.192 -                ctrl->setValue(LLSD(true), false);
  77.193 +                badvalue(option, ctrl->getName(), "unsigned", token);
  77.194              }
  77.195              break;
  77.196 +        }
  77.197  
  77.198 +        case TYPE_S32:
  77.199 +            ctrl->setValue(convertTo<S32>(option, ctrl->getName(),
  77.200 +                                          onevalue(option, value)), false);
  77.201 +            break;
  77.202 +
  77.203 +        case TYPE_F32:
  77.204 +            ctrl->setValue(convertTo<F32>(option, ctrl->getName(),
  77.205 +                                          onevalue(option, value)), false);
  77.206 +            break;
  77.207 +
  77.208 +        // It appears that no one has yet tried to define a command-line
  77.209 +        // switch mapped to a settings variable of TYPE_VEC3, TYPE_VEC3D,
  77.210 +        // TYPE_RECT, TYPE_COL4, TYPE_COL3. Such types would certainly seem to
  77.211 +        // call for a bit of special handling here...
  77.212          default:
  77.213              {
  77.214                  // For the default types, let llsd do the conversion.
  77.215 @@ -481,16 +596,9 @@
  77.216  
  77.217                      ctrl->setValue(llsdArray, false);
  77.218                  }
  77.219 -                else if(value.size() > 0)
  77.220 +                else
  77.221                  {
  77.222 -					if(value.size() > 1)
  77.223 -					{
  77.224 -						llwarns << "Ignoring extra tokens mapped to the setting: " << opt_name << "." << llendl; 
  77.225 -					}
  77.226 -
  77.227 -                    LLSD llsdValue;
  77.228 -                    llsdValue.assign(LLSD::String(value[0]));
  77.229 -                    ctrl->setValue(llsdValue, false);
  77.230 +                    ctrl->setValue(onevalue(option, value), false);
  77.231                  }
  77.232              }
  77.233              break;
  77.234 @@ -498,12 +606,14 @@
  77.235      }
  77.236      else
  77.237      {
  77.238 -        llwarns << "Command Line option mapping '" 
  77.239 -            << opt_name 
  77.240 -            << "' not found! Ignoring." 
  77.241 -            << llendl;
  77.242 +        // This isn't anything a user can affect -- it's a misconfiguration on
  77.243 +        // the part of the coder. Rub the coder's nose in the problem right
  77.244 +        // away so even preliminary testing will surface it.
  77.245 +        llerrs << "Command Line option --" << option
  77.246 +               << " maps to unknown setting!" << llendl;
  77.247      }
  77.248  }
  77.249 +} // anonymous namespace
  77.250  
  77.251  void LLControlGroupCLP::configure(const std::string& config_filename, LLControlGroup* controlGroup)
  77.252  {
  77.253 @@ -561,11 +671,37 @@
  77.254              }
  77.255  
  77.256              boost::function1<void, const token_vector_t&> callback;
  77.257 -            if(option_params.has("map-to") && (NULL != controlGroup))
  77.258 +            if (! option_params.has("map-to"))
  77.259 +            {
  77.260 +                // If this option isn't mapped to a settings variable, is it
  77.261 +                // one of the ones for which that's unreasonable, or did
  77.262 +                // someone carelessly add a new option? (Make all these
  77.263 +                // configuration errors fatal so a maintainer will catch them
  77.264 +                // right away.)
  77.265 +                std::set<std::string>::const_iterator found = unmapped_options.find(long_name);
  77.266 +                if (found == unmapped_options.end())
  77.267 +                {
  77.268 +                    llerrs << "New command-line option " << long_name
  77.269 +                           << " should map-to a variable in settings.xml" << llendl;
  77.270 +                }
  77.271 +            }
  77.272 +            else                    // option specifies map-to
  77.273              {
  77.274                  std::string controlName = option_params["map-to"].asString();
  77.275 -                callback = boost::bind(setControlValueCB, _1, 
  77.276 -                                       controlName, controlGroup);
  77.277 +                if (! controlGroup)
  77.278 +                {
  77.279 +                    llerrs << "Must pass gSavedSettings to LLControlGroupCLP::configure() for "
  77.280 +                           << long_name << " (map-to " << controlName << ")" << llendl;
  77.281 +                }
  77.282 +
  77.283 +                LLControlVariable* ctrl = controlGroup->getControl(controlName);
  77.284 +                if (! ctrl)
  77.285 +                {
  77.286 +                    llerrs << "Option " << long_name << " specifies map-to " << controlName
  77.287 +                           << " which does not exist" << llendl;
  77.288 +                }
  77.289 +
  77.290 +                callback = boost::bind(setControlValueCB, _1, long_name, ctrl);
  77.291              }
  77.292  
  77.293              this->addOptionDesc(
    78.1 --- a/indra/newview/llcommandlineparser.h	Thu Jul 18 17:27:31 2013 -0400
    78.2 +++ b/indra/newview/llcommandlineparser.h	Mon Aug 26 17:53:30 2013 -0400
    78.3 @@ -86,7 +86,7 @@
    78.4  	 * 
    78.5  	 * Use this to handle the results of parsing. 
    78.6  	 */
    78.7 -	void notify();
    78.8 +	bool notify();
    78.9  	
   78.10  	/** @brief Print a description of the configured options.
   78.11  	 *
    79.1 --- a/indra/newview/llconversationmodel.cpp	Thu Jul 18 17:27:31 2013 -0400
    79.2 +++ b/indra/newview/llconversationmodel.cpp	Mon Aug 26 17:53:30 2013 -0400
    79.3 @@ -363,7 +363,10 @@
    79.4      lldebugs << "LLConversationItemParticipant::buildContextMenu()" << llendl;
    79.5      menuentry_vec_t items;
    79.6      menuentry_vec_t disabled_items;
    79.7 -
    79.8 +    if((flags & ITEM_IN_MULTI_SELECTION) && (this->getType() != CONV_SESSION_NEARBY))
    79.9 +    {
   79.10 +    	items.push_back(std::string("close_selected_conversations"));
   79.11 +    }
   79.12      if(this->getType() == CONV_SESSION_1_ON_1)
   79.13      {
   79.14          items.push_back(std::string("close_conversation"));
   79.15 @@ -386,6 +389,10 @@
   79.16          addVoiceOptions(items);
   79.17          items.push_back(std::string("chat_history"));
   79.18      }
   79.19 +    else if(this->getType() == CONV_SESSION_NEARBY)
   79.20 +    {
   79.21 +        items.push_back(std::string("chat_history"));
   79.22 +    }
   79.23  
   79.24      hide_context_entries(menu, items, disabled_items);
   79.25  }
    80.1 --- a/indra/newview/llconversationmodel.h	Thu Jul 18 17:27:31 2013 -0400
    80.2 +++ b/indra/newview/llconversationmodel.h	Mon Aug 26 17:53:30 2013 -0400
    80.3 @@ -252,11 +252,10 @@
    80.4  	const std::string& 	getName() const { return mEmpty; }
    80.5  	const std::string& 	getFilterText() { return mEmpty; }
    80.6  	void 				setModified(EFilterModified behavior = FILTER_RESTART) { }
    80.7 -		
    80.8 -	void 				setFilterCount(S32 count) { }
    80.9 -	S32 				getFilterCount() const { return 0; }
   80.10 -	void 				decrementFilterCount() { }
   80.11 -		
   80.12 +
   80.13 +  	void 				resetTime(S32 timeout) { }
   80.14 +    bool                isTimedOut() { return false; }
   80.15 +   
   80.16  	bool 				isDefault() const { return true; }
   80.17  	bool 				isNotDefault() const { return false; }
   80.18  	void 				markDefault() { }
    81.1 --- a/indra/newview/llconversationview.cpp	Thu Jul 18 17:27:31 2013 -0400
    81.2 +++ b/indra/newview/llconversationview.cpp	Mon Aug 26 17:53:30 2013 -0400
    81.3 @@ -118,9 +118,19 @@
    81.4  	mFlashTimer->stopFlashing();
    81.5  }
    81.6  
    81.7 +void LLConversationViewSession::setHighlightState(bool hihglight_state)
    81.8 +{
    81.9 +	mFlashStateOn = hihglight_state;
   81.10 +	mFlashStarted = true;
   81.11 +	mFlashTimer->stopFlashing();
   81.12 +}
   81.13 +
   81.14  void LLConversationViewSession::startFlashing()
   81.15  {
   81.16 -	if (isInVisibleChain() && mFlashStateOn && !mFlashStarted)
   81.17 +	LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container");
   81.18 +
   81.19 +	// Need to start flashing only when "Conversations" is opened or brought on top
   81.20 +	if (isInVisibleChain() && !im_box->isMinimized() && mFlashStateOn && !mFlashStarted)
   81.21  	{
   81.22  		mFlashStarted = true;
   81.23  		mFlashTimer->startFlashing();
   81.24 @@ -263,6 +273,29 @@
   81.25  	return result;
   81.26  }
   81.27  
   81.28 +BOOL LLConversationViewSession::handleMouseUp( S32 x, S32 y, MASK mask )
   81.29 +{
   81.30 +	BOOL result = LLFolderViewFolder::handleMouseUp(x, y, mask);
   81.31 +
   81.32 +	LLFloater* volume_floater = LLFloaterReg::findInstance("floater_voice_volume");
   81.33 +	LLFloater* chat_volume_floater = LLFloaterReg::findInstance("chat_voice");
   81.34 +	if (result 
   81.35 +		&& getRoot()
   81.36 +		&& !(volume_floater && volume_floater->isShown() && volume_floater->hasFocus())
   81.37 +		&& !(chat_volume_floater && chat_volume_floater->isShown() && chat_volume_floater->hasFocus()))
   81.38 +	{
   81.39 +		LLConversationItem* item = dynamic_cast<LLConversationItem *>(getViewModelItem());
   81.40 +		LLUUID session_id = item? item->getUUID() : LLUUID();
   81.41 +		LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(session_id);
   81.42 +		if(!session_floater->hasFocus())
   81.43 +		{
   81.44 +			session_floater->setFocus(true);
   81.45 +		}
   81.46 +    }
   81.47 +
   81.48 +	return result;
   81.49 +}
   81.50 +
   81.51  BOOL LLConversationViewSession::handleRightMouseDown( S32 x, S32 y, MASK mask )
   81.52  {
   81.53      BOOL result = LLFolderViewFolder::handleRightMouseDown(x, y, mask);
   81.54 @@ -340,16 +373,20 @@
   81.55  {
   81.56  	// Do this only if the conversation floater has been torn off (i.e. no multi floater host) and is not minimized
   81.57  	// Note: minimized dockable floaters are brought to front hence unminimized when made visible and we don't want that here
   81.58 -	LLFolderViewModelItem* item = mViewModelItem;
   81.59 -	LLUUID session_uuid = dynamic_cast<LLConversationItem*>(item)->getUUID();
   81.60 -	LLFloater* session_floater = LLFloaterIMSessionTab::getConversation(session_uuid);
   81.61 -	
   81.62 -	if (session_floater && !session_floater->getHost() && !session_floater->isMinimized())
   81.63 +	LLFloater* session_floater = getSessionFloater();
   81.64 +	if (session_floater && session_floater->isDetachedAndNotMinimized())
   81.65  	{
   81.66  		session_floater->setVisible(visible);
   81.67  	}
   81.68  }
   81.69  
   81.70 +LLFloater* LLConversationViewSession::getSessionFloater()
   81.71 +{
   81.72 +	LLFolderViewModelItem* item = mViewModelItem;
   81.73 +	LLUUID session_uuid = dynamic_cast<LLConversationItem*>(item)->getUUID();
   81.74 +	return LLFloaterIMSessionTab::getConversation(session_uuid);
   81.75 +}
   81.76 +
   81.77  LLConversationViewParticipant* LLConversationViewSession::findParticipant(const LLUUID& participant_id)
   81.78  {
   81.79  	// This is *not* a general tree parsing algorithm. We search only in the mItems list
    82.1 --- a/indra/newview/llconversationview.h	Thu Jul 18 17:27:31 2013 -0400
    82.2 +++ b/indra/newview/llconversationview.h	Mon Aug 26 17:53:30 2013 -0400
    82.3 @@ -69,6 +69,7 @@
    82.4  	/*virtual*/ void draw();
    82.5  	/*virtual*/ BOOL handleMouseDown( S32 x, S32 y, MASK mask );
    82.6  	/*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
    82.7 +	/*virtual*/ BOOL handleMouseUp( S32 x, S32 y, MASK mask );
    82.8  
    82.9  	/*virtual*/ S32 arrange(S32* width, S32* height);
   82.10  
   82.11 @@ -86,6 +87,9 @@
   82.12  	virtual void refresh();
   82.13  
   82.14  	/*virtual*/ void setFlashState(bool flash_state);
   82.15 +	void setHighlightState(bool hihglight_state);
   82.16 +
   82.17 +	LLFloater* getSessionFloater();
   82.18  
   82.19  private:
   82.20  
    83.1 --- a/indra/newview/lldonotdisturbnotificationstorage.cpp	Thu Jul 18 17:27:31 2013 -0400
    83.2 +++ b/indra/newview/lldonotdisturbnotificationstorage.cpp	Mon Aug 26 17:53:30 2013 -0400
    83.3 @@ -70,7 +70,7 @@
    83.4  
    83.5  LLDoNotDisturbNotificationStorage::LLDoNotDisturbNotificationStorage()
    83.6  	: LLSingleton<LLDoNotDisturbNotificationStorage>()
    83.7 -	, LLNotificationStorage(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "dnd_notifications.xml"))
    83.8 +	, LLNotificationStorage("")
    83.9      , mDirty(false)
   83.10  {
   83.11      nameToPayloadParameterMap[toastName] = "SESSION_ID";
   83.12 @@ -83,6 +83,7 @@
   83.13  
   83.14  void LLDoNotDisturbNotificationStorage::initialize()
   83.15  {
   83.16 +	setFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "dnd_notifications.xml"));
   83.17  	getCommunicationChannel()->connectFailedFilter(boost::bind(&LLDoNotDisturbNotificationStorage::onChannelChanged, this, _1));
   83.18  }
   83.19  
   83.20 @@ -115,7 +116,8 @@
   83.21  	{
   83.22  		LLNotificationPtr notificationPtr = historyIter->second;
   83.23  
   83.24 -		if (!notificationPtr->isRespondedTo() && !notificationPtr->isCancelled() && !notificationPtr->isExpired())
   83.25 +		if (!notificationPtr->isRespondedTo() && !notificationPtr->isCancelled() &&
   83.26 +			!notificationPtr->isExpired() && !notificationPtr->isPersistent())
   83.27  		{
   83.28  			data.append(notificationPtr->asLLSD(true));
   83.29  		}
   83.30 @@ -210,12 +212,8 @@
   83.31  
   83.32  	}
   83.33  
   83.34 -    if(imToastExists)
   83.35 -    {
   83.36 -        LLFloaterReg::showInstance("im_container");
   83.37 -    }
   83.38 -
   83.39 -	if(group_ad_hoc_toast_exists)
   83.40 +    bool isConversationLoggingAllowed = gSavedPerAccountSettings.getS32("KeepConversationLogTranscripts") > 0;
   83.41 +	if(group_ad_hoc_toast_exists && isConversationLoggingAllowed)
   83.42  	{
   83.43  		LLFloaterReg::showInstance("conversation");
   83.44  	}
   83.45 @@ -266,11 +264,6 @@
   83.46          }
   83.47      }
   83.48  
   83.49 -    if(imToastExists)
   83.50 -    {   
   83.51 -        LLFloaterReg::showInstance("im_container");
   83.52 -    }
   83.53 -
   83.54      if(imToastExists || offerExists)
   83.55      {
   83.56          make_ui_sound("UISndNewIncomingIMSession");
    84.1 --- a/indra/newview/lldrawpoolavatar.cpp	Thu Jul 18 17:27:31 2013 -0400
    84.2 +++ b/indra/newview/lldrawpoolavatar.cpp	Mon Aug 26 17:53:30 2013 -0400
    84.3 @@ -135,6 +135,16 @@
    84.4  	{
    84.5  		sBufferUsage = GL_STREAM_DRAW_ARB;
    84.6  	}
    84.7 +
    84.8 +	if (!mDrawFace.empty())
    84.9 +	{
   84.10 +		const LLFace *facep = mDrawFace[0];
   84.11 +		if (facep && facep->getDrawable())
   84.12 +		{
   84.13 +			LLVOAvatar* avatarp = (LLVOAvatar *)facep->getDrawable()->getVObj().get();
   84.14 +			updateRiggedVertexBuffers(avatarp);
   84.15 +		}
   84.16 +	}
   84.17  }
   84.18  
   84.19  LLMatrix4& LLDrawPoolAvatar::getModelView()
   84.20 @@ -1434,6 +1444,65 @@
   84.21  	}
   84.22  }
   84.23  
   84.24 +void LLDrawPoolAvatar::getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>& buffer, U32 data_mask, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face)
   84.25 +{
   84.26 +	face->setGeomIndex(0);
   84.27 +	face->setIndicesIndex(0);
   84.28 +		
   84.29 +	//rigged faces do not batch textures
   84.30 +	face->setTextureIndex(255);
   84.31 +
   84.32 +	if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable())
   84.33 +	{ //make a new buffer
   84.34 +		if (sShaderLevel > 0)
   84.35 +		{
   84.36 +			buffer = new LLVertexBuffer(data_mask, GL_DYNAMIC_DRAW_ARB);
   84.37 +		}
   84.38 +		else
   84.39 +		{
   84.40 +			buffer = new LLVertexBuffer(data_mask, GL_STREAM_DRAW_ARB);
   84.41 +		}
   84.42 +		buffer->allocateBuffer(vol_face.mNumVertices, vol_face.mNumIndices, true);
   84.43 +	}
   84.44 +	else
   84.45 +	{ //resize existing buffer
   84.46 +		buffer->resizeBuffer(vol_face.mNumVertices, vol_face.mNumIndices);
   84.47 +	}
   84.48 +
   84.49 +	face->setSize(vol_face.mNumVertices, vol_face.mNumIndices);
   84.50 +	face->setVertexBuffer(buffer);
   84.51 +
   84.52 +	U16 offset = 0;
   84.53 +		
   84.54 +	LLMatrix4 mat_vert = skin->mBindShapeMatrix;
   84.55 +	glh::matrix4f m((F32*) mat_vert.mMatrix);
   84.56 +	m = m.inverse().transpose();
   84.57 +		
   84.58 +	F32 mat3[] = 
   84.59 +	{ m.m[0], m.m[1], m.m[2],
   84.60 +		m.m[4], m.m[5], m.m[6],
   84.61 +		m.m[8], m.m[9], m.m[10] };
   84.62 +
   84.63 +	LLMatrix3 mat_normal(mat3);				
   84.64 +
   84.65 +	//let getGeometryVolume know if alpha should override shiny
   84.66 +	U32 type = gPipeline.getPoolTypeFromTE(face->getTextureEntry(), face->getTexture());
   84.67 +
   84.68 +	if (type == LLDrawPool::POOL_ALPHA)
   84.69 +	{
   84.70 +		face->setPoolType(LLDrawPool::POOL_ALPHA);
   84.71 +	}
   84.72 +	else
   84.73 +	{
   84.74 +		face->setPoolType(LLDrawPool::POOL_AVATAR);
   84.75 +	}
   84.76 +
   84.77 +	//llinfos << "Rebuilt face " << face->getTEOffset() << " of " << face->getDrawable() << " at " << gFrameTimeSeconds << llendl;
   84.78 +	face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true);
   84.79 +
   84.80 +	buffer->flush();
   84.81 +}
   84.82 +
   84.83  void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace* face, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face)
   84.84  {
   84.85  	LLVector4a* weight = vol_face.mWeights;
   84.86 @@ -1453,60 +1522,27 @@
   84.87  		buffer->getNumIndices() != vol_face.mNumIndices ||
   84.88  		(drawable && drawable->isState(LLDrawable::REBUILD_ALL)))
   84.89  	{
   84.90 -		face->setGeomIndex(0);
   84.91 -		face->setIndicesIndex(0);
   84.92 -		
   84.93 -		//rigged faces do not batch textures
   84.94 -		face->setTextureIndex(255);
   84.95 +		if (drawable && drawable->isState(LLDrawable::REBUILD_ALL))
   84.96 +		{ //rebuild EVERY face in the drawable, not just this one, to avoid missing drawable wide rebuild issues
   84.97 +			for (S32 i = 0; i < drawable->getNumFaces(); ++i)
   84.98 +			{
   84.99 +				LLFace* facep = drawable->getFace(i);
  84.100 +				U32 face_data_mask = facep->getRiggedVertexBufferDataMask();
  84.101 +				if (face_data_mask)
  84.102 +				{
  84.103 +					LLPointer<LLVertexBuffer> cur_buffer = facep->getVertexBuffer();
  84.104 +					const LLVolumeFace& cur_vol_face = volume->getVolumeFace(i);
  84.105 +					getRiggedGeometry(facep, cur_buffer, face_data_mask, skin, volume, cur_vol_face);
  84.106 +				}
  84.107 +			}
  84.108 +			drawable->clearState(LLDrawable::REBUILD_ALL);
  84.109  
  84.110 -		if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable())
  84.111 -		{ //make a new buffer
  84.112 -			if (sShaderLevel > 0)
  84.113 -			{
  84.114 -				buffer = new LLVertexBuffer(data_mask, GL_DYNAMIC_DRAW_ARB);
  84.115 -			}
  84.116 -			else
  84.117 -			{
  84.118 -				buffer = new LLVertexBuffer(data_mask, GL_STREAM_DRAW_ARB);
  84.119 -			}
  84.120 -			buffer->allocateBuffer(vol_face.mNumVertices, vol_face.mNumIndices, true);
  84.121 +			buffer = face->getVertexBuffer();
  84.122  		}
  84.123  		else
  84.124 -		{ //resize existing buffer
  84.125 -			buffer->resizeBuffer(vol_face.mNumVertices, vol_face.mNumIndices);
  84.126 +		{ //just rebuild this face
  84.127 +			getRiggedGeometry(face, buffer, data_mask, skin, volume, vol_face);
  84.128  		}
  84.129 -
  84.130 -		face->setSize(vol_face.mNumVertices, vol_face.mNumIndices);
  84.131 -		face->setVertexBuffer(buffer);
  84.132 -
  84.133 -		U16 offset = 0;
  84.134 -		
  84.135 -		LLMatrix4 mat_vert = skin->mBindShapeMatrix;
  84.136 -		glh::matrix4f m((F32*) mat_vert.mMatrix);
  84.137 -		m = m.inverse().transpose();
  84.138 -		
  84.139 -		F32 mat3[] = 
  84.140 -		{ m.m[0], m.m[1], m.m[2],
  84.141 -		  m.m[4], m.m[5], m.m[6],
  84.142 -		  m.m[8], m.m[9], m.m[10] };
  84.143 -
  84.144 -		LLMatrix3 mat_normal(mat3);				
  84.145 -
  84.146 -		//let getGeometryVolume know if alpha should override shiny
  84.147 -		U32 type = gPipeline.getPoolTypeFromTE(face->getTextureEntry(), face->getTexture());
  84.148 -
  84.149 -		if (type == LLDrawPool::POOL_ALPHA)
  84.150 -		{
  84.151 -			face->setPoolType(LLDrawPool::POOL_ALPHA);
  84.152 -		}
  84.153 -		else
  84.154 -		{
  84.155 -			face->setPoolType(LLDrawPool::POOL_AVATAR);
  84.156 -		}
  84.157 -
  84.158 -		face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true);
  84.159 -
  84.160 -		buffer->flush();
  84.161  	}
  84.162  
  84.163  	if (sShaderLevel <= 0 && face->mLastSkinTime < avatar->getLastSkinTime())
  84.164 @@ -1591,11 +1627,6 @@
  84.165  			}
  84.166  		}
  84.167  	}
  84.168 -
  84.169 -	if (drawable && (face->getTEOffset() == drawable->getNumFaces()-1))
  84.170 -	{
  84.171 -		drawable->clearState(LLDrawable::REBUILD_ALL);
  84.172 -	}
  84.173  }
  84.174  
  84.175  void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
  84.176 @@ -1771,7 +1802,6 @@
  84.177  
  84.178  void LLDrawPoolAvatar::renderDeferredRiggedSimple(LLVOAvatar* avatar)
  84.179  {
  84.180 -	updateRiggedVertexBuffers(avatar);
  84.181  	renderRigged(avatar, RIGGED_DEFERRED_SIMPLE);
  84.182  }
  84.183  
  84.184 @@ -1840,7 +1870,6 @@
  84.185  
  84.186  void LLDrawPoolAvatar::renderRiggedSimple(LLVOAvatar* avatar)
  84.187  {
  84.188 -	updateRiggedVertexBuffers(avatar);
  84.189  	renderRigged(avatar, RIGGED_SIMPLE);
  84.190  }
  84.191  
    85.1 --- a/indra/newview/lldrawpoolavatar.h	Thu Jul 18 17:27:31 2013 -0400
    85.2 +++ b/indra/newview/lldrawpoolavatar.h	Mon Aug 26 17:53:30 2013 -0400
    85.3 @@ -133,6 +133,7 @@
    85.4  	void endDeferredRiggedSimple();
    85.5  	void endDeferredRiggedBump();
    85.6  		
    85.7 +	void getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>& buffer, U32 data_mask, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face);
    85.8  	void updateRiggedFaceVertexBuffer(LLVOAvatar* avatar,
    85.9  									  LLFace* facep, 
   85.10  									  const LLMeshSkinInfo* skin, 
    86.1 --- a/indra/newview/llface.cpp	Thu Jul 18 17:27:31 2013 -0400
    86.2 +++ b/indra/newview/llface.cpp	Mon Aug 26 17:53:30 2013 -0400
    86.3 @@ -768,7 +768,7 @@
    86.4  }
    86.5  
    86.6  BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
    86.7 -								const LLMatrix4& mat_vert_in, const LLMatrix3& mat_normal_in, BOOL global_volume)
    86.8 +								const LLMatrix4& mat_vert_in, BOOL global_volume)
    86.9  {
   86.10  	//get bounding box
   86.11  	if (mDrawablep->isState(LLDrawable::REBUILD_VOLUME | LLDrawable::REBUILD_POSITION | LLDrawable::REBUILD_RIGGED))
   86.12 @@ -777,10 +777,6 @@
   86.13  		LLMatrix4a mat_vert;
   86.14  		mat_vert.loadu(mat_vert_in);
   86.15  
   86.16 -		LLMatrix4a mat_normal;
   86.17 -		mat_normal.loadu(mat_normal_in);
   86.18 -
   86.19 -		//VECTORIZE THIS
   86.20  		LLVector4a min,max;
   86.21  	
   86.22  		if (f >= volume.getNumVolumeFaces())
   86.23 @@ -797,100 +793,68 @@
   86.24  		llassert(less_than_max_mag(max));
   86.25  
   86.26  		//min, max are in volume space, convert to drawable render space
   86.27 -		LLVector4a center;
   86.28 -		LLVector4a t;
   86.29 -		t.setAdd(min, max);
   86.30 -		t.mul(0.5f);
   86.31 -		mat_vert.affineTransform(t, center);
   86.32 -		LLVector4a size;
   86.33 -		size.setSub(max, min);
   86.34 -		size.mul(0.5f);
   86.35  
   86.36 -		llassert(less_than_max_mag(min));
   86.37 -		llassert(less_than_max_mag(max));
   86.38 +		//get 8 corners of bounding box
   86.39 +		LLVector4Logical mask[6];
   86.40  
   86.41 -		if (!global_volume)
   86.42 +		for (U32 i = 0; i < 6; ++i)
   86.43  		{
   86.44 -			//VECTORIZE THIS
   86.45 -			LLVector4a scale;
   86.46 -			scale.load3(mDrawablep->getVObj()->getScale().mV);
   86.47 -			size.mul(scale);
   86.48 +			mask[i].clear();
   86.49  		}
   86.50  
   86.51 -		// Catch potential badness from normalization before it happens
   86.52 -		//
   86.53 -		llassert(mat_normal.mMatrix[0].isFinite3() && (mat_normal.mMatrix[0].dot3(mat_normal.mMatrix[0]).getF32() > F_APPROXIMATELY_ZERO));
   86.54 -		llassert(mat_normal.mMatrix[1].isFinite3() && (mat_normal.mMatrix[1].dot3(mat_normal.mMatrix[1]).getF32() > F_APPROXIMATELY_ZERO));
   86.55 -		llassert(mat_normal.mMatrix[2].isFinite3() && (mat_normal.mMatrix[2].dot3(mat_normal.mMatrix[2]).getF32() > F_APPROXIMATELY_ZERO));
   86.56 +		mask[0].setElement<2>(); //001
   86.57 +		mask[1].setElement<1>(); //010
   86.58 +		mask[2].setElement<1>(); //011
   86.59 +		mask[2].setElement<2>();
   86.60 +		mask[3].setElement<0>(); //100
   86.61 +		mask[4].setElement<0>(); //101
   86.62 +		mask[4].setElement<2>();
   86.63 +		mask[5].setElement<0>(); //110
   86.64 +		mask[5].setElement<1>();
   86.65 +		
   86.66 +		LLVector4a v[8];
   86.67  
   86.68 -		mat_normal.mMatrix[0].normalize3fast();
   86.69 -		mat_normal.mMatrix[1].normalize3fast();
   86.70 -		mat_normal.mMatrix[2].normalize3fast();
   86.71 -		
   86.72 -		LLVector4a v[4];
   86.73 +		v[6] = min;
   86.74 +		v[7] = max;
   86.75  
   86.76 -		//get 4 corners of bounding box
   86.77 -		mat_normal.rotate(size,v[0]);
   86.78 +		for (U32 i = 0; i < 6; ++i)
   86.79 +		{
   86.80 +			v[i].setSelectWithMask(mask[i], min, max);
   86.81 +		}
   86.82  
   86.83 -		//VECTORIZE THIS
   86.84 -		LLVector4a scale;
   86.85 -		
   86.86 -		scale.set(-1.f, -1.f, 1.f);
   86.87 -		scale.mul(size);
   86.88 -		mat_normal.rotate(scale, v[1]);
   86.89 -		
   86.90 -		scale.set(1.f, -1.f, -1.f);
   86.91 -		scale.mul(size);
   86.92 -		mat_normal.rotate(scale, v[2]);
   86.93 -		
   86.94 -		scale.set(-1.f, 1.f, -1.f);
   86.95 -		scale.mul(size);
   86.96 -		mat_normal.rotate(scale, v[3]);
   86.97 +		LLVector4a tv[8];
   86.98  
   86.99 +		//transform bounding box into drawable space
  86.100 +		for (U32 i = 0; i < 8; ++i)
  86.101 +		{
  86.102 +			mat_vert.affineTransform(v[i], tv[i]);
  86.103 +		}
  86.104 +	
  86.105 +		//find bounding box
  86.106  		LLVector4a& newMin = mExtents[0];
  86.107  		LLVector4a& newMax = mExtents[1];
  86.108 -		
  86.109 -		newMin = newMax = center;
  86.110 -		
  86.111 -		llassert(less_than_max_mag(center));
  86.112 -		
  86.113 -		for (U32 i = 0; i < 4; i++)
  86.114 +
  86.115 +		newMin = newMax = tv[0];
  86.116 +
  86.117 +		for (U32 i = 1; i < 8; ++i)
  86.118  		{
  86.119 -			LLVector4a delta;
  86.120 -			delta.setAbs(v[i]);
  86.121 -			LLVector4a min;
  86.122 -			min.setSub(center, delta);
  86.123 -			LLVector4a max;
  86.124 -			max.setAdd(center, delta);
  86.125 -
  86.126 -			newMin.setMin(newMin,min);
  86.127 -			newMax.setMax(newMax,max);
  86.128 -
  86.129 -			llassert(less_than_max_mag(newMin));
  86.130 -			llassert(less_than_max_mag(newMax));
  86.131 +			newMin.setMin(newMin, tv[i]);
  86.132 +			newMax.setMax(newMax, tv[i]);
  86.133  		}
  86.134  
  86.135  		if (!mDrawablep->isActive())
  86.136 -		{
  86.137 +		{	// Shift position for region
  86.138  			LLVector4a offset;
  86.139  			offset.load3(mDrawablep->getRegion()->getOriginAgent().mV);
  86.140  			newMin.add(offset);
  86.141  			newMax.add(offset);
  86.142 -			
  86.143 -			llassert(less_than_max_mag(newMin));
  86.144 -			llassert(less_than_max_mag(newMax));
  86.145  		}
  86.146  
  86.147 -		t.setAdd(newMin, newMax);
  86.148 +		LLVector4a t;
  86.149 +		t.setAdd(newMin,newMax);
  86.150  		t.mul(0.5f);
  86.151  
  86.152 -		llassert(less_than_max_mag(t));
  86.153 -		
  86.154 -		//VECTORIZE THIS
  86.155  		mCenterLocal.set(t.getF32ptr());
  86.156 -		
  86.157 -		llassert(less_than_max_mag(newMin));
  86.158 -		llassert(less_than_max_mag(newMax));
  86.159  
  86.160  		t.setSub(newMax,newMin);
  86.161  		mBoundingSphereRadius = t.getLength3().getF32()*0.5f;
    87.1 --- a/indra/newview/llface.h	Thu Jul 18 17:27:31 2013 -0400
    87.2 +++ b/indra/newview/llface.h	Mon Aug 26 17:53:30 2013 -0400
    87.3 @@ -195,7 +195,7 @@
    87.4  	void		setSize(S32 numVertices, S32 num_indices = 0, bool align = false);
    87.5  	
    87.6  	BOOL		genVolumeBBoxes(const LLVolume &volume, S32 f,
    87.7 -								   const LLMatrix4& mat, const LLMatrix3& inv_trans_mat, BOOL global_volume = FALSE);
    87.8 +								   const LLMatrix4& mat, BOOL global_volume = FALSE);
    87.9  	
   87.10  	void		init(LLDrawable* drawablep, LLViewerObject* objp);
   87.11  	void		destroy();
    88.1 --- a/indra/newview/llfavoritesbar.cpp	Thu Jul 18 17:27:31 2013 -0400
    88.2 +++ b/indra/newview/llfavoritesbar.cpp	Mon Aug 26 17:53:30 2013 -0400
    88.3 @@ -400,6 +400,8 @@
    88.4  	mMoreTextBox->setClickedCallback(boost::bind(&LLFavoritesBarCtrl::showDropDownMenu, this));
    88.5  	addChild(mMoreTextBox);
    88.6  
    88.7 +	mDropDownItemsCount = 0;
    88.8 +
    88.9  	LLTextBox::Params label_param(p.label);
   88.10  	mBarLabel = LLUICtrlFactory::create<LLTextBox> (label_param);
   88.11  	addChild(mBarLabel);
   88.12 @@ -820,11 +822,13 @@
   88.13  		}
   88.14  		// Update overflow menu
   88.15  		LLToggleableMenu* overflow_menu = static_cast <LLToggleableMenu*> (mOverflowMenuHandle.get());
   88.16 -		if (overflow_menu && overflow_menu->getVisible())
   88.17 +		if (overflow_menu && overflow_menu->getVisible() && (overflow_menu->getItemCount() != mDropDownItemsCount))
   88.18  		{
   88.19  			overflow_menu->setVisible(FALSE);
   88.20  			if (mUpdateDropDownItems)
   88.21 +			{
   88.22  				showDropDownMenu();
   88.23 +			}
   88.24  		}
   88.25  	}
   88.26  	else
   88.27 @@ -940,6 +944,7 @@
   88.28  		menu->updateParent(LLMenuGL::sMenuContainer);
   88.29  		menu->setButtonRect(mMoreTextBox->getRect(), this);
   88.30  		positionAndShowMenu(menu);
   88.31 +		mDropDownItemsCount = menu->getItemCount();
   88.32  	}
   88.33  }
   88.34  
    89.1 --- a/indra/newview/llfavoritesbar.h	Thu Jul 18 17:27:31 2013 -0400
    89.2 +++ b/indra/newview/llfavoritesbar.h	Mon Aug 26 17:53:30 2013 -0400
    89.3 @@ -101,6 +101,7 @@
    89.4  	LLUUID mFavoriteFolderId;
    89.5  	const LLFontGL *mFont;
    89.6  	S32 mFirstDropDownItem;
    89.7 +	S32 mDropDownItemsCount;
    89.8  	bool mUpdateDropDownItems;
    89.9  	bool mRestoreOverflowMenu;
   89.10  
    90.1 --- a/indra/newview/llfeaturemanager.cpp	Thu Jul 18 17:27:31 2013 -0400
    90.2 +++ b/indra/newview/llfeaturemanager.cpp	Mon Aug 26 17:53:30 2013 -0400
    90.3 @@ -30,6 +30,7 @@
    90.4  #include <fstream>
    90.5  
    90.6  #include <boost/regex.hpp>
    90.7 +#include <boost/assign/list_of.hpp>
    90.8  
    90.9  #include "llfeaturemanager.h"
   90.10  #include "lldir.h"
   90.11 @@ -52,6 +53,8 @@
   90.12  #include "llboost.h"
   90.13  #include "llweb.h"
   90.14  #include "llviewershadermgr.h"
   90.15 +#include "llstring.h"
   90.16 +#include "stringize.h"
   90.17  
   90.18  #if LL_WINDOWS
   90.19  #include "lldxhardware.h"
   90.20 @@ -187,6 +190,55 @@
   90.21  	LL_DEBUGS("RenderInit") << LL_ENDL;
   90.22  }
   90.23  
   90.24 +static const std::vector<std::string> sGraphicsLevelNames = boost::assign::list_of
   90.25 +	("Low")
   90.26 +	("LowMid")
   90.27 +	("Mid")
   90.28 +	("MidHigh")
   90.29 +	("High")
   90.30 +	("HighUltra")
   90.31 +	("Ultra")
   90.32 +;
   90.33 +
   90.34 +U32 LLFeatureManager::getMaxGraphicsLevel() const
   90.35 +{
   90.36 +	return sGraphicsLevelNames.size() - 1;
   90.37 +}
   90.38 +
   90.39 +bool LLFeatureManager::isValidGraphicsLevel(U32 level) const
   90.40 +{
   90.41 +	return (level <= getMaxGraphicsLevel());
   90.42 +}
   90.43 +
   90.44 +std::string LLFeatureManager::getNameForGraphicsLevel(U32 level) const
   90.45 +{
   90.46 +	if (isValidGraphicsLevel(level))
   90.47 +	{
   90.48 +		return sGraphicsLevelNames[level];
   90.49 +	}
   90.50 +	return STRINGIZE("Invalid graphics level " << level << ", valid are 0 .. "
   90.51 +					 << getMaxGraphicsLevel());
   90.52 +}
   90.53 +
   90.54 +S32 LLFeatureManager::getGraphicsLevelForName(const std::string& name) const
   90.55 +{
   90.56 +	const std::string FixedFunction("FixedFunction");
   90.57 +	std::string rname(name);
   90.58 +	if (LLStringUtil::endsWith(rname, FixedFunction))
   90.59 +	{
   90.60 +		// chop off any "FixedFunction" suffix
   90.61 +		rname = rname.substr(0, rname.length() - FixedFunction.length());
   90.62 +	}
   90.63 +	for (S32 i(0), iend(getMaxGraphicsLevel()); i <= iend; ++i)
   90.64 +	{
   90.65 +		if (sGraphicsLevelNames[i] == rname)
   90.66 +		{
   90.67 +			return i;
   90.68 +		}
   90.69 +	}
   90.70 +	return -1;
   90.71 +}
   90.72 +
   90.73  LLFeatureList *LLFeatureManager::findMask(const std::string& name)
   90.74  {
   90.75  	if (mMaskList.count(name))
   90.76 @@ -620,7 +672,7 @@
   90.77  {
   90.78  	// apply saved settings
   90.79  	// cap the level at 2 (high)
   90.80 -	S32 level = llmax(GPU_CLASS_0, llmin(mGPUClass, GPU_CLASS_5));
   90.81 +	U32 level = llmax(GPU_CLASS_0, llmin(mGPUClass, GPU_CLASS_5));
   90.82  
   90.83  	llinfos << "Applying Recommended Features" << llendl;
   90.84  
   90.85 @@ -696,62 +748,33 @@
   90.86  	}
   90.87  }
   90.88  
   90.89 -void LLFeatureManager::setGraphicsLevel(S32 level, bool skipFeatures)
   90.90 +void LLFeatureManager::setGraphicsLevel(U32 level, bool skipFeatures)
   90.91  {
   90.92  	LLViewerShaderMgr::sSkipReload = true;
   90.93  
   90.94  	applyBaseMasks();
   90.95 -	
   90.96 -	switch (level)
   90.97 +
   90.98 +	// if we're passed an invalid level, default to "Low"
   90.99 +	std::string features(isValidGraphicsLevel(level)? getNameForGraphicsLevel(level) : "Low");
  90.100 +	if (features == "Low")
  90.101  	{
  90.102 -		case 0:
  90.103  #if LL_DARWIN
  90.104 -			// This Mac-specific change is to insure that we force 'Basic Shaders' for all Mac
  90.105 -			// systems which support them instead of falling back to fixed-function unnecessarily
  90.106 -			// MAINT-2157
  90.107 -			//
  90.108 -			if (gGLManager.mGLVersion < 2.1f)
  90.109 -			{
  90.110 -				maskFeatures("LowFixedFunction");			
  90.111 -			}
  90.112 -			else
  90.113 -			{ //same as low, but with "Basic Shaders" enabled
  90.114 -				maskFeatures("Low");
  90.115 -			}
  90.116 +		// This Mac-specific change is to insure that we force 'Basic Shaders' for all Mac
  90.117 +		// systems which support them instead of falling back to fixed-function unnecessarily
  90.118 +		// MAINT-2157
  90.119 +		if (gGLManager.mGLVersion < 2.1f)
  90.120  #else
  90.121 -			if (gGLManager.mGLVersion < 3.f || gGLManager.mIsIntel)
  90.122 -			{ //only use fixed function by default if GL version < 3.0 or this is an intel graphics chip
  90.123 -				maskFeatures("LowFixedFunction");			
  90.124 -			}
  90.125 -			else
  90.126 -			{ //same as low, but with "Basic Shaders" enabled
  90.127 -				maskFeatures("Low");
  90.128 -			}
  90.129 +		// only use fixed function by default if GL version < 3.0 or this is an intel graphics chip
  90.130 +		if (gGLManager.mGLVersion < 3.f || gGLManager.mIsIntel)
  90.131  #endif
  90.132 -			break;
  90.133 -		case 1:
  90.134 -			maskFeatures("LowMid");
  90.135 -			break;
  90.136 -		case 2:
  90.137 -			maskFeatures("Mid");
  90.138 -			break;
  90.139 -		case 3:
  90.140 -			maskFeatures("MidHigh");
  90.141 -			break;
  90.142 -		case 4:
  90.143 -			maskFeatures("High");
  90.144 -			break;
  90.145 -		case 5:
  90.146 -			maskFeatures("HighUltra");
  90.147 -			break;
  90.148 -		case 6:
  90.149 -			maskFeatures("Ultra");
  90.150 -			break;
  90.151 -		default:
  90.152 -			maskFeatures("Low");
  90.153 -			break;
  90.154 +		{
  90.155 +            // same as Low, but with "Basic Shaders" disabled
  90.156 +			features = "LowFixedFunction";
  90.157 +		}
  90.158  	}
  90.159  
  90.160 +	maskFeatures(features);
  90.161 +
  90.162  	applyFeatures(skipFeatures);
  90.163  
  90.164  	LLViewerShaderMgr::sSkipReload = false;
    91.1 --- a/indra/newview/llfeaturemanager.h	Thu Jul 18 17:27:31 2013 -0400
    91.2 +++ b/indra/newview/llfeaturemanager.h	Mon Aug 26 17:53:30 2013 -0400
    91.3 @@ -134,8 +134,18 @@
    91.4  	// skipFeatures forces skipping of mostly hardware settings
    91.5  	// that we don't want to change when we change graphics
    91.6  	// settings
    91.7 -	void setGraphicsLevel(S32 level, bool skipFeatures);
    91.8 -	
    91.9 +	void setGraphicsLevel(U32 level, bool skipFeatures);
   91.10 +
   91.11 +	// What 'level' values are valid to pass to setGraphicsLevel()?
   91.12 +	// 0 is the low end...
   91.13 +	U32 getMaxGraphicsLevel() const;
   91.14 +	bool isValidGraphicsLevel(U32 level) const;
   91.15 +
   91.16 +	// setGraphicsLevel() levels have names.
   91.17 +	std::string getNameForGraphicsLevel(U32 level) const;
   91.18 +	// returns -1 for unrecognized name (hence S32 rather than U32)
   91.19 +	S32 getGraphicsLevelForName(const std::string& name) const;
   91.20 +
   91.21  	void applyBaseMasks();
   91.22  	void applyRecommendedSettings();
   91.23  
    92.1 --- a/indra/newview/llfloaterabout.cpp	Thu Jul 18 17:27:31 2013 -0400
    92.2 +++ b/indra/newview/llfloaterabout.cpp	Mon Aug 26 17:53:30 2013 -0400
    92.3 @@ -33,8 +33,10 @@
    92.4  
    92.5  // Viewer includes
    92.6  #include "llagent.h"
    92.7 +#include "llagentui.h"
    92.8  #include "llappviewer.h" 
    92.9  #include "llsecondlifeurls.h"
   92.10 +#include "llslurl.h"
   92.11  #include "llvoiceclient.h"
   92.12  #include "lluictrlfactory.h"
   92.13  #include "llviewertexteditor.h"
   92.14 @@ -250,12 +252,16 @@
   92.15  	LLViewerRegion* region = gAgent.getRegion();
   92.16  	if (region)
   92.17  	{
   92.18 -		const LLVector3d &pos = gAgent.getPositionGlobal();
   92.19 +		LLVector3d pos = gAgent.getPositionGlobal();
   92.20  		info["POSITION"] = ll_sd_from_vector3d(pos);
   92.21 +		info["POSITION_LOCAL"] = ll_sd_from_vector3(gAgent.getPosAgentFromGlobal(pos));
   92.22  		info["REGION"] = gAgent.getRegion()->getName();
   92.23  		info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName();
   92.24  		info["HOSTIP"] = gAgent.getRegion()->getHost().getString();
   92.25  		info["SERVER_VERSION"] = gLastVersionChannel;
   92.26 +		LLSLURL slurl;
   92.27 +		LLAgentUI::buildSLURL(slurl);
   92.28 +		info["SLURL"] = slurl.getSLURLString();
   92.29  	}
   92.30  
   92.31  	// CPU
   92.32 @@ -307,12 +313,12 @@
   92.33  static std::string get_viewer_release_notes_url()
   92.34  {
   92.35  	// return a URL to the release notes for this viewer, such as:
   92.36 -	// http://wiki.secondlife.com/wiki/Release_Notes/Second Life Beta Viewer/2.1.0
   92.37 +	// http://wiki.secondlife.com/wiki/Release_Notes/Second Life Beta Viewer/2.1.0.123456
   92.38  	std::string url = LLTrans::getString("RELEASE_NOTES_BASE_URL");
   92.39  	if (! LLStringUtil::endsWith(url, "/"))
   92.40  		url += "/";
   92.41  	url += LLVersionInfo::getChannel() + "/";
   92.42 -	url += LLVersionInfo::getShortVersion();
   92.43 +	url += LLVersionInfo::getVersion();
   92.44  	return LLWeb::escapeURL(url);
   92.45  }
   92.46  
    93.1 --- a/indra/newview/llfloateravatarpicker.cpp	Thu Jul 18 17:27:31 2013 -0400
    93.2 +++ b/indra/newview/llfloateravatarpicker.cpp	Mon Aug 26 17:53:30 2013 -0400
    93.3 @@ -513,6 +513,7 @@
    93.4  			url += "/";
    93.5  		}
    93.6  		url += "?page_size=100&names=";
    93.7 +		std::replace(text.begin(), text.end(), '.', ' ');
    93.8  		url += LLURI::escape(text);
    93.9  		llinfos << "avatar picker " << url << llendl;
   93.10  		LLHTTPClient::get(url, new LLAvatarPickerResponder(mQueryID, getKey().asString()));
   93.11 @@ -748,7 +749,12 @@
   93.12  		{
   93.13  			getChildView("ok_btn")->setEnabled(true);
   93.14  			search_results->setEnabled(true);
   93.15 -			search_results->selectFirstItem();
   93.16 +			search_results->sortByColumnIndex(1, TRUE);
   93.17 +			std::string text = getChild<LLUICtrl>("Edit")->getValue().asString();
   93.18 +			if (!search_results->selectItemByLabel(text, TRUE, 1))
   93.19 +			{
   93.20 +				search_results->selectFirstItem();
   93.21 +			}			
   93.22  			onList();
   93.23  			search_results->setFocus(TRUE);
   93.24  		}
    94.1 --- a/indra/newview/llfloaterbulkpermission.cpp	Thu Jul 18 17:27:31 2013 -0400
    94.2 +++ b/indra/newview/llfloaterbulkpermission.cpp	Mon Aug 26 17:53:30 2013 -0400
    94.3 @@ -57,6 +57,7 @@
    94.4  	mDone(FALSE)
    94.5  {
    94.6  	mID.generate();
    94.7 +	mCommitCallbackRegistrar.add("BulkPermission.Ok",		boost::bind(&LLFloaterBulkPermission::onOkBtn, this));
    94.8  	mCommitCallbackRegistrar.add("BulkPermission.Apply",	boost::bind(&LLFloaterBulkPermission::onApplyBtn, this));
    94.9  	mCommitCallbackRegistrar.add("BulkPermission.Close",	boost::bind(&LLFloaterBulkPermission::onCloseBtn, this));
   94.10  	mCommitCallbackRegistrar.add("BulkPermission.CheckAll",	boost::bind(&LLFloaterBulkPermission::onCheckAll, this));
   94.11 @@ -66,6 +67,21 @@
   94.12  
   94.13  BOOL LLFloaterBulkPermission::postBuild()
   94.14  {
   94.15 +	mBulkChangeIncludeAnimations = gSavedSettings.getBOOL("BulkChangeIncludeAnimations");
   94.16 +	mBulkChangeIncludeBodyParts = gSavedSettings.getBOOL("BulkChangeIncludeBodyParts");
   94.17 +	mBulkChangeIncludeClothing = gSavedSettings.getBOOL("BulkChangeIncludeClothing");
   94.18 +	mBulkChangeIncludeGestures = gSavedSettings.getBOOL("BulkChangeIncludeGestures");
   94.19 +	mBulkChangeIncludeNotecards = gSavedSettings.getBOOL("BulkChangeIncludeNotecards");
   94.20 +	mBulkChangeIncludeObjects = gSavedSettings.getBOOL("BulkChangeIncludeObjects");
   94.21 +	mBulkChangeIncludeScripts = gSavedSettings.getBOOL("BulkChangeIncludeScripts");
   94.22 +	mBulkChangeIncludeSounds = gSavedSettings.getBOOL("BulkChangeIncludeSounds");
   94.23 +	mBulkChangeIncludeTextures = gSavedSettings.getBOOL("BulkChangeIncludeTextures");
   94.24 +	mBulkChangeShareWithGroup = gSavedSettings.getBOOL("BulkChangeShareWithGroup");
   94.25 +	mBulkChangeEveryoneCopy = gSavedSettings.getBOOL("BulkChangeEveryoneCopy");
   94.26 +	mBulkChangeNextOwnerModify = gSavedSettings.getBOOL("BulkChangeNextOwnerModify");
   94.27 +	mBulkChangeNextOwnerCopy = gSavedSettings.getBOOL("BulkChangeNextOwnerCopy");
   94.28 +	mBulkChangeNextOwnerTransfer = gSavedSettings.getBOOL("BulkChangeNextOwnerTransfer");
   94.29 +
   94.30  	return TRUE;
   94.31  }
   94.32  
   94.33 @@ -144,6 +160,12 @@
   94.34  	}
   94.35  }
   94.36  
   94.37 +void LLFloaterBulkPermission::onOkBtn()
   94.38 +{
   94.39 +	doApply();
   94.40 +	closeFloater();
   94.41 +}
   94.42 +
   94.43  void LLFloaterBulkPermission::onApplyBtn()
   94.44  {
   94.45  	doApply();
   94.46 @@ -151,6 +173,20 @@
   94.47  
   94.48  void LLFloaterBulkPermission::onCloseBtn()
   94.49  {
   94.50 +	gSavedSettings.setBOOL("BulkChangeIncludeAnimations", mBulkChangeIncludeAnimations);
   94.51 +	gSavedSettings.setBOOL("BulkChangeIncludeBodyParts", mBulkChangeIncludeBodyParts);
   94.52 +	gSavedSettings.setBOOL("BulkChangeIncludeClothing", mBulkChangeIncludeClothing);
   94.53 +	gSavedSettings.setBOOL("BulkChangeIncludeGestures", mBulkChangeIncludeGestures);
   94.54 +	gSavedSettings.setBOOL("BulkChangeIncludeNotecards", mBulkChangeIncludeNotecards);
   94.55 +	gSavedSettings.setBOOL("BulkChangeIncludeObjects", mBulkChangeIncludeObjects);
   94.56 +	gSavedSettings.setBOOL("BulkChangeIncludeScripts", mBulkChangeIncludeScripts);
   94.57 +	gSavedSettings.setBOOL("BulkChangeIncludeSounds", mBulkChangeIncludeSounds);
   94.58 +	gSavedSettings.setBOOL("BulkChangeIncludeTextures", mBulkChangeIncludeTextures);
   94.59 +	gSavedSettings.setBOOL("BulkChangeShareWithGroup", mBulkChangeShareWithGroup);
   94.60 +	gSavedSettings.setBOOL("BulkChangeEveryoneCopy", mBulkChangeEveryoneCopy);
   94.61 +	gSavedSettings.setBOOL("BulkChangeNextOwnerModify", mBulkChangeNextOwnerModify);
   94.62 +	gSavedSettings.setBOOL("BulkChangeNextOwnerCopy", mBulkChangeNextOwnerCopy);
   94.63 +	gSavedSettings.setBOOL("BulkChangeNextOwnerTransfer", mBulkChangeNextOwnerTransfer);
   94.64  	closeFloater();
   94.65  }
   94.66  
    95.1 --- a/indra/newview/llfloaterbulkpermission.h	Thu Jul 18 17:27:31 2013 -0400
    95.2 +++ b/indra/newview/llfloaterbulkpermission.h	Mon Aug 26 17:53:30 2013 -0400
    95.3 @@ -72,6 +72,7 @@
    95.4  								bool is_new);
    95.5  
    95.6  	void onCloseBtn();
    95.7 +	void onOkBtn();
    95.8  	void onApplyBtn();
    95.9  	void onCommitCopy();
   95.10  	void onCheckAll() { doCheckUncheckAll(TRUE); }
   95.11 @@ -94,6 +95,21 @@
   95.12  	LLUUID mCurrentObjectID;
   95.13  	BOOL mDone;
   95.14  
   95.15 +	bool mBulkChangeIncludeAnimations;
   95.16 +	bool mBulkChangeIncludeBodyParts;
   95.17 +	bool mBulkChangeIncludeClothing;
   95.18 +	bool mBulkChangeIncludeGestures;
   95.19 +	bool mBulkChangeIncludeNotecards;
   95.20 +	bool mBulkChangeIncludeObjects;
   95.21 +	bool mBulkChangeIncludeScripts;
   95.22 +	bool mBulkChangeIncludeSounds;
   95.23 +	bool mBulkChangeIncludeTextures;
   95.24 +	bool mBulkChangeShareWithGroup;
   95.25 +	bool mBulkChangeEveryoneCopy;
   95.26 +	bool mBulkChangeNextOwnerModify;
   95.27 +	bool mBulkChangeNextOwnerCopy;
   95.28 +	bool mBulkChangeNextOwnerTransfer;
   95.29 +
   95.30  	LLUUID mID;
   95.31  
   95.32  	const char* mStartString;
    96.1 --- a/indra/newview/llfloaterconversationpreview.cpp	Thu Jul 18 17:27:31 2013 -0400
    96.2 +++ b/indra/newview/llfloaterconversationpreview.cpp	Mon Aug 26 17:53:30 2013 -0400
    96.3 @@ -50,6 +50,7 @@
    96.4  BOOL LLFloaterConversationPreview::postBuild()
    96.5  {
    96.6  	mChatHistory = getChild<LLChatHistory>("chat_history");
    96.7 +	LLLoadHistoryThread::setLoadEndSignal(boost::bind(&LLFloaterConversationPreview::SetPages, this, _1, _2));
    96.8  
    96.9  	const LLConversation* conv = LLConversationLog::instance().getConversation(mSessionID);
   96.10  	std::string name;
   96.11 @@ -70,7 +71,7 @@
   96.12  		name = LLTrans::getString("NearbyChatTitle");
   96.13  		file = "chat";
   96.14  	}
   96.15 -
   96.16 +	mChatHistoryFileName = file;
   96.17  	LLStringUtil::format_map_t args;
   96.18  	args["[NAME]"] = name;
   96.19  	std::string title = getString("Title", args);
   96.20 @@ -80,23 +81,46 @@
   96.21  	load_params["load_all_history"] = true;
   96.22  	load_params["cut_off_todays_date"] = false;
   96.23  
   96.24 -	LLLogChat::loadChatHistory(file, mMessages, load_params);
   96.25 -	mCurrentPage = mMessages.size() / mPageSize;
   96.26  
   96.27 +	LLSD loading;
   96.28 +	loading[LL_IM_TEXT] = LLTrans::getString("loading_chat_logs");
   96.29 +	mMessages.push_back(loading);
   96.30  	mPageSpinner = getChild<LLSpinCtrl>("history_page_spin");
   96.31  	mPageSpinner->setCommitCallback(boost::bind(&LLFloaterConversationPreview::onMoreHistoryBtnClick, this));
   96.32  	mPageSpinner->setMinValue(1);
   96.33 -	mPageSpinner->setMaxValue(mCurrentPage + 1);
   96.34 -	mPageSpinner->set(mCurrentPage + 1);
   96.35 -
   96.36 -	std::string total_page_num = llformat("/ %d", mCurrentPage + 1);
   96.37 -	getChild<LLTextBox>("page_num_label")->setValue(total_page_num);
   96.38 -
   96.39 +	mPageSpinner->set(1);
   96.40 +	mPageSpinner->setEnabled(false);
   96.41 +	mChatHistoryLoaded = false;
   96.42 +	LLLogChat::startChatHistoryThread(file, load_params);
   96.43  	return LLFloater::postBuild();
   96.44  }
   96.45  
   96.46 +void LLFloaterConversationPreview::SetPages(std::list<LLSD>& messages, const std::string& file_name)
   96.47 +{
   96.48 +	if(file_name == mChatHistoryFileName)
   96.49 +	{
   96.50 +		mMessages = messages;
   96.51 +
   96.52 +
   96.53 +		mCurrentPage = mMessages.size() / mPageSize;
   96.54 +		mPageSpinner->setEnabled(true);
   96.55 +		mPageSpinner->setMaxValue(mCurrentPage+1);
   96.56 +		mPageSpinner->set(mCurrentPage+1);
   96.57 +
   96.58 +		std::string total_page_num = llformat("/ %d", mCurrentPage+1);
   96.59 +		getChild<LLTextBox>("page_num_label")->setValue(total_page_num);
   96.60 +		mChatHistoryLoaded = true;
   96.61 +
   96.62 +	}
   96.63 +
   96.64 +}
   96.65  void LLFloaterConversationPreview::draw()
   96.66  {
   96.67 +	if(mChatHistoryLoaded)
   96.68 +	{
   96.69 +		showHistory();
   96.70 +		mChatHistoryLoaded = false;
   96.71 +	}
   96.72  	LLFloater::draw();
   96.73  }
   96.74  
   96.75 @@ -128,6 +152,11 @@
   96.76  
   96.77  	for (int msg_num = 0; (iter != mMessages.end() && msg_num < mPageSize); ++iter, ++msg_num)
   96.78  	{
   96.79 +		if (iter->size() == 0)
   96.80 +		{
   96.81 +			continue;
   96.82 +		}
   96.83 +
   96.84  		LLSD msg = *iter;
   96.85  
   96.86  		LLUUID from_id 		= LLUUID::null;
    97.1 --- a/indra/newview/llfloaterconversationpreview.h	Thu Jul 18 17:27:31 2013 -0400
    97.2 +++ b/indra/newview/llfloaterconversationpreview.h	Mon Aug 26 17:53:30 2013 -0400
    97.3 @@ -42,6 +42,7 @@
    97.4  	virtual ~LLFloaterConversationPreview(){};
    97.5  
    97.6  	virtual BOOL postBuild();
    97.7 +	void SetPages(std::list<LLSD>& messages,const std::string& file_name);
    97.8  
    97.9  	virtual void draw();
   97.10  	virtual void onOpen(const LLSD& key);
   97.11 @@ -59,6 +60,8 @@
   97.12  	std::list<LLSD> mMessages;
   97.13  	std::string		mAccountName;
   97.14  	std::string		mCompleteName;
   97.15 +	std::string     mChatHistoryFileName;
   97.16 +	bool			mChatHistoryLoaded;
   97.17  };
   97.18  
   97.19  #endif /* LLFLOATERCONVERSATIONPREVIEW_H_ */
    98.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    98.2 +++ b/indra/newview/llfloatergotoline.cpp	Mon Aug 26 17:53:30 2013 -0400
    98.3 @@ -0,0 +1,160 @@
    98.4 +/**
    98.5 + * @file llfloatergotoline.h
    98.6 + * @author MartinRJ
    98.7 + * @brief LLFloaterGotoLine class implementation
    98.8 + *
    98.9 + * $LicenseInfo:firstyear=2012&license=viewerlgpl$
   98.10 + * Second Life Viewer Source Code
   98.11 + * Copyright (C) 2012, Linden Research, Inc.
   98.12 + *
   98.13 + * This library is free software; you can redistribute it and/or
   98.14 + * modify it under the terms of the GNU Lesser General Public
   98.15 + * License as published by the Free Software Foundation;
   98.16 + * version 2.1 of the License only.
   98.17 + *
   98.18 + * This library is distributed in the hope that it will be useful,
   98.19 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
   98.20 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   98.21 + * Lesser General Public License for more details.
   98.22 + *
   98.23 + * You should have received a copy of the GNU Lesser General Public
   98.24 + * License along with this library; if not, write to the Free Software
   98.25 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
   98.26 + *
   98.27 + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
   98.28 + * $/LicenseInfo$
   98.29 + */
   98.30 +
   98.31 +#include "llviewerprecompiledheaders.h"
   98.32 +#include "llfloatergotoline.h"
   98.33 +#include "llpreviewscript.h"
   98.34 +#include "llfloaterreg.h"
   98.35 +#include "lllineeditor.h"
   98.36 +#include "llviewertexteditor.h"
   98.37 +#include "llviewerwindow.h"
   98.38 +
   98.39 +LLFloaterGotoLine* LLFloaterGotoLine::sInstance = NULL;
   98.40 +
   98.41 +LLFloaterGotoLine::LLFloaterGotoLine(LLScriptEdCore* editor_core)
   98.42 +:       LLFloater(LLSD()),
   98.43 +        mGotoBox(NULL),
   98.44 +        mEditorCore(editor_core)
   98.45 +{
   98.46 +        buildFromFile("floater_goto_line.xml");
   98.47 +
   98.48 +        sInstance = this;
   98.49 +        
   98.50 +        // find floater in which script panel is embedded
   98.51 +        LLView* viewp = (LLView*)editor_core;
   98.52 +        while(viewp)
   98.53 +        {
   98.54 +                LLFloater* floaterp = dynamic_cast<LLFloater*>(viewp);
   98.55 +                if (floaterp)
   98.56 +                {
   98.57 +                        floaterp->addDependentFloater(this);
   98.58 +                        break;
   98.59 +                }
   98.60 +                viewp = viewp->getParent();
   98.61 +        }
   98.62 +}
   98.63 +
   98.64 +BOOL LLFloaterGotoLine::postBuild()
   98.65 +{
   98.66 +	mGotoBox = getChild<LLLineEditor>("goto_line");
   98.67 +	mGotoBox->setCommitCallback(boost::bind(&LLFloaterGotoLine::onGotoBoxCommit, this));
   98.68 +	mGotoBox->setCommitOnFocusLost(FALSE);
   98.69 +        getChild<LLLineEditor>("goto_line")->setPrevalidate(LLTextValidate::validateNonNegativeS32);
   98.70 +        childSetAction("goto_btn", onBtnGoto,this);
   98.71 +        setDefaultBtn("goto_btn");
   98.72 +
   98.73 +        return TRUE;
   98.74 +}
   98.75 +
   98.76 +//static 
   98.77 +void LLFloaterGotoLine::show(LLScriptEdCore* editor_core)
   98.78 +{
   98.79 +        if (sInstance && sInstance->mEditorCore && sInstance->mEditorCore != editor_core)
   98.80 +        {
   98.81 +                sInstance->closeFloater();
   98.82 +                delete sInstance;
   98.83 +        }
   98.84 +
   98.85 +        if (!sInstance)
   98.86 +        {
   98.87 +                // sInstance will be assigned in the constructor.
   98.88 +                new LLFloaterGotoLine(editor_core);
   98.89 +        }
   98.90 +
   98.91 +        sInstance->openFloater();
   98.92 +}
   98.93 +
   98.94 +LLFloaterGotoLine::~LLFloaterGotoLine()
   98.95 +{
   98.96 +        sInstance = NULL;
   98.97 +}
   98.98 +
   98.99 +// static 
  98.100 +void LLFloaterGotoLine::onBtnGoto(void *userdata)
  98.101 +{
  98.102 +        LLFloaterGotoLine* self = (LLFloaterGotoLine*)userdata;
  98.103 +        self->handleBtnGoto();
  98.104 +}
  98.105 +
  98.106 +void LLFloaterGotoLine::handleBtnGoto()
  98.107 +{
  98.108 +        S32 row = 0;
  98.109 +        S32 column = 0;
  98.110 +        row = getChild<LLUICtrl>("goto_line")->getValue().asInteger();
  98.111 +        if (row >= 0)
  98.112 +        {
  98.113 +                if (mEditorCore && mEditorCore->mEditor)
  98.114 +                {
  98.115 +			mEditorCore->mEditor->deselect();
  98.116 +			mEditorCore->mEditor->setCursor(row, column);
  98.117 +			mEditorCore->mEditor->setFocus(TRUE);
  98.118 +                }
  98.119 +        }
  98.120 +}
  98.121 +
  98.122 +bool LLFloaterGotoLine::hasAccelerators() const
  98.123 +{
  98.124 +        if (mEditorCore)
  98.125 +        {
  98.126 +                return mEditorCore->hasAccelerators();
  98.127 +        }
  98.128 +        return FALSE;
  98.129 +}
  98.130 +
  98.131 +BOOL LLFloaterGotoLine::handleKeyHere(KEY key, MASK mask)
  98.132 +{
  98.133 +        if (mEditorCore)
  98.134 +        {
  98.135 +                return mEditorCore->handleKeyHere(key, mask);
  98.136 +        }
  98.137 +
  98.138 +        return FALSE;
  98.139 +}
  98.140 +
  98.141 +void LLFloaterGotoLine::onGotoBoxCommit()
  98.142 +{
  98.143 +        S32 row = 0;
  98.144 +        S32 column = 0;
  98.145 +        row = getChild<LLUICtrl>("goto_line")->getValue().asInteger();
  98.146 +        if (row >= 0)
  98.147 +        {
  98.148 +                if (mEditorCore && mEditorCore->mEditor)
  98.149 +                {
  98.150 +			mEditorCore->mEditor->setCursor(row, column);
  98.151 +
  98.152 +			S32 rownew = 0;
  98.153 +			S32 columnnew = 0;
  98.154 +			mEditorCore->mEditor->getCurrentLineAndColumn( &rownew, &columnnew, FALSE );  // don't include wordwrap
  98.155 +			if (rownew == row && columnnew == column)
  98.156 +			{
  98.157 +			        mEditorCore->mEditor->deselect();
  98.158 +			        mEditorCore->mEditor->setFocus(TRUE);
  98.159 +			        sInstance->closeFloater();
  98.160 +			} //else do nothing (if the cursor-position didn't change)
  98.161 +                }
  98.162 +        }
  98.163 +}
    99.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    99.2 +++ b/indra/newview/llfloatergotoline.h	Mon Aug 26 17:53:30 2013 -0400
    99.3 @@ -0,0 +1,66 @@
    99.4 +/**
    99.5 + * @file llfloatergotoline.h
    99.6 + * @author MartinRJ
    99.7 + * @brief LLFloaterGotoLine class definition
    99.8 + *
    99.9 + * $LicenseInfo:firstyear=2012&license=viewerlgpl$
   99.10 + * Second Life Viewer Source Code
   99.11 + * Copyright (C) 2012, Linden Research, Inc.
   99.12 + *
   99.13 + * This library is free software; you can redistribute it and/or
   99.14 + * modify it under the terms of the GNU Lesser General Public
   99.15 + * License as published by the Free Software Foundation;
   99.16 + * version 2.1 of the License only.
   99.17 + *
   99.18 + * This library is distributed in the hope that it will be useful,
   99.19 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
   99.20 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   99.21 + * Lesser General Public License for more details.
   99.22 + *
   99.23 + * You should have received a copy of the GNU Lesser General Public
   99.24 + * License along with this library; if not, write to the Free Software
   99.25 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
   99.26 + *
   99.27 + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
   99.28 + * $/LicenseInfo$
   99.29 + */
   99.30 +
   99.31 +#ifndef LL_LLFLOATERGOTOLINE_H
   99.32 +#define LL_LLFLOATERGOTOLINE_H
   99.33 +
   99.34 +#include "llfloater.h"
   99.35 +#include "lllineeditor.h"
   99.36 +#include "llpreviewscript.h"
   99.37 +
   99.38 +class LLScriptEdCore;
   99.39 +
   99.40 +class LLFloaterGotoLine : public LLFloater
   99.41 +{
   99.42 +public:
   99.43 +        LLFloaterGotoLine(LLScriptEdCore* editor_core);
   99.44 +        ~LLFloaterGotoLine();
   99.45 +
   99.46 +        /*virtual*/     BOOL    postBuild();
   99.47 +        static void show(LLScriptEdCore* editor_core);
   99.48 +
   99.49 +        static void onBtnGoto(void* userdata);
   99.50 +        void handleBtnGoto();
   99.51 +
   99.52 +        LLScriptEdCore* getEditorCore() { return mEditorCore; }
   99.53 +        static LLFloaterGotoLine* getInstance() { return sInstance; }
   99.54 +
   99.55 +        virtual bool hasAccelerators() const;
   99.56 +        virtual BOOL handleKeyHere(KEY key, MASK mask);
   99.57 +
   99.58 +private:
   99.59 +
   99.60 +        LLScriptEdCore* mEditorCore;
   99.61 +
   99.62 +        static LLFloaterGotoLine*       sInstance;
   99.63 +
   99.64 +protected:
   99.65 +	LLLineEditor*			mGotoBox;
   99.66 +        void onGotoBoxCommit();
   99.67 +};
   99.68 +
   99.69 +#endif  // LL_LLFLOATERGOTOLINE_H
   100.1 --- a/indra/newview/llfloaterimcontainer.cpp	Thu Jul 18 17:27:31 2013 -0400
   100.2 +++ b/indra/newview/llfloaterimcontainer.cpp	Mon Aug 26 17:53:30 2013 -0400
   100.3 @@ -47,6 +47,7 @@
   100.4  #include "llfloaterpreference.h"
   100.5  #include "llimview.h"
   100.6  #include "llnotificationsutil.h"
   100.7 +#include "lltoolbarview.h"
   100.8  #include "lltransientfloatermgr.h"
   100.9  #include "llviewercontrol.h"
  100.10  #include "llconversationview.h"
  100.11 @@ -54,6 +55,7 @@
  100.12  #include "llworld.h"
  100.13  #include "llsdserialize.h"
  100.14  #include "llviewerobjectlist.h"
  100.15 +#include "boost/foreach.hpp"
  100.16  
  100.17  //
  100.18  // LLFloaterIMContainer
  100.19 @@ -63,7 +65,8 @@
  100.20  	mExpandCollapseBtn(NULL),
  100.21  	mConversationsRoot(NULL),
  100.22  	mConversationsEventStream("ConversationsEvents"),
  100.23 -	mInitialized(false)
  100.24 +	mInitialized(false),
  100.25 +	mIsFirstLaunch(true)
  100.26  {
  100.27      mEnableCallbackRegistrar.add("IMFloaterContainer.Check", boost::bind(&LLFloaterIMContainer::isActionChecked, this, _2));
  100.28  	mCommitCallbackRegistrar.add("IMFloaterContainer.Action", boost::bind(&LLFloaterIMContainer::onCustomAction,  this, _2));
  100.29 @@ -113,6 +116,10 @@
  100.30  
  100.31  void LLFloaterIMContainer::sessionActivated(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)
  100.32  {
  100.33 +	if(!isInVisibleChain())
  100.34 +	{
  100.35 +		setVisibleAndFrontmost(false);
  100.36 +	}
  100.37  	selectConversationPair(session_id, true);
  100.38  	collapseMessagesPane(false);
  100.39  }
  100.40 @@ -204,6 +211,7 @@
  100.41  	// a scroller for folder view
  100.42  	LLRect scroller_view_rect = mConversationsListPanel->getRect();
  100.43  	scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
  100.44 +	scroller_view_rect.mBottom += getChild<LLLayoutStack>("conversations_pane_buttons_stack")->getRect().getHeight();
  100.45  	LLScrollContainer::Params scroller_params(LLUICtrlFactory::getDefaultParams<LLFolderViewScrollContainer>());
  100.46  	scroller_params.rect(scroller_view_rect);
  100.47  
  100.48 @@ -221,7 +229,8 @@
  100.49  	mExpandCollapseBtn->setClickedCallback(boost::bind(&LLFloaterIMContainer::onExpandCollapseButtonClicked, this));
  100.50  	mStubCollapseBtn = getChild<LLButton>("stub_collapse_btn");
  100.51  	mStubCollapseBtn->setClickedCallback(boost::bind(&LLFloaterIMContainer::onStubCollapseButtonClicked, this));
  100.52 -	getChild<LLButton>("speak_btn")->setClickedCallback(boost::bind(&LLFloaterIMContainer::onSpeakButtonClicked, this));
  100.53 +    mSpeakBtn = getChild<LLButton>("speak_btn");
  100.54 +	mSpeakBtn->setClickedCallback(boost::bind(&LLFloaterIMContainer::onSpeakButtonClicked, this));
  100.55  
  100.56  	childSetAction("add_btn", boost::bind(&LLFloaterIMContainer::onAddButtonClicked, this));
  100.57  
  100.58 @@ -258,7 +267,6 @@
  100.59  void LLFloaterIMContainer::onOpen(const LLSD& key)
  100.60  {
  100.61  	LLMultiFloater::onOpen(key);
  100.62 -	openNearbyChat();
  100.63  	reSelectConversation();
  100.64  	assignResizeLimits();
  100.65  }
  100.66 @@ -593,6 +601,7 @@
  100.67  	//Switching from minimized to un-minimized
  100.68  	if(was_minimized && !b)
  100.69  	{
  100.70 +		gToolBarView->flashCommand(LLCommandId("chat"), false);
  100.71  		LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(mSelectedSession);
  100.72  
  100.73  		if(session_floater && !session_floater->isTornOff())
  100.74 @@ -621,7 +630,6 @@
  100.75  			LLFloaterReg::toggleInstanceOrBringToFront(name);
  100.76              selectConversationPair(LLUUID(NULL), false, false);
  100.77  		}
  100.78 -		openNearbyChat();
  100.79  		flashConversationItemWidget(mSelectedSession,false);
  100.80  
  100.81  		LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(mSelectedSession);
  100.82 @@ -651,7 +659,11 @@
  100.83  		LLConversationViewSession* widget = dynamic_cast<LLConversationViewSession*>(widget_it->second);
  100.84  		if (widget)
  100.85  		{
  100.86 -		    widget->setVisibleIfDetached(visible);
  100.87 +			LLFloater* session_floater = widget->getSessionFloater();
  100.88 +			if (session_floater != nearby_chat)
  100.89 +			{
  100.90 +				widget->setVisibleIfDetached(visible);
  100.91 +			}
  100.92  		}
  100.93  	}
  100.94  	
  100.95 @@ -659,10 +671,37 @@
  100.96  	LLMultiFloater::setVisible(visible);
  100.97  }
  100.98  
  100.99 +void LLFloaterIMContainer::getDetachedConversationFloaters(floater_list_t& floaters)
 100.100 +{
 100.101 +	typedef conversations_widgets_map::value_type conv_pair;
 100.102 +	BOOST_FOREACH(conv_pair item, mConversationsWidgets)
 100.103 +	{
 100.104 +		LLConversationViewSession* widget = dynamic_cast<LLConversationViewSession*>(item.second);
 100.105 +		if (widget)
 100.106 +		{
 100.107 +			LLFloater* session_floater = widget->getSessionFloater();
 100.108 +			if (session_floater && session_floater->isDetachedAndNotMinimized())
 100.109 +			{
 100.110 +				floaters.push_back(session_floater);
 100.111 +			}
 100.112 +		}
 100.113 +	}
 100.114 +}
 100.115 +
 100.116  void LLFloaterIMContainer::setVisibleAndFrontmost(BOOL take_focus, const LLSD& key)
 100.117  {
 100.118  	LLMultiFloater::setVisibleAndFrontmost(take_focus, key);
 100.119 -    selectConversationPair(getSelectedSession(), false, take_focus);
 100.120 +	// Do not select "Nearby Chat" conversation, since it will bring its window to front
 100.121 +	// Only select other sessions
 100.122 +	if (!getSelectedSession().isNull())
 100.123 +	{
 100.124 +		selectConversationPair(getSelectedSession(), false, take_focus);
 100.125 +	}
 100.126 +	if (mInitialized && mIsFirstLaunch)
 100.127 +	{
 100.128 +		collapseMessagesPane(gSavedPerAccountSettings.getBOOL("ConversationsMessagePaneCollapsed"));
 100.129 +		mIsFirstLaunch = false;
 100.130 +	}
 100.131  }
 100.132  
 100.133  void LLFloaterIMContainer::updateResizeLimits()
 100.134 @@ -779,13 +818,6 @@
 100.135  	setCanMinimize(at_least_one_panel_is_expanded);
 100.136  
 100.137      assignResizeLimits();
 100.138 -
 100.139 -    // force set correct size for the title after show/hide minimize button
 100.140 -	LLRect cur_rect = getRect();
 100.141 -	LLRect force_rect = cur_rect;
 100.142 -	force_rect.mRight = cur_rect.mRight + 1;
 100.143 -    setRect(force_rect);
 100.144 -    setRect(cur_rect);
 100.145  }
 100.146  
 100.147  void LLFloaterIMContainer::assignResizeLimits()
 100.148 @@ -793,15 +825,12 @@
 100.149  	bool is_conv_pane_expanded = !mConversationsPane->isCollapsed();
 100.150  	bool is_msg_pane_expanded = !mMessagesPane->isCollapsed();
 100.151  
 100.152 -	// With two panels visible number of borders is three, because the borders
 100.153 -	// between the panels are merged into one
 100.154 -    S32 number_of_visible_borders = llmin((is_conv_pane_expanded? 2 : 0) + (is_msg_pane_expanded? 2 : 0), 3);
 100.155 -    S32 summary_width_of_visible_borders = number_of_visible_borders * LLPANEL_BORDER_WIDTH;
 100.156 -	S32 conv_pane_target_width = is_conv_pane_expanded?
 100.157 -			(is_msg_pane_expanded?
 100.158 -					mConversationsPane->getRect().getWidth()
 100.159 -					: mConversationsPane->getExpandedMinDim())
 100.160 -			: mConversationsPane->getMinDim();
 100.161 +    S32 summary_width_of_visible_borders = (is_msg_pane_expanded ? mConversationsStack->getPanelSpacing() : 0) + 1;
 100.162 +
 100.163 +	S32 conv_pane_target_width = is_conv_pane_expanded
 100.164 +		? ( is_msg_pane_expanded?mConversationsPane->getRect().getWidth():mConversationsPane->getExpandedMinDim() )
 100.165 +		: mConversationsPane->getMinDim();
 100.166 +
 100.167  	S32 msg_pane_min_width  = is_msg_pane_expanded ? mMessagesPane->getExpandedMinDim() : 0;
 100.168  	S32 new_min_width = conv_pane_target_width + msg_pane_min_width + summary_width_of_visible_borders;
 100.169  
 100.170 @@ -961,11 +990,11 @@
 100.171  			conversation_floater->setSortOrder(order);
 100.172  		}
 100.173  	}
 100.174 -	
 100.175 +
 100.176  	gSavedSettings.setU32("ConversationSortOrder", (U32)order);
 100.177  }
 100.178  
 100.179 -void LLFloaterIMContainer::getSelectedUUIDs(uuid_vec_t& selected_uuids)
 100.180 +void LLFloaterIMContainer::getSelectedUUIDs(uuid_vec_t& selected_uuids, bool participant_uuids/* = true*/)
 100.181  {
 100.182      const std::set<LLFolderViewItem*> selectedItems = mConversationsRoot->getSelectionList();
 100.183  
 100.184 @@ -978,7 +1007,7 @@
 100.185          conversationItem = static_cast<LLConversationItem *>((*it)->getViewModelItem());
 100.186        
 100.187  		//When a one-on-one conversation exists, retrieve the participant id from the conversation floater
 100.188 -		if(conversationItem->getType() == LLConversationItem::CONV_SESSION_1_ON_1)
 100.189 +		if(conversationItem->getType() == LLConversationItem::CONV_SESSION_1_ON_1 && participant_uuids)
 100.190  		{
 100.191  			LLFloaterIMSession * conversation_floaterp = LLFloaterIMSession::findInstance(conversationItem->getUUID());
 100.192  			LLUUID participant_id = conversation_floaterp->getOtherParticipantUUID();
 100.193 @@ -1133,6 +1162,11 @@
 100.194          {
 100.195              LLFloater::onClickClose(conversationFloater);
 100.196          }
 100.197 +        else if("close_selected_conversations" == command)
 100.198 +        {
 100.199 +        	getSelectedUUIDs(selectedIDS,false);
 100.200 +        	closeSelectedConversations(selectedIDS);
 100.201 +        }
 100.202          else if("open_voice_conversation" == command)
 100.203          {
 100.204              gIMMgr->startCall(conversationItem->getUUID());
 100.205 @@ -1143,7 +1177,7 @@
 100.206          }
 100.207          else if("chat_history" == command)
 100.208          {
 100.209 -			if (selectedIDS.size() > 0)
 100.210 +        	if (selectedIDS.size() > 0)
 100.211  			{
 100.212  				LLAvatarActions::viewChatHistory(selectedIDS.front());
 100.213  			}
 100.214 @@ -1156,6 +1190,17 @@
 100.215          	}
 100.216          }
 100.217      }
 100.218 +    //if there is no LLFloaterIMSession* instance for selected conversation it might be Nearby chat
 100.219 +    else
 100.220 +    {
 100.221 +    	if(conversationItem->getType() == LLConversationItem::CONV_SESSION_NEARBY)
 100.222 +    	{
 100.223 +    		if("chat_history" == command)
 100.224 +    	    {
 100.225 +    	      	LLFloaterReg::showInstance("preview_conversation", LLSD(LLUUID::null), true);
 100.226 +    	    }
 100.227 +    	}
 100.228 +    }
 100.229  }
 100.230  
 100.231  void LLFloaterIMContainer::doToSelected(const LLSD& userdata)
 100.232 @@ -1185,7 +1230,7 @@
 100.233  
 100.234      if (action == "group_profile")
 100.235      {
 100.236 -        LLGroupActions::show(mSelectedSession);
 100.237 +    	LLGroupActions::show(mSelectedSession);
 100.238      }
 100.239      else if (action == "activate_group")
 100.240      {
 100.241 @@ -1211,7 +1256,19 @@
 100.242  	//Enable Chat history item for ad-hoc and group conversations
 100.243  	if ("can_chat_history" == item && uuids.size() > 0)
 100.244  	{
 100.245 -		return LLLogChat::isTranscriptExist(uuids.front());
 100.246 +		//Disable menu item if selected participant is user agent
 100.247 +		if(uuids.front() != gAgentID)
 100.248 +		{
 100.249 +			if (getCurSelectedViewModelItem()->getType() == LLConversationItem::CONV_SESSION_NEARBY)
 100.250 +			{
 100.251 +				return LLLogChat::isNearbyTranscriptExist();
 100.252 +			}
 100.253 +			else
 100.254 +			{
 100.255 +				bool is_group = (getCurSelectedViewModelItem()->getType() == LLConversationItem::CONV_SESSION_GROUP);
 100.256 +				return LLLogChat::isTranscriptExist(uuids.front(),is_group);
 100.257 +			}
 100.258 +		}
 100.259  	}
 100.260  
 100.261  	// If nothing is selected(and selected item is not group chat), everything needs to be disabled
 100.262 @@ -1886,13 +1943,6 @@
 100.263  	}
 100.264  }
 100.265  
 100.266 -void LLFloaterIMContainer::onNearbyChatClosed()
 100.267 -{
 100.268 -	// If nearby chat is the only remaining conversation and it is closed, close whole conversation floater as well
 100.269 -	if (mConversationsItems.size() == 1)
 100.270 -		closeFloater();
 100.271 -}
 100.272 -
 100.273  void LLFloaterIMContainer::reSelectConversation()
 100.274  {
 100.275  	LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(mSelectedSession);
 100.276 @@ -1904,7 +1954,6 @@
 100.277  
 100.278  void LLFloaterIMContainer::updateSpeakBtnState()
 100.279  {
 100.280 -	LLButton* mSpeakBtn = getChild<LLButton>("speak_btn");
 100.281  	mSpeakBtn->setToggleState(LLVoiceClient::getInstance()->getUserPTTState());
 100.282  	mSpeakBtn->setEnabled(LLAgent::isActionAllowed("speak"));
 100.283  }
 100.284 @@ -1925,6 +1974,17 @@
 100.285  	}
 100.286  }
 100.287  
 100.288 +void LLFloaterIMContainer::highlightConversationItemWidget(const LLUUID& session_id, bool is_highlighted)
 100.289 +{
 100.290 +	//Finds the conversation line item to highlight using the session_id
 100.291 +	LLConversationViewSession * widget = dynamic_cast<LLConversationViewSession *>(get_ptr_in_map(mConversationsWidgets,session_id));
 100.292 +
 100.293 +	if (widget)
 100.294 +	{
 100.295 +		widget->setHighlightState(is_highlighted);
 100.296 +	}
 100.297 +}
 100.298 +
 100.299  bool LLFloaterIMContainer::isScrolledOutOfSight(LLConversationViewSession* conversation_item_widget)
 100.300  {
 100.301  	llassert(conversation_item_widget != NULL);
 100.302 @@ -1940,23 +2000,28 @@
 100.303  
 100.304  BOOL LLFloaterIMContainer::handleKeyHere(KEY key, MASK mask )
 100.305  {
 100.306 +	BOOL handled = FALSE;
 100.307 +
 100.308  	if(mask == MASK_ALT)
 100.309  	{
 100.310  		if (KEY_RETURN == key )
 100.311  		{
 100.312  			expandConversation();
 100.313 +			handled = TRUE;
 100.314  		}
 100.315  
 100.316  		if ((KEY_DOWN == key ) || (KEY_RIGHT == key))
 100.317  		{
 100.318  			selectNextorPreviousConversation(true);
 100.319 +			handled = TRUE;
 100.320  		}
 100.321  		if ((KEY_UP == key) || (KEY_LEFT == key))
 100.322  		{
 100.323  			selectNextorPreviousConversation(false);
 100.324 +			handled = TRUE;
 100.325  		}
 100.326  	}
 100.327 -	return TRUE;
 100.328 +	return handled;
 100.329  }
 100.330  
 100.331  bool LLFloaterIMContainer::selectAdjacentConversation(bool focus_selected)
 100.332 @@ -2013,7 +2078,22 @@
 100.333  	}
 100.334  }
 100.335  
 100.336 -void LLFloaterIMContainer::closeFloater(bool app_quitting/* = false*/)
 100.337 +// By default, if torn off session is currently frontmost, LLFloater::isFrontmost() will return FALSE, which can lead to some bugs
 100.338 +// So LLFloater::isFrontmost() is overriden here to check both selected session and the IM floater itself
 100.339 +// Exclude "Nearby Chat" session from the check, as "Nearby Chat" window and "Conversations" floater can be brought
 100.340 +// to front independently
 100.341 +/*virtual*/
 100.342 +BOOL LLFloaterIMContainer::isFrontmost()
 100.343 +{
 100.344 +	LLFloaterIMSessionTab* selected_session = LLFloaterIMSessionTab::getConversation(mSelectedSession);
 100.345 +	LLFloaterIMNearbyChat* nearby_chat = LLFloaterReg::findTypedInstance<LLFloaterIMNearbyChat>("nearby_chat");
 100.346 +	return (selected_session && selected_session->isFrontmost() && (selected_session != nearby_chat))
 100.347 +		|| LLFloater::isFrontmost();
 100.348 +}
 100.349 +
 100.350 +// For conversations, closeFloater() (linked to Ctrl-W) does not actually close the floater but the active conversation.
 100.351 +// This is intentional so it doesn't confuse the user. onClickCloseBtn() closes the whole floater.
 100.352 +void LLFloaterIMContainer::onClickCloseBtn()
 100.353  {
 100.354  	// Always unminimize before trying to close.
 100.355  	// Most of the time the user will never see this state.
 100.356 @@ -2022,7 +2102,80 @@
 100.357  		LLMultiFloater::setMinimized(FALSE);
 100.358  	}
 100.359  
 100.360 -	LLFloater::closeFloater(app_quitting);
 100.361 +	LLFloater::closeFloater();
 100.362 +}
 100.363 +
 100.364 +void LLFloaterIMContainer::closeHostedFloater()
 100.365 +{
 100.366 +	onClickCloseBtn();
 100.367 +}
 100.368 +
 100.369 +void LLFloaterIMContainer::closeAllConversations()
 100.370 +{
 100.371 +	LLDynamicArray<LLUUID> ids;
 100.372 +	for (conversations_items_map::iterator it_session = mConversationsItems.begin(); it_session != mConversationsItems.end(); it_session++)
 100.373 +	{
 100.374 +		LLUUID session_id = it_session->first;
 100.375 +		if (session_id != LLUUID())
 100.376 +		{
 100.377 +			ids.push_back(session_id);
 100.378 +		}
 100.379 +	}
 100.380 +
 100.381 +	for (LLDynamicArray<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); 	++it)
 100.382 +	{
 100.383 +		LLFloaterIMSession *conversationFloater = LLFloaterIMSession::findInstance(*it);
 100.384 +		LLFloater::onClickClose(conversationFloater);
 100.385 +	}
 100.386 +}
 100.387 +
 100.388 +void LLFloaterIMContainer::closeSelectedConversations(const uuid_vec_t& ids)
 100.389 +{
 100.390 +	for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
 100.391 +	{
 100.392 +		//We don't need to close Nearby chat, so skip it
 100.393 +		if (*it != LLUUID())
 100.394 +		{
 100.395 +			LLFloaterIMSession *conversationFloater = LLFloaterIMSession::findInstance(*it);
 100.396 +			if(conversationFloater)
 100.397 +			{
 100.398 +				LLFloater::onClickClose(conversationFloater);
 100.399 +			}
 100.400 +		}
 100.401 +	}
 100.402 +}
 100.403 +void LLFloaterIMContainer::closeFloater(bool app_quitting/* = false*/)
 100.404 +{
 100.405 +	if(app_quitting)
 100.406 +	{
 100.407 +		closeAllConversations();
 100.408 +		onClickCloseBtn();
 100.409 +	}
 100.410 +	else
 100.411 +	{
 100.412 +		// Check for currently active session
 100.413 +		LLUUID session_id = getSelectedSession();
 100.414 +		// If current session is Nearby Chat or there is only one session remaining, close the floater
 100.415 +		if (mConversationsItems.size() == 1 || session_id == LLUUID() || app_quitting)
 100.416 +		{
 100.417 +			onClickCloseBtn();
 100.418 +		}
 100.419 +		else
 100.420 +		{
 100.421 +			// Otherwise, close current conversation
 100.422 +			LLFloaterIMSessionTab* active_conversation = LLFloaterIMSessionTab::getConversation(session_id);
 100.423 +			if (active_conversation)
 100.424 +			{
 100.425 +				active_conversation->closeFloater();
 100.426 +			}
 100.427 +		}
 100.428 +	}
 100.429 +}
 100.430 +
 100.431 +void LLFloaterIMContainer::handleReshape(const LLRect& rect, bool by_user)
 100.432 +{
 100.433 +	LLMultiFloater::handleReshape(rect, by_user);
 100.434 +	storeRectControl();
 100.435  }
 100.436  
 100.437  // EOF
   101.1 --- a/indra/newview/llfloaterimcontainer.h	Thu Jul 18 17:27:31 2013 -0400
   101.2 +++ b/indra/newview/llfloaterimcontainer.h	Mon Aug 26 17:53:30 2013 -0400
   101.3 @@ -63,6 +63,8 @@
   101.4  	/*virtual*/ void setVisible(BOOL visible);
   101.5  	/*virtual*/ void setVisibleAndFrontmost(BOOL take_focus=TRUE, const LLSD& key = LLSD());
   101.6  	/*virtual*/ void updateResizeLimits();
   101.7 +	/*virtual*/ void handleReshape(const LLRect& rect, bool by_user);
   101.8 +
   101.9  	void onCloseFloater(LLUUID& id);
  101.10  
  101.11  	/*virtual*/ void addFloater(LLFloater* floaterp, 
  101.12 @@ -105,8 +107,6 @@
  101.13  	LLConversationItem* getSessionModel(const LLUUID& session_id) { return get_ptr_in_map(mConversationsItems,session_id); }
  101.14  	LLConversationSort& getSortOrder() { return mConversationViewModel.getSorter(); }
  101.15  
  101.16 -	void onNearbyChatClosed();
  101.17 -
  101.18  	// Handling of lists of participants is public so to be common with llfloatersessiontab
  101.19  	// *TODO : Find a better place for this.
  101.20      bool checkContextMenuItem(const std::string& item, uuid_vec_t& selectedIDS);
  101.21 @@ -116,6 +116,10 @@
  101.22  	void assignResizeLimits();
  101.23  	virtual BOOL handleKeyHere(KEY key, MASK mask );
  101.24  	/*virtual*/ void closeFloater(bool app_quitting = false);
  101.25 +    void closeAllConversations();
  101.26 +    void closeSelectedConversations(const uuid_vec_t& ids);
  101.27 +	/*virtual*/ BOOL isFrontmost();
  101.28 +
  101.29  
  101.30  private:
  101.31  	typedef std::map<LLUUID,LLFloater*> avatarID_panel_map_t;
  101.32 @@ -130,6 +134,8 @@
  101.33  	void onStubCollapseButtonClicked();
  101.34  	void processParticipantsStyleUpdate();
  101.35  	void onSpeakButtonClicked();
  101.36 +	/*virtual*/ void onClickCloseBtn();
  101.37 +	/*virtual*/ void closeHostedFloater();
  101.38  
  101.39  	void collapseConversationsPane(bool collapse, bool save_is_allowed=true);
  101.40  
  101.41 @@ -144,7 +150,7 @@
  101.42  	void setSortOrderParticipants(const LLConversationFilter::ESortOrderType order);
  101.43  	void setSortOrder(const LLConversationSort& order);
  101.44  
  101.45 -    void getSelectedUUIDs(uuid_vec_t& selected_uuids);
  101.46 +    void getSelectedUUIDs(uuid_vec_t& selected_uuids, bool participant_uuids = true);
  101.47      const LLConversationItem * getCurSelectedViewModelItem();
  101.48      void getParticipantUUIDs(uuid_vec_t& selected_uuids);
  101.49      void doToSelected(const LLSD& userdata);
  101.50 @@ -169,6 +175,7 @@
  101.51  
  101.52  	LLButton* mExpandCollapseBtn;
  101.53  	LLButton* mStubCollapseBtn;
  101.54 +    LLButton* mSpeakBtn;
  101.55  	LLPanel* mStubPanel;
  101.56  	LLTextBox* mStubTextBox;
  101.57  	LLLayoutPanel* mMessagesPane;
  101.58 @@ -176,6 +183,7 @@
  101.59  	LLLayoutStack* mConversationsStack;
  101.60  	
  101.61  	bool mInitialized;
  101.62 +	bool mIsFirstLaunch;
  101.63  
  101.64  	LLUUID mSelectedSession;
  101.65  	std::string mGeneralTitle;
  101.66 @@ -190,9 +198,12 @@
  101.67  	void updateSpeakBtnState();
  101.68  	static bool isConversationLoggingAllowed();
  101.69  	void flashConversationItemWidget(const LLUUID& session_id, bool is_flashes);
  101.70 +	void highlightConversationItemWidget(const LLUUID& session_id, bool is_highlighted);
  101.71  	bool isScrolledOutOfSight(LLConversationViewSession* conversation_item_widget);
  101.72  	boost::signals2::connection mMicroChangedSignal;
  101.73  	S32 getConversationListItemSize() { return mConversationsWidgets.size(); }
  101.74 +	typedef std::list<LLFloater*> floater_list_t;
  101.75 +	void getDetachedConversationFloaters(floater_list_t& floaters);
  101.76  
  101.77  private:
  101.78  	LLConversationViewSession* createConversationItemWidget(LLConversationItem* item);
   102.1 --- a/indra/newview/llfloaterimnearbychat.cpp	Thu Jul 18 17:27:31 2013 -0400
   102.2 +++ b/indra/newview/llfloaterimnearbychat.cpp	Mon Aug 26 17:53:30 2013 -0400
   102.3 @@ -125,7 +125,7 @@
   102.4  	setTitle(LLTrans::getString("NearbyChatTitle"));
   102.5  
   102.6  	// obsolete, but may be needed for backward compatibility?
   102.7 -	gSavedSettings.declareS32("nearbychat_showicons_and_names", 2, "NearByChat header settings", true);
   102.8 +	gSavedSettings.declareS32("nearbychat_showicons_and_names", 2, "NearByChat header settings", LLControlVariable::PERSIST_NONDFT);
   102.9  
  102.10  	if (gSavedPerAccountSettings.getBOOL("LogShowHistory"))
  102.11  	{
  102.12 @@ -138,19 +138,28 @@
  102.13  // virtual
  102.14  void LLFloaterIMNearbyChat::closeHostedFloater()
  102.15  {
  102.16 -	// Should check how many conversations are ongoing. Close all if 1 only (the Nearby Chat), select next one otherwise
  102.17 +	// If detached from conversations window close anyway
  102.18 +	if (!getHost())
  102.19 +	{
  102.20 +		setVisible(FALSE);
  102.21 +	}
  102.22 +
  102.23 +	// Should check how many conversations are ongoing. Select next to "Nearby Chat" in case there are some other besides.
  102.24 +	// Close conversations window in case "Nearby Chat" is attached and the only conversation
  102.25  	LLFloaterIMContainer* floater_container = LLFloaterIMContainer::getInstance();
  102.26  	if (floater_container->getConversationListItemSize() == 1)
  102.27  	{
  102.28 -		floater_container->closeFloater();
  102.29 +		if (getHost())
  102.30 +		{
  102.31 +			floater_container->closeFloater();
  102.32 +		}
  102.33  	}
  102.34  	else
  102.35  	{
  102.36  		if (!getHost())
  102.37  		{
  102.38 -			setVisible(FALSE);
  102.39 +			floater_container->selectNextConversationByID(LLUUID());
  102.40  		}
  102.41 -		floater_container->selectNextConversationByID(LLUUID());
  102.42  	}
  102.43  }
  102.44  
  102.45 @@ -262,7 +271,7 @@
  102.46  {
  102.47  	LLFloaterIMSessionTab::setVisibleAndFrontmost(take_focus, key);
  102.48  
  102.49 -	if(!isTornOff() && matchesKey(key))
  102.50 +	if(matchesKey(key))
  102.51  	{
  102.52  		LLFloaterIMContainer::getInstance()->selectConversationPair(mSessionID, true, take_focus);
  102.53  	}
  102.54 @@ -296,7 +305,6 @@
  102.55  {
  102.56  	// Override LLFloaterIMSessionTab::onClose() so that Nearby Chat is not removed from the conversation floater
  102.57  	LLFloaterIMSessionTab::restoreFloater();
  102.58 -	onClickCloseBtn();
  102.59  }
  102.60  
  102.61  // virtual
  102.62 @@ -306,13 +314,7 @@
  102.63  	{
  102.64  		return;
  102.65  	}
  102.66 -	LLFloaterIMSessionTab::onTearOffClicked();
  102.67 -	
  102.68 -	LLFloaterIMContainer *im_box = LLFloaterIMContainer::findInstance();
  102.69 -	if (im_box)
  102.70 -	{
  102.71 -		im_box->onNearbyChatClosed();
  102.72 -	}
  102.73 +	closeHostedFloater();
  102.74  }
  102.75  
  102.76  void LLFloaterIMNearbyChat::onChatFontChange(LLFontGL* fontp)
  102.77 @@ -350,11 +352,17 @@
  102.78  void LLFloaterIMNearbyChat::showHistory()
  102.79  {
  102.80  	openFloater();
  102.81 +	LLFloaterIMContainer::getInstance()->selectConversation(LLUUID(NULL));
  102.82 +
  102.83  	if(!isMessagePaneExpanded())
  102.84  	{
  102.85  		restoreFloater();
  102.86  		setFocus(true);
  102.87  	}
  102.88 +	else
  102.89 +	{
  102.90 +		LLFloaterIMContainer::getInstance()->setFocus(TRUE);
  102.91 +	}
  102.92  	setResizeLimits(getMinWidth(), EXPANDED_MIN_HEIGHT);
  102.93  }
  102.94  
  102.95 @@ -568,7 +576,10 @@
  102.96  			if (0 == channel)
  102.97  			{
  102.98  				// discard returned "found" boolean
  102.99 -				LLGestureMgr::instance().triggerAndReviseString(utf8text, &utf8_revised_text);
 102.100 +				if(!LLGestureMgr::instance().triggerAndReviseString(utf8text, &utf8_revised_text))
 102.101 +				{
 102.102 +					utf8_revised_text = utf8text;
 102.103 +				}
 102.104  			}
 102.105  			else
 102.106  			{
 102.107 @@ -582,7 +593,7 @@
 102.108  			if (!utf8_revised_text.empty())
 102.109  			{
 102.110  				// Chat with animation
 102.111 -				sendChatFromViewer(utf8_revised_text, type, TRUE);
 102.112 +				sendChatFromViewer(utf8_revised_text, type, gSavedSettings.getBOOL("PlayChatAnim"));
 102.113  			}
 102.114  		}
 102.115  
 102.116 @@ -636,10 +647,7 @@
 102.117  
 102.118  void LLFloaterIMNearbyChat::onChatBoxCommit()
 102.119  {
 102.120 -	if (mInputEditor->getText().length() > 0)
 102.121 -	{
 102.122 -		sendChat(CHAT_TYPE_NORMAL);
 102.123 -	}
 102.124 +	sendChat(CHAT_TYPE_NORMAL);
 102.125  
 102.126  	gAgent.stopTyping();
 102.127  }
   103.1 --- a/indra/newview/llfloaterimnearbychathandler.cpp	Thu Jul 18 17:27:31 2013 -0400
   103.2 +++ b/indra/newview/llfloaterimnearbychathandler.cpp	Mon Aug 26 17:53:30 2013 -0400
   103.3 @@ -606,6 +606,7 @@
   103.4  
   103.5  		//Don't show nearby toast, if conversation is visible and selected
   103.6  		if ((nearby_chat->hasFocus()) ||
   103.7 +			(LLFloater::isVisible(nearby_chat) && nearby_chat->isTornOff() && !nearby_chat->isMinimized()) ||
   103.8  		    ((im_box->getSelectedSession().isNull() &&
   103.9  				((LLFloater::isVisible(im_box) && !im_box->isMinimized() && im_box->isFrontmost())
  103.10  						|| (LLFloater::isVisible(nearby_chat) && !nearby_chat->isMinimized() && nearby_chat->isFrontmost())))))
   104.1 --- a/indra/newview/llfloaterimnearbychatlistener.cpp	Thu Jul 18 17:27:31 2013 -0400
   104.2 +++ b/indra/newview/llfloaterimnearbychatlistener.cpp	Mon Aug 26 17:53:30 2013 -0400
   104.3 @@ -33,7 +33,7 @@
   104.4  
   104.5  #include "llagent.h"
   104.6  #include "llchat.h"
   104.7 -
   104.8 +#include "llviewercontrol.h"
   104.9  
  104.10  
  104.11  LLFloaterIMNearbyChatListener::LLFloaterIMNearbyChatListener(LLFloaterIMNearbyChat & chatbar)
  104.12 @@ -95,6 +95,6 @@
  104.13  	}
  104.14  
  104.15  	// Send it as if it was typed in
  104.16 -	mChatbar.sendChatFromViewer(chat_to_send, type_o_chat, (BOOL)(channel == 0));
  104.17 +	mChatbar.sendChatFromViewer(chat_to_send, type_o_chat, ((BOOL)(channel == 0)) && gSavedSettings.getBOOL("PlayChatAnim"));
  104.18  }
  104.19  
   105.1 --- a/indra/newview/llfloaterimsession.cpp	Thu Jul 18 17:27:31 2013 -0400
   105.2 +++ b/indra/newview/llfloaterimsession.cpp	Mon Aug 26 17:53:30 2013 -0400
   105.3 @@ -109,18 +109,6 @@
   105.4  void LLFloaterIMSession::onTearOffClicked()
   105.5  {
   105.6      LLFloaterIMSessionTab::onTearOffClicked();
   105.7 -
   105.8 -    if(mIsP2PChat)
   105.9 -    {
  105.10 -        if(isTornOff())
  105.11 -        {
  105.12 -            mSpeakingIndicator->setSpeakerId(mOtherParticipantUUID, mSessionID);
  105.13 -        }
  105.14 -        else
  105.15 -        {
  105.16 -            mSpeakingIndicator->setSpeakerId(LLUUID::null);
  105.17 -        }
  105.18 -    }
  105.19  }
  105.20  
  105.21  // virtual
  105.22 @@ -442,8 +430,11 @@
  105.23  	}
  105.24  	else
  105.25  	{
  105.26 -		// remember whom we have invited, to notify others later, when the invited ones actually join
  105.27 -		mInvitedParticipants.insert(mInvitedParticipants.end(), uuids.begin(), uuids.end());
  105.28 +		if(findInstance(mSessionID))
  105.29 +		{
  105.30 +			// remember whom we have invited, to notify others later, when the invited ones actually join
  105.31 +			mInvitedParticipants.insert(mInvitedParticipants.end(), uuids.begin(), uuids.end());
  105.32 +		}
  105.33  		
  105.34  		inviteToSession(uuids);
  105.35  	}
  105.36 @@ -469,13 +460,18 @@
  105.37  	temp_ids.insert(temp_ids.end(), uuids.begin(), uuids.end());
  105.38  
  105.39  	// then we can close the current session
  105.40 -	onClose(false);
  105.41 +	if(findInstance(mSessionID))
  105.42 +	{
  105.43 +		onClose(false);
  105.44 +
  105.45 +		// remember whom we have invited, to notify others later, when the invited ones actually join
  105.46 +		mInvitedParticipants.insert(mInvitedParticipants.end(), uuids.begin(), uuids.end());
  105.47 +	}
  105.48  
  105.49  	// we start a new session so reset the initialization flag
  105.50  	mSessionInitialized = false;
  105.51  
  105.52 -	// remember whom we have invited, to notify others later, when the invited ones actually join
  105.53 -	mInvitedParticipants.insert(mInvitedParticipants.end(), uuids.begin(), uuids.end());
  105.54 +
  105.55  
  105.56  	// Start a new ad hoc voice call if we invite new participants to a P2P call,
  105.57  	// or start a text chat otherwise.
   106.1 --- a/indra/newview/llfloaterimsessiontab.cpp	Thu Jul 18 17:27:31 2013 -0400
   106.2 +++ b/indra/newview/llfloaterimsessiontab.cpp	Mon Aug 26 17:53:30 2013 -0400
   106.3 @@ -55,7 +55,6 @@
   106.4    ,  mSessionID(session_id.asUUID())
   106.5    , mConversationsRoot(NULL)
   106.6    , mScroller(NULL)
   106.7 -  , mSpeakingIndicator(NULL)
   106.8    , mChatHistory(NULL)
   106.9    , mInputEditor(NULL)
  106.10    , mInputEditorPad(0)
  106.11 @@ -212,7 +211,7 @@
  106.12  	mRightPartPanel->setIgnoreReshape(is_participants_pane_collapsed);
  106.13  
  106.14      S32 participants_pane_target_width = is_participants_pane_collapsed?
  106.15 -    		0 : (mParticipantListPanel->getRect().getWidth() + LLPANEL_BORDER_WIDTH);
  106.16 +    		0 : (mParticipantListPanel->getRect().getWidth() + mParticipantListAndHistoryStack->getPanelSpacing());
  106.17  
  106.18      S32 new_min_width = participants_pane_target_width + mRightPartPanel->getExpandedMinDim() + mFloaterExtraWidth;
  106.19  
  106.20 @@ -241,7 +240,10 @@
  106.21  	mTearOffBtn->setCommitCallback(boost::bind(&LLFloaterIMSessionTab::onTearOffClicked, this));
  106.22  
  106.23  	mGearBtn = getChild<LLButton>("gear_btn");
  106.24 -
  106.25 +    mAddBtn = getChild<LLButton>("add_btn");
  106.26 +	mVoiceButton = getChild<LLButton>("voice_call_btn");
  106.27 +    mTranslationCheckBox = getChild<LLUICtrl>("translate_chat_checkbox_lp");
  106.28 +    
  106.29  	mParticipantListPanel = getChild<LLLayoutPanel>("speakers_list_panel");
  106.30  	mRightPartPanel = getChild<LLLayoutPanel>("right_part_holder");
  106.31  
  106.32 @@ -256,8 +258,6 @@
  106.33  	scroller_params.rect(scroller_view_rect);
  106.34  	mScroller = LLUICtrlFactory::create<LLFolderViewScrollContainer>(scroller_params);
  106.35  	mScroller->setFollowsAll();
  106.36 -	
  106.37 -    mSpeakingIndicator = getChild<LLOutputMonitorCtrl>("speaking_indicator");
  106.38  
  106.39  	// Insert that scroller into the panel widgets hierarchy
  106.40  	mParticipantListPanel->addChild(mScroller);	
  106.41 @@ -270,6 +270,7 @@
  106.42  	mInputPanels = getChild<LLLayoutStack>("input_panels");
  106.43  	
  106.44  	mInputEditor->setTextExpandedCallback(boost::bind(&LLFloaterIMSessionTab::reshapeChatLayoutPanel, this));
  106.45 +	mInputEditor->setMouseUpCallback(boost::bind(&LLFloaterIMSessionTab::onInputEditorClicked, this));
  106.46  	mInputEditor->setCommitOnFocusLost( FALSE );
  106.47  	mInputEditor->setPassDelete(TRUE);
  106.48  	mInputEditor->setFont(LLViewerChat::getChatFont());
  106.49 @@ -372,7 +373,7 @@
  106.50  
  106.51  void LLFloaterIMSessionTab::enableDisableCallBtn()
  106.52  {
  106.53 -    getChildView("voice_call_btn")->setEnabled(
  106.54 +    mVoiceButton->setEnabled(
  106.55      		mSessionID.notNull()
  106.56      		&& mSession
  106.57      		&& mSession->mSessionInitialized
  106.58 @@ -399,6 +400,16 @@
  106.59  	LLTransientDockableFloater::onFocusLost();
  106.60  }
  106.61  
  106.62 +void LLFloaterIMSessionTab::onInputEditorClicked()
  106.63 +{
  106.64 +	LLFloaterIMContainer* im_box = LLFloaterIMContainer::findInstance();
  106.65 +	if (im_box)
  106.66 +	{
  106.67 +		im_box->flashConversationItemWidget(mSessionID,false);
  106.68 +	}
  106.69 +	gToolBarView->flashCommand(LLCommandId("chat"), false);
  106.70 +}
  106.71 +
  106.72  std::string LLFloaterIMSessionTab::appendTime()
  106.73  {
  106.74  	time_t utc_time;
  106.75 @@ -758,7 +769,7 @@
  106.76  
  106.77  void LLFloaterIMSessionTab::showTranslationCheckbox(BOOL show)
  106.78  {
  106.79 -	getChild<LLUICtrl>("translate_chat_checkbox_lp")->setVisible(mIsNearbyChat? show : FALSE);
  106.80 +	mTranslationCheckBox->setVisible(mIsNearbyChat && show);
  106.81  }
  106.82  
  106.83  // static
  106.84 @@ -805,15 +816,10 @@
  106.85  
  106.86  void LLFloaterIMSessionTab::updateCallBtnState(bool callIsActive)
  106.87  {
  106.88 -	LLButton* voiceButton = getChild<LLButton>("voice_call_btn");
  106.89 -	voiceButton->setImageOverlay(
  106.90 -			callIsActive? getString("call_btn_stop") : getString("call_btn_start"));
  106.91 -
  106.92 -	voiceButton->setToolTip(
  106.93 -			callIsActive? getString("end_call_button_tooltip") : getString("start_call_button_tooltip"));
  106.94 +	mVoiceButton->setImageOverlay(callIsActive? getString("call_btn_stop") : getString("call_btn_start"));
  106.95 +	mVoiceButton->setToolTip(callIsActive? getString("end_call_button_tooltip") : getString("start_call_button_tooltip"));
  106.96  
  106.97  	enableDisableCallBtn();
  106.98 -
  106.99  }
 106.100  
 106.101  void LLFloaterIMSessionTab::onSlide(LLFloaterIMSessionTab* self)
 106.102 @@ -898,6 +904,7 @@
 106.103  		mExpandCollapseLineBtn->setImageOverlay(getString("expandline_icon"));
 106.104  		setMessagePaneExpanded(true);
 106.105  		saveCollapsedState();
 106.106 +		mInputEditor->enableSingleLineMode(false);
 106.107  		enableResizeCtrls(true, true, true);
 106.108  	}
 106.109  }
 106.110 @@ -953,8 +960,8 @@
 106.111  	if(prevVisibility != mGearBtn->getVisible())
 106.112  	{
 106.113  		LLRect gear_btn_rect =  mGearBtn->getRect();
 106.114 -		LLRect add_btn_rect = getChild<LLButton>("add_btn")->getRect();
 106.115 -		LLRect call_btn_rect = getChild<LLButton>("voice_call_btn")->getRect();
 106.116 +		LLRect add_btn_rect = mAddBtn->getRect();
 106.117 +		LLRect call_btn_rect = mVoiceButton->getRect();
 106.118  		S32 gap_width = call_btn_rect.mLeft - add_btn_rect.mRight;
 106.119  		S32 right_shift = gear_btn_rect.getWidth() + gap_width;
 106.120  		if(mGearBtn->getVisible())
 106.121 @@ -968,24 +975,24 @@
 106.122  			add_btn_rect.translate(-right_shift,0);
 106.123  			call_btn_rect.translate(-right_shift,0);
 106.124  		}
 106.125 -		getChild<LLButton>("add_btn")->setRect(add_btn_rect);
 106.126 -		getChild<LLButton>("voice_call_btn")->setRect(call_btn_rect);
 106.127 +		mAddBtn->setRect(add_btn_rect);
 106.128 +		mVoiceButton->setRect(call_btn_rect);
 106.129  	}
 106.130  }
 106.131  
 106.132  void LLFloaterIMSessionTab::initBtns()
 106.133  {
 106.134  	LLRect gear_btn_rect =  mGearBtn->getRect();
 106.135 -	LLRect add_btn_rect = getChild<LLButton>("add_btn")->getRect();
 106.136 -	LLRect call_btn_rect = getChild<LLButton>("voice_call_btn")->getRect();
 106.137 +	LLRect add_btn_rect = mAddBtn->getRect();
 106.138 +	LLRect call_btn_rect = mVoiceButton->getRect();
 106.139  	S32 gap_width = call_btn_rect.mLeft - add_btn_rect.mRight;
 106.140  	S32 right_shift = gear_btn_rect.getWidth() + gap_width;
 106.141  
 106.142  	add_btn_rect.translate(-right_shift,0);
 106.143  	call_btn_rect.translate(-right_shift,0);
 106.144  
 106.145 -	getChild<LLButton>("add_btn")->setRect(add_btn_rect);
 106.146 -	getChild<LLButton>("voice_call_btn")->setRect(call_btn_rect);
 106.147 +	mAddBtn->setRect(add_btn_rect);
 106.148 +	mVoiceButton->setRect(call_btn_rect);
 106.149  }
 106.150  
 106.151  // static
 106.152 @@ -1083,21 +1090,26 @@
 106.153  }
 106.154  BOOL LLFloaterIMSessionTab::handleKeyHere(KEY key, MASK mask )
 106.155  {
 106.156 +	BOOL handled = FALSE;
 106.157 +
 106.158  	if(mask == MASK_ALT)
 106.159  	{
 106.160  		LLFloaterIMContainer* floater_container = LLFloaterIMContainer::getInstance();
 106.161  		if (KEY_RETURN == key && !isTornOff())
 106.162  		{
 106.163  			floater_container->expandConversation();
 106.164 +			handled = TRUE;
 106.165  		}
 106.166  		if ((KEY_UP == key) || (KEY_LEFT == key))
 106.167  		{
 106.168  			floater_container->selectNextorPreviousConversation(false);
 106.169 +			handled = TRUE;
 106.170  		}
 106.171  		if ((KEY_DOWN == key ) || (KEY_RIGHT == key))
 106.172  		{
 106.173  			floater_container->selectNextorPreviousConversation(true);
 106.174 +			handled = TRUE;
 106.175  		}
 106.176  	}
 106.177 -	return TRUE;
 106.178 +	return handled;
 106.179  }
   107.1 --- a/indra/newview/llfloaterimsessiontab.h	Thu Jul 18 17:27:31 2013 -0400
   107.2 +++ b/indra/newview/llfloaterimsessiontab.h	Mon Aug 26 17:53:30 2013 -0400
   107.3 @@ -171,8 +171,7 @@
   107.4  	LLFolderView* mConversationsRoot;
   107.5  	LLScrollContainer* mScroller;
   107.6  
   107.7 -    LLOutputMonitorCtrl* mSpeakingIndicator;
   107.8 -	LLChatHistory* mChatHistory;
   107.9 +    LLChatHistory* mChatHistory;
  107.10  	LLChatEntry* mInputEditor;
  107.11  	LLLayoutPanel * mChatLayoutPanel;
  107.12  	LLLayoutStack * mInputPanels;
  107.13 @@ -182,6 +181,9 @@
  107.14  	LLButton* mTearOffBtn;
  107.15  	LLButton* mCloseBtn;
  107.16  	LLButton* mGearBtn;
  107.17 +	LLButton* mAddBtn;
  107.18 +    LLButton* mVoiceButton;
  107.19 +    LLUICtrl* mTranslationCheckBox;
  107.20  
  107.21  private:
  107.22  	// Handling selection and contextual menu
  107.23 @@ -201,6 +203,8 @@
  107.24  	 */
  107.25  	void reshapeChatLayoutPanel();
  107.26  
  107.27 +	void onInputEditorClicked();
  107.28 +
  107.29  	bool checkIfTornOff();
  107.30      bool mIsHostAttached;
  107.31      bool mHasVisibleBeenInitialized;
   108.1 --- a/indra/newview/llfloaterland.cpp	Thu Jul 18 17:27:31 2013 -0400
   108.2 +++ b/indra/newview/llfloaterland.cpp	Mon Aug 26 17:53:30 2013 -0400
   108.3 @@ -2118,7 +2118,7 @@
   108.4  
   108.5  	bool can_change =
   108.6  			LLViewerParcelMgr::isParcelModifiableByAgent(
   108.7 -				parcel, GP_LAND_CHANGE_IDENTITY)
   108.8 +				parcel, GP_LAND_FIND_PLACES)
   108.9  			&& region
  108.10  			&& !(region->getRegionFlag(REGION_FLAGS_BLOCK_PARCEL_SEARCH));
  108.11  
   109.1 --- a/indra/newview/llfloaterpreference.cpp	Thu Jul 18 17:27:31 2013 -0400
   109.2 +++ b/indra/newview/llfloaterpreference.cpp	Mon Aug 26 17:53:30 2013 -0400
   109.3 @@ -452,6 +452,7 @@
   109.4  	getChild<LLComboBox>("ConferenceIMOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"ConferenceIMOptions"));
   109.5  	getChild<LLComboBox>("GroupChatOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"GroupChatOptions"));
   109.6  	getChild<LLComboBox>("NearbyChatOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"NearbyChatOptions"));
   109.7 +	getChild<LLComboBox>("ObjectIMOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"ObjectIMOptions"));
   109.8  
   109.9  	// if floater is opened before login set default localized do not disturb message
  109.10  	if (LLStartUp::getStartupState() < STATE_STARTED)
  109.11 @@ -721,6 +722,7 @@
  109.12  	onNotificationsChange("ConferenceIMOptions");
  109.13  	onNotificationsChange("GroupChatOptions");
  109.14  	onNotificationsChange("NearbyChatOptions");
  109.15 +	onNotificationsChange("ObjectIMOptions");
  109.16  
  109.17  	LLPanelLogin::setAlwaysRefresh(true);
  109.18  	refresh();
  109.19 @@ -928,7 +930,7 @@
  109.20  	bool show_notifications_alert = true;
  109.21  	for (notifications_map::iterator it_notification = mNotificationOptions.begin(); it_notification != mNotificationOptions.end(); it_notification++)
  109.22  	{
  109.23 -		if(it_notification->second != "None")
  109.24 +		if(it_notification->second != "No action")
  109.25  		{
  109.26  			show_notifications_alert = false;
  109.27  			break;
   110.1 --- a/indra/newview/llfolderviewmodelinventory.cpp	Thu Jul 18 17:27:31 2013 -0400
   110.2 +++ b/indra/newview/llfolderviewmodelinventory.cpp	Mon Aug 26 17:53:30 2013 -0400
   110.3 @@ -74,6 +74,7 @@
   110.4  		it != end_it;
   110.5  		++it)
   110.6  	{
   110.7 +        // Recursive call to sort() on child (CHUI-849)
   110.8  		LLFolderViewFolder* child_folderp = *it;
   110.9  		sort(child_folderp);
  110.10  
  110.11 @@ -129,12 +130,12 @@
  110.12  void LLFolderViewModelItemInventory::setPassedFilter(bool passed, S32 filter_generation, std::string::size_type string_offset, std::string::size_type string_size)
  110.13  {
  110.14  	LLFolderViewModelItemCommon::setPassedFilter(passed, filter_generation, string_offset, string_size);
  110.15 -
  110.16 -	bool passed_filter_before = mPrevPassedAllFilters;
  110.17 +	bool before = mPrevPassedAllFilters;
  110.18  	mPrevPassedAllFilters = passedFilter(filter_generation);
  110.19  
  110.20 -	if (passed_filter_before != mPrevPassedAllFilters)
  110.21 +    if (before != mPrevPassedAllFilters)
  110.22  	{
  110.23 +        // Need to rearrange the folder if the filtered state of the item changed
  110.24  		LLFolderViewFolder* parent_folder = mFolderViewItem->getParentFolder();
  110.25  		if (parent_folder)
  110.26  		{
  110.27 @@ -150,11 +151,11 @@
  110.28  	bool continue_filtering = true;
  110.29  	if (item->getLastFilterGeneration() < filter_generation)
  110.30  	{
  110.31 -		// recursive application of the filter for child items
  110.32 +		// Recursive application of the filter for child items (CHUI-849)
  110.33  		continue_filtering = item->filter( filter );
  110.34  	}
  110.35  
  110.36 -	// track latest generation to pass any child items, for each folder up to root
  110.37 +	// Update latest generation to pass filter in parent and propagate up to root
  110.38  	if (item->passedFilter())
  110.39  	{
  110.40  		LLFolderViewModelItemInventory* view_model = this;
  110.41 @@ -174,53 +175,61 @@
  110.42  	const S32 filter_generation = filter.getCurrentGeneration();
  110.43  	const S32 must_pass_generation = filter.getFirstRequiredGeneration();
  110.44  
  110.45 -	if (getLastFilterGeneration() >= must_pass_generation 
  110.46 +    if (getLastFilterGeneration() >= must_pass_generation
  110.47  		&& getLastFolderFilterGeneration() >= must_pass_generation
  110.48  		&& !passedFilter(must_pass_generation))
  110.49  	{
  110.50  		// failed to pass an earlier filter that was a subset of the current one
  110.51 -		// go ahead and flag this item as done
  110.52 +		// go ahead and flag this item as not pass
  110.53  		setPassedFilter(false, filter_generation);
  110.54  		setPassedFolderFilter(false, filter_generation);
  110.55  		return true;
  110.56  	}
  110.57  
  110.58 -	const bool passed_filter_folder = (getInventoryType() == LLInventoryType::IT_CATEGORY) 
  110.59 -		? filter.checkFolder(this)
  110.60 -		: true;
  110.61 +    // *TODO : Revise the logic for fast pass on less restrictive filter case
  110.62 +    /*
  110.63 +     const S32 sufficient_pass_generation = filter.getFirstSuccessGeneration();
  110.64 +    if (getLastFilterGeneration() >= sufficient_pass_generation
  110.65 +		&& getLastFolderFilterGeneration() >= sufficient_pass_generation
  110.66 +		&& passedFilter(sufficient_pass_generation))
  110.67 +	{
  110.68 +		// passed an earlier filter that was a superset of the current one
  110.69 +		// go ahead and flag this item as pass
  110.70 +		setPassedFilter(true, filter_generation);
  110.71 +		setPassedFolderFilter(true, filter_generation);
  110.72 +		return true;
  110.73 +	}
  110.74 +     */
  110.75 +    
  110.76 +	const bool passed_filter_folder = (getInventoryType() == LLInventoryType::IT_CATEGORY) ? filter.checkFolder(this) : true;
  110.77  	setPassedFolderFilter(passed_filter_folder, filter_generation);
  110.78  
  110.79 -	if(!mChildren.empty()
  110.80 +	bool continue_filtering = true;
  110.81 +
  110.82 +	if (!mChildren.empty()
  110.83  		&& (getLastFilterGeneration() < must_pass_generation // haven't checked descendants against minimum required generation to pass
  110.84 -			|| descendantsPassedFilter(must_pass_generation))) // or at least one descendant has passed the minimum requirement
  110.85 +            || descendantsPassedFilter(must_pass_generation))) // or at least one descendant has passed the minimum requirement
  110.86  	{
  110.87  		// now query children
  110.88 -		for (child_list_t::iterator iter = mChildren.begin(), end_iter = mChildren.end();
  110.89 -			iter != end_iter && filter.getFilterCount() > 0;
  110.90 -			++iter)
  110.91 +		for (child_list_t::iterator iter = mChildren.begin(), end_iter = mChildren.end(); iter != end_iter; ++iter)
  110.92  		{
  110.93 -			if (!filterChildItem((*iter), filter))
  110.94 +			continue_filtering = filterChildItem((*iter), filter);
  110.95 +            if (!continue_filtering)
  110.96  			{
  110.97  				break;
  110.98  			}
  110.99  		}
 110.100  	}
 110.101  
 110.102 -	// if we didn't use all filter iterations
 110.103 -	// that means we filtered all of our descendants
 110.104 -	// so filter ourselves now
 110.105 -	if (filter.getFilterCount() > 0)
 110.106 +	// If we didn't use all the filter time that means we filtered all of our descendants so we can filter ourselves now
 110.107 +    if (continue_filtering)
 110.108  	{
 110.109 -		filter.decrementFilterCount();
 110.110 -
 110.111 +        // This is where filter check on the item done (CHUI-849)
 110.112  		const bool passed_filter = filter.check(this);
 110.113  		setPassedFilter(passed_filter, filter_generation, filter.getStringMatchOffset(this), filter.getFilterStringSize());
 110.114 -		return true;
 110.115 +        continue_filtering = !filter.isTimedOut();
 110.116  	}
 110.117 -	else
 110.118 -	{
 110.119 -		return false;
 110.120 -	}
 110.121 +    return continue_filtering;
 110.122  }
 110.123  
 110.124  LLFolderViewModelInventory* LLInventoryPanel::getFolderViewModel()
 110.125 @@ -307,8 +316,8 @@
 110.126  	}
 110.127  }
 110.128  
 110.129 -LLFolderViewModelItemInventory::LLFolderViewModelItemInventory( class LLFolderViewModelInventory& root_view_model ) 
 110.130 -	:	LLFolderViewModelItemCommon(root_view_model),
 110.131 -	mPrevPassedAllFilters(false)
 110.132 +LLFolderViewModelItemInventory::LLFolderViewModelItemInventory( class LLFolderViewModelInventory& root_view_model ) :
 110.133 +    LLFolderViewModelItemCommon(root_view_model),
 110.134 +    mPrevPassedAllFilters(false)
 110.135  {
 110.136  }
   111.1 --- a/indra/newview/llfolderviewmodelinventory.h	Thu Jul 18 17:27:31 2013 -0400
   111.2 +++ b/indra/newview/llfolderviewmodelinventory.h	Mon Aug 26 17:53:30 2013 -0400
   111.3 @@ -59,9 +59,8 @@
   111.4  
   111.5  	virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const = 0;
   111.6  	virtual LLToolDragAndDrop::ESource getDragSource() const = 0;
   111.7 -
   111.8  protected:
   111.9 -	bool								mPrevPassedAllFilters;
  111.10 +    bool mPrevPassedAllFilters;
  111.11  };
  111.12  
  111.13  class LLInventorySort
   112.1 --- a/indra/newview/llgesturemgr.cpp	Thu Jul 18 17:27:31 2013 -0400
   112.2 +++ b/indra/newview/llgesturemgr.cpp	Mon Aug 26 17:53:30 2013 -0400
   112.3 @@ -166,7 +166,7 @@
   112.4  			continue;
   112.5  		}
   112.6  		else 
   112.7 -		{ // Make gesture active and persistent through login sessions.  -spatters 07-12-06
   112.8 +		{ // Make gesture active and persistent through login sessions.  -Aura 07-12-06
   112.9  			activateGesture(item->getUUID());
  112.10  		}
  112.11  
   113.1 --- a/indra/newview/llgroupactions.cpp	Thu Jul 18 17:27:31 2013 -0400
   113.2 +++ b/indra/newview/llgroupactions.cpp	Mon Aug 26 17:53:30 2013 -0400
   113.3 @@ -116,6 +116,80 @@
   113.4  };
   113.5  LLGroupHandler gGroupHandler;
   113.6  
   113.7 +// This object represents a pending request for specified group member information
   113.8 +// which is needed to check whether avatar can leave group
   113.9 +class LLFetchGroupMemberData : public LLGroupMgrObserver
  113.10 +{
  113.11 +public:
  113.12 +	LLFetchGroupMemberData(const LLUUID& group_id) : 
  113.13 +		mGroupId(group_id),
  113.14 +		mRequestProcessed(false),
  113.15 +		LLGroupMgrObserver(group_id) 
  113.16 +	{
  113.17 +		llinfos << "Sending new group member request for group_id: "<< group_id << llendl;
  113.18 +		LLGroupMgr* mgr = LLGroupMgr::getInstance();
  113.19 +		// register ourselves as an observer
  113.20 +		mgr->addObserver(this);
  113.21 +		// send a request
  113.22 +		mgr->sendGroupPropertiesRequest(group_id);
  113.23 +		mgr->sendCapGroupMembersRequest(group_id);
  113.24 +	}
  113.25 +
  113.26 +	~LLFetchGroupMemberData()
  113.27 +	{
  113.28 +		if (!mRequestProcessed)
  113.29 +		{
  113.30 +			// Request is pending
  113.31 +			llwarns << "Destroying pending group member request for group_id: "
  113.32 +				<< mGroupId << llendl;
  113.33 +		}
  113.34 +		// Remove ourselves as an observer
  113.35 +		LLGroupMgr::getInstance()->removeObserver(this);
  113.36 +	}
  113.37 +
  113.38 +	void changed(LLGroupChange gc)
  113.39 +	{
  113.40 +		if (gc == GC_MEMBER_DATA && !mRequestProcessed)
  113.41 +		{
  113.42 +			LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupId);
  113.43 +			if (!gdatap)
  113.44 +			{
  113.45 +				llwarns << "LLGroupMgr::getInstance()->getGroupData() was NULL" << llendl;
  113.46 +			} 
  113.47 +			else if (!gdatap->isMemberDataComplete())
  113.48 +			{
  113.49 +				llwarns << "LLGroupMgr::getInstance()->getGroupData()->isMemberDataComplete() was FALSE" << llendl;
  113.50 +			}
  113.51 +			else
  113.52 +			{
  113.53 +				processGroupData();
  113.54 +				mRequestProcessed = true;
  113.55 +			}
  113.56 +		}
  113.57 +	}
  113.58 +
  113.59 +	LLUUID getGroupId() { return mGroupId; }
  113.60 +	virtual void processGroupData() = 0;
  113.61 +protected:
  113.62 +	LLUUID mGroupId;
  113.63 +private:
  113.64 +	bool mRequestProcessed;
  113.65 +};
  113.66 +
  113.67 +class LLFetchLeaveGroupData: public LLFetchGroupMemberData
  113.68 +{
  113.69 +public:
  113.70 +	 LLFetchLeaveGroupData(const LLUUID& group_id)
  113.71 +		 : LLFetchGroupMemberData(group_id)
  113.72 +	 {}
  113.73 +	 void processGroupData()
  113.74 +	 {
  113.75 +		 LLGroupActions::processLeaveGroupDataResponse(mGroupId);
  113.76 +	 }
  113.77 +};
  113.78 +
  113.79 +LLFetchLeaveGroupData* gFetchLeaveGroupData = NULL;
  113.80 +
  113.81  // static
  113.82  void LLGroupActions::search()
  113.83  {
  113.84 @@ -208,23 +282,52 @@
  113.85  void LLGroupActions::leave(const LLUUID& group_id)
  113.86  {
  113.87  	if (group_id.isNull())
  113.88 +	{
  113.89  		return;
  113.90 +	}
  113.91  
  113.92 -	S32 count = gAgent.mGroups.count();
  113.93 -	S32 i;
  113.94 -	for (i = 0; i < count; ++i)
  113.95 +	LLGroupData group_data;
  113.96 +	if (gAgent.getGroupData(group_id, group_data))
  113.97  	{
  113.98 -		if(gAgent.mGroups.get(i).mID == group_id)
  113.99 -			break;
 113.100 +		LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_id);
 113.101 +		if (!gdatap || !gdatap->isMemberDataComplete())
 113.102 +		{
 113.103 +			if (gFetchLeaveGroupData != NULL)
 113.104 +			{
 113.105 +				delete gFetchLeaveGroupData;
 113.106 +				gFetchLeaveGroupData = NULL;
 113.107 +			}
 113.108 +			gFetchLeaveGroupData = new LLFetchLeaveGroupData(group_id);
 113.109 +		}
 113.110 +		else
 113.111 +		{
 113.112 +			processLeaveGroupDataResponse(group_id);
 113.113 +		}
 113.114  	}
 113.115 -	if (i < count)
 113.116 +}
 113.117 +
 113.118 +//static
 113.119 +void LLGroupActions::processLeaveGroupDataResponse(const LLUUID group_id)
 113.120 +{
 113.121 +	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_id);
 113.122 +	LLUUID agent_id = gAgent.getID();
 113.123 +	LLGroupMgrGroupData::member_list_t::iterator mit = gdatap->mMembers.find(agent_id);
 113.124 +	//get the member data for the group
 113.125 +	if ( mit != gdatap->mMembers.end() )
 113.126  	{
 113.127 -		LLSD args;
 113.128 -		args["GROUP"] = gAgent.mGroups.get(i).mName;
 113.129 -		LLSD payload;
 113.130 -		payload["group_id"] = group_id;
 113.131 -		LLNotificationsUtil::add("GroupLeaveConfirmMember", args, payload, onLeaveGroup);
 113.132 +		LLGroupMemberData* member_data = (*mit).second;
 113.133 +
 113.134 +		if ( member_data && member_data->isOwner() && gdatap->mMemberCount == 1)
 113.135 +		{
 113.136 +			LLNotificationsUtil::add("OwnerCannotLeaveGroup");
 113.137 +			return;
 113.138 +		}
 113.139  	}
 113.140 +	LLSD args;
 113.141 +	args["GROUP"] = gdatap->mName;
 113.142 +	LLSD payload;
 113.143 +	payload["group_id"] = group_id;
 113.144 +	LLNotificationsUtil::add("GroupLeaveConfirmMember", args, payload, onLeaveGroup);
 113.145  }
 113.146  
 113.147  // static
   114.1 --- a/indra/newview/llgroupactions.h	Thu Jul 18 17:27:31 2013 -0400
   114.2 +++ b/indra/newview/llgroupactions.h	Mon Aug 26 17:53:30 2013 -0400
   114.3 @@ -114,6 +114,14 @@
   114.4  private:
   114.5  	static bool onJoinGroup(const LLSD& notification, const LLSD& response);
   114.6  	static bool onLeaveGroup(const LLSD& notification, const LLSD& response);
   114.7 +	
   114.8 +	/**
   114.9 +	 * This function is called by LLFetchLeaveGroupData upon receiving a response to a group 
  114.10 +	 * members data request.
  114.11 +	 */
  114.12 +	static void processLeaveGroupDataResponse(const LLUUID group_id);
  114.13 +
  114.14 +	friend class LLFetchLeaveGroupData;
  114.15  };
  114.16  
  114.17  #endif // LL_LLGROUPACTIONS_H
   115.1 --- a/indra/newview/llimview.cpp	Thu Jul 18 17:27:31 2013 -0400
   115.2 +++ b/indra/newview/llimview.cpp	Mon Aug 26 17:53:30 2013 -0400
   115.3 @@ -103,6 +103,7 @@
   115.4  }
   115.5  
   115.6  
   115.7 +void notify_of_message(const LLSD& msg, bool is_dnd_msg);
   115.8  
   115.9  void process_dnd_im(const LLSD& notification)
  115.10  {
  115.11 @@ -129,15 +130,9 @@
  115.12              fromID, 
  115.13              false, 
  115.14              false); //will need slight refactor to retrieve whether offline message or not (assume online for now)
  115.15 -
  115.16 -		LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container");
  115.17 -		
  115.18 -		if (im_box)
  115.19 -		{
  115.20 -			im_box->flashConversationItemWidget(sessionID, true);
  115.21 -		}
  115.22 -
  115.23 -    }
  115.24 +	}
  115.25 +
  115.26 +	notify_of_message(data, true);
  115.27  }
  115.28  
  115.29  
  115.30 @@ -158,75 +153,106 @@
  115.31  	LLNotificationsUtil::add("IMToast", args, args, boost::bind(&LLFloaterIMContainer::showConversation, LLFloaterIMContainer::getInstance(), msg["session_id"].asUUID()));
  115.32  }
  115.33  
  115.34 -void on_new_message(const LLSD& msg)
  115.35 +void notify_of_message(const LLSD& msg, bool is_dnd_msg)
  115.36  {
  115.37 -    std::string user_preferences;
  115.38 -    LLUUID participant_id = msg["from_id"].asUUID();
  115.39 -    LLUUID session_id = msg["session_id"].asUUID();
  115.40 -    LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(session_id);
  115.41 -
  115.42 -    // do not show notification which goes from agent
  115.43 -    if (gAgent.getID() == participant_id)
  115.44 -    {
  115.45 -        return;
  115.46 -    }
  115.47 -
  115.48 -    // determine state of conversations floater
  115.49 -    enum {CLOSED, NOT_ON_TOP, ON_TOP, ON_TOP_AND_ITEM_IS_SELECTED} conversations_floater_status;
  115.50 -
  115.51 -
  115.52 -
  115.53 -    LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container");
  115.54 +	std::string user_preferences;
  115.55 +	LLUUID participant_id = msg[is_dnd_msg ? "FROM_ID" : "from_id"].asUUID();
  115.56 +	LLUUID session_id = msg[is_dnd_msg ? "SESSION_ID" : "session_id"].asUUID();
  115.57 +	LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(session_id);
  115.58 +
  115.59 +	// do not show notification which goes from agent
  115.60 +	if (gAgent.getID() == participant_id)
  115.61 +	{
  115.62 +		return;
  115.63 +	}
  115.64 +
  115.65 +	// determine state of conversations floater
  115.66 +	enum {CLOSED, NOT_ON_TOP, ON_TOP, ON_TOP_AND_ITEM_IS_SELECTED} conversations_floater_status;
  115.67 +
  115.68 +
  115.69 +	LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container");
  115.70  	LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(session_id);
  115.71 -
  115.72 +	bool store_dnd_message = false; // flag storage of a dnd message
  115.73 +	bool is_session_focused = session_floater->isTornOff() && session_floater->hasFocus();
  115.74  	if (!LLFloater::isVisible(im_box) || im_box->isMinimized())
  115.75  	{
  115.76  		conversations_floater_status = CLOSED;
  115.77  	}
  115.78  	else if (!im_box->hasFocus() &&
  115.79 -			    !(session_floater && LLFloater::isVisible(session_floater)
  115.80 -	            && !session_floater->isMinimized() && session_floater->hasFocus()))
  115.81 +		!(session_floater && LLFloater::isVisible(session_floater)
  115.82 +		&& !session_floater->isMinimized() && session_floater->hasFocus()))
  115.83  	{
  115.84  		conversations_floater_status = NOT_ON_TOP;
  115.85  	}
  115.86  	else if (im_box->getSelectedSession() != session_id)
  115.87  	{
  115.88  		conversations_floater_status = ON_TOP;
  115.89 -    }
  115.90 +	}
  115.91  	else
  115.92  	{
  115.93  		conversations_floater_status = ON_TOP_AND_ITEM_IS_SELECTED;
  115.94  	}
  115.95  
  115.96 -    //  determine user prefs for this session
  115.97 -    if (session_id.isNull())
  115.98 -    {
  115.99 -    	user_preferences = gSavedSettings.getString("NotificationNearbyChatOptions");
 115.100 -    }
 115.101 -    else if(session->isP2PSessionType())
 115.102 -    {
 115.103 -        if (LLAvatarTracker::instance().isBuddy(participant_id))
 115.104 -        {
 115.105 -        	user_preferences = gSavedSettings.getString("NotificationFriendIMOptions");
 115.106 -        }
 115.107 -        else
 115.108 -        {
 115.109 -        	user_preferences = gSavedSettings.getString("NotificationNonFriendIMOptions");
 115.110 -        }
 115.111 -    }
 115.112 -    else if(session->isAdHocSessionType())
 115.113 -    {
 115.114 -    	user_preferences = gSavedSettings.getString("NotificationConferenceIMOptions");
 115.115 -    }
 115.116 -    else if(session->isGroupSessionType())
 115.117 -    {
 115.118 -    	user_preferences = gSavedSettings.getString("NotificationGroupChatOptions");
 115.119 -    }
 115.120 -
 115.121 -    // actions:
 115.122 +	//  determine user prefs for this session
 115.123 +	if (session_id.isNull())
 115.124 +	{
 115.125 +		if (msg["source_type"].asInteger() == CHAT_SOURCE_OBJECT)
 115.126 +		{
 115.127 +			user_preferences = gSavedSettings.getString("NotificationObjectIMOptions");
 115.128 +			if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundObjectIM") == TRUE))
 115.129 +			{
 115.130 +				make_ui_sound("UISndNewIncomingIMSession");
 115.131 +			}
 115.132 +		}
 115.133 +		else
 115.134 +		{
 115.135 +			user_preferences = gSavedSettings.getString("NotificationNearbyChatOptions");
 115.136 +			if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNearbyChatIM") == TRUE))
 115.137 +			{
 115.138 +				make_ui_sound("UISndNewIncomingIMSession");
 115.139 +			}
 115.140 +		}
 115.141 +	}
 115.142 +	else if(session->isP2PSessionType())
 115.143 +	{
 115.144 +		if (LLAvatarTracker::instance().isBuddy(participant_id))
 115.145 +		{
 115.146 +			user_preferences = gSavedSettings.getString("NotificationFriendIMOptions");
 115.147 +			if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundFriendIM") == TRUE))
 115.148 +			{
 115.149 +				make_ui_sound("UISndNewIncomingIMSession");
 115.150 +			}
 115.151 +		}
 115.152 +		else
 115.153 +		{
 115.154 +			user_preferences = gSavedSettings.getString("NotificationNonFriendIMOptions");
 115.155 +			if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNonFriendIM") == TRUE))
 115.156 +			{
 115.157 +				make_ui_sound("UISndNewIncomingIMSession");
 115.158 +			}
 115.159 +		}
 115.160 +	}
 115.161 +	else if(session->isAdHocSessionType())
 115.162 +	{
 115.163 +		user_preferences = gSavedSettings.getString("NotificationConferenceIMOptions");
 115.164 +		if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundConferenceIM") == TRUE))
 115.165 +		{
 115.166 +			make_ui_sound("UISndNewIncomingIMSession");
 115.167 +		}
 115.168 +	}
 115.169 +	else if(session->isGroupSessionType())
 115.170 +	{
 115.171 +		user_preferences = gSavedSettings.getString("NotificationGroupChatOptions");
 115.172 +		if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundGroupChatIM") == TRUE))
 115.173 +		{
 115.174 +			make_ui_sound("UISndNewIncomingIMSession");
 115.175 +		}
 115.176 +	}
 115.177 +
 115.178 +	// actions:
 115.179  
 115.180      // 0. nothing - exit
 115.181 -    if (("none" == user_preferences ||
 115.182 +    if (("noaction" == user_preferences ||
 115.183      		ON_TOP_AND_ITEM_IS_SELECTED == conversations_floater_status)
 115.184      	&& session_floater->isMessagePaneExpanded())
 115.185      {
 115.186 @@ -261,57 +287,103 @@
 115.187  				}
 115.188  			}
 115.189  		}
 115.190 -        else
 115.191 -        {
 115.192 -            //If in DND mode, allow notification to be stored so upon DND exit
 115.193 -            //useMostItrusiveIMNotification will be called to notify user a message exists
 115.194 -            if(session_id.notNull()
 115.195 -               && participant_id.notNull()
 115.196 -		       && !session_floater->isShown())
 115.197 -            {
 115.198 -                LLAvatarNameCache::get(participant_id, boost::bind(&on_avatar_name_cache_toast, _1, _2, msg));
 115.199 -	        }
 115.200 -        }
 115.201 -    }
 115.202 -
 115.203 -    // 2. Flash line item
 115.204 -    if ("openconversations" == user_preferences
 115.205 -    		|| ON_TOP == conversations_floater_status
 115.206 -    		|| ("toast" == user_preferences && ON_TOP != conversations_floater_status)
 115.207 -    		|| ("flash" == user_preferences && CLOSED == conversations_floater_status))
 115.208 -    {
 115.209 -    	if(!LLMuteList::getInstance()->isMuted(participant_id))
 115.210 -    	{
 115.211 -    		im_box->flashConversationItemWidget(session_id, true);
 115.212 -    	}
 115.213 -    }
 115.214 -
 115.215 -    // 3. Flash FUI button
 115.216 -    if (("toast" == user_preferences || "flash" == user_preferences) &&
 115.217 -    		(CLOSED == conversations_floater_status
 115.218 -    		    || NOT_ON_TOP == conversations_floater_status))
 115.219 -    {
 115.220 -    	if(!LLMuteList::getInstance()->isMuted(participant_id)
 115.221 -            && !gAgent.isDoNotDisturb())
 115.222 -    	{
 115.223 -    		gToolBarView->flashCommand(LLCommandId("chat"), true);
 115.224 -    	}
 115.225 -    }
 115.226 -
 115.227 -    // 4. Toast
 115.228 -    if ((("toast" == user_preferences) &&
 115.229 -    		(CLOSED == conversations_floater_status
 115.230 -    		    || NOT_ON_TOP == conversations_floater_status))
 115.231 -    		    || !session_floater->isMessagePaneExpanded())
 115.232 -
 115.233 -    {
 115.234 -        //Show IM toasts (upper right toasts)
 115.235 -        // Skip toasting for system messages and for nearby chat
 115.236 -        if(session_id.notNull() && participant_id.notNull())
 115.237 -        {
 115.238 -            LLAvatarNameCache::get(participant_id, boost::bind(&on_avatar_name_cache_toast, _1, _2, msg));
 115.239 -        }
 115.240 -    }
 115.241 +		else
 115.242 +		{
 115.243 +			store_dnd_message = true;
 115.244 +		}
 115.245 +
 115.246 +	}
 115.247 +
 115.248 +	// 2. Flash line item
 115.249 +	if ("openconversations" == user_preferences
 115.250 +		|| ON_TOP == conversations_floater_status
 115.251 +		|| ("toast" == user_preferences && ON_TOP != conversations_floater_status)
 115.252 +		|| ("flash" == user_preferences && (CLOSED == conversations_floater_status
 115.253 +				 	 	 	 	 	 	|| NOT_ON_TOP == conversations_floater_status))
 115.254 +		|| is_dnd_msg)
 115.255 +	{
 115.256 +		if(!LLMuteList::getInstance()->isMuted(participant_id))
 115.257 +		{
 115.258 +			if(gAgent.isDoNotDisturb())
 115.259 +			{
 115.260 +				store_dnd_message = true;
 115.261 +			}
 115.262 +			else
 115.263 +			{
 115.264 +				if (is_dnd_msg && (ON_TOP == conversations_floater_status || 
 115.265 +									NOT_ON_TOP == conversations_floater_status || 
 115.266 +									CLOSED == conversations_floater_status))
 115.267 +				{
 115.268 +					im_box->highlightConversationItemWidget(session_id, true);
 115.269 +				}
 115.270 +				else
 115.271 +				{
 115.272 +					im_box->flashConversationItemWidget(session_id, true);
 115.273 +				}
 115.274 +			}
 115.275 +		}
 115.276 +	}
 115.277 +
 115.278 +	// 3. Flash FUI button
 115.279 +	if (("toast" == user_preferences || "flash" == user_preferences) &&
 115.280 +		(CLOSED == conversations_floater_status
 115.281 +		|| NOT_ON_TOP == conversations_floater_status)
 115.282 +		&& !is_session_focused
 115.283 +		&& !is_dnd_msg) //prevent flashing FUI button because the conversation floater will have already opened
 115.284 +	{
 115.285 +		if(!LLMuteList::getInstance()->isMuted(participant_id))
 115.286 +		{
 115.287 +			if(!gAgent.isDoNotDisturb())
 115.288 +			{
 115.289 +				gToolBarView->flashCommand(LLCommandId("chat"), true, im_box->isMinimized());
 115.290 +			}
 115.291 +			else
 115.292 +			{
 115.293 +				store_dnd_message = true;
 115.294 +			}
 115.295 +		}
 115.296 +	}
 115.297 +
 115.298 +	// 4. Toast
 115.299 +	if ((("toast" == user_preferences) &&
 115.300 +		(ON_TOP_AND_ITEM_IS_SELECTED != conversations_floater_status) &&
 115.301 +		(!session_floater->isTornOff() || !LLFloater::isVisible(session_floater)))
 115.302 +		|| !session_floater->isMessagePaneExpanded())
 115.303 +
 115.304 +	{
 115.305 +		//Show IM toasts (upper right toasts)
 115.306 +		// Skip toasting for system messages and for nearby chat
 115.307 +		if(session_id.notNull() && participant_id.notNull())
 115.308 +		{
 115.309 +			if(!is_dnd_msg)
 115.310 +			{
 115.311 +				if(gAgent.isDoNotDisturb())
 115.312 +				{
 115.313 +					store_dnd_message = true;
 115.314 +				}
 115.315 +				else
 115.316 +				{
 115.317 +					LLAvatarNameCache::get(participant_id, boost::bind(&on_avatar_name_cache_toast, _1, _2, msg));
 115.318 +				}
 115.319 +			}
 115.320 +		}
 115.321 +	}
 115.322 +	if (store_dnd_message)
 115.323 +	{
 115.324 +		// If in DND mode, allow notification to be stored so upon DND exit 
 115.325 +		// the user will be notified with some limitations (see 'is_dnd_msg' flag checks)
 115.326 +		if(session_id.notNull()
 115.327 +			&& participant_id.notNull()
 115.328 +			&& !session_floater->isShown())
 115.329 +		{
 115.330 +			LLAvatarNameCache::get(participant_id, boost::bind(&on_avatar_name_cache_toast, _1, _2, msg));
 115.331 +		}
 115.332 +	}
 115.333 +}
 115.334 +
 115.335 +void on_new_message(const LLSD& msg)
 115.336 +{
 115.337 +	notify_of_message(msg, false);
 115.338  }
 115.339  
 115.340  LLIMModel::LLIMModel() 
 115.341 @@ -2597,6 +2669,13 @@
 115.342  		fixed_session_name = session_name;
 115.343  		name_is_setted = true;
 115.344  	}
 115.345 +	bool skip_message = false;
 115.346 +	if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly"))
 115.347 +	{
 115.348 +		// Evaluate if we need to skip this message when that setting is true (default is false)
 115.349 +		skip_message = (LLAvatarTracker::instance().getBuddyInfo(other_participant_id) == NULL);	// Skip non friends...
 115.350 +		skip_message &= !(other_participant_id == gAgentID);	// You are your best friend... Don't skip yourself
 115.351 +	}
 115.352  
 115.353  	bool new_session = !hasSession(new_session_id);
 115.354  	if (new_session)
 115.355 @@ -2608,6 +2687,12 @@
 115.356  		}
 115.357  		LLIMModel::getInstance()->newSession(new_session_id, fixed_session_name, dialog, other_participant_id, false, is_offline_msg);
 115.358  
 115.359 +		LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(new_session_id);
 115.360 +		skip_message &= !session->isGroupSessionType();			// Do not skip group chats...
 115.361 +		if(skip_message)
 115.362 +		{
 115.363 +			gIMMgr->leaveSession(new_session_id);
 115.364 +		}
 115.365  		// When we get a new IM, and if you are a god, display a bit
 115.366  		// of information about the source. This is to help liaisons
 115.367  		// when answering questions.
 115.368 @@ -2648,23 +2733,13 @@
 115.369          }
 115.370  	}
 115.371  
 115.372 -	bool skip_message = false;
 115.373 -	if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly"))
 115.374 -	{
 115.375 -		// Evaluate if we need to skip this message when that setting is true (default is false)
 115.376 -		LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(new_session_id);
 115.377 -		skip_message = (LLAvatarTracker::instance().getBuddyInfo(other_participant_id) == NULL);	// Skip non friends...
 115.378 -		skip_message &= !session->isGroupSessionType();			// Do not skip group chats...
 115.379 -		skip_message &= !(other_participant_id == gAgentID);	// You are your best friend... Don't skip yourself
 115.380 -	}
 115.381 -
 115.382  	if (!LLMuteList::getInstance()->isMuted(other_participant_id, LLMute::flagTextChat) && !skip_message)
 115.383  	{
 115.384  		LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg);
 115.385  	}
 115.386  
 115.387  	// Open conversation floater if offline messages are present
 115.388 -	if (is_offline_msg)
 115.389 +	if (is_offline_msg && !skip_message)
 115.390      {
 115.391          LLFloaterReg::showInstance("im_container");
 115.392  	    LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container")->
 115.393 @@ -2971,10 +3046,9 @@
 115.394  	{
 115.395  		bool isRejectGroupCall = (gSavedSettings.getBOOL("VoiceCallsRejectGroup") && (notify_box_type == "VoiceInviteGroup"));
 115.396  		bool isRejectNonFriendCall = (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL));
 115.397 -		bool isRejectDoNotDisturb = (gAgent.isDoNotDisturb() && !hasSession(session_id));
 115.398 -		if	(isRejectGroupCall || isRejectNonFriendCall || isRejectDoNotDisturb)
 115.399 +		if	(isRejectGroupCall || isRejectNonFriendCall || gAgent.isDoNotDisturb())
 115.400  		{
 115.401 -			if (isRejectDoNotDisturb && !isRejectGroupCall && !isRejectNonFriendCall)
 115.402 +			if (gAgent.isDoNotDisturb() && !isRejectGroupCall && !isRejectNonFriendCall)
 115.403  			{
 115.404  				LLSD args;
 115.405  				addSystemMessage(session_id, "you_auto_rejected_call", args);
   116.1 --- a/indra/newview/llinventorybridge.cpp	Thu Jul 18 17:27:31 2013 -0400
   116.2 +++ b/indra/newview/llinventorybridge.cpp	Mon Aug 26 17:53:30 2013 -0400
   116.3 @@ -3444,7 +3444,7 @@
   116.4  			}
   116.5  		}
   116.6  
   116.7 -		//Added by spatters to force inventory pull on right-click to display folder options correctly. 07-17-06
   116.8 +		//Added by aura to force inventory pull on right-click to display folder options correctly. 07-17-06
   116.9  		mCallingCards = mWearables = FALSE;
  116.10  
  116.11  		LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD);
   117.1 --- a/indra/newview/llinventoryfilter.cpp	Thu Jul 18 17:27:31 2013 -0400
   117.2 +++ b/indra/newview/llinventoryfilter.cpp	Mon Aug 26 17:53:30 2013 -0400
   117.3 @@ -70,11 +70,8 @@
   117.4  	mFilterSubString(p.substring),
   117.5  	mCurrentGeneration(0),
   117.6  	mFirstRequiredGeneration(0),
   117.7 -	mFirstSuccessGeneration(0),
   117.8 -	mFilterCount(0)
   117.9 +	mFirstSuccessGeneration(0)
  117.10  {
  117.11 -	mNextFilterGeneration = mCurrentGeneration + 1;
  117.12 -
  117.13  	// copy mFilterOps into mDefaultFilterOps
  117.14  	markDefault();
  117.15  }
  117.16 @@ -92,9 +89,7 @@
  117.17  		return passed_clipboard;
  117.18  	}
  117.19  
  117.20 -	std::string::size_type string_offset = mFilterSubString.size() ? listener->getSearchableName().find(mFilterSubString) : std::string::npos;
  117.21 -
  117.22 -	BOOL passed = (mFilterSubString.size() == 0 || string_offset != std::string::npos);
  117.23 +	bool passed = (mFilterSubString.size() ? listener->getSearchableName().find(mFilterSubString) != std::string::npos : true);
  117.24  	passed = passed && checkAgainstFilterType(listener);
  117.25  	passed = passed && checkAgainstPermissions(listener);
  117.26  	passed = passed && checkAgainstFilterLinks(listener);
  117.27 @@ -105,17 +100,12 @@
  117.28  
  117.29  bool LLInventoryFilter::check(const LLInventoryItem* item)
  117.30  {
  117.31 -	std::string::size_type string_offset = mFilterSubString.size() ? item->getName().find(mFilterSubString) : std::string::npos;
  117.32 -
  117.33 +	const bool passed_string = (mFilterSubString.size() ? item->getName().find(mFilterSubString) != std::string::npos : true);
  117.34  	const bool passed_filtertype = checkAgainstFilterType(item);
  117.35  	const bool passed_permissions = checkAgainstPermissions(item);
  117.36 -	const BOOL passed_clipboard = checkAgainstClipboard(item->getUUID());
  117.37 -	const bool passed = (passed_filtertype 
  117.38 -		&& passed_permissions
  117.39 -		&& passed_clipboard 
  117.40 -		&&	(mFilterSubString.size() == 0 || string_offset != std::string::npos));
  117.41 +	const bool passed_clipboard = checkAgainstClipboard(item->getUUID());
  117.42  
  117.43 -	return passed;
  117.44 +	return passed_filtertype && passed_permissions && passed_clipboard && passed_string;
  117.45  }
  117.46  
  117.47  bool LLInventoryFilter::checkFolder(const LLFolderViewModelItem* item) const
  117.48 @@ -439,7 +429,7 @@
  117.49  		current_types = types;
  117.50  		if (more_bits_set && fewer_bits_set)
  117.51  		{
  117.52 -			// neither less or more restrive, both simultaneously
  117.53 +			// neither less or more restrictive, both simultaneously
  117.54  			// so we need to filter from scratch
  117.55  			setModified(FILTER_RESTART);
  117.56  		}
  117.57 @@ -714,7 +704,7 @@
  117.58  void LLInventoryFilter::setModified(EFilterModified behavior)
  117.59  {
  117.60  	mFilterText.clear();
  117.61 -	mCurrentGeneration = mNextFilterGeneration++;
  117.62 +	mCurrentGeneration++;
  117.63  
  117.64  	if (mFilterModified == FILTER_NONE)
  117.65  	{
  117.66 @@ -1021,21 +1011,19 @@
  117.67  	return mFilterOps.mShowFolderState; 
  117.68  }
  117.69  
  117.70 -void LLInventoryFilter::setFilterCount(S32 count) 
  117.71 -{ 
  117.72 -	mFilterCount = count; 
  117.73 -}
  117.74 -S32 LLInventoryFilter::getFilterCount() const
  117.75 +bool LLInventoryFilter::isTimedOut()
  117.76  {
  117.77 -	return mFilterCount;
  117.78 +	return mFilterTime.hasExpired();
  117.79  }
  117.80  
  117.81 -void LLInventoryFilter::decrementFilterCount() 
  117.82 -{ 
  117.83 -	mFilterCount--; 
  117.84 +void LLInventoryFilter::resetTime(S32 timeout)
  117.85 +{
  117.86 +	mFilterTime.reset();
  117.87 +    F32 time_in_sec = (F32)(timeout)/1000.0;
  117.88 +	mFilterTime.setTimerExpirySec(time_in_sec);
  117.89  }
  117.90  
  117.91 -S32 LLInventoryFilter::getCurrentGeneration() const 
  117.92 +S32 LLInventoryFilter::getCurrentGeneration() const
  117.93  { 
  117.94  	return mCurrentGeneration;
  117.95  }
   118.1 --- a/indra/newview/llinventoryfilter.h	Thu Jul 18 17:27:31 2013 -0400
   118.2 +++ b/indra/newview/llinventoryfilter.h	Mon Aug 26 17:53:30 2013 -0400
   118.3 @@ -215,12 +215,11 @@
   118.4  	void 				setModified(EFilterModified behavior = FILTER_RESTART);
   118.5  
   118.6  	// +-------------------------------------------------------------------+
   118.7 -	// + Count
   118.8 +	// + Time
   118.9  	// +-------------------------------------------------------------------+
  118.10 -	void 				setFilterCount(S32 count);
  118.11 -	S32 				getFilterCount() const;
  118.12 -	void 				decrementFilterCount();
  118.13 -
  118.14 +	void 				resetTime(S32 timeout);
  118.15 +    bool                isTimedOut();
  118.16 +    
  118.17  	// +-------------------------------------------------------------------+
  118.18  	// + Default
  118.19  	// +-------------------------------------------------------------------+
  118.20 @@ -262,13 +261,15 @@
  118.21  	const std::string		mName;
  118.22  
  118.23  	S32						mCurrentGeneration;
  118.24 +    // The following makes checking for pass/no pass possible even if the item is not checked against the current generation
  118.25 +    // Any item that *did not pass* the "required generation" will *not pass* the current one
  118.26 +    // Any item that *passes* the "success generation" will *pass* the current one
  118.27  	S32						mFirstRequiredGeneration;
  118.28  	S32						mFirstSuccessGeneration;
  118.29 -	S32						mNextFilterGeneration;
  118.30  
  118.31 -	S32						mFilterCount;
  118.32  	EFilterModified 		mFilterModified;
  118.33 -
  118.34 +	LLTimer                 mFilterTime;
  118.35 +    
  118.36  	std::string 			mFilterText;
  118.37  	std::string 			mEmptyLookupMessage;
  118.38  };
   119.1 --- a/indra/newview/llinventorypanel.cpp	Thu Jul 18 17:27:31 2013 -0400
   119.2 +++ b/indra/newview/llinventorypanel.cpp	Mon Aug 26 17:53:30 2013 -0400
   119.3 @@ -192,7 +192,7 @@
   119.4      p.show_item_link_overlays = mShowItemLinkOverlays;
   119.5      p.root = NULL;
   119.6      p.options_menu = "menu_inventory.xml";
   119.7 -	
   119.8 +
   119.9      return LLUICtrlFactory::create<LLFolderView>(p);
  119.10  }
  119.11  
  119.12 @@ -396,6 +396,7 @@
  119.13  	return getFilter().getShowFolderState();
  119.14  }
  119.15  
  119.16 +// Called when something changed in the global model (new item, item coming through the wire, rename, move, etc...) (CHUI-849)
  119.17  void LLInventoryPanel::modelChanged(U32 mask)
  119.18  {
  119.19  	static LLFastTimer::DeclareTimer FTM_REFRESH("Inventory Refresh");
   120.1 --- a/indra/newview/lllogchat.cpp	Thu Jul 18 17:27:31 2013 -0400
   120.2 +++ b/indra/newview/lllogchat.cpp	Mon Aug 26 17:53:30 2013 -0400
   120.3 @@ -25,7 +25,7 @@
   120.4   */
   120.5  
   120.6  #include "llviewerprecompiledheaders.h"
   120.7 -
   120.8 +#include "llfloaterconversationpreview.h"
   120.9  #include "llagent.h"
  120.10  #include "llagentui.h"
  120.11  #include "llavatarnamecache.h"
  120.12 @@ -206,6 +206,7 @@
  120.13  };
  120.14  
  120.15  LLLogChat::save_history_signal_t * LLLogChat::sSaveHistorySignal = NULL;
  120.16 +LLLoadHistoryThread::load_end_signal_t * LLLoadHistoryThread::mLoadEndSignal = NULL;
  120.17  
  120.18  //static
  120.19  std::string LLLogChat::makeLogFileName(std::string filename)
  120.20 @@ -336,75 +337,83 @@
  120.21  void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params)
  120.22  {
  120.23  	if (file_name.empty())
  120.24 -	{
  120.25 -		llwarns << "Session name is Empty!" << llendl;
  120.26 -		return ;
  120.27 -	}
  120.28 +				{
  120.29 +					LL_WARNS("LLLogChat::loadChatHistory") << "Session name is Empty!" << LL_ENDL;
  120.30 +					return ;
  120.31 +				}
  120.32  
  120.33 -	bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false;
  120.34 +				bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false;
  120.35  
  120.36 -	LLFILE* fptr = LLFile::fopen(makeLogFileName(file_name), "r");/*Flawfinder: ignore*/
  120.37 -	if (!fptr)
  120.38 -	{
  120.39 -		fptr = LLFile::fopen(oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
  120.40 -		if (!fptr)
  120.41 -		{
  120.42 -			return;						//No previous conversation with this name.
  120.43 -		}
  120.44 -	}
  120.45 - 
  120.46 -	char buffer[LOG_RECALL_SIZE];		/*Flawfinder: ignore*/
  120.47 -	char *bptr;
  120.48 -	S32 len;
  120.49 -	bool firstline = TRUE;
  120.50 +				LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/
  120.51 +				if (!fptr)
  120.52 +				{
  120.53 +					fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
  120.54 +					if (!fptr)
  120.55 +					{
  120.56 +						return;						//No previous conversation with this name.
  120.57 +					}
  120.58 +				}
  120.59  
  120.60 -	if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1  , SEEK_END))
  120.61 -	{	//We need to load the whole historyFile or it's smaller than recall size, so get it all.
  120.62 -		firstline = FALSE;
  120.6