aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--linden/indra/cmake/CopyWinLibs.cmake52
-rw-r--r--linden/indra/llaudio/audioengine.cpp66
-rw-r--r--linden/indra/llaudio/audioengine.h6
-rw-r--r--linden/indra/llcommon/llsdserialize.cpp2
-rw-r--r--linden/indra/llcommon/llsdserialize_xml.cpp13
-rw-r--r--linden/indra/llmedia/llmediabase.h3
-rw-r--r--linden/indra/llmedia/llmediaimplgstreamer.cpp107
-rw-r--r--linden/indra/llmedia/llmediaimplgstreamer.h3
-rw-r--r--linden/indra/llmedia/llmediaimplgstreamer_syms_raw.inc4
-rw-r--r--linden/indra/llmessage/llpumpio.cpp8
-rw-r--r--linden/indra/llmessage/message_prehash.cpp1
-rw-r--r--linden/indra/llmessage/message_prehash.h1
-rw-r--r--linden/indra/newview/CMakeLists.txt1
-rw-r--r--linden/indra/newview/llfloaterabout.cpp10
-rw-r--r--linden/indra/newview/llfloatertopobjects.cpp8
-rw-r--r--linden/indra/newview/lloverlaybar.cpp8
-rw-r--r--linden/indra/newview/llpreviewlandmark.cpp12
-rw-r--r--linden/indra/newview/llselectmgr.cpp2
-rw-r--r--linden/indra/newview/lltoolpie.cpp6
-rw-r--r--linden/indra/newview/llviewermenu.cpp9
-rw-r--r--linden/indra/newview/llviewermenu.h3
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_top_objects.xml10
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/menu_pie_hud.xml23
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml18
24 files changed, 253 insertions, 123 deletions
diff --git a/linden/indra/cmake/CopyWinLibs.cmake b/linden/indra/cmake/CopyWinLibs.cmake
index e80f0c3..458b016 100644
--- a/linden/indra/cmake/CopyWinLibs.cmake
+++ b/linden/indra/cmake/CopyWinLibs.cmake
@@ -9,14 +9,14 @@ include(CMakeCopyIfDifferent)
9set(gst_plugin_release_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release/lib/gstreamer-plugins") 9set(gst_plugin_release_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release/lib/gstreamer-plugins")
10set(gst_plugin_release_files 10set(gst_plugin_release_files
11 libdshowsrcwrapper.dll 11 libdshowsrcwrapper.dll
12 libfsselector.dll 12 libgsta52.dll
13 libfsvalve.dll
14 libgstacmenc.dll 13 libgstacmenc.dll
15 libgstadder.dll 14 libgstadder.dll
16 libgstalaw.dll 15 libgstalaw.dll
17 libgstalpha.dll 16 libgstalpha.dll
18 libgstalphacolor.dll 17 libgstalphacolor.dll
19 libgstapp.dll 18 libgstapp.dll
19 libgstasfdemux.dll
20 libgstaudiochunk.dll 20 libgstaudiochunk.dll
21 libgstaudioconvert.dll 21 libgstaudioconvert.dll
22 libgstaudiofx.dll 22 libgstaudiofx.dll
@@ -27,41 +27,44 @@ set(gst_plugin_release_files
27 libgstavi.dll 27 libgstavi.dll
28 libgstcoreelements.dll 28 libgstcoreelements.dll
29 libgstcutter.dll 29 libgstcutter.dll
30 libgstdecodebin2.dll
31 libgstdecodebin.dll 30 libgstdecodebin.dll
31 libgstdecodebin2.dll
32 libgstdirectdraw.dll 32 libgstdirectdraw.dll
33 libgstdirectsound.dll 33 libgstdirectsound.dll
34 libgstdshowdecwrapper.dll 34 libgstdshowdecwrapper.dll
35 libgstdshowsrcwrapper.dll 35 libgstdshowsrcwrapper.dll
36 libgstdshowvideosink.dll 36 libgstdshowvideosink.dll
37 libgstdtmf.dll 37 libgstfaad.dll
38 libgstffmpeg.dll 38 libgstffmpeg.dll
39 libgstffmpegcolorspace.dll 39 libgstffmpegcolorspace.dll
40 libgstflv.dll 40 libgstflv.dll
41 libgstgamma.dll
41 libgstgdp.dll 42 libgstgdp.dll
42 libgsth264parse.dll 43 libgsth264parse.dll
43 libgsticydemux.dll 44 libgsticydemux.dll
44 libgstid3demux.dll 45 libgstid3demux.dll
45 libgstjpeg.dll 46 libgstjpeg.dll
46 libgstlevel.dll 47 libgstlevel.dll
47 libgstmad.dll
48 libgstmms.dll 48 libgstmms.dll
49 libgstmpeg2dec.dll 49 libgstmpeg2dec.dll
50 libgstmpeg4videoparse.dll
50 libgstmpegaudioparse.dll 51 libgstmpegaudioparse.dll
51 libgstmpegstream.dll 52 libgstmpegstream.dll
52 libgstmpegvideoparse.dll 53 libgstmpegvideoparse.dll
53 libgstmscodecs.dll
54 libgstmulaw.dll 54 libgstmulaw.dll
55 libgstmultipart.dll 55 libgstmultipart.dll
56 libgstneon.dll 56 libgstneon.dll
57 libgstogg.dll 57 libgstogg.dll
58 libgstpcapparse.dll
58 libgstplaybin.dll 59 libgstplaybin.dll
59 libgstpng.dll 60 libgstpng.dll
60 libgstqtdemux.dll 61 libgstqtdemux.dll
61 libgstqueue2.dll 62 libgstqueue2.dll
63 libgstreal.dll
64 libgstrealmedia.dll
62 libgstrtp.dll 65 libgstrtp.dll
63 libgstrtpmanager.dll 66 libgstrtpmanager.dll
64 libgstrtpmuxer.dll 67 libgstrtpmuxer.dll
65 libgstrtsp.dll 68 libgstrtsp.dll
66 libgstsmpte.dll 69 libgstsmpte.dll
67 libgsttheora.dll 70 libgsttheora.dll
@@ -74,13 +77,12 @@ set(gst_plugin_release_files
74 libgstvideorate.dll 77 libgstvideorate.dll
75 libgstvideoscale.dll 78 libgstvideoscale.dll
76 libgstvideosignal.dll 79 libgstvideosignal.dll
77 libgstvideotestsrc.dll
78 libgstvolume.dll
79 libgstvolume.dll 80 libgstvolume.dll
80 libgstvorbis.dll 81 libgstvorbis.dll
81 libgstwasapi.dll 82 libgstwasapi.dll
82 libgstwavparse.dll 83 libgstwavparse.dll
83 libgstwininet.dll 84 libgstwininet.dll
85 libgstwinks.dll
84 libgstx264.dll 86 libgstx264.dll
85 libgstxvid.dll 87 libgstxvid.dll
86 ) 88 )
@@ -96,14 +98,14 @@ set(all_targets ${all_targets} ${out_targets})
96set(gst_plugin_debug_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug/lib/gstreamer-plugins") 98set(gst_plugin_debug_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug/lib/gstreamer-plugins")
97set(gst_plugin_debug_files 99set(gst_plugin_debug_files
98 libdshowsrcwrapper.dll 100 libdshowsrcwrapper.dll
99 libfsselector.dll 101 libgsta52.dll
100 libfsvalve.dll
101 libgstacmenc.dll 102 libgstacmenc.dll
102 libgstadder.dll 103 libgstadder.dll
103 libgstalaw.dll 104 libgstalaw.dll
104 libgstalpha.dll 105 libgstalpha.dll
105 libgstalphacolor.dll 106 libgstalphacolor.dll
106 libgstapp.dll 107 libgstapp.dll
108 libgstasfdemux.dll
107 libgstaudiochunk.dll 109 libgstaudiochunk.dll
108 libgstaudioconvert.dll 110 libgstaudioconvert.dll
109 libgstaudiofx.dll 111 libgstaudiofx.dll
@@ -114,41 +116,44 @@ set(gst_plugin_debug_files
114 libgstavi.dll 116 libgstavi.dll
115 libgstcoreelements.dll 117 libgstcoreelements.dll
116 libgstcutter.dll 118 libgstcutter.dll
117 libgstdecodebin2.dll
118 libgstdecodebin.dll 119 libgstdecodebin.dll
120 libgstdecodebin2.dll
119 libgstdirectdraw.dll 121 libgstdirectdraw.dll
120 libgstdirectsound.dll 122 libgstdirectsound.dll
121 libgstdshowdecwrapper.dll 123 libgstdshowdecwrapper.dll
122 libgstdshowsrcwrapper.dll 124 libgstdshowsrcwrapper.dll
123 libgstdshowvideosink.dll 125 libgstdshowvideosink.dll
124 libgstdtmf.dll 126 libgstfaad.dll
125 libgstffmpeg.dll 127 libgstffmpeg.dll
126 libgstffmpegcolorspace.dll 128 libgstffmpegcolorspace.dll
127 libgstflv.dll 129 libgstflv.dll
130 libgstgamma.dll
128 libgstgdp.dll 131 libgstgdp.dll
129 libgsth264parse.dll 132 libgsth264parse.dll
130 libgsticydemux.dll 133 libgsticydemux.dll
131 libgstid3demux.dll 134 libgstid3demux.dll
132 libgstjpeg.dll 135 libgstjpeg.dll
133 libgstlevel.dll 136 libgstlevel.dll
134 libgstmad.dll
135 libgstmms.dll 137 libgstmms.dll
136 libgstmpeg2dec.dll 138 libgstmpeg2dec.dll
139 libgstmpeg4videoparse.dll
137 libgstmpegaudioparse.dll 140 libgstmpegaudioparse.dll
138 libgstmpegstream.dll 141 libgstmpegstream.dll
139 libgstmpegvideoparse.dll 142 libgstmpegvideoparse.dll
140 libgstmscodecs.dll
141 libgstmulaw.dll 143 libgstmulaw.dll
142 libgstmultipart.dll 144 libgstmultipart.dll
143 libgstneon.dll 145 libgstneon.dll
144 libgstogg.dll 146 libgstogg.dll
147 libgstpcapparse.dll
145 libgstplaybin.dll 148 libgstplaybin.dll
146 libgstpng.dll 149 libgstpng.dll
147 libgstqtdemux.dll 150 libgstqtdemux.dll
148 libgstqueue2.dll 151 libgstqueue2.dll
152 libgstreal.dll
153 libgstrealmedia.dll
149 libgstrtp.dll 154 libgstrtp.dll
150 libgstrtpmanager.dll 155 libgstrtpmanager.dll
151 libgstrtpmuxer.dll 156 libgstrtpmuxer.dll
152 libgstrtsp.dll 157 libgstrtsp.dll
153 libgstsmpte.dll 158 libgstsmpte.dll
154 libgsttheora.dll 159 libgsttheora.dll
@@ -161,13 +166,12 @@ set(gst_plugin_debug_files
161 libgstvideorate.dll 166 libgstvideorate.dll
162 libgstvideoscale.dll 167 libgstvideoscale.dll
163 libgstvideosignal.dll 168 libgstvideosignal.dll
164 libgstvideotestsrc.dll
165 libgstvolume.dll
166 libgstvolume.dll 169 libgstvolume.dll
167 libgstvorbis.dll 170 libgstvorbis.dll
168 libgstwasapi.dll 171 libgstwasapi.dll
169 libgstwavparse.dll 172 libgstwavparse.dll
170 libgstwininet.dll 173 libgstwininet.dll
174 libgstwinks.dll
171 libgstx264.dll 175 libgstx264.dll
172 libgstxvid.dll 176 libgstxvid.dll
173 ) 177 )
@@ -220,6 +224,7 @@ set(debug_files
220 avformat-52.dll 224 avformat-52.dll
221 avutil-49.dll 225 avutil-49.dll
222 intl.dll 226 intl.dll
227 libfaacdrm.dll
223 libgstapp-0.10.dll 228 libgstapp-0.10.dll
224 libgstaudio-0.10.dll 229 libgstaudio-0.10.dll
225 libgstbase-0.10.dll 230 libgstbase-0.10.dll
@@ -243,10 +248,11 @@ set(debug_files
243 libmms.dll 248 libmms.dll
244 liboil-0.3-0.dll 249 liboil-0.3-0.dll
245 libpng13.dll 250 libpng13.dll
246 xvidcore.dll 251 libspeex.dll
247 zlib1.dll
248 ogg.dll 252 ogg.dll
249 vorbis.dll 253 vorbis.dll
254 xvidcore.dll
255 zlib1.dll
250 ) 256 )
251 257
252copy_if_different( 258copy_if_different(
@@ -294,6 +300,7 @@ set(release_files
294 avformat-52.dll 300 avformat-52.dll
295 avutil-49.dll 301 avutil-49.dll
296 intl.dll 302 intl.dll
303 libfaacdrm.dll
297 libgstapp-0.10.dll 304 libgstapp-0.10.dll
298 libgstaudio-0.10.dll 305 libgstaudio-0.10.dll
299 libgstbase-0.10.dll 306 libgstbase-0.10.dll
@@ -317,10 +324,11 @@ set(release_files
317 libmms.dll 324 libmms.dll
318 liboil-0.3-0.dll 325 liboil-0.3-0.dll
319 libpng13.dll 326 libpng13.dll
320 xvidcore.dll 327 libspeex.dll
321 zlib1.dll
322 ogg.dll 328 ogg.dll
323 vorbis.dll 329 vorbis.dll
330 xvidcore.dll
331 zlib1.dll
324 ) 332 )
325 333
326copy_if_different( 334copy_if_different(
diff --git a/linden/indra/llaudio/audioengine.cpp b/linden/indra/llaudio/audioengine.cpp
index da9bcba..7bb65e9 100644
--- a/linden/indra/llaudio/audioengine.cpp
+++ b/linden/indra/llaudio/audioengine.cpp
@@ -45,6 +45,8 @@
45#include "llassetstorage.h" 45#include "llassetstorage.h"
46 46
47#include "llmediamanager.h" 47#include "llmediamanager.h"
48#include "llmediabase.h"
49#include "llmediaimplcommon.h"
48 50
49// necessary for grabbing sounds from sim (implemented in viewer) 51// necessary for grabbing sounds from sim (implemented in viewer)
50extern void request_sound(const LLUUID &sound_guid); 52extern void request_sound(const LLUUID &sound_guid);
@@ -101,6 +103,8 @@ void LLAudioEngine::setDefaults()
101 103
102 for (U32 i = 0; i < LLAudioEngine::AUDIO_TYPE_COUNT; i++) 104 for (U32 i = 0; i < LLAudioEngine::AUDIO_TYPE_COUNT; i++)
103 mSecondaryGain[i] = 1.0f; 105 mSecondaryGain[i] = 1.0f;
106
107 mStatus = LLMediaBase::STATUS_UNKNOWN;
104} 108}
105 109
106 110
@@ -168,6 +172,14 @@ void LLAudioEngine::shutdown()
168} 172}
169 173
170 174
175////////////////////////////////////////////////////////////////////////////////
176// virtual (derives from LLMediaBase)
177LLMediaBase::EStatus LLAudioEngine::getStatus()
178{
179 return mStatus;
180}
181
182
171// virtual 183// virtual
172void LLAudioEngine::startInternetStream(const std::string& url) 184void LLAudioEngine::startInternetStream(const std::string& url)
173{ 185{
@@ -179,27 +191,40 @@ void LLAudioEngine::startInternetStream(const std::string& url)
179 if (mgr) 191 if (mgr)
180 { 192 {
181 mInternetStreamMedia = mgr->createSourceFromMimeType(LLURI(url).scheme(), "audio/mpeg"); // assumes that whatever media implementation supports mp3 also supports vorbis. 193 mInternetStreamMedia = mgr->createSourceFromMimeType(LLURI(url).scheme(), "audio/mpeg"); // assumes that whatever media implementation supports mp3 also supports vorbis.
182 LL_INFOS("AudioEngine") << "mInternetStreamMedia is now " << mInternetStreamMedia << llendl; 194 //LL_INFOS("AudioEngine") << "mInternetStreamMedia is now " << mInternetStreamMedia << llendl;
183 } 195 }
184 } 196 }
185 197
186 if(!mInternetStreamMedia) 198 if(!mInternetStreamMedia)
187 return; 199 return;
200
201 // Check for a dead stream, just in case
202 if(getStatus() == LLMediaBase::STATUS_DEAD)
203 {
204 LL_INFOS("AudioEngine") << "don't play dead stream urls"<< llendl;
205 mInternetStreamURL.clear();
206 mInternetStreamMedia->addCommand(LLMediaBase::COMMAND_STOP);
207 mInternetStreamMedia->updateMedia();
208 stopInternetStream();
209 return;
210 }
188 211
189 if (!url.empty()) { 212 if (!url.empty())
213 {
190 LL_INFOS("AudioEngine") << "Starting internet stream: " << url << llendl; 214 LL_INFOS("AudioEngine") << "Starting internet stream: " << url << llendl;
191 mInternetStreamURL = url; 215 mInternetStreamURL = url;
192 mInternetStreamMedia->navigateTo ( url ); 216 mInternetStreamMedia->navigateTo ( url );
193 LL_INFOS("AudioEngine") << "Playing....." << llendl; 217 LL_INFOS("AudioEngine") << "Playing....." << llendl;
194 mInternetStreamMedia->addCommand(LLMediaBase::COMMAND_START); 218 mInternetStreamMedia->addCommand(LLMediaBase::COMMAND_START);
195 mInternetStreamMedia->updateMedia(); 219 mInternetStreamMedia->updateMedia();
196 } else { 220 }
221 else
222 {
197 LL_INFOS("AudioEngine") << "setting stream to NULL"<< llendl; 223 LL_INFOS("AudioEngine") << "setting stream to NULL"<< llendl;
198 mInternetStreamURL.clear(); 224 mInternetStreamURL.clear();
199 mInternetStreamMedia->addCommand(LLMediaBase::COMMAND_STOP); 225 mInternetStreamMedia->addCommand(LLMediaBase::COMMAND_STOP);
200 mInternetStreamMedia->updateMedia(); 226 mInternetStreamMedia->updateMedia();
201 } 227 }
202 //#endif
203} 228}
204 229
205// virtual 230// virtual
@@ -207,9 +232,10 @@ void LLAudioEngine::stopInternetStream()
207{ 232{
208 LL_INFOS("AudioEngine") << "entered stopInternetStream()" << llendl; 233 LL_INFOS("AudioEngine") << "entered stopInternetStream()" << llendl;
209 234
210 if(mInternetStreamMedia) 235 if(mInternetStreamMedia)
211 { 236 {
212 if( ! mInternetStreamMedia->addCommand(LLMediaBase::COMMAND_STOP)){ 237 if(!mInternetStreamMedia->addCommand(LLMediaBase::COMMAND_STOP))
238 {
213 LL_INFOS("AudioEngine") << "attempting to stop stream failed!" << llendl; 239 LL_INFOS("AudioEngine") << "attempting to stop stream failed!" << llendl;
214 } 240 }
215 mInternetStreamMedia->updateMedia(); 241 mInternetStreamMedia->updateMedia();
@@ -219,29 +245,6 @@ void LLAudioEngine::stopInternetStream()
219} 245}
220 246
221// virtual 247// virtual
222void LLAudioEngine::pauseInternetStream(int pause)
223{
224 LL_INFOS("AudioEngine") << "entered pauseInternetStream()" << llendl;
225
226 if(!mInternetStreamMedia)
227 return;
228
229 if(pause)
230 {
231 if(! mInternetStreamMedia->addCommand(LLMediaBase::COMMAND_PAUSE))
232 {
233 LL_INFOS("AudioEngine") << "attempting to pause stream failed!" << llendl;
234 }
235 } else {
236 if(! mInternetStreamMedia->addCommand(LLMediaBase::COMMAND_START))
237 {
238 LL_INFOS("AudioEngine") << "attempting to unpause stream failed!" << llendl;
239 }
240 }
241 mInternetStreamMedia->updateMedia();
242}
243
244// virtual
245void LLAudioEngine::updateInternetStream() 248void LLAudioEngine::updateInternetStream()
246{ 249{
247 if (mInternetStreamMedia) 250 if (mInternetStreamMedia)
@@ -259,11 +262,6 @@ int LLAudioEngine::isInternetStreamPlaying()
259 return 1; // Active and playing 262 return 1; // Active and playing
260 } 263 }
261 264
262 if (mInternetStreamMedia->getStatus() == LLMediaBase::STATUS_PAUSED)
263 {
264 return 2; // paused
265 }
266
267 return 0; // Stopped 265 return 0; // Stopped
268} 266}
269 267
diff --git a/linden/indra/llaudio/audioengine.h b/linden/indra/llaudio/audioengine.h
index 15cb35f..878a96a 100644
--- a/linden/indra/llaudio/audioengine.h
+++ b/linden/indra/llaudio/audioengine.h
@@ -45,6 +45,8 @@
45#include "llframetimer.h" 45#include "llframetimer.h"
46#include "llassettype.h" 46#include "llassettype.h"
47 47
48#include "llmediabase.h"
49
48class LLMediaBase; 50class LLMediaBase;
49 51
50const F32 LL_WIND_UPDATE_INTERVAL = 0.1f; 52const F32 LL_WIND_UPDATE_INTERVAL = 0.1f;
@@ -153,13 +155,13 @@ public:
153 // Internet stream methods 155 // Internet stream methods
154 virtual void startInternetStream(const std::string& url); 156 virtual void startInternetStream(const std::string& url);
155 virtual void stopInternetStream(); 157 virtual void stopInternetStream();
156 virtual void pauseInternetStream(int pause);
157 virtual void updateInternetStream(); 158 virtual void updateInternetStream();
158 virtual int isInternetStreamPlaying(); 159 virtual int isInternetStreamPlaying();
159 virtual void getInternetStreamInfo(char* artist, char* title); 160 virtual void getInternetStreamInfo(char* artist, char* title);
160 // use a value from 0.0 to 1.0, inclusive 161 // use a value from 0.0 to 1.0, inclusive
161 virtual void setInternetStreamGain(F32 vol); 162 virtual void setInternetStreamGain(F32 vol);
162 virtual const std::string& getInternetStreamURL(); 163 virtual const std::string& getInternetStreamURL();
164 virtual LLMediaBase::EStatus getStatus();
163 165
164 // For debugging usage 166 // For debugging usage
165 virtual LLVector3 getListenerPos(); 167 virtual LLVector3 getListenerPos();
@@ -246,6 +248,8 @@ protected:
246 248
247 LLFrameTimer mWindUpdateTimer; 249 LLFrameTimer mWindUpdateTimer;
248 250
251 LLMediaBase::EStatus mStatus;
252
249private: 253private:
250 void setDefaults(); 254 void setDefaults();
251 LLMediaBase *mInternetStreamMedia; 255 LLMediaBase *mInternetStreamMedia;
diff --git a/linden/indra/llcommon/llsdserialize.cpp b/linden/indra/llcommon/llsdserialize.cpp
index d42842d..f21ff68 100644
--- a/linden/indra/llcommon/llsdserialize.cpp
+++ b/linden/indra/llcommon/llsdserialize.cpp
@@ -324,7 +324,7 @@ S32 LLSDParser::parse(std::istream& istr, LLSD& data, S32 max_bytes)
324S32 LLSDParser::parseLines(std::istream& istr, LLSD& data) 324S32 LLSDParser::parseLines(std::istream& istr, LLSD& data)
325{ 325{
326 mCheckLimits = false; 326 mCheckLimits = false;
327 mParseLines = false; // was true, Emergency fix DEV-17785 parsing newline failure 327 mParseLines = true;
328 return doParse(istr, data); 328 return doParse(istr, data);
329} 329}
330 330
diff --git a/linden/indra/llcommon/llsdserialize_xml.cpp b/linden/indra/llcommon/llsdserialize_xml.cpp
index 690ab67..9c3f85e 100644
--- a/linden/indra/llcommon/llsdserialize_xml.cpp
+++ b/linden/indra/llcommon/llsdserialize_xml.cpp
@@ -461,11 +461,11 @@ S32 LLSDXMLParser::Impl::parseLines(std::istream& input, LLSD& data)
461 input.clear(); 461 input.clear();
462 } 462 }
463 463
464 // Don't parse the NULL at the end which might be added if \n was absorbed by getline() 464 // Re-insert with the \n that was absorbed by getline()
465 char * text = (char *) buffer; 465 char * text = (char *) buffer;
466 if ( text[num_read - 1] == 0) 466 if ( text[num_read - 1] == 0)
467 { 467 {
468 num_read--; 468 text[num_read - 1] = '\n';
469 } 469 }
470 } 470 }
471 471
@@ -808,12 +808,11 @@ void LLSDXMLParser::parsePart(const char *buf, int len)
808// virtual 808// virtual
809S32 LLSDXMLParser::doParse(std::istream& input, LLSD& data) const 809S32 LLSDXMLParser::doParse(std::istream& input, LLSD& data) const
810{ 810{
811// Remove code - emergency fix DEV-17785 parsing newline failure 811 if (mParseLines)
812// if (mParseLines) 812 {
813// {
814 // Use line-based reading (faster code) 813 // Use line-based reading (faster code)
815// return impl.parseLines(input, data); 814 return impl.parseLines(input, data);
816// } 815 }
817 816
818 return impl.parse(input, data); 817 return impl.parse(input, data);
819} 818}
diff --git a/linden/indra/llmedia/llmediabase.h b/linden/indra/llmedia/llmediabase.h
index dad02ca..b5b9420 100644
--- a/linden/indra/llmedia/llmediabase.h
+++ b/linden/indra/llmedia/llmediabase.h
@@ -153,7 +153,8 @@ class LLMediaBase
153 STATUS_STARTED = 3, 153 STATUS_STARTED = 3,
154 STATUS_STOPPED = 4, 154 STATUS_STOPPED = 4,
155 STATUS_PAUSED = 6, 155 STATUS_PAUSED = 6,
156 STATUS_RESETTING = 7 156 STATUS_RESETTING = 7,
157 STATUS_DEAD = 8
157 }; 158 };
158 virtual bool addCommand( ECommand cmd ) = 0; 159 virtual bool addCommand( ECommand cmd ) = 0;
159 virtual bool clearCommand() = 0; 160 virtual bool clearCommand() = 0;
diff --git a/linden/indra/llmedia/llmediaimplgstreamer.cpp b/linden/indra/llmedia/llmediaimplgstreamer.cpp
index bae8ad9..af089bc 100644
--- a/linden/indra/llmedia/llmediaimplgstreamer.cpp
+++ b/linden/indra/llmedia/llmediaimplgstreamer.cpp
@@ -36,6 +36,7 @@
36 36
37extern "C" { 37extern "C" {
38#include <gst/gst.h> 38#include <gst/gst.h>
39#include <gst/gstelement.h>
39} 40}
40 41
41#include "llmediamanager.h" 42#include "llmediamanager.h"
@@ -72,7 +73,7 @@ LLMediaImplGStreamer () :
72 mPump ( NULL ), 73 mPump ( NULL ),
73 mPlaybin ( NULL ), 74 mPlaybin ( NULL ),
74 mVideoSink ( NULL ), 75 mVideoSink ( NULL ),
75 mState( GST_STATE_NULL ) 76 mState( GST_STATE_NULL )
76{ 77{
77 LL_DEBUGS("MediaManager") << "constructing media..." << LL_ENDL; 78 LL_DEBUGS("MediaManager") << "constructing media..." << LL_ENDL;
78 mVolume = -1.0; // XXX Hack to make the vould change happend first time 79 mVolume = -1.0; // XXX Hack to make the vould change happend first time
@@ -94,12 +95,14 @@ LLMediaImplGStreamer () :
94 return; // error 95 return; // error
95 } 96 }
96 97
97 if (NULL == getenv("LL_GSTREAMER_EXTERNAL")) 98 if (NULL == getenv("LL_GSTREAMER_EXTERNAL"))
98 { 99 {
99 // instantiate and connect a custom video sink 100 // instantiate and connect a custom video sink
100 LL_DEBUGS("MediaManager") << "extrenal video sink..." << LL_ENDL; 101 LL_DEBUGS("MediaManager") << "extrenal video sink..." << LL_ENDL;
102
103 // Plays inworld instead of in external player
101 mVideoSink = 104 mVideoSink =
102 GST_SLVIDEO(llgst_element_factory_make ("private-slvideo", "slvideo")); 105 GST_SLVIDEO(llgst_element_factory_make ("private-slvideo", "slvideo"));
103 if (!mVideoSink) 106 if (!mVideoSink)
104 { 107 {
105 LL_WARNS("MediaImpl") << "Could not instantiate private-slvideo element." << LL_ENDL; 108 LL_WARNS("MediaImpl") << "Could not instantiate private-slvideo element." << LL_ENDL;
@@ -142,12 +145,14 @@ LLMediaImplGStreamer::
142// virtual 145// virtual
143std::string LLMediaImplGStreamer::getVersion() 146std::string LLMediaImplGStreamer::getVersion()
144{ 147{
145 std::string rtn; 148 guint major, minor, micro, nano;
146 rtn = "[" + sLLMediaImplGStreamerReg.getImplName() + "] - GStreamer 0.10.x"; 149 llgst_version(&major, &minor, &micro, &nano);
147 return rtn; 150 std::string version = llformat("%d.%d.%d.%d",major,minor,micro,nano);
151 return version;
148} 152}
153
149// 154//
150//THIS IS THE METHOD THAT'S BREAKING STUFF 155// STARTUP
151/////////////////////////////////////////////////////////////////////////////// 156///////////////////////////////////////////////////////////////////////////////
152// (static) super-initialization - called once at application startup 157// (static) super-initialization - called once at application startup
153bool LLMediaImplGStreamer::startup (LLMediaManagerData* init_data) 158bool LLMediaImplGStreamer::startup (LLMediaManagerData* init_data)
@@ -161,6 +166,10 @@ bool LLMediaImplGStreamer::startup (LLMediaManagerData* init_data)
161 // Get symbols! 166 // Get symbols!
162#if LL_WINDOWS 167#if LL_WINDOWS
163 if (! grab_gst_syms("libgstreamer-0.10.dll", "libgstvideo-0.10.dll", "libgstaudio-0.10.dll") ) 168 if (! grab_gst_syms("libgstreamer-0.10.dll", "libgstvideo-0.10.dll", "libgstaudio-0.10.dll") )
169 {
170 LL_WARNS("MediaImpl") << "Couldn't find suitable GStreamer 0.10 support on this system - video playback disabled." << LL_ENDL;
171 return false;
172 }
164#else 173#else
165 if (! grab_gst_syms("libgstreamer-0.10.so.0", "libgstvideo-0.10.so.0", "libgstaudio-0.10.so.0") ) 174 if (! grab_gst_syms("libgstreamer-0.10.so.0", "libgstvideo-0.10.so.0", "libgstaudio-0.10.so.0") )
166 { 175 {
@@ -180,7 +189,7 @@ bool LLMediaImplGStreamer::startup (LLMediaManagerData* init_data)
180 saved_locale = setlocale(LC_ALL, NULL); 189 saved_locale = setlocale(LC_ALL, NULL);
181 if (0 == llgst_init_check(NULL, NULL, NULL)) 190 if (0 == llgst_init_check(NULL, NULL, NULL))
182 { 191 {
183 LL_WARNS("MediaImpl") << "GST init failed for unspecified reason." << LL_ENDL; 192 LL_WARNS("MediaImpl") << "GStreamer library failed to initialize and load standard plugins." << LL_ENDL;
184 setlocale(LC_ALL, saved_locale.c_str() ); 193 setlocale(LC_ALL, saved_locale.c_str() );
185 return false; 194 return false;
186 } 195 }
@@ -204,6 +213,7 @@ bool LLMediaImplGStreamer::closedown()
204 213
205/////////////////////////////////////////////////////////////////////////////// 214///////////////////////////////////////////////////////////////////////////////
206// 215//
216// Uncomment the line below to enable spammy debug data.
207//#define LL_GST_REPORT_STATE_CHANGES 217//#define LL_GST_REPORT_STATE_CHANGES
208#ifdef LL_GST_REPORT_STATE_CHANGES 218#ifdef LL_GST_REPORT_STATE_CHANGES
209static const char* get_gst_state_name(GstState state) 219static const char* get_gst_state_name(GstState state)
@@ -269,7 +279,8 @@ gboolean LLMediaImplGStreamer::bus_callback(GstBus *bus, GstMessage *message, gp
269 LL_DEBUGS("MediaImpl") << "State changed to NULL" << LL_ENDL; 279 LL_DEBUGS("MediaImpl") << "State changed to NULL" << LL_ENDL;
270#endif 280#endif
271 if (impl->getState() == GST_STATE_PLAYING) 281 if (impl->getState() == GST_STATE_PLAYING)
272 { // We got stoped by gstremer... 282 {
283 // Stream was probably dropped, trying to restart
273 impl->play(); 284 impl->play();
274#ifdef LL_GST_REPORT_STATE_CHANGES 285#ifdef LL_GST_REPORT_STATE_CHANGES
275 LL_DEBUGS("MediaImpl") << "Trying to restart." << LL_ENDL; 286 LL_DEBUGS("MediaImpl") << "Trying to restart." << LL_ENDL;
@@ -384,8 +395,7 @@ bool LLMediaImplGStreamer::navigateTo (const std::string urlIn)
384 LL_DEBUGS("MediaImpl") << "Setting media URI: " << urlIn.c_str() 395 LL_DEBUGS("MediaImpl") << "Setting media URI: " << urlIn.c_str()
385 << LL_ENDL; 396 << LL_ENDL;
386 397
387 if (NULL == mPump 398 if (mPump == NULL || mPlaybin == NULL)
388 || NULL == mPlaybin)
389 { 399 {
390 return false; 400 return false;
391 } 401 }
@@ -394,7 +404,6 @@ bool LLMediaImplGStreamer::navigateTo (const std::string urlIn)
394 404
395 // set URI 405 // set URI
396 g_object_set (G_OBJECT (mPlaybin), "uri", urlIn.c_str(), NULL); 406 g_object_set (G_OBJECT (mPlaybin), "uri", urlIn.c_str(), NULL);
397 //g_object_set (G_OBJECT (mPlaybin), "uri", "file:///tmp/movie", NULL);
398 407
399 // get playbin's bus - perhaps this can/should be done in ctor 408 // get playbin's bus - perhaps this can/should be done in ctor
400 GstBus *bus = llgst_pipeline_get_bus (GST_PIPELINE (mPlaybin)); 409 GstBus *bus = llgst_pipeline_get_bus (GST_PIPELINE (mPlaybin));
@@ -405,6 +414,8 @@ bool LLMediaImplGStreamer::navigateTo (const std::string urlIn)
405 llgst_bus_add_watch (bus, bus_callback, this); 414 llgst_bus_add_watch (bus, bus_callback, this);
406 llgst_object_unref (bus); 415 llgst_object_unref (bus);
407 416
417 mState = GST_STATE_READY;
418
408 // navigateTo implicitly plays, too. 419 // navigateTo implicitly plays, too.
409 play(); 420 play();
410 421
@@ -437,6 +448,8 @@ bool LLMediaImplGStreamer::unload()
437 } 448 }
438 449
439 mVideoSink = NULL; 450 mVideoSink = NULL;
451 mState = GST_STATE_NULL;
452 setStatus(LLMediaBase::STATUS_UNKNOWN);
440 453
441 return true; 454 return true;
442} 455}
@@ -448,15 +461,19 @@ bool LLMediaImplGStreamer::updateMedia()
448 //LL_DEBUGS("MediaImpl") << "updating media..." << LL_ENDL; 461 //LL_DEBUGS("MediaImpl") << "updating media..." << LL_ENDL;
449 462
450 // sanity check 463 // sanity check
451 if (NULL == mPump 464 if (mPump == NULL || mPlaybin == NULL)
452 || NULL == mPlaybin)
453 { 465 {
454#ifdef LL_GST_REPORT_STATE_CHANGES 466#ifdef LL_GST_REPORT_STATE_CHANGES
455 LL_DEBUGS("MediaImpl") << "dead media..." << LL_ENDL; 467 LL_DEBUGS("MediaImpl") << "dead media..." << LL_ENDL;
456#endif 468#endif
469 mState = GST_STATE_NULL;
470 setStatus(LLMediaBase::STATUS_DEAD);
457 return false; 471 return false;
458 } 472 }
459 473
474 if (mState == GST_STATE_VOID_PENDING || mState == GST_STATE_NULL)
475 return false;
476
460 // process next outstanding command 477 // process next outstanding command
461 switch (nextCommand()) 478 switch (nextCommand())
462 { 479 {
@@ -567,10 +584,24 @@ bool LLMediaImplGStreamer::updateMedia()
567// 584//
568bool LLMediaImplGStreamer::stop() 585bool LLMediaImplGStreamer::stop()
569{ 586{
570 LL_DEBUGS("MediaImpl") << "stopping media..." << LL_ENDL; 587 LL_DEBUGS("MediaImpl") << "attempting to stop..." << LL_ENDL;
571 // todo: error-check this? 588
572 llgst_element_set_state(mPlaybin, GST_STATE_READY); 589 if (!mPlaybin || mState == GST_STATE_NULL)
573 mState = GST_STATE_READY; 590 return true;
591
592 GstElement *pipeline = (GstElement *)llgst_object_ref(GST_OBJECT(mPlaybin));
593 llgst_object_unref(pipeline);
594
595 llgst_element_set_state(pipeline, GST_STATE_READY);
596
597 if (mState == GST_STATE_PLAYING)
598 mState = GST_STATE_VOID_PENDING;
599 else
600 mState = GST_STATE_READY;
601
602 GstStateChangeReturn state_change = llgst_element_get_state(mPlaybin, NULL, NULL, GST_CLOCK_TIME_NONE);
603 LL_DEBUGS("MediaImpl") << "get_state: " << llgst_element_state_change_return_get_name(state_change) << LL_ENDL;
604
574 return true; 605 return true;
575} 606}
576 607
@@ -578,10 +609,29 @@ bool LLMediaImplGStreamer::stop()
578// 609//
579bool LLMediaImplGStreamer::play() 610bool LLMediaImplGStreamer::play()
580{ 611{
581 LL_DEBUGS("MediaImpl") << "playing media..." << LL_ENDL; 612 LL_DEBUGS("MediaImpl") << "attempting to play..." << LL_ENDL;
582 // todo: error-check this? 613
583 llgst_element_set_state(mPlaybin, GST_STATE_PLAYING); 614 if (!mPlaybin || mState == GST_STATE_NULL)
615 return true;
616
617 GstElement *pipeline = (GstElement *)llgst_object_ref(GST_OBJECT(mPlaybin));
618 llgst_object_unref(pipeline);
619
620 llgst_element_set_state(pipeline, GST_STATE_PLAYING);
584 mState = GST_STATE_PLAYING; 621 mState = GST_STATE_PLAYING;
622 /*llgst_element_set_state(mPlaybin, GST_STATE_PLAYING);
623 mState = GST_STATE_PLAYING;*/
624
625 GstStateChangeReturn state_change = llgst_element_get_state(mPlaybin, NULL, NULL, GST_CLOCK_TIME_NONE);
626 LL_DEBUGS("MediaImpl") << "get_state: " << llgst_element_state_change_return_get_name(state_change) << LL_ENDL;
627
628 // Check to make sure playing was successful. If not, stop.
629 if (state_change == GST_STATE_CHANGE_FAILURE)
630 {
631 setStatus(LLMediaBase::STATUS_STOPPED);
632 stop();
633 }
634
585 return true; 635 return true;
586} 636}
587 637
@@ -589,10 +639,17 @@ bool LLMediaImplGStreamer::play()
589// 639//
590bool LLMediaImplGStreamer::pause() 640bool LLMediaImplGStreamer::pause()
591{ 641{
592 LL_DEBUGS("MediaImpl") <<"pausing media..." << LL_ENDL; 642 LL_DEBUGS("MediaImpl") << "attempting to pause..." << LL_ENDL;
593 // todo: error-check this? 643
644 if (!mPlaybin || mState == GST_STATE_NULL)
645 return true;
646
594 llgst_element_set_state(mPlaybin, GST_STATE_PAUSED); 647 llgst_element_set_state(mPlaybin, GST_STATE_PAUSED);
595 mState = GST_STATE_PAUSED; 648 mState = GST_STATE_PAUSED;
649
650 GstStateChangeReturn state_change = llgst_element_get_state(mPlaybin, NULL, NULL, GST_CLOCK_TIME_NONE);
651 LL_DEBUGS("MediaImpl") << "get_state: " << llgst_element_state_change_return_get_name(state_change) << LL_ENDL;
652
596 return true; 653 return true;
597}; 654};
598 655
@@ -628,12 +685,12 @@ bool LLMediaImplGStreamer::seek(double time)
628// virtual 685// virtual
629bool LLMediaImplGStreamer::setVolume(float volume) 686bool LLMediaImplGStreamer::setVolume(float volume)
630{ 687{
631 // XXX hack to make volume volume changes less othen 688 // XXX hack to make volume volume changes less othen
632 // bug in gstreamer 0.10.21 689 // bug in gstreamer 0.10.21
633 if(mVolume == volume) 690 if(mVolume == volume)
634 return true; 691 return true;
635 692
636 LL_DEBUGS("MediaImpl") << "setVolume(" << volume << ") : " << getpid() << LL_ENDL; 693 LL_DEBUGS("MediaImpl") << "setVolume(" << volume << ") : " << getpid() << LL_ENDL;
637 mVolume = volume; 694 mVolume = volume;
638 if (mPlaybin) 695 if (mPlaybin)
639 { 696 {
diff --git a/linden/indra/llmedia/llmediaimplgstreamer.h b/linden/indra/llmedia/llmediaimplgstreamer.h
index 5b493ad..dec970a 100644
--- a/linden/indra/llmedia/llmediaimplgstreamer.h
+++ b/linden/indra/llmedia/llmediaimplgstreamer.h
@@ -74,7 +74,7 @@ class LLMediaImplGStreamer:
74 /* virtual */ int getTextureFormatType() const; 74 /* virtual */ int getTextureFormatType() const;
75 /* virtual */ int getTextureFormatInternal() const; 75 /* virtual */ int getTextureFormatInternal() const;
76 /* virtual */ bool seek( double time ); 76 /* virtual */ bool seek( double time );
77 /* virtual */ bool setVolume( float volume ); 77 /* virtual */ bool setVolume( float volume );
78 78
79 LLMediaEmitter< LLMediaObserver > getEventEmitter() const {return mEventEmitter;}; 79 LLMediaEmitter< LLMediaObserver > getEventEmitter() const {return mEventEmitter;};
80 80
@@ -84,6 +84,7 @@ class LLMediaImplGStreamer:
84 bool pause(); 84 bool pause();
85 bool stop(); 85 bool stop();
86 bool play(); 86 bool play();
87
87 static gboolean bus_callback (GstBus *bus, 88 static gboolean bus_callback (GstBus *bus,
88 GstMessage *message, 89 GstMessage *message,
89 gpointer data); 90 gpointer data);
diff --git a/linden/indra/llmedia/llmediaimplgstreamer_syms_raw.inc b/linden/indra/llmedia/llmediaimplgstreamer_syms_raw.inc
index e17a7a0..0d0d764 100644
--- a/linden/indra/llmedia/llmediaimplgstreamer_syms_raw.inc
+++ b/linden/indra/llmedia/llmediaimplgstreamer_syms_raw.inc
@@ -7,7 +7,9 @@ LL_GST_SYM(true, gst_message_parse_error, void, GstMessage *message, GError **ge
7LL_GST_SYM(true, gst_message_parse_warning, void, GstMessage *message, GError **gerror, gchar **debug); 7LL_GST_SYM(true, gst_message_parse_warning, void, GstMessage *message, GError **gerror, gchar **debug);
8LL_GST_SYM(true, gst_message_parse_state_changed, void, GstMessage *message, GstState *oldstate, GstState *newstate, GstState *pending); 8LL_GST_SYM(true, gst_message_parse_state_changed, void, GstMessage *message, GstState *oldstate, GstState *newstate, GstState *pending);
9LL_GST_SYM(true, gst_element_set_state, GstStateChangeReturn, GstElement *element, GstState state); 9LL_GST_SYM(true, gst_element_set_state, GstStateChangeReturn, GstElement *element, GstState state);
10LL_GST_SYM(true, gst_element_get_state, GstStateChangeReturn, GstElement *element, GstState *state, GstState *pending, GstClockTime timeout);
10LL_GST_SYM(true, gst_object_unref, void, gpointer object); 11LL_GST_SYM(true, gst_object_unref, void, gpointer object);
12LL_GST_SYM(true, gst_object_ref, gpointer, gpointer object);
11LL_GST_SYM(true, gst_object_get_type, GType, void); 13LL_GST_SYM(true, gst_object_get_type, GType, void);
12LL_GST_SYM(true, gst_pipeline_get_type, GType, void); 14LL_GST_SYM(true, gst_pipeline_get_type, GType, void);
13LL_GST_SYM(true, gst_pipeline_get_bus, GstBus*, GstPipeline *pipeline); 15LL_GST_SYM(true, gst_pipeline_get_bus, GstBus*, GstPipeline *pipeline);
@@ -35,6 +37,8 @@ LL_GST_SYM(true, gst_value_get_fraction_numerator, gint, const GValue *value);
35LL_GST_SYM(true, gst_value_get_fraction_denominator, gint, const GValue *value); 37LL_GST_SYM(true, gst_value_get_fraction_denominator, gint, const GValue *value);
36LL_GST_SYM(true, gst_structure_get_name, G_CONST_RETURN gchar *, const GstStructure *structure); 38LL_GST_SYM(true, gst_structure_get_name, G_CONST_RETURN gchar *, const GstStructure *structure);
37LL_GST_SYM(true, gst_element_seek, bool, GstElement *, gdouble, GstFormat, GstSeekFlags, GstSeekType, gint64, GstSeekType, gint64); 39LL_GST_SYM(true, gst_element_seek, bool, GstElement *, gdouble, GstFormat, GstSeekFlags, GstSeekType, gint64, GstSeekType, gint64);
40LL_GST_SYM(true, gst_version, void, guint *major, guint *minor, guint *micro, guint *nano);
41LL_GST_SYM(true, gst_element_state_change_return_get_name, const gchar *, GstStateChangeReturn state_ret);
38 42
39// optional symbols to grab 43// optional symbols to grab
40LL_GST_SYM(false, gst_segtrap_set_enabled, void, gboolean enabled); 44LL_GST_SYM(false, gst_segtrap_set_enabled, void, gboolean enabled);
diff --git a/linden/indra/llmessage/llpumpio.cpp b/linden/indra/llmessage/llpumpio.cpp
index 9ce0bab..467502b 100644
--- a/linden/indra/llmessage/llpumpio.cpp
+++ b/linden/indra/llmessage/llpumpio.cpp
@@ -177,7 +177,8 @@ LLPumpIO::LLPumpIO(apr_pool_t* pool) :
177 mCurrentPool(NULL), 177 mCurrentPool(NULL),
178 mCurrentPoolReallocCount(0), 178 mCurrentPoolReallocCount(0),
179 mChainsMutex(NULL), 179 mChainsMutex(NULL),
180 mCallbackMutex(NULL) 180 mCallbackMutex(NULL),
181 mCurrentChain(mRunningChains.end())
181{ 182{
182 LLMemType m1(LLMemType::MTYPE_IO_PUMP); 183 LLMemType m1(LLMemType::MTYPE_IO_PUMP);
183 initialize(pool); 184 initialize(pool);
@@ -273,7 +274,10 @@ bool LLPumpIO::setTimeoutSeconds(F32 timeout)
273void LLPumpIO::adjustTimeoutSeconds(F32 delta) 274void LLPumpIO::adjustTimeoutSeconds(F32 delta)
274{ 275{
275 // If no chain is running, bail 276 // If no chain is running, bail
276 if(current_chain_t() == mCurrentChain) return; 277 if(mRunningChains.end() == mCurrentChain)
278 {
279 return;
280 }
277 (*mCurrentChain).adjustTimeoutSeconds(delta); 281 (*mCurrentChain).adjustTimeoutSeconds(delta);
278} 282}
279 283
diff --git a/linden/indra/llmessage/message_prehash.cpp b/linden/indra/llmessage/message_prehash.cpp
index 2ac1319..fd8953d 100644
--- a/linden/indra/llmessage/message_prehash.cpp
+++ b/linden/indra/llmessage/message_prehash.cpp
@@ -598,6 +598,7 @@ char* _PREHASH_FromAgentId = LLMessageStringTable::getInstance()->getString("Fro
598char* _PREHASH_Type = LLMessageStringTable::getInstance()->getString("Type"); 598char* _PREHASH_Type = LLMessageStringTable::getInstance()->getString("Type");
599char* _PREHASH_ChatType = LLMessageStringTable::getInstance()->getString("ChatType"); 599char* _PREHASH_ChatType = LLMessageStringTable::getInstance()->getString("ChatType");
600char* _PREHASH_ReportData = LLMessageStringTable::getInstance()->getString("ReportData"); 600char* _PREHASH_ReportData = LLMessageStringTable::getInstance()->getString("ReportData");
601char* _PREHASH_MonoScore = LLMessageStringTable::getInstance()->getString("MonoScore");
601char* _PREHASH_RequestBlock = LLMessageStringTable::getInstance()->getString("RequestBlock"); 602char* _PREHASH_RequestBlock = LLMessageStringTable::getInstance()->getString("RequestBlock");
602char* _PREHASH_GrantData = LLMessageStringTable::getInstance()->getString("GrantData"); 603char* _PREHASH_GrantData = LLMessageStringTable::getInstance()->getString("GrantData");
603char* _PREHASH_DetachAttachmentIntoInv = LLMessageStringTable::getInstance()->getString("DetachAttachmentIntoInv"); 604char* _PREHASH_DetachAttachmentIntoInv = LLMessageStringTable::getInstance()->getString("DetachAttachmentIntoInv");
diff --git a/linden/indra/llmessage/message_prehash.h b/linden/indra/llmessage/message_prehash.h
index 0ee02be..8b8c857 100644
--- a/linden/indra/llmessage/message_prehash.h
+++ b/linden/indra/llmessage/message_prehash.h
@@ -598,6 +598,7 @@ extern char * _PREHASH_FromAgentId;
598extern char * _PREHASH_Type; 598extern char * _PREHASH_Type;
599extern char * _PREHASH_ChatType; 599extern char * _PREHASH_ChatType;
600extern char * _PREHASH_ReportData; 600extern char * _PREHASH_ReportData;
601extern char * _PREHASH_MonoScore;
601extern char * _PREHASH_RequestBlock; 602extern char * _PREHASH_RequestBlock;
602extern char * _PREHASH_GrantData; 603extern char * _PREHASH_GrantData;
603extern char * _PREHASH_DetachAttachmentIntoInv; 604extern char * _PREHASH_DetachAttachmentIntoInv;
diff --git a/linden/indra/newview/CMakeLists.txt b/linden/indra/newview/CMakeLists.txt
index 4024fdd..1e48d28 100644
--- a/linden/indra/newview/CMakeLists.txt
+++ b/linden/indra/newview/CMakeLists.txt
@@ -1120,6 +1120,7 @@ set(viewer_XUI_FILES
1120 skins/default/xui/en-us/menu_login.xml 1120 skins/default/xui/en-us/menu_login.xml
1121 skins/default/xui/en-us/menu_pie_attachment.xml 1121 skins/default/xui/en-us/menu_pie_attachment.xml
1122 skins/default/xui/en-us/menu_pie_avatar.xml 1122 skins/default/xui/en-us/menu_pie_avatar.xml
1123 skins/default/xui/en-us/menu_pie_hud.xml
1123 skins/default/xui/en-us/menu_pie_land.xml 1124 skins/default/xui/en-us/menu_pie_land.xml
1124 skins/default/xui/en-us/menu_pie_object.xml 1125 skins/default/xui/en-us/menu_pie_object.xml
1125 skins/default/xui/en-us/menu_pie_self.xml 1126 skins/default/xui/en-us/menu_pie_self.xml
diff --git a/linden/indra/newview/llfloaterabout.cpp b/linden/indra/newview/llfloaterabout.cpp
index 4953410..aeca4b5 100644
--- a/linden/indra/newview/llfloaterabout.cpp
+++ b/linden/indra/newview/llfloaterabout.cpp
@@ -42,6 +42,7 @@
42#include "llcurl.h" 42#include "llcurl.h"
43#include "llimagej2c.h" 43#include "llimagej2c.h"
44#include "audioengine.h" 44#include "audioengine.h"
45#include "llmediaimplgstreamer.h"
45 46
46#include "llviewertexteditor.h" 47#include "llviewertexteditor.h"
47#include "llviewercontrol.h" 48#include "llviewercontrol.h"
@@ -208,6 +209,15 @@ LLFloaterAbout::LLFloaterAbout()
208 LLMediaManager *mgr = LLMediaManager::getInstance(); 209 LLMediaManager *mgr = LLMediaManager::getInstance();
209 if (mgr) 210 if (mgr)
210 { 211 {
212 LLMediaBase *gstreamer = new LLMediaImplGStreamer();
213 if (gstreamer)
214 {
215 support.append("GStreamer Version: ");
216 support.append( gstreamer->getVersion() );
217 support.append("\n");
218 }
219 delete gstreamer;
220
211 LLMediaBase *media_source = mgr->createSourceFromMimeType("http", "text/html"); 221 LLMediaBase *media_source = mgr->createSourceFromMimeType("http", "text/html");
212 if (media_source) 222 if (media_source)
213 { 223 {
diff --git a/linden/indra/newview/llfloatertopobjects.cpp b/linden/indra/newview/llfloatertopobjects.cpp
index ada5c68..e4c90f0 100644
--- a/linden/indra/newview/llfloatertopobjects.cpp
+++ b/linden/indra/newview/llfloatertopobjects.cpp
@@ -180,11 +180,11 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
180 msg->getF32Fast(_PREHASH_ReportData, _PREHASH_Score, score, block); 180 msg->getF32Fast(_PREHASH_ReportData, _PREHASH_Score, score, block);
181 msg->getStringFast(_PREHASH_ReportData, _PREHASH_TaskName, name_buf, block); 181 msg->getStringFast(_PREHASH_ReportData, _PREHASH_TaskName, name_buf, block);
182 msg->getStringFast(_PREHASH_ReportData, _PREHASH_OwnerName, owner_buf, block); 182 msg->getStringFast(_PREHASH_ReportData, _PREHASH_OwnerName, owner_buf, block);
183 if(msg->getNumberOfBlocks("DataExtended")) 183 if(msg->has("DataExtended"))
184 { 184 {
185 have_extended_data = true; 185 have_extended_data = true;
186 msg->getU32("DataExtended", "TimeStamp", time_stamp, block); 186 msg->getU32("DataExtended", "TimeStamp", time_stamp, block);
187 msg->getF32(_PREHASH_ReportData, "MonoScore", mono_score, block); 187 msg->getF32("DataExtended", "MonoScore", mono_score, block);
188 } 188 }
189 189
190 LLSD element; 190 LLSD element;
@@ -212,7 +212,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
212 if (mCurrentMode == STAT_REPORT_TOP_SCRIPTS 212 if (mCurrentMode == STAT_REPORT_TOP_SCRIPTS
213 && have_extended_data) 213 && have_extended_data)
214 { 214 {
215 element["columns"][5]["column"] = "Mono Time"; 215 element["columns"][5]["column"] = "mono_time";
216 element["columns"][5]["value"] = llformat("%0.3f", mono_score); 216 element["columns"][5]["value"] = llformat("%0.3f", mono_score);
217 element["columns"][5]["font"] = "SANSSERIF"; 217 element["columns"][5]["font"] = "SANSSERIF";
218 } 218 }
@@ -238,6 +238,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
238 { 238 {
239 setTitle(getString("top_scripts_title")); 239 setTitle(getString("top_scripts_title"));
240 list->setColumnLabel("score", getString("scripts_score_label")); 240 list->setColumnLabel("score", getString("scripts_score_label"));
241 list->setColumnLabel("mono_time", getString("scripts_mono_time_label"));
241 242
242 LLUIString format = getString("top_scripts_text"); 243 LLUIString format = getString("top_scripts_text");
243 format.setArg("[COUNT]", llformat("%d", total_count)); 244 format.setArg("[COUNT]", llformat("%d", total_count));
@@ -248,6 +249,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
248 { 249 {
249 setTitle(getString("top_colliders_title")); 250 setTitle(getString("top_colliders_title"));
250 list->setColumnLabel("score", getString("colliders_score_label")); 251 list->setColumnLabel("score", getString("colliders_score_label"));
252 list->setColumnLabel("mono_time", "");
251 LLUIString format = getString("top_colliders_text"); 253 LLUIString format = getString("top_colliders_text");
252 format.setArg("[COUNT]", llformat("%d", total_count)); 254 format.setArg("[COUNT]", llformat("%d", total_count));
253 childSetValue("title_text", LLSD(format)); 255 childSetValue("title_text", LLSD(format));
diff --git a/linden/indra/newview/lloverlaybar.cpp b/linden/indra/newview/lloverlaybar.cpp
index 80cac14..a4eedbb 100644
--- a/linden/indra/newview/lloverlaybar.cpp
+++ b/linden/indra/newview/lloverlaybar.cpp
@@ -391,14 +391,6 @@ void LLOverlayBar::toggleMusicPlay(void*)
391 } 391 }
392 } 392 }
393 } 393 }
394 //else
395 //{
396 // gOverlayBar->mMusicState = PAUSED; // desired state
397 // if (gAudiop)
398 // {
399 // gAudiop->pauseInternetStream(1);
400 // }
401 //}
402 else 394 else
403 { 395 {
404 gOverlayBar->mMusicState = STOPPED; // desired state 396 gOverlayBar->mMusicState = STOPPED; // desired state
diff --git a/linden/indra/newview/llpreviewlandmark.cpp b/linden/indra/newview/llpreviewlandmark.cpp
index 01d77f6..20b0ee5 100644
--- a/linden/indra/newview/llpreviewlandmark.cpp
+++ b/linden/indra/newview/llpreviewlandmark.cpp
@@ -90,7 +90,17 @@ LLPreviewLandmark::LLPreviewLandmark(const std::string& name,
90{ 90{
91 91
92 mFactoryMap["place_details_panel"] = LLCallbackMap(LLPreviewLandmark::createPlaceDetail, this); 92 mFactoryMap["place_details_panel"] = LLCallbackMap(LLPreviewLandmark::createPlaceDetail, this);
93 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_preview_existing_landmark.xml", &getFactoryMap()); 93 if (show_keep_discard)
94 {
95 // Decided against this, a text notification is a better fix for this -- McCabe
96 //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_preview_new_landmark.xml", &getFactoryMap());
97 //childSetAction("Discard btn",onDiscardBtn,this);
98 }
99 else
100 {
101 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_preview_existing_landmark.xml", &getFactoryMap());
102 }
103
94 104
95 /* 105 /*
96 childSetCommitCallback("desc_editor", LLPreview::onText, this); 106 childSetCommitCallback("desc_editor", LLPreview::onText, this);
diff --git a/linden/indra/newview/llselectmgr.cpp b/linden/indra/newview/llselectmgr.cpp
index 7547dd2..fe1755b 100644
--- a/linden/indra/newview/llselectmgr.cpp
+++ b/linden/indra/newview/llselectmgr.cpp
@@ -3444,7 +3444,7 @@ void LLSelectMgr::deselectAllIfTooFar()
3444 3444
3445 // HACK: Don't deselect when we're navigating to rate an object's 3445 // HACK: Don't deselect when we're navigating to rate an object's
3446 // owner or creator. JC 3446 // owner or creator. JC
3447 if (gPieObject->getVisible() || gPieRate->getVisible() ) 3447 if (gPieObject->getVisible())
3448 { 3448 {
3449 return; 3449 return;
3450 } 3450 }
diff --git a/linden/indra/newview/lltoolpie.cpp b/linden/indra/newview/lltoolpie.cpp
index de10045..63b6e34 100644
--- a/linden/indra/newview/lltoolpie.cpp
+++ b/linden/indra/newview/lltoolpie.cpp
@@ -336,10 +336,14 @@ BOOL LLToolPie::pickAndShowMenu(BOOL always_show)
336 336
337 gPieAvatar->show(x, y, mPieMouseButtonDown); 337 gPieAvatar->show(x, y, mPieMouseButtonDown);
338 } 338 }
339 else if (object->isAttachment()) 339 else if (object->isAttachment() && !object->isHUDAttachment())
340 { 340 {
341 gPieAttachment->show(x, y, mPieMouseButtonDown); 341 gPieAttachment->show(x, y, mPieMouseButtonDown);
342 } 342 }
343 else if (object->isHUDAttachment())
344 {
345 gPieHUD->show(x, y, mPieMouseButtonDown);
346 }
343 else 347 else
344 { 348 {
345 // BUG: What about chatting child objects? 349 // BUG: What about chatting child objects?
diff --git a/linden/indra/newview/llviewermenu.cpp b/linden/indra/newview/llviewermenu.cpp
index b7f4a40..31fdcc3 100644
--- a/linden/indra/newview/llviewermenu.cpp
+++ b/linden/indra/newview/llviewermenu.cpp
@@ -251,6 +251,7 @@ LLPieMenu *gPieSelf = NULL;
251LLPieMenu *gPieAvatar = NULL; 251LLPieMenu *gPieAvatar = NULL;
252LLPieMenu *gPieObject = NULL; 252LLPieMenu *gPieObject = NULL;
253LLPieMenu *gPieAttachment = NULL; 253LLPieMenu *gPieAttachment = NULL;
254LLPieMenu *gPieHUD = NULL;
254LLPieMenu *gPieLand = NULL; 255LLPieMenu *gPieLand = NULL;
255 256
256// local constants 257// local constants
@@ -263,7 +264,6 @@ const std::string SAVE_INTO_TASK_INVENTORY("Save Object Back to Object Contents"
263LLMenuGL* gAttachSubMenu = NULL; 264LLMenuGL* gAttachSubMenu = NULL;
264LLMenuGL* gDetachSubMenu = NULL; 265LLMenuGL* gDetachSubMenu = NULL;
265LLMenuGL* gTakeOffClothes = NULL; 266LLMenuGL* gTakeOffClothes = NULL;
266LLPieMenu* gPieRate = NULL;
267LLPieMenu* gAttachScreenPieMenu = NULL; 267LLPieMenu* gAttachScreenPieMenu = NULL;
268LLPieMenu* gAttachPieMenu = NULL; 268LLPieMenu* gAttachPieMenu = NULL;
269LLPieMenu* gAttachBodyPartPieMenus[8]; 269LLPieMenu* gAttachBodyPartPieMenus[8];
@@ -610,10 +610,11 @@ void init_menus()
610 610
611 gAttachScreenPieMenu = gMenuHolder->getChild<LLPieMenu>("Object Attach HUD"); 611 gAttachScreenPieMenu = gMenuHolder->getChild<LLPieMenu>("Object Attach HUD");
612 gAttachPieMenu = gMenuHolder->getChild<LLPieMenu>("Object Attach"); 612 gAttachPieMenu = gMenuHolder->getChild<LLPieMenu>("Object Attach");
613 gPieRate = gMenuHolder->getChild<LLPieMenu>("Rate Menu");
614 613
615 gPieAttachment = LLUICtrlFactory::getInstance()->buildPieMenu("menu_pie_attachment.xml", gMenuHolder); 614 gPieAttachment = LLUICtrlFactory::getInstance()->buildPieMenu("menu_pie_attachment.xml", gMenuHolder);
616 615
616 gPieHUD = LLUICtrlFactory::getInstance()->buildPieMenu("menu_pie_hud.xml", gMenuHolder);
617
617 gPieLand = LLUICtrlFactory::getInstance()->buildPieMenu("menu_pie_land.xml", gMenuHolder); 618 gPieLand = LLUICtrlFactory::getInstance()->buildPieMenu("menu_pie_land.xml", gMenuHolder);
618 619
619 /// 620 ///
@@ -626,6 +627,7 @@ void init_menus()
626 gPieAvatar->setBackgroundColor( pie_color ); 627 gPieAvatar->setBackgroundColor( pie_color );
627 gPieObject->setBackgroundColor( pie_color ); 628 gPieObject->setBackgroundColor( pie_color );
628 gPieAttachment->setBackgroundColor( pie_color ); 629 gPieAttachment->setBackgroundColor( pie_color );
630 gPieHUD->setBackgroundColor( pie_color );
629 gPieLand->setBackgroundColor( pie_color ); 631 gPieLand->setBackgroundColor( pie_color );
630 632
631 color = gColors.getColor( "MenuPopupBgColor" ); 633 color = gColors.getColor( "MenuPopupBgColor" );
@@ -1475,6 +1477,9 @@ void cleanup_menus()
1475 delete gPieAttachment; 1477 delete gPieAttachment;
1476 gPieAttachment = NULL; 1478 gPieAttachment = NULL;
1477 1479
1480 delete gPieHUD;
1481 gPieHUD = NULL;
1482
1478 delete gPieLand; 1483 delete gPieLand;
1479 gPieLand = NULL; 1484 gPieLand = NULL;
1480 1485
diff --git a/linden/indra/newview/llviewermenu.h b/linden/indra/newview/llviewermenu.h
index e003e90..c2f880e 100644
--- a/linden/indra/newview/llviewermenu.h
+++ b/linden/indra/newview/llviewermenu.h
@@ -147,14 +147,15 @@ extern LLPieMenu *gPieSelf;
147extern LLPieMenu *gPieAvatar; 147extern LLPieMenu *gPieAvatar;
148extern LLPieMenu *gPieObject; 148extern LLPieMenu *gPieObject;
149extern LLPieMenu *gPieAttachment; 149extern LLPieMenu *gPieAttachment;
150extern LLPieMenu *gPieHUD;
150extern LLPieMenu *gPieLand; 151extern LLPieMenu *gPieLand;
151extern LLPieMenu* gPieRate;
152 152
153// Pie menus 153// Pie menus
154extern LLPieMenu *gPieSelfSimple; 154extern LLPieMenu *gPieSelfSimple;
155extern LLPieMenu *gPieAvatarSimple; 155extern LLPieMenu *gPieAvatarSimple;
156extern LLPieMenu *gPieObjectSimple; 156extern LLPieMenu *gPieObjectSimple;
157extern LLPieMenu *gPieAttachmentSimple; 157extern LLPieMenu *gPieAttachmentSimple;
158extern LLPieMenu *gPieHUDSimple;
158extern LLPieMenu *gPieLandSimple; 159extern LLPieMenu *gPieLandSimple;
159 160
160// Needed to build menus when attachment site list available 161// Needed to build menus when attachment site list available
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_top_objects.xml b/linden/indra/newview/skins/default/xui/en-us/floater_top_objects.xml
index 96f48eb..1b60510 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_top_objects.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_top_objects.xml
@@ -14,7 +14,8 @@
14 <column label="Owner" name="owner" width="105" /> 14 <column label="Owner" name="owner" width="105" />
15 <column label="Location" name="location" width="130" /> 15 <column label="Location" name="location" width="130" />
16 <column label="Time" name="time" width="100" /> 16 <column label="Time" name="time" width="100" />
17 </scroll_list> 17 <column label="Mono Time" name="mono_time" width="55" />
18 </scroll_list>
18 <text bottom_delta="-30" follows="left|bottom" font="SansSerifSmall" height="20" 19 <text bottom_delta="-30" follows="left|bottom" font="SansSerifSmall" height="20"
19 left="10" name="id_text" width="100"> 20 left="10" name="id_text" width="100">
20 Object ID: 21 Object ID:
@@ -61,7 +62,10 @@
61 <string name="scripts_score_label"> 62 <string name="scripts_score_label">
62 Time 63 Time
63 </string> 64 </string>
64 <string name="top_colliders_title"> 65 <string name="scripts_mono_time_label">
66 Mono Time
67 </string>
68 <string name="top_colliders_title">
65 Top Colliders 69 Top Colliders
66 </string> 70 </string>
67 <string name="top_colliders_text"> 71 <string name="top_colliders_text">
@@ -70,7 +74,7 @@
70 <string name="colliders_score_label"> 74 <string name="colliders_score_label">
71 Score 75 Score
72 </string> 76 </string>
73 <string name="none_descriptor"> 77 <string name="none_descriptor">
74 None found. 78 None found.
75 </string> 79 </string>
76</floater> 80</floater>
diff --git a/linden/indra/newview/skins/default/xui/en-us/menu_pie_hud.xml b/linden/indra/newview/skins/default/xui/en-us/menu_pie_hud.xml
new file mode 100644
index 0000000..ba6db28
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/en-us/menu_pie_hud.xml
@@ -0,0 +1,23 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<pie_menu name="Hud Pie">
3 <menu_item_call enabled="false" label="Detach" mouse_opaque="true" name="Detach">
4 <on_click function="Attachment.Detach" />
5 <on_enable function="Attachment.EnableDetach" />
6 </menu_item_call>
7 <menu_item_separator />
8 <menu_item_call enabled="false" label="Touch" mouse_opaque="true" name="Attachment Touch">
9 <on_click function="Object.Touch" />
10 <on_enable function="Attachment.EnableTouch" userdata="Touch" />
11 </menu_item_call>
12 <menu_item_separator />
13 <menu_item_separator />
14 <menu_item_separator />
15 <menu_item_call enabled="false" label="Edit..." mouse_opaque="true" name="Edit...">
16 <on_click function="Object.Edit" />
17 <on_enable function="EnableEdit" />
18 </menu_item_call>
19 <menu_item_call enabled="false" label="Drop" mouse_opaque="true" name="Drop">
20 <on_click function="Attachment.Drop" />
21 <on_enable function="Attachment.EnableDrop" />
22 </menu_item_call>
23</pie_menu>
diff --git a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
index 2d5402b..4758116 100644
--- a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
@@ -1064,42 +1064,42 @@
1064 <menu name="Features" drop_shadow="true" 1064 <menu name="Features" drop_shadow="true"
1065 opaque="true" tear_off="true"> 1065 opaque="true" tear_off="true">
1066 <menu_item_check name="UI" label="UI" 1066 <menu_item_check name="UI" label="UI"
1067 shortcut="control|alt|F1"> 1067 shortcut="alt|shift|F1">
1068 <on_click function="Advanced.ToggleFeature" 1068 <on_click function="Advanced.ToggleFeature"
1069 userdata="ui" /> 1069 userdata="ui" />
1070 <on_check function="Advanced.CheckFeature" 1070 <on_check function="Advanced.CheckFeature"
1071 userdata="ui" /> 1071 userdata="ui" />
1072 </menu_item_check> 1072 </menu_item_check>
1073 <menu_item_check name="Selected" label="Selected" 1073 <menu_item_check name="Selected" label="Selected"
1074 shortcut="control|alt|F2"> 1074 shortcut="alt|shift|F2">
1075 <on_click function="Advanced.ToggleFeature" 1075 <on_click function="Advanced.ToggleFeature"
1076 userdata="selected" /> 1076 userdata="selected" />
1077 <on_check function="Advanced.CheckFeature" 1077 <on_check function="Advanced.CheckFeature"
1078 userdata="selected" /> 1078 userdata="selected" />
1079 </menu_item_check> 1079 </menu_item_check>
1080 <menu_item_check name="Highlighted" label="Highlighted" 1080 <menu_item_check name="Highlighted" label="Highlighted"
1081 shortcut="control|alt|F3"> 1081 shortcut="alt|shift|F3">
1082 <on_click function="Advanced.ToggleFeature" 1082 <on_click function="Advanced.ToggleFeature"
1083 userdata="highlighted" /> 1083 userdata="highlighted" />
1084 <on_check function="Advanced.CheckFeature" 1084 <on_check function="Advanced.CheckFeature"
1085 userdata="highlighted" /> 1085 userdata="highlighted" />
1086 </menu_item_check> 1086 </menu_item_check>
1087 <menu_item_check name="Dynamic Textures" label="Dynamic Textures" 1087 <menu_item_check name="Dynamic Textures" label="Dynamic Textures"
1088 shortcut="control|alt|F4"> 1088 shortcut="alt|shift|F4">
1089 <on_click function="Advanced.ToggleFeature" 1089 <on_click function="Advanced.ToggleFeature"
1090 userdata="dynamic textures" /> 1090 userdata="dynamic textures" />
1091 <on_check function="Advanced.CheckFeature" 1091 <on_check function="Advanced.CheckFeature"
1092 userdata="dynamic textures" /> 1092 userdata="dynamic textures" />
1093 </menu_item_check> 1093 </menu_item_check>
1094 <menu_item_check name="Foot Shadows" label="Foot Shadows" 1094 <menu_item_check name="Foot Shadows" label="Foot Shadows"
1095 shortcut="control|alt|F5"> 1095 shortcut="alt|shift|F5">
1096 <on_click function="Advanced.ToggleFeature" 1096 <on_click function="Advanced.ToggleFeature"
1097 userdata="foot shadows" /> 1097 userdata="foot shadows" />
1098 <on_check function="Advanced.CheckFeature" 1098 <on_check function="Advanced.CheckFeature"
1099 userdata="foot shadows" /> 1099 userdata="foot shadows" />
1100 </menu_item_check> 1100 </menu_item_check>
1101 <menu_item_check name="Fog" label="Fog" 1101 <menu_item_check name="Fog" label="Fog"
1102 shortcut="control|alt|F6"> 1102 shortcut="alt|shift|F6">
1103 <on_click function="Advanced.ToggleFeature" 1103 <on_click function="Advanced.ToggleFeature"
1104 userdata="fog" /> 1104 userdata="fog" />
1105 <on_check function="Advanced.CheckFeature" 1105 <on_check function="Advanced.CheckFeature"
@@ -1107,14 +1107,14 @@
1107 </menu_item_check> 1107 </menu_item_check>
1108 <menu_item_check name="Palletized Textures" 1108 <menu_item_check name="Palletized Textures"
1109 label="Palletized Textures" 1109 label="Palletized Textures"
1110 shortcut="control|alt|F7"> 1110 shortcut="alt|shift|F7">
1111 <on_click function="Advanced.ToggleFeature" 1111 <on_click function="Advanced.ToggleFeature"
1112 userdata="palette" /> 1112 userdata="palette" />
1113 <on_check function="Advanced.CheckFeature" 1113 <on_check function="Advanced.CheckFeature"
1114 userdata="palette" /> 1114 userdata="palette" />
1115 </menu_item_check> 1115 </menu_item_check>
1116 <menu_item_check name="Test FRInfo" label="Test FRInfo" 1116 <menu_item_check name="Test FRInfo" label="Test FRInfo"
1117 shortcut="control|alt|F8"> 1117 shortcut="alt|shift|F8">
1118 <on_click function="Advanced.ToggleFeature" 1118 <on_click function="Advanced.ToggleFeature"
1119 userdata="fr info" /> 1119 userdata="fr info" />
1120 <on_check function="Advanced.CheckFeature" 1120 <on_check function="Advanced.CheckFeature"
@@ -1122,7 +1122,7 @@
1122 </menu_item_check> 1122 </menu_item_check>
1123 <menu_item_check name="Flexible Objects" 1123 <menu_item_check name="Flexible Objects"
1124 label="Flexible Objects" 1124 label="Flexible Objects"
1125 shortcut="control|alt|F9"> 1125 shortcut="alt|shift|F9">
1126 <on_click function="Advanced.ToggleFeature" 1126 <on_click function="Advanced.ToggleFeature"
1127 userdata="flexible" /> 1127 userdata="flexible" />
1128 <on_check function="Advanced.CheckFeature" 1128 <on_check function="Advanced.CheckFeature"