diff options
Diffstat (limited to '')
152 files changed, 4032 insertions, 2804 deletions
diff --git a/linden/indra/newview/English.lproj/InfoPlist.strings b/linden/indra/newview/English.lproj/InfoPlist.strings index 54687b1..e9cd858 100644 --- a/linden/indra/newview/English.lproj/InfoPlist.strings +++ b/linden/indra/newview/English.lproj/InfoPlist.strings | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Localized versions of Info.plist keys */ | 1 | /* Localized versions of Info.plist keys */ |
2 | 2 | ||
3 | CFBundleName = "Second Life"; | 3 | CFBundleName = "Second Life"; |
4 | CFBundleShortVersionString = "Second Life version 1.15.0.2"; | 4 | CFBundleShortVersionString = "Second Life version 1.15.1.3"; |
5 | CFBundleGetInfoString = "Second Life version 1.15.0.2, Copyright 2004-2007 Linden Research, Inc."; | 5 | CFBundleGetInfoString = "Second Life version 1.15.1.3, Copyright 2004-2007 Linden Research, Inc."; |
diff --git a/linden/indra/newview/Info-SecondLife.plist b/linden/indra/newview/Info-SecondLife.plist index 0908e18..108f716 100644 --- a/linden/indra/newview/Info-SecondLife.plist +++ b/linden/indra/newview/Info-SecondLife.plist | |||
@@ -32,7 +32,7 @@ | |||
32 | </dict> | 32 | </dict> |
33 | </array> | 33 | </array> |
34 | <key>CFBundleVersion</key> | 34 | <key>CFBundleVersion</key> |
35 | <string>1.15.0.2</string> | 35 | <string>1.15.1.3</string> |
36 | <key>CSResourcesFileMapped</key> | 36 | <key>CSResourcesFileMapped</key> |
37 | <true/> | 37 | <true/> |
38 | </dict> | 38 | </dict> |
diff --git a/linden/indra/newview/app_settings/keys.ini b/linden/indra/newview/app_settings/keys.ini index b7fc6f9..3a1e9ea 100644 --- a/linden/indra/newview/app_settings/keys.ini +++ b/linden/indra/newview/app_settings/keys.ini | |||
@@ -235,6 +235,13 @@ EDIT PAD_PGUP ALT jump | |||
235 | EDIT PAD_PGDN ALT push_down | 235 | EDIT PAD_PGDN ALT push_down |
236 | EDIT PAD_ENTER ALT start_chat | 236 | EDIT PAD_ENTER ALT start_chat |
237 | 237 | ||
238 | SITTING A ALT spin_around_cw | ||
239 | SITTING D ALT spin_around_ccw | ||
240 | SITTING W ALT move_forward | ||
241 | SITTING S ALT move_backward | ||
242 | SITTING E ALT spin_over_sitting | ||
243 | SITTING C ALT spin_under_sitting | ||
244 | |||
238 | SITTING LEFT ALT spin_around_cw | 245 | SITTING LEFT ALT spin_around_cw |
239 | SITTING RIGHT ALT spin_around_ccw | 246 | SITTING RIGHT ALT spin_around_ccw |
240 | SITTING UP ALT move_forward | 247 | SITTING UP ALT move_forward |
@@ -242,6 +249,21 @@ SITTING DOWN ALT move_backward | |||
242 | SITTING PGUP ALT spin_over | 249 | SITTING PGUP ALT spin_over |
243 | SITTING PGDN ALT spin_under | 250 | SITTING PGDN ALT spin_under |
244 | 251 | ||
252 | SITTING A CTL_ALT spin_around_cw | ||
253 | SITTING D CTL_ALT spin_around_ccw | ||
254 | SITTING W CTL_ALT spin_over | ||
255 | SITTING S CTL_ALT spin_under | ||
256 | SITTING E CTL_ALT spin_over | ||
257 | SITTING C CTL_ALT spin_under | ||
258 | |||
259 | SITTING LEFT CTL_ALT spin_around_cw | ||
260 | SITTING RIGHT CTL_ALT spin_around_ccw | ||
261 | SITTING UP CTL_ALT spin_over | ||
262 | SITTING DOWN CTL_ALT spin_under | ||
263 | SITTING PGUP CTL_ALT spin_over | ||
264 | SITTING PGDN CTL_ALT spin_under | ||
265 | |||
266 | |||
245 | SITTING A NONE spin_around_cw_sitting | 267 | SITTING A NONE spin_around_cw_sitting |
246 | SITTING D NONE spin_around_ccw_sitting | 268 | SITTING D NONE spin_around_ccw_sitting |
247 | SITTING W NONE move_forward_sitting | 269 | SITTING W NONE move_forward_sitting |
diff --git a/linden/indra/newview/featuretable_linux.txt b/linden/indra/newview/featuretable_linux.txt new file mode 100644 index 0000000..6c7acfa --- /dev/null +++ b/linden/indra/newview/featuretable_linux.txt | |||
@@ -0,0 +1,173 @@ | |||
1 | version 10 | ||
2 | |||
3 | // NOTE: This is mostly identical to featuretable.txt with a few differences | ||
4 | // Should be combined into one table | ||
5 | |||
6 | // | ||
7 | // Generates lists of feature mask that can be applied on top of each other. | ||
8 | // | ||
9 | // // Begin comments | ||
10 | // list <name> | ||
11 | // Starts a feature list named <name> | ||
12 | // <name> <available> <recommended> | ||
13 | // <name> is the name of a feature | ||
14 | // <available> is 0 or 1, whether the feature is available | ||
15 | // <recommended> is an S32 which is the recommended value | ||
16 | // | ||
17 | // For now, the first list read sets up all of the default values | ||
18 | // | ||
19 | |||
20 | |||
21 | // | ||
22 | // All contains everything at their default settings for high end machines | ||
23 | // NOTE: All settings are set to the MIN of applied values, including 'all'! | ||
24 | // | ||
25 | list all | ||
26 | RenderVBO 1 1 | ||
27 | RenderAniso 1 0 | ||
28 | RenderAvatarMode 1 2 | ||
29 | RenderAvatarVP 1 1 | ||
30 | RenderDistance 1 128 | ||
31 | RenderLighting 1 1 | ||
32 | RenderObjectBump 1 1 | ||
33 | RenderParticleCount 1 4096 | ||
34 | RenderRippleWater 1 1 | ||
35 | RenderTerrainDetail 1 2 | ||
36 | VertexShaderEnable 1 1 | ||
37 | |||
38 | // | ||
39 | // Class 0 Hardware (Unknown or just old) | ||
40 | // | ||
41 | list Class0 | ||
42 | VertexShaderEnable 1 0 | ||
43 | RenderVBO 1 0 | ||
44 | RenderDistance 1 64 | ||
45 | RenderAvatarVP 1 0 | ||
46 | RenderAvatarMode 1 0 | ||
47 | RenderLighting 1 0 | ||
48 | RenderObjectBump 1 0 | ||
49 | RenderRippleWater 1 0 | ||
50 | |||
51 | // | ||
52 | // Class 1 Hardware | ||
53 | // | ||
54 | list Class1 | ||
55 | VertexShaderEnable 1 0 | ||
56 | RenderVBO 1 1 | ||
57 | RenderDistance 1 96 | ||
58 | RenderAvatarVP 1 1 | ||
59 | RenderAvatarMode 1 0 | ||
60 | RenderLighting 1 0 | ||
61 | RenderObjectBump 1 0 | ||
62 | RenderRippleWater 1 0 | ||
63 | |||
64 | // | ||
65 | // Class 2 Hardware (make it purty) | ||
66 | // | ||
67 | list Class2 | ||
68 | VertexShaderEnable 1 1 | ||
69 | RenderAvatarVP 1 1 | ||
70 | RenderAvatarMode 1 1 | ||
71 | RenderLighting 1 1 | ||
72 | RenderObjectBump 1 1 | ||
73 | RenderRippleWater 1 1 | ||
74 | |||
75 | // | ||
76 | // Class 3 Hardware (make it purty) | ||
77 | // | ||
78 | list Class3 | ||
79 | VertexShaderEnable 1 1 | ||
80 | RenderAvatarVP 1 1 | ||
81 | RenderAvatarMode 1 1 | ||
82 | RenderLighting 1 1 | ||
83 | RenderObjectBump 1 1 | ||
84 | RenderRippleWater 1 1 | ||
85 | |||
86 | // | ||
87 | // No Pixel Shaders available | ||
88 | // | ||
89 | list NoPixelShaders | ||
90 | VertexShaderEnable 0 0 | ||
91 | RenderAvatarVP 0 0 | ||
92 | |||
93 | // | ||
94 | // No Vertex Shaders available | ||
95 | // | ||
96 | list NoVertexShaders | ||
97 | VertexShaderEnable 0 0 | ||
98 | RenderAvatarVP 0 0 | ||
99 | |||
100 | // | ||
101 | // "Default" setups for safe, low, medium, high | ||
102 | // | ||
103 | list safe | ||
104 | RenderVBO 1 0 | ||
105 | RenderAniso 1 0 | ||
106 | RenderAvatarVP 0 0 | ||
107 | RenderLighting 1 0 | ||
108 | RenderParticleCount 1 1024 | ||
109 | RenderTerrainDetail 1 0 | ||
110 | |||
111 | |||
112 | list low | ||
113 | RenderVBO 1 0 | ||
114 | RenderAniso 1 0 | ||
115 | RenderLighting 1 0 | ||
116 | |||
117 | list medium | ||
118 | RenderLighting 1 0 | ||
119 | |||
120 | |||
121 | // | ||
122 | // CPU based feature masks | ||
123 | // | ||
124 | |||
125 | // 1Ghz or less (equiv) | ||
126 | list CPUSlow | ||
127 | RenderParticleCount 1 1024 | ||
128 | |||
129 | |||
130 | // | ||
131 | // RAM based feature masks | ||
132 | // | ||
133 | list RAM256MB | ||
134 | RenderObjectBump 0 0 | ||
135 | |||
136 | |||
137 | // | ||
138 | // Graphics card based feature masks | ||
139 | // | ||
140 | list OpenGLPre15 | ||
141 | RenderVBO 1 0 | ||
142 | |||
143 | list Intel | ||
144 | RenderVBO 1 0 | ||
145 | RenderAniso 1 0 | ||
146 | RenderLighting 1 0 | ||
147 | RenderTerrainDetail 1 0 | ||
148 | |||
149 | list GeForce2 | ||
150 | RenderVBO 1 1 | ||
151 | RenderAniso 1 0 | ||
152 | RenderLighting 1 0 | ||
153 | RenderParticleCount 1 2048 | ||
154 | RenderTerrainDetail 1 0 | ||
155 | |||
156 | list GeForce3 | ||
157 | |||
158 | list ATI | ||
159 | |||
160 | list Radeon8500 | ||
161 | RenderLighting 1 0 | ||
162 | RenderParticleCount 1 4096 | ||
163 | |||
164 | // Hacked to be paranoid "safe" | ||
165 | list Radeon9700 | ||
166 | RenderParticleCount 1 4096 | ||
167 | |||
168 | // Hacked to be paranoid "safe" | ||
169 | list MobilityRadeon9000 | ||
170 | RenderLighting 1 0 | ||
171 | RenderParticleCount 1 4096 | ||
172 | |||
173 | list GeForceFX | ||
diff --git a/linden/indra/newview/files.lst b/linden/indra/newview/files.lst index 8fdd239..2967bed 100644 --- a/linden/indra/newview/files.lst +++ b/linden/indra/newview/files.lst | |||
@@ -282,6 +282,7 @@ newview/llviewerjoystick.cpp | |||
282 | newview/llviewerkeyboard.cpp | 282 | newview/llviewerkeyboard.cpp |
283 | newview/llviewerlayer.cpp | 283 | newview/llviewerlayer.cpp |
284 | newview/llviewermenu.cpp | 284 | newview/llviewermenu.cpp |
285 | newview/llviewermenufile.cpp | ||
285 | newview/llviewermessage.cpp | 286 | newview/llviewermessage.cpp |
286 | newview/llviewernetwork.cpp | 287 | newview/llviewernetwork.cpp |
287 | newview/llviewerobject.cpp | 288 | newview/llviewerobject.cpp |
diff --git a/linden/indra/newview/gpu_table.txt b/linden/indra/newview/gpu_table.txt index 4e6373d..a6d1dee 100644 --- a/linden/indra/newview/gpu_table.txt +++ b/linden/indra/newview/gpu_table.txt | |||
@@ -22,11 +22,9 @@ ATI All-in-Wonder X1800 .*ATI.*All-in-Wonder X18.* 3 | |||
22 | ATI All-in-Wonder X1900 .*ATI.*All-in-Wonder X19.* 3 | 22 | ATI All-in-Wonder X1900 .*ATI.*All-in-Wonder X19.* 3 |
23 | ATI ASUS X1xxx .*ASUS X1.* 3 | 23 | ATI ASUS X1xxx .*ASUS X1.* 3 |
24 | ATI Mobility Radeon X1xxx .*ATI.*Mobility.*X1.* 2 | 24 | ATI Mobility Radeon X1xxx .*ATI.*Mobility.*X1.* 2 |
25 | // HACK: We crash on startup on some Mobility Radeon chips, with 1.15.0 | 25 | ATI Mobility Radeon X3xx .*ATI.*Mobility.*X3.* 1 |
26 | // in FMOD (!). Try defaulting them to class 0. JC | 26 | ATI Mobility Radeon X6xx .*ATI.*Mobility.*X6.* 1 |
27 | ATI Mobility Radeon X3xx .*ATI.*Mobility.*X3.* 0 | 27 | ATI Mobility Radeon X7xx .*ATI.*Mobility.*X7.* 1 |
28 | ATI Mobility Radeon X6xx .*ATI.*Mobility.*X6.* 0 | ||
29 | ATI Mobility Radeon X7xx .*ATI.*Mobility.*X7.* 0 | ||
30 | ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 3 | 28 | ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 3 |
31 | ATI Diamond X1xxx .*ATI.*Diamond.*X1.* 3 | 29 | ATI Diamond X1xxx .*ATI.*Diamond.*X1.* 3 |
32 | ATI FireGL 5xxx .*ATI.*FireGL V5.* 3 | 30 | ATI FireGL 5xxx .*ATI.*FireGL V5.* 3 |
diff --git a/linden/indra/newview/linux_tools/client-readme.txt b/linden/indra/newview/linux_tools/client-readme.txt index cabb034..63086c8 100644 --- a/linden/indra/newview/linux_tools/client-readme.txt +++ b/linden/indra/newview/linux_tools/client-readme.txt | |||
@@ -97,7 +97,6 @@ the Alpha release of the Linux client. | |||
97 | implemented on the Linux client and are therefore known not to work properly | 97 | implemented on the Linux client and are therefore known not to work properly |
98 | at this time: | 98 | at this time: |
99 | * QuickTime movie playback and movie recording | 99 | * QuickTime movie playback and movie recording |
100 | * Video memory detection | ||
101 | * Full Unicode font rendering | 100 | * Full Unicode font rendering |
102 | * Auto-updater | 101 | * Auto-updater |
103 | 102 | ||
diff --git a/linden/indra/newview/linux_tools/launch_url.sh b/linden/indra/newview/linux_tools/launch_url.sh index 564e834..a1c6f5d 100755 --- a/linden/indra/newview/linux_tools/launch_url.sh +++ b/linden/indra/newview/linux_tools/launch_url.sh | |||
@@ -1,5 +1,5 @@ | |||
1 | #!/bin/sh | 1 | #!/bin/sh |
2 | # bash v1.14+ expected | 2 | # Script tested with: bash 1.14, bash 3.1.17, zsh 4.2.5, ksh 1993-12-28 |
3 | 3 | ||
4 | # This script loads a web page in the 'default' graphical web browser. | 4 | # This script loads a web page in the 'default' graphical web browser. |
5 | # It MUST return immediately (or soon), so the browser should be | 5 | # It MUST return immediately (or soon), so the browser should be |
diff --git a/linden/indra/newview/linux_tools/wrapper.sh b/linden/indra/newview/linux_tools/wrapper.sh index cdc36a8..5f128e8 100755 --- a/linden/indra/newview/linux_tools/wrapper.sh +++ b/linden/indra/newview/linux_tools/wrapper.sh | |||
@@ -1,4 +1,6 @@ | |||
1 | #!/bin/sh | 1 | #!/bin/sh |
2 | # Script tested with: bash 1.14, bash 3.1.17, zsh 4.2.5, ksh 1993-12-28 | ||
3 | |||
2 | ## Here are some configuration options for Linux Client Alpha Testers. | 4 | ## Here are some configuration options for Linux Client Alpha Testers. |
3 | ## These options are for self-assisted troubleshooting during this alpha | 5 | ## These options are for self-assisted troubleshooting during this alpha |
4 | ## testing phase; you should not usually need to touch them. | 6 | ## testing phase; you should not usually need to touch them. |
diff --git a/linden/indra/newview/llagent.cpp b/linden/indra/newview/llagent.cpp index ff16682..85c268b 100644 --- a/linden/indra/newview/llagent.cpp +++ b/linden/indra/newview/llagent.cpp | |||
@@ -7081,7 +7081,7 @@ void LLAgent::queryWearableCache() | |||
7081 | // Look up affected baked textures. | 7081 | // Look up affected baked textures. |
7082 | // If they exist: | 7082 | // If they exist: |
7083 | // disallow updates for affected layersets (until dataserver responds with cache request.) | 7083 | // disallow updates for affected layersets (until dataserver responds with cache request.) |
7084 | // If cache miss…turn updates back on and invalidate composite. | 7084 | // If cache miss, turn updates back on and invalidate composite. |
7085 | // If cache hit, modify baked texture entries. | 7085 | // If cache hit, modify baked texture entries. |
7086 | // | 7086 | // |
7087 | // Cache requests contain list of hashes for each baked texture entry. | 7087 | // Cache requests contain list of hashes for each baked texture entry. |
diff --git a/linden/indra/newview/llassetuploadresponders.cpp b/linden/indra/newview/llassetuploadresponders.cpp index 821bb2a..26c606f 100644 --- a/linden/indra/newview/llassetuploadresponders.cpp +++ b/linden/indra/newview/llassetuploadresponders.cpp | |||
@@ -21,7 +21,7 @@ | |||
21 | #include "lluploaddialog.h" | 21 | #include "lluploaddialog.h" |
22 | #include "llviewerobject.h" | 22 | #include "llviewerobject.h" |
23 | #include "llviewerobjectlist.h" | 23 | #include "llviewerobjectlist.h" |
24 | #include "llviewermenu.h" | 24 | #include "llviewermenufile.h" |
25 | #include "llviewerwindow.h" | 25 | #include "llviewerwindow.h" |
26 | #include "viewer.h" | 26 | #include "viewer.h" |
27 | 27 | ||
diff --git a/linden/indra/newview/llcallingcard.cpp b/linden/indra/newview/llcallingcard.cpp index 22e7f23..3e00f40 100644 --- a/linden/indra/newview/llcallingcard.cpp +++ b/linden/indra/newview/llcallingcard.cpp | |||
@@ -269,12 +269,28 @@ S32 LLAvatarTracker::addBuddyList(const LLAvatarTracker::buddy_map_t& buds) | |||
269 | for(buddy_map_t::const_iterator itr = buds.begin(); itr != buds.end(); ++itr) | 269 | for(buddy_map_t::const_iterator itr = buds.begin(); itr != buds.end(); ++itr) |
270 | { | 270 | { |
271 | agent_id = (*itr).first; | 271 | agent_id = (*itr).first; |
272 | if(mBuddyInfo.find(agent_id) == mBuddyInfo.end()) | 272 | buddy_map_t::const_iterator existing_buddy = mBuddyInfo.find(agent_id); |
273 | if(existing_buddy == mBuddyInfo.end()) | ||
273 | { | 274 | { |
274 | ++new_buddy_count; | 275 | ++new_buddy_count; |
275 | mBuddyInfo[agent_id] = (*itr).second; | 276 | mBuddyInfo[agent_id] = (*itr).second; |
276 | gCacheName->getName(agent_id, first, last); | 277 | gCacheName->getName(agent_id, first, last); |
277 | mModifyMask |= LLFriendObserver::ADD; | 278 | mModifyMask |= LLFriendObserver::ADD; |
279 | lldebugs << "Added buddy " << agent_id | ||
280 | << ", " << (mBuddyInfo[agent_id]->isOnline() ? "Online" : "Offline") | ||
281 | << ", TO: " << mBuddyInfo[agent_id]->getRightsGrantedTo() | ||
282 | << ", FROM: " << mBuddyInfo[agent_id]->getRightsGrantedFrom() | ||
283 | << llendl; | ||
284 | } | ||
285 | else | ||
286 | { | ||
287 | LLRelationship* e_r = (*existing_buddy).second; | ||
288 | LLRelationship* n_r = (*itr).second; | ||
289 | llwarns << "!! Add buddy for existing buddy: " << agent_id | ||
290 | << " [" << (e_r->isOnline() ? "Online" : "Offline") << "->" << (n_r->isOnline() ? "Online" : "Offline") | ||
291 | << ", " << e_r->getRightsGrantedTo() << "->" << n_r->getRightsGrantedTo() | ||
292 | << ", " << e_r->getRightsGrantedTo() << "->" << n_r->getRightsGrantedTo() | ||
293 | << "]" << llendl; | ||
278 | } | 294 | } |
279 | } | 295 | } |
280 | 296 | ||
@@ -325,6 +341,12 @@ void LLAvatarTracker::setBuddyOnline(const LLUUID& id, bool is_online) | |||
325 | { | 341 | { |
326 | info->online(is_online); | 342 | info->online(is_online); |
327 | mModifyMask |= LLFriendObserver::ONLINE; | 343 | mModifyMask |= LLFriendObserver::ONLINE; |
344 | lldebugs << "Set buddy " << id << (is_online ? " Online" : " Offline") << llendl; | ||
345 | } | ||
346 | else | ||
347 | { | ||
348 | llwarns << "!! No buddy info found for " << id | ||
349 | << ", setting to " << (is_online ? "Online" : "Offline") << llendl; | ||
328 | } | 350 | } |
329 | } | 351 | } |
330 | 352 | ||
@@ -598,6 +620,7 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online) | |||
598 | S32 count = msg->getNumberOfBlocksFast(_PREHASH_AgentBlock); | 620 | S32 count = msg->getNumberOfBlocksFast(_PREHASH_AgentBlock); |
599 | BOOL chat_notify = gSavedSettings.getBOOL("ChatOnlineNotification"); | 621 | BOOL chat_notify = gSavedSettings.getBOOL("ChatOnlineNotification"); |
600 | 622 | ||
623 | lldebugs << "Received " << count << " online notifications **** " << llendl; | ||
601 | if(count > 0) | 624 | if(count > 0) |
602 | { | 625 | { |
603 | LLUUID agent_id; | 626 | LLUUID agent_id; |
@@ -628,6 +651,12 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online) | |||
628 | } | 651 | } |
629 | } | 652 | } |
630 | } | 653 | } |
654 | else | ||
655 | { | ||
656 | llwarns << "Received online notification for unknown buddy: " | ||
657 | << agent_id << " is " << (online ? "ONLINE" : "OFFLINE") << llendl; | ||
658 | } | ||
659 | |||
631 | if(tracking_id == agent_id) | 660 | if(tracking_id == agent_id) |
632 | { | 661 | { |
633 | // we were tracking someone who went offline | 662 | // we were tracking someone who went offline |
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp index 02bed33..a6feac7 100644 --- a/linden/indra/newview/llchatbar.cpp +++ b/linden/indra/newview/llchatbar.cpp | |||
@@ -118,9 +118,10 @@ LLChatBar::LLChatBar(const std::string& name, const LLRect& rect) | |||
118 | mInputEditor->setRevertOnEsc( FALSE ); | 118 | mInputEditor->setRevertOnEsc( FALSE ); |
119 | mInputEditor->setIgnoreTab(TRUE); | 119 | mInputEditor->setIgnoreTab(TRUE); |
120 | mInputEditor->setPassDelete(TRUE); | 120 | mInputEditor->setPassDelete(TRUE); |
121 | |||
122 | mInputEditor->setMaxTextLength(1023); | ||
121 | } | 123 | } |
122 | 124 | ||
123 | mInputEditor->setMaxTextLength(1023); | ||
124 | // Build the list of gestures | 125 | // Build the list of gestures |
125 | refreshGestures(); | 126 | refreshGestures(); |
126 | 127 | ||
diff --git a/linden/indra/newview/llcontroldef.cpp b/linden/indra/newview/llcontroldef.cpp index 7989791..11b97b4 100644 --- a/linden/indra/newview/llcontroldef.cpp +++ b/linden/indra/newview/llcontroldef.cpp | |||
@@ -573,7 +573,7 @@ void declare_settings() | |||
573 | 573 | ||
574 | gSavedSettings.declareBOOL("ShowAxes", FALSE, "Render coordinate frame at your position"); | 574 | gSavedSettings.declareBOOL("ShowAxes", FALSE, "Render coordinate frame at your position"); |
575 | 575 | ||
576 | gSavedSettings.declareBOOL("ShowMiniMap", FALSE, "Display mini map on login"); | 576 | gSavedSettings.declareBOOL("ShowMiniMap", TRUE, "Display mini map on login"); |
577 | gSavedSettings.declareBOOL("ShowWorldMap", FALSE, "Display world map on login"); | 577 | gSavedSettings.declareBOOL("ShowWorldMap", FALSE, "Display world map on login"); |
578 | gSavedSettings.declareBOOL("ShowToolBar", TRUE, "Show toolbar at bottom of screen"); | 578 | gSavedSettings.declareBOOL("ShowToolBar", TRUE, "Show toolbar at bottom of screen"); |
579 | gSavedSettings.declareBOOL("ShowCameraControls", FALSE, "Display camera controls on login"); | 579 | gSavedSettings.declareBOOL("ShowCameraControls", FALSE, "Display camera controls on login"); |
@@ -833,7 +833,7 @@ void declare_settings() | |||
833 | // Previews - only width and height are used | 833 | // Previews - only width and height are used |
834 | gSavedSettings.declareRect("PreviewTextureRect", LLRect(0, 400, 400, 0), "Rectangle for texture preview window" ); // Only width and height are used | 834 | gSavedSettings.declareRect("PreviewTextureRect", LLRect(0, 400, 400, 0), "Rectangle for texture preview window" ); // Only width and height are used |
835 | gSavedSettings.declareRect("PreviewScriptRect", LLRect(0, 550, 500, 0), "Rectangle for script preview window" ); // Only width and height are used | 835 | gSavedSettings.declareRect("PreviewScriptRect", LLRect(0, 550, 500, 0), "Rectangle for script preview window" ); // Only width and height are used |
836 | gSavedSettings.declareRect("LSLHelpRect", LLRect(0, 500, 600, 0), "Rectangle for LSL help window" ); // Only width and height are used | 836 | gSavedSettings.declareRect("LSLHelpRect", LLRect(0, 400, 400, 0), "Rectangle for LSL help window" ); // Only width and height are used |
837 | gSavedSettings.declareRect("PreviewLandmarkRect", LLRect(0, 90, 300, 0), "Rectangle for landmark preview window" ); // Only width and height are used | 837 | gSavedSettings.declareRect("PreviewLandmarkRect", LLRect(0, 90, 300, 0), "Rectangle for landmark preview window" ); // Only width and height are used |
838 | gSavedSettings.declareRect("PreviewSoundRect", LLRect(0, 85, 300, 0), "Rectangle for sound preview window" ); // Only width and height are used | 838 | gSavedSettings.declareRect("PreviewSoundRect", LLRect(0, 85, 300, 0), "Rectangle for sound preview window" ); // Only width and height are used |
839 | gSavedSettings.declareRect("PreviewObjectRect", LLRect(0, 85, 300, 0), "Rectangle for object preview window" ); // Only width and height are used | 839 | gSavedSettings.declareRect("PreviewObjectRect", LLRect(0, 85, 300, 0), "Rectangle for object preview window" ); // Only width and height are used |
@@ -1145,15 +1145,18 @@ void declare_settings() | |||
1145 | 1145 | ||
1146 | 1146 | ||
1147 | gSavedSettings.declareBOOL("NotifyMoneyChange", TRUE, "Pop up notifications for all financial transactions"); | 1147 | gSavedSettings.declareBOOL("NotifyMoneyChange", TRUE, "Pop up notifications for all financial transactions"); |
1148 | gSavedSettings.declareBOOL("ShowNewInventory", TRUE, | ||
1149 | "Automatic Previews of new notecards/textures/landmarks"); | ||
1148 | 1150 | ||
1149 | // Bitfield | 1151 | // Bitfield |
1150 | // 1 = by date | 1152 | // 1 = by date |
1151 | // 2 = folders always by name | 1153 | // 2 = folders always by name |
1154 | // 4 = system folders to top | ||
1152 | // This where the default first time user gets his settings. | 1155 | // This where the default first time user gets his settings. |
1153 | gSavedSettings.declareU32("InventorySortOrder", 1 | 2, "Specifies sort key for inventory items (+0 = name, +1 = date, +2 = folders always by name)"); | 1156 | gSavedSettings.declareU32("InventorySortOrder", 1 | 2 | 4, "Specifies sort key for inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)"); |
1154 | gSavedSettings.declareU32("RecentItemsSortOrder", 1, "Specifies sort key for recent inventory items (+0 = name, +1 = date, +2 = folders always by name)"); | 1157 | gSavedSettings.declareU32("RecentItemsSortOrder", 1, "Specifies sort key for recent inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)"); |
1155 | gSavedSettings.declareU32("TexturePickerSortOrder", 2, "Specifies sort key for textures in texture picker (+0 = name, +1 = date, +2 = folders always by name)"); | 1158 | gSavedSettings.declareU32("TexturePickerSortOrder", 2, "Specifies sort key for textures in texture picker (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)"); |
1156 | gSavedSettings.declareU32("AvatarPickerSortOrder", 2, "Specifies sort key for textures in avatar picker (+0 = name, +1 = date, +2 = folders always by name)"); | 1159 | gSavedSettings.declareU32("AvatarPickerSortOrder", 2, "Specifies sort key for textures in avatar picker (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)"); |
1157 | 1160 | ||
1158 | // Pixels away from edge that windows snap. | 1161 | // Pixels away from edge that windows snap. |
1159 | gSavedSettings.declareS32("SnapMargin", 10, "Controls maximum distance between windows before they auto-snap together (pixels)"); | 1162 | gSavedSettings.declareS32("SnapMargin", 10, "Controls maximum distance between windows before they auto-snap together (pixels)"); |
diff --git a/linden/indra/newview/lldebugmessagebox.cpp b/linden/indra/newview/lldebugmessagebox.cpp index af500da..e238800 100644 --- a/linden/indra/newview/lldebugmessagebox.cpp +++ b/linden/indra/newview/lldebugmessagebox.cpp | |||
@@ -225,21 +225,21 @@ void LLDebugVarMessageBox::draw() | |||
225 | 225 | ||
226 | if(mAnimate) | 226 | if(mAnimate) |
227 | { | 227 | { |
228 | F32 animated_val = clamp_rescale(fmodf((F32)LLFrameTimer::getElapsedSeconds() / 5.f, 1.f), 0.f, 1.f, 0.f, mSlider1->getMaxValue()); | ||
229 | if (mSlider1) | 228 | if (mSlider1) |
230 | { | 229 | { |
230 | F32 animated_val = clamp_rescale(fmodf((F32)LLFrameTimer::getElapsedSeconds() / 5.f, 1.f), 0.f, 1.f, 0.f, mSlider1->getMaxValue()); | ||
231 | mSlider1->setValue(animated_val); | 231 | mSlider1->setValue(animated_val); |
232 | slider_changed(mSlider1, this); | 232 | slider_changed(mSlider1, this); |
233 | } | 233 | if (mSlider2) |
234 | if (mSlider2) | 234 | { |
235 | { | 235 | mSlider2->setValue(animated_val); |
236 | mSlider2->setValue(animated_val); | 236 | slider_changed(mSlider2, this); |
237 | slider_changed(mSlider2, this); | 237 | } |
238 | } | 238 | if (mSlider3) |
239 | if (mSlider3) | 239 | { |
240 | { | 240 | mSlider3->setValue(animated_val); |
241 | mSlider3->setValue(animated_val); | 241 | slider_changed(mSlider3, this); |
242 | slider_changed(mSlider3, this); | 242 | } |
243 | } | 243 | } |
244 | } | 244 | } |
245 | LLFloater::draw(); | 245 | LLFloater::draw(); |
diff --git a/linden/indra/newview/lldrawpoolavatar.cpp b/linden/indra/newview/lldrawpoolavatar.cpp index debcfe2..b864449 100644 --- a/linden/indra/newview/lldrawpoolavatar.cpp +++ b/linden/indra/newview/lldrawpoolavatar.cpp | |||
@@ -102,7 +102,8 @@ BOOL gRenderAvatar = TRUE; | |||
102 | 102 | ||
103 | S32 LLDrawPoolAvatar::getVertexShaderLevel() const | 103 | S32 LLDrawPoolAvatar::getVertexShaderLevel() const |
104 | { | 104 | { |
105 | return (S32) LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR); | 105 | return sShaderLevel; |
106 | //return (S32) LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR); | ||
106 | } | 107 | } |
107 | 108 | ||
108 | void LLDrawPoolAvatar::prerender() | 109 | void LLDrawPoolAvatar::prerender() |
@@ -197,20 +198,22 @@ void LLDrawPoolAvatar::endFootShadow() | |||
197 | 198 | ||
198 | void LLDrawPoolAvatar::beginRigid() | 199 | void LLDrawPoolAvatar::beginRigid() |
199 | { | 200 | { |
200 | sVertexProgram = &gAvatarEyeballProgram; | 201 | sVertexProgram = NULL; |
202 | sShaderLevel = 0; | ||
201 | glEnableClientState(GL_NORMAL_ARRAY); | 203 | glEnableClientState(GL_NORMAL_ARRAY); |
202 | glEnableClientState(GL_TEXTURE_COORD_ARRAY); | 204 | glEnableClientState(GL_TEXTURE_COORD_ARRAY); |
203 | 205 | ||
204 | if (sShaderLevel > 0) | 206 | /*if (sShaderLevel > 0) |
205 | { //eyeballs render with the specular shader | 207 | { //eyeballs render with the specular shader |
206 | gAvatarEyeballProgram.bind(); | 208 | gAvatarEyeballProgram.bind(); |
207 | gMaterialIndex = gAvatarEyeballProgram.mAttribute[LLShaderMgr::MATERIAL_COLOR]; | 209 | gMaterialIndex = gAvatarEyeballProgram.mAttribute[LLShaderMgr::MATERIAL_COLOR]; |
208 | gSpecularIndex = gAvatarEyeballProgram.mAttribute[LLShaderMgr::SPECULAR_COLOR]; | 210 | gSpecularIndex = gAvatarEyeballProgram.mAttribute[LLShaderMgr::SPECULAR_COLOR]; |
209 | } | 211 | }*/ |
210 | } | 212 | } |
211 | 213 | ||
212 | void LLDrawPoolAvatar::endRigid() | 214 | void LLDrawPoolAvatar::endRigid() |
213 | { | 215 | { |
216 | sShaderLevel = mVertexShaderLevel; | ||
214 | glDisableClientState(GL_NORMAL_ARRAY); | 217 | glDisableClientState(GL_NORMAL_ARRAY); |
215 | glDisableClientState(GL_TEXTURE_COORD_ARRAY); | 218 | glDisableClientState(GL_TEXTURE_COORD_ARRAY); |
216 | } | 219 | } |
diff --git a/linden/indra/newview/lldriverparam.cpp b/linden/indra/newview/lldriverparam.cpp index ce42ad5..463888c 100644 --- a/linden/indra/newview/lldriverparam.cpp +++ b/linden/indra/newview/lldriverparam.cpp | |||
@@ -346,7 +346,7 @@ const LLVector3* LLDriverParam::getNextDistortion(U32 *index, LLPolyMesh **poly_ | |||
346 | 346 | ||
347 | // We're already in the middle of a param's distortions, so get the next one. | 347 | // We're already in the middle of a param's distortions, so get the next one. |
348 | const LLVector3* v = driven->mParam->getNextDistortion( index, poly_mesh ); | 348 | const LLVector3* v = driven->mParam->getNextDistortion( index, poly_mesh ); |
349 | if( !v ) | 349 | if( (!v) && (iter != mDriven.end()) ) |
350 | { | 350 | { |
351 | // This param is finished, so start the next param. It might not have any | 351 | // This param is finished, so start the next param. It might not have any |
352 | // distortions, though, so we have to loop to find the next param that does. | 352 | // distortions, though, so we have to loop to find the next param that does. |
diff --git a/linden/indra/newview/lleventpoll.cpp b/linden/indra/newview/lleventpoll.cpp index 9c5a19d..7430fc3 100644 --- a/linden/indra/newview/lleventpoll.cpp +++ b/linden/indra/newview/lleventpoll.cpp | |||
@@ -79,7 +79,7 @@ LLEventPoll::Impl& LLEventPoll::Impl::start( | |||
79 | 79 | ||
80 | void LLEventPoll::Impl::stop() | 80 | void LLEventPoll::Impl::stop() |
81 | { | 81 | { |
82 | llinfos << "LLEventPoll::Impl::stop <" << mCount << "> " | 82 | lldebugs << "LLEventPoll::Impl::stop <" << mCount << "> " |
83 | << mPollURL << llendl; | 83 | << mPollURL << llendl; |
84 | // there should be a way to stop a LLHTTPClient request in progress | 84 | // there should be a way to stop a LLHTTPClient request in progress |
85 | mDone = true; | 85 | mDone = true; |
diff --git a/linden/indra/newview/llfasttimerview.cpp b/linden/indra/newview/llfasttimerview.cpp index c469d8c..c7be3aa 100644 --- a/linden/indra/newview/llfasttimerview.cpp +++ b/linden/indra/newview/llfasttimerview.cpp | |||
@@ -1108,6 +1108,15 @@ F64 LLFastTimerView::getTime(LLFastTimer::EFastTimerType tidx) | |||
1108 | break; | 1108 | break; |
1109 | } | 1109 | } |
1110 | } | 1110 | } |
1111 | |||
1112 | if (i == FTV_DISPLAY_NUM) | ||
1113 | { | ||
1114 | // walked off the end of ft_display_table without finding | ||
1115 | // the desired timer type | ||
1116 | llwarns << "Timer type " << tidx << " not known." << llendl; | ||
1117 | return F64(0.0); | ||
1118 | } | ||
1119 | |||
1111 | S32 table_idx = i; | 1120 | S32 table_idx = i; |
1112 | 1121 | ||
1113 | // Add child ticks to parent | 1122 | // Add child ticks to parent |
diff --git a/linden/indra/newview/llfeaturemanager.cpp b/linden/indra/newview/llfeaturemanager.cpp index 57fbc64..2a30680 100644 --- a/linden/indra/newview/llfeaturemanager.cpp +++ b/linden/indra/newview/llfeaturemanager.cpp | |||
@@ -60,6 +60,8 @@ extern void write_debug(const std::string& str); | |||
60 | 60 | ||
61 | #if LL_DARWIN | 61 | #if LL_DARWIN |
62 | const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt"; | 62 | const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt"; |
63 | #elif LL_LINUX | ||
64 | const char FEATURE_TABLE_FILENAME[] = "featuretable_linux.txt"; | ||
63 | #else | 65 | #else |
64 | const char FEATURE_TABLE_FILENAME[] = "featuretable.txt"; | 66 | const char FEATURE_TABLE_FILENAME[] = "featuretable.txt"; |
65 | #endif | 67 | #endif |
diff --git a/linden/indra/newview/llfilepicker.cpp b/linden/indra/newview/llfilepicker.cpp index 971743b..24d3932 100644 --- a/linden/indra/newview/llfilepicker.cpp +++ b/linden/indra/newview/llfilepicker.cpp | |||
@@ -451,8 +451,9 @@ void LLFilePicker::reset() | |||
451 | 451 | ||
452 | void LLFilePicker::buildFilename( void ) | 452 | void LLFilePicker::buildFilename( void ) |
453 | { | 453 | { |
454 | strncpy( mFilename, mFiles, LL_MAX_PATH ); /*Flawfinder: ignore*/ | 454 | strncpy( mFilename, mFiles, LL_MAX_PATH ); |
455 | S32 len = strlen( mFilename ); /*Flawfinder: ignore*/ | 455 | mFilename[LL_MAX_PATH-1] = '\0'; // stupid strncpy |
456 | S32 len = strlen( mFilename ); | ||
456 | 457 | ||
457 | strncat(mFilename,gDirUtilp->getDirDelimiter().c_str(), sizeof(mFilename)-len+1); /*Flawfinder: ignore*/ | 458 | strncat(mFilename,gDirUtilp->getDirDelimiter().c_str(), sizeof(mFilename)-len+1); /*Flawfinder: ignore*/ |
458 | len += strlen(gDirUtilp->getDirDelimiter().c_str()); /*Flawfinder: ignore*/ | 459 | len += strlen(gDirUtilp->getDirDelimiter().c_str()); /*Flawfinder: ignore*/ |
@@ -858,7 +859,10 @@ void LLFilePicker::getFilePath(SInt32 index) | |||
858 | { | 859 | { |
859 | mFiles[0] = 0; | 860 | mFiles[0] = 0; |
860 | if (mFileVector.size()) | 861 | if (mFileVector.size()) |
861 | strncpy(mFiles, mFileVector[index].c_str(), sizeof(mFiles)); /*Flawfinder: ignore*/ | 862 | { |
863 | strncpy(mFiles, mFileVector[index].c_str(), sizeof(mFiles)); | ||
864 | mFiles[sizeof(mFiles)-1] = '\0'; // stupid strncpy | ||
865 | } | ||
862 | } | 866 | } |
863 | 867 | ||
864 | void LLFilePicker::getFileName(SInt32 index) | 868 | void LLFilePicker::getFileName(SInt32 index) |
@@ -868,7 +872,10 @@ void LLFilePicker::getFileName(SInt32 index) | |||
868 | { | 872 | { |
869 | char *start = strrchr(mFileVector[index].c_str(), '/'); | 873 | char *start = strrchr(mFileVector[index].c_str(), '/'); |
870 | if (start && ((start + 1 - mFileVector[index].c_str()) < (mFileVector[index].size()))) | 874 | if (start && ((start + 1 - mFileVector[index].c_str()) < (mFileVector[index].size()))) |
871 | strncpy(mFilename, start + 1, sizeof(mFilename)); /*Flawfinder: ignore*/ | 875 | { |
876 | strncpy(mFilename, start + 1, sizeof(mFilename)); | ||
877 | mFilename[sizeof(mFilename)-1] = '\0';// stupid strncpy | ||
878 | } | ||
872 | } | 879 | } |
873 | } | 880 | } |
874 | 881 | ||
diff --git a/linden/indra/newview/llfloateranimpreview.cpp b/linden/indra/newview/llfloateranimpreview.cpp index 6802fb2..b1f8a53 100644 --- a/linden/indra/newview/llfloateranimpreview.cpp +++ b/linden/indra/newview/llfloateranimpreview.cpp | |||
@@ -54,7 +54,7 @@ | |||
54 | #include "llviewercamera.h" | 54 | #include "llviewercamera.h" |
55 | #include "llviewerobjectlist.h" | 55 | #include "llviewerobjectlist.h" |
56 | #include "llviewerwindow.h" | 56 | #include "llviewerwindow.h" |
57 | #include "llviewermenu.h" | 57 | #include "llviewermenufile.h" // upload_new_resource() |
58 | #include "llvoavatar.h" | 58 | #include "llvoavatar.h" |
59 | #include "pipeline.h" | 59 | #include "pipeline.h" |
60 | #include "viewer.h" | 60 | #include "viewer.h" |
@@ -221,7 +221,7 @@ BOOL LLFloaterAnimPreview::postBuild() | |||
221 | } | 221 | } |
222 | 222 | ||
223 | apr_file_close(fp); | 223 | apr_file_close(fp); |
224 | delete file_buffer; | 224 | delete[] file_buffer; |
225 | } | 225 | } |
226 | } | 226 | } |
227 | 227 | ||
@@ -247,11 +247,11 @@ BOOL LLFloaterAnimPreview::postBuild() | |||
247 | // pass animation data through memory buffer | 247 | // pass animation data through memory buffer |
248 | loaderp->serialize(dp); | 248 | loaderp->serialize(dp); |
249 | dp.reset(); | 249 | dp.reset(); |
250 | BOOL success = motionp->deserialize(dp); | 250 | BOOL success = motionp && motionp->deserialize(dp); |
251 | 251 | ||
252 | delete []buffer; | 252 | delete []buffer; |
253 | 253 | ||
254 | if (motionp && success) | 254 | if (success) |
255 | { | 255 | { |
256 | const LLBBoxLocal &pelvis_bbox = motionp->getPelvisBBox(); | 256 | const LLBBoxLocal &pelvis_bbox = motionp->getPelvisBBox(); |
257 | 257 | ||
diff --git a/linden/indra/newview/llfloateravatarinfo.cpp b/linden/indra/newview/llfloateravatarinfo.cpp index c0351ee..2245d31 100644 --- a/linden/indra/newview/llfloateravatarinfo.cpp +++ b/linden/indra/newview/llfloateravatarinfo.cpp | |||
@@ -195,7 +195,6 @@ void LLFloaterAvatarInfo::showFromDirectory(const LLUUID &avatar_id) | |||
195 | { | 195 | { |
196 | // ...bring that window to front | 196 | // ...bring that window to front |
197 | floater = gAvatarInfoInstances.getData(avatar_id); | 197 | floater = gAvatarInfoInstances.getData(avatar_id); |
198 | floater->open(); /*Flawfinder: ignore*/ | ||
199 | } | 198 | } |
200 | else | 199 | else |
201 | { | 200 | { |
@@ -203,7 +202,10 @@ void LLFloaterAvatarInfo::showFromDirectory(const LLUUID &avatar_id) | |||
203 | avatar_id); | 202 | avatar_id); |
204 | floater->center(); | 203 | floater->center(); |
205 | floater->mPanelAvatarp->setAvatarID(avatar_id, "", ONLINE_STATUS_NO); | 204 | floater->mPanelAvatarp->setAvatarID(avatar_id, "", ONLINE_STATUS_NO); |
206 | floater->open(); /*Flawfinder: ignore*/ | 205 | } |
206 | if(floater) | ||
207 | { | ||
208 | floater->open(); | ||
207 | } | 209 | } |
208 | } | 210 | } |
209 | 211 | ||
diff --git a/linden/indra/newview/llfloaterfriends.cpp b/linden/indra/newview/llfloaterfriends.cpp index 8d39890..d01a24b 100644 --- a/linden/indra/newview/llfloaterfriends.cpp +++ b/linden/indra/newview/llfloaterfriends.cpp | |||
@@ -287,6 +287,7 @@ void LLFloaterFriends::refreshRightsChangeList(U8 state) | |||
287 | bool can_change_online_multiple = true; | 287 | bool can_change_online_multiple = true; |
288 | bool can_change_map_multiple = true; | 288 | bool can_change_map_multiple = true; |
289 | LLTextBox* processing_label = LLUICtrlFactory::getTextBoxByName(this, "process_rights_label"); | 289 | LLTextBox* processing_label = LLUICtrlFactory::getTextBoxByName(this, "process_rights_label"); |
290 | |||
290 | if(!mAllowRightsChange) | 291 | if(!mAllowRightsChange) |
291 | { | 292 | { |
292 | if(processing_label) | 293 | if(processing_label) |
@@ -302,9 +303,10 @@ void LLFloaterFriends::refreshRightsChangeList(U8 state) | |||
302 | processing_label->setVisible(false); | 303 | processing_label->setVisible(false); |
303 | } | 304 | } |
304 | } | 305 | } |
306 | |||
305 | if(state == 1) | 307 | if(state == 1) |
306 | { | 308 | { |
307 | if(!friend_status->isOnline()) | 309 | if(friend_status && !friend_status->isOnline()) |
308 | { | 310 | { |
309 | childSetEnabled("offer_teleport_btn", false); | 311 | childSetEnabled("offer_teleport_btn", false); |
310 | } | 312 | } |
diff --git a/linden/indra/newview/llfloatergroupinfo.cpp b/linden/indra/newview/llfloatergroupinfo.cpp index 348f31f..3e8eae5 100644 --- a/linden/indra/newview/llfloatergroupinfo.cpp +++ b/linden/indra/newview/llfloatergroupinfo.cpp | |||
@@ -191,7 +191,7 @@ void LLFloaterGroupInfo::showNotice(const char* subject, | |||
191 | // We need to clean up that inventory offer. | 191 | // We need to clean up that inventory offer. |
192 | if (inventory_offer) | 192 | if (inventory_offer) |
193 | { | 193 | { |
194 | inventory_offer_callback( 1 , inventory_offer); | 194 | inventory_offer_callback( IOR_DECLINE , inventory_offer); |
195 | } | 195 | } |
196 | return; | 196 | return; |
197 | } | 197 | } |
@@ -203,7 +203,7 @@ void LLFloaterGroupInfo::showNotice(const char* subject, | |||
203 | // We need to clean up that inventory offer. | 203 | // We need to clean up that inventory offer. |
204 | if (inventory_offer) | 204 | if (inventory_offer) |
205 | { | 205 | { |
206 | inventory_offer_callback( 1 , inventory_offer); | 206 | inventory_offer_callback( IOR_DECLINE , inventory_offer); |
207 | } | 207 | } |
208 | return; | 208 | return; |
209 | } | 209 | } |
diff --git a/linden/indra/newview/llfloaterhtml.cpp b/linden/indra/newview/llfloaterhtml.cpp index 519a031..0c5bdcd 100644 --- a/linden/indra/newview/llfloaterhtml.cpp +++ b/linden/indra/newview/llfloaterhtml.cpp | |||
@@ -49,8 +49,12 @@ LLFloaterHtml* LLFloaterHtml::getInstance() | |||
49 | //////////////////////////////////////////////////////////////////////////////// | 49 | //////////////////////////////////////////////////////////////////////////////// |
50 | // | 50 | // |
51 | LLFloaterHtml::LLFloaterHtml() | 51 | LLFloaterHtml::LLFloaterHtml() |
52 | : LLFloater( "HTML Floater" ), | 52 | : LLFloater( "HTML Floater" ) |
53 | |||
54 | #if LL_LIBXUL_ENABLED | ||
55 | , | ||
53 | mWebBrowser( 0 ) | 56 | mWebBrowser( 0 ) |
57 | #endif // LL_LIBXUL_ENABLED | ||
54 | { | 58 | { |
55 | // create floater from its XML definition | 59 | // create floater from its XML definition |
56 | gUICtrlFactory->buildFloater( this, "floater_html.xml" ); | 60 | gUICtrlFactory->buildFloater( this, "floater_html.xml" ); |
@@ -60,6 +64,7 @@ LLFloaterHtml::LLFloaterHtml() | |||
60 | reshape( rect.getWidth(), rect.getHeight(), FALSE ); | 64 | reshape( rect.getWidth(), rect.getHeight(), FALSE ); |
61 | setRect( rect ); | 65 | setRect( rect ); |
62 | 66 | ||
67 | #if LL_LIBXUL_ENABLED | ||
63 | mWebBrowser = LLViewerUICtrlFactory::getWebBrowserByName(this, "html_floater_browser" ); | 68 | mWebBrowser = LLViewerUICtrlFactory::getWebBrowserByName(this, "html_floater_browser" ); |
64 | if ( mWebBrowser ) | 69 | if ( mWebBrowser ) |
65 | { | 70 | { |
@@ -72,7 +77,8 @@ LLFloaterHtml::LLFloaterHtml() | |||
72 | // don't automatically open secondlife links since we want to catch | 77 | // don't automatically open secondlife links since we want to catch |
73 | // special ones that do other stuff (like open F1 Help) | 78 | // special ones that do other stuff (like open F1 Help) |
74 | mWebBrowser->setOpenSecondLifeLinksInMap( false ); | 79 | mWebBrowser->setOpenSecondLifeLinksInMap( false ); |
75 | }; | 80 | } |
81 | #endif // LL_LIBXUL_ENABLED | ||
76 | 82 | ||
77 | childSetAction("close_btn", onClickClose, this); | 83 | childSetAction("close_btn", onClickClose, this); |
78 | setDefaultBtn("close_btn"); | 84 | setDefaultBtn("close_btn"); |
@@ -82,9 +88,11 @@ LLFloaterHtml::LLFloaterHtml() | |||
82 | // | 88 | // |
83 | LLFloaterHtml::~LLFloaterHtml() | 89 | LLFloaterHtml::~LLFloaterHtml() |
84 | { | 90 | { |
91 | #if LL_LIBXUL_ENABLED | ||
85 | // stop observing browser events | 92 | // stop observing browser events |
86 | if ( mWebBrowser ) | 93 | if ( mWebBrowser ) |
87 | mWebBrowser->remObserver( this ); | 94 | mWebBrowser->remObserver( this ); |
95 | #endif // LL_LIBXUL_ENABLED | ||
88 | 96 | ||
89 | // save position of floater | 97 | // save position of floater |
90 | gSavedSettings.setRect( "HtmlFloaterRect", mRect ); | 98 | gSavedSettings.setRect( "HtmlFloaterRect", mRect ); |
@@ -103,9 +111,11 @@ void LLFloaterHtml::show( LLString content_id ) | |||
103 | // set the title | 111 | // set the title |
104 | setTitle( childGetValue( title_str ).asString() ); | 112 | setTitle( childGetValue( title_str ).asString() ); |
105 | 113 | ||
114 | #if LL_LIBXUL_ENABLED | ||
106 | // navigate to the URL | 115 | // navigate to the URL |
107 | if ( mWebBrowser ) | 116 | if ( mWebBrowser ) |
108 | mWebBrowser->navigateTo( childGetValue( url_str ).asString() ); | 117 | mWebBrowser->navigateTo( childGetValue( url_str ).asString() ); |
118 | #endif // LL_LIBXUL_ENABLED | ||
109 | 119 | ||
110 | // make floater appear | 120 | // make floater appear |
111 | setVisibleAndFrontmost(); | 121 | setVisibleAndFrontmost(); |
@@ -131,6 +141,7 @@ void LLFloaterHtml::onClickClose( void* data ) | |||
131 | // | 141 | // |
132 | void LLFloaterHtml::onClickLinkSecondLife( const EventType& eventIn ) | 142 | void LLFloaterHtml::onClickLinkSecondLife( const EventType& eventIn ) |
133 | { | 143 | { |
144 | #if LL_LIBXUL_ENABLED | ||
134 | const std::string protocol( "secondlife://app." ); | 145 | const std::string protocol( "secondlife://app." ); |
135 | 146 | ||
136 | // special 'app' secondlife link (using a different protocol - one that isn't registered in the browser) causes bad | 147 | // special 'app' secondlife link (using a different protocol - one that isn't registered in the browser) causes bad |
@@ -144,11 +155,12 @@ void LLFloaterHtml::onClickLinkSecondLife( const EventType& eventIn ) | |||
144 | if ( LLString::compareInsensitive( cmd.c_str() , "floater.html.help" ) == 0 ) | 155 | if ( LLString::compareInsensitive( cmd.c_str() , "floater.html.help" ) == 0 ) |
145 | { | 156 | { |
146 | gViewerHtmlHelp.show(); | 157 | gViewerHtmlHelp.show(); |
147 | }; | 158 | } |
148 | } | 159 | } |
149 | else | 160 | else |
150 | // regular secondlife link - just open the map as normal | 161 | // regular secondlife link - just open the map as normal |
151 | { | 162 | { |
152 | mWebBrowser->openMapAtlocation( eventIn.getStringValue() ); | 163 | mWebBrowser->openMapAtlocation( eventIn.getStringValue() ); |
153 | }; | 164 | } |
154 | }; \ No newline at end of file | 165 | #endif // LL_LIBXUL_ENABLED |
166 | }; | ||
diff --git a/linden/indra/newview/llfloaterhtml.h b/linden/indra/newview/llfloaterhtml.h index 9a09baf..fef57d0 100644 --- a/linden/indra/newview/llfloaterhtml.h +++ b/linden/indra/newview/llfloaterhtml.h | |||
@@ -51,9 +51,11 @@ class LLFloaterHtml : | |||
51 | 51 | ||
52 | private: | 52 | private: |
53 | LLFloaterHtml(); | 53 | LLFloaterHtml(); |
54 | #if LL_LIBXUL_ENABLED | ||
54 | LLWebBrowserCtrl* mWebBrowser; | 55 | LLWebBrowserCtrl* mWebBrowser; |
56 | #endif // LL_LIBXUL_ENABLED | ||
55 | static LLFloaterHtml* sInstance; | 57 | static LLFloaterHtml* sInstance; |
56 | LLButton* mCloseButton; | 58 | LLButton* mCloseButton; |
57 | }; | 59 | }; |
58 | 60 | ||
59 | #endif \ No newline at end of file | 61 | #endif |
diff --git a/linden/indra/newview/llfloaterimport.cpp b/linden/indra/newview/llfloaterimport.cpp index 72cf2e0..ed71c1b 100644 --- a/linden/indra/newview/llfloaterimport.cpp +++ b/linden/indra/newview/llfloaterimport.cpp | |||
@@ -44,12 +44,13 @@ | |||
44 | #include "llface.h" | 44 | #include "llface.h" |
45 | #include "llinventorymodel.h" | 45 | #include "llinventorymodel.h" |
46 | #include "lllineeditor.h" | 46 | #include "lllineeditor.h" |
47 | #include "llresourcedata.h" | ||
47 | #include "lltextbox.h" | 48 | #include "lltextbox.h" |
48 | #include "lltoolmgr.h" | 49 | #include "lltoolmgr.h" |
49 | #include "llui.h" | 50 | #include "llui.h" |
50 | #include "lluploaddialog.h" | 51 | #include "lluploaddialog.h" |
51 | #include "llviewercamera.h" | 52 | #include "llviewercamera.h" |
52 | #include "llviewermenu.h" | 53 | #include "llviewermenufile.h" // upload_new_resource() |
53 | #include "llviewerwindow.h" | 54 | #include "llviewerwindow.h" |
54 | #include "llvoavatar.h" | 55 | #include "llvoavatar.h" |
55 | #include "pipeline.h" | 56 | #include "pipeline.h" |
@@ -264,9 +265,8 @@ BOOL LLFloaterImport::postBuild() | |||
264 | FILE* fCheck = LLFile::fopen(image_path.c_str(), "rb"); /*Flawfinder: ignore*/ | 265 | FILE* fCheck = LLFile::fopen(image_path.c_str(), "rb"); /*Flawfinder: ignore*/ |
265 | if (fCheck) | 266 | if (fCheck) |
266 | { | 267 | { |
267 | LLMD5 my_md5_hash(fCheck); | 268 | LLMD5 my_md5_hash(fCheck); // this fclose()s fCheck too |
268 | my_md5_hash.hex_digest(md5_hash_string); | 269 | my_md5_hash.hex_digest(md5_hash_string); |
269 | fclose(fCheck); | ||
270 | 270 | ||
271 | llinfos << "hash: " << md5_hash_string << llendl; | 271 | llinfos << "hash: " << md5_hash_string << llendl; |
272 | } | 272 | } |
@@ -474,7 +474,7 @@ void LLFloaterImport::finishImport(ImportAssetInfo *info) | |||
474 | char *buffer = new char[length]; | 474 | char *buffer = new char[length]; |
475 | ll_apr_file_read(fIn, buffer, length); | 475 | ll_apr_file_read(fIn, buffer, length); |
476 | ll_apr_file_write(fOut, buffer, length); | 476 | ll_apr_file_write(fOut, buffer, length); |
477 | delete buffer; | 477 | delete[] buffer; |
478 | generated_file = true; | 478 | generated_file = true; |
479 | apr_file_close(fOut); | 479 | apr_file_close(fOut); |
480 | } | 480 | } |
diff --git a/linden/indra/newview/llfloaterinspect.cpp b/linden/indra/newview/llfloaterinspect.cpp index 1548c0e..80da7b6 100644 --- a/linden/indra/newview/llfloaterinspect.cpp +++ b/linden/indra/newview/llfloaterinspect.cpp | |||
@@ -64,42 +64,54 @@ void LLFloaterInspect::show(void* ignored) | |||
64 | void LLFloaterInspect::onClickCreatorProfile(void* ctrl) | 64 | void LLFloaterInspect::onClickCreatorProfile(void* ctrl) |
65 | { | 65 | { |
66 | if(sInstance->mObjectList->getAllSelected().size() == 0) return; | 66 | if(sInstance->mObjectList->getAllSelected().size() == 0) return; |
67 | LLSelectNode* obj = sInstance->mObjectSelection->getFirstNode(); | 67 | LLScrollListItem* first_selected = |
68 | LLUUID obj_id, creator_id; | 68 | sInstance->mObjectList->getFirstSelected(); |
69 | obj_id = sInstance->mObjectList->getFirstSelected()->getUUID(); | 69 | |
70 | while(obj) | 70 | if (first_selected) |
71 | { | 71 | { |
72 | if(obj_id == obj->getObject()->getID()) | 72 | LLSelectNode* obj= sInstance->mObjectSelection->getFirstNode(); |
73 | LLUUID obj_id, creator_id; | ||
74 | obj_id = first_selected->getUUID(); | ||
75 | while(obj) | ||
73 | { | 76 | { |
74 | creator_id = obj->mPermissions->getCreator(); | 77 | if(obj_id == obj->getObject()->getID()) |
75 | break; | 78 | { |
79 | creator_id = obj->mPermissions->getCreator(); | ||
80 | break; | ||
81 | } | ||
82 | obj = sInstance->mObjectSelection->getNextNode(); | ||
83 | } | ||
84 | if(obj) | ||
85 | { | ||
86 | LLFloaterAvatarInfo::showFromDirectory(creator_id); | ||
76 | } | 87 | } |
77 | obj = sInstance->mObjectSelection->getNextNode(); | ||
78 | } | ||
79 | if(obj) | ||
80 | { | ||
81 | LLFloaterAvatarInfo::showFromDirectory(creator_id); | ||
82 | } | 88 | } |
83 | } | 89 | } |
84 | 90 | ||
85 | void LLFloaterInspect::onClickOwnerProfile(void* ctrl) | 91 | void LLFloaterInspect::onClickOwnerProfile(void* ctrl) |
86 | { | 92 | { |
87 | if(sInstance->mObjectList->getAllSelected().size() == 0) return; | 93 | if(sInstance->mObjectList->getAllSelected().size() == 0) return; |
88 | LLSelectNode* obj = sInstance->mObjectSelection->getFirstNode(); | 94 | LLScrollListItem* first_selected = |
89 | LLUUID obj_id, owner_id; | 95 | sInstance->mObjectList->getFirstSelected(); |
90 | obj_id = sInstance->mObjectList->getFirstSelected()->getUUID(); | 96 | |
91 | while(obj) | 97 | if (first_selected) |
92 | { | 98 | { |
93 | if(obj_id == obj->getObject()->getID()) | 99 | LLSelectNode* obj= sInstance->mObjectSelection->getFirstNode(); |
100 | LLUUID obj_id, owner_id; | ||
101 | obj_id = first_selected->getUUID(); | ||
102 | while(obj) | ||
94 | { | 103 | { |
95 | owner_id = obj->mPermissions->getOwner(); | 104 | if(obj_id == obj->getObject()->getID()) |
96 | break; | 105 | { |
106 | owner_id = obj->mPermissions->getOwner(); | ||
107 | break; | ||
108 | } | ||
109 | obj = sInstance->mObjectSelection->getNextNode(); | ||
110 | } | ||
111 | if(obj) | ||
112 | { | ||
113 | LLFloaterAvatarInfo::showFromDirectory(owner_id); | ||
97 | } | 114 | } |
98 | obj = sInstance->mObjectSelection->getNextNode(); | ||
99 | } | ||
100 | if(obj) | ||
101 | { | ||
102 | LLFloaterAvatarInfo::showFromDirectory(owner_id); | ||
103 | } | 115 | } |
104 | } | 116 | } |
105 | 117 | ||
@@ -125,7 +137,15 @@ LLUUID LLFloaterInspect::getSelectedUUID() | |||
125 | { | 137 | { |
126 | if(sInstance) | 138 | if(sInstance) |
127 | { | 139 | { |
128 | if(sInstance->mObjectList->getAllSelected().size() > 0) return sInstance->mObjectList->getFirstSelected()->getUUID(); | 140 | if(sInstance->mObjectList->getAllSelected().size() > 0) |
141 | { | ||
142 | LLScrollListItem* first_selected = | ||
143 | sInstance->mObjectList->getFirstSelected(); | ||
144 | if (first_selected) | ||
145 | { | ||
146 | return first_selected->getUUID(); | ||
147 | } | ||
148 | } | ||
129 | } | 149 | } |
130 | return LLUUID::null; | 150 | return LLUUID::null; |
131 | } | 151 | } |
@@ -139,7 +159,15 @@ void LLFloaterInspect::refresh() | |||
139 | childSetEnabled("button creator", false); | 159 | childSetEnabled("button creator", false); |
140 | LLUUID selected_uuid; | 160 | LLUUID selected_uuid; |
141 | S32 selected_index = mObjectList->getFirstSelectedIndex(); | 161 | S32 selected_index = mObjectList->getFirstSelectedIndex(); |
142 | if(selected_index > -1) selected_uuid = mObjectList->getFirstSelected()->getUUID(); | 162 | if(selected_index > -1) |
163 | { | ||
164 | LLScrollListItem* first_selected = | ||
165 | mObjectList->getFirstSelected(); | ||
166 | if (first_selected) | ||
167 | { | ||
168 | selected_uuid = first_selected->getUUID(); | ||
169 | } | ||
170 | } | ||
143 | mObjectList->operateOnAll(LLScrollListCtrl::OP_DELETE); | 171 | mObjectList->operateOnAll(LLScrollListCtrl::OP_DELETE); |
144 | //List all transient objects, then all linked objects | 172 | //List all transient objects, then all linked objects |
145 | LLSelectNode* obj = mObjectSelection->getFirstNode(); | 173 | LLSelectNode* obj = mObjectSelection->getFirstNode(); |
diff --git a/linden/indra/newview/llfloaterland.cpp b/linden/indra/newview/llfloaterland.cpp index 9ff44f4..82b50ec 100644 --- a/linden/indra/newview/llfloaterland.cpp +++ b/linden/indra/newview/llfloaterland.cpp | |||
@@ -1996,12 +1996,18 @@ BOOL LLPanelLandOptions::postBuild() | |||
1996 | 1996 | ||
1997 | 1997 | ||
1998 | mSnapshotCtrl = LLUICtrlFactory::getTexturePickerByName(this, "snapshot_ctrl"); | 1998 | mSnapshotCtrl = LLUICtrlFactory::getTexturePickerByName(this, "snapshot_ctrl"); |
1999 | mSnapshotCtrl->setCommitCallback( onCommitAny ); | 1999 | if (mSnapshotCtrl) |
2000 | mSnapshotCtrl->setCallbackUserData( this ); | 2000 | { |
2001 | mSnapshotCtrl->setAllowNoTexture ( TRUE ); | 2001 | mSnapshotCtrl->setCommitCallback( onCommitAny ); |
2002 | mSnapshotCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER); | 2002 | mSnapshotCtrl->setCallbackUserData( this ); |
2003 | mSnapshotCtrl->setNonImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER); | 2003 | mSnapshotCtrl->setAllowNoTexture ( TRUE ); |
2004 | 2004 | mSnapshotCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER); | |
2005 | mSnapshotCtrl->setNonImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER); | ||
2006 | } | ||
2007 | else | ||
2008 | { | ||
2009 | llwarns << "LLUICtrlFactory::getTexturePickerByName() returned NULL for 'snapshot_ctrl'" << llendl; | ||
2010 | } | ||
2005 | 2011 | ||
2006 | 2012 | ||
2007 | mLocationText = LLUICtrlFactory::getTextBoxByName(this, "Landing Point: (none)"); | 2013 | mLocationText = LLUICtrlFactory::getTextBoxByName(this, "Landing Point: (none)"); |
@@ -2333,12 +2339,19 @@ BOOL LLPanelLandMedia::postBuild() | |||
2333 | 2339 | ||
2334 | 2340 | ||
2335 | mMediaTextureCtrl = LLUICtrlFactory::getTexturePickerByName(this, "media texture"); | 2341 | mMediaTextureCtrl = LLUICtrlFactory::getTexturePickerByName(this, "media texture"); |
2336 | mMediaTextureCtrl->setCommitCallback( onCommitAny ); | 2342 | if (mMediaTextureCtrl) |
2337 | mMediaTextureCtrl->setCallbackUserData( this ); | 2343 | { |
2338 | mMediaTextureCtrl->setAllowNoTexture ( TRUE ); | 2344 | mMediaTextureCtrl->setCommitCallback( onCommitAny ); |
2339 | mMediaTextureCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER); | 2345 | mMediaTextureCtrl->setCallbackUserData( this ); |
2340 | mMediaTextureCtrl->setNonImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER); | 2346 | mMediaTextureCtrl->setAllowNoTexture ( TRUE ); |
2341 | 2347 | mMediaTextureCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER); | |
2348 | mMediaTextureCtrl->setNonImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER); | ||
2349 | } | ||
2350 | else | ||
2351 | { | ||
2352 | llwarns << "LLUICtrlFactory::getTexturePickerByName() returned NULL for 'media texure'" << llendl; | ||
2353 | } | ||
2354 | |||
2342 | mMediaAutoScaleCheck = LLUICtrlFactory::getCheckBoxByName(this, "media_auto_scale"); | 2355 | mMediaAutoScaleCheck = LLUICtrlFactory::getCheckBoxByName(this, "media_auto_scale"); |
2343 | childSetCommitCallback("media_auto_scale", onCommitAny, this); | 2356 | childSetCommitCallback("media_auto_scale", onCommitAny, this); |
2344 | 2357 | ||
diff --git a/linden/indra/newview/llfloaternamedesc.cpp b/linden/indra/newview/llfloaternamedesc.cpp index f5ef7dc..5f41b13 100644 --- a/linden/indra/newview/llfloaternamedesc.cpp +++ b/linden/indra/newview/llfloaternamedesc.cpp | |||
@@ -29,6 +29,8 @@ | |||
29 | #include "llviewerprecompiledheaders.h" | 29 | #include "llviewerprecompiledheaders.h" |
30 | 30 | ||
31 | #include "llfloaternamedesc.h" | 31 | #include "llfloaternamedesc.h" |
32 | |||
33 | // project includes | ||
32 | #include "lllineeditor.h" | 34 | #include "lllineeditor.h" |
33 | #include "llresmgr.h" | 35 | #include "llresmgr.h" |
34 | #include "lltextbox.h" | 36 | #include "lltextbox.h" |
@@ -36,13 +38,16 @@ | |||
36 | #include "llviewerwindow.h" | 38 | #include "llviewerwindow.h" |
37 | #include "llfocusmgr.h" | 39 | #include "llfocusmgr.h" |
38 | #include "llradiogroup.h" | 40 | #include "llradiogroup.h" |
39 | #include "llassetstorage.h" | ||
40 | #include "lldbstrings.h" | 41 | #include "lldbstrings.h" |
41 | #include "lldir.h" | 42 | #include "lldir.h" |
42 | #include "llviewercontrol.h" | 43 | #include "llviewercontrol.h" |
43 | #include "llviewermenu.h" | 44 | #include "llviewermenufile.h" // upload_new_resource() |
44 | #include "llvieweruictrlfactory.h" | 45 | #include "llvieweruictrlfactory.h" |
45 | 46 | ||
47 | // linden includes | ||
48 | #include "llassetstorage.h" | ||
49 | #include "llinventorytype.h" | ||
50 | |||
46 | const S32 PREVIEW_LINE_HEIGHT = 19; | 51 | const S32 PREVIEW_LINE_HEIGHT = 19; |
47 | const S32 PREVIEW_CLOSE_BOX_SIZE = 16; | 52 | const S32 PREVIEW_CLOSE_BOX_SIZE = 16; |
48 | const S32 PREVIEW_BORDER_WIDTH = 2; | 53 | const S32 PREVIEW_BORDER_WIDTH = 2; |
diff --git a/linden/indra/newview/llfloaternewim.cpp b/linden/indra/newview/llfloaternewim.cpp index 2fa2b51..1adb37c 100644 --- a/linden/indra/newview/llfloaternewim.cpp +++ b/linden/indra/newview/llfloaternewim.cpp | |||
@@ -74,8 +74,15 @@ BOOL LLFloaterNewIM::postBuild() | |||
74 | childSetAction("start_btn", &LLFloaterNewIM::onStart, this); | 74 | childSetAction("start_btn", &LLFloaterNewIM::onStart, this); |
75 | childSetAction("close_btn", &LLFloaterNewIM::onClickClose, this); | 75 | childSetAction("close_btn", &LLFloaterNewIM::onClickClose, this); |
76 | mSelectionList = LLViewerUICtrlFactory::getNameListByName(this, "user_list"); | 76 | mSelectionList = LLViewerUICtrlFactory::getNameListByName(this, "user_list"); |
77 | mSelectionList->setDoubleClickCallback(&LLFloaterNewIM::onStart); | 77 | if (mSelectionList) |
78 | mSelectionList->setCallbackUserData(this); | 78 | { |
79 | mSelectionList->setDoubleClickCallback(&LLFloaterNewIM::onStart); | ||
80 | mSelectionList->setCallbackUserData(this); | ||
81 | } | ||
82 | else | ||
83 | { | ||
84 | llwarns << "LLViewerUICtrlFactory::getNameListByName() returned NULL for 'user_list'" << llendl; | ||
85 | } | ||
79 | sOnlineDescriptor = childGetValue("online_descriptor").asString(); | 86 | sOnlineDescriptor = childGetValue("online_descriptor").asString(); |
80 | sNameFormat = childGetValue("name_format").asString(); | 87 | sNameFormat = childGetValue("name_format").asString(); |
81 | setDefaultBtn("start_btn"); | 88 | setDefaultBtn("start_btn"); |
diff --git a/linden/indra/newview/llfloaterpreference.cpp b/linden/indra/newview/llfloaterpreference.cpp index dceadf9..963c268 100644 --- a/linden/indra/newview/llfloaterpreference.cpp +++ b/linden/indra/newview/llfloaterpreference.cpp | |||
@@ -156,6 +156,66 @@ LLPreferenceCore::LLPreferenceCore(LLTabContainerCommon* tab_container, LLButton | |||
156 | // addTabPanel(mWebPanel, "Web", FALSE, onTabChanged, this); | 156 | // addTabPanel(mWebPanel, "Web", FALSE, onTabChanged, this); |
157 | } | 157 | } |
158 | 158 | ||
159 | LLPreferenceCore::~LLPreferenceCore() | ||
160 | { | ||
161 | if (mGeneralPanel) | ||
162 | { | ||
163 | delete mGeneralPanel; | ||
164 | mGeneralPanel = NULL; | ||
165 | } | ||
166 | if (mInputPanel) | ||
167 | { | ||
168 | delete mInputPanel; | ||
169 | mInputPanel = NULL; | ||
170 | } | ||
171 | if (mNetworkPanel) | ||
172 | { | ||
173 | delete mNetworkPanel; | ||
174 | mNetworkPanel = NULL; | ||
175 | } | ||
176 | if (mDisplayPanel) | ||
177 | { | ||
178 | delete mDisplayPanel; | ||
179 | mDisplayPanel = NULL; | ||
180 | } | ||
181 | if (mDisplayPanel2) | ||
182 | { | ||
183 | delete mDisplayPanel2; | ||
184 | mDisplayPanel2 = NULL; | ||
185 | } | ||
186 | if (mDisplayPanel3) | ||
187 | { | ||
188 | delete mDisplayPanel3; | ||
189 | mDisplayPanel3 = NULL; | ||
190 | } | ||
191 | if (mAudioPanel) | ||
192 | { | ||
193 | delete mAudioPanel; | ||
194 | mAudioPanel = NULL; | ||
195 | } | ||
196 | if (mPrefsChat) | ||
197 | { | ||
198 | delete mPrefsChat; | ||
199 | mPrefsChat = NULL; | ||
200 | } | ||
201 | if (mPrefsIM) | ||
202 | { | ||
203 | delete mPrefsIM; | ||
204 | mPrefsIM = NULL; | ||
205 | } | ||
206 | if (mMsgPanel) | ||
207 | { | ||
208 | delete mMsgPanel; | ||
209 | mMsgPanel = NULL; | ||
210 | } | ||
211 | //if (mWebPanel) | ||
212 | //{ | ||
213 | // delete mWebPanel; | ||
214 | // mWebPanel = NULL; | ||
215 | //} | ||
216 | } | ||
217 | |||
218 | |||
159 | void LLPreferenceCore::apply() | 219 | void LLPreferenceCore::apply() |
160 | { | 220 | { |
161 | mGeneralPanel->apply(); | 221 | mGeneralPanel->apply(); |
diff --git a/linden/indra/newview/llfloaterpreference.h b/linden/indra/newview/llfloaterpreference.h index dcef6a0..7a6789f 100644 --- a/linden/indra/newview/llfloaterpreference.h +++ b/linden/indra/newview/llfloaterpreference.h | |||
@@ -58,6 +58,7 @@ class LLPreferenceCore | |||
58 | 58 | ||
59 | public: | 59 | public: |
60 | LLPreferenceCore(LLTabContainerCommon* tab_container, LLButton * default_btn); | 60 | LLPreferenceCore(LLTabContainerCommon* tab_container, LLButton * default_btn); |
61 | ~LLPreferenceCore(); | ||
61 | 62 | ||
62 | void apply(); | 63 | void apply(); |
63 | void cancel(); | 64 | void cancel(); |
diff --git a/linden/indra/newview/llfloaterregioninfo.cpp b/linden/indra/newview/llfloaterregioninfo.cpp index 7fa5f6a..682fda8 100644 --- a/linden/indra/newview/llfloaterregioninfo.cpp +++ b/linden/indra/newview/llfloaterregioninfo.cpp | |||
@@ -74,7 +74,6 @@ | |||
74 | const S32 TERRAIN_TEXTURE_COUNT = 4; | 74 | const S32 TERRAIN_TEXTURE_COUNT = 4; |
75 | const S32 CORNER_COUNT = 4; | 75 | const S32 CORNER_COUNT = 4; |
76 | 76 | ||
77 | #define LL_ENABLE_MAINLAND_VISIBLE_CONTROL 0 | ||
78 | 77 | ||
79 | ///---------------------------------------------------------------------------- | 78 | ///---------------------------------------------------------------------------- |
80 | /// Local class declaration | 79 | /// Local class declaration |
@@ -1920,9 +1919,6 @@ BOOL LLPanelEstateInfo::postBuild() | |||
1920 | { | 1919 | { |
1921 | // set up the callbacks for the generic controls | 1920 | // set up the callbacks for the generic controls |
1922 | initCtrl("externally_visible_check"); | 1921 | initCtrl("externally_visible_check"); |
1923 | #if LL_ENABLE_MAINLAND_VISIBLE_CONTROL | ||
1924 | initCtrl("mainland_visible_check"); | ||
1925 | #endif | ||
1926 | initCtrl("use_global_time_check"); | 1922 | initCtrl("use_global_time_check"); |
1927 | initCtrl("fixed_sun_check"); | 1923 | initCtrl("fixed_sun_check"); |
1928 | initCtrl("allow_direct_teleport"); | 1924 | initCtrl("allow_direct_teleport"); |
@@ -1934,9 +1930,6 @@ BOOL LLPanelEstateInfo::postBuild() | |||
1934 | initHelpBtn("use_global_time_help", "HelpEstateUseGlobalTime"); | 1930 | initHelpBtn("use_global_time_help", "HelpEstateUseGlobalTime"); |
1935 | initHelpBtn("fixed_sun_help", "HelpEstateFixedSun"); | 1931 | initHelpBtn("fixed_sun_help", "HelpEstateFixedSun"); |
1936 | initHelpBtn("externally_visible_help", "HelpEstateExternallyVisible"); | 1932 | initHelpBtn("externally_visible_help", "HelpEstateExternallyVisible"); |
1937 | #if LL_ENABLE_MAINLAND_VISIBLE_CONTROL | ||
1938 | initHelpBtn("mainland_visible_help", "HelpEstateMainlandVisible"); | ||
1939 | #endif | ||
1940 | initHelpBtn("allow_direct_teleport_help", "HelpEstateAllowDirectTeleport"); | 1933 | initHelpBtn("allow_direct_teleport_help", "HelpEstateAllowDirectTeleport"); |
1941 | initHelpBtn("allow_resident_help", "HelpEstateAllowResident"); | 1934 | initHelpBtn("allow_resident_help", "HelpEstateAllowResident"); |
1942 | initHelpBtn("allow_group_help", "HelpEstateAllowGroup"); | 1935 | initHelpBtn("allow_group_help", "HelpEstateAllowGroup"); |
@@ -2105,9 +2098,6 @@ void LLPanelEstateInfo::commitEstateInfo() | |||
2105 | void LLPanelEstateInfo::setEstateFlags(U32 flags) | 2098 | void LLPanelEstateInfo::setEstateFlags(U32 flags) |
2106 | { | 2099 | { |
2107 | childSetValue("externally_visible_check", LLSD(flags & REGION_FLAGS_EXTERNALLY_VISIBLE ? TRUE : FALSE) ); | 2100 | childSetValue("externally_visible_check", LLSD(flags & REGION_FLAGS_EXTERNALLY_VISIBLE ? TRUE : FALSE) ); |
2108 | #if LL_ENABLE_MAINLAND_VISIBLE_CONTROL | ||
2109 | childSetValue("mainland_visible_check", LLSD(flags & REGION_FLAGS_MAINLAND_VISIBLE ? TRUE : FALSE) ); | ||
2110 | #endif | ||
2111 | childSetValue("fixed_sun_check", LLSD(flags & REGION_FLAGS_SUN_FIXED ? TRUE : FALSE) ); | 2101 | childSetValue("fixed_sun_check", LLSD(flags & REGION_FLAGS_SUN_FIXED ? TRUE : FALSE) ); |
2112 | childSetValue("allow_direct_teleport", LLSD(flags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT ? TRUE : FALSE) ); | 2102 | childSetValue("allow_direct_teleport", LLSD(flags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT ? TRUE : FALSE) ); |
2113 | childSetValue("deny_anonymous", LLSD(flags & REGION_FLAGS_DENY_ANONYMOUS ? TRUE : FALSE) ); | 2103 | childSetValue("deny_anonymous", LLSD(flags & REGION_FLAGS_DENY_ANONYMOUS ? TRUE : FALSE) ); |
@@ -2124,15 +2114,6 @@ U32 LLPanelEstateInfo::computeEstateFlags() | |||
2124 | { | 2114 | { |
2125 | flags |= REGION_FLAGS_EXTERNALLY_VISIBLE; | 2115 | flags |= REGION_FLAGS_EXTERNALLY_VISIBLE; |
2126 | } | 2116 | } |
2127 | #if LL_ENABLE_MAINLAND_VISIBLE_CONTROL | ||
2128 | // This flag is ignored by everything. 2006-11-17 Phoenix. | ||
2129 | if (childGetValue("mainland_visible_check").asBoolean()) | ||
2130 | { | ||
2131 | flags |= REGION_FLAGS_MAINLAND_VISIBLE; | ||
2132 | } | ||
2133 | #else | ||
2134 | flags |= REGION_FLAGS_MAINLAND_VISIBLE; | ||
2135 | #endif | ||
2136 | 2117 | ||
2137 | if (childGetValue("allow_direct_teleport").asBoolean()) | 2118 | if (childGetValue("allow_direct_teleport").asBoolean()) |
2138 | { | 2119 | { |
diff --git a/linden/indra/newview/llfloaterreporter.cpp b/linden/indra/newview/llfloaterreporter.cpp index 2e44191..bcbab5b 100644 --- a/linden/indra/newview/llfloaterreporter.cpp +++ b/linden/indra/newview/llfloaterreporter.cpp | |||
@@ -66,10 +66,9 @@ | |||
66 | #include "lluploaddialog.h" | 66 | #include "lluploaddialog.h" |
67 | #include "llcallingcard.h" | 67 | #include "llcallingcard.h" |
68 | #include "llviewerobjectlist.h" | 68 | #include "llviewerobjectlist.h" |
69 | #include "llagent.h" | ||
70 | #include "lltoolobjpicker.h" | 69 | #include "lltoolobjpicker.h" |
71 | #include "lltoolmgr.h" | 70 | #include "lltoolmgr.h" |
72 | #include "llviewermenu.h" // for LLResourceData | 71 | #include "llresourcedata.h" // for LLResourceData |
73 | #include "llviewerwindow.h" | 72 | #include "llviewerwindow.h" |
74 | #include "llviewerimagelist.h" | 73 | #include "llviewerimagelist.h" |
75 | #include "llworldmap.h" | 74 | #include "llworldmap.h" |
@@ -965,8 +964,8 @@ void LLFloaterReporter::uploadDoneCallback(const LLUUID &uuid, void *user_data, | |||
965 | self->mScreenID = uuid; | 964 | self->mScreenID = uuid; |
966 | llinfos << "Got screen shot " << uuid << llendl; | 965 | llinfos << "Got screen shot " << uuid << llendl; |
967 | self->sendReportViaLegacy(self->gatherReport()); | 966 | self->sendReportViaLegacy(self->gatherReport()); |
967 | self->close(); | ||
968 | } | 968 | } |
969 | self->close(); | ||
970 | } | 969 | } |
971 | 970 | ||
972 | 971 | ||
diff --git a/linden/indra/newview/llfloatersellland.cpp b/linden/indra/newview/llfloatersellland.cpp index 49cb14e..49cb14e 100755..100644 --- a/linden/indra/newview/llfloatersellland.cpp +++ b/linden/indra/newview/llfloatersellland.cpp | |||
diff --git a/linden/indra/newview/llfloatersellland.h b/linden/indra/newview/llfloatersellland.h index 1f0af61..1f0af61 100755..100644 --- a/linden/indra/newview/llfloatersellland.h +++ b/linden/indra/newview/llfloatersellland.h | |||
diff --git a/linden/indra/newview/llfloatersnapshot.cpp b/linden/indra/newview/llfloatersnapshot.cpp index af58cd9..5008509 100644 --- a/linden/indra/newview/llfloatersnapshot.cpp +++ b/linden/indra/newview/llfloatersnapshot.cpp | |||
@@ -53,7 +53,7 @@ | |||
53 | #include "llviewerstats.h" | 53 | #include "llviewerstats.h" |
54 | #include "llviewercamera.h" | 54 | #include "llviewercamera.h" |
55 | #include "llviewerwindow.h" | 55 | #include "llviewerwindow.h" |
56 | #include "llviewermenu.h" | 56 | #include "llviewermenufile.h" // upload_new_resource() |
57 | #include "llfloaterpostcard.h" | 57 | #include "llfloaterpostcard.h" |
58 | #include "llcheckboxctrl.h" | 58 | #include "llcheckboxctrl.h" |
59 | #include "llradiogroup.h" | 59 | #include "llradiogroup.h" |
diff --git a/linden/indra/newview/llfloatertest.cpp b/linden/indra/newview/llfloatertest.cpp index 510072d..c5e353a 100644 --- a/linden/indra/newview/llfloatertest.cpp +++ b/linden/indra/newview/llfloatertest.cpp | |||
@@ -227,8 +227,7 @@ LLFloaterTestImpl::LLFloaterTestImpl() | |||
227 | combo = new LLComboBox("combo", | 227 | combo = new LLComboBox("combo", |
228 | LLRect(LEFT, y, LEFT+100, y-LLCOMBOBOX_HEIGHT), | 228 | LLRect(LEFT, y, LEFT+100, y-LLCOMBOBOX_HEIGHT), |
229 | "Combobox Label", | 229 | "Combobox Label", |
230 | onCommitCombo, this, | 230 | onCommitCombo, this); |
231 | 150); // list_width | ||
232 | combo->add("first item"); | 231 | combo->add("first item"); |
233 | combo->add("second item"); | 232 | combo->add("second item"); |
234 | combo->add("should go to the top", ADD_TOP); | 233 | combo->add("should go to the top", ADD_TOP); |
diff --git a/linden/indra/newview/llfloatertools.cpp b/linden/indra/newview/llfloatertools.cpp index 0480628..3931acb 100644 --- a/linden/indra/newview/llfloatertools.cpp +++ b/linden/indra/newview/llfloatertools.cpp | |||
@@ -314,8 +314,8 @@ BOOL LLFloaterTools::postBuild() | |||
314 | mTab->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT); | 314 | mTab->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT); |
315 | mTab->setVisible( gSavedSettings.getBOOL("ToolboxShowMore") ); | 315 | mTab->setVisible( gSavedSettings.getBOOL("ToolboxShowMore") ); |
316 | mTab->setBorderVisible(FALSE); | 316 | mTab->setBorderVisible(FALSE); |
317 | mTab->selectFirstTab(); | ||
317 | } | 318 | } |
318 | mTab->selectFirstTab(); | ||
319 | return TRUE; | 319 | return TRUE; |
320 | } | 320 | } |
321 | 321 | ||
diff --git a/linden/indra/newview/llfloatertos.cpp b/linden/indra/newview/llfloatertos.cpp index 6b38ca8..3ea8c49 100644 --- a/linden/indra/newview/llfloatertos.cpp +++ b/linden/indra/newview/llfloatertos.cpp | |||
@@ -182,7 +182,6 @@ BOOL LLFloaterTOS::postBuild() | |||
182 | childSetValue("tos_text", LLSD(mMessage)); | 182 | childSetValue("tos_text", LLSD(mMessage)); |
183 | #endif | 183 | #endif |
184 | 184 | ||
185 | |||
186 | return TRUE; | 185 | return TRUE; |
187 | } | 186 | } |
188 | 187 | ||
diff --git a/linden/indra/newview/llfolderview.cpp b/linden/indra/newview/llfolderview.cpp index 7bc9cd8..ff0ad3f 100644 --- a/linden/indra/newview/llfolderview.cpp +++ b/linden/indra/newview/llfolderview.cpp | |||
@@ -229,6 +229,16 @@ LLFolderViewItem* LLFolderViewItem::getPreviousOpenNode(BOOL include_children) | |||
229 | return itemp; | 229 | return itemp; |
230 | } | 230 | } |
231 | 231 | ||
232 | // is this item something we think we should be showing? | ||
233 | // for example, if we haven't gotten around to filtering it yet, then the answer is yes | ||
234 | // until we find out otherwise | ||
235 | BOOL LLFolderViewItem::potentiallyVisible() | ||
236 | { | ||
237 | // we haven't been checked against min required filter | ||
238 | // or we have and we passed | ||
239 | return getLastFilterGeneration() < getRoot()->getFilter()->getMinRequiredGeneration() || getFiltered(); | ||
240 | } | ||
241 | |||
232 | BOOL LLFolderViewItem::getFiltered() | 242 | BOOL LLFolderViewItem::getFiltered() |
233 | { | 243 | { |
234 | return mFiltered && mLastFilterGeneration >= mRoot->getFilter()->getMinRequiredGeneration(); | 244 | return mFiltered && mLastFilterGeneration >= mRoot->getFilter()->getMinRequiredGeneration(); |
@@ -335,8 +345,7 @@ void LLFolderViewItem::setSelectionFromRoot(LLFolderViewItem* selection, | |||
335 | } | 345 | } |
336 | 346 | ||
337 | // helper function to change the selection from the root. | 347 | // helper function to change the selection from the root. |
338 | void LLFolderViewItem::changeSelectionFromRoot(LLFolderViewItem* selection, | 348 | void LLFolderViewItem::changeSelectionFromRoot(LLFolderViewItem* selection, BOOL selected) |
339 | BOOL selected) | ||
340 | { | 349 | { |
341 | getRoot()->changeSelection(selection, selected); | 350 | getRoot()->changeSelection(selection, selected); |
342 | } | 351 | } |
@@ -358,6 +367,11 @@ LLString LLFolderViewItem::getWidgetTag() const | |||
358 | return LL_FOLDER_VIEW_ITEM_TAG; | 367 | return LL_FOLDER_VIEW_ITEM_TAG; |
359 | } | 368 | } |
360 | 369 | ||
370 | EInventorySortGroup LLFolderViewItem::getSortGroup() | ||
371 | { | ||
372 | return SG_ITEM; | ||
373 | } | ||
374 | |||
361 | // addToFolder() returns TRUE if it succeeds. FALSE otherwise | 375 | // addToFolder() returns TRUE if it succeeds. FALSE otherwise |
362 | BOOL LLFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* root) | 376 | BOOL LLFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* root) |
363 | { | 377 | { |
@@ -427,8 +441,7 @@ void LLFolderViewItem::dirtyFilter() | |||
427 | // means 'deselect' for a leaf item. Do this optimization after | 441 | // means 'deselect' for a leaf item. Do this optimization after |
428 | // multiple selection is implemented to make sure it all plays nice | 442 | // multiple selection is implemented to make sure it all plays nice |
429 | // together. | 443 | // together. |
430 | BOOL LLFolderViewItem::setSelection(LLFolderViewItem* selection, BOOL open, | 444 | BOOL LLFolderViewItem::setSelection(LLFolderViewItem* selection, BOOL open, BOOL take_keyboard_focus) |
431 | BOOL take_keyboard_focus) | ||
432 | { | 445 | { |
433 | if( selection == this ) | 446 | if( selection == this ) |
434 | { | 447 | { |
@@ -445,8 +458,7 @@ BOOL LLFolderViewItem::setSelection(LLFolderViewItem* selection, BOOL open, | |||
445 | return mIsSelected; | 458 | return mIsSelected; |
446 | } | 459 | } |
447 | 460 | ||
448 | BOOL LLFolderViewItem::changeSelection(LLFolderViewItem* selection, | 461 | BOOL LLFolderViewItem::changeSelection(LLFolderViewItem* selection, BOOL selected) |
449 | BOOL selected) | ||
450 | { | 462 | { |
451 | if(selection == this && mIsSelected != selected) | 463 | if(selection == this && mIsSelected != selected) |
452 | { | 464 | { |
@@ -788,182 +800,174 @@ BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, | |||
788 | 800 | ||
789 | void LLFolderViewItem::draw() | 801 | void LLFolderViewItem::draw() |
790 | { | 802 | { |
791 | if( getVisible() ) | 803 | bool possibly_has_children = false; |
804 | bool up_to_date = mListener && mListener->isUpToDate(); | ||
805 | if((up_to_date && hasVisibleChildren() ) || // we fetched our children and some of them have passed the filter... | ||
806 | (!up_to_date && mListener && mListener->hasChildren())) // ...or we know we have children but haven't fetched them (doesn't obey filter) | ||
792 | { | 807 | { |
793 | bool possibly_has_children = false; | 808 | possibly_has_children = true; |
794 | bool up_to_date = mListener && mListener->isUpToDate(); | 809 | } |
795 | if((up_to_date && hasVisibleChildren() ) || // we fetched our children and some of them have passed the filter... | 810 | if(/*mControlLabel[0] != '\0' && */possibly_has_children) |
796 | (!up_to_date && mListener && mListener->hasChildren())) // ...or we know we have children but haven't fetched them (doesn't obey filter) | 811 | { |
797 | { | 812 | LLGLSTexture gls_texture; |
798 | possibly_has_children = true; | 813 | if (mArrowImage) |
799 | } | ||
800 | if(/*mControlLabel[0] != '\0' && */possibly_has_children) | ||
801 | { | 814 | { |
802 | LLGLSTexture gls_texture; | 815 | gl_draw_scaled_rotated_image(mIndentation, mRect.getHeight() - ARROW_SIZE - TEXT_PAD, |
803 | if (mArrowImage) | 816 | ARROW_SIZE, ARROW_SIZE, mControlLabelRotation, mArrowImage, sFgColor); |
804 | { | ||
805 | gl_draw_scaled_rotated_image(mIndentation, mRect.getHeight() - ARROW_SIZE - TEXT_PAD, | ||
806 | ARROW_SIZE, ARROW_SIZE, mControlLabelRotation, mArrowImage, sFgColor); | ||
807 | } | ||
808 | } | 817 | } |
818 | } | ||
809 | 819 | ||
810 | F32 text_left = (F32)(ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mIndentation); | 820 | F32 text_left = (F32)(ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mIndentation); |
811 | 821 | ||
812 | // If we have keyboard focus, draw selection filled | 822 | // If we have keyboard focus, draw selection filled |
813 | BOOL show_context = getRoot()->getShowSelectionContext(); | 823 | BOOL show_context = getRoot()->getShowSelectionContext(); |
814 | BOOL filled = show_context || (gFocusMgr.getKeyboardFocus() == getRoot()); | 824 | BOOL filled = show_context || (gFocusMgr.getKeyboardFocus() == getRoot()); |
815 | 825 | ||
816 | // always render "current" item, only render other selected items if | 826 | // always render "current" item, only render other selected items if |
817 | // mShowSingleSelection is FALSE | 827 | // mShowSingleSelection is FALSE |
818 | if( mIsSelected ) | 828 | if( mIsSelected ) |
829 | { | ||
830 | LLGLSNoTexture gls_no_texture; | ||
831 | LLColor4 bg_color = sHighlightBgColor; | ||
832 | //const S32 TRAILING_PAD = 5; // It just looks better with this. | ||
833 | if (!mIsCurSelection) | ||
819 | { | 834 | { |
820 | LLGLSNoTexture gls_no_texture; | 835 | // do time-based fade of extra objects |
821 | LLColor4 bg_color = sHighlightBgColor; | 836 | F32 fade_time = getRoot()->getSelectionFadeElapsedTime(); |
822 | //const S32 TRAILING_PAD = 5; // It just looks better with this. | 837 | if (getRoot()->getShowSingleSelection()) |
823 | if (!mIsCurSelection) | ||
824 | { | 838 | { |
825 | // do time-based fade of extra objects | 839 | // fading out |
826 | F32 fade_time = getRoot()->getSelectionFadeElapsedTime(); | 840 | bg_color.mV[VALPHA] = clamp_rescale(fade_time, 0.f, 0.4f, bg_color.mV[VALPHA], 0.f); |
827 | if (getRoot()->getShowSingleSelection()) | ||
828 | { | ||
829 | // fading out | ||
830 | bg_color.mV[VALPHA] = clamp_rescale(fade_time, 0.f, 0.4f, bg_color.mV[VALPHA], 0.f); | ||
831 | } | ||
832 | else | ||
833 | { | ||
834 | // fading in | ||
835 | bg_color.mV[VALPHA] = clamp_rescale(fade_time, 0.f, 0.4f, 0.f, bg_color.mV[VALPHA]); | ||
836 | } | ||
837 | } | 841 | } |
842 | else | ||
843 | { | ||
844 | // fading in | ||
845 | bg_color.mV[VALPHA] = clamp_rescale(fade_time, 0.f, 0.4f, 0.f, bg_color.mV[VALPHA]); | ||
846 | } | ||
847 | } | ||
838 | 848 | ||
849 | gl_rect_2d( | ||
850 | 0, | ||
851 | mRect.getHeight(), | ||
852 | mRect.getWidth() - 2, | ||
853 | llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD), | ||
854 | bg_color, filled); | ||
855 | if (mIsCurSelection) | ||
856 | { | ||
839 | gl_rect_2d( | 857 | gl_rect_2d( |
840 | 0, | 858 | 0, |
841 | mRect.getHeight(), | 859 | mRect.getHeight(), |
842 | mRect.getWidth() - 2, | 860 | mRect.getWidth() - 2, |
843 | llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD), | 861 | llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD), |
844 | bg_color, filled); | 862 | sHighlightFgColor, FALSE); |
845 | if (mIsCurSelection) | ||
846 | { | ||
847 | gl_rect_2d( | ||
848 | 0, | ||
849 | mRect.getHeight(), | ||
850 | mRect.getWidth() - 2, | ||
851 | llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD), | ||
852 | sHighlightFgColor, FALSE); | ||
853 | } | ||
854 | if (mRect.getHeight() > llround(sFont->getLineHeight()) + ICON_PAD + 2) | ||
855 | { | ||
856 | gl_rect_2d( | ||
857 | 0, | ||
858 | llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD) - 2, | ||
859 | mRect.getWidth() - 2, | ||
860 | 2, | ||
861 | sHighlightFgColor, FALSE); | ||
862 | if (show_context) | ||
863 | { | ||
864 | gl_rect_2d( | ||
865 | 0, | ||
866 | llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD) - 2, | ||
867 | mRect.getWidth() - 2, | ||
868 | 2, | ||
869 | sHighlightBgColor, TRUE); | ||
870 | } | ||
871 | } | ||
872 | } | 863 | } |
873 | if (mDragAndDropTarget) | 864 | if (mRect.getHeight() > llround(sFont->getLineHeight()) + ICON_PAD + 2) |
874 | { | 865 | { |
875 | LLGLSNoTexture gls_no_texture; | ||
876 | gl_rect_2d( | 866 | gl_rect_2d( |
877 | 0, | 867 | 0, |
878 | mRect.getHeight(), | 868 | llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD) - 2, |
879 | mRect.getWidth() - 2, | 869 | mRect.getWidth() - 2, |
880 | llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD), | 870 | 2, |
881 | sHighlightBgColor, FALSE); | 871 | sHighlightFgColor, FALSE); |
882 | 872 | if (show_context) | |
883 | if (mRect.getHeight() > llround(sFont->getLineHeight()) + ICON_PAD + 2) | ||
884 | { | 873 | { |
885 | gl_rect_2d( | 874 | gl_rect_2d( |
886 | 0, | 875 | 0, |
887 | llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD) - 2, | 876 | llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD) - 2, |
888 | mRect.getWidth() - 2, | 877 | mRect.getWidth() - 2, |
889 | 2, | 878 | 2, |
890 | sHighlightBgColor, FALSE); | 879 | sHighlightBgColor, TRUE); |
891 | } | 880 | } |
892 | mDragAndDropTarget = FALSE; | ||
893 | } | 881 | } |
882 | } | ||
883 | if (mDragAndDropTarget) | ||
884 | { | ||
885 | LLGLSNoTexture gls_no_texture; | ||
886 | gl_rect_2d( | ||
887 | 0, | ||
888 | mRect.getHeight(), | ||
889 | mRect.getWidth() - 2, | ||
890 | llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD), | ||
891 | sHighlightBgColor, FALSE); | ||
894 | 892 | ||
895 | 893 | if (mRect.getHeight() > llround(sFont->getLineHeight()) + ICON_PAD + 2) | |
896 | if(mIcon) | ||
897 | { | 894 | { |
898 | gl_draw_image(mIndentation + ARROW_SIZE + TEXT_PAD, mRect.getHeight() - mIcon->getHeight(), mIcon); | 895 | gl_rect_2d( |
899 | mIcon->addTextureStats( (F32)(mIcon->getWidth() * mIcon->getHeight())); | 896 | 0, |
897 | llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD) - 2, | ||
898 | mRect.getWidth() - 2, | ||
899 | 2, | ||
900 | sHighlightBgColor, FALSE); | ||
900 | } | 901 | } |
902 | mDragAndDropTarget = FALSE; | ||
903 | } | ||
901 | 904 | ||
902 | if (!mLabel.empty()) | ||
903 | { | ||
904 | // highlight filtered text | ||
905 | BOOL debug_filters = getRoot()->getDebugFilters(); | ||
906 | LLColor4 color = ( (mIsSelected && filled) ? sHighlightFgColor : sFgColor ); | ||
907 | F32 right_x; | ||
908 | F32 y = (F32)mRect.getHeight() - sFont->getLineHeight() - (F32)TEXT_PAD; | ||
909 | 905 | ||
910 | if (debug_filters) | 906 | if(mIcon) |
911 | { | 907 | { |
912 | if (!getFiltered() && !possibly_has_children) | 908 | gl_draw_image(mIndentation + ARROW_SIZE + TEXT_PAD, mRect.getHeight() - mIcon->getHeight(), mIcon); |
913 | { | 909 | mIcon->addTextureStats( (F32)(mIcon->getWidth() * mIcon->getHeight())); |
914 | color.mV[VALPHA] *= 0.5f; | 910 | } |
915 | } | ||
916 | |||
917 | LLColor4 filter_color = mLastFilterGeneration >= getRoot()->getFilter()->getCurrentGeneration() ? LLColor4(0.5f, 0.8f, 0.5f, 1.f) : LLColor4(0.8f, 0.5f, 0.5f, 1.f); | ||
918 | sSmallFont->renderUTF8(mStatusText, 0, text_left, y, filter_color, | ||
919 | LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, | ||
920 | S32_MAX, S32_MAX, &right_x, FALSE ); | ||
921 | text_left = right_x; | ||
922 | } | ||
923 | 911 | ||
924 | sFont->renderUTF8( mLabel, 0, text_left, y, color, | 912 | if (!mLabel.empty()) |
925 | LLFontGL::LEFT, LLFontGL::BOTTOM, mLabelStyle, | 913 | { |
926 | S32_MAX, S32_MAX, &right_x, FALSE ); | 914 | // highlight filtered text |
927 | if (!mLabelSuffix.empty()) | 915 | BOOL debug_filters = getRoot()->getDebugFilters(); |
928 | { | 916 | LLColor4 color = ( (mIsSelected && filled) ? sHighlightFgColor : sFgColor ); |
929 | sFont->renderUTF8( mLabelSuffix, 0, right_x, y, LLColor4(0.75f, 0.85f, 0.85f, 1.f), | 917 | F32 right_x; |
930 | LLFontGL::LEFT, LLFontGL::BOTTOM, mLabelStyle, | 918 | F32 y = (F32)mRect.getHeight() - sFont->getLineHeight() - (F32)TEXT_PAD; |
931 | S32_MAX, S32_MAX, &right_x, FALSE ); | ||
932 | } | ||
933 | 919 | ||
934 | if (mBoxImage.notNull() && mStringMatchOffset != LLString::npos) | 920 | if (debug_filters) |
921 | { | ||
922 | if (!getFiltered() && !possibly_has_children) | ||
935 | { | 923 | { |
936 | // don't draw backgrounds for zero-length strings | 924 | color.mV[VALPHA] *= 0.5f; |
937 | S32 filter_string_length = mRoot->getFilterSubString().size(); | ||
938 | if (filter_string_length > 0) | ||
939 | { | ||
940 | LLString combined_string = mLabel + mLabelSuffix; | ||
941 | S32 left = llround(text_left) + sFont->getWidth(combined_string, 0, mStringMatchOffset) - 1; | ||
942 | S32 right = left + sFont->getWidth(combined_string, mStringMatchOffset, filter_string_length) + 2; | ||
943 | S32 bottom = llfloor(mRect.getHeight() - sFont->getLineHeight() - 3); | ||
944 | S32 top = mRect.getHeight(); | ||
945 | |||
946 | LLViewerImage::bindTexture(mBoxImage); | ||
947 | glColor4fv(sFilterBGColor.mV); | ||
948 | gl_segmented_rect_2d_tex(left, top, right, bottom, mBoxImage->getWidth(), mBoxImage->getHeight(), 16); | ||
949 | F32 match_string_left = text_left + sFont->getWidthF32(combined_string, 0, mStringMatchOffset); | ||
950 | F32 y = (F32)mRect.getHeight() - sFont->getLineHeight() - (F32)TEXT_PAD; | ||
951 | sFont->renderUTF8( combined_string, mStringMatchOffset, match_string_left, y, | ||
952 | sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, mLabelStyle, | ||
953 | filter_string_length, S32_MAX, &right_x, FALSE ); | ||
954 | } | ||
955 | } | 925 | } |
926 | |||
927 | LLColor4 filter_color = mLastFilterGeneration >= getRoot()->getFilter()->getCurrentGeneration() ? LLColor4(0.5f, 0.8f, 0.5f, 1.f) : LLColor4(0.8f, 0.5f, 0.5f, 1.f); | ||
928 | sSmallFont->renderUTF8(mStatusText, 0, text_left, y, filter_color, | ||
929 | LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, | ||
930 | S32_MAX, S32_MAX, &right_x, FALSE ); | ||
931 | text_left = right_x; | ||
956 | } | 932 | } |
957 | 933 | ||
958 | if( sDebugRects ) | 934 | sFont->renderUTF8( mLabel, 0, text_left, y, color, |
935 | LLFontGL::LEFT, LLFontGL::BOTTOM, mLabelStyle, | ||
936 | S32_MAX, S32_MAX, &right_x, FALSE ); | ||
937 | if (!mLabelSuffix.empty()) | ||
959 | { | 938 | { |
960 | drawDebugRect(); | 939 | sFont->renderUTF8( mLabelSuffix, 0, right_x, y, LLColor4(0.75f, 0.85f, 0.85f, 1.f), |
940 | LLFontGL::LEFT, LLFontGL::BOTTOM, mLabelStyle, | ||
941 | S32_MAX, S32_MAX, &right_x, FALSE ); | ||
942 | } | ||
943 | |||
944 | if (mBoxImage.notNull() && mStringMatchOffset != LLString::npos) | ||
945 | { | ||
946 | // don't draw backgrounds for zero-length strings | ||
947 | S32 filter_string_length = mRoot->getFilterSubString().size(); | ||
948 | if (filter_string_length > 0) | ||
949 | { | ||
950 | LLString combined_string = mLabel + mLabelSuffix; | ||
951 | S32 left = llround(text_left) + sFont->getWidth(combined_string, 0, mStringMatchOffset) - 1; | ||
952 | S32 right = left + sFont->getWidth(combined_string, mStringMatchOffset, filter_string_length) + 2; | ||
953 | S32 bottom = llfloor(mRect.getHeight() - sFont->getLineHeight() - 3); | ||
954 | S32 top = mRect.getHeight(); | ||
955 | |||
956 | LLViewerImage::bindTexture(mBoxImage); | ||
957 | glColor4fv(sFilterBGColor.mV); | ||
958 | gl_segmented_rect_2d_tex(left, top, right, bottom, mBoxImage->getWidth(), mBoxImage->getHeight(), 16); | ||
959 | F32 match_string_left = text_left + sFont->getWidthF32(combined_string, 0, mStringMatchOffset); | ||
960 | F32 y = (F32)mRect.getHeight() - sFont->getLineHeight() - (F32)TEXT_PAD; | ||
961 | sFont->renderUTF8( combined_string, mStringMatchOffset, match_string_left, y, | ||
962 | sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, mLabelStyle, | ||
963 | filter_string_length, S32_MAX, &right_x, FALSE ); | ||
964 | } | ||
961 | } | 965 | } |
962 | } | 966 | } |
963 | else if (mStatusText.size()) | 967 | |
968 | if( sDebugRects ) | ||
964 | { | 969 | { |
965 | // just draw status text | 970 | drawDebugRect(); |
966 | sFont->renderUTF8( mStatusText, 0, 0, 1, sFgColor, LLFontGL::LEFT, LLFontGL::BOTTOM, mLabelStyle, S32_MAX, S32_MAX, NULL, FALSE ); | ||
967 | } | 971 | } |
968 | } | 972 | } |
969 | 973 | ||
@@ -977,7 +981,6 @@ LLFolderViewFolder::LLFolderViewFolder( const LLString& name, LLViewerImage* ico | |||
977 | LLFolderView* root, | 981 | LLFolderView* root, |
978 | LLFolderViewEventListener* listener ): | 982 | LLFolderViewEventListener* listener ): |
979 | LLFolderViewItem( name, icon, 0, root, listener ), // 0 = no create time | 983 | LLFolderViewItem( name, icon, 0, root, listener ), // 0 = no create time |
980 | mSortFunction(sort_item_name), | ||
981 | mIsOpen(FALSE), | 984 | mIsOpen(FALSE), |
982 | mExpanderHighlighted(FALSE), | 985 | mExpanderHighlighted(FALSE), |
983 | mCurHeight(0.f), | 986 | mCurHeight(0.f), |
@@ -1246,7 +1249,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter) | |||
1246 | } | 1249 | } |
1247 | 1250 | ||
1248 | // when applying a filter, matching folders get their contents downloaded first | 1251 | // when applying a filter, matching folders get their contents downloaded first |
1249 | if (filter.isNotDefault() && getFiltered(filter.getMinRequiredGeneration()) && !gInventory.isCategoryComplete(mListener->getUUID())) | 1252 | if (filter.isNotDefault() && getFiltered(filter.getMinRequiredGeneration()) && (mListener && !gInventory.isCategoryComplete(mListener->getUUID()))) |
1250 | { | 1253 | { |
1251 | gInventory.startBackgroundFetch(mListener->getUUID()); | 1254 | gInventory.startBackgroundFetch(mListener->getUUID()); |
1252 | } | 1255 | } |
@@ -1667,7 +1670,8 @@ BOOL LLFolderViewFolder::removeItem(LLFolderViewItem* item) | |||
1667 | { | 1670 | { |
1668 | if(item->remove()) | 1671 | if(item->remove()) |
1669 | { | 1672 | { |
1670 | removeView(item); | 1673 | //RN: this seem unneccessary as remove() moves to trash |
1674 | //removeView(item); | ||
1671 | return TRUE; | 1675 | return TRUE; |
1672 | } | 1676 | } |
1673 | return FALSE; | 1677 | return FALSE; |
@@ -1677,7 +1681,7 @@ BOOL LLFolderViewFolder::removeItem(LLFolderViewItem* item) | |||
1677 | // listeners. | 1681 | // listeners. |
1678 | void LLFolderViewFolder::removeView(LLFolderViewItem* item) | 1682 | void LLFolderViewFolder::removeView(LLFolderViewItem* item) |
1679 | { | 1683 | { |
1680 | if (!item) | 1684 | if (!item || item->getParentFolder() != this) |
1681 | { | 1685 | { |
1682 | return; | 1686 | return; |
1683 | } | 1687 | } |
@@ -1722,23 +1726,8 @@ void LLFolderViewFolder::extractItem( LLFolderViewItem* item ) | |||
1722 | // This is only called for renaming an object because it won't work for date | 1726 | // This is only called for renaming an object because it won't work for date |
1723 | void LLFolderViewFolder::resort(LLFolderViewItem* item) | 1727 | void LLFolderViewFolder::resort(LLFolderViewItem* item) |
1724 | { | 1728 | { |
1725 | std::sort(mItems.begin(), mItems.end(), *mSortFunction); | 1729 | std::sort(mItems.begin(), mItems.end(), mSortFunction); |
1726 | std::sort(mFolders.begin(), mFolders.end(), *mSortFunction); | 1730 | std::sort(mFolders.begin(), mFolders.end(), mSortFunction); |
1727 | //if(mItems.removeData(item)) | ||
1728 | //{ | ||
1729 | // mItems.addDataSorted(item); | ||
1730 | //} | ||
1731 | //else | ||
1732 | //{ | ||
1733 | // // This is an evil downcast. However, it's only doing | ||
1734 | // // pointer comparison to find if (which it should be ) the | ||
1735 | // // item is in the container, so it's pretty safe. | ||
1736 | // LLFolderViewFolder* f = reinterpret_cast<LLFolderViewFolder*>(item); | ||
1737 | // if(mFolders.removeData(f)) | ||
1738 | // { | ||
1739 | // mFolders.addDataSorted(f); | ||
1740 | // } | ||
1741 | //} | ||
1742 | } | 1731 | } |
1743 | 1732 | ||
1744 | bool LLFolderViewFolder::isTrash() | 1733 | bool LLFolderViewFolder::isTrash() |
@@ -1752,65 +1741,22 @@ bool LLFolderViewFolder::isTrash() | |||
1752 | 1741 | ||
1753 | void LLFolderViewFolder::sortBy(U32 order) | 1742 | void LLFolderViewFolder::sortBy(U32 order) |
1754 | { | 1743 | { |
1755 | BOOL sort_order_changed = FALSE; | 1744 | if (!mSortFunction.updateSort(order)) |
1756 | if (!(order & LLInventoryFilter::SO_DATE)) | ||
1757 | { | ||
1758 | if (mSortFunction != sort_item_name) | ||
1759 | { | ||
1760 | mSortFunction = sort_item_name; | ||
1761 | sort_order_changed = TRUE; | ||
1762 | } | ||
1763 | } | ||
1764 | else | ||
1765 | { | 1745 | { |
1766 | if (mSortFunction != sort_item_date) | 1746 | // No changes. |
1767 | { | 1747 | return; |
1768 | mSortFunction = sort_item_date; | ||
1769 | sort_order_changed = TRUE; | ||
1770 | } | ||
1771 | } | 1748 | } |
1772 | 1749 | ||
1750 | // Propegate this change to sub folders | ||
1773 | for (folders_t::iterator iter = mFolders.begin(); | 1751 | for (folders_t::iterator iter = mFolders.begin(); |
1774 | iter != mFolders.end();) | 1752 | iter != mFolders.end();) |
1775 | { | 1753 | { |
1776 | folders_t::iterator fit = iter++; | 1754 | folders_t::iterator fit = iter++; |
1777 | (*fit)->sortBy(order); | 1755 | (*fit)->sortBy(order); |
1778 | } | 1756 | } |
1779 | if (order & LLInventoryFilter::SO_FOLDERS_BY_NAME) | ||
1780 | { | ||
1781 | // sort folders by name if always by name | ||
1782 | std::sort(mFolders.begin(), mFolders.end(), sort_item_name); | ||
1783 | } | ||
1784 | else | ||
1785 | { | ||
1786 | // sort folders by the default sort ordering | ||
1787 | std::sort(mFolders.begin(), mFolders.end(), *mSortFunction); | ||
1788 | 1757 | ||
1789 | // however, if we are at the root of the inventory and we are sorting by date | 1758 | std::sort(mFolders.begin(), mFolders.end(), mSortFunction); |
1790 | if (mListener->getUUID() == gAgent.getInventoryRootID() && order & LLInventoryFilter::SO_DATE) | 1759 | std::sort(mItems.begin(), mItems.end(), mSortFunction); |
1791 | { | ||
1792 | // pull the trash folder and stick it on the end of the list | ||
1793 | LLFolderViewFolder *t = NULL; | ||
1794 | for (folders_t::iterator fit = mFolders.begin(); | ||
1795 | fit != mFolders.end(); ++fit) | ||
1796 | { | ||
1797 | if ((*fit)->isTrash()) | ||
1798 | { | ||
1799 | t = *fit; | ||
1800 | mFolders.erase(fit); | ||
1801 | break; | ||
1802 | } | ||
1803 | } | ||
1804 | if (t) | ||
1805 | { | ||
1806 | mFolders.push_back(t); | ||
1807 | } | ||
1808 | } | ||
1809 | } | ||
1810 | if (sort_order_changed) | ||
1811 | { | ||
1812 | std::sort(mItems.begin(), mItems.end(), *mSortFunction); | ||
1813 | } | ||
1814 | 1760 | ||
1815 | if (order & LLInventoryFilter::SO_DATE) | 1761 | if (order & LLInventoryFilter::SO_DATE) |
1816 | { | 1762 | { |
@@ -1834,19 +1780,39 @@ void LLFolderViewFolder::sortBy(U32 order) | |||
1834 | } | 1780 | } |
1835 | } | 1781 | } |
1836 | 1782 | ||
1837 | void LLFolderViewFolder::setItemSortFunction(sort_order_f ordering) | 1783 | void LLFolderViewFolder::setItemSortOrder(U32 ordering) |
1838 | { | 1784 | { |
1839 | mSortFunction = ordering; | 1785 | if (mSortFunction.updateSort(ordering)) |
1786 | { | ||
1787 | for (folders_t::iterator iter = mFolders.begin(); | ||
1788 | iter != mFolders.end();) | ||
1789 | { | ||
1790 | folders_t::iterator fit = iter++; | ||
1791 | (*fit)->setItemSortOrder(ordering); | ||
1792 | } | ||
1840 | 1793 | ||
1841 | for (folders_t::iterator iter = mFolders.begin(); | 1794 | std::sort(mFolders.begin(), mFolders.end(), mSortFunction); |
1842 | iter != mFolders.end();) | 1795 | std::sort(mItems.begin(), mItems.end(), mSortFunction); |
1796 | } | ||
1797 | } | ||
1798 | |||
1799 | EInventorySortGroup LLFolderViewFolder::getSortGroup() | ||
1800 | { | ||
1801 | if (isTrash()) | ||
1843 | { | 1802 | { |
1844 | folders_t::iterator fit = iter++; | 1803 | return SG_TRASH_FOLDER; |
1845 | (*fit)->setItemSortFunction(ordering); | ||
1846 | } | 1804 | } |
1847 | 1805 | ||
1848 | std::sort(mFolders.begin(), mFolders.end(), *mSortFunction); | 1806 | // Folders that can't be moved are 'system' folders. |
1849 | std::sort(mItems.begin(), mItems.end(), *mSortFunction); | 1807 | if( mListener ) |
1808 | { | ||
1809 | if( !(mListener->isItemMovable()) ) | ||
1810 | { | ||
1811 | return SG_SYSTEM_FOLDER; | ||
1812 | } | ||
1813 | } | ||
1814 | |||
1815 | return SG_NORMAL_FOLDER; | ||
1850 | } | 1816 | } |
1851 | 1817 | ||
1852 | BOOL LLFolderViewFolder::isMovable() | 1818 | BOOL LLFolderViewFolder::isMovable() |
@@ -1917,6 +1883,7 @@ BOOL LLFolderViewFolder::isRemovable() | |||
1917 | // this is an internal method used for adding items to folders. | 1883 | // this is an internal method used for adding items to folders. |
1918 | BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item) | 1884 | BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item) |
1919 | { | 1885 | { |
1886 | |||
1920 | items_t::iterator it = std::lower_bound( | 1887 | items_t::iterator it = std::lower_bound( |
1921 | mItems.begin(), | 1888 | mItems.begin(), |
1922 | mItems.end(), | 1889 | mItems.end(), |
@@ -1945,18 +1912,29 @@ BOOL LLFolderViewFolder::addFolder(LLFolderViewFolder* folder) | |||
1945 | folder->setVisible(FALSE); | 1912 | folder->setVisible(FALSE); |
1946 | addChild( folder ); | 1913 | addChild( folder ); |
1947 | folder->dirtyFilter(); | 1914 | folder->dirtyFilter(); |
1948 | requestArrange(); | 1915 | // rearrange all descendants too, as our indentation level might have changed |
1916 | folder->requestArrange(TRUE); | ||
1949 | return TRUE; | 1917 | return TRUE; |
1950 | } | 1918 | } |
1951 | 1919 | ||
1952 | void LLFolderViewFolder::requestArrange() | 1920 | void LLFolderViewFolder::requestArrange(BOOL include_descendants) |
1953 | { | 1921 | { |
1954 | mLastArrangeGeneration = -1; | 1922 | mLastArrangeGeneration = -1; |
1955 | // flag all items up to root | 1923 | // flag all items up to root |
1956 | if (mParentFolder) | 1924 | if (mParentFolder && !mParentFolder->needsArrange()) |
1957 | { | 1925 | { |
1958 | mParentFolder->requestArrange(); | 1926 | mParentFolder->requestArrange(); |
1959 | } | 1927 | } |
1928 | |||
1929 | if (include_descendants) | ||
1930 | { | ||
1931 | for (folders_t::iterator iter = mFolders.begin(); | ||
1932 | iter != mFolders.end(); | ||
1933 | ++iter) | ||
1934 | { | ||
1935 | (*iter)->requestArrange(TRUE); | ||
1936 | } | ||
1937 | } | ||
1960 | } | 1938 | } |
1961 | 1939 | ||
1962 | void LLFolderViewFolder::toggleOpen() | 1940 | void LLFolderViewFolder::toggleOpen() |
@@ -2002,11 +1980,11 @@ void LLFolderViewFolder::setOpenArrangeRecursively(BOOL open, ERecurseType recur | |||
2002 | } | 1980 | } |
2003 | 1981 | ||
2004 | BOOL LLFolderViewFolder::handleDragAndDropFromChild(MASK mask, | 1982 | BOOL LLFolderViewFolder::handleDragAndDropFromChild(MASK mask, |
2005 | BOOL drop, | 1983 | BOOL drop, |
2006 | EDragAndDropType c_type, | 1984 | EDragAndDropType c_type, |
2007 | void* cargo_data, | 1985 | void* cargo_data, |
2008 | EAcceptance* accept, | 1986 | EAcceptance* accept, |
2009 | LLString& tooltip_msg) | 1987 | LLString& tooltip_msg) |
2010 | { | 1988 | { |
2011 | BOOL accepted = mListener && mListener->dragOrDrop(mask,drop,c_type,cargo_data); | 1989 | BOOL accepted = mListener && mListener->dragOrDrop(mask,drop,c_type,cargo_data); |
2012 | if (accepted) | 1990 | if (accepted) |
@@ -2218,16 +2196,13 @@ void LLFolderViewFolder::draw() | |||
2218 | } | 2196 | } |
2219 | 2197 | ||
2220 | LLFolderViewItem::draw(); | 2198 | LLFolderViewItem::draw(); |
2221 | if( mIsOpen ) | 2199 | |
2200 | // draw children if root folder, or any other folder that is open or animating to closed state | ||
2201 | if( getRoot() == this || (mIsOpen || mCurHeight != mTargetHeight )) | ||
2222 | { | 2202 | { |
2223 | LLView::draw(); | 2203 | LLView::draw(); |
2224 | } | 2204 | } |
2225 | 2205 | ||
2226 | // if (mExpanderHighlighted) | ||
2227 | // { | ||
2228 | // gl_rect_2d(mIndentation - TEXT_PAD, llfloor(mRect.getHeight() - TEXT_PAD), mIndentation + sFont->getWidth(mControlLabel) + TEXT_PAD, llfloor(mRect.getHeight() - sFont->getLineHeight() - TEXT_PAD), sFgColor, FALSE); | ||
2229 | // //sFont->renderUTF8( mControlLabel, 0, mIndentation, llfloor(mRect.getHeight() - sFont->getLineHeight() - TEXT_PAD), sFgColor, LLFontGL::LEFT, LLFontGL::BOTTOM, mLabelStyle, S32_MAX, S32_MAX, NULL, FALSE ); | ||
2230 | // } | ||
2231 | mExpanderHighlighted = FALSE; | 2206 | mExpanderHighlighted = FALSE; |
2232 | } | 2207 | } |
2233 | 2208 | ||
@@ -2237,6 +2212,16 @@ U32 LLFolderViewFolder::getCreationDate() const | |||
2237 | } | 2212 | } |
2238 | 2213 | ||
2239 | 2214 | ||
2215 | BOOL LLFolderViewFolder::potentiallyVisible() | ||
2216 | { | ||
2217 | // folder should be visible by it's own filter status | ||
2218 | return LLFolderViewItem::potentiallyVisible() | ||
2219 | // or one or more of its descendants have passed the minimum filter requirement | ||
2220 | || hasFilteredDescendants(mRoot->getFilter()->getMinRequiredGeneration()) | ||
2221 | // or not all of its descendants have been checked against minimum filter requirement | ||
2222 | || getCompletedFilterGeneration() < getRoot()->getFilter()->getMinRequiredGeneration(); | ||
2223 | } | ||
2224 | |||
2240 | // this does prefix traversal, as folders are listed above their contents | 2225 | // this does prefix traversal, as folders are listed above their contents |
2241 | LLFolderViewItem* LLFolderViewFolder::getNextFromChild( LLFolderViewItem* item, BOOL include_children ) | 2226 | LLFolderViewItem* LLFolderViewFolder::getNextFromChild( LLFolderViewItem* item, BOOL include_children ) |
2242 | { | 2227 | { |
@@ -2456,20 +2441,20 @@ LLFolderViewItem* LLFolderViewFolder::getPreviousFromChild( LLFolderViewItem* it | |||
2456 | class LLSetItemSortFunction : public LLFolderViewFunctor | 2441 | class LLSetItemSortFunction : public LLFolderViewFunctor |
2457 | { | 2442 | { |
2458 | public: | 2443 | public: |
2459 | LLSetItemSortFunction(sort_order_f ordering) | 2444 | LLSetItemSortFunction(U32 ordering) |
2460 | : mSortFunction(ordering) {} | 2445 | : mSortOrder(ordering) {} |
2461 | virtual ~LLSetItemSortFunction() {} | 2446 | virtual ~LLSetItemSortFunction() {} |
2462 | virtual void doFolder(LLFolderViewFolder* folder); | 2447 | virtual void doFolder(LLFolderViewFolder* folder); |
2463 | virtual void doItem(LLFolderViewItem* item); | 2448 | virtual void doItem(LLFolderViewItem* item); |
2464 | 2449 | ||
2465 | sort_order_f mSortFunction; | 2450 | U32 mSortOrder; |
2466 | }; | 2451 | }; |
2467 | 2452 | ||
2468 | 2453 | ||
2469 | // Set the sort order. | 2454 | // Set the sort order. |
2470 | void LLSetItemSortFunction::doFolder(LLFolderViewFolder* folder) | 2455 | void LLSetItemSortFunction::doFolder(LLFolderViewFolder* folder) |
2471 | { | 2456 | { |
2472 | folder->setItemSortFunction(mSortFunction); | 2457 | folder->setItemSortOrder(mSortOrder); |
2473 | } | 2458 | } |
2474 | 2459 | ||
2475 | // Do nothing. | 2460 | // Do nothing. |
@@ -2696,6 +2681,7 @@ BOOL LLFolderView::addFolder( LLFolderViewFolder* folder) | |||
2696 | folder->setVisible(FALSE); | 2681 | folder->setVisible(FALSE); |
2697 | addChild( folder ); | 2682 | addChild( folder ); |
2698 | folder->dirtyFilter(); | 2683 | folder->dirtyFilter(); |
2684 | folder->requestArrange(); | ||
2699 | return TRUE; | 2685 | return TRUE; |
2700 | } | 2686 | } |
2701 | 2687 | ||
@@ -2916,8 +2902,8 @@ BOOL LLFolderView::setSelection(LLFolderViewItem* selection, BOOL open, /* Flaw | |||
2916 | addToSelectionList(selection); | 2902 | addToSelectionList(selection); |
2917 | } | 2903 | } |
2918 | 2904 | ||
2919 | BOOL rv = LLFolderViewFolder::setSelection(selection, open, take_keyboard_focus); /* Flawfinder: ignore */ | 2905 | BOOL rv = LLFolderViewFolder::setSelection(selection, open, take_keyboard_focus); |
2920 | if(open) /* Flawfinder: ignore */ | 2906 | if(open && selection) |
2921 | { | 2907 | { |
2922 | selection->getParentFolder()->requestArrange(); | 2908 | selection->getParentFolder()->requestArrange(); |
2923 | } | 2909 | } |
@@ -2954,11 +2940,6 @@ BOOL LLFolderView::changeSelection(LLFolderViewItem* selection, BOOL selected) | |||
2954 | } | 2940 | } |
2955 | 2941 | ||
2956 | BOOL on_list = (item_iter != mSelectedItems.end()); | 2942 | BOOL on_list = (item_iter != mSelectedItems.end()); |
2957 | if (on_list && mSelectedItems.size() == 1) | ||
2958 | { | ||
2959 | // we are trying to select/deselect the only selected item | ||
2960 | return FALSE; | ||
2961 | } | ||
2962 | 2943 | ||
2963 | if(selected && !on_list) | 2944 | if(selected && !on_list) |
2964 | { | 2945 | { |
@@ -3005,48 +2986,46 @@ S32 LLFolderView::extendSelection(LLFolderViewItem* selection, LLFolderViewItem* | |||
3005 | 2986 | ||
3006 | void LLFolderView::sanitizeSelection() | 2987 | void LLFolderView::sanitizeSelection() |
3007 | { | 2988 | { |
2989 | // store off current item in case it is automatically deselected | ||
2990 | // and we want to preserve context | ||
2991 | LLFolderViewItem* original_selected_item = getCurSelectedItem(); | ||
2992 | |||
3008 | std::vector<LLFolderViewItem*> items_to_remove; | 2993 | std::vector<LLFolderViewItem*> items_to_remove; |
3009 | selected_items_t::iterator item_iter; | 2994 | selected_items_t::iterator item_iter; |
3010 | for (item_iter = mSelectedItems.begin(); item_iter != mSelectedItems.end(); ++item_iter) | 2995 | for (item_iter = mSelectedItems.begin(); item_iter != mSelectedItems.end(); ++item_iter) |
3011 | { | 2996 | { |
3012 | LLFolderViewItem* item = *item_iter; | 2997 | LLFolderViewItem* item = *item_iter; |
3013 | 2998 | ||
3014 | BOOL visible = item->getVisible(); | 2999 | // ensure that each ancestor is open and potentially passes filtering |
3000 | BOOL visible = item->potentiallyVisible(); // initialize from filter state for this item | ||
3001 | // modify with parent open and filters states | ||
3015 | LLFolderViewFolder* parent_folder = item->getParentFolder(); | 3002 | LLFolderViewFolder* parent_folder = item->getParentFolder(); |
3016 | while(visible && parent_folder) | 3003 | while(parent_folder) |
3017 | { | 3004 | { |
3018 | visible = visible && parent_folder->isOpen() && parent_folder->getVisible(); | 3005 | visible = visible && parent_folder->isOpen() && parent_folder->potentiallyVisible(); |
3019 | parent_folder = parent_folder->getParentFolder(); | 3006 | parent_folder = parent_folder->getParentFolder(); |
3020 | } | 3007 | } |
3021 | if (!visible || item->getNumSelectedDescendants() > 0) | 3008 | |
3009 | // deselect item if any ancestor is closed or didn't pass filter requirements. | ||
3010 | if (!visible) | ||
3022 | { | 3011 | { |
3023 | // only deselect self if not visible | 3012 | items_to_remove.push_back(item); |
3024 | // check to see if item failed the filter but was checked against most recent generation | 3013 | } |
3025 | if ((!item->getFiltered() && item->getLastFilterGeneration() >= getFilter()->getMinRequiredGeneration()) | ||
3026 | || (item->getParentFolder() && !item->getParentFolder()->isOpen())) | ||
3027 | { | ||
3028 | item->recursiveDeselect(TRUE); | ||
3029 | items_to_remove.push_back(item); | ||
3030 | } | ||
3031 | else | ||
3032 | { | ||
3033 | item->recursiveDeselect(FALSE); | ||
3034 | } | ||
3035 | 3014 | ||
3036 | selected_items_t::iterator other_item_iter; | 3015 | // disallow nested selections (i.e. folder items plus one or more ancestors) |
3037 | for (other_item_iter = mSelectedItems.begin(); other_item_iter != mSelectedItems.end(); ++other_item_iter) | 3016 | // could check cached mum selections count and only iterate if there are any |
3017 | // but that may be a premature optimization. | ||
3018 | selected_items_t::iterator other_item_iter; | ||
3019 | for (other_item_iter = mSelectedItems.begin(); other_item_iter != mSelectedItems.end(); ++other_item_iter) | ||
3020 | { | ||
3021 | LLFolderViewItem* other_item = *other_item_iter; | ||
3022 | for(LLFolderViewFolder* parent_folder = other_item->getParentFolder(); parent_folder; parent_folder = parent_folder->getParentFolder()) | ||
3038 | { | 3023 | { |
3039 | LLFolderViewItem* other_item = *other_item_iter; | 3024 | if (parent_folder == item) |
3040 | LLFolderViewFolder* parent_folder = other_item->getParentFolder(); | ||
3041 | while (parent_folder) | ||
3042 | { | 3025 | { |
3043 | if (parent_folder == item) | 3026 | // this is a descendent of the current folder, remove from list |
3044 | { | 3027 | items_to_remove.push_back(other_item); |
3045 | // this is a descendent of the current folder, remove from list | 3028 | break; |
3046 | items_to_remove.push_back(other_item); | ||
3047 | break; | ||
3048 | } | ||
3049 | parent_folder = parent_folder->getParentFolder(); | ||
3050 | } | 3029 | } |
3051 | } | 3030 | } |
3052 | } | 3031 | } |
@@ -3055,7 +3034,47 @@ void LLFolderView::sanitizeSelection() | |||
3055 | std::vector<LLFolderViewItem*>::iterator item_it; | 3034 | std::vector<LLFolderViewItem*>::iterator item_it; |
3056 | for (item_it = items_to_remove.begin(); item_it != items_to_remove.end(); ++item_it ) | 3035 | for (item_it = items_to_remove.begin(); item_it != items_to_remove.end(); ++item_it ) |
3057 | { | 3036 | { |
3058 | removeFromSelectionList(*item_it); | 3037 | changeSelection(*item_it, FALSE); // toggle selection (also removes from list) |
3038 | } | ||
3039 | |||
3040 | // if nothing selected after prior constraints... | ||
3041 | if (mSelectedItems.empty()) | ||
3042 | { | ||
3043 | // ...select first available parent of original selection, or "My Inventory" otherwise | ||
3044 | LLFolderViewItem* new_selection = NULL; | ||
3045 | if (original_selected_item) | ||
3046 | { | ||
3047 | for(LLFolderViewFolder* parent_folder = original_selected_item->getParentFolder(); | ||
3048 | parent_folder; | ||
3049 | parent_folder = parent_folder->getParentFolder()) | ||
3050 | { | ||
3051 | if (parent_folder->potentiallyVisible()) | ||
3052 | { | ||
3053 | // give initial selection to first ancestor folder that potentially passes the filter | ||
3054 | if (!new_selection) | ||
3055 | { | ||
3056 | new_selection = parent_folder; | ||
3057 | } | ||
3058 | |||
3059 | // if any ancestor folder of original item is closed, move the selection up | ||
3060 | // to the highest closed | ||
3061 | if (!parent_folder->isOpen()) | ||
3062 | { | ||
3063 | new_selection = parent_folder; | ||
3064 | } | ||
3065 | } | ||
3066 | } | ||
3067 | } | ||
3068 | else | ||
3069 | { | ||
3070 | // nothing selected to start with, so pick "My Inventory" as best guess | ||
3071 | new_selection = getItemByID(gAgent.getInventoryRootID()); | ||
3072 | } | ||
3073 | |||
3074 | if (new_selection) | ||
3075 | { | ||
3076 | setSelection(new_selection, FALSE, FALSE); | ||
3077 | } | ||
3059 | } | 3078 | } |
3060 | } | 3079 | } |
3061 | 3080 | ||
@@ -3232,7 +3251,7 @@ void LLFolderView::removeSelectedItems( void ) | |||
3232 | // create a temporary structure which we will use to remove | 3251 | // create a temporary structure which we will use to remove |
3233 | // items, since the removal will futz with internal data | 3252 | // items, since the removal will futz with internal data |
3234 | // structures. | 3253 | // structures. |
3235 | LLDynamicArray<LLFolderViewItem*> items; | 3254 | std::vector<LLFolderViewItem*> items; |
3236 | S32 count = mSelectedItems.size(); | 3255 | S32 count = mSelectedItems.size(); |
3237 | if(count == 0) return; | 3256 | if(count == 0) return; |
3238 | LLFolderViewItem* item = NULL; | 3257 | LLFolderViewItem* item = NULL; |
@@ -3242,7 +3261,7 @@ void LLFolderView::removeSelectedItems( void ) | |||
3242 | item = *item_it; | 3261 | item = *item_it; |
3243 | if(item->isRemovable()) | 3262 | if(item->isRemovable()) |
3244 | { | 3263 | { |
3245 | items.put(item); | 3264 | items.push_back(item); |
3246 | } | 3265 | } |
3247 | else | 3266 | else |
3248 | { | 3267 | { |
@@ -3252,11 +3271,11 @@ void LLFolderView::removeSelectedItems( void ) | |||
3252 | } | 3271 | } |
3253 | 3272 | ||
3254 | // iterate through the new container. | 3273 | // iterate through the new container. |
3255 | count = items.count(); | 3274 | count = items.size(); |
3256 | LLUUID new_selection_id; | 3275 | LLUUID new_selection_id; |
3257 | if(count == 1) | 3276 | if(count == 1) |
3258 | { | 3277 | { |
3259 | LLFolderViewItem* item_to_delete = items.get(0); | 3278 | LLFolderViewItem* item_to_delete = items[0]; |
3260 | LLFolderViewFolder* parent = item_to_delete->getParentFolder(); | 3279 | LLFolderViewFolder* parent = item_to_delete->getParentFolder(); |
3261 | LLFolderViewItem* new_selection = item_to_delete->getNextOpenNode(FALSE); | 3280 | LLFolderViewItem* new_selection = item_to_delete->getNextOpenNode(FALSE); |
3262 | if (!new_selection) | 3281 | if (!new_selection) |
@@ -3284,7 +3303,7 @@ void LLFolderView::removeSelectedItems( void ) | |||
3284 | { | 3303 | { |
3285 | LLDynamicArray<LLFolderViewEventListener*> listeners; | 3304 | LLDynamicArray<LLFolderViewEventListener*> listeners; |
3286 | LLFolderViewEventListener* listener; | 3305 | LLFolderViewEventListener* listener; |
3287 | LLFolderViewItem* last_item = items.get(count - 1); | 3306 | LLFolderViewItem* last_item = items[count - 1]; |
3288 | LLFolderViewItem* new_selection = last_item->getNextOpenNode(FALSE); | 3307 | LLFolderViewItem* new_selection = last_item->getNextOpenNode(FALSE); |
3289 | while(new_selection && new_selection->isSelected()) | 3308 | while(new_selection && new_selection->isSelected()) |
3290 | { | 3309 | { |
@@ -3309,7 +3328,7 @@ void LLFolderView::removeSelectedItems( void ) | |||
3309 | 3328 | ||
3310 | for(S32 i = 0; i < count; ++i) | 3329 | for(S32 i = 0; i < count; ++i) |
3311 | { | 3330 | { |
3312 | listener = items.get(i)->getListener(); | 3331 | listener = items[i]->getListener(); |
3313 | if(listener && (listeners.find(listener) == LLDynamicArray<LLFolderViewEventListener*>::FAIL)) | 3332 | if(listener && (listeners.find(listener) == LLDynamicArray<LLFolderViewEventListener*>::FAIL)) |
3314 | { | 3333 | { |
3315 | listeners.put(listener); | 3334 | listeners.put(listener); |
@@ -3620,21 +3639,6 @@ void LLFolderView::setFocus(BOOL focus) | |||
3620 | { | 3639 | { |
3621 | if (focus) | 3640 | if (focus) |
3622 | { | 3641 | { |
3623 | // select "My Inventory" if nothing selected | ||
3624 | if (!getCurSelectedItem()) | ||
3625 | { | ||
3626 | LLFolderViewItem* itemp = getItemByID(gAgent.getInventoryRootID()); | ||
3627 | if (itemp) | ||
3628 | { | ||
3629 | setSelection(itemp, FALSE, FALSE); | ||
3630 | } | ||
3631 | } | ||
3632 | |||
3633 | if (mRenamer->getVisible()) | ||
3634 | { | ||
3635 | //RN: commit rename changes when focus is moved, only revert on ESC | ||
3636 | finishRenamingItem(); | ||
3637 | } | ||
3638 | if(!hasFocus()) | 3642 | if(!hasFocus()) |
3639 | { | 3643 | { |
3640 | gEditMenuHandler = this; | 3644 | gEditMenuHandler = this; |
@@ -3954,10 +3958,10 @@ BOOL LLFolderView::search(LLFolderViewItem* first_item, const LLString &search_s | |||
3954 | LLString::toUpper(upper_case_string); | 3958 | LLString::toUpper(upper_case_string); |
3955 | 3959 | ||
3956 | // if nothing selected, select first item in folder | 3960 | // if nothing selected, select first item in folder |
3957 | if (!first_item) | 3961 | if (!search_item) |
3958 | { | 3962 | { |
3959 | // start from first item | 3963 | // start from first item |
3960 | first_item = getNextFromChild(NULL); | 3964 | search_item = getNextFromChild(NULL); |
3961 | } | 3965 | } |
3962 | 3966 | ||
3963 | // search over all open nodes for first substring match (with wrapping) | 3967 | // search over all open nodes for first substring match (with wrapping) |
@@ -4248,8 +4252,6 @@ void LLFolderView::idle(void* user_data) | |||
4248 | // filter to determine visiblity before arranging | 4252 | // filter to determine visiblity before arranging |
4249 | self->filterFromRoot(); | 4253 | self->filterFromRoot(); |
4250 | 4254 | ||
4251 | self->sanitizeSelection(); | ||
4252 | |||
4253 | // automatically show matching items, and select first one | 4255 | // automatically show matching items, and select first one |
4254 | // do this every frame until user puts keyboard focus into the inventory window | 4256 | // do this every frame until user puts keyboard focus into the inventory window |
4255 | // signaling the end of the automatic update | 4257 | // signaling the end of the automatic update |
@@ -4269,6 +4271,8 @@ void LLFolderView::idle(void* user_data) | |||
4269 | self->scrollToShowSelection(); | 4271 | self->scrollToShowSelection(); |
4270 | } | 4272 | } |
4271 | 4273 | ||
4274 | self->sanitizeSelection(); | ||
4275 | |||
4272 | if( self->needsArrange() && self->isInVisibleChain()) | 4276 | if( self->needsArrange() && self->isInVisibleChain()) |
4273 | { | 4277 | { |
4274 | self->arrangeFromRoot(); | 4278 | self->arrangeFromRoot(); |
@@ -4307,33 +4311,71 @@ void LLFolderView::dumpSelectionInformation() | |||
4307 | ///---------------------------------------------------------------------------- | 4311 | ///---------------------------------------------------------------------------- |
4308 | /// Local function definitions | 4312 | /// Local function definitions |
4309 | ///---------------------------------------------------------------------------- | 4313 | ///---------------------------------------------------------------------------- |
4310 | 4314 | bool LLInventorySort::updateSort(U32 order) | |
4311 | bool sort_item_name(LLFolderViewItem* a, LLFolderViewItem* b) | ||
4312 | { | 4315 | { |
4313 | S32 compare = LLString::compareDict(a->getLabel(), b->getLabel()); | 4316 | if (order != mSortOrder) |
4314 | if (0 == compare) | ||
4315 | { | ||
4316 | return (a->getCreationDate() > b->getCreationDate()); | ||
4317 | } | ||
4318 | else | ||
4319 | { | 4317 | { |
4320 | return (compare < 0); | 4318 | mSortOrder = order; |
4319 | mByDate = (order & LLInventoryFilter::SO_DATE); | ||
4320 | mSystemToTop = (order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP); | ||
4321 | mFoldersByName = (order & LLInventoryFilter::SO_FOLDERS_BY_NAME); | ||
4322 | return true; | ||
4321 | } | 4323 | } |
4324 | return false; | ||
4322 | } | 4325 | } |
4323 | 4326 | ||
4324 | // BUG: This is very very slow. The getCreationDate() is log n in number | 4327 | bool LLInventorySort::operator()(LLFolderViewItem* a, LLFolderViewItem* b) |
4325 | // of inventory items. | ||
4326 | bool sort_item_date(LLFolderViewItem* a, LLFolderViewItem* b) | ||
4327 | { | 4328 | { |
4328 | U32 first_create = a->getCreationDate(); | 4329 | // We sort by name if we aren't sorting by date |
4329 | U32 second_create = b->getCreationDate(); | 4330 | // OR if these are folders and we are sorting folders by name. |
4330 | if (first_create == second_create) | 4331 | bool by_name = (!mByDate |
4332 | || (mFoldersByName | ||
4333 | && (a->getSortGroup() != SG_ITEM))); | ||
4334 | |||
4335 | if (a->getSortGroup() != b->getSortGroup()) | ||
4336 | { | ||
4337 | if (mSystemToTop) | ||
4338 | { | ||
4339 | // Group order is System Folders, Trash, Normal Folders, Items | ||
4340 | return (a->getSortGroup() < b->getSortGroup()); | ||
4341 | } | ||
4342 | else if (mByDate) | ||
4343 | { | ||
4344 | // Trash needs to go to the bottom if we are sorting by date | ||
4345 | if ( (a->getSortGroup() == SG_TRASH_FOLDER) | ||
4346 | || (b->getSortGroup() == SG_TRASH_FOLDER)) | ||
4347 | { | ||
4348 | return (b->getSortGroup() == SG_TRASH_FOLDER); | ||
4349 | } | ||
4350 | } | ||
4351 | } | ||
4352 | |||
4353 | if (by_name) | ||
4331 | { | 4354 | { |
4332 | return (LLString::compareDict(a->getLabel(), b->getLabel()) < 0); | 4355 | S32 compare = LLString::compareDict(a->getLabel(), b->getLabel()); |
4356 | if (0 == compare) | ||
4357 | { | ||
4358 | return (a->getCreationDate() > b->getCreationDate()); | ||
4359 | } | ||
4360 | else | ||
4361 | { | ||
4362 | return (compare < 0); | ||
4363 | } | ||
4333 | } | 4364 | } |
4334 | else | 4365 | else |
4335 | { | 4366 | { |
4336 | return (first_create > second_create); | 4367 | // BUG: This is very very slow. The getCreationDate() is log n in number |
4368 | // of inventory items. | ||
4369 | U32 first_create = a->getCreationDate(); | ||
4370 | U32 second_create = b->getCreationDate(); | ||
4371 | if (first_create == second_create) | ||
4372 | { | ||
4373 | return (LLString::compareDict(a->getLabel(), b->getLabel()) < 0); | ||
4374 | } | ||
4375 | else | ||
4376 | { | ||
4377 | return (first_create > second_create); | ||
4378 | } | ||
4337 | } | 4379 | } |
4338 | } | 4380 | } |
4339 | 4381 | ||
diff --git a/linden/indra/newview/llfolderview.h b/linden/indra/newview/llfolderview.h index 8acbc8f..ec70b90 100644 --- a/linden/indra/newview/llfolderview.h +++ b/linden/indra/newview/llfolderview.h | |||
@@ -181,6 +181,7 @@ public: | |||
181 | 181 | ||
182 | static const U32 SO_DATE = 1; | 182 | static const U32 SO_DATE = 1; |
183 | static const U32 SO_FOLDERS_BY_NAME = 2; | 183 | static const U32 SO_FOLDERS_BY_NAME = 2; |
184 | static const U32 SO_SYSTEM_FOLDERS_TO_TOP = 4; | ||
184 | 185 | ||
185 | LLInventoryFilter(const LLString& name); | 186 | LLInventoryFilter(const LLString& name); |
186 | virtual ~LLInventoryFilter(); | 187 | virtual ~LLInventoryFilter(); |
@@ -265,6 +266,34 @@ private: | |||
265 | LLString mFilterText; | 266 | LLString mFilterText; |
266 | }; | 267 | }; |
267 | 268 | ||
269 | // These are grouping of inventory types. | ||
270 | // Order matters when sorting system folders to the top. | ||
271 | enum EInventorySortGroup | ||
272 | { | ||
273 | SG_SYSTEM_FOLDER, | ||
274 | SG_TRASH_FOLDER, | ||
275 | SG_NORMAL_FOLDER, | ||
276 | SG_ITEM | ||
277 | }; | ||
278 | |||
279 | class LLInventorySort | ||
280 | { | ||
281 | public: | ||
282 | LLInventorySort() | ||
283 | : mSortOrder(0) { } | ||
284 | |||
285 | // Returns true if order has changed | ||
286 | bool updateSort(U32 order); | ||
287 | U32 getSort() { return mSortOrder; } | ||
288 | |||
289 | bool operator()(LLFolderViewItem* a, LLFolderViewItem* b); | ||
290 | private: | ||
291 | U32 mSortOrder; | ||
292 | bool mByDate; | ||
293 | bool mSystemToTop; | ||
294 | bool mFoldersByName; | ||
295 | }; | ||
296 | |||
268 | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 297 | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
269 | // Class LLFolderViewItem | 298 | // Class LLFolderViewItem |
270 | // | 299 | // |
@@ -351,6 +380,8 @@ public: | |||
351 | enum { ARRANGE = TRUE, DO_NOT_ARRANGE = FALSE }; | 380 | enum { ARRANGE = TRUE, DO_NOT_ARRANGE = FALSE }; |
352 | virtual BOOL addToFolder(LLFolderViewFolder* folder, LLFolderView* root); | 381 | virtual BOOL addToFolder(LLFolderViewFolder* folder, LLFolderView* root); |
353 | 382 | ||
383 | virtual EInventorySortGroup getSortGroup(); | ||
384 | |||
354 | // Finds width and height of this object and it's children. Also | 385 | // Finds width and height of this object and it's children. Also |
355 | // makes sure that this view and it's children are the right size. | 386 | // makes sure that this view and it's children are the right size. |
356 | virtual S32 arrange( S32* width, S32* height, S32 filter_generation ); | 387 | virtual S32 arrange( S32* width, S32* height, S32 filter_generation ); |
@@ -449,8 +480,10 @@ public: | |||
449 | 480 | ||
450 | virtual void setStatusText(const LLString& text) { mStatusText = text; } | 481 | virtual void setStatusText(const LLString& text) { mStatusText = text; } |
451 | 482 | ||
452 | BOOL getFiltered(); | 483 | virtual BOOL potentiallyVisible(); // do we know for a fact that this item has been filtered out? |
453 | BOOL getFiltered(S32 filter_generation); | 484 | |
485 | virtual BOOL getFiltered(); | ||
486 | virtual BOOL getFiltered(S32 filter_generation); | ||
454 | virtual void setFiltered(BOOL filtered, S32 filter_generation); | 487 | virtual void setFiltered(BOOL filtered, S32 filter_generation); |
455 | 488 | ||
456 | // change the icon | 489 | // change the icon |
@@ -504,7 +537,7 @@ protected: | |||
504 | typedef std::vector<LLFolderViewFolder*> folders_t; | 537 | typedef std::vector<LLFolderViewFolder*> folders_t; |
505 | items_t mItems; | 538 | items_t mItems; |
506 | folders_t mFolders; | 539 | folders_t mFolders; |
507 | sort_order_f mSortFunction; | 540 | LLInventorySort mSortFunction; |
508 | 541 | ||
509 | BOOL mIsOpen; | 542 | BOOL mIsOpen; |
510 | BOOL mExpanderHighlighted; | 543 | BOOL mExpanderHighlighted; |
@@ -534,6 +567,8 @@ public: | |||
534 | virtual EWidgetType getWidgetType() const; | 567 | virtual EWidgetType getWidgetType() const; |
535 | virtual LLString getWidgetTag() const; | 568 | virtual LLString getWidgetTag() const; |
536 | 569 | ||
570 | virtual BOOL potentiallyVisible(); | ||
571 | |||
537 | LLFolderViewItem* getNextFromChild( LLFolderViewItem*, BOOL include_children = TRUE ); | 572 | LLFolderViewItem* getNextFromChild( LLFolderViewItem*, BOOL include_children = TRUE ); |
538 | LLFolderViewItem* getPreviousFromChild( LLFolderViewItem*, BOOL include_children = TRUE ); | 573 | LLFolderViewItem* getPreviousFromChild( LLFolderViewItem*, BOOL include_children = TRUE ); |
539 | 574 | ||
@@ -546,6 +581,9 @@ public: | |||
546 | 581 | ||
547 | BOOL needsArrange(); | 582 | BOOL needsArrange(); |
548 | 583 | ||
584 | // Returns the sort group (system, trash, folder) for this folder. | ||
585 | virtual EInventorySortGroup getSortGroup(); | ||
586 | |||
549 | virtual void setCompletedFilterGeneration(S32 generation, BOOL recurse_up); | 587 | virtual void setCompletedFilterGeneration(S32 generation, BOOL recurse_up); |
550 | virtual S32 getCompletedFilterGeneration() { return mCompletedFilterGeneration; } | 588 | virtual S32 getCompletedFilterGeneration() { return mCompletedFilterGeneration; } |
551 | 589 | ||
@@ -603,7 +641,7 @@ public: | |||
603 | // This function is called by a child that needs to be resorted. | 641 | // This function is called by a child that needs to be resorted. |
604 | void resort(LLFolderViewItem* item); | 642 | void resort(LLFolderViewItem* item); |
605 | 643 | ||
606 | void setItemSortFunction(sort_order_f ordering); | 644 | void setItemSortOrder(U32 ordering); |
607 | void sortBy(U32); | 645 | void sortBy(U32); |
608 | //BOOL (*func)(LLFolderViewItem* a, LLFolderViewItem* b)); | 646 | //BOOL (*func)(LLFolderViewItem* a, LLFolderViewItem* b)); |
609 | 647 | ||
@@ -617,7 +655,8 @@ public: | |||
617 | virtual void setOpen(BOOL open = TRUE); /* Flawfinder: ignore */ | 655 | virtual void setOpen(BOOL open = TRUE); /* Flawfinder: ignore */ |
618 | 656 | ||
619 | // Called when a child is refreshed. | 657 | // Called when a child is refreshed. |
620 | virtual void requestArrange(); | 658 | // don't rearrange child folder contents unless explicitly requested |
659 | virtual void requestArrange(BOOL include_descendants = FALSE); | ||
621 | 660 | ||
622 | // internal method which doesn't update the entire view. This | 661 | // internal method which doesn't update the entire view. This |
623 | // method was written because the list iterators destroy the state | 662 | // method was written because the list iterators destroy the state |
diff --git a/linden/indra/newview/llgenepool.cpp b/linden/indra/newview/llgenepool.cpp index 95b15f3..3cc57e9 100644 --- a/linden/indra/newview/llgenepool.cpp +++ b/linden/indra/newview/llgenepool.cpp | |||
@@ -223,6 +223,14 @@ void LLGenePool::spawn( EWearableType type ) | |||
223 | 223 | ||
224 | // Only consider archetypes that have the same sex as you have already. | 224 | // Only consider archetypes that have the same sex as you have already. |
225 | LLVisualParam* male_param = avatar->getVisualParam( "male" ); | 225 | LLVisualParam* male_param = avatar->getVisualParam( "male" ); |
226 | |||
227 | if (!male_param) | ||
228 | { | ||
229 | llwarns << "The hard coded \'male\' parameter passed to avatar->getVisualParam() in LLGenePool::spawn() is no longer valid." | ||
230 | << llendl; | ||
231 | return; | ||
232 | } | ||
233 | |||
226 | S32 male_param_id = male_param->getID(); | 234 | S32 male_param_id = male_param->getID(); |
227 | F32 sex_weight = male_param->getWeight(); | 235 | F32 sex_weight = male_param->getWeight(); |
228 | 236 | ||
diff --git a/linden/indra/newview/llgivemoney.cpp b/linden/indra/newview/llgivemoney.cpp index 3722682..e89ab3d 100644 --- a/linden/indra/newview/llgivemoney.cpp +++ b/linden/indra/newview/llgivemoney.cpp | |||
@@ -155,7 +155,7 @@ LLFloaterPay::LLFloaterPay(const std::string& name, | |||
155 | 155 | ||
156 | childSetKeystrokeCallback("amount", &LLFloaterPay::onKeystroke, this); | 156 | childSetKeystrokeCallback("amount", &LLFloaterPay::onKeystroke, this); |
157 | childSetText("amount", last_amount); | 157 | childSetText("amount", last_amount); |
158 | childSetPrevalidate("amount", LLLineEditor::prevalidatePositiveS32); | 158 | childSetPrevalidate("amount", LLLineEditor::prevalidateNonNegativeS32); |
159 | 159 | ||
160 | info = new LLGiveMoneyInfo(this, 0); | 160 | info = new LLGiveMoneyInfo(this, 0); |
161 | mCallbackData.push_back(info); | 161 | mCallbackData.push_back(info); |
@@ -422,14 +422,9 @@ void LLFloaterPay::onKeystroke(LLLineEditor*, void* data) | |||
422 | LLFloaterPay* self = reinterpret_cast<LLFloaterPay*>(data); | 422 | LLFloaterPay* self = reinterpret_cast<LLFloaterPay*>(data); |
423 | if(self) | 423 | if(self) |
424 | { | 424 | { |
425 | if (!self->childGetText("amount").empty()) | 425 | // enable the Pay button when amount is non-empty and positive, disable otherwise |
426 | { | 426 | LLString amtstr = self->childGetText("amount"); |
427 | self->childSetEnabled("pay btn", TRUE); | 427 | self->childSetEnabled("pay btn", !amtstr.empty() && atoi(amtstr.c_str()) > 0); |
428 | } | ||
429 | else | ||
430 | { | ||
431 | self->childSetEnabled("pay btn", FALSE); | ||
432 | } | ||
433 | } | 428 | } |
434 | } | 429 | } |
435 | 430 | ||
diff --git a/linden/indra/newview/llglsandbox.cpp b/linden/indra/newview/llglsandbox.cpp index e14cebe..81806dc 100644 --- a/linden/indra/newview/llglsandbox.cpp +++ b/linden/indra/newview/llglsandbox.cpp | |||
@@ -1134,5 +1134,5 @@ void post_show_depth_buffer() | |||
1134 | } | 1134 | } |
1135 | glDrawPixels(xsize,ysize,GL_RED,GL_UNSIGNED_BYTE,buf); | 1135 | glDrawPixels(xsize,ysize,GL_RED,GL_UNSIGNED_BYTE,buf); |
1136 | 1136 | ||
1137 | delete buf; | 1137 | delete [] buf; |
1138 | } | 1138 | } |
diff --git a/linden/indra/newview/llglslshader.cpp b/linden/indra/newview/llglslshader.cpp index 3f23a66..9c3d707 100644 --- a/linden/indra/newview/llglslshader.cpp +++ b/linden/indra/newview/llglslshader.cpp | |||
@@ -847,7 +847,7 @@ BOOL LLShaderMgr::loadShadersAvatar() | |||
847 | return FALSE; | 847 | return FALSE; |
848 | } | 848 | } |
849 | 849 | ||
850 | if (success) | 850 | /*if (success) |
851 | { | 851 | { |
852 | //load specular (eyeball) vertex program | 852 | //load specular (eyeball) vertex program |
853 | std::string eyeballvertex = "avatar/eyeballV.glsl"; | 853 | std::string eyeballvertex = "avatar/eyeballV.glsl"; |
@@ -865,7 +865,7 @@ BOOL LLShaderMgr::loadShadersAvatar() | |||
865 | { | 865 | { |
866 | llwarns << "Failed to load " << eyeballvertex << llendl; | 866 | llwarns << "Failed to load " << eyeballvertex << llendl; |
867 | } | 867 | } |
868 | } | 868 | }*/ |
869 | 869 | ||
870 | if (success) | 870 | if (success) |
871 | { | 871 | { |
diff --git a/linden/indra/newview/llgroupnotify.cpp b/linden/indra/newview/llgroupnotify.cpp index de9b571..ef20138 100644 --- a/linden/indra/newview/llgroupnotify.cpp +++ b/linden/indra/newview/llgroupnotify.cpp | |||
@@ -162,7 +162,7 @@ LLGroupNotifyBox::LLGroupNotifyBox(const char* subject, | |||
162 | 162 | ||
163 | line = new LLTextBox("title",LLRect(x,y,RIGHT - HPAD,y - LINE_HEIGHT),"Group Notice",LLFontGL::sSansSerifHuge); | 163 | line = new LLTextBox("title",LLRect(x,y,RIGHT - HPAD,y - LINE_HEIGHT),"Group Notice",LLFontGL::sSansSerifHuge); |
164 | line->setHAlign(LLFontGL::RIGHT); | 164 | line->setHAlign(LLFontGL::RIGHT); |
165 | line->setDropshadowVisible(true); | 165 | line->setFontStyle(LLFontGL::DROP_SHADOW_SOFT); |
166 | line->setBorderVisible(FALSE); | 166 | line->setBorderVisible(FALSE); |
167 | line->setColor(LLColor4::white); | 167 | line->setColor(LLColor4::white); |
168 | line->setBackgroundColor( gColors.getColor("GroupNotifyBoxColor") ); | 168 | line->setBackgroundColor( gColors.getColor("GroupNotifyBoxColor") ); |
@@ -177,7 +177,7 @@ LLGroupNotifyBox::LLGroupNotifyBox(const char* subject, | |||
177 | from << "Sent by " << from_name << ", " << group_name; | 177 | from << "Sent by " << from_name << ", " << group_name; |
178 | 178 | ||
179 | line = new LLTextBox("group",LLRect(x,y,RIGHT - HPAD,y - LINE_HEIGHT),from.str().c_str(),LLFontGL::sSansSerif); | 179 | line = new LLTextBox("group",LLRect(x,y,RIGHT - HPAD,y - LINE_HEIGHT),from.str().c_str(),LLFontGL::sSansSerif); |
180 | line->setDropshadowVisible(true); | 180 | line->setFontStyle(LLFontGL::DROP_SHADOW_SOFT); |
181 | line->setHAlign(LLFontGL::RIGHT); | 181 | line->setHAlign(LLFontGL::RIGHT); |
182 | line->setBorderVisible(FALSE); | 182 | line->setBorderVisible(FALSE); |
183 | line->setColor(LLColor4::white); | 183 | line->setColor(LLColor4::white); |
@@ -244,7 +244,7 @@ LLGroupNotifyBox::LLGroupNotifyBox(const char* subject, | |||
244 | line = new LLTextBox("subjecttitle",LLRect(x,y,x + LABEL_WIDTH,y - LINE_HEIGHT),"Attached: ",LLFontGL::sSansSerif); | 244 | line = new LLTextBox("subjecttitle",LLRect(x,y,x + LABEL_WIDTH,y - LINE_HEIGHT),"Attached: ",LLFontGL::sSansSerif); |
245 | line->setBorderVisible(FALSE); | 245 | line->setBorderVisible(FALSE); |
246 | line->setColor(LLColor4::white); | 246 | line->setColor(LLColor4::white); |
247 | line->setDropshadowVisible(TRUE); | 247 | line->setFontStyle(LLFontGL::DROP_SHADOW_SOFT); |
248 | line->setBackgroundColor( gColors.getColor("GroupNotifyBoxColor") ); | 248 | line->setBackgroundColor( gColors.getColor("GroupNotifyBoxColor") ); |
249 | addChild(line); | 249 | addChild(line); |
250 | 250 | ||
@@ -261,7 +261,7 @@ LLGroupNotifyBox::LLGroupNotifyBox(const char* subject, | |||
261 | line->setEnabled(FALSE); | 261 | line->setEnabled(FALSE); |
262 | line->setBorderVisible(TRUE); | 262 | line->setBorderVisible(TRUE); |
263 | line->setDisabledColor(LLColor4::blue4); | 263 | line->setDisabledColor(LLColor4::blue4); |
264 | line->setDropshadowVisible(FALSE); | 264 | line->setFontStyle(LLFontGL::NORMAL); |
265 | line->setBackgroundVisible(true); | 265 | line->setBackgroundVisible(true); |
266 | line->setBackgroundColor( semi_transparent ); | 266 | line->setBackgroundColor( semi_transparent ); |
267 | addChild(line); | 267 | addChild(line); |
@@ -399,7 +399,7 @@ void LLGroupNotifyBox::close() | |||
399 | // Then we need to send the inventory declined message | 399 | // Then we need to send the inventory declined message |
400 | if(mHasInventory) | 400 | if(mHasInventory) |
401 | { | 401 | { |
402 | inventory_offer_callback( 1 , mInventoryOffer); | 402 | inventory_offer_callback(IOR_DECLINE , mInventoryOffer); |
403 | } | 403 | } |
404 | gNotifyBoxView->removeChild(this); | 404 | gNotifyBoxView->removeChild(this); |
405 | 405 | ||
@@ -461,7 +461,7 @@ void LLGroupNotifyBox::onClickSaveInventory(void* data) | |||
461 | { | 461 | { |
462 | LLGroupNotifyBox* self = (LLGroupNotifyBox*)data; | 462 | LLGroupNotifyBox* self = (LLGroupNotifyBox*)data; |
463 | 463 | ||
464 | inventory_offer_callback( 0 , self->mInventoryOffer); | 464 | inventory_offer_callback( IOR_ACCEPT , self->mInventoryOffer); |
465 | 465 | ||
466 | // inventory_offer_callback will delete the offer, so make sure we aren't still pointing to it. | 466 | // inventory_offer_callback will delete the offer, so make sure we aren't still pointing to it. |
467 | self->mInventoryOffer = NULL; | 467 | self->mInventoryOffer = NULL; |
diff --git a/linden/indra/newview/llhoverview.cpp b/linden/indra/newview/llhoverview.cpp index 6807b42..8296e14 100644 --- a/linden/indra/newview/llhoverview.cpp +++ b/linden/indra/newview/llhoverview.cpp | |||
@@ -539,7 +539,6 @@ void LLHoverView::updateText() | |||
539 | // on the land info panel | 539 | // on the land info panel |
540 | if ( !hover_parcel->getAllowModify() ) | 540 | if ( !hover_parcel->getAllowModify() ) |
541 | { | 541 | { |
542 | if (words) line->append(", "); | ||
543 | if ( hover_parcel->getAllowGroupModify() ) | 542 | if ( hover_parcel->getAllowGroupModify() ) |
544 | { | 543 | { |
545 | line->append("Group Build"); | 544 | line->append("Group Build"); |
diff --git a/linden/indra/newview/llhudeffecttrail.cpp b/linden/indra/newview/llhudeffecttrail.cpp index fed3a9e..79c05d7 100644 --- a/linden/indra/newview/llhudeffecttrail.cpp +++ b/linden/indra/newview/llhudeffecttrail.cpp | |||
@@ -112,17 +112,19 @@ void LLHUDEffectSpiral::packData(LLMessageSystem *mesgsys) | |||
112 | 112 | ||
113 | void LLHUDEffectSpiral::unpackData(LLMessageSystem *mesgsys, S32 blocknum) | 113 | void LLHUDEffectSpiral::unpackData(LLMessageSystem *mesgsys, S32 blocknum) |
114 | { | 114 | { |
115 | U8 packed_data[56]; | 115 | const size_t EFFECT_SIZE = 56; |
116 | U8 packed_data[EFFECT_SIZE]; | ||
116 | 117 | ||
117 | LLHUDEffect::unpackData(mesgsys, blocknum); | 118 | LLHUDEffect::unpackData(mesgsys, blocknum); |
118 | LLUUID object_id, target_object_id; | 119 | LLUUID object_id, target_object_id; |
119 | S32 size = mesgsys->getSizeFast(_PREHASH_Effect, blocknum, _PREHASH_TypeData); | 120 | S32 size = mesgsys->getSizeFast(_PREHASH_Effect, blocknum, _PREHASH_TypeData); |
120 | if (size != 56) | 121 | if (size != EFFECT_SIZE) |
121 | { | 122 | { |
122 | llwarns << "Spiral effect with bad size " << size << llendl; | 123 | llwarns << "Spiral effect with bad size " << size << llendl; |
123 | return; | 124 | return; |
124 | } | 125 | } |
125 | mesgsys->getBinaryDataFast(_PREHASH_Effect, _PREHASH_TypeData, packed_data, 56, blocknum); | 126 | mesgsys->getBinaryDataFast(_PREHASH_Effect, _PREHASH_TypeData, |
127 | packed_data, EFFECT_SIZE, blocknum, EFFECT_SIZE); | ||
126 | 128 | ||
127 | htonmemcpy(object_id.mData, packed_data, MVT_LLUUID, 16); | 129 | htonmemcpy(object_id.mData, packed_data, MVT_LLUUID, 16); |
128 | htonmemcpy(target_object_id.mData, packed_data + 16, MVT_LLUUID, 16); | 130 | htonmemcpy(target_object_id.mData, packed_data + 16, MVT_LLUUID, 16); |
diff --git a/linden/indra/newview/llimview.cpp b/linden/indra/newview/llimview.cpp index 38471ad..02578d2 100644 --- a/linden/indra/newview/llimview.cpp +++ b/linden/indra/newview/llimview.cpp | |||
@@ -374,11 +374,21 @@ void LLIMView::addMessage( | |||
374 | } | 374 | } |
375 | else | 375 | else |
376 | { | 376 | { |
377 | //if we have recently requsted to be dropped from a session | ||
378 | //but are still receiving messages from the session, don't make | ||
379 | //a new floater | ||
380 | // if ( mSessionsDropRequested.has(session_id.asString()) ) | ||
381 | // { | ||
382 | // return ; | ||
383 | // } | ||
384 | |||
377 | const char* name = from; | 385 | const char* name = from; |
378 | if(session_name && (strlen(session_name)>1)) | 386 | if(session_name && (strlen(session_name)>1)) |
379 | { | 387 | { |
380 | name = session_name; | 388 | name = session_name; |
381 | } | 389 | } |
390 | |||
391 | |||
382 | floater = createFloater(new_session_id, other_participant_id, name, dialog, FALSE); | 392 | floater = createFloater(new_session_id, other_participant_id, name, dialog, FALSE); |
383 | 393 | ||
384 | // When we get a new IM, and if you are a god, display a bit | 394 | // When we get a new IM, and if you are a god, display a bit |
@@ -502,13 +512,17 @@ LLUUID LLIMView::addSession(const std::string& name, | |||
502 | LLFloaterIMPanel* floater = findFloaterBySession(session_id); | 512 | LLFloaterIMPanel* floater = findFloaterBySession(session_id); |
503 | if(!floater) | 513 | if(!floater) |
504 | { | 514 | { |
505 | // On creation, use the first element of ids as the "other_participant_id" | 515 | // On creation, use the first element of ids as the |
516 | // "other_participant_id" | ||
506 | floater = createFloater(session_id, | 517 | floater = createFloater(session_id, |
507 | other_participant_id, | 518 | other_participant_id, |
508 | name, | 519 | name, |
509 | ids, | 520 | ids, |
510 | dialog, | 521 | dialog, |
511 | TRUE); | 522 | TRUE); |
523 | |||
524 | if ( !floater ) return LLUUID::null; | ||
525 | |||
512 | noteOfflineUsers(floater, ids); | 526 | noteOfflineUsers(floater, ids); |
513 | } | 527 | } |
514 | mTalkFloater->showFloater(floater); | 528 | mTalkFloater->showFloater(floater); |
@@ -528,6 +542,11 @@ void LLIMView::removeSession(const LLUUID& session_id) | |||
528 | mTalkFloater->removeFloater(floater); | 542 | mTalkFloater->removeFloater(floater); |
529 | //mTabContainer->removeTabPanel(floater); | 543 | //mTabContainer->removeTabPanel(floater); |
530 | } | 544 | } |
545 | |||
546 | // if ( session_id.notNull() ) | ||
547 | // { | ||
548 | // mSessionsDropRequested[session_id.asString()] = LLSD(); | ||
549 | // } | ||
531 | } | 550 | } |
532 | 551 | ||
533 | void LLIMView::refresh() | 552 | void LLIMView::refresh() |
@@ -705,6 +724,7 @@ LLFloaterIMPanel* LLIMView::createFloater( | |||
705 | { | 724 | { |
706 | llwarns << "Creating LLFloaterIMPanel with null session ID" << llendl; | 725 | llwarns << "Creating LLFloaterIMPanel with null session ID" << llendl; |
707 | } | 726 | } |
727 | |||
708 | llinfos << "LLIMView::createFloater: from " << other_participant_id | 728 | llinfos << "LLIMView::createFloater: from " << other_participant_id |
709 | << " in session " << session_id << llendl; | 729 | << " in session " << session_id << llendl; |
710 | LLFloaterIMPanel* floater = new LLFloaterIMPanel(session_label, | 730 | LLFloaterIMPanel* floater = new LLFloaterIMPanel(session_label, |
@@ -731,6 +751,7 @@ LLFloaterIMPanel* LLIMView::createFloater( | |||
731 | { | 751 | { |
732 | llwarns << "Creating LLFloaterIMPanel with null session ID" << llendl; | 752 | llwarns << "Creating LLFloaterIMPanel with null session ID" << llendl; |
733 | } | 753 | } |
754 | |||
734 | llinfos << "LLIMView::createFloater: from " << other_participant_id | 755 | llinfos << "LLIMView::createFloater: from " << other_participant_id |
735 | << " in session " << session_id << llendl; | 756 | << " in session " << session_id << llendl; |
736 | LLFloaterIMPanel* floater = new LLFloaterIMPanel(session_label, | 757 | LLFloaterIMPanel* floater = new LLFloaterIMPanel(session_label, |
@@ -805,6 +826,11 @@ void LLIMView::updateFloaterSessionID(const LLUUID& old_session_id, | |||
805 | } | 826 | } |
806 | } | 827 | } |
807 | 828 | ||
829 | void LLIMView::onDropRequestReplyReceived(const LLUUID& session_id) | ||
830 | { | ||
831 | mSessionsDropRequested.erase(session_id.asString()); | ||
832 | } | ||
833 | |||
808 | void onConfirmForceCloseError(S32 option, void* data) | 834 | void onConfirmForceCloseError(S32 option, void* data) |
809 | { | 835 | { |
810 | //only 1 option really | 836 | //only 1 option really |
@@ -869,7 +895,7 @@ public: | |||
869 | 895 | ||
870 | class LLViewerIMSessionEventReply : public LLHTTPNode | 896 | class LLViewerIMSessionEventReply : public LLHTTPNode |
871 | { | 897 | { |
872 | public: | 898 | public: |
873 | virtual void describe(Description& desc) const | 899 | virtual void describe(Description& desc) const |
874 | { | 900 | { |
875 | desc.shortInfo("Used for receiving a reply to a IM session event"); | 901 | desc.shortInfo("Used for receiving a reply to a IM session event"); |
@@ -913,7 +939,7 @@ class LLViewerIMSessionEventReply : public LLHTTPNode | |||
913 | 939 | ||
914 | class LLViewerForceCloseIMSession: public LLHTTPNode | 940 | class LLViewerForceCloseIMSession: public LLHTTPNode |
915 | { | 941 | { |
916 | 942 | public: | |
917 | virtual void post(ResponsePtr response, | 943 | virtual void post(ResponsePtr response, |
918 | const LLSD& context, | 944 | const LLSD& context, |
919 | const LLSD& input) const | 945 | const LLSD& input) const |
@@ -942,11 +968,40 @@ class LLViewerForceCloseIMSession: public LLHTTPNode | |||
942 | } | 968 | } |
943 | }; | 969 | }; |
944 | 970 | ||
971 | class LLViewerIMSessionDropReply : public LLHTTPNode | ||
972 | { | ||
973 | public: | ||
974 | virtual void post(ResponsePtr response, | ||
975 | const LLSD& context, | ||
976 | const LLSD& input) const | ||
977 | { | ||
978 | LLUUID session_id; | ||
979 | bool success; | ||
980 | |||
981 | success = input["body"]["success"].asBoolean(); | ||
982 | session_id = input["body"]["session_id"].asUUID(); | ||
983 | |||
984 | if ( !success ) | ||
985 | { | ||
986 | //throw an error alert? | ||
987 | } | ||
988 | |||
989 | gIMView->onDropRequestReplyReceived(session_id); | ||
990 | } | ||
991 | }; | ||
992 | |||
945 | LLHTTPRegistration<LLViewerIMSessionStartReply> | 993 | LLHTTPRegistration<LLViewerIMSessionStartReply> |
946 | gHTTPRegistrationMessageImsessionstartreply("/message/IMSessionStartReply"); | 994 | gHTTPRegistrationMessageImsessionstartreply( |
995 | "/message/IMSessionStartReply"); | ||
947 | 996 | ||
948 | LLHTTPRegistration<LLViewerIMSessionEventReply> | 997 | LLHTTPRegistration<LLViewerIMSessionEventReply> |
949 | gHTTPRegistrationMessageImsessioneventreply("/message/IMSessionEventReply"); | 998 | gHTTPRegistrationMessageImsessioneventreply( |
999 | "/message/IMSessionEventReply"); | ||
950 | 1000 | ||
951 | LLHTTPRegistration<LLViewerForceCloseIMSession> | 1001 | LLHTTPRegistration<LLViewerForceCloseIMSession> |
952 | gHTTPRegistrationMessageForceCloseImSession("/message/ForceCloseIMSession"); | 1002 | gHTTPRegistrationMessageForceCloseImSession( |
1003 | "/message/ForceCloseIMSession"); | ||
1004 | |||
1005 | LLHTTPRegistration<LLViewerIMSessionDropReply> | ||
1006 | gHTTPRegistrationMessageImSessionDropReply( | ||
1007 | "/message/IMSessionDropReply"); | ||
diff --git a/linden/indra/newview/llimview.h b/linden/indra/newview/llimview.h index 74ea880..c0b0f79 100644 --- a/linden/indra/newview/llimview.h +++ b/linden/indra/newview/llimview.h | |||
@@ -131,6 +131,8 @@ public: | |||
131 | // is no matching panel. | 131 | // is no matching panel. |
132 | LLFloaterIMPanel* findFloaterBySession(const LLUUID& session_id); | 132 | LLFloaterIMPanel* findFloaterBySession(const LLUUID& session_id); |
133 | 133 | ||
134 | void onDropRequestReplyReceived(const LLUUID& session_id); | ||
135 | |||
134 | private: | 136 | private: |
135 | // create a panel and update internal representation for | 137 | // create a panel and update internal representation for |
136 | // consistency. Returns the pointer, caller (the class instance | 138 | // consistency. Returns the pointer, caller (the class instance |
@@ -167,6 +169,8 @@ private: | |||
167 | 169 | ||
168 | // An IM has been received that you haven't seen yet. | 170 | // An IM has been received that you haven't seen yet. |
169 | BOOL mIMReceived; | 171 | BOOL mIMReceived; |
172 | |||
173 | LLSD mSessionsDropRequested; | ||
170 | }; | 174 | }; |
171 | 175 | ||
172 | 176 | ||
diff --git a/linden/indra/newview/llinventoryactions.cpp b/linden/indra/newview/llinventoryactions.cpp index 6452c87..900a729 100644 --- a/linden/indra/newview/llinventoryactions.cpp +++ b/linden/indra/newview/llinventoryactions.cpp | |||
@@ -491,6 +491,23 @@ class LLSetSortBy : public inventory_listener_t | |||
491 | } | 491 | } |
492 | mPtr->getActivePanel()->setSortOrder( order ); | 492 | mPtr->getActivePanel()->setSortOrder( order ); |
493 | } | 493 | } |
494 | else if (sort_field == "systemfolderstotop") | ||
495 | { | ||
496 | U32 order = mPtr->getActivePanel()->getSortOrder(); | ||
497 | if ( order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP ) | ||
498 | { | ||
499 | order &= ~LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP; | ||
500 | |||
501 | mPtr->getControl("Inventory.SystemFoldersToTop")->setValue( FALSE ); | ||
502 | } | ||
503 | else | ||
504 | { | ||
505 | order |= LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP; | ||
506 | |||
507 | mPtr->getControl("Inventory.SystemFoldersToTop")->setValue( TRUE ); | ||
508 | } | ||
509 | mPtr->getActivePanel()->setSortOrder( order ); | ||
510 | } | ||
494 | 511 | ||
495 | return true; | 512 | return true; |
496 | } | 513 | } |
diff --git a/linden/indra/newview/llinventorybridge.cpp b/linden/indra/newview/llinventorybridge.cpp index 05334d7..a7b80ae 100644 --- a/linden/indra/newview/llinventorybridge.cpp +++ b/linden/indra/newview/llinventorybridge.cpp | |||
@@ -569,10 +569,10 @@ const char* safe_inv_type_lookup(LLInventoryType::EType inv_type) | |||
569 | } | 569 | } |
570 | 570 | ||
571 | LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type, | 571 | LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type, |
572 | LLInventoryType::EType inv_type, | 572 | LLInventoryType::EType inv_type, |
573 | LLInventoryPanel* inventory, | 573 | LLInventoryPanel* inventory, |
574 | const LLUUID& uuid, | 574 | const LLUUID& uuid, |
575 | U32 flags) | 575 | U32 flags) |
576 | { | 576 | { |
577 | LLInvFVBridge* new_listener = NULL; | 577 | LLInvFVBridge* new_listener = NULL; |
578 | switch(asset_type) | 578 | switch(asset_type) |
@@ -677,7 +677,11 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type, | |||
677 | break; | 677 | break; |
678 | } | 678 | } |
679 | 679 | ||
680 | new_listener->mInvType = inv_type; | 680 | if (new_listener) |
681 | { | ||
682 | new_listener->mInvType = inv_type; | ||
683 | } | ||
684 | |||
681 | return new_listener; | 685 | return new_listener; |
682 | } | 686 | } |
683 | 687 | ||
@@ -907,16 +911,20 @@ BOOL LLItemBridge::removeItem() | |||
907 | if(!model) return FALSE; | 911 | if(!model) return FALSE; |
908 | LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); | 912 | LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); |
909 | LLViewerInventoryItem* item = getItem(); | 913 | LLViewerInventoryItem* item = getItem(); |
910 | if(item) | 914 | |
915 | // if item is not already in trash | ||
916 | if(item && !model->isObjectDescendentOf(mUUID, trash_id)) | ||
911 | { | 917 | { |
912 | // restamp on move to trash. | 918 | // move to trash, and restamp |
913 | LLInvFVBridge::changeItemParent(model, item, trash_id, TRUE); | 919 | LLInvFVBridge::changeItemParent(model, item, trash_id, TRUE); |
920 | // delete was successful | ||
921 | return TRUE; | ||
922 | } | ||
923 | else | ||
924 | { | ||
925 | // tried to delete already item in trash (should purge?) | ||
926 | return FALSE; | ||
914 | } | 927 | } |
915 | |||
916 | // return false anyway, so that if it's called from the folder | ||
917 | // view, it doesn't remove the view - it's just being moved to the | ||
918 | // trash. | ||
919 | return FALSE; | ||
920 | } | 928 | } |
921 | 929 | ||
922 | BOOL LLItemBridge::isItemCopyable() const | 930 | BOOL LLItemBridge::isItemCopyable() const |
@@ -1462,11 +1470,20 @@ void LLInventoryCopyAndWearObserver::changed(U32 mask) | |||
1462 | { | 1470 | { |
1463 | LLViewerInventoryCategory* category = gInventory.getCategory(mCatID); | 1471 | LLViewerInventoryCategory* category = gInventory.getCategory(mCatID); |
1464 | 1472 | ||
1465 | if (category->getDescendentCount() == mContentsCount) | 1473 | if (NULL == category) |
1466 | { | 1474 | { |
1467 | gInventory.removeObserver(this); | 1475 | llwarns << "gInventory.getCategory(" << mCatID |
1468 | wear_inventory_category(category, FALSE, TRUE); | 1476 | << ") was NULL" << llendl; |
1469 | delete this; | 1477 | } |
1478 | else | ||
1479 | { | ||
1480 | if (category->getDescendentCount() == | ||
1481 | mContentsCount) | ||
1482 | { | ||
1483 | gInventory.removeObserver(this); | ||
1484 | wear_inventory_category(category, FALSE, TRUE); | ||
1485 | delete this; | ||
1486 | } | ||
1470 | } | 1487 | } |
1471 | } | 1488 | } |
1472 | 1489 | ||
@@ -1682,11 +1699,7 @@ BOOL LLFolderBridge::removeItem() | |||
1682 | LLInvFVBridge::changeCategoryParent(model, cat, trash_id, TRUE); | 1699 | LLInvFVBridge::changeCategoryParent(model, cat, trash_id, TRUE); |
1683 | } | 1700 | } |
1684 | 1701 | ||
1685 | // return false anyway, so that if it's called from the folder | 1702 | return TRUE; |
1686 | // view, it doesn't remove the view - it's just being moved to the | ||
1687 | // trash. | ||
1688 | return FALSE; | ||
1689 | |||
1690 | } | 1703 | } |
1691 | 1704 | ||
1692 | BOOL LLFolderBridge::isClipboardPasteable() const | 1705 | BOOL LLFolderBridge::isClipboardPasteable() const |
@@ -2178,10 +2191,13 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, | |||
2178 | // everything in the active window so that we don't follow | 2191 | // everything in the active window so that we don't follow |
2179 | // the selection to its new location (which is very | 2192 | // the selection to its new location (which is very |
2180 | // annoying). | 2193 | // annoying). |
2181 | LLInventoryPanel* active_panel = LLInventoryView::getActiveInventory()->getPanel(); | 2194 | if (LLInventoryView::getActiveInventory()) |
2182 | if (mInventoryPanel != active_panel) | ||
2183 | { | 2195 | { |
2184 | active_panel->unSelectAll(); | 2196 | LLInventoryPanel* active_panel = LLInventoryView::getActiveInventory()->getPanel(); |
2197 | if (active_panel && (mInventoryPanel != active_panel)) | ||
2198 | { | ||
2199 | active_panel->unSelectAll(); | ||
2200 | } | ||
2185 | } | 2201 | } |
2186 | 2202 | ||
2187 | // restamp if the move is into the trash. | 2203 | // restamp if the move is into the trash. |
@@ -3117,7 +3133,16 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model | |||
3117 | gMessageSystem->sendReliable( gAgent.getRegion()->getHost() ); | 3133 | gMessageSystem->sendReliable( gAgent.getRegion()->getHost() ); |
3118 | } | 3134 | } |
3119 | // this object might have been selected, so let the selection manager know it's gone now | 3135 | // this object might have been selected, so let the selection manager know it's gone now |
3120 | gSelectMgr->remove(gObjectList.findObject(item->getUUID())); | 3136 | LLViewerObject *found_obj = |
3137 | gObjectList.findObject(item->getUUID()); | ||
3138 | if (found_obj) | ||
3139 | { | ||
3140 | gSelectMgr->remove(found_obj); | ||
3141 | } | ||
3142 | else | ||
3143 | { | ||
3144 | llwarns << "object not found - ignoring" << llendl; | ||
3145 | } | ||
3121 | } | 3146 | } |
3122 | else LLItemBridge::performAction(folder, model, action); | 3147 | else LLItemBridge::performAction(folder, model, action); |
3123 | } | 3148 | } |
@@ -4027,7 +4052,15 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, void* userdata) | |||
4027 | gMessageSystem->sendReliable( gAgent.getRegion()->getHost() ); | 4052 | gMessageSystem->sendReliable( gAgent.getRegion()->getHost() ); |
4028 | 4053 | ||
4029 | // this object might have been selected, so let the selection manager know it's gone now | 4054 | // this object might have been selected, so let the selection manager know it's gone now |
4030 | gSelectMgr->remove(gObjectList.findObject( obj_item_array.get(i)->getUUID()) ); | 4055 | LLViewerObject *found_obj = gObjectList.findObject( obj_item_array.get(i)->getUUID()); |
4056 | if (found_obj) | ||
4057 | { | ||
4058 | gSelectMgr->remove(found_obj); | ||
4059 | } | ||
4060 | else | ||
4061 | { | ||
4062 | llwarns << "object not found, ignoring" << llendl; | ||
4063 | } | ||
4031 | } | 4064 | } |
4032 | } | 4065 | } |
4033 | 4066 | ||
diff --git a/linden/indra/newview/llinventorybridge.h b/linden/indra/newview/llinventorybridge.h index 1269fa2..1269fa2 100755..100644 --- a/linden/indra/newview/llinventorybridge.h +++ b/linden/indra/newview/llinventorybridge.h | |||
diff --git a/linden/indra/newview/llinventorymodel.cpp b/linden/indra/newview/llinventorymodel.cpp index ddd229b..8e95156 100644 --- a/linden/indra/newview/llinventorymodel.cpp +++ b/linden/indra/newview/llinventorymodel.cpp | |||
@@ -27,6 +27,7 @@ | |||
27 | */ | 27 | */ |
28 | 28 | ||
29 | #include "llviewerprecompiledheaders.h" | 29 | #include "llviewerprecompiledheaders.h" |
30 | |||
30 | #include "llinventorymodel.h" | 31 | #include "llinventorymodel.h" |
31 | 32 | ||
32 | #include "llassetstorage.h" | 33 | #include "llassetstorage.h" |
@@ -41,6 +42,7 @@ | |||
41 | #include "llfocusmgr.h" | 42 | #include "llfocusmgr.h" |
42 | #include "llinventoryview.h" | 43 | #include "llinventoryview.h" |
43 | #include "llviewerinventory.h" | 44 | #include "llviewerinventory.h" |
45 | #include "llviewermessage.h" | ||
44 | #include "llviewerwindow.h" | 46 | #include "llviewerwindow.h" |
45 | #include "viewer.h" | 47 | #include "viewer.h" |
46 | #include "lldbstrings.h" | 48 | #include "lldbstrings.h" |
@@ -2282,7 +2284,7 @@ void LLInventoryModel::processUseCachedInventory(LLMessageSystem* msg, void**) | |||
2282 | void LLInventoryModel::processUpdateCreateInventoryItem(LLMessageSystem* msg, void**) | 2284 | void LLInventoryModel::processUpdateCreateInventoryItem(LLMessageSystem* msg, void**) |
2283 | { | 2285 | { |
2284 | // do accounting and highlight new items if they arrive | 2286 | // do accounting and highlight new items if they arrive |
2285 | if (gInventory.messageUpdateCore(msg, true, true)) | 2287 | if (gInventory.messageUpdateCore(msg, true)) |
2286 | { | 2288 | { |
2287 | U32 callback_id; | 2289 | U32 callback_id; |
2288 | LLUUID item_id; | 2290 | LLUUID item_id; |
@@ -2298,12 +2300,15 @@ void LLInventoryModel::processUpdateCreateInventoryItem(LLMessageSystem* msg, vo | |||
2298 | void LLInventoryModel::processFetchInventoryReply(LLMessageSystem* msg, void**) | 2300 | void LLInventoryModel::processFetchInventoryReply(LLMessageSystem* msg, void**) |
2299 | { | 2301 | { |
2300 | // no accounting | 2302 | // no accounting |
2301 | gInventory.messageUpdateCore(msg, false, false); | 2303 | gInventory.messageUpdateCore(msg, false); |
2302 | } | 2304 | } |
2303 | 2305 | ||
2304 | 2306 | ||
2305 | bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account, bool highlight_new) | 2307 | bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account) |
2306 | { | 2308 | { |
2309 | //make sure our added inventory observer is active -Gigs | ||
2310 | start_new_inventory_observer(); | ||
2311 | |||
2307 | LLUUID agent_id; | 2312 | LLUUID agent_id; |
2308 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); | 2313 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); |
2309 | if(agent_id != gAgent.getID()) | 2314 | if(agent_id != gAgent.getID()) |
@@ -2312,16 +2317,15 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account, boo | |||
2312 | << llendl; | 2317 | << llendl; |
2313 | return false; | 2318 | return false; |
2314 | } | 2319 | } |
2315 | LLPointer<LLViewerInventoryItem> lastitem; // hack | ||
2316 | item_array_t items; | 2320 | item_array_t items; |
2317 | update_map_t update; | 2321 | update_map_t update; |
2318 | S32 count = msg->getNumberOfBlocksFast(_PREHASH_InventoryData); | 2322 | S32 count = msg->getNumberOfBlocksFast(_PREHASH_InventoryData); |
2319 | bool all_one_folder = true; | 2323 | bool all_one_folder = true; |
2320 | LLUUID folder_id; | 2324 | LLUUID folder_id; |
2325 | // Does this loop ever execute more than once? -Gigs | ||
2321 | for(S32 i = 0; i < count; ++i) | 2326 | for(S32 i = 0; i < count; ++i) |
2322 | { | 2327 | { |
2323 | LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem; | 2328 | LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem; |
2324 | lastitem = titem; | ||
2325 | titem->unpackMessage(msg, _PREHASH_InventoryData, i); | 2329 | titem->unpackMessage(msg, _PREHASH_InventoryData, i); |
2326 | lldebugs << "LLInventoryModel::messageUpdateCore() item id:" | 2330 | lldebugs << "LLInventoryModel::messageUpdateCore() item id:" |
2327 | << titem->getUUID() << llendl; | 2331 | << titem->getUUID() << llendl; |
@@ -2359,6 +2363,7 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account, boo | |||
2359 | } | 2363 | } |
2360 | 2364 | ||
2361 | U32 changes = 0x0; | 2365 | U32 changes = 0x0; |
2366 | //as above, this loop never seems to loop more than once per call | ||
2362 | for (item_array_t::iterator it = items.begin(); it != items.end(); ++it) | 2367 | for (item_array_t::iterator it = items.begin(); it != items.end(); ++it) |
2363 | { | 2368 | { |
2364 | changes |= gInventory.updateItem(*it); | 2369 | changes |= gInventory.updateItem(*it); |
@@ -2366,88 +2371,6 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account, boo | |||
2366 | gInventory.notifyObservers(); | 2371 | gInventory.notifyObservers(); |
2367 | gViewerWindow->getWindow()->decBusyCount(); | 2372 | gViewerWindow->getWindow()->decBusyCount(); |
2368 | 2373 | ||
2369 | // *HACK: Do the 'show' logic for a new item in the inventory if | ||
2370 | // it is a newly created item. | ||
2371 | if (highlight_new | ||
2372 | && (changes & LLInventoryObserver::ADD) == LLInventoryObserver::ADD) | ||
2373 | { | ||
2374 | LLUUID trash_id; | ||
2375 | trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); | ||
2376 | if(!gInventory.isObjectDescendentOf(lastitem->getUUID(), trash_id)) | ||
2377 | { | ||
2378 | LLMultiPreview* multi_previewp = LLMultiPreview::getAutoOpenInstance(folder_id); | ||
2379 | if (!multi_previewp && all_one_folder && count > 1) | ||
2380 | { | ||
2381 | S32 left, top; | ||
2382 | gFloaterView->getNewFloaterPosition(&left, &top); | ||
2383 | |||
2384 | multi_previewp = new LLMultiPreview(LLRect(left, top, left + 300, top - 100)); | ||
2385 | LLMultiPreview::setAutoOpenInstance(multi_previewp, folder_id); | ||
2386 | } | ||
2387 | |||
2388 | LLFloater::setFloaterHost(multi_previewp); | ||
2389 | |||
2390 | bool show_keep_discard = lastitem->getPermissions().getCreator() != gAgent.getID(); | ||
2391 | switch(lastitem->getType()) | ||
2392 | { | ||
2393 | case LLAssetType::AT_NOTECARD: | ||
2394 | open_notecard( | ||
2395 | lastitem->getUUID(), | ||
2396 | LLString("Note: ") + lastitem->getName(), | ||
2397 | show_keep_discard, | ||
2398 | LLUUID::null, | ||
2399 | FALSE); | ||
2400 | break; | ||
2401 | case LLAssetType::AT_LANDMARK: | ||
2402 | open_landmark( | ||
2403 | lastitem->getUUID(), | ||
2404 | LLString(" ") + lastitem->getName(), | ||
2405 | show_keep_discard, | ||
2406 | LLUUID::null, | ||
2407 | FALSE); | ||
2408 | break; | ||
2409 | case LLAssetType::AT_TEXTURE: | ||
2410 | open_texture( | ||
2411 | lastitem->getUUID(), | ||
2412 | LLString("Texture: ") + lastitem->getName(), | ||
2413 | show_keep_discard, | ||
2414 | LLUUID::null, | ||
2415 | FALSE); | ||
2416 | break; | ||
2417 | default: | ||
2418 | break; | ||
2419 | } | ||
2420 | |||
2421 | LLFloater::setFloaterHost(NULL); | ||
2422 | if (multi_previewp) | ||
2423 | { | ||
2424 | multi_previewp->open(); | ||
2425 | } | ||
2426 | |||
2427 | LLInventoryView* view = LLInventoryView::getActiveInventory(); | ||
2428 | if(view) | ||
2429 | { | ||
2430 | LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); | ||
2431 | BOOL inventory_has_focus = gFocusMgr.childHasKeyboardFocus(view); | ||
2432 | BOOL user_is_away = gAwayTimer.getStarted(); | ||
2433 | |||
2434 | // don't select lost and found items if an active user is working in the inventory | ||
2435 | if (!gInventory.isObjectDescendentOf(lastitem->getUUID(), lost_and_found_id) || | ||
2436 | !inventory_has_focus || | ||
2437 | user_is_away) | ||
2438 | { | ||
2439 | LLUICtrl* focus_ctrl = gFocusMgr.getKeyboardFocus(); | ||
2440 | LLFocusMgr::FocusLostCallback callback = gFocusMgr.getFocusCallback(); | ||
2441 | view->getPanel()->setSelection(lastitem->getUUID(), TAKE_FOCUS_NO); | ||
2442 | // HACK to open inventory offers that are | ||
2443 | // accepted. This information really needs to | ||
2444 | // flow through the instant messages and | ||
2445 | // inventory restore keyboard focus | ||
2446 | gFocusMgr.setKeyboardFocus(focus_ctrl, callback); | ||
2447 | } | ||
2448 | } | ||
2449 | } | ||
2450 | } | ||
2451 | return true; | 2374 | return true; |
2452 | } | 2375 | } |
2453 | 2376 | ||
@@ -3452,6 +3375,43 @@ void LLInventoryExistenceObserver::changed(U32 mask) | |||
3452 | } | 3375 | } |
3453 | } | 3376 | } |
3454 | 3377 | ||
3378 | void LLInventoryAddedObserver::changed(U32 mask) | ||
3379 | { | ||
3380 | if(!(mask & LLInventoryObserver::ADD)) | ||
3381 | { | ||
3382 | return; | ||
3383 | } | ||
3384 | |||
3385 | // *HACK: If this was in response to a packet off | ||
3386 | // the network, figure out which item was updated. | ||
3387 | // Code from Gigs Taggert, sin allowed by JC. | ||
3388 | LLMessageSystem* msg = gMessageSystem; | ||
3389 | const char* msg_name = msg->getMessageName(); | ||
3390 | if (!msg_name) return; | ||
3391 | |||
3392 | // We only want newly created inventory items. JC | ||
3393 | if ( strcmp(msg_name, "UpdateCreateInventoryItem") ) | ||
3394 | { | ||
3395 | return; | ||
3396 | } | ||
3397 | |||
3398 | LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem; | ||
3399 | S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_InventoryData); | ||
3400 | for(S32 i = 0; i < num_blocks; ++i) | ||
3401 | { | ||
3402 | titem->unpackMessage(msg, _PREHASH_InventoryData, i); | ||
3403 | if (!(titem->getUUID().isNull())) | ||
3404 | { | ||
3405 | //we don't do anything with null keys | ||
3406 | mAdded.push_back(titem->getUUID()); | ||
3407 | } | ||
3408 | } | ||
3409 | if (!mAdded.empty()) | ||
3410 | { | ||
3411 | done(); | ||
3412 | } | ||
3413 | } | ||
3414 | |||
3455 | LLInventoryTransactionObserver::LLInventoryTransactionObserver( | 3415 | LLInventoryTransactionObserver::LLInventoryTransactionObserver( |
3456 | const LLTransactionID& transaction_id) : | 3416 | const LLTransactionID& transaction_id) : |
3457 | mTransactionID(transaction_id) | 3417 | mTransactionID(transaction_id) |
diff --git a/linden/indra/newview/llinventorymodel.h b/linden/indra/newview/llinventorymodel.h index 9867842..78ab0e3 100644 --- a/linden/indra/newview/llinventorymodel.h +++ b/linden/indra/newview/llinventorymodel.h | |||
@@ -29,10 +29,8 @@ | |||
29 | #ifndef LL_LLINVENTORYMODEL_H | 29 | #ifndef LL_LLINVENTORYMODEL_H |
30 | #define LL_LLINVENTORYMODEL_H | 30 | #define LL_LLINVENTORYMODEL_H |
31 | 31 | ||
32 | #include "llassetstorage.h" | 32 | #include "llassettype.h" |
33 | #include "lldarray.h" | 33 | #include "lldarray.h" |
34 | //#include "llskiplist.h" | ||
35 | //#include "llptrskipmap.h" | ||
36 | #include "lluuid.h" | 34 | #include "lluuid.h" |
37 | #include "llpermissionsflags.h" | 35 | #include "llpermissionsflags.h" |
38 | #include "llstring.h" | 36 | #include "llstring.h" |
@@ -387,7 +385,7 @@ protected: | |||
387 | static void processMoveInventoryItem(LLMessageSystem* msg, void**); | 385 | static void processMoveInventoryItem(LLMessageSystem* msg, void**); |
388 | static void processFetchInventoryReply(LLMessageSystem* msg, void**); | 386 | static void processFetchInventoryReply(LLMessageSystem* msg, void**); |
389 | 387 | ||
390 | bool messageUpdateCore(LLMessageSystem* msg, bool do_accounting, bool highlight_new); | 388 | bool messageUpdateCore(LLMessageSystem* msg, bool do_accounting); |
391 | 389 | ||
392 | protected: | 390 | protected: |
393 | // Varaibles used to track what has changed since the last notify. | 391 | // Varaibles used to track what has changed since the last notify. |
@@ -751,6 +749,29 @@ protected: | |||
751 | }; | 749 | }; |
752 | 750 | ||
753 | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 751 | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
752 | // Class LLInventoryAddedObserver | ||
753 | // | ||
754 | // This class is used as a base class for doing something when | ||
755 | // a new item arrives in inventory. | ||
756 | // It does not watch for a certain UUID, rather it acts when anything is added | ||
757 | // Derive a class from this class and implement the done() method to do | ||
758 | // something useful. | ||
759 | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
760 | |||
761 | class LLInventoryAddedObserver : public LLInventoryObserver | ||
762 | { | ||
763 | public: | ||
764 | LLInventoryAddedObserver() : mAdded() {} | ||
765 | virtual void changed(U32 mask); | ||
766 | |||
767 | protected: | ||
768 | virtual void done() = 0; | ||
769 | |||
770 | typedef std::vector<LLUUID> item_ref_t; | ||
771 | item_ref_t mAdded; | ||
772 | }; | ||
773 | |||
774 | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
754 | // Class LLInventoryTransactionObserver | 775 | // Class LLInventoryTransactionObserver |
755 | // | 776 | // |
756 | // Class which can be used as a base class for doing something when an | 777 | // Class which can be used as a base class for doing something when an |
diff --git a/linden/indra/newview/llinventoryview.cpp b/linden/indra/newview/llinventoryview.cpp index 900b145..bb70ea4 100644 --- a/linden/indra/newview/llinventoryview.cpp +++ b/linden/indra/newview/llinventoryview.cpp | |||
@@ -451,11 +451,13 @@ void LLInventoryView::init(LLInventoryModel* inventory) | |||
451 | U32 sort_order = gSavedSettings.getU32("InventorySortOrder"); | 451 | U32 sort_order = gSavedSettings.getU32("InventorySortOrder"); |
452 | BOOL sort_by_name = ! ( sort_order & LLInventoryFilter::SO_DATE ); | 452 | BOOL sort_by_name = ! ( sort_order & LLInventoryFilter::SO_DATE ); |
453 | BOOL sort_folders_by_name = ( sort_order & LLInventoryFilter::SO_FOLDERS_BY_NAME ); | 453 | BOOL sort_folders_by_name = ( sort_order & LLInventoryFilter::SO_FOLDERS_BY_NAME ); |
454 | BOOL sort_system_folders_to_top = ( sort_order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP ); | ||
454 | 455 | ||
455 | addBoolControl("Inventory.ShowFilters", FALSE); | 456 | addBoolControl("Inventory.ShowFilters", FALSE); |
456 | addBoolControl("Inventory.SortByName", sort_by_name ); | 457 | addBoolControl("Inventory.SortByName", sort_by_name ); |
457 | addBoolControl("Inventory.SortByDate", ! sort_by_name ); | 458 | addBoolControl("Inventory.SortByDate", ! sort_by_name ); |
458 | addBoolControl("Inventory.FoldersAlwaysByName", sort_folders_by_name ); | 459 | addBoolControl("Inventory.FoldersAlwaysByName", sort_folders_by_name ); |
460 | addBoolControl("Inventory.SystemFoldersToTop", sort_system_folders_to_top ); | ||
459 | 461 | ||
460 | mSavedFolderState = new LLSaveFolderState(); | 462 | mSavedFolderState = new LLSaveFolderState(); |
461 | mSavedFolderState->setApply(FALSE); | 463 | mSavedFolderState->setApply(FALSE); |
@@ -637,20 +639,24 @@ void LLInventoryView::onClose(bool app_quitting) | |||
637 | BOOL LLInventoryView::handleKeyHere(KEY key, MASK mask, BOOL called_from_parent) | 639 | BOOL LLInventoryView::handleKeyHere(KEY key, MASK mask, BOOL called_from_parent) |
638 | { | 640 | { |
639 | LLFolderView* root_folder = mActivePanel ? mActivePanel->getRootFolder() : NULL; | 641 | LLFolderView* root_folder = mActivePanel ? mActivePanel->getRootFolder() : NULL; |
640 | // first check for user accepting current search results | 642 | if (root_folder) |
641 | if (!called_from_parent && root_folder&& | ||
642 | mSearchEditor && mSearchEditor->hasFocus() && | ||
643 | (key == KEY_RETURN || key == KEY_DOWN) && mask == MASK_NONE) | ||
644 | { | ||
645 | // move focus to inventory proper | ||
646 | root_folder->setFocus(TRUE); | ||
647 | root_folder->scrollToShowSelection(); | ||
648 | return TRUE; | ||
649 | } | ||
650 | |||
651 | if (root_folder->hasFocus() && key == KEY_UP) | ||
652 | { | 643 | { |
653 | startSearch(); | 644 | // first check for user accepting current search results |
645 | if (!called_from_parent | ||
646 | && mSearchEditor && mSearchEditor->hasFocus() | ||
647 | && (key == KEY_RETURN || key == KEY_DOWN) | ||
648 | && mask == MASK_NONE) | ||
649 | { | ||
650 | // move focus to inventory proper | ||
651 | root_folder->setFocus(TRUE); | ||
652 | root_folder->scrollToShowSelection(); | ||
653 | return TRUE; | ||
654 | } | ||
655 | |||
656 | if (root_folder->hasFocus() && key == KEY_UP) | ||
657 | { | ||
658 | startSearch(); | ||
659 | } | ||
654 | } | 660 | } |
655 | 661 | ||
656 | return LLFloater::handleKeyHere(key, mask, called_from_parent); | 662 | return LLFloater::handleKeyHere(key, mask, called_from_parent); |
@@ -1364,11 +1370,13 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id) | |||
1364 | S32 count; | 1370 | S32 count; |
1365 | 1371 | ||
1366 | if (objectp) | 1372 | if (objectp) |
1367 | { | 1373 | { |
1368 | if (objectp->getType() == LLAssetType::AT_NONE) | 1374 | if (objectp->getType() <= LLAssetType::AT_NONE || |
1375 | objectp->getType() >= LLAssetType::AT_COUNT) | ||
1369 | { | 1376 | { |
1370 | llwarns << "LLInventoryPanel::buildNewViews called with objectp->mType == AT_NONE (shouldn't happen)" << llendl; | 1377 | llwarns << "LLInventoryPanel::buildNewViews called with objectp->mType == " |
1371 | itemp = NULL; | 1378 | << ((S32) objectp->getType()) |
1379 | << " (shouldn't happen)" << llendl; | ||
1372 | } | 1380 | } |
1373 | else if (objectp->getType() == LLAssetType::AT_CATEGORY) // build new view for category | 1381 | else if (objectp->getType() == LLAssetType::AT_CATEGORY) // build new view for category |
1374 | { | 1382 | { |
@@ -1377,19 +1385,16 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id) | |||
1377 | this, | 1385 | this, |
1378 | objectp->getUUID()); | 1386 | objectp->getUUID()); |
1379 | 1387 | ||
1380 | LLFolderViewFolder* folderp = new LLFolderViewFolder(new_listener->getDisplayName(), | 1388 | if (new_listener) |
1381 | new_listener->getIcon(), | ||
1382 | mFolders, | ||
1383 | new_listener); | ||
1384 | if (!(mFolders->getSortOrder() & LLInventoryFilter::SO_DATE)) | ||
1385 | { | ||
1386 | folderp->setItemSortFunction(sort_item_name); | ||
1387 | } | ||
1388 | else | ||
1389 | { | 1389 | { |
1390 | folderp->setItemSortFunction(sort_item_date); | 1390 | LLFolderViewFolder* folderp = new LLFolderViewFolder(new_listener->getDisplayName(), |
1391 | new_listener->getIcon(), | ||
1392 | mFolders, | ||
1393 | new_listener); | ||
1394 | |||
1395 | folderp->setItemSortOrder(mFolders->getSortOrder()); | ||
1396 | itemp = folderp; | ||
1391 | } | 1397 | } |
1392 | itemp = folderp; | ||
1393 | } | 1398 | } |
1394 | else // build new view for item | 1399 | else // build new view for item |
1395 | { | 1400 | { |
@@ -1400,11 +1405,14 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id) | |||
1400 | this, | 1405 | this, |
1401 | item->getUUID(), | 1406 | item->getUUID(), |
1402 | item->getFlags()); | 1407 | item->getFlags()); |
1403 | itemp = new LLFolderViewItem(new_listener->getDisplayName(), | 1408 | if (new_listener) |
1404 | new_listener->getIcon(), | 1409 | { |
1405 | new_listener->getCreationDate(), | 1410 | itemp = new LLFolderViewItem(new_listener->getDisplayName(), |
1406 | mFolders, | 1411 | new_listener->getIcon(), |
1407 | new_listener); | 1412 | new_listener->getCreationDate(), |
1413 | mFolders, | ||
1414 | new_listener); | ||
1415 | } | ||
1408 | } | 1416 | } |
1409 | 1417 | ||
1410 | LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)mFolders->getItemByID(objectp->getParentUUID()); | 1418 | LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)mFolders->getItemByID(objectp->getParentUUID()); |
diff --git a/linden/indra/newview/llnetmap.cpp b/linden/indra/newview/llnetmap.cpp index 35774cb..2105521 100644 --- a/linden/indra/newview/llnetmap.cpp +++ b/linden/indra/newview/llnetmap.cpp | |||
@@ -103,7 +103,7 @@ LLNetMap::LLNetMap( | |||
103 | LLRect major_dir_rect( 0, DIR_HEIGHT, DIR_WIDTH, 0 ); | 103 | LLRect major_dir_rect( 0, DIR_HEIGHT, DIR_WIDTH, 0 ); |
104 | 104 | ||
105 | mTextBoxNorth = new LLTextBox( "N", major_dir_rect ); | 105 | mTextBoxNorth = new LLTextBox( "N", major_dir_rect ); |
106 | mTextBoxNorth->setDropshadowVisible( TRUE ); | 106 | mTextBoxNorth->setFontStyle(LLFontGL::DROP_SHADOW_SOFT); |
107 | addChild( mTextBoxNorth ); | 107 | addChild( mTextBoxNorth ); |
108 | 108 | ||
109 | LLColor4 minor_color( 1.f, 1.f, 1.f, .7f ); | 109 | LLColor4 minor_color( 1.f, 1.f, 1.f, .7f ); |
diff --git a/linden/indra/newview/llpanelavatar.cpp b/linden/indra/newview/llpanelavatar.cpp index fd25775..9c73dad 100644 --- a/linden/indra/newview/llpanelavatar.cpp +++ b/linden/indra/newview/llpanelavatar.cpp | |||
@@ -1522,40 +1522,43 @@ void LLPanelAvatar::resetGroupList() | |||
1522 | { | 1522 | { |
1523 | return; | 1523 | return; |
1524 | } | 1524 | } |
1525 | LLScrollListCtrl* group_list = LLUICtrlFactory::getScrollListByName(mPanelSecondLife,"groups"); | ||
1526 | 1525 | ||
1527 | if (mPanelSecondLife && group_list) | 1526 | if (mPanelSecondLife) |
1528 | { | 1527 | { |
1529 | group_list->deleteAllItems(); | 1528 | LLScrollListCtrl* group_list = LLUICtrlFactory::getScrollListByName(mPanelSecondLife,"groups"); |
1530 | 1529 | if (group_list) | |
1531 | S32 count = gAgent.mGroups.count(); | ||
1532 | LLUUID id; | ||
1533 | |||
1534 | for(S32 i = 0; i < count; ++i) | ||
1535 | { | 1530 | { |
1536 | LLGroupData group_data = gAgent.mGroups.get(i); | 1531 | group_list->deleteAllItems(); |
1537 | id = group_data.mID; | 1532 | |
1538 | std::string group_string; | 1533 | S32 count = gAgent.mGroups.count(); |
1539 | /* Show group title? DUMMY_POWER for Don Grep | 1534 | LLUUID id; |
1540 | if(group_data.mOfficer) | 1535 | |
1541 | { | 1536 | for(S32 i = 0; i < count; ++i) |
1542 | group_string = "Officer of "; | ||
1543 | } | ||
1544 | else | ||
1545 | { | 1537 | { |
1546 | group_string = "Member of "; | 1538 | LLGroupData group_data = gAgent.mGroups.get(i); |
1547 | } | 1539 | id = group_data.mID; |
1548 | */ | 1540 | std::string group_string; |
1541 | /* Show group title? DUMMY_POWER for Don Grep | ||
1542 | if(group_data.mOfficer) | ||
1543 | { | ||
1544 | group_string = "Officer of "; | ||
1545 | } | ||
1546 | else | ||
1547 | { | ||
1548 | group_string = "Member of "; | ||
1549 | } | ||
1550 | */ | ||
1551 | |||
1552 | group_string += group_data.mName; | ||
1549 | 1553 | ||
1550 | group_string += group_data.mName; | 1554 | LLSD row; |
1551 | 1555 | row["columns"][0]["value"] = group_string; | |
1552 | LLSD row; | 1556 | row["columns"][0]["font"] = "SANSSERIF_SMALL"; |
1553 | row["columns"][0]["value"] = group_string; | 1557 | row["columns"][0]["width"] = 0; |
1554 | row["columns"][0]["font"] = "SANSSERIF_SMALL"; | 1558 | group_list->addElement(row); |
1555 | row["columns"][0]["width"] = 0; | 1559 | } |
1556 | group_list->addElement(row); | 1560 | group_list->sortByColumn(0, TRUE); |
1557 | } | 1561 | } |
1558 | group_list->sortByColumn(0, TRUE); | ||
1559 | } | 1562 | } |
1560 | } | 1563 | } |
1561 | 1564 | ||
diff --git a/linden/indra/newview/llpanelcontents.cpp b/linden/indra/newview/llpanelcontents.cpp index 2265ed5..4d138d4 100644 --- a/linden/indra/newview/llpanelcontents.cpp +++ b/linden/indra/newview/llpanelcontents.cpp | |||
@@ -1,4 +1,4 @@ | |||
1 | /** | 1 | /** |
2 | * @file llpanelcontents.cpp | 2 | * @file llpanelcontents.cpp |
3 | * @brief Object contents panel in the tools floater. | 3 | * @brief Object contents panel in the tools floater. |
4 | * | 4 | * |
@@ -101,21 +101,25 @@ LLPanelContents::~LLPanelContents() | |||
101 | void LLPanelContents::getState(LLViewerObject *objectp ) | 101 | void LLPanelContents::getState(LLViewerObject *objectp ) |
102 | { | 102 | { |
103 | if( !objectp ) | 103 | if( !objectp ) |
104 | { | 104 | { |
105 | childSetEnabled("button new script",FALSE); | 105 | childSetEnabled("button new script",FALSE); |
106 | //mBtnNewScript->setEnabled( FALSE ); | 106 | //mBtnNewScript->setEnabled( FALSE ); |
107 | return; | 107 | return; |
108 | } | 108 | } |
109 | 109 | ||
110 | LLUUID group_id; // used for SL-23488 | ||
111 | gSelectMgr->selectGetGroup(group_id); // sets group_id as a side effect SL-23488 | ||
112 | |||
110 | // BUG? Check for all objects being editable? | 113 | // BUG? Check for all objects being editable? |
111 | BOOL editable = gAgent.isGodlike() | 114 | BOOL editable = gAgent.isGodlike() |
112 | || (objectp->permModify() && objectp->permYouOwner()); | 115 | || (objectp->permModify() |
116 | && ( objectp->permYouOwner() || ( !group_id.isNull() && gAgent.isInGroup(group_id) ))); // solves SL-23488 | ||
113 | BOOL all_volume = gSelectMgr->selectionAllPCode( LL_PCODE_VOLUME ); | 117 | BOOL all_volume = gSelectMgr->selectionAllPCode( LL_PCODE_VOLUME ); |
114 | 118 | ||
115 | // Edit script button - ok if object is editable and there's an | 119 | // Edit script button - ok if object is editable and there's an |
116 | // unambiguous destination for the object. | 120 | // unambiguous destination for the object. |
117 | if( editable && | 121 | if( editable && |
118 | all_volume && | 122 | all_volume && |
119 | ((gSelectMgr->getSelection()->getRootObjectCount() == 1) | 123 | ((gSelectMgr->getSelection()->getRootObjectCount() == 1) |
120 | || (gSelectMgr->getSelection()->getObjectCount() == 1))) | 124 | || (gSelectMgr->getSelection()->getObjectCount() == 1))) |
121 | { | 125 | { |
diff --git a/linden/indra/newview/llpaneldisplay.cpp b/linden/indra/newview/llpaneldisplay.cpp index d22d1c2..d79dcb4 100644 --- a/linden/indra/newview/llpaneldisplay.cpp +++ b/linden/indra/newview/llpaneldisplay.cpp | |||
@@ -448,7 +448,6 @@ LLPanelDisplay2::LLPanelDisplay2() | |||
448 | 448 | ||
449 | BOOL LLPanelDisplay2::postBuild() | 449 | BOOL LLPanelDisplay2::postBuild() |
450 | { | 450 | { |
451 | |||
452 | requires("ani", WIDGET_TYPE_CHECKBOX); | 451 | requires("ani", WIDGET_TYPE_CHECKBOX); |
453 | requires("gamma", WIDGET_TYPE_SPINNER); | 452 | requires("gamma", WIDGET_TYPE_SPINNER); |
454 | requires("vbo", WIDGET_TYPE_CHECKBOX); | 453 | requires("vbo", WIDGET_TYPE_CHECKBOX); |
@@ -466,6 +465,14 @@ BOOL LLPanelDisplay2::postBuild() | |||
466 | // Graphics Card Memory | 465 | // Graphics Card Memory |
467 | mRadioVideoCardMem = LLUICtrlFactory::getRadioGroupByName(this, "video card memory radio"); | 466 | mRadioVideoCardMem = LLUICtrlFactory::getRadioGroupByName(this, "video card memory radio"); |
468 | 467 | ||
468 | #if !LL_WINDOWS | ||
469 | // The probe_hardware_checkbox setting is only used in the Windows build | ||
470 | // (It apparently controls a time-consuming DX9 hardware probe.) | ||
471 | // Disable the checkbox everywhere else | ||
472 | gSavedSettings.setBOOL("ProbeHardwareOnStartup", FALSE ); | ||
473 | childSetEnabled("probe_hardware_checkbox", false); | ||
474 | #endif // !LL_WINDOWS | ||
475 | |||
469 | refresh(); | 476 | refresh(); |
470 | 477 | ||
471 | return TRUE; | 478 | return TRUE; |
@@ -490,7 +497,8 @@ void LLPanelDisplay2::refresh() | |||
490 | mParticleCount = gSavedSettings.getS32("RenderMaxPartCount"); | 497 | mParticleCount = gSavedSettings.getS32("RenderMaxPartCount"); |
491 | mCompositeLimit = gSavedSettings.getS32("AvatarCompositeLimit"); | 498 | mCompositeLimit = gSavedSettings.getS32("AvatarCompositeLimit"); |
492 | mDebugBeaconLineWidth = gSavedSettings.getS32("DebugBeaconLineWidth"); | 499 | mDebugBeaconLineWidth = gSavedSettings.getS32("DebugBeaconLineWidth"); |
493 | 500 | mProbeHardwareOnStartup = gSavedSettings.getBOOL("ProbeHardwareOnStartup"); | |
501 | |||
494 | refreshEnabledState(); | 502 | refreshEnabledState(); |
495 | } | 503 | } |
496 | 504 | ||
@@ -521,7 +529,6 @@ void LLPanelDisplay2::apply() | |||
521 | gViewerWindow->restartDisplay(logged_in); | 529 | gViewerWindow->restartDisplay(logged_in); |
522 | } | 530 | } |
523 | 531 | ||
524 | |||
525 | refresh(); | 532 | refresh(); |
526 | } | 533 | } |
527 | 534 | ||
@@ -537,6 +544,7 @@ void LLPanelDisplay2::cancel() | |||
537 | gSavedSettings.setS32("RenderMaxPartCount", mParticleCount); | 544 | gSavedSettings.setS32("RenderMaxPartCount", mParticleCount); |
538 | gSavedSettings.setS32("AvatarCompositeLimit", mCompositeLimit); | 545 | gSavedSettings.setS32("AvatarCompositeLimit", mCompositeLimit); |
539 | gSavedSettings.setS32("DebugBeaconLineWidth", mDebugBeaconLineWidth); | 546 | gSavedSettings.setS32("DebugBeaconLineWidth", mDebugBeaconLineWidth); |
547 | gSavedSettings.setBOOL("ProbeHardwareOnStartup", mProbeHardwareOnStartup ); | ||
540 | } | 548 | } |
541 | 549 | ||
542 | //============================================================================ | 550 | //============================================================================ |
diff --git a/linden/indra/newview/llpaneldisplay.h b/linden/indra/newview/llpaneldisplay.h index b4db723..80aae66 100644 --- a/linden/indra/newview/llpaneldisplay.h +++ b/linden/indra/newview/llpaneldisplay.h | |||
@@ -102,7 +102,7 @@ protected: | |||
102 | S32 mParticleCount; | 102 | S32 mParticleCount; |
103 | S32 mCompositeLimit; | 103 | S32 mCompositeLimit; |
104 | S32 mDebugBeaconLineWidth; | 104 | S32 mDebugBeaconLineWidth; |
105 | 105 | BOOL mProbeHardwareOnStartup; | |
106 | }; | 106 | }; |
107 | 107 | ||
108 | class LLPanelDisplay3 : public LLPanel | 108 | class LLPanelDisplay3 : public LLPanel |
@@ -147,7 +147,6 @@ protected: | |||
147 | F32 mFlexLOD; | 147 | F32 mFlexLOD; |
148 | F32 mTreeLOD; | 148 | F32 mTreeLOD; |
149 | F32 mAvatarLOD; | 149 | F32 mAvatarLOD; |
150 | |||
151 | }; | 150 | }; |
152 | 151 | ||
153 | const S32 LL_MAX_VRAM_INDEX = 6; | 152 | const S32 LL_MAX_VRAM_INDEX = 6; |
diff --git a/linden/indra/newview/llpanelface.cpp b/linden/indra/newview/llpanelface.cpp index 8f24c55..9cbfdc2 100644 --- a/linden/indra/newview/llpanelface.cpp +++ b/linden/indra/newview/llpanelface.cpp | |||
@@ -505,7 +505,16 @@ void LLPanelFace::getState() | |||
505 | { | 505 | { |
506 | F32 shinyf = 0.f; | 506 | F32 shinyf = 0.f; |
507 | identical = allFacesSameValue( &LLPanelFace::valueShiny, &shinyf ); | 507 | identical = allFacesSameValue( &LLPanelFace::valueShiny, &shinyf ); |
508 | childGetSelectionInterface("combobox shininess")->selectNthItem((S32)shinyf); | 508 | LLCtrlSelectionInterface* combobox_shininess = |
509 | childGetSelectionInterface("combobox shininess"); | ||
510 | if (combobox_shininess) | ||
511 | { | ||
512 | combobox_shininess->selectNthItem((S32)shinyf); | ||
513 | } | ||
514 | else | ||
515 | { | ||
516 | llwarns << "failed childGetSelectionInterface for 'combobox shininess'" << llendl; | ||
517 | } | ||
509 | childSetEnabled("combobox shininess",editable); | 518 | childSetEnabled("combobox shininess",editable); |
510 | childSetTentative("combobox shininess",!identical); | 519 | childSetTentative("combobox shininess",!identical); |
511 | childSetEnabled("label shininess",editable); | 520 | childSetEnabled("label shininess",editable); |
@@ -514,7 +523,16 @@ void LLPanelFace::getState() | |||
514 | { | 523 | { |
515 | F32 bumpf = 0.f; | 524 | F32 bumpf = 0.f; |
516 | identical = allFacesSameValue( &LLPanelFace::valueBump, &bumpf ); | 525 | identical = allFacesSameValue( &LLPanelFace::valueBump, &bumpf ); |
517 | childGetSelectionInterface("combobox bumpiness")->selectNthItem((S32)bumpf); | 526 | LLCtrlSelectionInterface* combobox_bumpiness = |
527 | childGetSelectionInterface("combobox bumpiness"); | ||
528 | if (combobox_bumpiness) | ||
529 | { | ||
530 | combobox_bumpiness->selectNthItem((S32)bumpf); | ||
531 | } | ||
532 | else | ||
533 | { | ||
534 | llwarns << "failed childGetSelectionInterface for 'combobox bumpiness'" << llendl; | ||
535 | } | ||
518 | childSetEnabled("combobox bumpiness",editable); | 536 | childSetEnabled("combobox bumpiness",editable); |
519 | childSetTentative("combobox bumpiness",!identical); | 537 | childSetTentative("combobox bumpiness",!identical); |
520 | childSetEnabled("label bumpiness",editable); | 538 | childSetEnabled("label bumpiness",editable); |
@@ -523,8 +541,17 @@ void LLPanelFace::getState() | |||
523 | { | 541 | { |
524 | F32 genf = 0.f; | 542 | F32 genf = 0.f; |
525 | identical = allFacesSameValue( &LLPanelFace::valueTexGen, &genf); | 543 | identical = allFacesSameValue( &LLPanelFace::valueTexGen, &genf); |
526 | S32 selected_texgen = ((S32) genf) >> TEM_TEX_GEN_SHIFT; | 544 | S32 selected_texgen = ((S32) genf) >> TEM_TEX_GEN_SHIFT; |
527 | childGetSelectionInterface("combobox texgen")->selectNthItem(selected_texgen); | 545 | LLCtrlSelectionInterface* combobox_texgen = |
546 | childGetSelectionInterface("combobox texgen"); | ||
547 | if (combobox_texgen) | ||
548 | { | ||
549 | combobox_texgen->selectNthItem(selected_texgen); | ||
550 | } | ||
551 | else | ||
552 | { | ||
553 | llwarns << "failed childGetSelectionInterface for 'combobox texgen'" << llendl; | ||
554 | } | ||
528 | childSetEnabled("combobox texgen",editable); | 555 | childSetEnabled("combobox texgen",editable); |
529 | childSetTentative("combobox texgen",!identical); | 556 | childSetTentative("combobox texgen",!identical); |
530 | childSetEnabled("tex gen",editable); | 557 | childSetEnabled("tex gen",editable); |
diff --git a/linden/indra/newview/llpanelgeneral.cpp b/linden/indra/newview/llpanelgeneral.cpp index 900598a..d60471d 100644 --- a/linden/indra/newview/llpanelgeneral.cpp +++ b/linden/indra/newview/llpanelgeneral.cpp | |||
@@ -105,7 +105,6 @@ BOOL LLPanelGeneral::postBuild() | |||
105 | requires("rotate_mini_map_checkbox", WIDGET_TYPE_CHECKBOX); | 105 | requires("rotate_mini_map_checkbox", WIDGET_TYPE_CHECKBOX); |
106 | requires("friends_online_notify_checkbox", WIDGET_TYPE_CHECKBOX); | 106 | requires("friends_online_notify_checkbox", WIDGET_TYPE_CHECKBOX); |
107 | requires("notify_money_change_checkbox", WIDGET_TYPE_CHECKBOX); | 107 | requires("notify_money_change_checkbox", WIDGET_TYPE_CHECKBOX); |
108 | requires("probe_hardware_checkbox", WIDGET_TYPE_CHECKBOX); | ||
109 | requires("use_system_color_picker_checkbox", WIDGET_TYPE_CHECKBOX); | 108 | requires("use_system_color_picker_checkbox", WIDGET_TYPE_CHECKBOX); |
110 | requires("crash_behavior_combobox", WIDGET_TYPE_COMBO_BOX); | 109 | requires("crash_behavior_combobox", WIDGET_TYPE_COMBO_BOX); |
111 | 110 | ||
@@ -152,14 +151,6 @@ BOOL LLPanelGeneral::postBuild() | |||
152 | 151 | ||
153 | childSetCommitCallback("language_combobox", set_language ); | 152 | childSetCommitCallback("language_combobox", set_language ); |
154 | childSetValue("language_combobox", gSavedSettings.getString("Language")); | 153 | childSetValue("language_combobox", gSavedSettings.getString("Language")); |
155 | |||
156 | #if !LL_WINDOWS | ||
157 | // The probe_hardware_checkbox setting is only used in the Windows build | ||
158 | // (It apparently controls a time-consuming DX9 hardware probe.) | ||
159 | // Disable the checkbox everywhere else | ||
160 | gSavedSettings.setBOOL("ProbeHardwareOnStartup", FALSE ); | ||
161 | childSetEnabled("probe_hardware_checkbox", false); | ||
162 | #endif // !LL_WINDOWS | ||
163 | 154 | ||
164 | refresh(); | 155 | refresh(); |
165 | 156 | ||
@@ -205,7 +196,7 @@ void LLPanelGeneral::refresh() | |||
205 | mAFKTimeout = gSavedSettings.getF32("AFKTimeout"); | 196 | mAFKTimeout = gSavedSettings.getF32("AFKTimeout"); |
206 | mMiniMapRotate = gSavedSettings.getBOOL("MiniMapRotate"); | 197 | mMiniMapRotate = gSavedSettings.getBOOL("MiniMapRotate"); |
207 | mNotifyMoney = gSavedSettings.getBOOL("NotifyMoneyChange"); | 198 | mNotifyMoney = gSavedSettings.getBOOL("NotifyMoneyChange"); |
208 | mProbeHardwareOnStartup = gSavedSettings.getBOOL("ProbeHardwareOnStartup"); | 199 | mShowNewInventory = gSavedSettings.getBOOL("ShowNewInventory"); |
209 | mUseDefaultColor = gSavedSettings.getBOOL("UseDefaultColorPicker"); | 200 | mUseDefaultColor = gSavedSettings.getBOOL("UseDefaultColorPicker"); |
210 | mEffectColor = gSavedSettings.getColor4("EffectColor"); | 201 | mEffectColor = gSavedSettings.getColor4("EffectColor"); |
211 | 202 | ||
@@ -226,7 +217,7 @@ void LLPanelGeneral::cancel() | |||
226 | gSavedSettings.setF32("AFKTimeout", mAFKTimeout ); | 217 | gSavedSettings.setF32("AFKTimeout", mAFKTimeout ); |
227 | gSavedSettings.setBOOL("MiniMapRotate", mMiniMapRotate ); | 218 | gSavedSettings.setBOOL("MiniMapRotate", mMiniMapRotate ); |
228 | gSavedSettings.setBOOL("NotifyMoneyChange", mNotifyMoney ); | 219 | gSavedSettings.setBOOL("NotifyMoneyChange", mNotifyMoney ); |
229 | gSavedSettings.setBOOL("ProbeHardwareOnStartup", mProbeHardwareOnStartup ); | 220 | gSavedSettings.setBOOL("ShowNewInventory", mShowNewInventory); |
230 | gSavedSettings.setBOOL("UseDefaultColorPicker", mUseDefaultColor ); | 221 | gSavedSettings.setBOOL("UseDefaultColorPicker", mUseDefaultColor ); |
231 | gSavedSettings.setColor4("EffectColor", mEffectColor ); | 222 | gSavedSettings.setColor4("EffectColor", mEffectColor ); |
232 | gSavedSettings.setString("Language", mLanguage); | 223 | gSavedSettings.setString("Language", mLanguage); |
diff --git a/linden/indra/newview/llpanelgeneral.h b/linden/indra/newview/llpanelgeneral.h index 9f70560..fe4ff4e 100644 --- a/linden/indra/newview/llpanelgeneral.h +++ b/linden/indra/newview/llpanelgeneral.h | |||
@@ -61,7 +61,7 @@ protected: | |||
61 | BOOL mChatOnlineNotification; | 61 | BOOL mChatOnlineNotification; |
62 | F32 mAFKTimeout; | 62 | F32 mAFKTimeout; |
63 | BOOL mNotifyMoney; | 63 | BOOL mNotifyMoney; |
64 | BOOL mProbeHardwareOnStartup; | 64 | BOOL mShowNewInventory; |
65 | BOOL mUseDefaultColor; | 65 | BOOL mUseDefaultColor; |
66 | LLColor4 mEffectColor; | 66 | LLColor4 mEffectColor; |
67 | BOOL mMiniMapRotate; | 67 | BOOL mMiniMapRotate; |
diff --git a/linden/indra/newview/llpanelgroup.cpp b/linden/indra/newview/llpanelgroup.cpp index 6710c43..47dacf3 100644 --- a/linden/indra/newview/llpanelgroup.cpp +++ b/linden/indra/newview/llpanelgroup.cpp | |||
@@ -660,7 +660,7 @@ void LLPanelGroup::showNotice(const char* subject, | |||
660 | // We need to clean up that inventory offer. | 660 | // We need to clean up that inventory offer. |
661 | if (inventory_offer) | 661 | if (inventory_offer) |
662 | { | 662 | { |
663 | inventory_offer_callback( 1 , inventory_offer); | 663 | inventory_offer_callback( IOR_DECLINE , inventory_offer); |
664 | } | 664 | } |
665 | return; | 665 | return; |
666 | } | 666 | } |
diff --git a/linden/indra/newview/llpanelgroupgeneral.cpp b/linden/indra/newview/llpanelgroupgeneral.cpp index 67a0c31..5ec9651 100644 --- a/linden/indra/newview/llpanelgroupgeneral.cpp +++ b/linden/indra/newview/llpanelgroupgeneral.cpp | |||
@@ -45,10 +45,10 @@ | |||
45 | #include "llnamebox.h" | 45 | #include "llnamebox.h" |
46 | #include "llnamelistctrl.h" | 46 | #include "llnamelistctrl.h" |
47 | #include "llspinctrl.h" | 47 | #include "llspinctrl.h" |
48 | #include "llstatusbar.h" // can_afford_transaction() | ||
48 | #include "lltextbox.h" | 49 | #include "lltextbox.h" |
49 | #include "lltexteditor.h" | 50 | #include "lltexteditor.h" |
50 | #include "lltexturectrl.h" | 51 | #include "lltexturectrl.h" |
51 | #include "llviewermessage.h" | ||
52 | #include "llviewerwindow.h" | 52 | #include "llviewerwindow.h" |
53 | 53 | ||
54 | // static | 54 | // static |
@@ -322,19 +322,27 @@ void LLPanelGroupGeneral::onClickJoin(void *userdata) | |||
322 | 322 | ||
323 | LLGroupMgrGroupData* gdatap = gGroupMgr->getGroupData(self->mGroupID); | 323 | LLGroupMgrGroupData* gdatap = gGroupMgr->getGroupData(self->mGroupID); |
324 | 324 | ||
325 | S32 cost = gdatap->mMembershipFee; | 325 | if (gdatap) |
326 | LLString::format_map_t args; | ||
327 | args["[COST]"] = llformat("%d", cost); | ||
328 | |||
329 | if (can_afford_transaction(cost)) | ||
330 | { | 326 | { |
331 | gViewerWindow->alertXml("JoinGroupCanAfford", args, | 327 | S32 cost = gdatap->mMembershipFee; |
332 | LLPanelGroupGeneral::joinDlgCB, | 328 | LLString::format_map_t args; |
333 | self); | 329 | args["[COST]"] = llformat("%d", cost); |
330 | |||
331 | if (can_afford_transaction(cost)) | ||
332 | { | ||
333 | gViewerWindow->alertXml("JoinGroupCanAfford", args, | ||
334 | LLPanelGroupGeneral::joinDlgCB, | ||
335 | self); | ||
336 | } | ||
337 | else | ||
338 | { | ||
339 | gViewerWindow->alertXml("JoinGroupCannotAfford", args); | ||
340 | } | ||
334 | } | 341 | } |
335 | else | 342 | else |
336 | { | 343 | { |
337 | gViewerWindow->alertXml("JoinGroupCannotAfford", args); | 344 | llwarns << "gGroupMgr->getGroupData(" << self->mGroupID |
345 | << ") was NULL" << llendl; | ||
338 | } | 346 | } |
339 | } | 347 | } |
340 | 348 | ||
diff --git a/linden/indra/newview/llpanelgroupnotices.cpp b/linden/indra/newview/llpanelgroupnotices.cpp index 373f3f2..a001455 100644 --- a/linden/indra/newview/llpanelgroupnotices.cpp +++ b/linden/indra/newview/llpanelgroupnotices.cpp | |||
@@ -204,7 +204,7 @@ LLPanelGroupNotices::~LLPanelGroupNotices() | |||
204 | if (mInventoryOffer) | 204 | if (mInventoryOffer) |
205 | { | 205 | { |
206 | // Cancel the inventory offer. | 206 | // Cancel the inventory offer. |
207 | inventory_offer_callback( 1 , mInventoryOffer); | 207 | inventory_offer_callback( IOR_DECLINE , mInventoryOffer); |
208 | mInventoryOffer = NULL; | 208 | mInventoryOffer = NULL; |
209 | } | 209 | } |
210 | } | 210 | } |
@@ -359,7 +359,7 @@ void LLPanelGroupNotices::onClickOpenAttachment(void* data) | |||
359 | { | 359 | { |
360 | LLPanelGroupNotices* self = (LLPanelGroupNotices*)data; | 360 | LLPanelGroupNotices* self = (LLPanelGroupNotices*)data; |
361 | 361 | ||
362 | inventory_offer_callback( 0 , self->mInventoryOffer); | 362 | inventory_offer_callback( IOR_ACCEPT , self->mInventoryOffer); |
363 | self->mInventoryOffer = NULL; | 363 | self->mInventoryOffer = NULL; |
364 | self->mBtnOpenAttachment->setEnabled(FALSE); | 364 | self->mBtnOpenAttachment->setEnabled(FALSE); |
365 | } | 365 | } |
@@ -398,7 +398,7 @@ void LLPanelGroupNotices::onClickNewMessage(void* data) | |||
398 | 398 | ||
399 | if (self->mInventoryOffer) | 399 | if (self->mInventoryOffer) |
400 | { | 400 | { |
401 | inventory_offer_callback( 1 , self->mInventoryOffer); | 401 | inventory_offer_callback( IOR_DECLINE , self->mInventoryOffer); |
402 | self->mInventoryOffer = NULL; | 402 | self->mInventoryOffer = NULL; |
403 | } | 403 | } |
404 | 404 | ||
@@ -548,7 +548,7 @@ void LLPanelGroupNotices::showNotice(const char* subject, | |||
548 | if (mInventoryOffer) | 548 | if (mInventoryOffer) |
549 | { | 549 | { |
550 | // Cancel the inventory offer for the previously viewed notice | 550 | // Cancel the inventory offer for the previously viewed notice |
551 | inventory_offer_callback( 1 , mInventoryOffer); | 551 | inventory_offer_callback( IOR_DECLINE , mInventoryOffer); |
552 | mInventoryOffer = NULL; | 552 | mInventoryOffer = NULL; |
553 | } | 553 | } |
554 | 554 | ||
diff --git a/linden/indra/newview/llpanelgrouproles.cpp b/linden/indra/newview/llpanelgrouproles.cpp index 266ff12..5765a12 100644 --- a/linden/indra/newview/llpanelgrouproles.cpp +++ b/linden/indra/newview/llpanelgrouproles.cpp | |||
@@ -1323,13 +1323,17 @@ void LLPanelGroupMembersSubTab::onRoleCheck(LLUICtrl* ctrl, void* user_data) | |||
1323 | LLCheckBoxCtrl* check_box = static_cast<LLCheckBoxCtrl*>(ctrl); | 1323 | LLCheckBoxCtrl* check_box = static_cast<LLCheckBoxCtrl*>(ctrl); |
1324 | if (!check_box || !self) return; | 1324 | if (!check_box || !self) return; |
1325 | 1325 | ||
1326 | 1326 | LLScrollListItem* first_selected = | |
1327 | LLUUID role_id = self->mAssignedRolesList->getFirstSelected()->getUUID(); | 1327 | self->mAssignedRolesList->getFirstSelected(); |
1328 | LLRoleMemberChangeType change_type = (check_box->get() ? | 1328 | if (first_selected) |
1329 | RMC_ADD : | 1329 | { |
1330 | RMC_REMOVE); | 1330 | LLUUID role_id = first_selected->getUUID(); |
1331 | 1331 | LLRoleMemberChangeType change_type = (check_box->get() ? | |
1332 | self->handleRoleCheck(role_id, change_type); | 1332 | RMC_ADD : |
1333 | RMC_REMOVE); | ||
1334 | |||
1335 | self->handleRoleCheck(role_id, change_type); | ||
1336 | } | ||
1333 | } | 1337 | } |
1334 | 1338 | ||
1335 | void LLPanelGroupMembersSubTab::handleMemberDoubleClick() | 1339 | void LLPanelGroupMembersSubTab::handleMemberDoubleClick() |
@@ -2056,8 +2060,9 @@ void LLPanelGroupRolesSubTab::update(LLGroupChange gc) | |||
2056 | } | 2060 | } |
2057 | 2061 | ||
2058 | if ((GC_ROLE_MEMBER_DATA == gc || GC_MEMBER_DATA == gc) | 2062 | if ((GC_ROLE_MEMBER_DATA == gc || GC_MEMBER_DATA == gc) |
2059 | && gdatap->isMemberDataComplete() | 2063 | && gdatap |
2060 | && gdatap->isRoleMemberDataComplete()) | 2064 | && gdatap->isMemberDataComplete() |
2065 | && gdatap->isRoleMemberDataComplete()) | ||
2061 | { | 2066 | { |
2062 | buildMembersList(); | 2067 | buildMembersList(); |
2063 | } | 2068 | } |
diff --git a/linden/indra/newview/llpanelinventory.cpp b/linden/indra/newview/llpanelinventory.cpp index 2089a6c..13cee05 100644 --- a/linden/indra/newview/llpanelinventory.cpp +++ b/linden/indra/newview/llpanelinventory.cpp | |||
@@ -1,4 +1,4 @@ | |||
1 | /** | 1 | /** |
2 | * @file llpanelinventory.cpp | 2 | * @file llpanelinventory.cpp |
3 | * @brief LLPanelInventory class implementation | 3 | * @brief LLPanelInventory class implementation |
4 | * | 4 | * |
@@ -72,7 +72,7 @@ | |||
72 | #include "llviewerregion.h" | 72 | #include "llviewerregion.h" |
73 | #include "llviewerimagelist.h" | 73 | #include "llviewerimagelist.h" |
74 | #include "llviewerinventory.h" | 74 | #include "llviewerinventory.h" |
75 | #include "llviewermessage.h" | 75 | #include "llviewermessage.h" |
76 | #include "llviewerobject.h" | 76 | #include "llviewerobject.h" |
77 | #include "llviewerobjectlist.h" | 77 | #include "llviewerobjectlist.h" |
78 | #include "llviewerwindow.h" | 78 | #include "llviewerwindow.h" |
@@ -197,7 +197,7 @@ struct LLBuyInvItemData | |||
197 | LLUUID mTaskID; | 197 | LLUUID mTaskID; |
198 | LLUUID mItemID; | 198 | LLUUID mItemID; |
199 | LLAssetType::EType mType; | 199 | LLAssetType::EType mType; |
200 | 200 | ||
201 | LLBuyInvItemData(const LLUUID& task, | 201 | LLBuyInvItemData(const LLUUID& task, |
202 | const LLUUID& item, | 202 | const LLUUID& item, |
203 | LLAssetType::EType type) : | 203 | LLAssetType::EType type) : |
@@ -217,34 +217,45 @@ void LLTaskInvFVBridge::buyItem() | |||
217 | const LLSaleInfo& sale_info = item->getSaleInfo(); | 217 | const LLSaleInfo& sale_info = item->getSaleInfo(); |
218 | const LLPermissions& perm = item->getPermissions(); | 218 | const LLPermissions& perm = item->getPermissions(); |
219 | const LLString owner_name; // no owner name currently... FIXME? | 219 | const LLString owner_name; // no owner name currently... FIXME? |
220 | |||
221 | LLString::format_map_t args; | ||
222 | args["[PRICE]"] = llformat("%d",sale_info.getSalePrice()); | ||
223 | args["[OWNER]"] = owner_name; | ||
224 | if (sale_info.getSaleType() != LLSaleInfo::FS_CONTENTS) | ||
225 | { | ||
226 | U32 next_owner_mask = perm.getMaskNextOwner(); | ||
227 | args["[MODIFYPERM]"] = LLAlertDialog::getTemplateMessage((next_owner_mask & PERM_MODIFY) ? "PermYes" : "PermNo"); | ||
228 | args["[COPYPERM]"] = LLAlertDialog::getTemplateMessage((next_owner_mask & PERM_COPY) ? "PermYes" : "PermNo"); | ||
229 | args["[RESELLPERM]"] = LLAlertDialog::getTemplateMessage((next_owner_mask & PERM_TRANSFER) ? "PermYes" : "PermNo"); | ||
230 | } | ||
231 | 220 | ||
232 | LLString alertdesc; | 221 | LLViewerObject* obj; |
233 | switch(sale_info.getSaleType()) | 222 | if( ( obj = gObjectList.findObject( mPanel->getTaskUUID() ) ) && obj->isAttachment() ) |
234 | { | 223 | { |
235 | case LLSaleInfo::FS_ORIGINAL: | 224 | gViewerWindow->alertXml("Cannot_Purchase_an_Attachment"); |
236 | alertdesc = owner_name.empty() ? "BuyOriginalNoOwner" : "BuyOriginal"; | 225 | llinfos << "Attempt to purchase an attachment" << llendl; |
237 | break; | ||
238 | case LLSaleInfo::FS_COPY: | ||
239 | default: | ||
240 | alertdesc = owner_name.empty() ? "BuyCopyNoOwner" : "BuyCopy"; | ||
241 | break; | ||
242 | case LLSaleInfo::FS_CONTENTS: | ||
243 | alertdesc = owner_name.empty() ? "BuyContentsNoOwner" : "BuyContents"; | ||
244 | break; | ||
245 | } | 226 | } |
246 | 227 | else | |
247 | gViewerWindow->alertXml(alertdesc, args, LLTaskInvFVBridge::commitBuyItem, (void*)inv); | 228 | { |
229 | |||
230 | |||
231 | LLString::format_map_t args; | ||
232 | args["[PRICE]"] = llformat("%d",sale_info.getSalePrice()); | ||
233 | args["[OWNER]"] = owner_name; | ||
234 | if (sale_info.getSaleType() != LLSaleInfo::FS_CONTENTS) | ||
235 | { | ||
236 | U32 next_owner_mask = perm.getMaskNextOwner(); | ||
237 | args["[MODIFYPERM]"] = LLAlertDialog::getTemplateMessage((next_owner_mask & PERM_MODIFY) ? "PermYes" : "PermNo"); | ||
238 | args["[COPYPERM]"] = LLAlertDialog::getTemplateMessage((next_owner_mask & PERM_COPY) ? "PermYes" : "PermNo"); | ||
239 | args["[RESELLPERM]"] = LLAlertDialog::getTemplateMessage((next_owner_mask & PERM_TRANSFER) ? "PermYes" : "PermNo"); | ||
240 | } | ||
241 | |||
242 | LLString alertdesc; | ||
243 | switch(sale_info.getSaleType()) | ||
244 | { | ||
245 | case LLSaleInfo::FS_ORIGINAL: | ||
246 | alertdesc = owner_name.empty() ? "BuyOriginalNoOwner" : "BuyOriginal"; | ||
247 | break; | ||
248 | case LLSaleInfo::FS_COPY: | ||
249 | default: | ||
250 | alertdesc = owner_name.empty() ? "BuyCopyNoOwner" : "BuyCopy"; | ||
251 | break; | ||
252 | case LLSaleInfo::FS_CONTENTS: | ||
253 | alertdesc = owner_name.empty() ? "BuyContentsNoOwner" : "BuyContents"; | ||
254 | break; | ||
255 | } | ||
256 | |||
257 | gViewerWindow->alertXml(alertdesc, args, LLTaskInvFVBridge::commitBuyItem, (void*)inv); | ||
258 | } | ||
248 | } | 259 | } |
249 | 260 | ||
250 | S32 LLTaskInvFVBridge::getPrice() | 261 | S32 LLTaskInvFVBridge::getPrice() |
@@ -269,7 +280,7 @@ void LLTaskInvFVBridge::commitBuyItem(S32 option, void* data) | |||
269 | { | 280 | { |
270 | LLViewerObject* object = gObjectList.findObject(inv->mTaskID); | 281 | LLViewerObject* object = gObjectList.findObject(inv->mTaskID); |
271 | if(!object || !object->getRegion()) return; | 282 | if(!object || !object->getRegion()) return; |
272 | 283 | ||
273 | 284 | ||
274 | LLMessageSystem* msg = gMessageSystem; | 285 | LLMessageSystem* msg = gMessageSystem; |
275 | msg->newMessageFast(_PREHASH_BuyObjectInventory); | 286 | msg->newMessageFast(_PREHASH_BuyObjectInventory); |
@@ -289,12 +300,12 @@ void LLTaskInvFVBridge::commitBuyItem(S32 option, void* data) | |||
289 | const LLString& LLTaskInvFVBridge::getName() const | 300 | const LLString& LLTaskInvFVBridge::getName() const |
290 | { | 301 | { |
291 | return mName; | 302 | return mName; |
292 | } | 303 | } |
293 | 304 | ||
294 | const LLString& LLTaskInvFVBridge::getDisplayName() const | 305 | const LLString& LLTaskInvFVBridge::getDisplayName() const |
295 | { | 306 | { |
296 | LLInventoryItem* item = findItem(); | 307 | LLInventoryItem* item = findItem(); |
297 | if(item) | 308 | if(item) |
298 | { | 309 | { |
299 | mDisplayName.assign(item->getName()); | 310 | mDisplayName.assign(item->getName()); |
300 | 311 | ||
@@ -316,9 +327,9 @@ const LLString& LLTaskInvFVBridge::getDisplayName() const | |||
316 | mDisplayName.append(" (no transfer)"); | 327 | mDisplayName.append(" (no transfer)"); |
317 | } | 328 | } |
318 | } | 329 | } |
319 | 330 | ||
320 | return mDisplayName; | 331 | return mDisplayName; |
321 | } | 332 | } |
322 | 333 | ||
323 | // BUG: No creation dates for task inventory | 334 | // BUG: No creation dates for task inventory |
324 | U32 LLTaskInvFVBridge::getCreationDate() const | 335 | U32 LLTaskInvFVBridge::getCreationDate() const |
@@ -444,7 +455,7 @@ BOOL LLTaskInvFVBridge::removeItem() | |||
444 | { | 455 | { |
445 | // just do it. | 456 | // just do it. |
446 | object->removeInventory(mUUID); | 457 | object->removeInventory(mUUID); |
447 | return TRUE; | 458 | return TRUE; |
448 | } | 459 | } |
449 | else | 460 | else |
450 | { | 461 | { |
@@ -542,20 +553,20 @@ BOOL LLTaskInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) | |||
542 | if((inv = (LLInventoryItem*)object->getInventoryObject(mUUID))) | 553 | if((inv = (LLInventoryItem*)object->getInventoryObject(mUUID))) |
543 | { | 554 | { |
544 | const LLPermissions& perm = inv->getPermissions(); | 555 | const LLPermissions& perm = inv->getPermissions(); |
545 | bool can_copy = gAgent.allowOperation(PERM_COPY, perm, | 556 | bool can_copy = gAgent.allowOperation(PERM_COPY, perm, |
546 | GP_OBJECT_MANIPULATE); | 557 | GP_OBJECT_MANIPULATE); |
547 | if (object->isAttachment() && !can_copy) | 558 | if (object->isAttachment() && !can_copy) |
548 | { | 559 | { |
549 | //RN: no copy contents of attachments cannot be dragged out | 560 | //RN: no copy contents of attachments cannot be dragged out |
550 | // due to a race condition and possible exploit where | 561 | // due to a race condition and possible exploit where |
551 | // attached objects do not update their inventory items | 562 | // attached objects do not update their inventory items |
552 | // when their contents are manipulated | 563 | // when their contents are manipulated |
553 | return FALSE; | 564 | return FALSE; |
554 | } | 565 | } |
555 | if((can_copy && perm.allowTransferTo(gAgent.getID())) | 566 | if((can_copy && perm.allowTransferTo(gAgent.getID())) |
556 | || object->permYouOwner()) | 567 | || object->permYouOwner()) |
557 | // || gAgent.isGodlike()) | 568 | // || gAgent.isGodlike()) |
558 | 569 | ||
559 | { | 570 | { |
560 | *type = LLAssetType::lookupDragAndDropType(inv->getType()); | 571 | *type = LLAssetType::lookupDragAndDropType(inv->getType()); |
561 | 572 | ||
@@ -621,7 +632,7 @@ void LLTaskInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags) | |||
621 | std::vector<LLString> items; | 632 | std::vector<LLString> items; |
622 | std::vector<LLString> disabled_items; | 633 | std::vector<LLString> disabled_items; |
623 | 634 | ||
624 | if(gAgent.allowOperation(PERM_OWNER, item->getPermissions(), | 635 | if(gAgent.allowOperation(PERM_OWNER, item->getPermissions(), |
625 | GP_OBJECT_MANIPULATE) | 636 | GP_OBJECT_MANIPULATE) |
626 | && item->getSaleInfo().isForSale()) | 637 | && item->getSaleInfo().isForSale()) |
627 | { | 638 | { |
@@ -755,12 +766,12 @@ BOOL LLTaskCategoryBridge::startDrag(EDragAndDropType* type, LLUUID* id) | |||
755 | if((inv = (LLInventoryItem*)object->getInventoryObject(mUUID))) | 766 | if((inv = (LLInventoryItem*)object->getInventoryObject(mUUID))) |
756 | { | 767 | { |
757 | const LLPermissions& perm = inv->getPermissions(); | 768 | const LLPermissions& perm = inv->getPermissions(); |
758 | bool can_copy = gAgent.allowOperation(PERM_COPY, perm, | 769 | bool can_copy = gAgent.allowOperation(PERM_COPY, perm, |
759 | GP_OBJECT_MANIPULATE); | 770 | GP_OBJECT_MANIPULATE); |
760 | if((can_copy && perm.allowTransferTo(gAgent.getID())) | 771 | if((can_copy && perm.allowTransferTo(gAgent.getID())) |
761 | || object->permYouOwner()) | 772 | || object->permYouOwner()) |
762 | // || gAgent.isGodlike()) | 773 | // || gAgent.isGodlike()) |
763 | 774 | ||
764 | { | 775 | { |
765 | *type = LLAssetType::lookupDragAndDropType(inv->getType()); | 776 | *type = LLAssetType::lookupDragAndDropType(inv->getType()); |
766 | 777 | ||
@@ -776,7 +787,7 @@ BOOL LLTaskCategoryBridge::startDrag(EDragAndDropType* type, LLUUID* id) | |||
776 | BOOL LLTaskCategoryBridge::dragOrDrop(MASK mask, BOOL drop, | 787 | BOOL LLTaskCategoryBridge::dragOrDrop(MASK mask, BOOL drop, |
777 | EDragAndDropType cargo_type, | 788 | EDragAndDropType cargo_type, |
778 | void* cargo_data) | 789 | void* cargo_data) |
779 | { | 790 | { |
780 | //llinfos << "LLTaskCategoryBridge::dragOrDrop()" << llendl; | 791 | //llinfos << "LLTaskCategoryBridge::dragOrDrop()" << llendl; |
781 | BOOL accept = FALSE; | 792 | BOOL accept = FALSE; |
782 | LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); | 793 | LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); |
@@ -1060,7 +1071,7 @@ LLTaskLandmarkBridge::LLTaskLandmarkBridge( | |||
1060 | LLTaskInvFVBridge(panel, uuid, name) | 1071 | LLTaskInvFVBridge(panel, uuid, name) |
1061 | { | 1072 | { |
1062 | } | 1073 | } |
1063 | 1074 | ||
1064 | LLViewerImage* LLTaskLandmarkBridge::getIcon() const | 1075 | LLViewerImage* LLTaskLandmarkBridge::getIcon() const |
1065 | { | 1076 | { |
1066 | return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, 0, FALSE); | 1077 | return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, 0, FALSE); |
@@ -1091,7 +1102,7 @@ LLTaskCallingCardBridge::LLTaskCallingCardBridge( | |||
1091 | LLTaskInvFVBridge(panel, uuid, name) | 1102 | LLTaskInvFVBridge(panel, uuid, name) |
1092 | { | 1103 | { |
1093 | } | 1104 | } |
1094 | 1105 | ||
1095 | LLViewerImage* LLTaskCallingCardBridge::getIcon() const | 1106 | LLViewerImage* LLTaskCallingCardBridge::getIcon() const |
1096 | { | 1107 | { |
1097 | return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, 0, FALSE); | 1108 | return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, 0, FALSE); |
@@ -1476,7 +1487,7 @@ LLTaskWearableBridge::LLTaskWearableBridge( | |||
1476 | mAssetType( asset_type ) | 1487 | mAssetType( asset_type ) |
1477 | { | 1488 | { |
1478 | } | 1489 | } |
1479 | 1490 | ||
1480 | LLViewerImage* LLTaskWearableBridge::getIcon() const | 1491 | LLViewerImage* LLTaskWearableBridge::getIcon() const |
1481 | { | 1492 | { |
1482 | return get_item_icon(mAssetType, LLInventoryType::IT_WEARABLE, mFlags, FALSE ); | 1493 | return get_item_icon(mAssetType, LLInventoryType::IT_WEARABLE, mFlags, FALSE ); |
@@ -1648,7 +1659,7 @@ void LLPanelInventory::inventoryChanged(LLViewerObject* object, | |||
1648 | { | 1659 | { |
1649 | if(!object) return; | 1660 | if(!object) return; |
1650 | 1661 | ||
1651 | //llinfos << "invetnory arrived: \n" | 1662 | //llinfos << "invetnory arrived: \n" |
1652 | // << " panel UUID: " << panel->mTaskUUID << "\n" | 1663 | // << " panel UUID: " << panel->mTaskUUID << "\n" |
1653 | // << " task UUID: " << object->mID << llendl; | 1664 | // << " task UUID: " << object->mID << llendl; |
1654 | if(mTaskUUID == object->mID) | 1665 | if(mTaskUUID == object->mID) |
@@ -1686,7 +1697,7 @@ void LLPanelInventory::inventoryChanged(LLViewerObject* object, | |||
1686 | 1697 | ||
1687 | void LLPanelInventory::updateInventory() | 1698 | void LLPanelInventory::updateInventory() |
1688 | { | 1699 | { |
1689 | //llinfos << "inventory arrived: \n" | 1700 | //llinfos << "inventory arrived: \n" |
1690 | // << " panel UUID: " << panel->mTaskUUID << "\n" | 1701 | // << " panel UUID: " << panel->mTaskUUID << "\n" |
1691 | // << " task UUID: " << object->mID << llendl; | 1702 | // << " task UUID: " << object->mID << llendl; |
1692 | // We're still interested in this task's inventory. | 1703 | // We're still interested in this task's inventory. |
@@ -1865,7 +1876,7 @@ void LLPanelInventory::refresh() | |||
1865 | // Otherwise we show the old stuff until the update comes in | 1876 | // Otherwise we show the old stuff until the update comes in |
1866 | clearContents(); | 1877 | clearContents(); |
1867 | 1878 | ||
1868 | // Register for updates from this object, | 1879 | // Register for updates from this object, |
1869 | registerVOInventoryListener(object,NULL); | 1880 | registerVOInventoryListener(object,NULL); |
1870 | } | 1881 | } |
1871 | 1882 | ||
@@ -1978,7 +1989,7 @@ BOOL LLPanelInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDr | |||
1978 | } | 1989 | } |
1979 | } | 1990 | } |
1980 | 1991 | ||
1981 | //static | 1992 | //static |
1982 | void LLPanelInventory::idle(void* user_data) | 1993 | void LLPanelInventory::idle(void* user_data) |
1983 | { | 1994 | { |
1984 | LLPanelInventory* self = (LLPanelInventory*)user_data; | 1995 | LLPanelInventory* self = (LLPanelInventory*)user_data; |
diff --git a/linden/indra/newview/llpanelmsgs.cpp b/linden/indra/newview/llpanelmsgs.cpp index f25d477..3f5314c 100644 --- a/linden/indra/newview/llpanelmsgs.cpp +++ b/linden/indra/newview/llpanelmsgs.cpp | |||
@@ -88,14 +88,33 @@ void LLPanelMsgs::buildLists() | |||
88 | row["columns"][1]["font"] = "SANSSERIF_SMALL"; | 88 | row["columns"][1]["font"] = "SANSSERIF_SMALL"; |
89 | row["columns"][1]["width"] = 160; | 89 | row["columns"][1]["width"] = 160; |
90 | } | 90 | } |
91 | item = mDisabledPopups->addElement(row, ADD_SORTED); | 91 | if (mDisabledPopups) |
92 | { | ||
93 | item = mDisabledPopups->addElement(row, | ||
94 | ADD_SORTED); | ||
95 | } | ||
96 | else | ||
97 | { | ||
98 | llwarns << "(ignore) but also (!mDisabledPopups)" << llendl; | ||
99 | } | ||
92 | } | 100 | } |
93 | else | 101 | else |
94 | { | 102 | { |
95 | item = mEnabledPopups->addElement(row, ADD_SORTED); | 103 | if (mEnabledPopups) |
104 | { | ||
105 | item = mEnabledPopups->addElement(row, | ||
106 | ADD_SORTED); | ||
107 | } | ||
108 | else | ||
109 | { | ||
110 | llwarns << "(!ignore) but also (!mEnabledPopups)" << llendl; | ||
111 | } | ||
96 | } | 112 | } |
97 | 113 | ||
98 | item->setUserdata((void*)&iter->first); | 114 | if (item) |
115 | { | ||
116 | item->setUserdata((void*)&iter->first); | ||
117 | } | ||
99 | } | 118 | } |
100 | } | 119 | } |
101 | 120 | ||
diff --git a/linden/indra/newview/llpanelpermissions.cpp b/linden/indra/newview/llpanelpermissions.cpp index 18ec28e..6e8a4ff 100644 --- a/linden/indra/newview/llpanelpermissions.cpp +++ b/linden/indra/newview/llpanelpermissions.cpp | |||
@@ -726,14 +726,17 @@ void LLPanelPermissions::refresh() | |||
726 | LLSaleInfo::EForSale sale_type = sale_info.getSaleType(); | 726 | LLSaleInfo::EForSale sale_type = sale_info.getSaleType(); |
727 | 727 | ||
728 | LLRadioGroup* RadioSaleType = gUICtrlFactory->getRadioGroupByName(this,"sale type"); | 728 | LLRadioGroup* RadioSaleType = gUICtrlFactory->getRadioGroupByName(this,"sale type"); |
729 | if(RadioSaleType && valid_sale_info) | 729 | if(RadioSaleType) |
730 | { | 730 | { |
731 | RadioSaleType->setSelectedIndex((S32)sale_type - 1); | 731 | if (valid_sale_info) |
732 | } | 732 | { |
733 | else | 733 | RadioSaleType->setSelectedIndex((S32)sale_type - 1); |
734 | { | 734 | } |
735 | // default option is sell copy, determined to be safest | 735 | else |
736 | RadioSaleType->setSelectedIndex((S32)LLSaleInfo::FS_COPY - 1); | 736 | { |
737 | // default option is sell copy, determined to be safest | ||
738 | RadioSaleType->setSelectedIndex((S32)LLSaleInfo::FS_COPY - 1); | ||
739 | } | ||
737 | } | 740 | } |
738 | 741 | ||
739 | if (is_for_sale) | 742 | if (is_for_sale) |
diff --git a/linden/indra/newview/llpatchvertexarray.cpp b/linden/indra/newview/llpatchvertexarray.cpp index bfd4ff4..611ff97 100644 --- a/linden/indra/newview/llpatchvertexarray.cpp +++ b/linden/indra/newview/llpatchvertexarray.cpp | |||
@@ -126,8 +126,16 @@ void LLPatchVertexArray::create(U32 surface_width, U32 patch_width, F32 meters_p | |||
126 | mRenderStridep = new U32 [mPatchOrder + 1]; | 126 | mRenderStridep = new U32 [mPatchOrder + 1]; |
127 | } | 127 | } |
128 | 128 | ||
129 | if (NULL == mRenderLevelp || NULL == mRenderStridep) | ||
130 | { | ||
131 | // init() and some other things all want to deref these | ||
132 | // pointers, so this is serious. | ||
133 | llerrs << "mRenderLevelp or mRenderStridep was NULL; we'd crash soon." << llendl; | ||
134 | return; | ||
135 | } | ||
129 | 136 | ||
130 | // Now that we've allocated memory, we can initialize the arrays... | 137 | // Now that we've allocated memory, we can initialize |
138 | // the arrays... | ||
131 | init(); | 139 | init(); |
132 | } | 140 | } |
133 | 141 | ||
diff --git a/linden/indra/newview/llpolymesh.cpp b/linden/indra/newview/llpolymesh.cpp index cf94142..1edb8f5 100644 --- a/linden/indra/newview/llpolymesh.cpp +++ b/linden/indra/newview/llpolymesh.cpp | |||
@@ -301,6 +301,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName ) | |||
301 | if (numRead != 1) | 301 | if (numRead != 1) |
302 | { | 302 | { |
303 | llerrs << "can't read HasWeights flag from " << fileName << llendl; | 303 | llerrs << "can't read HasWeights flag from " << fileName << llendl; |
304 | return FALSE; | ||
304 | } | 305 | } |
305 | if (!isLOD()) | 306 | if (!isLOD()) |
306 | { | 307 | { |
@@ -315,6 +316,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName ) | |||
315 | if (numRead != 1) | 316 | if (numRead != 1) |
316 | { | 317 | { |
317 | llerrs << "can't read HasDetailTexCoords flag from " << fileName << llendl; | 318 | llerrs << "can't read HasDetailTexCoords flag from " << fileName << llendl; |
319 | return FALSE; | ||
318 | } | 320 | } |
319 | 321 | ||
320 | //---------------------------------------------------------------- | 322 | //---------------------------------------------------------------- |
@@ -326,6 +328,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName ) | |||
326 | if (numRead != 3) | 328 | if (numRead != 3) |
327 | { | 329 | { |
328 | llerrs << "can't read Position from " << fileName << llendl; | 330 | llerrs << "can't read Position from " << fileName << llendl; |
331 | return FALSE; | ||
329 | } | 332 | } |
330 | setPosition( position ); | 333 | setPosition( position ); |
331 | 334 | ||
@@ -338,6 +341,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName ) | |||
338 | if (numRead != 3) | 341 | if (numRead != 3) |
339 | { | 342 | { |
340 | llerrs << "can't read RotationAngles from " << fileName << llendl; | 343 | llerrs << "can't read RotationAngles from " << fileName << llendl; |
344 | return FALSE; | ||
341 | } | 345 | } |
342 | 346 | ||
343 | U8 rotationOrder; | 347 | U8 rotationOrder; |
@@ -346,6 +350,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName ) | |||
346 | if (numRead != 1) | 350 | if (numRead != 1) |
347 | { | 351 | { |
348 | llerrs << "can't read RotationOrder from " << fileName << llendl; | 352 | llerrs << "can't read RotationOrder from " << fileName << llendl; |
353 | return FALSE; | ||
349 | } | 354 | } |
350 | 355 | ||
351 | rotationOrder = 0; | 356 | rotationOrder = 0; |
@@ -364,6 +369,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName ) | |||
364 | if (numRead != 3) | 369 | if (numRead != 3) |
365 | { | 370 | { |
366 | llerrs << "can't read Scale from " << fileName << llendl; | 371 | llerrs << "can't read Scale from " << fileName << llendl; |
372 | return FALSE; | ||
367 | } | 373 | } |
368 | setScale( scale ); | 374 | setScale( scale ); |
369 | 375 | ||
@@ -384,6 +390,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName ) | |||
384 | if (numRead != 1) | 390 | if (numRead != 1) |
385 | { | 391 | { |
386 | llerrs << "can't read NumVertices from " << fileName << llendl; | 392 | llerrs << "can't read NumVertices from " << fileName << llendl; |
393 | return FALSE; | ||
387 | } | 394 | } |
388 | 395 | ||
389 | allocateVertexData( numVertices ); | 396 | allocateVertexData( numVertices ); |
@@ -396,6 +403,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName ) | |||
396 | if (numRead != numVertices) | 403 | if (numRead != numVertices) |
397 | { | 404 | { |
398 | llerrs << "can't read Coordinates from " << fileName << llendl; | 405 | llerrs << "can't read Coordinates from " << fileName << llendl; |
406 | return FALSE; | ||
399 | } | 407 | } |
400 | 408 | ||
401 | //---------------------------------------------------------------- | 409 | //---------------------------------------------------------------- |
@@ -406,6 +414,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName ) | |||
406 | if (numRead != numVertices) | 414 | if (numRead != numVertices) |
407 | { | 415 | { |
408 | llerrs << " can't read Normals from " << fileName << llendl; | 416 | llerrs << " can't read Normals from " << fileName << llendl; |
417 | return FALSE; | ||
409 | } | 418 | } |
410 | 419 | ||
411 | //---------------------------------------------------------------- | 420 | //---------------------------------------------------------------- |
@@ -416,6 +425,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName ) | |||
416 | if (numRead != numVertices) | 425 | if (numRead != numVertices) |
417 | { | 426 | { |
418 | llerrs << " can't read Binormals from " << fileName << llendl; | 427 | llerrs << " can't read Binormals from " << fileName << llendl; |
428 | return FALSE; | ||
419 | } | 429 | } |
420 | 430 | ||
421 | 431 | ||
@@ -427,6 +437,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName ) | |||
427 | if (numRead != numVertices) | 437 | if (numRead != numVertices) |
428 | { | 438 | { |
429 | llerrs << "can't read TexCoords from " << fileName << llendl; | 439 | llerrs << "can't read TexCoords from " << fileName << llendl; |
440 | return FALSE; | ||
430 | } | 441 | } |
431 | 442 | ||
432 | //---------------------------------------------------------------- | 443 | //---------------------------------------------------------------- |
@@ -439,6 +450,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName ) | |||
439 | if (numRead != numVertices) | 450 | if (numRead != numVertices) |
440 | { | 451 | { |
441 | llerrs << "can't read DetailTexCoords from " << fileName << llendl; | 452 | llerrs << "can't read DetailTexCoords from " << fileName << llendl; |
453 | return FALSE; | ||
442 | } | 454 | } |
443 | } | 455 | } |
444 | 456 | ||
@@ -452,6 +464,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName ) | |||
452 | if (numRead != numVertices) | 464 | if (numRead != numVertices) |
453 | { | 465 | { |
454 | llerrs << "can't read Weights from " << fileName << llendl; | 466 | llerrs << "can't read Weights from " << fileName << llendl; |
467 | return FALSE; | ||
455 | } | 468 | } |
456 | } | 469 | } |
457 | } | 470 | } |
@@ -465,6 +478,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName ) | |||
465 | if (numRead != 1) | 478 | if (numRead != 1) |
466 | { | 479 | { |
467 | llerrs << "can't read NumFaces from " << fileName << llendl; | 480 | llerrs << "can't read NumFaces from " << fileName << llendl; |
481 | return FALSE; | ||
468 | } | 482 | } |
469 | allocateFaceData( numFaces ); | 483 | allocateFaceData( numFaces ); |
470 | 484 | ||
@@ -482,6 +496,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName ) | |||
482 | if (numRead != 3) | 496 | if (numRead != 3) |
483 | { | 497 | { |
484 | llerrs << "can't read Face[" << i << "] from " << fileName << llendl; | 498 | llerrs << "can't read Face[" << i << "] from " << fileName << llendl; |
499 | return FALSE; | ||
485 | } | 500 | } |
486 | if (mReferenceData) | 501 | if (mReferenceData) |
487 | { | 502 | { |
@@ -538,6 +553,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName ) | |||
538 | if (numRead != 1) | 553 | if (numRead != 1) |
539 | { | 554 | { |
540 | llerrs << "can't read NumSkinJoints from " << fileName << llendl; | 555 | llerrs << "can't read NumSkinJoints from " << fileName << llendl; |
556 | return FALSE; | ||
541 | } | 557 | } |
542 | allocateJointNames( numSkinJoints ); | 558 | allocateJointNames( numSkinJoints ); |
543 | } | 559 | } |
@@ -547,11 +563,13 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName ) | |||
547 | //---------------------------------------------------------------- | 563 | //---------------------------------------------------------------- |
548 | for (i=0; i < numSkinJoints; i++) | 564 | for (i=0; i < numSkinJoints; i++) |
549 | { | 565 | { |
550 | char jointName[64]; /*Flawfinder: ignore*/ | 566 | char jointName[64+1]; |
551 | numRead = fread(jointName, sizeof(jointName), 1, fp); | 567 | numRead = fread(jointName, sizeof(jointName)-1, 1, fp); |
568 | jointName[sizeof(jointName)-1] = '\0'; // ensure nul-termination | ||
552 | if (numRead != 1) | 569 | if (numRead != 1) |
553 | { | 570 | { |
554 | llerrs << "can't read Skin[" << i << "].Name from " << fileName << llendl; | 571 | llerrs << "can't read Skin[" << i << "].Name from " << fileName << llendl; |
572 | return FALSE; | ||
555 | } | 573 | } |
556 | 574 | ||
557 | std::string *jn = &mJointNames[i]; | 575 | std::string *jn = &mJointNames[i]; |
@@ -561,7 +579,8 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName ) | |||
561 | //------------------------------------------------------------------------- | 579 | //------------------------------------------------------------------------- |
562 | // look for morph section | 580 | // look for morph section |
563 | //------------------------------------------------------------------------- | 581 | //------------------------------------------------------------------------- |
564 | char morphName[64]; /*Flawfinder: ignore*/ | 582 | char morphName[64+1]; |
583 | morphName[sizeof(morphName)-1] = '\0'; // ensure nul-termination | ||
565 | while(fread(&morphName, sizeof(char), 64, fp) == 64) | 584 | while(fread(&morphName, sizeof(char), 64, fp) == 64) |
566 | { | 585 | { |
567 | if (!strcmp(morphName, "End Morphs")) | 586 | if (!strcmp(morphName, "End Morphs")) |
@@ -991,6 +1010,13 @@ BOOL LLPolySkeletalDistortionInfo::parseXml(LLXmlTreeNode* node) | |||
991 | 1010 | ||
992 | LLXmlTreeNode* skeletalParam = node->getChildByName("param_skeleton"); | 1011 | LLXmlTreeNode* skeletalParam = node->getChildByName("param_skeleton"); |
993 | 1012 | ||
1013 | if (NULL == skeletalParam) | ||
1014 | { | ||
1015 | llwarns << "Failed to getChildByName(\"param_skeleton\")" | ||
1016 | << llendl; | ||
1017 | return FALSE; | ||
1018 | } | ||
1019 | |||
994 | for( LLXmlTreeNode* bone = skeletalParam->getFirstChild(); bone; bone = skeletalParam->getNextChild() ) | 1020 | for( LLXmlTreeNode* bone = skeletalParam->getFirstChild(); bone; bone = skeletalParam->getNextChild() ) |
995 | { | 1021 | { |
996 | if (bone->hasName("bone")) | 1022 | if (bone->hasName("bone")) |
diff --git a/linden/indra/newview/llpolymorph.cpp b/linden/indra/newview/llpolymorph.cpp index 2d1375d..b36f0e2 100644 --- a/linden/indra/newview/llpolymorph.cpp +++ b/linden/indra/newview/llpolymorph.cpp | |||
@@ -214,6 +214,13 @@ BOOL LLPolyMorphTargetInfo::parseXml(LLXmlTreeNode* node) | |||
214 | 214 | ||
215 | LLXmlTreeNode *paramNode = node->getChildByName("param_morph"); | 215 | LLXmlTreeNode *paramNode = node->getChildByName("param_morph"); |
216 | 216 | ||
217 | if (NULL == paramNode) | ||
218 | { | ||
219 | llwarns << "Failed to getChildByName(\"param_morph\")" | ||
220 | << llendl; | ||
221 | return FALSE; | ||
222 | } | ||
223 | |||
217 | for (LLXmlTreeNode* child_node = paramNode->getFirstChild(); | 224 | for (LLXmlTreeNode* child_node = paramNode->getFirstChild(); |
218 | child_node; | 225 | child_node; |
219 | child_node = paramNode->getNextChild()) | 226 | child_node = paramNode->getNextChild()) |
@@ -256,7 +263,10 @@ LLPolyMorphTarget::LLPolyMorphTarget(LLPolyMesh *poly_mesh) | |||
256 | //----------------------------------------------------------------------------- | 263 | //----------------------------------------------------------------------------- |
257 | LLPolyMorphTarget::~LLPolyMorphTarget() | 264 | LLPolyMorphTarget::~LLPolyMorphTarget() |
258 | { | 265 | { |
259 | delete mVertMask; | 266 | if (mVertMask) |
267 | { | ||
268 | delete mVertMask; | ||
269 | } | ||
260 | } | 270 | } |
261 | 271 | ||
262 | //----------------------------------------------------------------------------- | 272 | //----------------------------------------------------------------------------- |
diff --git a/linden/indra/newview/llpreview.cpp b/linden/indra/newview/llpreview.cpp index 347c6d5..23f31aa 100644 --- a/linden/indra/newview/llpreview.cpp +++ b/linden/indra/newview/llpreview.cpp | |||
@@ -60,6 +60,7 @@ LLPreview::LLPreview(const std::string& name) : | |||
60 | LLFloater(name), | 60 | LLFloater(name), |
61 | mCopyToInvBtn(NULL), | 61 | mCopyToInvBtn(NULL), |
62 | mForceClose(FALSE), | 62 | mForceClose(FALSE), |
63 | mUserResized(FALSE), | ||
63 | mCloseAfterSave(FALSE), | 64 | mCloseAfterSave(FALSE), |
64 | mAssetStatus(PREVIEW_ASSET_UNLOADED) | 65 | mAssetStatus(PREVIEW_ASSET_UNLOADED) |
65 | { | 66 | { |
@@ -76,6 +77,7 @@ LLPreview::LLPreview(const std::string& name, const LLRect& rect, const std::str | |||
76 | mObjectUUID(object_uuid), | 77 | mObjectUUID(object_uuid), |
77 | mCopyToInvBtn( NULL ), | 78 | mCopyToInvBtn( NULL ), |
78 | mForceClose( FALSE ), | 79 | mForceClose( FALSE ), |
80 | mUserResized(FALSE), | ||
79 | mCloseAfterSave(FALSE), | 81 | mCloseAfterSave(FALSE), |
80 | mAssetStatus(PREVIEW_ASSET_UNLOADED) | 82 | mAssetStatus(PREVIEW_ASSET_UNLOADED) |
81 | { | 83 | { |
@@ -189,8 +191,6 @@ void LLPreview::onCommit() | |||
189 | } | 191 | } |
190 | 192 | ||
191 | LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); | 193 | LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); |
192 | BOOL has_sale_info = FALSE; | ||
193 | LLSaleInfo sale_info; | ||
194 | new_item->setDescription(childGetText("desc")); | 194 | new_item->setDescription(childGetText("desc")); |
195 | if(mObjectUUID.notNull()) | 195 | if(mObjectUUID.notNull()) |
196 | { | 196 | { |
@@ -222,11 +222,6 @@ void LLPreview::onCommit() | |||
222 | gSelectMgr->deselectAll(); | 222 | gSelectMgr->deselectAll(); |
223 | gSelectMgr->addAsIndividual( obj, SELECT_ALL_TES, FALSE ); | 223 | gSelectMgr->addAsIndividual( obj, SELECT_ALL_TES, FALSE ); |
224 | gSelectMgr->selectionSetObjectDescription( childGetText("desc") ); | 224 | gSelectMgr->selectionSetObjectDescription( childGetText("desc") ); |
225 | |||
226 | if( has_sale_info ) | ||
227 | { | ||
228 | gSelectMgr->selectionSetObjectSaleInfo( sale_info ); | ||
229 | } | ||
230 | 225 | ||
231 | gSelectMgr->deselectAll(); | 226 | gSelectMgr->deselectAll(); |
232 | } | 227 | } |
@@ -487,6 +482,12 @@ LLPreview* LLPreview::getFirstPreviewForSource(const LLUUID& source_id) | |||
487 | return NULL; | 482 | return NULL; |
488 | } | 483 | } |
489 | 484 | ||
485 | void LLPreview::userSetShape(const LLRect& new_rect) | ||
486 | { | ||
487 | userResized(); | ||
488 | LLView::userSetShape(new_rect); | ||
489 | } | ||
490 | |||
490 | // | 491 | // |
491 | // LLMultiPreview | 492 | // LLMultiPreview |
492 | // | 493 | // |
@@ -506,6 +507,15 @@ void LLMultiPreview::open() /*Flawfinder: ignore*/ | |||
506 | } | 507 | } |
507 | } | 508 | } |
508 | 509 | ||
510 | |||
511 | void LLMultiPreview::userSetShape(const LLRect& new_rect) | ||
512 | { | ||
513 | LLPreview* frontmost_preview = (LLPreview*)mTabContainer->getCurrentPanel(); | ||
514 | if (frontmost_preview) frontmost_preview->userResized(); | ||
515 | LLView::userSetShape(new_rect); | ||
516 | } | ||
517 | |||
518 | |||
509 | void LLMultiPreview::tabOpen(LLFloater* opened_floater, bool from_click) | 519 | void LLMultiPreview::tabOpen(LLFloater* opened_floater, bool from_click) |
510 | { | 520 | { |
511 | LLPreview* opened_preview = (LLPreview*)opened_floater; | 521 | LLPreview* opened_preview = (LLPreview*)opened_floater; |
diff --git a/linden/indra/newview/llpreview.h b/linden/indra/newview/llpreview.h index 266bdd1..c8c0355 100644 --- a/linden/indra/newview/llpreview.h +++ b/linden/indra/newview/llpreview.h | |||
@@ -48,6 +48,7 @@ public: | |||
48 | 48 | ||
49 | /*virtual*/void open(); /*Flawfinder: ignore*/ | 49 | /*virtual*/void open(); /*Flawfinder: ignore*/ |
50 | /*virtual*/void tabOpen(LLFloater* opened_floater, bool from_click); | 50 | /*virtual*/void tabOpen(LLFloater* opened_floater, bool from_click); |
51 | /*virtual*/ void userSetShape(const LLRect& new_rect); | ||
51 | 52 | ||
52 | static LLMultiPreview* getAutoOpenInstance(const LLUUID& id); | 53 | static LLMultiPreview* getAutoOpenInstance(const LLUUID& id); |
53 | static void setAutoOpenInstance(LLMultiPreview* previewp, const LLUUID& id); | 54 | static void setAutoOpenInstance(LLMultiPreview* previewp, const LLUUID& id); |
@@ -101,6 +102,9 @@ public: | |||
101 | void addKeepDiscardButtons(); | 102 | void addKeepDiscardButtons(); |
102 | static void onKeepBtn(void* data); | 103 | static void onKeepBtn(void* data); |
103 | static void onDiscardBtn(void* data); | 104 | static void onDiscardBtn(void* data); |
105 | /*virtual*/ void userSetShape(const LLRect& new_rect); | ||
106 | |||
107 | void userResized() { mUserResized = TRUE; }; | ||
104 | 108 | ||
105 | virtual void loadAsset() { mAssetStatus = PREVIEW_ASSET_LOADED; } | 109 | virtual void loadAsset() { mAssetStatus = PREVIEW_ASSET_LOADED; } |
106 | virtual EAssetStatus getAssetStatus() { return mAssetStatus;} | 110 | virtual EAssetStatus getAssetStatus() { return mAssetStatus;} |
@@ -135,6 +139,8 @@ protected: | |||
135 | // Close without saving changes | 139 | // Close without saving changes |
136 | BOOL mForceClose; | 140 | BOOL mForceClose; |
137 | 141 | ||
142 | BOOL mUserResized; | ||
143 | |||
138 | // When closing springs a "Want to save?" dialog, we want | 144 | // When closing springs a "Want to save?" dialog, we want |
139 | // to keep the preview open until the save completes. | 145 | // to keep the preview open until the save completes. |
140 | BOOL mCloseAfterSave; | 146 | BOOL mCloseAfterSave; |
diff --git a/linden/indra/newview/llpreviewgesture.cpp b/linden/indra/newview/llpreviewgesture.cpp index 5f657d3..2bb0108 100644 --- a/linden/indra/newview/llpreviewgesture.cpp +++ b/linden/indra/newview/llpreviewgesture.cpp | |||
@@ -1590,6 +1590,11 @@ LLScrollListItem* LLPreviewGesture::addStep(const std::string& library_text) | |||
1590 | { | 1590 | { |
1591 | step = new LLGestureStepWait(); | 1591 | step = new LLGestureStepWait(); |
1592 | } | 1592 | } |
1593 | else | ||
1594 | { | ||
1595 | llerrs << "Unknown step type: " << library_text << llendl;; | ||
1596 | return NULL; | ||
1597 | } | ||
1593 | 1598 | ||
1594 | // Create an enabled item with this step | 1599 | // Create an enabled item with this step |
1595 | LLSD row; | 1600 | LLSD row; |
@@ -1645,7 +1650,7 @@ void LLPreviewGesture::onClickDelete(void* data) | |||
1645 | 1650 | ||
1646 | LLScrollListItem* item = self->mStepList->getFirstSelected(); | 1651 | LLScrollListItem* item = self->mStepList->getFirstSelected(); |
1647 | S32 selected_index = self->mStepList->getFirstSelectedIndex(); | 1652 | S32 selected_index = self->mStepList->getFirstSelectedIndex(); |
1648 | if (selected_index >= 0) | 1653 | if (item && selected_index >= 0) |
1649 | { | 1654 | { |
1650 | LLGestureStep* step = (LLGestureStep*)item->getUserdata(); | 1655 | LLGestureStep* step = (LLGestureStep*)item->getUserdata(); |
1651 | delete step; | 1656 | delete step; |
diff --git a/linden/indra/newview/llpreviewnotecard.cpp b/linden/indra/newview/llpreviewnotecard.cpp index 1c59bb4..471fe8a 100644 --- a/linden/indra/newview/llpreviewnotecard.cpp +++ b/linden/indra/newview/llpreviewnotecard.cpp | |||
@@ -296,11 +296,12 @@ void LLPreviewNotecard::loadAsset() | |||
296 | { | 296 | { |
297 | // The object that we're trying to look at disappeared, bail. | 297 | // The object that we're trying to look at disappeared, bail. |
298 | llwarns << "Can't find object " << mObjectUUID << " associated with notecard." << llendl; | 298 | llwarns << "Can't find object " << mObjectUUID << " associated with notecard." << llendl; |
299 | mAssetID.setNull(); | 299 | mAssetID.setNull(); |
300 | editor->setText("Unable to find object containing this note."); | 300 | editor->setText("Unable to find object containing this note."); |
301 | editor->makePristine(); | 301 | editor->makePristine(); |
302 | editor->setEnabled(FALSE); | 302 | editor->setEnabled(FALSE); |
303 | mAssetStatus = PREVIEW_ASSET_LOADED; | 303 | mAssetStatus = PREVIEW_ASSET_LOADED; |
304 | delete new_uuid; | ||
304 | return; | 305 | return; |
305 | } | 306 | } |
306 | } | 307 | } |
diff --git a/linden/indra/newview/llpreviewscript.cpp b/linden/indra/newview/llpreviewscript.cpp index 39938d4..86c78a5 100644 --- a/linden/indra/newview/llpreviewscript.cpp +++ b/linden/indra/newview/llpreviewscript.cpp | |||
@@ -470,12 +470,14 @@ void LLScriptEdCore::updateDynamicHelp(BOOL immediate) | |||
470 | LLFloater* help_floater = LLFloater::getFloaterByHandle(mLiveHelpHandle); | 470 | LLFloater* help_floater = LLFloater::getFloaterByHandle(mLiveHelpHandle); |
471 | if (!help_floater) return; | 471 | if (!help_floater) return; |
472 | 472 | ||
473 | #if LL_LIBXUL_ENABLED | ||
473 | // update back and forward buttons | 474 | // update back and forward buttons |
474 | LLButton* fwd_button = LLUICtrlFactory::getButtonByName(help_floater, "fwd_btn"); | 475 | LLButton* fwd_button = LLUICtrlFactory::getButtonByName(help_floater, "fwd_btn"); |
475 | LLButton* back_button = LLUICtrlFactory::getButtonByName(help_floater, "back_btn"); | 476 | LLButton* back_button = LLUICtrlFactory::getButtonByName(help_floater, "back_btn"); |
476 | LLWebBrowserCtrl* browser = LLUICtrlFactory::getWebBrowserCtrlByName(help_floater, "lsl_guide_html"); | 477 | LLWebBrowserCtrl* browser = LLUICtrlFactory::getWebBrowserCtrlByName(help_floater, "lsl_guide_html"); |
477 | back_button->setEnabled(browser->canNavigateBack()); | 478 | back_button->setEnabled(browser->canNavigateBack()); |
478 | fwd_button->setEnabled(browser->canNavigateForward()); | 479 | fwd_button->setEnabled(browser->canNavigateForward()); |
480 | #endif // LL_LIBXUL_ENABLED | ||
479 | 481 | ||
480 | if (!immediate && !gSavedSettings.getBOOL("ScriptHelpFollowsCursor")) | 482 | if (!immediate && !gSavedSettings.getBOOL("ScriptHelpFollowsCursor")) |
481 | { | 483 | { |
@@ -521,7 +523,7 @@ void LLScriptEdCore::updateDynamicHelp(BOOL immediate) | |||
521 | mLiveHelpTimer.stop(); | 523 | mLiveHelpTimer.stop(); |
522 | } | 524 | } |
523 | } | 525 | } |
524 | else | 526 | else if (immediate) |
525 | { | 527 | { |
526 | setHelpPage(""); | 528 | setHelpPage(""); |
527 | } | 529 | } |
@@ -543,7 +545,9 @@ void LLScriptEdCore::setHelpPage(const LLString& help_string) | |||
543 | url_string.setArg("[LSL_STRING]", help_string); | 545 | url_string.setArg("[LSL_STRING]", help_string); |
544 | 546 | ||
545 | addHelpItemToHistory(help_string); | 547 | addHelpItemToHistory(help_string); |
548 | #if LL_LIBXUL_ENABLED | ||
546 | web_browser->navigateTo(url_string); | 549 | web_browser->navigateTo(url_string); |
550 | #endif // LL_LIBXUL_ENABLED | ||
547 | } | 551 | } |
548 | 552 | ||
549 | void LLScriptEdCore::addHelpItemToHistory(const LLString& help_string) | 553 | void LLScriptEdCore::addHelpItemToHistory(const LLString& help_string) |
@@ -675,8 +679,10 @@ void LLScriptEdCore::onBtnDynamicHelp(void* userdata) | |||
675 | live_help_floater->childSetAction("back_btn", onClickBack, userdata); | 679 | live_help_floater->childSetAction("back_btn", onClickBack, userdata); |
676 | live_help_floater->childSetAction("fwd_btn", onClickForward, userdata); | 680 | live_help_floater->childSetAction("fwd_btn", onClickForward, userdata); |
677 | 681 | ||
682 | #if LL_LIBXUL_ENABLED | ||
678 | LLWebBrowserCtrl* browser = LLUICtrlFactory::getWebBrowserCtrlByName(live_help_floater, "lsl_guide_html"); | 683 | LLWebBrowserCtrl* browser = LLUICtrlFactory::getWebBrowserCtrlByName(live_help_floater, "lsl_guide_html"); |
679 | browser->setAlwaysRefresh(TRUE); | 684 | browser->setAlwaysRefresh(TRUE); |
685 | #endif // LL_LIBXUL_ENABLED | ||
680 | 686 | ||
681 | LLComboBox* help_combo = LLUICtrlFactory::getComboBoxByName(live_help_floater, "history_combo"); | 687 | LLComboBox* help_combo = LLUICtrlFactory::getComboBoxByName(live_help_floater, "history_combo"); |
682 | LLKeywordToken *token; | 688 | LLKeywordToken *token; |
@@ -700,6 +706,7 @@ void LLScriptEdCore::onBtnDynamicHelp(void* userdata) | |||
700 | //static | 706 | //static |
701 | void LLScriptEdCore::onClickBack(void* userdata) | 707 | void LLScriptEdCore::onClickBack(void* userdata) |
702 | { | 708 | { |
709 | #if LL_LIBXUL_ENABLED | ||
703 | LLScriptEdCore* corep = (LLScriptEdCore*)userdata; | 710 | LLScriptEdCore* corep = (LLScriptEdCore*)userdata; |
704 | LLFloater* live_help_floater = LLFloater::getFloaterByHandle(corep->mLiveHelpHandle); | 711 | LLFloater* live_help_floater = LLFloater::getFloaterByHandle(corep->mLiveHelpHandle); |
705 | if (live_help_floater) | 712 | if (live_help_floater) |
@@ -710,11 +717,13 @@ void LLScriptEdCore::onClickBack(void* userdata) | |||
710 | browserp->navigateBack(); | 717 | browserp->navigateBack(); |
711 | } | 718 | } |
712 | } | 719 | } |
720 | #endif // LL_LIBXUL_ENABLED | ||
713 | } | 721 | } |
714 | 722 | ||
715 | //static | 723 | //static |
716 | void LLScriptEdCore::onClickForward(void* userdata) | 724 | void LLScriptEdCore::onClickForward(void* userdata) |
717 | { | 725 | { |
726 | #if LL_LIBXUL_ENABLED | ||
718 | LLScriptEdCore* corep = (LLScriptEdCore*)userdata; | 727 | LLScriptEdCore* corep = (LLScriptEdCore*)userdata; |
719 | LLFloater* live_help_floater = LLFloater::getFloaterByHandle(corep->mLiveHelpHandle); | 728 | LLFloater* live_help_floater = LLFloater::getFloaterByHandle(corep->mLiveHelpHandle); |
720 | if (live_help_floater) | 729 | if (live_help_floater) |
@@ -725,6 +734,7 @@ void LLScriptEdCore::onClickForward(void* userdata) | |||
725 | browserp->navigateForward(); | 734 | browserp->navigateForward(); |
726 | } | 735 | } |
727 | } | 736 | } |
737 | #endif // LL_LIBXUL_ENABLED | ||
728 | } | 738 | } |
729 | 739 | ||
730 | // static | 740 | // static |
@@ -757,16 +767,17 @@ void LLScriptEdCore::onHelpComboCommit(LLUICtrl* ctrl, void* userdata) | |||
757 | LLFloater* live_help_floater = LLFloater::getFloaterByHandle(corep->mLiveHelpHandle); | 767 | LLFloater* live_help_floater = LLFloater::getFloaterByHandle(corep->mLiveHelpHandle); |
758 | if (live_help_floater) | 768 | if (live_help_floater) |
759 | { | 769 | { |
760 | LLWebBrowserCtrl* web_browser = gUICtrlFactory->getWebBrowserCtrlByName(live_help_floater, "lsl_guide_html"); | ||
761 | |||
762 | LLString help_string = ctrl->getValue().asString(); | 770 | LLString help_string = ctrl->getValue().asString(); |
763 | 771 | ||
764 | corep->addHelpItemToHistory(help_string); | 772 | corep->addHelpItemToHistory(help_string); |
765 | 773 | ||
774 | #if LL_LIBXUL_ENABLED | ||
775 | LLWebBrowserCtrl* web_browser = gUICtrlFactory->getWebBrowserCtrlByName(live_help_floater, "lsl_guide_html"); | ||
766 | LLUIString url_string = gSavedSettings.getString("LSLHelpURL"); | 776 | LLUIString url_string = gSavedSettings.getString("LSLHelpURL"); |
767 | url_string.setArg("[APP_DIRECTORY]", gDirUtilp->getWorkingDir()); | 777 | url_string.setArg("[APP_DIRECTORY]", gDirUtilp->getWorkingDir()); |
768 | url_string.setArg("[LSL_STRING]", help_string); | 778 | url_string.setArg("[LSL_STRING]", help_string); |
769 | web_browser->navigateTo(url_string); | 779 | web_browser->navigateTo(url_string); |
780 | #endif // LL_LIBXUL_ENABLED | ||
770 | } | 781 | } |
771 | } | 782 | } |
772 | 783 | ||
@@ -1336,10 +1347,6 @@ void LLPreviewLSL::uploadAssetLegacy(const std::string& filename, | |||
1336 | { | 1347 | { |
1337 | break; | 1348 | break; |
1338 | } | 1349 | } |
1339 | else if(!buffer) | ||
1340 | { | ||
1341 | continue; | ||
1342 | } | ||
1343 | else | 1350 | else |
1344 | { | 1351 | { |
1345 | line.assign(buffer); | 1352 | line.assign(buffer); |
@@ -1709,7 +1716,7 @@ void LLLiveLSLEditor::loadAsset(BOOL is_new) | |||
1709 | mScriptEd->mEditor->setEnabled(FALSE); | 1716 | mScriptEd->mEditor->setEnabled(FALSE); |
1710 | mAssetStatus = PREVIEW_ASSET_LOADED; | 1717 | mAssetStatus = PREVIEW_ASSET_LOADED; |
1711 | } | 1718 | } |
1712 | else if(mItem.notNull()) | 1719 | else if(item && mItem.notNull()) |
1713 | { | 1720 | { |
1714 | // request the text from the object | 1721 | // request the text from the object |
1715 | LLUUID* user_data = new LLUUID(mItemID ^ mObjectID); | 1722 | LLUUID* user_data = new LLUUID(mItemID ^ mObjectID); |
@@ -1835,6 +1842,7 @@ void LLLiveLSLEditor::loadScriptText(const char* filename) | |||
1835 | if(!filename) | 1842 | if(!filename) |
1836 | { | 1843 | { |
1837 | llerrs << "Filename is Empty!" << llendl; | 1844 | llerrs << "Filename is Empty!" << llendl; |
1845 | return; | ||
1838 | } | 1846 | } |
1839 | FILE* file = LLFile::fopen(filename, "rb"); /*Flawfinder: ignore*/ | 1847 | FILE* file = LLFile::fopen(filename, "rb"); /*Flawfinder: ignore*/ |
1840 | if(file) | 1848 | if(file) |
@@ -2115,10 +2123,6 @@ void LLLiveLSLEditor::uploadAssetLegacy(const std::string& filename, | |||
2115 | { | 2123 | { |
2116 | break; | 2124 | break; |
2117 | } | 2125 | } |
2118 | else if(!buffer) | ||
2119 | { | ||
2120 | continue; | ||
2121 | } | ||
2122 | else | 2126 | else |
2123 | { | 2127 | { |
2124 | line.assign(buffer); | 2128 | line.assign(buffer); |
diff --git a/linden/indra/newview/llpreviewtexture.cpp b/linden/indra/newview/llpreviewtexture.cpp index 27a9b52..b59846d 100644 --- a/linden/indra/newview/llpreviewtexture.cpp +++ b/linden/indra/newview/llpreviewtexture.cpp | |||
@@ -388,29 +388,23 @@ void LLPreviewTexture::updateAspectRatio() | |||
388 | // If that fails, cut width by half. | 388 | // If that fails, cut width by half. |
389 | S32 client_width = image_width; | 389 | S32 client_width = image_width; |
390 | S32 horiz_pad = 2 * (LLPANEL_BORDER_WIDTH + PREVIEW_PAD) + PREVIEW_RESIZE_HANDLE_SIZE; | 390 | S32 horiz_pad = 2 * (LLPANEL_BORDER_WIDTH + PREVIEW_PAD) + PREVIEW_RESIZE_HANDLE_SIZE; |
391 | S32 vert_pad = PREVIEW_HEADER_SIZE + 2 * CLIENT_RECT_VPAD + LLPANEL_BORDER_WIDTH; | ||
391 | S32 screen_width = gViewerWindow->getWindowWidth(); | 392 | S32 screen_width = gViewerWindow->getWindowWidth(); |
392 | S32 max_client_width = screen_width - horiz_pad; | 393 | S32 max_client_width = screen_width - horiz_pad; |
394 | S32 max_client_height = gViewerWindow->getWindowHeight() - vert_pad; | ||
395 | F32 inv_aspect_ratio = (F32) image_height / (F32) image_width; | ||
393 | 396 | ||
394 | while (client_width > max_client_width) | 397 | while ((client_width > max_client_width) || ( llround(client_width * inv_aspect_ratio) > max_client_height ) ) |
395 | { | 398 | { |
396 | client_width /= 2; | 399 | client_width /= 2; |
397 | } | 400 | } |
398 | 401 | ||
399 | // Demand width at least 128 | ||
400 | if (client_width < 128) | ||
401 | { | ||
402 | client_width = 128; | ||
403 | } | ||
404 | |||
405 | S32 view_width = client_width + horiz_pad; | 402 | S32 view_width = client_width + horiz_pad; |
406 | 403 | ||
407 | // Adjust the height based on the width computed above. | 404 | // Adjust the height based on the width computed above. |
408 | F32 inv_aspect_ratio = (F32) image_height / (F32) image_width; | ||
409 | S32 client_height = llround(client_width * inv_aspect_ratio); | 405 | S32 client_height = llround(client_width * inv_aspect_ratio); |
410 | S32 view_height = | 406 | S32 view_height = client_height + vert_pad; |
411 | PREVIEW_HEADER_SIZE + // header (includes top border) | 407 | |
412 | client_height + 2 * CLIENT_RECT_VPAD + // texture plus uniform spacing (which leaves room for resize handle) | ||
413 | LLPANEL_BORDER_WIDTH; // bottom border | ||
414 | 408 | ||
415 | // set text on dimensions display (should be moved out of here and into a callback of some sort) | 409 | // set text on dimensions display (should be moved out of here and into a callback of some sort) |
416 | childSetTextArg("dimensions", "[WIDTH]", llformat("%d", mImage->mFullWidth)); | 410 | childSetTextArg("dimensions", "[WIDTH]", llformat("%d", mImage->mFullWidth)); |
@@ -453,28 +447,43 @@ void LLPreviewTexture::updateAspectRatio() | |||
453 | } | 447 | } |
454 | } | 448 | } |
455 | 449 | ||
456 | // clamp texture size to fit within actual size of floater after attempting resize | 450 | |
457 | client_width = llmin(client_width, mRect.getWidth() - horiz_pad); | 451 | if (!mUserResized) |
458 | client_height = llmin(client_height, mRect.getHeight() - PREVIEW_HEADER_SIZE - (2 * CLIENT_RECT_VPAD) - LLPANEL_BORDER_WIDTH - info_height); | ||
459 | |||
460 | LLRect window_rect(0, mRect.getHeight(), mRect.getWidth(), 0); | ||
461 | window_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD); | ||
462 | window_rect.mBottom += PREVIEW_BORDER + button_height + CLIENT_RECT_VPAD + info_height + CLIENT_RECT_VPAD; | ||
463 | |||
464 | if (getHost()) | ||
465 | { | 452 | { |
466 | // try to keep aspect ratio when hosted, as hosting view can resize without user input | 453 | // clamp texture size to fit within actual size of floater after attempting resize |
467 | mClientRect.setLeftTopAndSize(window_rect.getCenterX() - (client_width / 2), window_rect.mTop, client_width, client_height); | 454 | client_width = llmin(client_width, mRect.getWidth() - horiz_pad); |
455 | client_height = llmin(client_height, mRect.getHeight() - PREVIEW_HEADER_SIZE | ||
456 | - (2 * CLIENT_RECT_VPAD) - LLPANEL_BORDER_WIDTH - info_height); | ||
457 | |||
458 | |||
468 | } | 459 | } |
469 | else | 460 | else |
470 | { | 461 | { |
471 | mClientRect.setLeftTopAndSize(LLPANEL_BORDER_WIDTH + PREVIEW_PAD + 6, | 462 | client_width = mRect.getWidth() - horiz_pad; |
472 | mRect.getHeight() - (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD), | 463 | client_height = llround(client_width * inv_aspect_ratio); |
473 | mRect.getWidth() - horiz_pad, | 464 | } |
474 | client_height); | 465 | |
466 | |||
467 | S32 max_height = mRect.getHeight() - PREVIEW_BORDER - button_height | ||
468 | - CLIENT_RECT_VPAD - info_height - CLIENT_RECT_VPAD - PREVIEW_HEADER_SIZE; | ||
469 | max_height = llmax(max_height, 1); | ||
470 | |||
471 | if (client_height > max_height) | ||
472 | { | ||
473 | F32 aspect_ratio = (F32) image_width / (F32) image_height; | ||
474 | client_height = max_height; | ||
475 | client_width = llround(client_height * aspect_ratio); | ||
475 | } | 476 | } |
477 | |||
478 | LLRect window_rect(0, mRect.getHeight(), mRect.getWidth(), 0); | ||
479 | window_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD); | ||
480 | window_rect.mBottom += PREVIEW_BORDER + button_height + CLIENT_RECT_VPAD + info_height + CLIENT_RECT_VPAD; | ||
481 | |||
482 | // try to keep aspect ratio when hosted, as hosting view can resize without user input | ||
483 | mClientRect.setLeftTopAndSize(window_rect.getCenterX() - (client_width / 2), window_rect.mTop, client_width, client_height); | ||
476 | } | 484 | } |
477 | 485 | ||
486 | |||
478 | void LLPreviewTexture::loadAsset() | 487 | void LLPreviewTexture::loadAsset() |
479 | { | 488 | { |
480 | mImage = gImageList.getImage(mImageID, MIPMAP_TRUE, FALSE); | 489 | mImage = gImageList.getImage(mImageID, MIPMAP_TRUE, FALSE); |
diff --git a/linden/indra/newview/llresourcedata.h b/linden/indra/newview/llresourcedata.h new file mode 100644 index 0000000..9f5d329 --- /dev/null +++ b/linden/indra/newview/llresourcedata.h | |||
@@ -0,0 +1,44 @@ | |||
1 | /** | ||
2 | * @file llresourcedata.h | ||
3 | * @brief Tracking object for uploads. | ||
4 | * | ||
5 | * Copyright (c) 2006-2007, Linden Research, Inc. | ||
6 | * | ||
7 | * Second Life Viewer Source Code | ||
8 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
9 | * to you under the terms of the GNU General Public License, version 2.0 | ||
10 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
11 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
12 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
13 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
14 | * | ||
15 | * There are special exceptions to the terms and conditions of the GPL as | ||
16 | * it is applied to this Source Code. View the full text of the exception | ||
17 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
18 | * online at http://secondlife.com/developers/opensource/flossexception | ||
19 | * | ||
20 | * By copying, modifying or distributing this software, you acknowledge | ||
21 | * that you have read and understood your obligations described above, | ||
22 | * and agree to abide by those obligations. | ||
23 | * | ||
24 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
25 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
26 | * COMPLETENESS OR PERFORMANCE. | ||
27 | */ | ||
28 | |||
29 | #ifndef LLRESOURCEDATA_H | ||
30 | #define LLRESOURCEDATA_H | ||
31 | |||
32 | #include "llassetstorage.h" | ||
33 | #include "llinventorytype.h" | ||
34 | |||
35 | struct LLResourceData | ||
36 | { | ||
37 | LLAssetInfo mAssetInfo; | ||
38 | LLAssetType::EType mPreferredLocation; | ||
39 | LLInventoryType::EType mInventoryType; | ||
40 | U32 mNextOwnerPerm; | ||
41 | void *mUserData; | ||
42 | }; | ||
43 | |||
44 | #endif | ||
diff --git a/linden/indra/newview/llselectmgr.cpp b/linden/indra/newview/llselectmgr.cpp index 598ded9..ec7ba78 100644 --- a/linden/indra/newview/llselectmgr.cpp +++ b/linden/indra/newview/llselectmgr.cpp | |||
@@ -91,7 +91,6 @@ const S32 MAX_ACTION_QUEUE_SIZE = 20; | |||
91 | const S32 MAX_SILS_PER_FRAME = 50; | 91 | const S32 MAX_SILS_PER_FRAME = 50; |
92 | const S32 MAX_OBJECTS_PER_PACKET = 254; | 92 | const S32 MAX_OBJECTS_PER_PACKET = 254; |
93 | 93 | ||
94 | extern LLGlobalEconomy *gGlobalEconomy; | ||
95 | extern LLUUID gLastHitObjectID; | 94 | extern LLUUID gLastHitObjectID; |
96 | extern LLVector3d gLastHitObjectOffset; | 95 | extern LLVector3d gLastHitObjectOffset; |
97 | 96 | ||
@@ -208,6 +207,20 @@ LLSelectMgr::~LLSelectMgr() | |||
208 | 207 | ||
209 | void LLSelectMgr::updateEffects() | 208 | void LLSelectMgr::updateEffects() |
210 | { | 209 | { |
210 | |||
211 | //keep reference grid objects active | ||
212 | for (LLSelectNode* grid_nodep = mGridObjects.getFirstNode(); | ||
213 | grid_nodep; | ||
214 | grid_nodep = mGridObjects.getNextNode()) | ||
215 | { | ||
216 | LLViewerObject* grid_object = grid_nodep->getObject(); | ||
217 | LLDrawable* drawable = grid_object->mDrawable; | ||
218 | if (drawable) | ||
219 | { | ||
220 | gPipeline.markMoved(drawable); | ||
221 | } | ||
222 | } | ||
223 | |||
211 | if (mEffectsTimer.getElapsedTimeF32() > 1.f) | 224 | if (mEffectsTimer.getElapsedTimeF32() > 1.f) |
212 | { | 225 | { |
213 | mSelectedObjects->updateEffects(); | 226 | mSelectedObjects->updateEffects(); |
@@ -993,7 +1006,7 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 & | |||
993 | LLVector3 first_grid_obj_pos = grid_object->getRenderPosition(); | 1006 | LLVector3 first_grid_obj_pos = grid_object->getRenderPosition(); |
994 | 1007 | ||
995 | LLVector3 min_extents(F32_MAX, F32_MAX, F32_MAX); | 1008 | LLVector3 min_extents(F32_MAX, F32_MAX, F32_MAX); |
996 | LLVector3 max_extents(F32_MIN, F32_MIN, F32_MIN); | 1009 | LLVector3 max_extents(-min_extents); |
997 | BOOL grid_changed = FALSE; | 1010 | BOOL grid_changed = FALSE; |
998 | LLSelectNode* grid_nodep; | 1011 | LLSelectNode* grid_nodep; |
999 | for (grid_nodep = mGridObjects.getFirstNode(); | 1012 | for (grid_nodep = mGridObjects.getFirstNode(); |
@@ -1001,34 +1014,23 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 & | |||
1001 | grid_nodep = mGridObjects.getNextNode()) | 1014 | grid_nodep = mGridObjects.getNextNode()) |
1002 | { | 1015 | { |
1003 | grid_object = grid_nodep->getObject(); | 1016 | grid_object = grid_nodep->getObject(); |
1004 | 1017 | LLDrawable* drawable = grid_object->mDrawable; | |
1005 | LLVector3 local_min_extents(F32_MAX, F32_MAX, F32_MAX); | 1018 | if (drawable) |
1006 | LLVector3 local_max_extents(F32_MIN, F32_MIN, F32_MIN); | ||
1007 | |||
1008 | // *FIX: silhouette flag is insufficient as it gets | ||
1009 | // cleared by view update. | ||
1010 | if (!mGridValid || | ||
1011 | grid_object->isChanged(LLXform::SILHOUETTE) | ||
1012 | || (grid_object->getParent() && grid_object->getParent()->isChanged(LLXform::SILHOUETTE))) | ||
1013 | { | 1019 | { |
1014 | getSilhouetteExtents(grid_nodep, mGridRotation, local_min_extents, local_max_extents); | 1020 | const LLVector3* ext = drawable->getSpatialExtents(); |
1021 | update_min_max(min_extents, max_extents, ext[0]); | ||
1022 | update_min_max(min_extents, max_extents, ext[1]); | ||
1015 | grid_changed = TRUE; | 1023 | grid_changed = TRUE; |
1016 | LLVector3 object_offset = (grid_object->getRenderPosition() - first_grid_obj_pos) * ~mGridRotation; | ||
1017 | local_min_extents += object_offset; | ||
1018 | local_max_extents += object_offset; | ||
1019 | } | 1024 | } |
1020 | min_extents.mV[VX] = llmin(min_extents.mV[VX], local_min_extents.mV[VX]); | ||
1021 | min_extents.mV[VY] = llmin(min_extents.mV[VY], local_min_extents.mV[VY]); | ||
1022 | min_extents.mV[VZ] = llmin(min_extents.mV[VZ], local_min_extents.mV[VZ]); | ||
1023 | max_extents.mV[VX] = llmax(max_extents.mV[VX], local_max_extents.mV[VX]); | ||
1024 | max_extents.mV[VY] = llmax(max_extents.mV[VY], local_max_extents.mV[VY]); | ||
1025 | max_extents.mV[VZ] = llmax(max_extents.mV[VZ], local_max_extents.mV[VZ]); | ||
1026 | } | 1025 | } |
1027 | if (grid_changed) | 1026 | if (grid_changed) |
1028 | { | 1027 | { |
1029 | mGridOrigin = lerp(min_extents, max_extents, 0.5f); | 1028 | mGridOrigin = lerp(min_extents, max_extents, 0.5f); |
1030 | mGridOrigin = mGridOrigin * ~mGridRotation; | 1029 | LLDrawable* drawable = grid_object->mDrawable; |
1031 | mGridOrigin += first_grid_obj_pos; | 1030 | if (drawable && drawable->isActive()) |
1031 | { | ||
1032 | mGridOrigin = mGridOrigin * grid_object->getRenderMatrix(); | ||
1033 | } | ||
1032 | mGridScale = (max_extents - min_extents) * 0.5f; | 1034 | mGridScale = (max_extents - min_extents) * 0.5f; |
1033 | } | 1035 | } |
1034 | } | 1036 | } |
@@ -4939,66 +4941,6 @@ void LLSelectMgr::generateSilhouette(LLSelectNode* nodep, const LLVector3& view_ | |||
4939 | } | 4941 | } |
4940 | } | 4942 | } |
4941 | 4943 | ||
4942 | void LLSelectMgr::getSilhouetteExtents(LLSelectNode* nodep, const LLQuaternion& orientation, LLVector3& min_extents, LLVector3& max_extents) | ||
4943 | { | ||
4944 | LLViewerObject* objectp = nodep->getObject(); | ||
4945 | |||
4946 | if (objectp->mDrawable.isNull()) | ||
4947 | { | ||
4948 | return; | ||
4949 | } | ||
4950 | |||
4951 | LLQuaternion test_rot = orientation * ~objectp->getRenderRotation(); | ||
4952 | LLVector3 x_axis_rot = LLVector3::x_axis * test_rot; | ||
4953 | LLVector3 y_axis_rot = LLVector3::y_axis * test_rot; | ||
4954 | LLVector3 z_axis_rot = LLVector3::z_axis * test_rot; | ||
4955 | |||
4956 | x_axis_rot.scaleVec(objectp->mDrawable->getScale()); | ||
4957 | y_axis_rot.scaleVec(objectp->mDrawable->getScale()); | ||
4958 | z_axis_rot.scaleVec(objectp->mDrawable->getScale()); | ||
4959 | |||
4960 | generateSilhouette(nodep, objectp->mDrawable->getPositionAgent() + x_axis_rot * 100.f); | ||
4961 | |||
4962 | S32 num_vertices = nodep->mSilhouetteVertices.size(); | ||
4963 | if (num_vertices) | ||
4964 | { | ||
4965 | min_extents.mV[VY] = llmin(min_extents.mV[VY], nodep->mSilhouetteVertices[0] * y_axis_rot); | ||
4966 | max_extents.mV[VY] = llmax(max_extents.mV[VY], nodep->mSilhouetteVertices[0] * y_axis_rot); | ||
4967 | |||
4968 | min_extents.mV[VZ] = llmin(min_extents.mV[VZ], nodep->mSilhouetteVertices[0] * z_axis_rot); | ||
4969 | max_extents.mV[VZ] = llmax(min_extents.mV[VZ], nodep->mSilhouetteVertices[0] * z_axis_rot); | ||
4970 | |||
4971 | for (S32 vert = 1; vert < num_vertices; vert++) | ||
4972 | { | ||
4973 | F32 y_pos = nodep->mSilhouetteVertices[vert] * y_axis_rot; | ||
4974 | F32 z_pos = nodep->mSilhouetteVertices[vert] * z_axis_rot; | ||
4975 | min_extents.mV[VY] = llmin(y_pos, min_extents.mV[VY]); | ||
4976 | max_extents.mV[VY] = llmax(y_pos, max_extents.mV[VY]); | ||
4977 | min_extents.mV[VZ] = llmin(z_pos, min_extents.mV[VZ]); | ||
4978 | max_extents.mV[VZ] = llmax(z_pos, max_extents.mV[VZ]); | ||
4979 | } | ||
4980 | } | ||
4981 | |||
4982 | generateSilhouette(nodep, objectp->mDrawable->getPositionAgent() + y_axis_rot * 100.f); | ||
4983 | |||
4984 | num_vertices = nodep->mSilhouetteVertices.size(); | ||
4985 | if (num_vertices) | ||
4986 | { | ||
4987 | min_extents.mV[VX] = llmin(min_extents.mV[VX], nodep->mSilhouetteVertices[0] * x_axis_rot); | ||
4988 | max_extents.mV[VX] = llmax(max_extents.mV[VX], nodep->mSilhouetteVertices[0] * x_axis_rot); | ||
4989 | |||
4990 | for (S32 vert = 1; vert < num_vertices; vert++) | ||
4991 | { | ||
4992 | F32 x_pos = nodep->mSilhouetteVertices[vert] * x_axis_rot; | ||
4993 | min_extents.mV[VX] = llmin(x_pos, min_extents.mV[VX]); | ||
4994 | max_extents.mV[VX] = llmax(x_pos, max_extents.mV[VX]); | ||
4995 | } | ||
4996 | } | ||
4997 | |||
4998 | generateSilhouette(nodep, gCamera->getOrigin()); | ||
4999 | } | ||
5000 | |||
5001 | |||
5002 | // | 4944 | // |
5003 | // Utility classes | 4945 | // Utility classes |
5004 | // | 4946 | // |
@@ -6479,6 +6421,8 @@ LLViewerObject* LLObjectSelection::getFirstDeleteableObject(BOOL get_root) | |||
6479 | } | 6421 | } |
6480 | else | 6422 | else |
6481 | { | 6423 | { |
6424 | // We've avoided this path for a while. It may not work. | ||
6425 | llwarns << "!get_root code path may have bitrotted." << llendl; | ||
6482 | for(LLViewerObject* current = getFirstObject(); | 6426 | for(LLViewerObject* current = getFirstObject(); |
6483 | current != NULL; | 6427 | current != NULL; |
6484 | current = getNextObject()) | 6428 | current = getNextObject()) |
diff --git a/linden/indra/newview/llselectmgr.h b/linden/indra/newview/llselectmgr.h index 98c0a7b..96db8e5 100644 --- a/linden/indra/newview/llselectmgr.h +++ b/linden/indra/newview/llselectmgr.h | |||
@@ -492,7 +492,6 @@ private: | |||
492 | ESelectType getSelectTypeForObject(LLViewerObject* object); | 492 | ESelectType getSelectTypeForObject(LLViewerObject* object); |
493 | void addAsFamily(LLDynamicArray<LLViewerObject*>& objects, BOOL add_to_end = FALSE); | 493 | void addAsFamily(LLDynamicArray<LLViewerObject*>& objects, BOOL add_to_end = FALSE); |
494 | void generateSilhouette(LLSelectNode *nodep, const LLVector3& view_point); | 494 | void generateSilhouette(LLSelectNode *nodep, const LLVector3& view_point); |
495 | void getSilhouetteExtents(LLSelectNode* nodep, const LLQuaternion& orientation, LLVector3& min_extents, LLVector3& max_extents); | ||
496 | // Send one message to each region containing an object on selection list. | 495 | // Send one message to each region containing an object on selection list. |
497 | void sendListToRegions( const LLString& message_name, | 496 | void sendListToRegions( const LLString& message_name, |
498 | void (*pack_header)(void *user_data), | 497 | void (*pack_header)(void *user_data), |
diff --git a/linden/indra/newview/llspatialpartition.cpp b/linden/indra/newview/llspatialpartition.cpp index 46b9df9..d62a93e 100644 --- a/linden/indra/newview/llspatialpartition.cpp +++ b/linden/indra/newview/llspatialpartition.cpp | |||
@@ -1180,6 +1180,13 @@ void LLSpatialPartition::move(LLDrawable *drawablep, LLSpatialGroup *curp, BOOL | |||
1180 | { | 1180 | { |
1181 | LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION); | 1181 | LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION); |
1182 | LLFastTimer t(LLFastTimer::FTM_UPDATE_MOVE); | 1182 | LLFastTimer t(LLFastTimer::FTM_UPDATE_MOVE); |
1183 | |||
1184 | // sanity check submitted by open source user bushing Spatula | ||
1185 | // who was seeing crashing here. (See VWR-424 reported by Bunny Mayne) | ||
1186 | if (!drawablep) { | ||
1187 | OCT_ERRS << "LLSpatialPartition::move was passed a bad drawable." << llendl; | ||
1188 | return; | ||
1189 | } | ||
1183 | 1190 | ||
1184 | BOOL was_visible = curp ? curp->isVisible() : FALSE; | 1191 | BOOL was_visible = curp ? curp->isVisible() : FALSE; |
1185 | 1192 | ||
diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp index 585f769..e83aa0d 100644 --- a/linden/indra/newview/llstartup.cpp +++ b/linden/indra/newview/llstartup.cpp | |||
@@ -203,6 +203,7 @@ LLPointer<LLImageGL> gStartImageGL; | |||
203 | static LLHost gAgentSimHost; | 203 | static LLHost gAgentSimHost; |
204 | static BOOL gSkipOptionalUpdate = FALSE; | 204 | static BOOL gSkipOptionalUpdate = FALSE; |
205 | 205 | ||
206 | bool gUseQuickTime = true; | ||
206 | bool gQuickTimeInitialized = false; | 207 | bool gQuickTimeInitialized = false; |
207 | static bool gGotUseCircuitCodeAck = false; | 208 | static bool gGotUseCircuitCodeAck = false; |
208 | LLString gInitialOutfit; | 209 | LLString gInitialOutfit; |
@@ -1867,7 +1868,8 @@ BOOL idle_startup() | |||
1867 | } | 1868 | } |
1868 | 1869 | ||
1869 | #if LL_QUICKTIME_ENABLED // windows only right now but will be ported to mac | 1870 | #if LL_QUICKTIME_ENABLED // windows only right now but will be ported to mac |
1870 | if (!gQuickTimeInitialized) | 1871 | if (gUseQuickTime |
1872 | && !gQuickTimeInitialized) | ||
1871 | { | 1873 | { |
1872 | // initialize quicktime libraries (fails gracefully if quicktime not installed ($QUICKTIME) | 1874 | // initialize quicktime libraries (fails gracefully if quicktime not installed ($QUICKTIME) |
1873 | llinfos << "Initializing QuickTime...." << llendl; | 1875 | llinfos << "Initializing QuickTime...." << llendl; |
diff --git a/linden/indra/newview/llstartup.h b/linden/indra/newview/llstartup.h index 59a433e..7c54b8c 100644 --- a/linden/indra/newview/llstartup.h +++ b/linden/indra/newview/llstartup.h | |||
@@ -82,6 +82,7 @@ enum EStartupState{ | |||
82 | // exorted symbol | 82 | // exorted symbol |
83 | extern S32 gStartupState; | 83 | extern S32 gStartupState; |
84 | extern BOOL gAgentMovementCompleted; | 84 | extern BOOL gAgentMovementCompleted; |
85 | extern bool gUseQuickTime; | ||
85 | extern bool gQuickTimeInitialized; | 86 | extern bool gQuickTimeInitialized; |
86 | extern LLPointer<LLImageGL> gStartImageGL; | 87 | extern LLPointer<LLImageGL> gStartImageGL; |
87 | 88 | ||
diff --git a/linden/indra/newview/llstatusbar.cpp b/linden/indra/newview/llstatusbar.cpp index 58ac8c2..784765b 100644 --- a/linden/indra/newview/llstatusbar.cpp +++ b/linden/indra/newview/llstatusbar.cpp | |||
@@ -643,3 +643,8 @@ void LLStatusBar::onClickBuyLand(void*) | |||
643 | gParcelMgr->selectParcelAt(gAgent.getPositionGlobal()); | 643 | gParcelMgr->selectParcelAt(gAgent.getPositionGlobal()); |
644 | gParcelMgr->startBuyLand(); | 644 | gParcelMgr->startBuyLand(); |
645 | } | 645 | } |
646 | |||
647 | BOOL can_afford_transaction(S32 cost) | ||
648 | { | ||
649 | return((cost <= 0)||((gStatusBar) && (gStatusBar->getBalance() >=cost))); | ||
650 | } | ||
diff --git a/linden/indra/newview/llstatusbar.h b/linden/indra/newview/llstatusbar.h index 52cc236..a072cd9 100644 --- a/linden/indra/newview/llstatusbar.h +++ b/linden/indra/newview/llstatusbar.h | |||
@@ -123,6 +123,9 @@ protected: | |||
123 | LLFrameTimer* mHealthTimer; | 123 | LLFrameTimer* mHealthTimer; |
124 | }; | 124 | }; |
125 | 125 | ||
126 | // *HACK: Status bar owns your cached money balance. JC | ||
127 | BOOL can_afford_transaction(S32 cost); | ||
128 | |||
126 | extern LLStatusBar *gStatusBar; | 129 | extern LLStatusBar *gStatusBar; |
127 | 130 | ||
128 | #endif | 131 | #endif |
diff --git a/linden/indra/newview/lltexlayer.cpp b/linden/indra/newview/lltexlayer.cpp index 237d563..2005e39 100644 --- a/linden/indra/newview/lltexlayer.cpp +++ b/linden/indra/newview/lltexlayer.cpp | |||
@@ -277,7 +277,7 @@ BOOL LLTexLayerSetBuffer::render() | |||
277 | { | 277 | { |
278 | if (!success) | 278 | if (!success) |
279 | { | 279 | { |
280 | delete baked_bump_data; | 280 | delete [] baked_bump_data; |
281 | llinfos << "Failed attempt to bake " << mTexLayerSet->getBodyRegion() << llendl; | 281 | llinfos << "Failed attempt to bake " << mTexLayerSet->getBodyRegion() << llendl; |
282 | mUploadPending = FALSE; | 282 | mUploadPending = FALSE; |
283 | } | 283 | } |
diff --git a/linden/indra/newview/lltexturectrl.cpp b/linden/indra/newview/lltexturectrl.cpp index 1436b62..b5c1ace 100644 --- a/linden/indra/newview/lltexturectrl.cpp +++ b/linden/indra/newview/lltexturectrl.cpp | |||
@@ -410,32 +410,35 @@ BOOL LLFloaterTexturePicker::handleKeyHere(KEY key, MASK mask, BOOL called_from_ | |||
410 | { | 410 | { |
411 | LLFolderView* root_folder = mInventoryPanel->getRootFolder(); | 411 | LLFolderView* root_folder = mInventoryPanel->getRootFolder(); |
412 | 412 | ||
413 | if (!called_from_parent && root_folder && | 413 | if (root_folder && mSearchEdit) |
414 | mSearchEdit && mSearchEdit->hasFocus() && | ||
415 | (key == KEY_RETURN || key == KEY_DOWN) && mask == MASK_NONE) | ||
416 | { | 414 | { |
417 | if (!root_folder->getCurSelectedItem()) | 415 | if (!called_from_parent && mSearchEdit->hasFocus() && |
416 | (key == KEY_RETURN || key == KEY_DOWN) && | ||
417 | mask == MASK_NONE) | ||
418 | { | 418 | { |
419 | LLFolderViewItem* itemp = root_folder->getItemByID(gAgent.getInventoryRootID()); | 419 | if (!root_folder->getCurSelectedItem()) |
420 | if (itemp) | ||
421 | { | 420 | { |
422 | root_folder->setSelection(itemp, FALSE, FALSE); | 421 | LLFolderViewItem* itemp = root_folder->getItemByID(gAgent.getInventoryRootID()); |
422 | if (itemp) | ||
423 | { | ||
424 | root_folder->setSelection(itemp, FALSE, FALSE); | ||
425 | } | ||
423 | } | 426 | } |
427 | root_folder->scrollToShowSelection(); | ||
428 | |||
429 | // move focus to inventory proper | ||
430 | root_folder->setFocus(TRUE); | ||
431 | |||
432 | // treat this as a user selection of the first filtered result | ||
433 | commitIfImmediateSet(); | ||
434 | |||
435 | return TRUE; | ||
424 | } | 436 | } |
425 | root_folder->scrollToShowSelection(); | ||
426 | |||
427 | // move focus to inventory proper | ||
428 | root_folder->setFocus(TRUE); | ||
429 | 437 | ||
430 | // treat this as a user selection of the first filtered result | 438 | if (root_folder->hasFocus() && key == KEY_UP) |
431 | commitIfImmediateSet(); | 439 | { |
432 | 440 | mSearchEdit->focusFirstItem(TRUE); | |
433 | return TRUE; | 441 | } |
434 | } | ||
435 | |||
436 | if (root_folder->hasFocus() && key == KEY_UP) | ||
437 | { | ||
438 | mSearchEdit->focusFirstItem(TRUE); | ||
439 | } | 442 | } |
440 | 443 | ||
441 | return LLFloater::handleKeyHere(key, mask, called_from_parent); | 444 | return LLFloater::handleKeyHere(key, mask, called_from_parent); |
diff --git a/linden/indra/newview/lltooldraganddrop.cpp b/linden/indra/newview/lltooldraganddrop.cpp index 3956402..6196927 100644 --- a/linden/indra/newview/lltooldraganddrop.cpp +++ b/linden/indra/newview/lltooldraganddrop.cpp | |||
@@ -2575,7 +2575,13 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory( | |||
2575 | LLViewerObject* obj, S32 face, MASK mask, BOOL drop) | 2575 | LLViewerObject* obj, S32 face, MASK mask, BOOL drop) |
2576 | { | 2576 | { |
2577 | lldebugs << "LLToolDragAndDrop::dad3dUpdateInventoryCategory()" << llendl; | 2577 | lldebugs << "LLToolDragAndDrop::dad3dUpdateInventoryCategory()" << llendl; |
2578 | if(mSource != SOURCE_AGENT && mSource != SOURCE_LIBRARY) | 2578 | if (NULL==obj) |
2579 | { | ||
2580 | llwarns << "obj is NULL; aborting func with ACCEPT_NO" << llendl; | ||
2581 | return ACCEPT_NO; | ||
2582 | } | ||
2583 | |||
2584 | if (mSource != SOURCE_AGENT && mSource != SOURCE_LIBRARY) | ||
2579 | { | 2585 | { |
2580 | return ACCEPT_NO; | 2586 | return ACCEPT_NO; |
2581 | } | 2587 | } |
@@ -2591,17 +2597,17 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory( | |||
2591 | LLInventoryModel::cat_array_t cats; | 2597 | LLInventoryModel::cat_array_t cats; |
2592 | LLInventoryModel::item_array_t items; | 2598 | LLInventoryModel::item_array_t items; |
2593 | gInventory.collectDescendentsIf(cat->getUUID(), | 2599 | gInventory.collectDescendentsIf(cat->getUUID(), |
2594 | cats, | 2600 | cats, |
2595 | items, | 2601 | items, |
2596 | LLInventoryModel::EXCLUDE_TRASH, | 2602 | LLInventoryModel::EXCLUDE_TRASH, |
2597 | droppable); | 2603 | droppable); |
2598 | cats.put(cat); | 2604 | cats.put(cat); |
2599 | if(droppable.countNoCopy() > 0) | 2605 | if(droppable.countNoCopy() > 0) |
2600 | { | 2606 | { |
2601 | llwarns << "*** Need to confirm this step" << llendl; | 2607 | llwarns << "*** Need to confirm this step" << llendl; |
2602 | } | 2608 | } |
2603 | LLViewerObject* root_object = obj; | 2609 | LLViewerObject* root_object = obj; |
2604 | if (obj && obj->getParent()) | 2610 | if (obj->getParent()) |
2605 | { | 2611 | { |
2606 | LLViewerObject* parent_obj = (LLViewerObject*)obj->getParent(); | 2612 | LLViewerObject* parent_obj = (LLViewerObject*)obj->getParent(); |
2607 | if (!parent_obj->isAvatar()) | 2613 | if (!parent_obj->isAvatar()) |
diff --git a/linden/indra/newview/lltoolgrab.cpp b/linden/indra/newview/lltoolgrab.cpp index 502e2be..b56e762 100644 --- a/linden/indra/newview/lltoolgrab.cpp +++ b/linden/indra/newview/lltoolgrab.cpp | |||
@@ -180,6 +180,12 @@ BOOL LLToolGrab::handleObjectHit(LLViewerObject *objectp, S32 x, S32 y, MASK mas | |||
180 | llinfos << "LLToolGrab handleObjectHit " << mMouseDownX << "," << mMouseDownY << llendl; | 180 | llinfos << "LLToolGrab handleObjectHit " << mMouseDownX << "," << mMouseDownY << llendl; |
181 | } | 181 | } |
182 | 182 | ||
183 | if (NULL == objectp) // unexpected | ||
184 | { | ||
185 | llwarns << "objectp was NULL; returning FALSE" << llendl; | ||
186 | return FALSE; | ||
187 | } | ||
188 | |||
183 | if (objectp->isAvatar()) | 189 | if (objectp->isAvatar()) |
184 | { | 190 | { |
185 | if (gGrabTransientTool) | 191 | if (gGrabTransientTool) |
@@ -198,7 +204,7 @@ BOOL LLToolGrab::handleObjectHit(LLViewerObject *objectp, S32 x, S32 y, MASK mas | |||
198 | // objectp = (LLViewerObject *)objectp->getRoot(); | 204 | // objectp = (LLViewerObject *)objectp->getRoot(); |
199 | 205 | ||
200 | LLViewerObject* parent = objectp->getRootEdit(); | 206 | LLViewerObject* parent = objectp->getRootEdit(); |
201 | BOOL script_touch = (objectp && objectp->flagHandleTouch()) || (parent && parent->flagHandleTouch()); | 207 | BOOL script_touch = (objectp->flagHandleTouch()) || (parent && parent->flagHandleTouch()); |
202 | 208 | ||
203 | // Clicks on scripted or physical objects are temporary grabs, so | 209 | // Clicks on scripted or physical objects are temporary grabs, so |
204 | // not "Build mode" | 210 | // not "Build mode" |
diff --git a/linden/indra/newview/lltoolpie.cpp b/linden/indra/newview/lltoolpie.cpp index adc46e2..7231286 100644 --- a/linden/indra/newview/lltoolpie.cpp +++ b/linden/indra/newview/lltoolpie.cpp | |||
@@ -390,11 +390,11 @@ U8 final_click_action(LLViewerObject* obj) | |||
390 | if (obj->isAttachment()) return CLICK_ACTION_NONE; | 390 | if (obj->isAttachment()) return CLICK_ACTION_NONE; |
391 | 391 | ||
392 | U8 click_action = CLICK_ACTION_TOUCH; | 392 | U8 click_action = CLICK_ACTION_TOUCH; |
393 | LLViewerObject* parent = (obj ? obj->getRootEdit() : NULL); | 393 | LLViewerObject* parent = obj->getRootEdit(); |
394 | if ((obj && obj->getClickAction()) | 394 | if (obj->getClickAction() |
395 | || (parent && parent->getClickAction())) | 395 | || (parent && parent->getClickAction())) |
396 | { | 396 | { |
397 | if (obj && obj->getClickAction()) | 397 | if (obj->getClickAction()) |
398 | { | 398 | { |
399 | click_action = obj->getClickAction(); | 399 | click_action = obj->getClickAction(); |
400 | } | 400 | } |
diff --git a/linden/indra/newview/lltoolpipette.cpp b/linden/indra/newview/lltoolpipette.cpp index 139afc2..139afc2 100755..100644 --- a/linden/indra/newview/lltoolpipette.cpp +++ b/linden/indra/newview/lltoolpipette.cpp | |||
diff --git a/linden/indra/newview/lltoolpipette.h b/linden/indra/newview/lltoolpipette.h index 1351084..1351084 100755..100644 --- a/linden/indra/newview/lltoolpipette.h +++ b/linden/indra/newview/lltoolpipette.h | |||
diff --git a/linden/indra/newview/llviewerassetstorage.cpp b/linden/indra/newview/llviewerassetstorage.cpp index c7e9c97..95ef983 100644 --- a/linden/indra/newview/llviewerassetstorage.cpp +++ b/linden/indra/newview/llviewerassetstorage.cpp | |||
@@ -166,21 +166,22 @@ void LLViewerAssetStorage::storeAssetData( | |||
166 | if(!filename) | 166 | if(!filename) |
167 | { | 167 | { |
168 | llerrs << "No filename specified" << llendl; | 168 | llerrs << "No filename specified" << llendl; |
169 | return; | ||
169 | } | 170 | } |
170 | 171 | ||
171 | LLAssetID asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); | 172 | LLAssetID asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); |
172 | llinfos << "LLViewerAssetStorage::storeAssetData (legacy)" << asset_id << ":" << LLAssetType::lookup(asset_type) << llendl; | 173 | llinfos << "LLViewerAssetStorage::storeAssetData (legacy)" << asset_id << ":" << LLAssetType::lookup(asset_type) << llendl; |
173 | 174 | ||
174 | LLLegacyAssetRequest *legacy = new LLLegacyAssetRequest; | ||
175 | |||
176 | llinfos << "ASSET_ID: " << asset_id << llendl; | 175 | llinfos << "ASSET_ID: " << asset_id << llendl; |
177 | 176 | ||
178 | legacy->mUpCallback = callback; | 177 | FILE* fp = LLFile::fopen(filename, "rb"); |
179 | legacy->mUserData = user_data; | ||
180 | |||
181 | FILE* fp = LLFile::fopen(filename, "rb"); /* Flawfinder: ignore */ | ||
182 | if (fp) | 178 | if (fp) |
183 | { | 179 | { |
180 | LLLegacyAssetRequest *legacy = new LLLegacyAssetRequest; | ||
181 | |||
182 | legacy->mUpCallback = callback; | ||
183 | legacy->mUserData = user_data; | ||
184 | |||
184 | LLVFile file(mVFS, asset_id, asset_type, LLVFile::WRITE); | 185 | LLVFile file(mVFS, asset_id, asset_type, LLVFile::WRITE); |
185 | 186 | ||
186 | fseek(fp, 0, SEEK_END); | 187 | fseek(fp, 0, SEEK_END); |
diff --git a/linden/indra/newview/llviewercontrol.cpp b/linden/indra/newview/llviewercontrol.cpp index 61285d5..08abd2d 100644 --- a/linden/indra/newview/llviewercontrol.cpp +++ b/linden/indra/newview/llviewercontrol.cpp | |||
@@ -240,6 +240,14 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp) | |||
240 | LLSpinCtrl* spinner3 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_3"); | 240 | LLSpinCtrl* spinner3 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_3"); |
241 | LLSpinCtrl* spinner4 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_4"); | 241 | LLSpinCtrl* spinner4 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_4"); |
242 | LLColorSwatchCtrl* color_swatch = LLUICtrlFactory::getColorSwatchByName(this, "color_swatch"); | 242 | LLColorSwatchCtrl* color_swatch = LLUICtrlFactory::getColorSwatchByName(this, "color_swatch"); |
243 | |||
244 | if (!spinner1 || !spinner2 || !spinner3 || !spinner4 || !color_swatch) | ||
245 | { | ||
246 | llwarns << "Could not find all desired controls by name" | ||
247 | << llendl; | ||
248 | return; | ||
249 | } | ||
250 | |||
243 | spinner1->setVisible(FALSE); | 251 | spinner1->setVisible(FALSE); |
244 | spinner2->setVisible(FALSE); | 252 | spinner2->setVisible(FALSE); |
245 | spinner3->setVisible(FALSE); | 253 | spinner3->setVisible(FALSE); |
diff --git a/linden/indra/newview/llviewerdisplay.cpp b/linden/indra/newview/llviewerdisplay.cpp index c2ef30a..fc288c0 100644 --- a/linden/indra/newview/llviewerdisplay.cpp +++ b/linden/indra/newview/llviewerdisplay.cpp | |||
@@ -564,6 +564,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield) | |||
564 | glPushMatrix(); | 564 | glPushMatrix(); |
565 | glMatrixMode(GL_MODELVIEW); | 565 | glMatrixMode(GL_MODELVIEW); |
566 | glPushMatrix(); | 566 | glPushMatrix(); |
567 | |||
567 | if (LLPipeline::sShowHUDAttachments && !gDisconnected && setup_hud_matrices(FALSE)) | 568 | if (LLPipeline::sShowHUDAttachments && !gDisconnected && setup_hud_matrices(FALSE)) |
568 | { | 569 | { |
569 | LLCamera hud_cam = *gCamera; | 570 | LLCamera hud_cam = *gCamera; |
@@ -598,7 +599,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield) | |||
598 | LLFastTimer ftm(LLFastTimer::FTM_REBUILD); | 599 | LLFastTimer ftm(LLFastTimer::FTM_REBUILD); |
599 | gPipeline.stateSort(hud_cam); | 600 | gPipeline.stateSort(hud_cam); |
600 | } | 601 | } |
601 | 602 | ||
602 | gPipeline.renderGeom(hud_cam); | 603 | gPipeline.renderGeom(hud_cam); |
603 | 604 | ||
604 | //restore type mask | 605 | //restore type mask |
@@ -657,6 +658,7 @@ BOOL setup_hud_matrices(BOOL for_select) | |||
657 | } | 658 | } |
658 | LLBBox hud_bbox = my_avatarp->getHUDBBox(); | 659 | LLBBox hud_bbox = my_avatarp->getHUDBBox(); |
659 | 660 | ||
661 | |||
660 | // set up transform to encompass bounding box of HUD | 662 | // set up transform to encompass bounding box of HUD |
661 | glMatrixMode(GL_PROJECTION); | 663 | glMatrixMode(GL_PROJECTION); |
662 | glLoadIdentity(); | 664 | glLoadIdentity(); |
@@ -685,7 +687,7 @@ BOOL setup_hud_matrices(BOOL for_select) | |||
685 | glLoadMatrixf(OGL_TO_CFR_ROTATION); // Load Cory's favorite reference frame | 687 | glLoadMatrixf(OGL_TO_CFR_ROTATION); // Load Cory's favorite reference frame |
686 | glTranslatef(-hud_bbox.getCenterLocal().mV[VX] + (hud_depth * 0.5f), 0.f, 0.f); | 688 | glTranslatef(-hud_bbox.getCenterLocal().mV[VX] + (hud_depth * 0.5f), 0.f, 0.f); |
687 | glScalef(zoom_level, zoom_level, zoom_level); | 689 | glScalef(zoom_level, zoom_level, zoom_level); |
688 | 690 | ||
689 | return TRUE; | 691 | return TRUE; |
690 | } | 692 | } |
691 | else | 693 | else |
diff --git a/linden/indra/newview/llviewergenericmessage.cpp b/linden/indra/newview/llviewergenericmessage.cpp index 56b168b..0e1ce49 100644 --- a/linden/indra/newview/llviewergenericmessage.cpp +++ b/linden/indra/newview/llviewergenericmessage.cpp | |||
@@ -1,9 +1,9 @@ | |||
1 | /** | 1 | /** |
2 | * @file llviewergenericmessage.cpp | 2 | * @file llviewergenericmessage.cpp |
3 | * @brief Handle processing of "generic messages" which contain short lists of strings. | 3 | * @brief Handle processing of "generic messages" which contain short lists of strings. |
4 | * @author James Cook | 4 | * @author James Cook |
5 | * | 5 | * |
6 | * Copyright (c) 2007-2007, Linden Research, Inc. | 6 | * Copyright (c) 2007-2007, Linden Research, Inc. |
7 | * | 7 | * |
8 | * Second Life Viewer Source Code | 8 | * Second Life Viewer Source Code |
9 | * The source code in this file ("Source Code") is provided by Linden Lab | 9 | * The source code in this file ("Source Code") is provided by Linden Lab |
@@ -24,74 +24,74 @@ | |||
24 | * | 24 | * |
25 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | 25 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO |
26 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | 26 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, |
27 | * COMPLETENESS OR PERFORMANCE. | 27 | * COMPLETENESS OR PERFORMANCE. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include "llviewerprecompiledheaders.h" | 30 | #include "llviewerprecompiledheaders.h" |
31 | 31 | ||
32 | #include "llviewergenericmessage.h" | 32 | #include "llviewergenericmessage.h" |
33 | 33 | ||
34 | #include "lldispatcher.h" | 34 | #include "lldispatcher.h" |
35 | #include "lluuid.h" | 35 | #include "lluuid.h" |
36 | #include "message.h" | 36 | #include "message.h" |
37 | 37 | ||
38 | #include "llagent.h" | 38 | #include "llagent.h" |
39 | 39 | ||
40 | 40 | ||
41 | LLDispatcher gGenericDispatcher; | 41 | LLDispatcher gGenericDispatcher; |
42 | 42 | ||
43 | 43 | ||
44 | void send_generic_message(const char* method, | 44 | void send_generic_message(const char* method, |
45 | const std::vector<std::string>& strings, | 45 | const std::vector<std::string>& strings, |
46 | const LLUUID& invoice) | 46 | const LLUUID& invoice) |
47 | { | 47 | { |
48 | LLMessageSystem* msg = gMessageSystem; | 48 | LLMessageSystem* msg = gMessageSystem; |
49 | msg->newMessage("GenericMessage"); | 49 | msg->newMessage("GenericMessage"); |
50 | msg->nextBlockFast(_PREHASH_AgentData); | 50 | msg->nextBlockFast(_PREHASH_AgentData); |
51 | msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); | 51 | msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); |
52 | msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); | 52 | msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); |
53 | msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used | 53 | msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used |
54 | msg->nextBlock("MethodData"); | 54 | msg->nextBlock("MethodData"); |
55 | msg->addString("Method", method); | 55 | msg->addString("Method", method); |
56 | msg->addUUID("Invoice", invoice); | 56 | msg->addUUID("Invoice", invoice); |
57 | if(strings.empty()) | 57 | if(strings.empty()) |
58 | { | 58 | { |
59 | msg->nextBlock("ParamList"); | 59 | msg->nextBlock("ParamList"); |
60 | msg->addString("Parameter", NULL); | 60 | msg->addString("Parameter", NULL); |
61 | } | 61 | } |
62 | else | 62 | else |
63 | { | 63 | { |
64 | std::vector<std::string>::const_iterator it = strings.begin(); | 64 | std::vector<std::string>::const_iterator it = strings.begin(); |
65 | std::vector<std::string>::const_iterator end = strings.end(); | 65 | std::vector<std::string>::const_iterator end = strings.end(); |
66 | for(; it != end; ++it) | 66 | for(; it != end; ++it) |
67 | { | 67 | { |
68 | msg->nextBlock("ParamList"); | 68 | msg->nextBlock("ParamList"); |
69 | msg->addString("Parameter", (*it).c_str()); | 69 | msg->addString("Parameter", (*it).c_str()); |
70 | } | 70 | } |
71 | } | 71 | } |
72 | gAgent.sendReliableMessage(); | 72 | gAgent.sendReliableMessage(); |
73 | } | 73 | } |
74 | 74 | ||
75 | 75 | ||
76 | 76 | ||
77 | void process_generic_message(LLMessageSystem* msg, void**) | 77 | void process_generic_message(LLMessageSystem* msg, void**) |
78 | { | 78 | { |
79 | LLUUID agent_id; | 79 | LLUUID agent_id; |
80 | msg->getUUID("AgentData", "AgentID", agent_id); | 80 | msg->getUUID("AgentData", "AgentID", agent_id); |
81 | if (agent_id != gAgent.getID()) | 81 | if (agent_id != gAgent.getID()) |
82 | { | 82 | { |
83 | llwarns << "GenericMessage for wrong agent" << llendl; | 83 | llwarns << "GenericMessage for wrong agent" << llendl; |
84 | return; | 84 | return; |
85 | } | 85 | } |
86 | 86 | ||
87 | std::string request; | 87 | std::string request; |
88 | LLUUID invoice; | 88 | LLUUID invoice; |
89 | LLDispatcher::sparam_t strings; | 89 | LLDispatcher::sparam_t strings; |
90 | LLDispatcher::unpackMessage(msg, request, invoice, strings); | 90 | LLDispatcher::unpackMessage(msg, request, invoice, strings); |
91 | 91 | ||
92 | if(!gGenericDispatcher.dispatch(request, invoice, strings)) | 92 | if(!gGenericDispatcher.dispatch(request, invoice, strings)) |
93 | { | 93 | { |
94 | llwarns << "GenericMessage " << request << " failed to dispatch" | 94 | llwarns << "GenericMessage " << request << " failed to dispatch" |
95 | << llendl; | 95 | << llendl; |
96 | } | 96 | } |
97 | } | 97 | } |
diff --git a/linden/indra/newview/llviewergenericmessage.h b/linden/indra/newview/llviewergenericmessage.h index cf94d86..b0d02a2 100644 --- a/linden/indra/newview/llviewergenericmessage.h +++ b/linden/indra/newview/llviewergenericmessage.h | |||
@@ -1,9 +1,9 @@ | |||
1 | /** | 1 | /** |
2 | * @file llviewergenericmessage.h | 2 | * @file llviewergenericmessage.h |
3 | * @brief Handle processing of "generic messages" which contain short lists of strings. | 3 | * @brief Handle processing of "generic messages" which contain short lists of strings. |
4 | * @author James Cook | 4 | * @author James Cook |
5 | * | 5 | * |
6 | * Copyright (c) 2007-2007, Linden Research, Inc. | 6 | * Copyright (c) 2007-2007, Linden Research, Inc. |
7 | * | 7 | * |
8 | * Second Life Viewer Source Code | 8 | * Second Life Viewer Source Code |
9 | * The source code in this file ("Source Code") is provided by Linden Lab | 9 | * The source code in this file ("Source Code") is provided by Linden Lab |
@@ -24,23 +24,23 @@ | |||
24 | * | 24 | * |
25 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | 25 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO |
26 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | 26 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, |
27 | * COMPLETENESS OR PERFORMANCE. | 27 | * COMPLETENESS OR PERFORMANCE. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #ifndef LLVIEWERGENERICMESSAGE_H | 30 | #ifndef LLVIEWERGENERICMESSAGE_H |
31 | #define LLVIEWERGENERICMESSAGE_H | 31 | #define LLVIEWERGENERICMESSAGE_H |
32 | 32 | ||
33 | class LLUUID; | 33 | class LLUUID; |
34 | class LLDispatcher; | 34 | class LLDispatcher; |
35 | 35 | ||
36 | 36 | ||
37 | void send_generic_message(const char* method, | 37 | void send_generic_message(const char* method, |
38 | const std::vector<std::string>& strings, | 38 | const std::vector<std::string>& strings, |
39 | const LLUUID& invoice = LLUUID::null); | 39 | const LLUUID& invoice = LLUUID::null); |
40 | 40 | ||
41 | void process_generic_message(LLMessageSystem* msg, void**); | 41 | void process_generic_message(LLMessageSystem* msg, void**); |
42 | 42 | ||
43 | 43 | ||
44 | extern LLDispatcher gGenericDispatcher; | 44 | extern LLDispatcher gGenericDispatcher; |
45 | 45 | ||
46 | #endif | 46 | #endif |
diff --git a/linden/indra/newview/llviewerimagelist.cpp b/linden/indra/newview/llviewerimagelist.cpp index 9da84fa..4e87905 100644 --- a/linden/indra/newview/llviewerimagelist.cpp +++ b/linden/indra/newview/llviewerimagelist.cpp | |||
@@ -125,6 +125,9 @@ void LLViewerImageList::doPreloadImages() | |||
125 | // Set the "white" image | 125 | // Set the "white" image |
126 | LLViewerImage::sWhiteImagep = preloadImage("white.tga", LLUUID::null, TRUE);; | 126 | LLViewerImage::sWhiteImagep = preloadImage("white.tga", LLUUID::null, TRUE);; |
127 | 127 | ||
128 | // Speeds up startup by 4-5 seconds. JC | ||
129 | if (!gPreloadImages) return; | ||
130 | |||
128 | // Preload some images | 131 | // Preload some images |
129 | preloadImage("button_anim_pause.tga", LLUUID::null, FALSE); | 132 | preloadImage("button_anim_pause.tga", LLUUID::null, FALSE); |
130 | preloadImage("button_anim_pause_selected.tga", LLUUID::null, FALSE); | 133 | preloadImage("button_anim_pause_selected.tga", LLUUID::null, FALSE); |
@@ -1116,6 +1119,7 @@ LLPointer<LLImageJ2C> LLViewerImageList::convertToUploadFile(LLPointer<LLImageRa | |||
1116 | S32 LLViewerImageList::getMaxVideoRamSetting(S32 max) | 1119 | S32 LLViewerImageList::getMaxVideoRamSetting(S32 max) |
1117 | { | 1120 | { |
1118 | const U32 vram_settings[] = { 16, 32, 64, 128, 256, 512 }; | 1121 | const U32 vram_settings[] = { 16, 32, 64, 128, 256, 512 }; |
1122 | const S32 num_vram_settings = sizeof(vram_settings) / sizeof(vram_settings[0]); | ||
1119 | 1123 | ||
1120 | U32 max_vram; | 1124 | U32 max_vram; |
1121 | if (gGLManager.mVRAM != 0) | 1125 | if (gGLManager.mVRAM != 0) |
@@ -1144,8 +1148,9 @@ S32 LLViewerImageList::getMaxVideoRamSetting(S32 max) | |||
1144 | { | 1148 | { |
1145 | max_vram = llmin(max_vram, (U32)((F32)system_ram/1.5f)); | 1149 | max_vram = llmin(max_vram, (U32)((F32)system_ram/1.5f)); |
1146 | } | 1150 | } |
1151 | |||
1147 | S32 idx; | 1152 | S32 idx; |
1148 | for (idx=0; idx<=5; idx++) | 1153 | for (idx=0; idx < num_vram_settings; idx++) |
1149 | { | 1154 | { |
1150 | if (idx == max) | 1155 | if (idx == max) |
1151 | break; | 1156 | break; |
@@ -1155,6 +1160,12 @@ S32 LLViewerImageList::getMaxVideoRamSetting(S32 max) | |||
1155 | break; | 1160 | break; |
1156 | } | 1161 | } |
1157 | } | 1162 | } |
1163 | |||
1164 | if( idx == num_vram_settings ) | ||
1165 | { | ||
1166 | idx = num_vram_settings - 1; | ||
1167 | } | ||
1168 | |||
1158 | return idx; | 1169 | return idx; |
1159 | } | 1170 | } |
1160 | 1171 | ||
@@ -1233,12 +1244,20 @@ void LLViewerImageList::receiveImageHeader(LLMessageSystem *msg, void **user_dat | |||
1233 | msg->getU16Fast(_PREHASH_ImageID, _PREHASH_Packets, packets); | 1244 | msg->getU16Fast(_PREHASH_ImageID, _PREHASH_Packets, packets); |
1234 | msg->getU32Fast(_PREHASH_ImageID, _PREHASH_Size, totalbytes); | 1245 | msg->getU32Fast(_PREHASH_ImageID, _PREHASH_Size, totalbytes); |
1235 | 1246 | ||
1236 | U16 data_size = msg->getSizeFast(_PREHASH_ImageData, _PREHASH_Data); | 1247 | S32 data_size = msg->getSizeFast(_PREHASH_ImageData, _PREHASH_Data); |
1237 | if (!data_size) | 1248 | if (!data_size) |
1238 | { | 1249 | { |
1239 | return; | 1250 | return; |
1240 | } | 1251 | } |
1241 | 1252 | if (data_size < 0) | |
1253 | { | ||
1254 | // msg->getSizeFast() is probably trying to tell us there | ||
1255 | // was an error. | ||
1256 | llerrs << "image header chunk size was negative: " | ||
1257 | << data_size << llendl; | ||
1258 | return; | ||
1259 | } | ||
1260 | |||
1242 | // this buffer gets saved off in the packet list | 1261 | // this buffer gets saved off in the packet list |
1243 | U8 *data = new U8[data_size]; | 1262 | U8 *data = new U8[data_size]; |
1244 | msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size); | 1263 | msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size); |
@@ -1246,6 +1265,7 @@ void LLViewerImageList::receiveImageHeader(LLMessageSystem *msg, void **user_dat | |||
1246 | LLViewerImage *image = gImageList.getImage(id); | 1265 | LLViewerImage *image = gImageList.getImage(id); |
1247 | if (!image) | 1266 | if (!image) |
1248 | { | 1267 | { |
1268 | delete [] data; | ||
1249 | return; | 1269 | return; |
1250 | } | 1270 | } |
1251 | image->mLastPacketTimer.reset(); | 1271 | image->mLastPacketTimer.reset(); |
@@ -1284,15 +1304,24 @@ void LLViewerImageList::receiveImagePacket(LLMessageSystem *msg, void **user_dat | |||
1284 | //llprintline("Start decode, image header..."); | 1304 | //llprintline("Start decode, image header..."); |
1285 | msg->getUUIDFast(_PREHASH_ImageID, _PREHASH_ID, id); | 1305 | msg->getUUIDFast(_PREHASH_ImageID, _PREHASH_ID, id); |
1286 | msg->getU16Fast(_PREHASH_ImageID, _PREHASH_Packet, packet_num); | 1306 | msg->getU16Fast(_PREHASH_ImageID, _PREHASH_Packet, packet_num); |
1287 | U16 data_size = msg->getSizeFast(_PREHASH_ImageData, _PREHASH_Data); | 1307 | S32 data_size = msg->getSizeFast(_PREHASH_ImageData, _PREHASH_Data); |
1288 | 1308 | ||
1289 | if (!data_size) | 1309 | if (!data_size) |
1290 | { | 1310 | { |
1291 | return; | 1311 | return; |
1292 | } | 1312 | } |
1313 | if (data_size < 0) | ||
1314 | { | ||
1315 | // msg->getSizeFast() is probably trying to tell us there | ||
1316 | // was an error. | ||
1317 | llerrs << "image data chunk size was negative: " | ||
1318 | << data_size << llendl; | ||
1319 | return; | ||
1320 | } | ||
1293 | if (data_size > MTUBYTES) | 1321 | if (data_size > MTUBYTES) |
1294 | { | 1322 | { |
1295 | llerrs << "image data chunk too large: " << data_size << " bytes" << llendl; | 1323 | llerrs << "image data chunk too large: " << data_size << " bytes" << llendl; |
1324 | return; | ||
1296 | } | 1325 | } |
1297 | U8 *data = new U8[data_size]; | 1326 | U8 *data = new U8[data_size]; |
1298 | msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size); | 1327 | msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size); |
@@ -1300,6 +1329,7 @@ void LLViewerImageList::receiveImagePacket(LLMessageSystem *msg, void **user_dat | |||
1300 | LLViewerImage *image = gImageList.getImage(id); | 1329 | LLViewerImage *image = gImageList.getImage(id); |
1301 | if (!image) | 1330 | if (!image) |
1302 | { | 1331 | { |
1332 | delete [] data; | ||
1303 | return; | 1333 | return; |
1304 | } | 1334 | } |
1305 | image->mLastPacketTimer.reset(); | 1335 | image->mLastPacketTimer.reset(); |
diff --git a/linden/indra/newview/llviewerinventory.cpp b/linden/indra/newview/llviewerinventory.cpp index 8f23346..d271af5 100644 --- a/linden/indra/newview/llviewerinventory.cpp +++ b/linden/indra/newview/llviewerinventory.cpp | |||
@@ -462,10 +462,6 @@ bool LLViewerInventoryCategory::importFileLocal(FILE* fp) | |||
462 | fgets(buffer, MAX_STRING, fp); | 462 | fgets(buffer, MAX_STRING, fp); |
463 | sscanf( /* Flawfinder: ignore */ | 463 | sscanf( /* Flawfinder: ignore */ |
464 | buffer, " %254s %254s", keyword, valuestr); | 464 | buffer, " %254s %254s", keyword, valuestr); |
465 | if(!keyword) | ||
466 | { | ||
467 | continue; | ||
468 | } | ||
469 | if(0 == strcmp("{",keyword)) | 465 | if(0 == strcmp("{",keyword)) |
470 | { | 466 | { |
471 | continue; | 467 | continue; |
diff --git a/linden/indra/newview/llviewerjointmesh.cpp b/linden/indra/newview/llviewerjointmesh.cpp index 216e29f..c76990c 100644 --- a/linden/indra/newview/llviewerjointmesh.cpp +++ b/linden/indra/newview/llviewerjointmesh.cpp | |||
@@ -216,11 +216,11 @@ S32 LLViewerJointMesh::getBoundJointsByIndex(S32 index, S32 &joint_a, S32& joint | |||
216 | if (render_datap->mSkinJoint) | 216 | if (render_datap->mSkinJoint) |
217 | { | 217 | { |
218 | joint_b = render_datap->mSkinJoint->mJoint->mJointNum; | 218 | joint_b = render_datap->mSkinJoint->mJoint->mJointNum; |
219 | } | ||
220 | 219 | ||
221 | if (joint_a == -1) | 220 | if (joint_a == -1) |
222 | { | 221 | { |
223 | joint_a = render_datap->mSkinJoint->mJoint->getParent()->mJointNum; | 222 | joint_a = render_datap->mSkinJoint->mJoint->getParent()->mJointNum; |
223 | } | ||
224 | } | 224 | } |
225 | num_joints++; | 225 | num_joints++; |
226 | } | 226 | } |
diff --git a/linden/indra/newview/llviewerkeyboard.cpp b/linden/indra/newview/llviewerkeyboard.cpp index f514b2e..fcb1550 100644 --- a/linden/indra/newview/llviewerkeyboard.cpp +++ b/linden/indra/newview/llviewerkeyboard.cpp | |||
@@ -717,15 +717,16 @@ S32 LLViewerKeyboard::loadBindings(const char *filename) | |||
717 | S32 binding_count = 0; | 717 | S32 binding_count = 0; |
718 | S32 line_count = 0; | 718 | S32 line_count = 0; |
719 | 719 | ||
720 | fp = LLFile::fopen(filename, "r"); /* Flawfinder: ignore */ | 720 | if(!filename) |
721 | { | ||
722 | llerrs << " No filename specified" << llendl; | ||
723 | return 0; | ||
724 | } | ||
725 | |||
726 | fp = LLFile::fopen(filename, "r"); | ||
721 | 727 | ||
722 | if (!fp) | 728 | if (!fp) |
723 | { | 729 | { |
724 | if(!filename) | ||
725 | { | ||
726 | llerrs << " No filename specified" << llendl; | ||
727 | return 0; | ||
728 | } | ||
729 | return 0; | 730 | return 0; |
730 | } | 731 | } |
731 | 732 | ||
diff --git a/linden/indra/newview/llviewermenu.cpp b/linden/indra/newview/llviewermenu.cpp index 64f1af8..1ff995e 100644 --- a/linden/indra/newview/llviewermenu.cpp +++ b/linden/indra/newview/llviewermenu.cpp | |||
@@ -34,15 +34,12 @@ | |||
34 | #include <iostream> | 34 | #include <iostream> |
35 | #include <fstream> | 35 | #include <fstream> |
36 | #include <sstream> | 36 | #include <sstream> |
37 | #include <boost/tokenizer.hpp> | ||
38 | 37 | ||
39 | // linden library includes | 38 | // linden library includes |
40 | #include "audioengine.h" | 39 | #include "audioengine.h" |
41 | #include "indra_constants.h" | 40 | #include "indra_constants.h" |
42 | #include "llassetuploadresponders.h" | ||
43 | #include "llassetstorage.h" | 41 | #include "llassetstorage.h" |
44 | #include "llchat.h" | 42 | #include "llchat.h" |
45 | #include "lleconomy.h" | ||
46 | #include "llfocusmgr.h" | 43 | #include "llfocusmgr.h" |
47 | #include "llfontgl.h" | 44 | #include "llfontgl.h" |
48 | #include "llinstantmessage.h" | 45 | #include "llinstantmessage.h" |
@@ -57,7 +54,6 @@ | |||
57 | #include "raytrace.h" | 54 | #include "raytrace.h" |
58 | #include "llsdserialize.h" | 55 | #include "llsdserialize.h" |
59 | #include "lltimer.h" | 56 | #include "lltimer.h" |
60 | #include "vorbisencode.h" | ||
61 | #include "llvfile.h" | 57 | #include "llvfile.h" |
62 | #include "llvolumemgr.h" | 58 | #include "llvolumemgr.h" |
63 | #include "llwindow.h" // for shell_open() | 59 | #include "llwindow.h" // for shell_open() |
@@ -83,7 +79,6 @@ | |||
83 | #include "llfloater.h" | 79 | #include "llfloater.h" |
84 | #include "llfloaterabout.h" | 80 | #include "llfloaterabout.h" |
85 | #include "llfloaterbuycurrency.h" | 81 | #include "llfloaterbuycurrency.h" |
86 | #include "llfloateranimpreview.h" | ||
87 | #include "llfloateravatarinfo.h" | 82 | #include "llfloateravatarinfo.h" |
88 | #include "llfloateravatartextures.h" | 83 | #include "llfloateravatartextures.h" |
89 | #include "llfloaterbuildoptions.h" | 84 | #include "llfloaterbuildoptions.h" |
@@ -104,21 +99,17 @@ | |||
104 | #include "llfloaterhtml.h" | 99 | #include "llfloaterhtml.h" |
105 | #include "llfloaterhtmlhelp.h" | 100 | #include "llfloaterhtmlhelp.h" |
106 | #include "llfloaterhtmlfind.h" | 101 | #include "llfloaterhtmlfind.h" |
107 | #include "llfloaterimport.h" | ||
108 | #include "llfloaterinspect.h" | 102 | #include "llfloaterinspect.h" |
109 | #include "llfloaterland.h" | 103 | #include "llfloaterland.h" |
110 | #include "llfloaterlandholdings.h" | 104 | #include "llfloaterlandholdings.h" |
111 | #include "llfloatermap.h" | 105 | #include "llfloatermap.h" |
112 | #include "llfloaterimagepreview.h" | ||
113 | #include "llfloatermute.h" | 106 | #include "llfloatermute.h" |
114 | #include "llfloaternamedesc.h" | ||
115 | #include "llfloateropenobject.h" | 107 | #include "llfloateropenobject.h" |
116 | #include "llfloaterpermissionsmgr.h" | 108 | #include "llfloaterpermissionsmgr.h" |
117 | #include "llfloaterpreference.h" | 109 | #include "llfloaterpreference.h" |
118 | #include "llfloaterregioninfo.h" | 110 | #include "llfloaterregioninfo.h" |
119 | #include "llfloaterreporter.h" | 111 | #include "llfloaterreporter.h" |
120 | #include "llfloaterscriptdebug.h" | 112 | #include "llfloaterscriptdebug.h" |
121 | #include "llfloatersnapshot.h" | ||
122 | #include "llfloatertest.h" | 113 | #include "llfloatertest.h" |
123 | #include "llfloatertools.h" | 114 | #include "llfloatertools.h" |
124 | #include "llfloaterworldmap.h" | 115 | #include "llfloaterworldmap.h" |
@@ -147,8 +138,6 @@ | |||
147 | #include "llnotify.h" | 138 | #include "llnotify.h" |
148 | #include "llpanelobject.h" | 139 | #include "llpanelobject.h" |
149 | #include "llparcel.h" | 140 | #include "llparcel.h" |
150 | #include "llpreviewscript.h" | ||
151 | #include "llpreviewtexture.h" | ||
152 | #include "llprimitive.h" | 141 | #include "llprimitive.h" |
153 | #include "llresmgr.h" | 142 | #include "llresmgr.h" |
154 | #include "llselectmgr.h" | 143 | #include "llselectmgr.h" |
@@ -176,8 +165,8 @@ | |||
176 | #include "llviewercamera.h" | 165 | #include "llviewercamera.h" |
177 | #include "llviewergenericmessage.h" | 166 | #include "llviewergenericmessage.h" |
178 | #include "llviewergesture.h" | 167 | #include "llviewergesture.h" |
179 | #include "llviewerimagelist.h" | ||
180 | #include "llviewerinventory.h" | 168 | #include "llviewerinventory.h" |
169 | #include "llviewermenufile.h" // init_menu_file() | ||
181 | #include "llviewermessage.h" | 170 | #include "llviewermessage.h" |
182 | #include "llviewernetwork.h" | 171 | #include "llviewernetwork.h" |
183 | #include "llviewerobjectlist.h" | 172 | #include "llviewerobjectlist.h" |
@@ -402,7 +391,6 @@ void handle_god_request_avatar_geometry(void *); // Hack for easy testing of new | |||
402 | void reload_personal_settings_overrides(void *); | 391 | void reload_personal_settings_overrides(void *); |
403 | void force_breakpoint(void *); | 392 | void force_breakpoint(void *); |
404 | void reload_vertex_shader(void *); | 393 | void reload_vertex_shader(void *); |
405 | void flush_animations(void *); | ||
406 | void slow_mo_animations(void *); | 394 | void slow_mo_animations(void *); |
407 | void handle_disconnect_viewer(void *); | 395 | void handle_disconnect_viewer(void *); |
408 | 396 | ||
@@ -467,6 +455,7 @@ void handle_dump_avatar_local_textures(void*); | |||
467 | void handle_debug_avatar_textures(void*); | 455 | void handle_debug_avatar_textures(void*); |
468 | void handle_grab_texture(void*); | 456 | void handle_grab_texture(void*); |
469 | BOOL enable_grab_texture(void*); | 457 | BOOL enable_grab_texture(void*); |
458 | void handle_dump_region_object_cache(void*); | ||
470 | 459 | ||
471 | BOOL menu_ui_enabled(void *user_data); | 460 | BOOL menu_ui_enabled(void *user_data); |
472 | void check_toggle_control( LLUICtrl *, void* user_data ); | 461 | void check_toggle_control( LLUICtrl *, void* user_data ); |
@@ -537,7 +526,7 @@ void pre_init_menus() | |||
537 | LLMenuItemGL::setHighlightFGColor( color ); | 526 | LLMenuItemGL::setHighlightFGColor( color ); |
538 | } | 527 | } |
539 | 528 | ||
540 | void initialize_menu_actions(); | 529 | void initialize_menus(); |
541 | 530 | ||
542 | //----------------------------------------------------------------------------- | 531 | //----------------------------------------------------------------------------- |
543 | // Initialize main menus | 532 | // Initialize main menus |
@@ -565,7 +554,7 @@ void init_menus() | |||
565 | LLMenuGL::sMenuContainer = gMenuHolder; | 554 | LLMenuGL::sMenuContainer = gMenuHolder; |
566 | 555 | ||
567 | // Initialize actions | 556 | // Initialize actions |
568 | initialize_menu_actions(); | 557 | initialize_menus(); |
569 | 558 | ||
570 | /// | 559 | /// |
571 | /// Popup menu | 560 | /// Popup menu |
@@ -965,6 +954,8 @@ void init_debug_world_menu(LLMenuGL* menu) | |||
965 | NULL, | 954 | NULL, |
966 | &menu_check_control, | 955 | &menu_check_control, |
967 | (void*)"FixedWeather")); | 956 | (void*)"FixedWeather")); |
957 | menu->append(new LLMenuItemCallGL("Dump Region Object Cache", | ||
958 | &handle_dump_region_object_cache, NULL, NULL)); | ||
968 | menu->createJumpKeys(); | 959 | menu->createJumpKeys(); |
969 | } | 960 | } |
970 | 961 | ||
@@ -1293,7 +1284,6 @@ void init_debug_avatar_menu(LLMenuGL* menu) | |||
1293 | menu->append(new LLMenuItemCallGL("Force Params to Default", &LLAgent::clearVisualParams, NULL)); | 1284 | menu->append(new LLMenuItemCallGL("Force Params to Default", &LLAgent::clearVisualParams, NULL)); |
1294 | menu->append(new LLMenuItemCallGL("Reload Vertex Shader", &reload_vertex_shader, NULL)); | 1285 | menu->append(new LLMenuItemCallGL("Reload Vertex Shader", &reload_vertex_shader, NULL)); |
1295 | menu->append(new LLMenuItemToggleGL("Animation Info", &LLVOAvatar::sShowAnimationDebug)); | 1286 | menu->append(new LLMenuItemToggleGL("Animation Info", &LLVOAvatar::sShowAnimationDebug)); |
1296 | menu->append(new LLMenuItemCallGL("Flush Animations", &flush_animations, NULL)); | ||
1297 | menu->append(new LLMenuItemCallGL("Slow Motion Animations", &slow_mo_animations, NULL)); | 1287 | menu->append(new LLMenuItemCallGL("Slow Motion Animations", &slow_mo_animations, NULL)); |
1298 | menu->append(new LLMenuItemToggleGL("Show Look At", &LLHUDEffectLookAt::sDebugLookAt)); | 1288 | menu->append(new LLMenuItemToggleGL("Show Look At", &LLHUDEffectLookAt::sDebugLookAt)); |
1299 | menu->append(new LLMenuItemToggleGL("Show Point At", &LLHUDEffectPointAt::sDebugPointAt)); | 1289 | menu->append(new LLMenuItemToggleGL("Show Point At", &LLHUDEffectPointAt::sDebugPointAt)); |
@@ -2041,13 +2031,13 @@ class LLAvatarDebug : public view_listener_t | |||
2041 | if( avatar ) | 2031 | if( avatar ) |
2042 | { | 2032 | { |
2043 | avatar->dumpLocalTextures(); | 2033 | avatar->dumpLocalTextures(); |
2034 | llinfos << "Dumping temporary asset data to simulator logs for avatar " << avatar->getID() << llendl; | ||
2035 | std::vector<std::string> strings; | ||
2036 | strings.push_back(avatar->getID().asString()); | ||
2037 | LLUUID invoice; | ||
2038 | send_generic_message("dumptempassetdata", strings, invoice); | ||
2039 | LLFloaterAvatarTextures::show( avatar->getID() ); | ||
2044 | } | 2040 | } |
2045 | llinfos << "Dumping temporary asset data to simulator logs for avatar " << avatar->getID() << llendl; | ||
2046 | std::vector<std::string> strings; | ||
2047 | strings.push_back(avatar->getID().asString()); | ||
2048 | LLUUID invoice; | ||
2049 | send_generic_message("dumptempassetdata", strings, invoice); | ||
2050 | LLFloaterAvatarTextures::show( avatar->getID() ); | ||
2051 | return true; | 2041 | return true; |
2052 | } | 2042 | } |
2053 | }; | 2043 | }; |
@@ -2337,16 +2327,6 @@ void handle_buy_contents(LLSaleInfo sale_info) | |||
2337 | LLFloaterBuyContents::show(sale_info); | 2327 | LLFloaterBuyContents::show(sale_info); |
2338 | } | 2328 | } |
2339 | 2329 | ||
2340 | class LLFileEnableSaveAs : public view_listener_t | ||
2341 | { | ||
2342 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
2343 | { | ||
2344 | bool new_value = gFloaterView->getFrontmost() && gFloaterView->getFrontmost()->canSaveAs(); | ||
2345 | gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); | ||
2346 | return true; | ||
2347 | } | ||
2348 | }; | ||
2349 | |||
2350 | void handle_region_dump_temp_asset_data(void*) | 2330 | void handle_region_dump_temp_asset_data(void*) |
2351 | { | 2331 | { |
2352 | llinfos << "Dumping temporary asset data to simulator logs" << llendl; | 2332 | llinfos << "Dumping temporary asset data to simulator logs" << llendl; |
@@ -2397,6 +2377,15 @@ void handle_dump_capabilities_info(void *) | |||
2397 | } | 2377 | } |
2398 | } | 2378 | } |
2399 | 2379 | ||
2380 | void handle_dump_region_object_cache(void*) | ||
2381 | { | ||
2382 | LLViewerRegion* regionp = gAgent.getRegion(); | ||
2383 | if (regionp) | ||
2384 | { | ||
2385 | regionp->dumpCache(); | ||
2386 | } | ||
2387 | } | ||
2388 | |||
2400 | void handle_dump_focus(void *) | 2389 | void handle_dump_focus(void *) |
2401 | { | 2390 | { |
2402 | LLView *view = gFocusMgr.getKeyboardFocus(); | 2391 | LLView *view = gFocusMgr.getKeyboardFocus(); |
@@ -4279,7 +4268,10 @@ void show_buy_currency(const char* extra) | |||
4279 | mesg << "Go to " << BUY_CURRENCY_URL << "\nfor information on purchasing currency?"; | 4268 | mesg << "Go to " << BUY_CURRENCY_URL << "\nfor information on purchasing currency?"; |
4280 | 4269 | ||
4281 | LLString::format_map_t args; | 4270 | LLString::format_map_t args; |
4282 | args["[EXTRA]"] = extra; | 4271 | if (extra != NULL) |
4272 | { | ||
4273 | args["[EXTRA]"] = extra; | ||
4274 | } | ||
4283 | args["[URL]"] = BUY_CURRENCY_URL; | 4275 | args["[URL]"] = BUY_CURRENCY_URL; |
4284 | gViewerWindow->alertXml("PromptGoToCurrencyPage", args, | 4276 | gViewerWindow->alertXml("PromptGoToCurrencyPage", args, |
4285 | callback_show_buy_currency); | 4277 | callback_show_buy_currency); |
@@ -4876,906 +4868,6 @@ void toggle_map( void* user_data ) | |||
4876 | } | 4868 | } |
4877 | } | 4869 | } |
4878 | 4870 | ||
4879 | /** | ||
4880 | char* upload_pick(void* data) | ||
4881 | |||
4882 | If applicable, brings up a file chooser in which the user selects a file | ||
4883 | to upload for a particular task. If the file is valid for the given action, | ||
4884 | returns the string to the full path filename, else returns NULL. | ||
4885 | Data is the load filter for the type of file as defined in LLFilePicker. | ||
4886 | **/ | ||
4887 | const char* upload_pick(void* data) | ||
4888 | { | ||
4889 | if( gAgent.cameraMouselook() ) | ||
4890 | { | ||
4891 | gAgent.changeCameraToDefault(); | ||
4892 | // This doesn't seem necessary. JC | ||
4893 | // display(); | ||
4894 | } | ||
4895 | |||
4896 | LLFilePicker::ELoadFilter type; | ||
4897 | if(data) | ||
4898 | { | ||
4899 | type = (LLFilePicker::ELoadFilter)((intptr_t)data); | ||
4900 | } | ||
4901 | else | ||
4902 | { | ||
4903 | type = LLFilePicker::FFLOAD_ALL; | ||
4904 | } | ||
4905 | |||
4906 | LLFilePicker& picker = LLFilePicker::instance(); | ||
4907 | if (!picker.getOpenFile(type)) | ||
4908 | { | ||
4909 | llinfos << "Couldn't import objects from file" << llendl; | ||
4910 | return NULL; | ||
4911 | } | ||
4912 | |||
4913 | const char* filename = picker.getFirstFile(); | ||
4914 | const char* ext = strrchr(filename, '.'); | ||
4915 | |||
4916 | //strincmp doesn't like NULL pointers | ||
4917 | if (ext == NULL) | ||
4918 | { | ||
4919 | const char* short_name = strrchr(filename, | ||
4920 | *gDirUtilp->getDirDelimiter().c_str()); | ||
4921 | |||
4922 | // No extension | ||
4923 | LLStringBase<char>::format_map_t args; | ||
4924 | args["[FILE]"] = LLString(short_name + 1); | ||
4925 | gViewerWindow->alertXml("NoFileExtension", args); | ||
4926 | return NULL; | ||
4927 | } | ||
4928 | else | ||
4929 | { | ||
4930 | //so there is an extension | ||
4931 | //loop over the valid extensions and compare to see | ||
4932 | //if the extension is valid | ||
4933 | |||
4934 | //now grab the set of valid file extensions | ||
4935 | const char* valids = build_extensions_string(type); | ||
4936 | std::string valid_extensions = std::string(valids); | ||
4937 | |||
4938 | BOOL ext_valid = FALSE; | ||
4939 | |||
4940 | typedef boost::tokenizer<boost::char_separator<char> > tokenizer; | ||
4941 | boost::char_separator<char> sep(" "); | ||
4942 | tokenizer tokens(valid_extensions, sep); | ||
4943 | tokenizer::iterator token_iter; | ||
4944 | |||
4945 | //now loop over all valid file extensions | ||
4946 | //and compare them to the extension of the file | ||
4947 | //to be uploaded | ||
4948 | for( token_iter = tokens.begin(); | ||
4949 | token_iter != tokens.end() && ext_valid != TRUE; | ||
4950 | ++token_iter) | ||
4951 | { | ||
4952 | const char* cur_token = token_iter->c_str(); | ||
4953 | |||
4954 | if (0 == strnicmp(cur_token, ext, strlen(cur_token)) || /* Flawfinder: ignore */ | ||
4955 | 0 == strnicmp(cur_token, "*.*", strlen(cur_token))) /* Flawfinder: ignore */ | ||
4956 | { | ||
4957 | //valid extension | ||
4958 | //or the acceptable extension is any | ||
4959 | ext_valid = TRUE; | ||
4960 | } | ||
4961 | }//end for (loop over all tokens) | ||
4962 | |||
4963 | if (ext_valid == FALSE) | ||
4964 | { | ||
4965 | //should only get here if the extension exists | ||
4966 | //but is invalid | ||
4967 | LLStringBase<char>::format_map_t args; | ||
4968 | args["[EXTENSION]"] = ext; | ||
4969 | args["[VALIDS]"] = valids; | ||
4970 | gViewerWindow->alertXml("InvalidFileExtension", args); | ||
4971 | return NULL; | ||
4972 | } | ||
4973 | }//end else (non-null extension) | ||
4974 | |||
4975 | //valid file extension | ||
4976 | |||
4977 | //now we check to see | ||
4978 | //if the file is actually a valid image/sound/etc. | ||
4979 | if (type == LLFilePicker::FFLOAD_WAV) | ||
4980 | { | ||
4981 | // pre-qualify wavs to make sure the format is acceptable | ||
4982 | char error_msg[MAX_STRING]; /* Flawfinder: ignore */ | ||
4983 | if (check_for_invalid_wav_formats(filename,error_msg)) | ||
4984 | { | ||
4985 | llinfos << error_msg << ": " << filename << llendl; | ||
4986 | LLStringBase<char>::format_map_t args; | ||
4987 | args["[FILE]"] = filename; | ||
4988 | gViewerWindow->alertXml( error_msg, args ); | ||
4989 | return NULL; | ||
4990 | } | ||
4991 | }//end if a wave/sound file | ||
4992 | |||
4993 | |||
4994 | return filename; | ||
4995 | } | ||
4996 | |||
4997 | void handle_upload_object(void* data) | ||
4998 | { | ||
4999 | const char* filename = upload_pick(data); | ||
5000 | if (filename) | ||
5001 | { | ||
5002 | // start the import | ||
5003 | LLFloaterImport* floaterp = new LLFloaterImport(filename); | ||
5004 | gUICtrlFactory->buildFloater(floaterp, "floater_import.xml"); | ||
5005 | } | ||
5006 | } | ||
5007 | |||
5008 | class LLFileUploadImage : public view_listener_t | ||
5009 | { | ||
5010 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
5011 | { | ||
5012 | const char* filename = upload_pick((void *)(S32)LLFilePicker::FFLOAD_IMAGE); | ||
5013 | if (filename) | ||
5014 | { | ||
5015 | LLFloaterImagePreview* floaterp = new LLFloaterImagePreview(filename); | ||
5016 | gUICtrlFactory->buildFloater(floaterp, "floater_image_preview.xml"); | ||
5017 | } | ||
5018 | return TRUE; | ||
5019 | } | ||
5020 | }; | ||
5021 | |||
5022 | class LLFileUploadSound : public view_listener_t | ||
5023 | { | ||
5024 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
5025 | { | ||
5026 | const char* filename = upload_pick((void*)((S32)LLFilePicker::FFLOAD_WAV)); | ||
5027 | if (filename) | ||
5028 | { | ||
5029 | LLFloaterNameDesc* floaterp = new LLFloaterNameDesc(filename); | ||
5030 | gUICtrlFactory->buildFloater(floaterp, "floater_sound_preview.xml"); | ||
5031 | } | ||
5032 | return true; | ||
5033 | } | ||
5034 | }; | ||
5035 | |||
5036 | class LLFileUploadAnim : public view_listener_t | ||
5037 | { | ||
5038 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
5039 | { | ||
5040 | const char* filename = upload_pick((void*)((S32)LLFilePicker::FFLOAD_ANIM)); | ||
5041 | if (filename) | ||
5042 | { | ||
5043 | LLFloaterAnimPreview* floaterp = new LLFloaterAnimPreview(filename); | ||
5044 | gUICtrlFactory->buildFloater(floaterp, "floater_animation_preview.xml"); | ||
5045 | } | ||
5046 | return true; | ||
5047 | } | ||
5048 | }; | ||
5049 | |||
5050 | class LLFileUploadBulk : public view_listener_t | ||
5051 | { | ||
5052 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
5053 | { | ||
5054 | if( gAgent.cameraMouselook() ) | ||
5055 | { | ||
5056 | gAgent.changeCameraToDefault(); | ||
5057 | } | ||
5058 | |||
5059 | // TODO: | ||
5060 | // Iterate over all files | ||
5061 | // Check extensions for uploadability, cost | ||
5062 | // Check user balance for entire cost | ||
5063 | // Charge user entire cost | ||
5064 | // Loop, uploading | ||
5065 | // If an upload fails, refund the user for that one | ||
5066 | // | ||
5067 | // Also fix single upload to charge first, then refund | ||
5068 | |||
5069 | LLFilePicker& picker = LLFilePicker::instance(); | ||
5070 | if (picker.getMultipleOpenFiles()) | ||
5071 | { | ||
5072 | const char* filename = picker.getFirstFile(); | ||
5073 | const char* name = picker.getDirname(); | ||
5074 | |||
5075 | LLString asset_name = name; | ||
5076 | LLString::replaceNonstandardASCII( asset_name, '?' ); | ||
5077 | LLString::replaceChar(asset_name, '|', '?'); | ||
5078 | LLString::stripNonprintable(asset_name); | ||
5079 | LLString::trim(asset_name); | ||
5080 | |||
5081 | char* asset_name_str = (char*)asset_name.c_str(); | ||
5082 | char* end_p = strrchr(asset_name_str, '.'); // strip extension if exists | ||
5083 | if( !end_p ) | ||
5084 | { | ||
5085 | end_p = asset_name_str + strlen( asset_name_str ); /* Flawfinder: ignore */ | ||
5086 | } | ||
5087 | |||
5088 | S32 len = llmin( (S32) (DB_INV_ITEM_NAME_STR_LEN), (S32) (end_p - asset_name_str) ); | ||
5089 | |||
5090 | asset_name = asset_name.substr( 0, len ); | ||
5091 | |||
5092 | upload_new_resource(filename, asset_name, asset_name, 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE); // file | ||
5093 | } | ||
5094 | else | ||
5095 | { | ||
5096 | llinfos << "Couldn't import objects from file" << llendl; | ||
5097 | } | ||
5098 | return true; | ||
5099 | } | ||
5100 | }; | ||
5101 | |||
5102 | void upload_error(const char* error_message, const char* label, const std::string filename, const LLStringBase<char>::format_map_t args) | ||
5103 | { | ||
5104 | llwarns << error_message << llendl; | ||
5105 | gViewerWindow->alertXml(label, args); | ||
5106 | if(remove(filename.c_str()) == -1) | ||
5107 | { | ||
5108 | lldebugs << "unable to remove temp file" << llendl; | ||
5109 | } | ||
5110 | LLFilePicker::instance().reset(); | ||
5111 | } | ||
5112 | |||
5113 | class LLFileEnableCloseWindow : public view_listener_t | ||
5114 | { | ||
5115 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
5116 | { | ||
5117 | bool new_value = gFloaterView->getFocusedFloater() != NULL || gSnapshotFloaterView->getFocusedFloater() != NULL; | ||
5118 | // horrendously opaque, this code | ||
5119 | gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); | ||
5120 | return true; | ||
5121 | } | ||
5122 | }; | ||
5123 | |||
5124 | class LLFileCloseWindow : public view_listener_t | ||
5125 | { | ||
5126 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
5127 | { | ||
5128 | LLFloater::closeFocusedFloater(); | ||
5129 | |||
5130 | return true; | ||
5131 | } | ||
5132 | }; | ||
5133 | |||
5134 | class LLFileSaveTexture : public view_listener_t | ||
5135 | { | ||
5136 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
5137 | { | ||
5138 | LLFloater* top = gFloaterView->getFrontmost(); | ||
5139 | if (top) | ||
5140 | { | ||
5141 | top->saveAs(); | ||
5142 | } | ||
5143 | return true; | ||
5144 | } | ||
5145 | }; | ||
5146 | |||
5147 | class LLFileTakeSnapshot : public view_listener_t | ||
5148 | { | ||
5149 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
5150 | { | ||
5151 | LLFloaterSnapshot::show(NULL); | ||
5152 | return true; | ||
5153 | } | ||
5154 | }; | ||
5155 | |||
5156 | class LLFileTakeSnapshotToDisk : public view_listener_t | ||
5157 | { | ||
5158 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
5159 | { | ||
5160 | LLPointer<LLImageRaw> raw = new LLImageRaw; | ||
5161 | |||
5162 | S32 width = gViewerWindow->getWindowDisplayWidth(); | ||
5163 | S32 height = gViewerWindow->getWindowDisplayHeight(); | ||
5164 | |||
5165 | if (gSavedSettings.getBOOL("HighResSnapshot")) | ||
5166 | { | ||
5167 | width *= 2; | ||
5168 | height *= 2; | ||
5169 | } | ||
5170 | |||
5171 | if (gViewerWindow->rawSnapshot(raw, | ||
5172 | width, | ||
5173 | height, | ||
5174 | TRUE, | ||
5175 | gSavedSettings.getBOOL("RenderUIInSnapshot"), | ||
5176 | FALSE)) | ||
5177 | { | ||
5178 | if (!gQuietSnapshot) | ||
5179 | { | ||
5180 | gViewerWindow->playSnapshotAnimAndSound(); | ||
5181 | } | ||
5182 | LLImageBase::setSizeOverride(TRUE); | ||
5183 | gViewerWindow->saveImageNumbered(raw); | ||
5184 | LLImageBase::setSizeOverride(FALSE); | ||
5185 | } | ||
5186 | return true; | ||
5187 | } | ||
5188 | }; | ||
5189 | |||
5190 | class LLFileSaveMovie : public view_listener_t | ||
5191 | { | ||
5192 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
5193 | { | ||
5194 | LLViewerWindow::saveMovieNumbered(NULL); | ||
5195 | return true; | ||
5196 | } | ||
5197 | }; | ||
5198 | |||
5199 | class LLFileSetWindowSize : public view_listener_t | ||
5200 | { | ||
5201 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
5202 | { | ||
5203 | LLString size = userdata.asString(); | ||
5204 | S32 width, height; | ||
5205 | sscanf(size.c_str(), "%d,%d", &width, &height); | ||
5206 | LLViewerWindow::movieSize(width, height); | ||
5207 | return true; | ||
5208 | } | ||
5209 | }; | ||
5210 | |||
5211 | class LLFileQuit : public view_listener_t | ||
5212 | { | ||
5213 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
5214 | { | ||
5215 | app_request_quit(); | ||
5216 | return true; | ||
5217 | } | ||
5218 | }; | ||
5219 | |||
5220 | void handle_upload(void* data) | ||
5221 | { | ||
5222 | const char* filename = upload_pick(data); | ||
5223 | if (filename) | ||
5224 | { | ||
5225 | LLFloaterNameDesc* floaterp = new LLFloaterNameDesc(filename); | ||
5226 | gUICtrlFactory->buildFloater(floaterp, "floater_name_description.xml"); | ||
5227 | } | ||
5228 | } | ||
5229 | |||
5230 | void handle_compress_image(void*) | ||
5231 | { | ||
5232 | LLFilePicker& picker = LLFilePicker::instance(); | ||
5233 | if (picker.getOpenFile(LLFilePicker::FFLOAD_IMAGE)) | ||
5234 | { | ||
5235 | std::string infile(picker.getFirstFile()); | ||
5236 | std::string outfile = infile + ".j2c"; | ||
5237 | |||
5238 | llinfos << "Input: " << infile << llendl; | ||
5239 | llinfos << "Output: " << outfile << llendl; | ||
5240 | |||
5241 | BOOL success; | ||
5242 | |||
5243 | success = LLViewerImageList::createUploadFile(infile, outfile, IMG_CODEC_TGA); | ||
5244 | |||
5245 | if (success) | ||
5246 | { | ||
5247 | llinfos << "Compression complete" << llendl; | ||
5248 | } | ||
5249 | else | ||
5250 | { | ||
5251 | llinfos << "Compression failed: " << LLImageBase::getLastError() << llendl; | ||
5252 | } | ||
5253 | } | ||
5254 | } | ||
5255 | |||
5256 | void upload_new_resource(const LLString& src_filename, std::string name, | ||
5257 | std::string desc, S32 compression_info, | ||
5258 | LLAssetType::EType destination_folder_type, | ||
5259 | LLInventoryType::EType inv_type, | ||
5260 | U32 next_owner_perm, | ||
5261 | const LLString& display_name, | ||
5262 | LLAssetStorage::LLStoreAssetCallback callback, | ||
5263 | void *userdata) | ||
5264 | { | ||
5265 | // Generate the temporary UUID. | ||
5266 | LLString filename = gDirUtilp->getTempFilename(); | ||
5267 | LLTransactionID tid; | ||
5268 | LLAssetID uuid; | ||
5269 | |||
5270 | LLStringBase<char>::format_map_t args; | ||
5271 | |||
5272 | LLString ext = src_filename.substr(src_filename.find_last_of('.')); | ||
5273 | LLAssetType::EType asset_type = LLAssetType::AT_NONE; | ||
5274 | char error_message[MAX_STRING]; /* Flawfinder: ignore */ | ||
5275 | error_message[0] = '\0'; | ||
5276 | LLString temp_str; | ||
5277 | |||
5278 | BOOL error = FALSE; | ||
5279 | |||
5280 | if (ext.empty()) | ||
5281 | { | ||
5282 | LLString::size_type offset = filename.find_last_of(gDirUtilp->getDirDelimiter()); | ||
5283 | if (offset != LLString::npos) | ||
5284 | offset++; | ||
5285 | LLString short_name = filename.substr(offset); | ||
5286 | |||
5287 | // No extension | ||
5288 | snprintf(error_message, /* Flawfinder: ignore */ | ||
5289 | MAX_STRING, | ||
5290 | "No file extension for the file: '%s'\nPlease make sure the file has a correct file extension", | ||
5291 | short_name.c_str()); | ||
5292 | args["[FILE]"] = short_name; | ||
5293 | upload_error(error_message, "NofileExtension", filename, args); | ||
5294 | return; | ||
5295 | } | ||
5296 | else if( LLString::compareInsensitive(ext.c_str(),".bmp") == 0 ) | ||
5297 | { | ||
5298 | asset_type = LLAssetType::AT_TEXTURE; | ||
5299 | if (!LLViewerImageList::createUploadFile(src_filename, | ||
5300 | filename, | ||
5301 | IMG_CODEC_BMP )) | ||
5302 | { | ||
5303 | snprintf(error_message, MAX_STRING, "Problem with file %s:\n\n%s\n", /* Flawfinder: ignore */ | ||
5304 | src_filename.c_str(), LLImageBase::getLastError().c_str()); | ||
5305 | args["[FILE]"] = src_filename; | ||
5306 | args["[ERROR]"] = LLImageBase::getLastError(); | ||
5307 | upload_error(error_message, "ProblemWithFile", filename, args); | ||
5308 | return; | ||
5309 | } | ||
5310 | } | ||
5311 | else if( LLString::compareInsensitive(ext.c_str(),".tga") == 0 ) | ||
5312 | { | ||
5313 | asset_type = LLAssetType::AT_TEXTURE; | ||
5314 | if (!LLViewerImageList::createUploadFile(src_filename, | ||
5315 | filename, | ||
5316 | IMG_CODEC_TGA )) | ||
5317 | { | ||
5318 | snprintf(error_message, MAX_STRING, "Problem with file %s:\n\n%s\n", /* Flawfinder: ignore */ | ||
5319 | src_filename.c_str(), LLImageBase::getLastError().c_str()); | ||
5320 | args["[FILE]"] = src_filename; | ||
5321 | args["[ERROR]"] = LLImageBase::getLastError(); | ||
5322 | upload_error(error_message, "ProblemWithFile", filename, args); | ||
5323 | return; | ||
5324 | } | ||
5325 | } | ||
5326 | else if( LLString::compareInsensitive(ext.c_str(),".jpg") == 0 || LLString::compareInsensitive(ext.c_str(),".jpeg") == 0) | ||
5327 | { | ||
5328 | asset_type = LLAssetType::AT_TEXTURE; | ||
5329 | if (!LLViewerImageList::createUploadFile(src_filename, | ||
5330 | filename, | ||
5331 | IMG_CODEC_JPEG )) | ||
5332 | { | ||
5333 | snprintf(error_message, MAX_STRING, "Problem with file %s:\n\n%s\n", /* Flawfinder: ignore */ | ||
5334 | src_filename.c_str(), LLImageBase::getLastError().c_str()); | ||
5335 | args["[FILE]"] = src_filename; | ||
5336 | args["[ERROR]"] = LLImageBase::getLastError(); | ||
5337 | upload_error(error_message, "ProblemWithFile", filename, args); | ||
5338 | return; | ||
5339 | } | ||
5340 | } | ||
5341 | else if(LLString::compareInsensitive(ext.c_str(),".wav") == 0) | ||
5342 | { | ||
5343 | asset_type = LLAssetType::AT_SOUND; // tag it as audio | ||
5344 | S32 encode_result = 0; | ||
5345 | |||
5346 | S32 bitrate = 128; | ||
5347 | |||
5348 | if (compression_info) | ||
5349 | { | ||
5350 | bitrate = compression_info; | ||
5351 | } | ||
5352 | llinfos << "Attempting to encode wav as an ogg file at " << bitrate << "kbps" << llendl; | ||
5353 | |||
5354 | encode_result = encode_vorbis_file_at(src_filename.c_str(), filename.c_str(), bitrate*1000); | ||
5355 | |||
5356 | if (LLVORBISENC_NOERR != encode_result) | ||
5357 | { | ||
5358 | switch(encode_result) | ||
5359 | { | ||
5360 | case LLVORBISENC_DEST_OPEN_ERR: | ||
5361 | snprintf(error_message, MAX_STRING, "Couldn't open temporary compressed sound file for writing: %s\n", filename.c_str()); /* Flawfinder: ignore */ | ||
5362 | args["[FILE]"] = filename; | ||
5363 | upload_error(error_message, "CannotOpenTemporarySoundFile", filename, args); | ||
5364 | break; | ||
5365 | |||
5366 | default: | ||
5367 | snprintf(error_message, MAX_STRING, "Unknown vorbis encode failure on: %s\n", src_filename.c_str()); /* Flawfinder: ignore */ | ||
5368 | args["[FILE]"] = src_filename; | ||
5369 | upload_error(error_message, "UnknownVorbisEncodeFailure", filename, args); | ||
5370 | break; | ||
5371 | } | ||
5372 | return; | ||
5373 | } | ||
5374 | } | ||
5375 | else if(LLString::compareInsensitive(ext.c_str(),".tmp") == 0) | ||
5376 | { | ||
5377 | // This is a generic .lin resource file | ||
5378 | asset_type = LLAssetType::AT_OBJECT; | ||
5379 | FILE* in = LLFile::fopen(src_filename.c_str(), "rb"); /* Flawfinder: ignore */ | ||
5380 | if (in) | ||
5381 | { | ||
5382 | // read in the file header | ||
5383 | char buf[16384]; /* Flawfinder: ignore */ | ||
5384 | S32 read; /* Flawfinder: ignore */ | ||
5385 | S32 version; | ||
5386 | if (fscanf(in, "LindenResource\nversion %d\n", &version)) | ||
5387 | { | ||
5388 | if (2 == version) | ||
5389 | { | ||
5390 | // *NOTE: This buffer size is hard coded into scanf() below. | ||
5391 | char label[MAX_STRING]; /* Flawfinder: ignore */ | ||
5392 | char value[MAX_STRING]; /* Flawfinder: ignore */ | ||
5393 | S32 tokens_read; | ||
5394 | while (fgets(buf, 1024, in)) | ||
5395 | { | ||
5396 | label[0] = '\0'; | ||
5397 | value[0] = '\0'; | ||
5398 | tokens_read = sscanf( /* Flawfinder: ignore */ | ||
5399 | buf, | ||
5400 | "%254s %254s\n", | ||
5401 | label, value); | ||
5402 | |||
5403 | llinfos << "got: " << label << " = " << value | ||
5404 | << llendl; | ||
5405 | |||
5406 | if (EOF == tokens_read) | ||
5407 | { | ||
5408 | fclose(in); | ||
5409 | snprintf(error_message, MAX_STRING, "corrupt resource file: %s", src_filename.c_str()); /* Flawfinder: ignore */ | ||
5410 | args["[FILE]"] = src_filename; | ||
5411 | upload_error(error_message, "CorruptResourceFile", filename, args); | ||
5412 | return; | ||
5413 | } | ||
5414 | |||
5415 | if (2 == tokens_read) | ||
5416 | { | ||
5417 | if (! strcmp("type", label)) | ||
5418 | { | ||
5419 | asset_type = (LLAssetType::EType)(atoi(value)); | ||
5420 | } | ||
5421 | } | ||
5422 | else | ||
5423 | { | ||
5424 | if (! strcmp("_DATA_", label)) | ||
5425 | { | ||
5426 | // below is the data section | ||
5427 | break; | ||
5428 | } | ||
5429 | } | ||
5430 | // other values are currently discarded | ||
5431 | } | ||
5432 | |||
5433 | } | ||
5434 | else | ||
5435 | { | ||
5436 | fclose(in); | ||
5437 | snprintf(error_message, MAX_STRING, "unknown linden resource file version in file: %s", src_filename.c_str()); /* Flawfinder: ignore */ | ||
5438 | args["[FILE]"] = src_filename; | ||
5439 | upload_error(error_message, "UnknownResourceFileVersion", filename, args); | ||
5440 | return; | ||
5441 | } | ||
5442 | } | ||
5443 | else | ||
5444 | { | ||
5445 | // this is an original binary formatted .lin file | ||
5446 | // start over at the beginning of the file | ||
5447 | fseek(in, 0, SEEK_SET); | ||
5448 | |||
5449 | const S32 MAX_ASSET_DESCRIPTION_LENGTH = 256; | ||
5450 | const S32 MAX_ASSET_NAME_LENGTH = 64; | ||
5451 | S32 header_size = 34 + MAX_ASSET_DESCRIPTION_LENGTH + MAX_ASSET_NAME_LENGTH; | ||
5452 | S16 type_num; | ||
5453 | |||
5454 | // read in and throw out most of the header except for the type | ||
5455 | fread(buf, header_size, 1, in); | ||
5456 | memcpy(&type_num, buf + 16, sizeof(S16)); /* Flawfinder: ignore */ | ||
5457 | asset_type = (LLAssetType::EType)type_num; | ||
5458 | } | ||
5459 | |||
5460 | // copy the file's data segment into another file for uploading | ||
5461 | FILE* out = LLFile::fopen(filename.c_str(), "wb"); /* Flawfinder: ignore */ | ||
5462 | if (out) | ||
5463 | { | ||
5464 | while((read = fread(buf, 1, 16384, in))) /* Flawfinder: ignore */ | ||
5465 | { | ||
5466 | fwrite(buf, 1, read, out); /* Flawfinder: ignore */ | ||
5467 | } | ||
5468 | fclose(out); | ||
5469 | } | ||
5470 | else | ||
5471 | { | ||
5472 | fclose(in); | ||
5473 | snprintf(error_message, MAX_STRING, "Unable to create output file: %s", filename.c_str()); /* Flawfinder: ignore */ | ||
5474 | args["[FILE]"] = filename; | ||
5475 | upload_error(error_message, "UnableToCreateOutputFile", filename, args); | ||
5476 | return; | ||
5477 | } | ||
5478 | |||
5479 | fclose(in); | ||
5480 | } | ||
5481 | else | ||
5482 | { | ||
5483 | llinfos << "Couldn't open .lin file " << src_filename << llendl; | ||
5484 | } | ||
5485 | } | ||
5486 | else if (LLString::compareInsensitive(ext.c_str(),".bvh") == 0) | ||
5487 | { | ||
5488 | snprintf(error_message, MAX_STRING, "We do not currently support bulk upload of animation files\n"); /* Flawfinder: ignore */ | ||
5489 | upload_error(error_message, "DoNotSupportBulkAnimationUpload", filename, args); | ||
5490 | return; | ||
5491 | } | ||
5492 | else | ||
5493 | { | ||
5494 | // Unknown extension | ||
5495 | snprintf(error_message, MAX_STRING, "Unknown file extension %s\nExpected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh", ext.c_str()); /* Flawfinder: ignore */ | ||
5496 | error = TRUE;; | ||
5497 | } | ||
5498 | |||
5499 | // gen a new transaction ID for this asset | ||
5500 | tid.generate(); | ||
5501 | |||
5502 | if (!error) | ||
5503 | { | ||
5504 | uuid = tid.makeAssetID(gAgent.getSecureSessionID()); | ||
5505 | // copy this file into the vfs for upload | ||
5506 | S32 file_size; | ||
5507 | apr_file_t* fp = ll_apr_file_open(filename, LL_APR_RB, &file_size); | ||
5508 | if (fp) | ||
5509 | { | ||
5510 | LLVFile file(gVFS, uuid, asset_type, LLVFile::WRITE); | ||
5511 | |||
5512 | file.setMaxSize(file_size); | ||
5513 | |||
5514 | const S32 buf_size = 65536; | ||
5515 | U8 copy_buf[buf_size]; | ||
5516 | while ((file_size = ll_apr_file_read(fp, copy_buf, buf_size))) | ||
5517 | { | ||
5518 | file.write(copy_buf, file_size); | ||
5519 | } | ||
5520 | apr_file_close(fp); | ||
5521 | } | ||
5522 | else | ||
5523 | { | ||
5524 | snprintf(error_message, MAX_STRING, "Unable to access output file: %s", filename.c_str()); /* Flawfinder: ignore */ | ||
5525 | error = TRUE; | ||
5526 | } | ||
5527 | } | ||
5528 | |||
5529 | if (!error) | ||
5530 | { | ||
5531 | LLString t_disp_name = display_name; | ||
5532 | if (t_disp_name.empty()) | ||
5533 | { | ||
5534 | t_disp_name = src_filename; | ||
5535 | } | ||
5536 | upload_new_resource(tid, asset_type, name, desc, compression_info, // tid | ||
5537 | destination_folder_type, inv_type, next_owner_perm, | ||
5538 | display_name, callback, userdata); | ||
5539 | } | ||
5540 | else | ||
5541 | { | ||
5542 | llwarns << error_message << llendl; | ||
5543 | LLStringBase<char>::format_map_t args; | ||
5544 | args["[ERROR_MESSAGE]"] = error_message; | ||
5545 | gViewerWindow->alertXml("ErrorMessage", args); | ||
5546 | if(LLFile::remove(filename.c_str()) == -1) | ||
5547 | { | ||
5548 | lldebugs << "unable to remove temp file" << llendl; | ||
5549 | } | ||
5550 | LLFilePicker::instance().reset(); | ||
5551 | } | ||
5552 | } | ||
5553 | |||
5554 | void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_type, | ||
5555 | std::string name, | ||
5556 | std::string desc, S32 compression_info, | ||
5557 | LLAssetType::EType destination_folder_type, | ||
5558 | LLInventoryType::EType inv_type, | ||
5559 | U32 next_owner_perm, | ||
5560 | const LLString& display_name, | ||
5561 | LLAssetStorage::LLStoreAssetCallback callback, | ||
5562 | void *userdata) | ||
5563 | { | ||
5564 | LLAssetID uuid = tid.makeAssetID(gAgent.getSecureSessionID()); | ||
5565 | |||
5566 | if( LLAssetType::AT_SOUND == asset_type ) | ||
5567 | { | ||
5568 | gViewerStats->incStat(LLViewerStats::ST_UPLOAD_SOUND_COUNT ); | ||
5569 | } | ||
5570 | else | ||
5571 | if( LLAssetType::AT_TEXTURE == asset_type ) | ||
5572 | { | ||
5573 | gViewerStats->incStat(LLViewerStats::ST_UPLOAD_TEXTURE_COUNT ); | ||
5574 | } | ||
5575 | else | ||
5576 | if( LLAssetType::AT_ANIMATION == asset_type) | ||
5577 | { | ||
5578 | gViewerStats->incStat(LLViewerStats::ST_UPLOAD_ANIM_COUNT ); | ||
5579 | } | ||
5580 | |||
5581 | if(LLInventoryType::IT_NONE == inv_type) | ||
5582 | { | ||
5583 | inv_type = LLInventoryType::defaultForAssetType(asset_type); | ||
5584 | } | ||
5585 | LLString::stripNonprintable(name); | ||
5586 | LLString::stripNonprintable(desc); | ||
5587 | if(name.empty()) | ||
5588 | { | ||
5589 | name = "(No Name)"; | ||
5590 | } | ||
5591 | if(desc.empty()) | ||
5592 | { | ||
5593 | desc = "(No Description)"; | ||
5594 | } | ||
5595 | |||
5596 | // At this point, we're ready for the upload. | ||
5597 | LLString upload_message = "Uploading...\n\n"; | ||
5598 | upload_message.append(display_name); | ||
5599 | LLUploadDialog::modalUploadDialog(upload_message); | ||
5600 | |||
5601 | llinfos << "*** Uploading: " << llendl; | ||
5602 | llinfos << "Type: " << LLAssetType::lookup(asset_type) << llendl; | ||
5603 | llinfos << "UUID: " << uuid << llendl; | ||
5604 | llinfos << "Name: " << name << llendl; | ||
5605 | llinfos << "Desc: " << desc << llendl; | ||
5606 | lldebugs << "Folder: " << gInventory.findCategoryUUIDForType(destination_folder_type) << llendl; | ||
5607 | lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl; | ||
5608 | std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory"); | ||
5609 | if (!url.empty()) | ||
5610 | { | ||
5611 | llinfos << "New Agent Inventory via capability" << llendl; | ||
5612 | LLSD body; | ||
5613 | body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLAssetType::AT_NONE) ? asset_type : destination_folder_type); | ||
5614 | body["asset_type"] = LLAssetType::lookup(asset_type); | ||
5615 | body["inventory_type"] = LLInventoryType::lookup(inv_type); | ||
5616 | body["name"] = name; | ||
5617 | body["description"] = desc; | ||
5618 | |||
5619 | std::ostringstream llsdxml; | ||
5620 | LLSDSerialize::toXML(body, llsdxml); | ||
5621 | lldebugs << "posting body to capability: " << llsdxml.str() << llendl; | ||
5622 | LLHTTPClient::post(url, body, new LLNewAgentInventoryResponder(body, uuid, asset_type)); | ||
5623 | } | ||
5624 | else | ||
5625 | { | ||
5626 | llinfos << "NewAgentInventory capability not found, new agent inventory via asset system." << llendl; | ||
5627 | // check for adequate funds | ||
5628 | // TODO: do this check on the sim | ||
5629 | if (LLAssetType::AT_SOUND == asset_type || | ||
5630 | LLAssetType::AT_TEXTURE == asset_type || | ||
5631 | LLAssetType::AT_ANIMATION == asset_type) | ||
5632 | { | ||
5633 | S32 upload_cost = gGlobalEconomy->getPriceUpload(); | ||
5634 | S32 balance = gStatusBar->getBalance(); | ||
5635 | if (balance < upload_cost) | ||
5636 | { | ||
5637 | // insufficient funds, bail on this upload | ||
5638 | LLFloaterBuyCurrency::buyCurrency("Uploading costs", upload_cost); | ||
5639 | return; | ||
5640 | } | ||
5641 | } | ||
5642 | |||
5643 | LLResourceData* data = new LLResourceData; | ||
5644 | data->mAssetInfo.mTransactionID = tid; | ||
5645 | data->mAssetInfo.mUuid = uuid; | ||
5646 | data->mAssetInfo.mType = asset_type; | ||
5647 | data->mAssetInfo.mCreatorID = gAgentID; | ||
5648 | data->mInventoryType = inv_type; | ||
5649 | data->mNextOwnerPerm = next_owner_perm; | ||
5650 | data->mUserData = userdata; | ||
5651 | data->mAssetInfo.setName(name); | ||
5652 | data->mAssetInfo.setDescription(desc); | ||
5653 | data->mPreferredLocation = destination_folder_type; | ||
5654 | |||
5655 | LLAssetStorage::LLStoreAssetCallback asset_callback = &upload_done_callback; | ||
5656 | if (callback) | ||
5657 | { | ||
5658 | asset_callback = callback; | ||
5659 | } | ||
5660 | gAssetStorage->storeAssetData(data->mAssetInfo.mTransactionID, data->mAssetInfo.mType, | ||
5661 | asset_callback, | ||
5662 | (void*)data, | ||
5663 | FALSE); | ||
5664 | } | ||
5665 | } | ||
5666 | |||
5667 | void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result) // StoreAssetData callback (fixed) | ||
5668 | { | ||
5669 | LLResourceData* data = (LLResourceData*)user_data; | ||
5670 | //LLAssetType::EType pref_loc = data->mPreferredLocation; | ||
5671 | BOOL is_balance_sufficient = TRUE; | ||
5672 | if(result >= 0) | ||
5673 | { | ||
5674 | LLAssetType::EType dest_loc = (data->mPreferredLocation == LLAssetType::AT_NONE) ? data->mAssetInfo.mType : data->mPreferredLocation; | ||
5675 | |||
5676 | if (LLAssetType::AT_SOUND == data->mAssetInfo.mType || | ||
5677 | LLAssetType::AT_TEXTURE == data->mAssetInfo.mType || | ||
5678 | LLAssetType::AT_ANIMATION == data->mAssetInfo.mType) | ||
5679 | { | ||
5680 | // Charge the user for the upload. | ||
5681 | LLViewerRegion* region = gAgent.getRegion(); | ||
5682 | S32 upload_cost = gGlobalEconomy->getPriceUpload(); | ||
5683 | |||
5684 | if(!(can_afford_transaction(upload_cost))) | ||
5685 | { | ||
5686 | LLFloaterBuyCurrency::buyCurrency( | ||
5687 | llformat("Uploading %s costs", | ||
5688 | data->mAssetInfo.getName().c_str()), | ||
5689 | upload_cost); | ||
5690 | is_balance_sufficient = FALSE; | ||
5691 | } | ||
5692 | else if(region) | ||
5693 | { | ||
5694 | // Charge user for upload | ||
5695 | gStatusBar->debitBalance(upload_cost); | ||
5696 | |||
5697 | LLMessageSystem* msg = gMessageSystem; | ||
5698 | msg->newMessageFast(_PREHASH_MoneyTransferRequest); | ||
5699 | msg->nextBlockFast(_PREHASH_AgentData); | ||
5700 | msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); | ||
5701 | msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); | ||
5702 | msg->nextBlockFast(_PREHASH_MoneyData); | ||
5703 | msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID()); | ||
5704 | msg->addUUIDFast(_PREHASH_DestID, LLUUID::null); | ||
5705 | msg->addU8("Flags", 0); | ||
5706 | msg->addS32Fast(_PREHASH_Amount, upload_cost); | ||
5707 | msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY); | ||
5708 | msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY); | ||
5709 | msg->addS32Fast(_PREHASH_TransactionType, TRANS_UPLOAD_CHARGE); | ||
5710 | msg->addStringFast(_PREHASH_Description, NULL); | ||
5711 | msg->sendReliable(region->getHost()); | ||
5712 | } | ||
5713 | } | ||
5714 | |||
5715 | if(is_balance_sufficient) | ||
5716 | { | ||
5717 | // Actually add the upload to inventory | ||
5718 | llinfos << "Adding " << uuid << " to inventory." << llendl; | ||
5719 | LLUUID folder_id(gInventory.findCategoryUUIDForType(dest_loc)); | ||
5720 | if(folder_id.notNull()) | ||
5721 | { | ||
5722 | U32 next_owner_perm = data->mNextOwnerPerm; | ||
5723 | if(PERM_NONE == next_owner_perm) | ||
5724 | { | ||
5725 | next_owner_perm = PERM_MOVE | PERM_TRANSFER; | ||
5726 | } | ||
5727 | create_inventory_item(gAgent.getID(), gAgent.getSessionID(), | ||
5728 | folder_id, data->mAssetInfo.mTransactionID, data->mAssetInfo.getName(), | ||
5729 | data->mAssetInfo.getDescription(), data->mAssetInfo.mType, | ||
5730 | data->mInventoryType, NOT_WEARABLE, next_owner_perm, | ||
5731 | LLPointer<LLInventoryCallback>(NULL)); | ||
5732 | } | ||
5733 | else | ||
5734 | { | ||
5735 | llwarns << "Can't find a folder to put it in" << llendl; | ||
5736 | } | ||
5737 | } | ||
5738 | } | ||
5739 | else // if(result >= 0) | ||
5740 | { | ||
5741 | LLStringBase<char>::format_map_t args; | ||
5742 | args["[FILE]"] = LLInventoryType::lookupHumanReadable(data->mInventoryType); | ||
5743 | args["[REASON]"] = LLString(LLAssetStorage::getErrorString(result)); | ||
5744 | gViewerWindow->alertXml("CannotUploadReason", args); | ||
5745 | } | ||
5746 | |||
5747 | LLUploadDialog::modalUploadFinished(); | ||
5748 | delete data; | ||
5749 | |||
5750 | // *NOTE: This is a pretty big hack. What this does is check the | ||
5751 | // file picker if there are any more pending uploads. If so, | ||
5752 | // upload that file. | ||
5753 | const char* next_file = LLFilePicker::instance().getNextFile(); | ||
5754 | if(is_balance_sufficient && next_file) | ||
5755 | { | ||
5756 | const char* name = LLFilePicker::instance().getDirname(); | ||
5757 | |||
5758 | LLString asset_name = name; | ||
5759 | LLString::replaceNonstandardASCII( asset_name, '?' ); | ||
5760 | LLString::replaceChar(asset_name, '|', '?'); | ||
5761 | LLString::stripNonprintable(asset_name); | ||
5762 | LLString::trim(asset_name); | ||
5763 | |||
5764 | char* asset_name_str = (char*)asset_name.c_str(); | ||
5765 | char* end_p = strrchr(asset_name_str, '.'); // strip extension if exists | ||
5766 | if( !end_p ) | ||
5767 | { | ||
5768 | end_p = asset_name_str + strlen( asset_name_str ); /* Flawfinder: ignore */ | ||
5769 | } | ||
5770 | |||
5771 | S32 len = llmin( (S32) (DB_INV_ITEM_NAME_STR_LEN), (S32) (end_p - asset_name_str) ); | ||
5772 | |||
5773 | asset_name = asset_name.substr( 0, len ); | ||
5774 | |||
5775 | upload_new_resource(next_file, asset_name, asset_name, // file | ||
5776 | 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE); | ||
5777 | } | ||
5778 | } | ||
5779 | 4871 | ||
5780 | LLUUID gExporterRequestID; | 4872 | LLUUID gExporterRequestID; |
5781 | LLString gExportDirectory; | 4873 | LLString gExportDirectory; |
@@ -7634,15 +6726,6 @@ BOOL enable_not_thirdperson(void*) | |||
7634 | return !gAgent.cameraThirdPerson(); | 6726 | return !gAgent.cameraThirdPerson(); |
7635 | } | 6727 | } |
7636 | 6728 | ||
7637 | class LLFileEnableUpload : public view_listener_t | ||
7638 | { | ||
7639 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
7640 | { | ||
7641 | bool new_value = gStatusBar && gGlobalEconomy && (gStatusBar->getBalance() >= gGlobalEconomy->getPriceUpload()); | ||
7642 | gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); | ||
7643 | return true; | ||
7644 | } | ||
7645 | }; | ||
7646 | 6729 | ||
7647 | BOOL enable_export_selected(void *) | 6730 | BOOL enable_export_selected(void *) |
7648 | { | 6731 | { |
@@ -7857,14 +6940,6 @@ void reload_vertex_shader(void *) | |||
7857 | //THIS WOULD BE AN AWESOME PLACE TO RELOAD SHADERS... just a thought - DaveP | 6940 | //THIS WOULD BE AN AWESOME PLACE TO RELOAD SHADERS... just a thought - DaveP |
7858 | } | 6941 | } |
7859 | 6942 | ||
7860 | void flush_animations(void *) | ||
7861 | { | ||
7862 | if (gAgent.getAvatarObject()) | ||
7863 | { | ||
7864 | gAgent.getAvatarObject()->resetAnimations(); | ||
7865 | } | ||
7866 | } | ||
7867 | |||
7868 | void slow_mo_animations(void*) | 6943 | void slow_mo_animations(void*) |
7869 | { | 6944 | { |
7870 | static BOOL slow_mo = FALSE; | 6945 | static BOOL slow_mo = FALSE; |
@@ -8450,24 +7525,10 @@ class LLToolsSelectTool : public view_listener_t | |||
8450 | } | 7525 | } |
8451 | }; | 7526 | }; |
8452 | 7527 | ||
8453 | void initialize_menu_actions() | 7528 | void initialize_menus() |
8454 | { | 7529 | { |
8455 | // File menu | 7530 | // File menu |
8456 | (new LLFileUploadImage())->registerListener(gMenuHolder, "File.UploadImage"); | 7531 | init_menu_file(); |
8457 | (new LLFileUploadSound())->registerListener(gMenuHolder, "File.UploadSound"); | ||
8458 | (new LLFileUploadAnim())->registerListener(gMenuHolder, "File.UploadAnim"); | ||
8459 | (new LLFileUploadBulk())->registerListener(gMenuHolder, "File.UploadBulk"); | ||
8460 | (new LLFileCloseWindow())->registerListener(gMenuHolder, "File.CloseWindow"); | ||
8461 | (new LLFileEnableCloseWindow())->registerListener(gMenuHolder, "File.EnableCloseWindow"); | ||
8462 | (new LLFileSaveTexture())->registerListener(gMenuHolder, "File.SaveTexture"); | ||
8463 | (new LLFileTakeSnapshot())->registerListener(gMenuHolder, "File.TakeSnapshot"); | ||
8464 | (new LLFileTakeSnapshotToDisk())->registerListener(gMenuHolder, "File.TakeSnapshotToDisk"); | ||
8465 | (new LLFileSaveMovie())->registerListener(gMenuHolder, "File.SaveMovie"); | ||
8466 | (new LLFileSetWindowSize())->registerListener(gMenuHolder, "File.SetWindowSize"); | ||
8467 | (new LLFileQuit())->registerListener(gMenuHolder, "File.Quit"); | ||
8468 | |||
8469 | (new LLFileEnableUpload())->registerListener(gMenuHolder, "File.EnableUpload"); | ||
8470 | (new LLFileEnableSaveAs())->registerListener(gMenuHolder, "File.EnableSaveAs"); | ||
8471 | 7532 | ||
8472 | // Edit menu | 7533 | // Edit menu |
8473 | (new LLEditUndo())->registerListener(gMenuHolder, "Edit.Undo"); | 7534 | (new LLEditUndo())->registerListener(gMenuHolder, "Edit.Undo"); |
diff --git a/linden/indra/newview/llviewermenu.h b/linden/indra/newview/llviewermenu.h index ac2a57a..c223a3a 100644 --- a/linden/indra/newview/llviewermenu.h +++ b/linden/indra/newview/llviewermenu.h | |||
@@ -29,8 +29,6 @@ | |||
29 | #ifndef LL_LLVIEWERMENU_H | 29 | #ifndef LL_LLVIEWERMENU_H |
30 | #define LL_LLVIEWERMENU_H | 30 | #define LL_LLVIEWERMENU_H |
31 | 31 | ||
32 | #include "llassetstorage.h" | ||
33 | #include "llinventory.h" | ||
34 | #include "llmenugl.h" | 32 | #include "llmenugl.h" |
35 | 33 | ||
36 | //newview includes | 34 | //newview includes |
@@ -41,14 +39,6 @@ class LLView; | |||
41 | class LLParcelSelection; | 39 | class LLParcelSelection; |
42 | class LLObjectSelection; | 40 | class LLObjectSelection; |
43 | 41 | ||
44 | struct LLResourceData | ||
45 | { | ||
46 | LLAssetInfo mAssetInfo; | ||
47 | LLAssetType::EType mPreferredLocation; | ||
48 | LLInventoryType::EType mInventoryType; | ||
49 | U32 mNextOwnerPerm; | ||
50 | void *mUserData; | ||
51 | }; | ||
52 | 42 | ||
53 | void pre_init_menus(); | 43 | void pre_init_menus(); |
54 | void init_menus(); | 44 | void init_menus(); |
@@ -114,25 +104,6 @@ bool handle_give_money_dialog(); | |||
114 | bool handle_object_open(); | 104 | bool handle_object_open(); |
115 | bool handle_go_to(); | 105 | bool handle_go_to(); |
116 | 106 | ||
117 | void upload_new_resource(const LLString& src_filename, std::string name, | ||
118 | std::string desc, S32 compression_info, | ||
119 | LLAssetType::EType destination_folder_type, | ||
120 | LLInventoryType::EType inv_type, | ||
121 | U32 next_owner_perm = PERM_NONE, | ||
122 | const LLString& display_name = LLString::null, | ||
123 | LLAssetStorage::LLStoreAssetCallback callback = NULL, | ||
124 | void *userdata = NULL); | ||
125 | |||
126 | void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType type, | ||
127 | std::string name, | ||
128 | std::string desc, S32 compression_info, | ||
129 | LLAssetType::EType destination_folder_type, | ||
130 | LLInventoryType::EType inv_type, | ||
131 | U32 next_owner_perm = PERM_NONE, | ||
132 | const LLString& display_name = LLString::null, | ||
133 | LLAssetStorage::LLStoreAssetCallback callback = NULL, | ||
134 | void *userdata = NULL); | ||
135 | |||
136 | // Export to XML or Collada | 107 | // Export to XML or Collada |
137 | void handle_export_selected( void * ); | 108 | void handle_export_selected( void * ); |
138 | 109 | ||
diff --git a/linden/indra/newview/llviewermenufile.cpp b/linden/indra/newview/llviewermenufile.cpp new file mode 100644 index 0000000..6954b1c --- /dev/null +++ b/linden/indra/newview/llviewermenufile.cpp | |||
@@ -0,0 +1,1022 @@ | |||
1 | /** | ||
2 | * @file llviewermenufile.cpp | ||
3 | * @brief "File" menu in the main menu bar. | ||
4 | * | ||
5 | * Copyright (c) 2002-2007, Linden Research, Inc. | ||
6 | * | ||
7 | * Second Life Viewer Source Code | ||
8 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
9 | * to you under the terms of the GNU General Public License, version 2.0 | ||
10 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
11 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
12 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
13 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
14 | * | ||
15 | * There are special exceptions to the terms and conditions of the GPL as | ||
16 | * it is applied to this Source Code. View the full text of the exception | ||
17 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
18 | * online at http://secondlife.com/developers/opensource/flossexception | ||
19 | * | ||
20 | * By copying, modifying or distributing this software, you acknowledge | ||
21 | * that you have read and understood your obligations described above, | ||
22 | * and agree to abide by those obligations. | ||
23 | * | ||
24 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
25 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
26 | * COMPLETENESS OR PERFORMANCE. | ||
27 | */ | ||
28 | |||
29 | #include "llviewerprecompiledheaders.h" | ||
30 | |||
31 | #include "llviewermenufile.h" | ||
32 | |||
33 | // project includes | ||
34 | #include "llagent.h" | ||
35 | #include "llfilepicker.h" | ||
36 | #include "llfloateranimpreview.h" | ||
37 | #include "llfloaterbuycurrency.h" | ||
38 | #include "llfloaterimagepreview.h" | ||
39 | #include "llfloaterimport.h" | ||
40 | #include "llfloaternamedesc.h" | ||
41 | #include "llfloatersnapshot.h" | ||
42 | #include "llinventorymodel.h" // gInventory | ||
43 | #include "llresourcedata.h" | ||
44 | #include "llstatusbar.h" | ||
45 | #include "llviewercontrol.h" // gSavedSettings | ||
46 | #include "llviewerimagelist.h" | ||
47 | #include "llvieweruictrlfactory.h" | ||
48 | #include "llviewermenu.h" // gMenuHolder | ||
49 | #include "llviewerregion.h" | ||
50 | #include "llviewerstats.h" | ||
51 | #include "llviewerwindow.h" | ||
52 | #include "viewer.h" // app_request_quit() | ||
53 | |||
54 | // linden libraries | ||
55 | #include "llassetuploadresponders.h" | ||
56 | #include "lleconomy.h" | ||
57 | #include "llhttpclient.h" | ||
58 | #include "llmemberlistener.h" | ||
59 | #include "llsdserialize.h" | ||
60 | #include "llstring.h" | ||
61 | #include "lltransactiontypes.h" | ||
62 | #include "lluuid.h" | ||
63 | #include "vorbisencode.h" | ||
64 | |||
65 | // system libraries | ||
66 | #include <boost/tokenizer.hpp> | ||
67 | |||
68 | typedef LLMemberListener<LLView> view_listener_t; | ||
69 | |||
70 | |||
71 | class LLFileEnableSaveAs : public view_listener_t | ||
72 | { | ||
73 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
74 | { | ||
75 | bool new_value = gFloaterView->getFrontmost() && gFloaterView->getFrontmost()->canSaveAs(); | ||
76 | gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); | ||
77 | return true; | ||
78 | } | ||
79 | }; | ||
80 | |||
81 | class LLFileEnableUpload : public view_listener_t | ||
82 | { | ||
83 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
84 | { | ||
85 | bool new_value = gStatusBar && gGlobalEconomy && (gStatusBar->getBalance() >= gGlobalEconomy->getPriceUpload()); | ||
86 | gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); | ||
87 | return true; | ||
88 | } | ||
89 | }; | ||
90 | |||
91 | /** | ||
92 | char* upload_pick(void* data) | ||
93 | |||
94 | If applicable, brings up a file chooser in which the user selects a file | ||
95 | to upload for a particular task. If the file is valid for the given action, | ||
96 | returns the string to the full path filename, else returns NULL. | ||
97 | Data is the load filter for the type of file as defined in LLFilePicker. | ||
98 | **/ | ||
99 | const char* upload_pick(void* data) | ||
100 | { | ||
101 | if( gAgent.cameraMouselook() ) | ||
102 | { | ||
103 | gAgent.changeCameraToDefault(); | ||
104 | // This doesn't seem necessary. JC | ||
105 | // display(); | ||
106 | } | ||
107 | |||
108 | LLFilePicker::ELoadFilter type; | ||
109 | if(data) | ||
110 | { | ||
111 | type = (LLFilePicker::ELoadFilter)((intptr_t)data); | ||
112 | } | ||
113 | else | ||
114 | { | ||
115 | type = LLFilePicker::FFLOAD_ALL; | ||
116 | } | ||
117 | |||
118 | LLFilePicker& picker = LLFilePicker::instance(); | ||
119 | if (!picker.getOpenFile(type)) | ||
120 | { | ||
121 | llinfos << "Couldn't import objects from file" << llendl; | ||
122 | return NULL; | ||
123 | } | ||
124 | |||
125 | const char* filename = picker.getFirstFile(); | ||
126 | const char* ext = strrchr(filename, '.'); | ||
127 | |||
128 | //strincmp doesn't like NULL pointers | ||
129 | if (ext == NULL) | ||
130 | { | ||
131 | const char* short_name = strrchr(filename, | ||
132 | *gDirUtilp->getDirDelimiter().c_str()); | ||
133 | |||
134 | // No extension | ||
135 | LLStringBase<char>::format_map_t args; | ||
136 | args["[FILE]"] = LLString(short_name + 1); | ||
137 | gViewerWindow->alertXml("NoFileExtension", args); | ||
138 | return NULL; | ||
139 | } | ||
140 | else | ||
141 | { | ||
142 | //so there is an extension | ||
143 | //loop over the valid extensions and compare to see | ||
144 | //if the extension is valid | ||
145 | |||
146 | //now grab the set of valid file extensions | ||
147 | const char* valids = build_extensions_string(type); | ||
148 | std::string valid_extensions = std::string(valids); | ||
149 | |||
150 | BOOL ext_valid = FALSE; | ||
151 | |||
152 | typedef boost::tokenizer<boost::char_separator<char> > tokenizer; | ||
153 | boost::char_separator<char> sep(" "); | ||
154 | tokenizer tokens(valid_extensions, sep); | ||
155 | tokenizer::iterator token_iter; | ||
156 | |||
157 | //now loop over all valid file extensions | ||
158 | //and compare them to the extension of the file | ||
159 | //to be uploaded | ||
160 | for( token_iter = tokens.begin(); | ||
161 | token_iter != tokens.end() && ext_valid != TRUE; | ||
162 | ++token_iter) | ||
163 | { | ||
164 | const char* cur_token = token_iter->c_str(); | ||
165 | |||
166 | if (0 == strnicmp(cur_token, ext, strlen(cur_token)) || /* Flawfinder: ignore */ | ||
167 | 0 == strnicmp(cur_token, "*.*", strlen(cur_token))) /* Flawfinder: ignore */ | ||
168 | { | ||
169 | //valid extension | ||
170 | //or the acceptable extension is any | ||
171 | ext_valid = TRUE; | ||
172 | } | ||
173 | }//end for (loop over all tokens) | ||
174 | |||
175 | if (ext_valid == FALSE) | ||
176 | { | ||
177 | //should only get here if the extension exists | ||
178 | //but is invalid | ||
179 | LLStringBase<char>::format_map_t args; | ||
180 | args["[EXTENSION]"] = ext; | ||
181 | args["[VALIDS]"] = valids; | ||
182 | gViewerWindow->alertXml("InvalidFileExtension", args); | ||
183 | return NULL; | ||
184 | } | ||
185 | }//end else (non-null extension) | ||
186 | |||
187 | //valid file extension | ||
188 | |||
189 | //now we check to see | ||
190 | //if the file is actually a valid image/sound/etc. | ||
191 | if (type == LLFilePicker::FFLOAD_WAV) | ||
192 | { | ||
193 | // pre-qualify wavs to make sure the format is acceptable | ||
194 | char error_msg[MAX_STRING]; /* Flawfinder: ignore */ | ||
195 | if (check_for_invalid_wav_formats(filename,error_msg)) | ||
196 | { | ||
197 | llinfos << error_msg << ": " << filename << llendl; | ||
198 | LLStringBase<char>::format_map_t args; | ||
199 | args["[FILE]"] = filename; | ||
200 | gViewerWindow->alertXml( error_msg, args ); | ||
201 | return NULL; | ||
202 | } | ||
203 | }//end if a wave/sound file | ||
204 | |||
205 | |||
206 | return filename; | ||
207 | } | ||
208 | |||
209 | void handle_upload_object(void* data) | ||
210 | { | ||
211 | const char* filename = upload_pick(data); | ||
212 | if (filename) | ||
213 | { | ||
214 | // start the import | ||
215 | LLFloaterImport* floaterp = new LLFloaterImport(filename); | ||
216 | gUICtrlFactory->buildFloater(floaterp, "floater_import.xml"); | ||
217 | } | ||
218 | } | ||
219 | |||
220 | class LLFileUploadImage : public view_listener_t | ||
221 | { | ||
222 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
223 | { | ||
224 | const char* filename = upload_pick((void *)(S32)LLFilePicker::FFLOAD_IMAGE); | ||
225 | if (filename) | ||
226 | { | ||
227 | LLFloaterImagePreview* floaterp = new LLFloaterImagePreview(filename); | ||
228 | gUICtrlFactory->buildFloater(floaterp, "floater_image_preview.xml"); | ||
229 | } | ||
230 | return TRUE; | ||
231 | } | ||
232 | }; | ||
233 | |||
234 | class LLFileUploadSound : public view_listener_t | ||
235 | { | ||
236 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
237 | { | ||
238 | const char* filename = upload_pick((void*)((S32)LLFilePicker::FFLOAD_WAV)); | ||
239 | if (filename) | ||
240 | { | ||
241 | LLFloaterNameDesc* floaterp = new LLFloaterNameDesc(filename); | ||
242 | gUICtrlFactory->buildFloater(floaterp, "floater_sound_preview.xml"); | ||
243 | } | ||
244 | return true; | ||
245 | } | ||
246 | }; | ||
247 | |||
248 | class LLFileUploadAnim : public view_listener_t | ||
249 | { | ||
250 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
251 | { | ||
252 | const char* filename = upload_pick((void*)((S32)LLFilePicker::FFLOAD_ANIM)); | ||
253 | if (filename) | ||
254 | { | ||
255 | LLFloaterAnimPreview* floaterp = new LLFloaterAnimPreview(filename); | ||
256 | gUICtrlFactory->buildFloater(floaterp, "floater_animation_preview.xml"); | ||
257 | } | ||
258 | return true; | ||
259 | } | ||
260 | }; | ||
261 | |||
262 | class LLFileUploadBulk : public view_listener_t | ||
263 | { | ||
264 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
265 | { | ||
266 | if( gAgent.cameraMouselook() ) | ||
267 | { | ||
268 | gAgent.changeCameraToDefault(); | ||
269 | } | ||
270 | |||
271 | // TODO: | ||
272 | // Iterate over all files | ||
273 | // Check extensions for uploadability, cost | ||
274 | // Check user balance for entire cost | ||
275 | // Charge user entire cost | ||
276 | // Loop, uploading | ||
277 | // If an upload fails, refund the user for that one | ||
278 | // | ||
279 | // Also fix single upload to charge first, then refund | ||
280 | |||
281 | LLFilePicker& picker = LLFilePicker::instance(); | ||
282 | if (picker.getMultipleOpenFiles()) | ||
283 | { | ||
284 | const char* filename = picker.getFirstFile(); | ||
285 | const char* name = picker.getDirname(); | ||
286 | |||
287 | LLString asset_name = name; | ||
288 | LLString::replaceNonstandardASCII( asset_name, '?' ); | ||
289 | LLString::replaceChar(asset_name, '|', '?'); | ||
290 | LLString::stripNonprintable(asset_name); | ||
291 | LLString::trim(asset_name); | ||
292 | |||
293 | char* asset_name_str = (char*)asset_name.c_str(); | ||
294 | char* end_p = strrchr(asset_name_str, '.'); // strip extension if exists | ||
295 | if( !end_p ) | ||
296 | { | ||
297 | end_p = asset_name_str + strlen( asset_name_str ); /* Flawfinder: ignore */ | ||
298 | } | ||
299 | |||
300 | S32 len = llmin( (S32) (DB_INV_ITEM_NAME_STR_LEN), (S32) (end_p - asset_name_str) ); | ||
301 | |||
302 | asset_name = asset_name.substr( 0, len ); | ||
303 | |||
304 | upload_new_resource(filename, asset_name, asset_name, 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE); // file | ||
305 | } | ||
306 | else | ||
307 | { | ||
308 | llinfos << "Couldn't import objects from file" << llendl; | ||
309 | } | ||
310 | return true; | ||
311 | } | ||
312 | }; | ||
313 | |||
314 | void upload_error(const char* error_message, const char* label, const std::string filename, const LLStringBase<char>::format_map_t args) | ||
315 | { | ||
316 | llwarns << error_message << llendl; | ||
317 | gViewerWindow->alertXml(label, args); | ||
318 | if(remove(filename.c_str()) == -1) | ||
319 | { | ||
320 | lldebugs << "unable to remove temp file" << llendl; | ||
321 | } | ||
322 | LLFilePicker::instance().reset(); | ||
323 | } | ||
324 | |||
325 | class LLFileEnableCloseWindow : public view_listener_t | ||
326 | { | ||
327 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
328 | { | ||
329 | bool new_value = gFloaterView->getFocusedFloater() != NULL || gSnapshotFloaterView->getFocusedFloater() != NULL; | ||
330 | // horrendously opaque, this code | ||
331 | gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); | ||
332 | return true; | ||
333 | } | ||
334 | }; | ||
335 | |||
336 | class LLFileCloseWindow : public view_listener_t | ||
337 | { | ||
338 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
339 | { | ||
340 | LLFloater::closeFocusedFloater(); | ||
341 | |||
342 | return true; | ||
343 | } | ||
344 | }; | ||
345 | |||
346 | class LLFileCloseAllWindows : public view_listener_t | ||
347 | { | ||
348 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
349 | { | ||
350 | bool app_quitting = false; | ||
351 | gFloaterView->closeAllChildren(app_quitting); | ||
352 | |||
353 | return true; | ||
354 | } | ||
355 | }; | ||
356 | |||
357 | class LLFileSaveTexture : public view_listener_t | ||
358 | { | ||
359 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
360 | { | ||
361 | LLFloater* top = gFloaterView->getFrontmost(); | ||
362 | if (top) | ||
363 | { | ||
364 | top->saveAs(); | ||
365 | } | ||
366 | return true; | ||
367 | } | ||
368 | }; | ||
369 | |||
370 | class LLFileTakeSnapshot : public view_listener_t | ||
371 | { | ||
372 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
373 | { | ||
374 | LLFloaterSnapshot::show(NULL); | ||
375 | return true; | ||
376 | } | ||
377 | }; | ||
378 | |||
379 | class LLFileTakeSnapshotToDisk : public view_listener_t | ||
380 | { | ||
381 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
382 | { | ||
383 | LLPointer<LLImageRaw> raw = new LLImageRaw; | ||
384 | |||
385 | S32 width = gViewerWindow->getWindowDisplayWidth(); | ||
386 | S32 height = gViewerWindow->getWindowDisplayHeight(); | ||
387 | |||
388 | if (gSavedSettings.getBOOL("HighResSnapshot")) | ||
389 | { | ||
390 | width *= 2; | ||
391 | height *= 2; | ||
392 | } | ||
393 | |||
394 | if (gViewerWindow->rawSnapshot(raw, | ||
395 | width, | ||
396 | height, | ||
397 | TRUE, | ||
398 | gSavedSettings.getBOOL("RenderUIInSnapshot"), | ||
399 | FALSE)) | ||
400 | { | ||
401 | if (!gQuietSnapshot) | ||
402 | { | ||
403 | gViewerWindow->playSnapshotAnimAndSound(); | ||
404 | } | ||
405 | LLImageBase::setSizeOverride(TRUE); | ||
406 | gViewerWindow->saveImageNumbered(raw); | ||
407 | LLImageBase::setSizeOverride(FALSE); | ||
408 | } | ||
409 | return true; | ||
410 | } | ||
411 | }; | ||
412 | |||
413 | class LLFileSaveMovie : public view_listener_t | ||
414 | { | ||
415 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
416 | { | ||
417 | LLViewerWindow::saveMovieNumbered(NULL); | ||
418 | return true; | ||
419 | } | ||
420 | }; | ||
421 | |||
422 | class LLFileSetWindowSize : public view_listener_t | ||
423 | { | ||
424 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
425 | { | ||
426 | LLString size = userdata.asString(); | ||
427 | S32 width, height; | ||
428 | sscanf(size.c_str(), "%d,%d", &width, &height); | ||
429 | LLViewerWindow::movieSize(width, height); | ||
430 | return true; | ||
431 | } | ||
432 | }; | ||
433 | |||
434 | class LLFileQuit : public view_listener_t | ||
435 | { | ||
436 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
437 | { | ||
438 | app_request_quit(); | ||
439 | return true; | ||
440 | } | ||
441 | }; | ||
442 | |||
443 | void handle_upload(void* data) | ||
444 | { | ||
445 | const char* filename = upload_pick(data); | ||
446 | if (filename) | ||
447 | { | ||
448 | LLFloaterNameDesc* floaterp = new LLFloaterNameDesc(filename); | ||
449 | gUICtrlFactory->buildFloater(floaterp, "floater_name_description.xml"); | ||
450 | } | ||
451 | } | ||
452 | |||
453 | void handle_compress_image(void*) | ||
454 | { | ||
455 | LLFilePicker& picker = LLFilePicker::instance(); | ||
456 | if (picker.getOpenFile(LLFilePicker::FFLOAD_IMAGE)) | ||
457 | { | ||
458 | std::string infile(picker.getFirstFile()); | ||
459 | std::string outfile = infile + ".j2c"; | ||
460 | |||
461 | llinfos << "Input: " << infile << llendl; | ||
462 | llinfos << "Output: " << outfile << llendl; | ||
463 | |||
464 | BOOL success; | ||
465 | |||
466 | success = LLViewerImageList::createUploadFile(infile, outfile, IMG_CODEC_TGA); | ||
467 | |||
468 | if (success) | ||
469 | { | ||
470 | llinfos << "Compression complete" << llendl; | ||
471 | } | ||
472 | else | ||
473 | { | ||
474 | llinfos << "Compression failed: " << LLImageBase::getLastError() << llendl; | ||
475 | } | ||
476 | } | ||
477 | } | ||
478 | |||
479 | void upload_new_resource(const LLString& src_filename, std::string name, | ||
480 | std::string desc, S32 compression_info, | ||
481 | LLAssetType::EType destination_folder_type, | ||
482 | LLInventoryType::EType inv_type, | ||
483 | U32 next_owner_perm, | ||
484 | const LLString& display_name, | ||
485 | LLAssetStorage::LLStoreAssetCallback callback, | ||
486 | void *userdata) | ||
487 | { | ||
488 | // Generate the temporary UUID. | ||
489 | LLString filename = gDirUtilp->getTempFilename(); | ||
490 | LLTransactionID tid; | ||
491 | LLAssetID uuid; | ||
492 | |||
493 | LLStringBase<char>::format_map_t args; | ||
494 | |||
495 | LLString ext = src_filename.substr(src_filename.find_last_of('.')); | ||
496 | LLAssetType::EType asset_type = LLAssetType::AT_NONE; | ||
497 | char error_message[MAX_STRING]; /* Flawfinder: ignore */ | ||
498 | error_message[0] = '\0'; | ||
499 | LLString temp_str; | ||
500 | |||
501 | BOOL error = FALSE; | ||
502 | |||
503 | if (ext.empty()) | ||
504 | { | ||
505 | LLString::size_type offset = filename.find_last_of(gDirUtilp->getDirDelimiter()); | ||
506 | if (offset != LLString::npos) | ||
507 | offset++; | ||
508 | LLString short_name = filename.substr(offset); | ||
509 | |||
510 | // No extension | ||
511 | snprintf(error_message, /* Flawfinder: ignore */ | ||
512 | MAX_STRING, | ||
513 | "No file extension for the file: '%s'\nPlease make sure the file has a correct file extension", | ||
514 | short_name.c_str()); | ||
515 | args["[FILE]"] = short_name; | ||
516 | upload_error(error_message, "NofileExtension", filename, args); | ||
517 | return; | ||
518 | } | ||
519 | else if( LLString::compareInsensitive(ext.c_str(),".bmp") == 0 ) | ||
520 | { | ||
521 | asset_type = LLAssetType::AT_TEXTURE; | ||
522 | if (!LLViewerImageList::createUploadFile(src_filename, | ||
523 | filename, | ||
524 | IMG_CODEC_BMP )) | ||
525 | { | ||
526 | snprintf(error_message, MAX_STRING, "Problem with file %s:\n\n%s\n", /* Flawfinder: ignore */ | ||
527 | src_filename.c_str(), LLImageBase::getLastError().c_str()); | ||
528 | args["[FILE]"] = src_filename; | ||
529 | args["[ERROR]"] = LLImageBase::getLastError(); | ||
530 | upload_error(error_message, "ProblemWithFile", filename, args); | ||
531 | return; | ||
532 | } | ||
533 | } | ||
534 | else if( LLString::compareInsensitive(ext.c_str(),".tga") == 0 ) | ||
535 | { | ||
536 | asset_type = LLAssetType::AT_TEXTURE; | ||
537 | if (!LLViewerImageList::createUploadFile(src_filename, | ||
538 | filename, | ||
539 | IMG_CODEC_TGA )) | ||
540 | { | ||
541 | snprintf(error_message, MAX_STRING, "Problem with file %s:\n\n%s\n", /* Flawfinder: ignore */ | ||
542 | src_filename.c_str(), LLImageBase::getLastError().c_str()); | ||
543 | args["[FILE]"] = src_filename; | ||
544 | args["[ERROR]"] = LLImageBase::getLastError(); | ||
545 | upload_error(error_message, "ProblemWithFile", filename, args); | ||
546 | return; | ||
547 | } | ||
548 | } | ||
549 | else if( LLString::compareInsensitive(ext.c_str(),".jpg") == 0 || LLString::compareInsensitive(ext.c_str(),".jpeg") == 0) | ||
550 | { | ||
551 | asset_type = LLAssetType::AT_TEXTURE; | ||
552 | if (!LLViewerImageList::createUploadFile(src_filename, | ||
553 | filename, | ||
554 | IMG_CODEC_JPEG )) | ||
555 | { | ||
556 | snprintf(error_message, MAX_STRING, "Problem with file %s:\n\n%s\n", /* Flawfinder: ignore */ | ||
557 | src_filename.c_str(), LLImageBase::getLastError().c_str()); | ||
558 | args["[FILE]"] = src_filename; | ||
559 | args["[ERROR]"] = LLImageBase::getLastError(); | ||
560 | upload_error(error_message, "ProblemWithFile", filename, args); | ||
561 | return; | ||
562 | } | ||
563 | } | ||
564 | else if(LLString::compareInsensitive(ext.c_str(),".wav") == 0) | ||
565 | { | ||
566 | asset_type = LLAssetType::AT_SOUND; // tag it as audio | ||
567 | S32 encode_result = 0; | ||
568 | |||
569 | S32 bitrate = 128; | ||
570 | |||
571 | if (compression_info) | ||
572 | { | ||
573 | bitrate = compression_info; | ||
574 | } | ||
575 | llinfos << "Attempting to encode wav as an ogg file at " << bitrate << "kbps" << llendl; | ||
576 | |||
577 | encode_result = encode_vorbis_file_at(src_filename.c_str(), filename.c_str(), bitrate*1000); | ||
578 | |||
579 | if (LLVORBISENC_NOERR != encode_result) | ||
580 | { | ||
581 | switch(encode_result) | ||
582 | { | ||
583 | case LLVORBISENC_DEST_OPEN_ERR: | ||
584 | snprintf(error_message, MAX_STRING, "Couldn't open temporary compressed sound file for writing: %s\n", filename.c_str()); /* Flawfinder: ignore */ | ||
585 | args["[FILE]"] = filename; | ||
586 | upload_error(error_message, "CannotOpenTemporarySoundFile", filename, args); | ||
587 | break; | ||
588 | |||
589 | default: | ||
590 | snprintf(error_message, MAX_STRING, "Unknown vorbis encode failure on: %s\n", src_filename.c_str()); /* Flawfinder: ignore */ | ||
591 | args["[FILE]"] = src_filename; | ||
592 | upload_error(error_message, "UnknownVorbisEncodeFailure", filename, args); | ||
593 | break; | ||
594 | } | ||
595 | return; | ||
596 | } | ||
597 | } | ||
598 | else if(LLString::compareInsensitive(ext.c_str(),".tmp") == 0) | ||
599 | { | ||
600 | // This is a generic .lin resource file | ||
601 | asset_type = LLAssetType::AT_OBJECT; | ||
602 | FILE* in = LLFile::fopen(src_filename.c_str(), "rb"); /* Flawfinder: ignore */ | ||
603 | if (in) | ||
604 | { | ||
605 | // read in the file header | ||
606 | char buf[16384]; /* Flawfinder: ignore */ | ||
607 | S32 read; /* Flawfinder: ignore */ | ||
608 | S32 version; | ||
609 | if (fscanf(in, "LindenResource\nversion %d\n", &version)) | ||
610 | { | ||
611 | if (2 == version) | ||
612 | { | ||
613 | // *NOTE: This buffer size is hard coded into scanf() below. | ||
614 | char label[MAX_STRING]; /* Flawfinder: ignore */ | ||
615 | char value[MAX_STRING]; /* Flawfinder: ignore */ | ||
616 | S32 tokens_read; | ||
617 | while (fgets(buf, 1024, in)) | ||
618 | { | ||
619 | label[0] = '\0'; | ||
620 | value[0] = '\0'; | ||
621 | tokens_read = sscanf( /* Flawfinder: ignore */ | ||
622 | buf, | ||
623 | "%254s %254s\n", | ||
624 | label, value); | ||
625 | |||
626 | llinfos << "got: " << label << " = " << value | ||
627 | << llendl; | ||
628 | |||
629 | if (EOF == tokens_read) | ||
630 | { | ||
631 | fclose(in); | ||
632 | snprintf(error_message, MAX_STRING, "corrupt resource file: %s", src_filename.c_str()); /* Flawfinder: ignore */ | ||
633 | args["[FILE]"] = src_filename; | ||
634 | upload_error(error_message, "CorruptResourceFile", filename, args); | ||
635 | return; | ||
636 | } | ||
637 | |||
638 | if (2 == tokens_read) | ||
639 | { | ||
640 | if (! strcmp("type", label)) | ||
641 | { | ||
642 | asset_type = (LLAssetType::EType)(atoi(value)); | ||
643 | } | ||
644 | } | ||
645 | else | ||
646 | { | ||
647 | if (! strcmp("_DATA_", label)) | ||
648 | { | ||
649 | // below is the data section | ||
650 | break; | ||
651 | } | ||
652 | } | ||
653 | // other values are currently discarded | ||
654 | } | ||
655 | |||
656 | } | ||
657 | else | ||
658 | { | ||
659 | fclose(in); | ||
660 | snprintf(error_message, MAX_STRING, "unknown linden resource file version in file: %s", src_filename.c_str()); /* Flawfinder: ignore */ | ||
661 | args["[FILE]"] = src_filename; | ||
662 | upload_error(error_message, "UnknownResourceFileVersion", filename, args); | ||
663 | return; | ||
664 | } | ||
665 | } | ||
666 | else | ||
667 | { | ||
668 | // this is an original binary formatted .lin file | ||
669 | // start over at the beginning of the file | ||
670 | fseek(in, 0, SEEK_SET); | ||
671 | |||
672 | const S32 MAX_ASSET_DESCRIPTION_LENGTH = 256; | ||
673 | const S32 MAX_ASSET_NAME_LENGTH = 64; | ||
674 | S32 header_size = 34 + MAX_ASSET_DESCRIPTION_LENGTH + MAX_ASSET_NAME_LENGTH; | ||
675 | S16 type_num; | ||
676 | |||
677 | // read in and throw out most of the header except for the type | ||
678 | fread(buf, header_size, 1, in); | ||
679 | memcpy(&type_num, buf + 16, sizeof(S16)); /* Flawfinder: ignore */ | ||
680 | asset_type = (LLAssetType::EType)type_num; | ||
681 | } | ||
682 | |||
683 | // copy the file's data segment into another file for uploading | ||
684 | FILE* out = LLFile::fopen(filename.c_str(), "wb"); /* Flawfinder: ignore */ | ||
685 | if (out) | ||
686 | { | ||
687 | while((read = fread(buf, 1, 16384, in))) /* Flawfinder: ignore */ | ||
688 | { | ||
689 | fwrite(buf, 1, read, out); /* Flawfinder: ignore */ | ||
690 | } | ||
691 | fclose(out); | ||
692 | } | ||
693 | else | ||
694 | { | ||
695 | fclose(in); | ||
696 | snprintf(error_message, MAX_STRING, "Unable to create output file: %s", filename.c_str()); /* Flawfinder: ignore */ | ||
697 | args["[FILE]"] = filename; | ||
698 | upload_error(error_message, "UnableToCreateOutputFile", filename, args); | ||
699 | return; | ||
700 | } | ||
701 | |||
702 | fclose(in); | ||
703 | } | ||
704 | else | ||
705 | { | ||
706 | llinfos << "Couldn't open .lin file " << src_filename << llendl; | ||
707 | } | ||
708 | } | ||
709 | else if (LLString::compareInsensitive(ext.c_str(),".bvh") == 0) | ||
710 | { | ||
711 | snprintf(error_message, MAX_STRING, "We do not currently support bulk upload of animation files\n"); /* Flawfinder: ignore */ | ||
712 | upload_error(error_message, "DoNotSupportBulkAnimationUpload", filename, args); | ||
713 | return; | ||
714 | } | ||
715 | else | ||
716 | { | ||
717 | // Unknown extension | ||
718 | snprintf(error_message, MAX_STRING, "Unknown file extension %s\nExpected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh", ext.c_str()); /* Flawfinder: ignore */ | ||
719 | error = TRUE;; | ||
720 | } | ||
721 | |||
722 | // gen a new transaction ID for this asset | ||
723 | tid.generate(); | ||
724 | |||
725 | if (!error) | ||
726 | { | ||
727 | uuid = tid.makeAssetID(gAgent.getSecureSessionID()); | ||
728 | // copy this file into the vfs for upload | ||
729 | S32 file_size; | ||
730 | apr_file_t* fp = ll_apr_file_open(filename, LL_APR_RB, &file_size); | ||
731 | if (fp) | ||
732 | { | ||
733 | LLVFile file(gVFS, uuid, asset_type, LLVFile::WRITE); | ||
734 | |||
735 | file.setMaxSize(file_size); | ||
736 | |||
737 | const S32 buf_size = 65536; | ||
738 | U8 copy_buf[buf_size]; | ||
739 | while ((file_size = ll_apr_file_read(fp, copy_buf, buf_size))) | ||
740 | { | ||
741 | file.write(copy_buf, file_size); | ||
742 | } | ||
743 | apr_file_close(fp); | ||
744 | } | ||
745 | else | ||
746 | { | ||
747 | snprintf(error_message, MAX_STRING, "Unable to access output file: %s", filename.c_str()); /* Flawfinder: ignore */ | ||
748 | error = TRUE; | ||
749 | } | ||
750 | } | ||
751 | |||
752 | if (!error) | ||
753 | { | ||
754 | LLString t_disp_name = display_name; | ||
755 | if (t_disp_name.empty()) | ||
756 | { | ||
757 | t_disp_name = src_filename; | ||
758 | } | ||
759 | upload_new_resource(tid, asset_type, name, desc, compression_info, // tid | ||
760 | destination_folder_type, inv_type, next_owner_perm, | ||
761 | display_name, callback, userdata); | ||
762 | } | ||
763 | else | ||
764 | { | ||
765 | llwarns << error_message << llendl; | ||
766 | LLStringBase<char>::format_map_t args; | ||
767 | args["[ERROR_MESSAGE]"] = error_message; | ||
768 | gViewerWindow->alertXml("ErrorMessage", args); | ||
769 | if(LLFile::remove(filename.c_str()) == -1) | ||
770 | { | ||
771 | lldebugs << "unable to remove temp file" << llendl; | ||
772 | } | ||
773 | LLFilePicker::instance().reset(); | ||
774 | } | ||
775 | } | ||
776 | |||
777 | void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result) // StoreAssetData callback (fixed) | ||
778 | { | ||
779 | LLResourceData* data = (LLResourceData*)user_data; | ||
780 | //LLAssetType::EType pref_loc = data->mPreferredLocation; | ||
781 | BOOL is_balance_sufficient = TRUE; | ||
782 | if(result >= 0) | ||
783 | { | ||
784 | LLAssetType::EType dest_loc = (data->mPreferredLocation == LLAssetType::AT_NONE) ? data->mAssetInfo.mType : data->mPreferredLocation; | ||
785 | |||
786 | if (LLAssetType::AT_SOUND == data->mAssetInfo.mType || | ||
787 | LLAssetType::AT_TEXTURE == data->mAssetInfo.mType || | ||
788 | LLAssetType::AT_ANIMATION == data->mAssetInfo.mType) | ||
789 | { | ||
790 | // Charge the user for the upload. | ||
791 | LLViewerRegion* region = gAgent.getRegion(); | ||
792 | S32 upload_cost = gGlobalEconomy->getPriceUpload(); | ||
793 | |||
794 | if(!(can_afford_transaction(upload_cost))) | ||
795 | { | ||
796 | LLFloaterBuyCurrency::buyCurrency( | ||
797 | llformat("Uploading %s costs", | ||
798 | data->mAssetInfo.getName().c_str()), | ||
799 | upload_cost); | ||
800 | is_balance_sufficient = FALSE; | ||
801 | } | ||
802 | else if(region) | ||
803 | { | ||
804 | // Charge user for upload | ||
805 | gStatusBar->debitBalance(upload_cost); | ||
806 | |||
807 | LLMessageSystem* msg = gMessageSystem; | ||
808 | msg->newMessageFast(_PREHASH_MoneyTransferRequest); | ||
809 | msg->nextBlockFast(_PREHASH_AgentData); | ||
810 | msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); | ||
811 | msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); | ||
812 | msg->nextBlockFast(_PREHASH_MoneyData); | ||
813 | msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID()); | ||
814 | msg->addUUIDFast(_PREHASH_DestID, LLUUID::null); | ||
815 | msg->addU8("Flags", 0); | ||
816 | msg->addS32Fast(_PREHASH_Amount, upload_cost); | ||
817 | msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY); | ||
818 | msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY); | ||
819 | msg->addS32Fast(_PREHASH_TransactionType, TRANS_UPLOAD_CHARGE); | ||
820 | msg->addStringFast(_PREHASH_Description, NULL); | ||
821 | msg->sendReliable(region->getHost()); | ||
822 | } | ||
823 | } | ||
824 | |||
825 | if(is_balance_sufficient) | ||
826 | { | ||
827 | // Actually add the upload to inventory | ||
828 | llinfos << "Adding " << uuid << " to inventory." << llendl; | ||
829 | LLUUID folder_id(gInventory.findCategoryUUIDForType(dest_loc)); | ||
830 | if(folder_id.notNull()) | ||
831 | { | ||
832 | U32 next_owner_perm = data->mNextOwnerPerm; | ||
833 | if(PERM_NONE == next_owner_perm) | ||
834 | { | ||
835 | next_owner_perm = PERM_MOVE | PERM_TRANSFER; | ||
836 | } | ||
837 | create_inventory_item(gAgent.getID(), gAgent.getSessionID(), | ||
838 | folder_id, data->mAssetInfo.mTransactionID, data->mAssetInfo.getName(), | ||
839 | data->mAssetInfo.getDescription(), data->mAssetInfo.mType, | ||
840 | data->mInventoryType, NOT_WEARABLE, next_owner_perm, | ||
841 | LLPointer<LLInventoryCallback>(NULL)); | ||
842 | } | ||
843 | else | ||
844 | { | ||
845 | llwarns << "Can't find a folder to put it in" << llendl; | ||
846 | } | ||
847 | } | ||
848 | } | ||
849 | else // if(result >= 0) | ||
850 | { | ||
851 | LLStringBase<char>::format_map_t args; | ||
852 | args["[FILE]"] = LLInventoryType::lookupHumanReadable(data->mInventoryType); | ||
853 | args["[REASON]"] = LLString(LLAssetStorage::getErrorString(result)); | ||
854 | gViewerWindow->alertXml("CannotUploadReason", args); | ||
855 | } | ||
856 | |||
857 | LLUploadDialog::modalUploadFinished(); | ||
858 | delete data; | ||
859 | |||
860 | // *NOTE: This is a pretty big hack. What this does is check the | ||
861 | // file picker if there are any more pending uploads. If so, | ||
862 | // upload that file. | ||
863 | const char* next_file = LLFilePicker::instance().getNextFile(); | ||
864 | if(is_balance_sufficient && next_file) | ||
865 | { | ||
866 | const char* name = LLFilePicker::instance().getDirname(); | ||
867 | |||
868 | LLString asset_name = name; | ||
869 | LLString::replaceNonstandardASCII( asset_name, '?' ); | ||
870 | LLString::replaceChar(asset_name, '|', '?'); | ||
871 | LLString::stripNonprintable(asset_name); | ||
872 | LLString::trim(asset_name); | ||
873 | |||
874 | char* asset_name_str = (char*)asset_name.c_str(); | ||
875 | char* end_p = strrchr(asset_name_str, '.'); // strip extension if exists | ||
876 | if( !end_p ) | ||
877 | { | ||
878 | end_p = asset_name_str + strlen( asset_name_str ); /* Flawfinder: ignore */ | ||
879 | } | ||
880 | |||
881 | S32 len = llmin( (S32) (DB_INV_ITEM_NAME_STR_LEN), (S32) (end_p - asset_name_str) ); | ||
882 | |||
883 | asset_name = asset_name.substr( 0, len ); | ||
884 | |||
885 | upload_new_resource(next_file, asset_name, asset_name, // file | ||
886 | 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE); | ||
887 | } | ||
888 | } | ||
889 | |||
890 | void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_type, | ||
891 | std::string name, | ||
892 | std::string desc, S32 compression_info, | ||
893 | LLAssetType::EType destination_folder_type, | ||
894 | LLInventoryType::EType inv_type, | ||
895 | U32 next_owner_perm, | ||
896 | const LLString& display_name, | ||
897 | LLAssetStorage::LLStoreAssetCallback callback, | ||
898 | void *userdata) | ||
899 | { | ||
900 | LLAssetID uuid = tid.makeAssetID(gAgent.getSecureSessionID()); | ||
901 | |||
902 | if( LLAssetType::AT_SOUND == asset_type ) | ||
903 | { | ||
904 | gViewerStats->incStat(LLViewerStats::ST_UPLOAD_SOUND_COUNT ); | ||
905 | } | ||
906 | else | ||
907 | if( LLAssetType::AT_TEXTURE == asset_type ) | ||
908 | { | ||
909 | gViewerStats->incStat(LLViewerStats::ST_UPLOAD_TEXTURE_COUNT ); | ||
910 | } | ||
911 | else | ||
912 | if( LLAssetType::AT_ANIMATION == asset_type) | ||
913 | { | ||
914 | gViewerStats->incStat(LLViewerStats::ST_UPLOAD_ANIM_COUNT ); | ||
915 | } | ||
916 | |||
917 | if(LLInventoryType::IT_NONE == inv_type) | ||
918 | { | ||
919 | inv_type = LLInventoryType::defaultForAssetType(asset_type); | ||
920 | } | ||
921 | LLString::stripNonprintable(name); | ||
922 | LLString::stripNonprintable(desc); | ||
923 | if(name.empty()) | ||
924 | { | ||
925 | name = "(No Name)"; | ||
926 | } | ||
927 | if(desc.empty()) | ||
928 | { | ||
929 | desc = "(No Description)"; | ||
930 | } | ||
931 | |||
932 | // At this point, we're ready for the upload. | ||
933 | LLString upload_message = "Uploading...\n\n"; | ||
934 | upload_message.append(display_name); | ||
935 | LLUploadDialog::modalUploadDialog(upload_message); | ||
936 | |||
937 | llinfos << "*** Uploading: " << llendl; | ||
938 | llinfos << "Type: " << LLAssetType::lookup(asset_type) << llendl; | ||
939 | llinfos << "UUID: " << uuid << llendl; | ||
940 | llinfos << "Name: " << name << llendl; | ||
941 | llinfos << "Desc: " << desc << llendl; | ||
942 | lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLAssetType::AT_NONE) ? asset_type : destination_folder_type) << llendl; | ||
943 | lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl; | ||
944 | std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory"); | ||
945 | if (!url.empty()) | ||
946 | { | ||
947 | llinfos << "New Agent Inventory via capability" << llendl; | ||
948 | LLSD body; | ||
949 | body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLAssetType::AT_NONE) ? asset_type : destination_folder_type); | ||
950 | body["asset_type"] = LLAssetType::lookup(asset_type); | ||
951 | body["inventory_type"] = LLInventoryType::lookup(inv_type); | ||
952 | body["name"] = name; | ||
953 | body["description"] = desc; | ||
954 | |||
955 | std::ostringstream llsdxml; | ||
956 | LLSDSerialize::toXML(body, llsdxml); | ||
957 | lldebugs << "posting body to capability: " << llsdxml.str() << llendl; | ||
958 | LLHTTPClient::post(url, body, new LLNewAgentInventoryResponder(body, uuid, asset_type)); | ||
959 | } | ||
960 | else | ||
961 | { | ||
962 | llinfos << "NewAgentInventory capability not found, new agent inventory via asset system." << llendl; | ||
963 | // check for adequate funds | ||
964 | // TODO: do this check on the sim | ||
965 | if (LLAssetType::AT_SOUND == asset_type || | ||
966 | LLAssetType::AT_TEXTURE == asset_type || | ||
967 | LLAssetType::AT_ANIMATION == asset_type) | ||
968 | { | ||
969 | S32 upload_cost = gGlobalEconomy->getPriceUpload(); | ||
970 | S32 balance = gStatusBar->getBalance(); | ||
971 | if (balance < upload_cost) | ||
972 | { | ||
973 | // insufficient funds, bail on this upload | ||
974 | LLFloaterBuyCurrency::buyCurrency("Uploading costs", upload_cost); | ||
975 | return; | ||
976 | } | ||
977 | } | ||
978 | |||
979 | LLResourceData* data = new LLResourceData; | ||
980 | data->mAssetInfo.mTransactionID = tid; | ||
981 | data->mAssetInfo.mUuid = uuid; | ||
982 | data->mAssetInfo.mType = asset_type; | ||
983 | data->mAssetInfo.mCreatorID = gAgentID; | ||
984 | data->mInventoryType = inv_type; | ||
985 | data->mNextOwnerPerm = next_owner_perm; | ||
986 | data->mUserData = userdata; | ||
987 | data->mAssetInfo.setName(name); | ||
988 | data->mAssetInfo.setDescription(desc); | ||
989 | data->mPreferredLocation = destination_folder_type; | ||
990 | |||
991 | LLAssetStorage::LLStoreAssetCallback asset_callback = &upload_done_callback; | ||
992 | if (callback) | ||
993 | { | ||
994 | asset_callback = callback; | ||
995 | } | ||
996 | gAssetStorage->storeAssetData(data->mAssetInfo.mTransactionID, data->mAssetInfo.mType, | ||
997 | asset_callback, | ||
998 | (void*)data, | ||
999 | FALSE); | ||
1000 | } | ||
1001 | } | ||
1002 | |||
1003 | |||
1004 | void init_menu_file() | ||
1005 | { | ||
1006 | (new LLFileUploadImage())->registerListener(gMenuHolder, "File.UploadImage"); | ||
1007 | (new LLFileUploadSound())->registerListener(gMenuHolder, "File.UploadSound"); | ||
1008 | (new LLFileUploadAnim())->registerListener(gMenuHolder, "File.UploadAnim"); | ||
1009 | (new LLFileUploadBulk())->registerListener(gMenuHolder, "File.UploadBulk"); | ||
1010 | (new LLFileCloseWindow())->registerListener(gMenuHolder, "File.CloseWindow"); | ||
1011 | (new LLFileCloseAllWindows())->registerListener(gMenuHolder, "File.CloseAllWindows"); | ||
1012 | (new LLFileEnableCloseWindow())->registerListener(gMenuHolder, "File.EnableCloseWindow"); | ||
1013 | (new LLFileSaveTexture())->registerListener(gMenuHolder, "File.SaveTexture"); | ||
1014 | (new LLFileTakeSnapshot())->registerListener(gMenuHolder, "File.TakeSnapshot"); | ||
1015 | (new LLFileTakeSnapshotToDisk())->registerListener(gMenuHolder, "File.TakeSnapshotToDisk"); | ||
1016 | (new LLFileSaveMovie())->registerListener(gMenuHolder, "File.SaveMovie"); | ||
1017 | (new LLFileSetWindowSize())->registerListener(gMenuHolder, "File.SetWindowSize"); | ||
1018 | (new LLFileQuit())->registerListener(gMenuHolder, "File.Quit"); | ||
1019 | |||
1020 | (new LLFileEnableUpload())->registerListener(gMenuHolder, "File.EnableUpload"); | ||
1021 | (new LLFileEnableSaveAs())->registerListener(gMenuHolder, "File.EnableSaveAs"); | ||
1022 | } | ||
diff --git a/linden/indra/newview/llviewermenufile.h b/linden/indra/newview/llviewermenufile.h new file mode 100644 index 0000000..32806fb --- /dev/null +++ b/linden/indra/newview/llviewermenufile.h | |||
@@ -0,0 +1,59 @@ | |||
1 | /** | ||
2 | * @file llviewermenufile.h | ||
3 | * @brief "File" menu in the main menu bar. | ||
4 | * | ||
5 | * Copyright (c) 2002-2007, Linden Research, Inc. | ||
6 | * | ||
7 | * Second Life Viewer Source Code | ||
8 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
9 | * to you under the terms of the GNU General Public License, version 2.0 | ||
10 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
11 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
12 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
13 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
14 | * | ||
15 | * There are special exceptions to the terms and conditions of the GPL as | ||
16 | * it is applied to this Source Code. View the full text of the exception | ||
17 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
18 | * online at http://secondlife.com/developers/opensource/flossexception | ||
19 | * | ||
20 | * By copying, modifying or distributing this software, you acknowledge | ||
21 | * that you have read and understood your obligations described above, | ||
22 | * and agree to abide by those obligations. | ||
23 | * | ||
24 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
25 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
26 | * COMPLETENESS OR PERFORMANCE. | ||
27 | */ | ||
28 | |||
29 | #ifndef LLVIEWERMENUFILE_H | ||
30 | #define LLVIEWERMENUFILE_H | ||
31 | |||
32 | #include "llassettype.h" | ||
33 | #include "llinventorytype.h" | ||
34 | |||
35 | class LLTransactionID; | ||
36 | |||
37 | |||
38 | void init_menu_file(); | ||
39 | |||
40 | void upload_new_resource(const LLString& src_filename, std::string name, | ||
41 | std::string desc, S32 compression_info, | ||
42 | LLAssetType::EType destination_folder_type, | ||
43 | LLInventoryType::EType inv_type, | ||
44 | U32 next_owner_perm = 0x0, // PERM_NONE | ||
45 | const LLString& display_name = LLString::null, | ||
46 | LLAssetStorage::LLStoreAssetCallback callback = NULL, | ||
47 | void *userdata = NULL); | ||
48 | |||
49 | void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType type, | ||
50 | std::string name, | ||
51 | std::string desc, S32 compression_info, | ||
52 | LLAssetType::EType destination_folder_type, | ||
53 | LLInventoryType::EType inv_type, | ||
54 | U32 next_owner_perm = 0x0, // PERM_NONE | ||
55 | const LLString& display_name = LLString::null, | ||
56 | LLAssetStorage::LLStoreAssetCallback callback = NULL, | ||
57 | void *userdata = NULL); | ||
58 | |||
59 | #endif | ||
diff --git a/linden/indra/newview/llviewermessage.cpp b/linden/indra/newview/llviewermessage.cpp index 5dab363..5eafd9d 100644 --- a/linden/indra/newview/llviewermessage.cpp +++ b/linden/indra/newview/llviewermessage.cpp | |||
@@ -145,8 +145,14 @@ extern BOOL gDebugClicks; | |||
145 | extern void bad_network_handler(); | 145 | extern void bad_network_handler(); |
146 | 146 | ||
147 | // function prototypes | 147 | // function prototypes |
148 | void open_offer(const std::vector<LLUUID>& items); | 148 | void open_offer(const std::vector<LLUUID>& items, const std::string& from_name); |
149 | void friendship_offer_callback(S32 option, void* user_data); | 149 | void friendship_offer_callback(S32 option, void* user_data); |
150 | bool check_offer_throttle(const std::string& from_name, bool check_only); | ||
151 | |||
152 | //inventory offer throttle globals | ||
153 | LLFrameTimer gThrottleTimer; | ||
154 | const U32 OFFER_THROTTLE_MAX_COUNT=5; //number of items per time period | ||
155 | const F32 OFFER_THROTTLE_TIME=10.f; //time period in seconds | ||
150 | 156 | ||
151 | struct LLFriendshipOffer | 157 | struct LLFriendshipOffer |
152 | { | 158 | { |
@@ -195,11 +201,6 @@ void give_money(const LLUUID& uuid, LLViewerRegion* region, S32 amount, BOOL is_ | |||
195 | } | 201 | } |
196 | } | 202 | } |
197 | 203 | ||
198 | BOOL can_afford_transaction(S32 cost) | ||
199 | { | ||
200 | return((cost <= 0)||((gStatusBar) && (gStatusBar->getBalance() >=cost))); | ||
201 | } | ||
202 | |||
203 | void send_complete_agent_movement(const LLHost& sim_host) | 204 | void send_complete_agent_movement(const LLHost& sim_host) |
204 | { | 205 | { |
205 | LLMessageSystem* msg = gMessageSystem; | 206 | LLMessageSystem* msg = gMessageSystem; |
@@ -275,11 +276,19 @@ void process_layer_data(LLMessageSystem *mesgsys, void **user_data) | |||
275 | 276 | ||
276 | mesgsys->getS8Fast(_PREHASH_LayerID, _PREHASH_Type, type); | 277 | mesgsys->getS8Fast(_PREHASH_LayerID, _PREHASH_Type, type); |
277 | size = mesgsys->getSizeFast(_PREHASH_LayerData, _PREHASH_Data); | 278 | size = mesgsys->getSizeFast(_PREHASH_LayerData, _PREHASH_Data); |
278 | if(!size) | 279 | if (0 == size) |
279 | { | 280 | { |
280 | llwarns << "Layer data has zero size." << llendl; | 281 | llwarns << "Layer data has zero size." << llendl; |
281 | return; | 282 | return; |
282 | } | 283 | } |
284 | if (size < 0) | ||
285 | { | ||
286 | // getSizeFast() is probably trying to tell us about an error | ||
287 | llwarns << "getSizeFast() returned negative result: " | ||
288 | << size | ||
289 | << llendl; | ||
290 | return; | ||
291 | } | ||
283 | U8 *datap = new U8[size]; | 292 | U8 *datap = new U8[size]; |
284 | mesgsys->getBinaryDataFast(_PREHASH_LayerData, _PREHASH_Data, datap, size); | 293 | mesgsys->getBinaryDataFast(_PREHASH_LayerData, _PREHASH_Data, datap, size); |
285 | LLVLData *vl_datap = new LLVLData(regionp, type, datap, size); | 294 | LLVLData *vl_datap = new LLVLData(regionp, type, datap, size); |
@@ -326,25 +335,29 @@ void export_complete() | |||
326 | while ((pos = strstr(pos+1, "<sl:image ")) != 0) | 335 | while ((pos = strstr(pos+1, "<sl:image ")) != 0) |
327 | { | 336 | { |
328 | char *pos_check = strstr(pos, "checksum=\""); | 337 | char *pos_check = strstr(pos, "checksum=\""); |
329 | char *pos_uuid = strstr(pos_check, "\">"); | ||
330 | 338 | ||
331 | if (pos_check && pos_uuid) | 339 | if (pos_check) |
332 | { | 340 | { |
333 | char image_uuid_str[UUID_STR_SIZE]; /* Flawfinder: ignore */ | 341 | char *pos_uuid = strstr(pos_check, "\">"); |
334 | memcpy(image_uuid_str, pos_uuid+2, UUID_STR_SIZE-1); /* Flawfinder: ignore */ | ||
335 | image_uuid_str[UUID_STR_SIZE-1] = 0; | ||
336 | 342 | ||
337 | LLUUID image_uuid(image_uuid_str); | 343 | if (pos_uuid) |
344 | { | ||
345 | char image_uuid_str[UUID_STR_SIZE]; /* Flawfinder: ignore */ | ||
346 | memcpy(image_uuid_str, pos_uuid+2, UUID_STR_SIZE-1); /* Flawfinder: ignore */ | ||
347 | image_uuid_str[UUID_STR_SIZE-1] = 0; | ||
348 | |||
349 | LLUUID image_uuid(image_uuid_str); | ||
338 | 350 | ||
339 | llinfos << "Found UUID: " << image_uuid << llendl; | 351 | llinfos << "Found UUID: " << image_uuid << llendl; |
340 | 352 | ||
341 | std::map<LLUUID, LLString>::iterator itor = gImageChecksums.find(image_uuid); | 353 | std::map<LLUUID, LLString>::iterator itor = gImageChecksums.find(image_uuid); |
342 | if (itor != gImageChecksums.end()) | 354 | if (itor != gImageChecksums.end()) |
343 | { | ||
344 | llinfos << "Replacing with checksum: " << itor->second << llendl; | ||
345 | if (itor->second.c_str() != NULL) | ||
346 | { | 355 | { |
347 | memcpy(&pos_check[10], itor->second.c_str(), 32); /* Flawfinder: ignore */ | 356 | llinfos << "Replacing with checksum: " << itor->second << llendl; |
357 | if (itor->second.c_str() != NULL) | ||
358 | { | ||
359 | memcpy(&pos_check[10], itor->second.c_str(), 32); /* Flawfinder: ignore */ | ||
360 | } | ||
348 | } | 361 | } |
349 | } | 362 | } |
350 | } | 363 | } |
@@ -354,7 +367,7 @@ void export_complete() | |||
354 | fwrite(buffer, 1, length, fXMLOut); | 367 | fwrite(buffer, 1, length, fXMLOut); |
355 | fclose(fXMLOut); | 368 | fclose(fXMLOut); |
356 | 369 | ||
357 | delete buffer; | 370 | delete [] buffer; |
358 | } | 371 | } |
359 | 372 | ||
360 | 373 | ||
@@ -432,7 +445,7 @@ void exported_j2c_complete(const LLTSCode status, void *user_data) | |||
432 | char *end = strrchr(file_path, gDirUtilp->getDirDelimiter()[0]); | 445 | char *end = strrchr(file_path, gDirUtilp->getDirDelimiter()[0]); |
433 | end[0] = 0; | 446 | end[0] = 0; |
434 | LLString output_file = llformat("%s/image-%03d.tga", file_path, image_num);//filename; | 447 | LLString output_file = llformat("%s/image-%03d.tga", file_path, image_num);//filename; |
435 | delete file_path; | 448 | delete [] file_path; |
436 | //S32 name_len = output_file.length(); | 449 | //S32 name_len = output_file.length(); |
437 | //strcpy(&output_file[name_len-3], "tga"); | 450 | //strcpy(&output_file[name_len-3], "tga"); |
438 | FILE* fOut = LLFile::fopen(output_file.c_str(), "wb"); /* Flawfinder: ignore */ | 451 | FILE* fOut = LLFile::fopen(output_file.c_str(), "wb"); /* Flawfinder: ignore */ |
@@ -599,31 +612,44 @@ void join_group_callback(S32 option, void* user_data) | |||
599 | class LLOpenAgentOffer : public LLInventoryFetchObserver | 612 | class LLOpenAgentOffer : public LLInventoryFetchObserver |
600 | { | 613 | { |
601 | public: | 614 | public: |
602 | LLOpenAgentOffer() {} | 615 | LLOpenAgentOffer(const std::string& from_name) : mFromName(from_name) {} |
603 | virtual ~LLOpenAgentOffer() {} | 616 | /*virtual*/ void done() |
604 | |||
605 | virtual void done() | ||
606 | { | 617 | { |
607 | open_offer(mComplete); | 618 | open_offer(mComplete, mFromName); |
608 | gInventory.removeObserver(this); | 619 | gInventory.removeObserver(this); |
609 | delete this; | 620 | delete this; |
610 | } | 621 | } |
622 | private: | ||
623 | std::string mFromName; | ||
611 | }; | 624 | }; |
612 | 625 | ||
613 | class LLOpenTaskOffer : public LLInventoryExistenceObserver | 626 | //unlike the FetchObserver for AgentOffer, we only make one |
627 | //instance of the AddedObserver for TaskOffers | ||
628 | //and it never dies. We do this because we don't know the UUID of | ||
629 | //task offers until they are accepted, so we don't wouldn't | ||
630 | //know what to watch for, so instead we just watch for all additions. -Gigs | ||
631 | class LLOpenTaskOffer : public LLInventoryAddedObserver | ||
614 | { | 632 | { |
615 | public: | ||
616 | LLOpenTaskOffer() {} | ||
617 | virtual ~LLOpenTaskOffer() {} | ||
618 | |||
619 | protected: | 633 | protected: |
620 | virtual void done() | 634 | /*virtual*/ void done() |
621 | { | 635 | { |
622 | open_offer(mExist); | 636 | open_offer(mAdded, ""); |
623 | gInventory.removeObserver(this); | 637 | mAdded.clear(); |
624 | delete this; | ||
625 | } | 638 | } |
626 | }; | 639 | }; |
640 | |||
641 | //one global instance to bind them | ||
642 | LLOpenTaskOffer* gNewInventoryObserver=NULL; | ||
643 | |||
644 | void start_new_inventory_observer() | ||
645 | { | ||
646 | if (!gNewInventoryObserver) //task offer observer | ||
647 | { | ||
648 | // Observer is deleted by gInventory | ||
649 | gNewInventoryObserver = new LLOpenTaskOffer; | ||
650 | gInventory.addObserver(gNewInventoryObserver); | ||
651 | } | ||
652 | } | ||
627 | 653 | ||
628 | class LLDiscardAgentOffer : public LLInventoryFetchComboObserver | 654 | class LLDiscardAgentOffer : public LLInventoryFetchComboObserver |
629 | { | 655 | { |
@@ -675,7 +701,71 @@ protected: | |||
675 | }; | 701 | }; |
676 | 702 | ||
677 | 703 | ||
678 | void open_offer(const std::vector<LLUUID>& items) | 704 | //Returns TRUE if we are OK, FALSE if we are throttled |
705 | //Set check_only true if you want to know the throttle status | ||
706 | //without registering a hit -Gigs | ||
707 | bool check_offer_throttle(const std::string& from_name, bool check_only) | ||
708 | { | ||
709 | static U32 throttle_count; | ||
710 | static bool throttle_logged; | ||
711 | LLChat chat; | ||
712 | LLString log_message; | ||
713 | |||
714 | if (!gSavedSettings.getBOOL("ShowNewInventory")) | ||
715 | return false; | ||
716 | |||
717 | if (check_only) | ||
718 | { | ||
719 | return gThrottleTimer.hasExpired(); | ||
720 | } | ||
721 | |||
722 | if(gThrottleTimer.checkExpirationAndReset(OFFER_THROTTLE_TIME)) | ||
723 | { | ||
724 | //llinfos << "Throttle Expired" << llendl; | ||
725 | throttle_count=1; | ||
726 | throttle_logged=false; | ||
727 | return true; | ||
728 | } | ||
729 | else //has not expired | ||
730 | { | ||
731 | //llinfos << "Throttle Not Expired, Count: " << throttle_count << llendl; | ||
732 | // When downloading the initial inventory we get a lot of new items | ||
733 | // coming in and can't tell that from spam. JC | ||
734 | if (gStartupState >= STATE_STARTED | ||
735 | && throttle_count >= OFFER_THROTTLE_MAX_COUNT) | ||
736 | { | ||
737 | if (!throttle_logged) | ||
738 | { | ||
739 | // Use the name of the last item giver, who is probably the person | ||
740 | // spamming you. JC | ||
741 | std::ostringstream message; | ||
742 | message << gSecondLife; | ||
743 | if (!from_name.empty()) | ||
744 | { | ||
745 | message << ": Items coming in too fast from " << from_name; | ||
746 | } | ||
747 | else | ||
748 | { | ||
749 | message << ": Items coming in too fast"; | ||
750 | } | ||
751 | message << ", automatic preview disabled for " | ||
752 | << OFFER_THROTTLE_TIME << " seconds."; | ||
753 | chat.mText = message.str(); | ||
754 | //this is kinda important, so actually put it on screen | ||
755 | LLFloaterChat::addChat(chat, FALSE, FALSE); | ||
756 | throttle_logged=true; | ||
757 | } | ||
758 | return false; | ||
759 | } | ||
760 | else | ||
761 | { | ||
762 | throttle_count++; | ||
763 | return true; | ||
764 | } | ||
765 | } | ||
766 | } | ||
767 | |||
768 | void open_offer(const std::vector<LLUUID>& items, const std::string& from_name) | ||
679 | { | 769 | { |
680 | std::vector<LLUUID>::const_iterator it = items.begin(); | 770 | std::vector<LLUUID>::const_iterator it = items.begin(); |
681 | std::vector<LLUUID>::const_iterator end = items.end(); | 771 | std::vector<LLUUID>::const_iterator end = items.end(); |
@@ -693,33 +783,66 @@ void open_offer(const std::vector<LLUUID>& items) | |||
693 | { | 783 | { |
694 | continue; | 784 | continue; |
695 | } | 785 | } |
696 | switch(item->getType()) | 786 | //if we are throttled, don't display them - Gigs |
787 | if (check_offer_throttle(from_name, false)) | ||
697 | { | 788 | { |
698 | case LLAssetType::AT_NOTECARD: | 789 | // I'm not sure this is a good idea. JC |
699 | open_notecard(*it, LLString("Note: ") + item->getName(), TRUE, LLUUID::null, FALSE); | 790 | // bool show_keep_discard = item->getPermissions().getCreator() != gAgent.getID(); |
700 | break; | 791 | bool show_keep_discard = true; |
701 | case LLAssetType::AT_LANDMARK: | 792 | switch(item->getType()) |
702 | open_landmark(*it, LLString("Landmark: ") + item->getName(), TRUE, LLUUID::null, FALSE); | ||
703 | break; | ||
704 | case LLAssetType::AT_TEXTURE: | ||
705 | open_texture(*it, LLString("Texture: ") + item->getName(), TRUE, LLUUID::null, FALSE); | ||
706 | break; | ||
707 | default: | ||
708 | { | ||
709 | // Don't auto-open the inventory - just select it if we | ||
710 | // already have an active inventory. | ||
711 | LLInventoryView* view = LLInventoryView::getActiveInventory(); | ||
712 | if(view) | ||
713 | { | 793 | { |
714 | LLUICtrl* focus_ctrl = gFocusMgr.getKeyboardFocus(); | 794 | case LLAssetType::AT_NOTECARD: |
715 | LLFocusMgr::FocusLostCallback callback; | 795 | open_notecard(*it, LLString("Note: ") + item->getName(), show_keep_discard, LLUUID::null, FALSE); |
716 | callback = gFocusMgr.getFocusCallback(); | 796 | break; |
717 | view->getPanel()->setSelection(item->getUUID(), TAKE_FOCUS_NO); | 797 | case LLAssetType::AT_LANDMARK: |
718 | gFocusMgr.setKeyboardFocus(focus_ctrl, callback); | 798 | open_landmark(*it, LLString("Landmark: ") + item->getName(), show_keep_discard, LLUUID::null, FALSE); |
799 | break; | ||
800 | case LLAssetType::AT_TEXTURE: | ||
801 | open_texture(*it, LLString("Texture: ") + item->getName(), show_keep_discard, LLUUID::null, FALSE); | ||
802 | break; | ||
803 | default: | ||
719 | break; | 804 | break; |
720 | } | 805 | } |
721 | } | 806 | } |
807 | //highlight item, if it's not in the trash or lost+found | ||
808 | |||
809 | // Don't auto-open the inventory floater | ||
810 | LLInventoryView* view = LLInventoryView::getActiveInventory(); | ||
811 | if(!view) | ||
812 | { | ||
813 | return; | ||
814 | } | ||
815 | |||
816 | //Trash Check | ||
817 | LLUUID trash_id; | ||
818 | trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); | ||
819 | if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id)) | ||
820 | { | ||
821 | return; | ||
722 | } | 822 | } |
823 | LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); | ||
824 | //BOOL inventory_has_focus = gFocusMgr.childHasKeyboardFocus(view); | ||
825 | BOOL user_is_away = gAwayTimer.getStarted(); | ||
826 | |||
827 | // don't select lost and found items if the user is active | ||
828 | if (gInventory.isObjectDescendentOf(item->getUUID(), lost_and_found_id) | ||
829 | && !user_is_away) | ||
830 | { | ||
831 | return; | ||
832 | } | ||
833 | |||
834 | //Not sure about this check. Could make it easy to miss incoming items. -Gigs | ||
835 | //don't dick with highlight while the user is working | ||
836 | //if(inventory_has_focus && !user_is_away) | ||
837 | // break; | ||
838 | //llinfos << "Highlighting" << item->getUUID() << llendl; | ||
839 | //highlight item | ||
840 | |||
841 | LLUICtrl* focus_ctrl = gFocusMgr.getKeyboardFocus(); | ||
842 | LLFocusMgr::FocusLostCallback callback; | ||
843 | callback = gFocusMgr.getFocusCallback(); | ||
844 | view->getPanel()->setSelection(item->getUUID(), TAKE_FOCUS_NO); | ||
845 | gFocusMgr.setKeyboardFocus(focus_ctrl, callback); | ||
723 | } | 846 | } |
724 | } | 847 | } |
725 | 848 | ||
@@ -807,11 +930,11 @@ void inventory_offer_callback(S32 option, void* user_data) | |||
807 | char group_name[MAX_STRING]; /* Flawfinder: ignore */ | 930 | char group_name[MAX_STRING]; /* Flawfinder: ignore */ |
808 | if (gCacheName->getGroupName(info->mFromID, group_name)) | 931 | if (gCacheName->getGroupName(info->mFromID, group_name)) |
809 | { | 932 | { |
810 | from_string = LLString("An object named ") + info->mFromName + " owned by the group '" + group_name + "'"; | 933 | from_string = LLString("An object named '") + info->mFromName + "' owned by the group '" + group_name + "'"; |
811 | } | 934 | } |
812 | else | 935 | else |
813 | { | 936 | { |
814 | from_string = LLString("An object named ") + info->mFromName + " owned by an unknown group"; | 937 | from_string = LLString("An object named '") + info->mFromName + "' owned by an unknown group"; |
815 | } | 938 | } |
816 | } | 939 | } |
817 | else | 940 | else |
@@ -820,11 +943,11 @@ void inventory_offer_callback(S32 option, void* user_data) | |||
820 | char last_name[MAX_STRING]; /* Flawfinder: ignore */ | 943 | char last_name[MAX_STRING]; /* Flawfinder: ignore */ |
821 | if (gCacheName->getName(info->mFromID, first_name, last_name)) | 944 | if (gCacheName->getName(info->mFromID, first_name, last_name)) |
822 | { | 945 | { |
823 | from_string = LLString("An object named ") + info->mFromName + " owned by " + first_name + " " + last_name; | 946 | from_string = LLString("An object named '") + info->mFromName + "' owned by " + first_name + " " + last_name; |
824 | } | 947 | } |
825 | else | 948 | else |
826 | { | 949 | { |
827 | from_string = LLString("An object named ") + info->mFromName + " owned by an unknown user"; | 950 | from_string = LLString("An object named '") + info->mFromName + "' owned by an unknown user"; |
828 | } | 951 | } |
829 | } | 952 | } |
830 | } | 953 | } |
@@ -833,9 +956,11 @@ void inventory_offer_callback(S32 option, void* user_data) | |||
833 | from_string = info->mFromName; | 956 | from_string = info->mFromName; |
834 | } | 957 | } |
835 | 958 | ||
959 | bool busy=FALSE; | ||
960 | |||
836 | switch(option) | 961 | switch(option) |
837 | { | 962 | { |
838 | case 0: | 963 | case IOR_ACCEPT: |
839 | // ACCEPT. The math for the dialog works, because the accept | 964 | // ACCEPT. The math for the dialog works, because the accept |
840 | // for inventory_offered, task_inventory_offer or | 965 | // for inventory_offered, task_inventory_offer or |
841 | // group_notice_inventory is 1 greater than the offer integer value. | 966 | // group_notice_inventory is 1 greater than the offer integer value. |
@@ -846,9 +971,15 @@ void inventory_offer_callback(S32 option, void* user_data) | |||
846 | sizeof(info->mFolderID.mData)); | 971 | sizeof(info->mFolderID.mData)); |
847 | // send the message | 972 | // send the message |
848 | msg->sendReliable(info->mHost); | 973 | msg->sendReliable(info->mHost); |
849 | log_message = info->mFromName + " gave you " + info->mDesc + "."; | 974 | |
850 | chat.mText = log_message; | 975 | //don't spam them if they are getting flooded |
851 | LLFloaterChat::addChatHistory(chat); | 976 | if (check_offer_throttle(info->mFromName, true)) |
977 | { | ||
978 | log_message = info->mFromName + " gave you " + info->mDesc + "."; | ||
979 | chat.mText = log_message; | ||
980 | LLFloaterChat::addChatHistory(chat); | ||
981 | } | ||
982 | |||
852 | // we will want to open this item when it comes back. | 983 | // we will want to open this item when it comes back. |
853 | lldebugs << "Initializing an opener for tid: " << info->mTransactionID | 984 | lldebugs << "Initializing an opener for tid: " << info->mTransactionID |
854 | << llendl; | 985 | << llendl; |
@@ -861,7 +992,7 @@ void inventory_offer_callback(S32 option, void* user_data) | |||
861 | // so we can fetch it out of our inventory. | 992 | // so we can fetch it out of our inventory. |
862 | LLInventoryFetchObserver::item_ref_t items; | 993 | LLInventoryFetchObserver::item_ref_t items; |
863 | items.push_back(info->mObjectID); | 994 | items.push_back(info->mObjectID); |
864 | LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer; | 995 | LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer(from_string); |
865 | open_agent_offer->fetchItems(items); | 996 | open_agent_offer->fetchItems(items); |
866 | if(catp || (itemp && itemp->isComplete())) | 997 | if(catp || (itemp && itemp->isComplete())) |
867 | { | 998 | { |
@@ -877,22 +1008,10 @@ void inventory_offer_callback(S32 option, void* user_data) | |||
877 | case IM_GROUP_NOTICE: | 1008 | case IM_GROUP_NOTICE: |
878 | case IM_GROUP_NOTICE_REQUESTED: | 1009 | case IM_GROUP_NOTICE_REQUESTED: |
879 | { | 1010 | { |
880 | // This is an offer from a task or group. | 1011 | // This is an offer from a task or group. |
881 | // Because it would be easy | 1012 | // We don't use a new instance of an opener |
882 | // to write a task which would overload your inventory, we | 1013 | // We instead use the singular observer gOpenTaskOffer |
883 | // force the offer to stay in an instant message until | 1014 | // Since it already exists, we don't need to actually do anything |
884 | // accepted. Thus, we have to respond, and then wait for | ||
885 | // the update to come back before we open the item. | ||
886 | LLOpenTaskOffer* open_task_offer = new LLOpenTaskOffer; | ||
887 | open_task_offer->watchItem(info->mObjectID); | ||
888 | if(itemp && itemp->isComplete()) | ||
889 | { | ||
890 | opener->changed(0x0); | ||
891 | } | ||
892 | else | ||
893 | { | ||
894 | opener = open_task_offer; | ||
895 | } | ||
896 | } | 1015 | } |
897 | break; | 1016 | break; |
898 | default: | 1017 | default: |
@@ -901,9 +1020,12 @@ void inventory_offer_callback(S32 option, void* user_data) | |||
901 | } | 1020 | } |
902 | break; | 1021 | break; |
903 | 1022 | ||
904 | case 2: | 1023 | case IOR_BUSY: |
1024 | //Busy falls through to decline. Says to make busy message. | ||
1025 | busy=TRUE; | ||
1026 | case IOR_MUTE: | ||
905 | // MUTE falls through to decline | 1027 | // MUTE falls through to decline |
906 | case 1: | 1028 | case IOR_DECLINE: |
907 | // DECLINE. The math for the dialog works, because the decline | 1029 | // DECLINE. The math for the dialog works, because the decline |
908 | // for inventory_offered, task_inventory_offer or | 1030 | // for inventory_offered, task_inventory_offer or |
909 | // group_notice_inventory is 2 greater than the offer integer value. | 1031 | // group_notice_inventory is 2 greater than the offer integer value. |
@@ -941,7 +1063,7 @@ void inventory_offer_callback(S32 option, void* user_data) | |||
941 | } | 1063 | } |
942 | 1064 | ||
943 | } | 1065 | } |
944 | if (!info->mFromGroup && !info->mFromObject) | 1066 | if (busy || (!info->mFromGroup && !info->mFromObject)) |
945 | { | 1067 | { |
946 | busy_message(msg,info->mFromID); | 1068 | busy_message(msg,info->mFromID); |
947 | } | 1069 | } |
@@ -964,88 +1086,73 @@ void inventory_offer_callback(S32 option, void* user_data) | |||
964 | 1086 | ||
965 | void inventory_offer_handler(LLOfferInfo* info, BOOL from_task) | 1087 | void inventory_offer_handler(LLOfferInfo* info, BOOL from_task) |
966 | { | 1088 | { |
967 | switch(info->mType) | 1089 | |
1090 | //Until throttling is implmented, busy mode should reject inventory instead of silently | ||
1091 | //accepting it. SEE SL-39554 | ||
1092 | if (gAgent.getBusy()) | ||
1093 | { | ||
1094 | inventory_offer_callback(IOR_BUSY, info); | ||
1095 | return; | ||
1096 | } | ||
1097 | |||
1098 | //If muted, don't even go through the messaging stuff. Just curtail the offer here. | ||
1099 | if (gMuteListp->isMuted(info->mFromID, info->mFromName)) | ||
1100 | { | ||
1101 | inventory_offer_callback(IOR_MUTE, info); | ||
1102 | return; | ||
1103 | } | ||
1104 | |||
1105 | if (gSavedSettings.getBOOL("ShowNewInventory") | ||
1106 | && (info->mType == LLAssetType::AT_NOTECARD | ||
1107 | || info->mType == LLAssetType::AT_LANDMARK | ||
1108 | || info->mType == LLAssetType::AT_TEXTURE)) | ||
968 | { | 1109 | { |
969 | // For certain types, just accept the items into the inventory, | 1110 | // For certain types, just accept the items into the inventory, |
970 | // and we'll automatically open them on receipt. | 1111 | // and we'll automatically open them on receipt. |
971 | case LLAssetType::AT_NOTECARD: | 1112 | // 0 = accept button |
972 | case LLAssetType::AT_LANDMARK: | 1113 | inventory_offer_callback(IOR_ACCEPT, info); |
973 | case LLAssetType::AT_TEXTURE: | 1114 | return; |
974 | { | 1115 | } |
975 | // 0 = accept button | 1116 | |
976 | inventory_offer_callback(0, info); | 1117 | LLString::format_map_t args; |
977 | //LLInventoryView::sOpenNextNewItem = TRUE; | 1118 | args["[OBJECTNAME]"] = info->mDesc; |
978 | } | 1119 | args["[OBJECTTYPE]"] = LLAssetType::lookupHumanReadable(info->mType); |
979 | break; | 1120 | |
980 | 1121 | // Name cache callbacks don't store userdata, so can't save | |
981 | case LLAssetType::AT_SOUND: | 1122 | // off the LLOfferInfo. Argh. JC |
982 | case LLAssetType::AT_CALLINGCARD: | 1123 | BOOL name_found = FALSE; |
983 | case LLAssetType::AT_SCRIPT: | 1124 | char first_name[MAX_STRING]; /* Flawfinder: ignore */ |
984 | case LLAssetType::AT_CLOTHING: | 1125 | char last_name[MAX_STRING]; /* Flawfinder: ignore */ |
985 | case LLAssetType::AT_OBJECT: | 1126 | if (info->mFromGroup) |
986 | case LLAssetType::AT_CATEGORY: | 1127 | { |
987 | case LLAssetType::AT_ROOT_CATEGORY: | 1128 | if (gCacheName->getGroupName(info->mFromID, first_name)) |
988 | case LLAssetType::AT_LSL_TEXT: | 1129 | { |
989 | case LLAssetType::AT_LSL_BYTECODE: | 1130 | args["[FIRST]"] = first_name; |
990 | case LLAssetType::AT_TEXTURE_TGA: | 1131 | args["[LAST]"] = ""; |
991 | case LLAssetType::AT_BODYPART: | 1132 | name_found = TRUE; |
992 | case LLAssetType::AT_TRASH: | 1133 | } |
993 | case LLAssetType::AT_SNAPSHOT_CATEGORY: | 1134 | } |
994 | case LLAssetType::AT_LOST_AND_FOUND: | 1135 | else |
995 | case LLAssetType::AT_ANIMATION: | 1136 | { |
996 | case LLAssetType::AT_GESTURE: | 1137 | if (gCacheName->getName(info->mFromID, first_name, last_name)) |
997 | default: | 1138 | { |
998 | { | 1139 | args["[FIRST]"] = first_name; |
999 | LLString::format_map_t args; | 1140 | args["[LAST]"] = last_name; |
1000 | args["[OBJECTNAME]"] = info->mDesc; | 1141 | name_found = TRUE; |
1001 | args["[OBJECTTYPE]"] = LLAssetType::lookupHumanReadable(info->mType); | 1142 | } |
1002 | 1143 | } | |
1003 | // Name cache callbacks don't store userdata, so can't save | 1144 | if (from_task) |
1004 | // off the LLOfferInfo. Argh. JC | 1145 | { |
1005 | BOOL name_found = FALSE; | 1146 | args["[OBJECTFROMNAME]"] = info->mFromName; |
1006 | char first_name[MAX_STRING]; /* Flawfinder: ignore */ | 1147 | LLNotifyBox::showXml(name_found ? "ObjectGiveItem" : "ObjectGiveItemUnknownUser", |
1007 | char last_name[MAX_STRING]; /* Flawfinder: ignore */ | 1148 | args, &inventory_offer_callback, (void*)info); |
1008 | if (info->mFromGroup) | 1149 | } |
1009 | { | 1150 | else |
1010 | if (gCacheName->getGroupName(info->mFromID, first_name)) | 1151 | { |
1011 | { | 1152 | // XUI:translate -> [FIRST] [LAST] |
1012 | args["[FIRST]"] = first_name; | 1153 | args["[NAME]"] = info->mFromName; |
1013 | args["[LAST]"] = ""; | 1154 | LLNotifyBox::showXml("UserGiveItem", args, |
1014 | name_found = TRUE; | 1155 | &inventory_offer_callback, (void*)info); |
1015 | } | ||
1016 | } | ||
1017 | else | ||
1018 | { | ||
1019 | if (gCacheName->getName(info->mFromID, first_name, last_name)) | ||
1020 | { | ||
1021 | args["[FIRST]"] = first_name; | ||
1022 | args["[LAST]"] = last_name; | ||
1023 | name_found = TRUE; | ||
1024 | } | ||
1025 | } | ||
1026 | if (from_task) | ||
1027 | { | ||
1028 | args["[OBJECTFROMNAME]"] = info->mFromName; | ||
1029 | if (name_found) | ||
1030 | { | ||
1031 | LLNotifyBox::showXml("ObjectGiveItem", args, | ||
1032 | &inventory_offer_callback, (void*)info); | ||
1033 | } | ||
1034 | else | ||
1035 | { | ||
1036 | LLNotifyBox::showXml("ObjectGiveItemUnknownUser", args, | ||
1037 | &inventory_offer_callback, (void*)info); | ||
1038 | } | ||
1039 | } | ||
1040 | else | ||
1041 | { | ||
1042 | // XUI:translate -> [FIRST] [LAST] | ||
1043 | args["[NAME]"] = info->mFromName; | ||
1044 | LLNotifyBox::showXml("UserGiveItem", args, | ||
1045 | &inventory_offer_callback, (void*)info); | ||
1046 | } | ||
1047 | break; | ||
1048 | } | ||
1049 | } | 1156 | } |
1050 | } | 1157 | } |
1051 | 1158 | ||
@@ -1538,10 +1645,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) | |||
1538 | } | 1645 | } |
1539 | else | 1646 | else |
1540 | { | 1647 | { |
1541 | if (dialog == IM_TASK_INVENTORY_OFFERED) | 1648 | inventory_offer_handler(info, dialog == IM_TASK_INVENTORY_OFFERED); |
1542 | inventory_offer_handler(info, TRUE); | ||
1543 | else | ||
1544 | inventory_offer_handler(info, FALSE); | ||
1545 | } | 1649 | } |
1546 | } | 1650 | } |
1547 | break; | 1651 | break; |
@@ -1760,6 +1864,14 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) | |||
1760 | 1864 | ||
1761 | case IM_GOTO_URL: | 1865 | case IM_GOTO_URL: |
1762 | { | 1866 | { |
1867 | if (binary_bucket_size <= 0) | ||
1868 | { | ||
1869 | llwarns << "bad binary_bucket_size: " | ||
1870 | << binary_bucket_size | ||
1871 | << " - aborting function." << llendl; | ||
1872 | return; | ||
1873 | } | ||
1874 | |||
1763 | char* url = new char[binary_bucket_size]; | 1875 | char* url = new char[binary_bucket_size]; |
1764 | if (url == NULL) | 1876 | if (url == NULL) |
1765 | { | 1877 | { |
@@ -1985,16 +2097,22 @@ void process_offer_callingcard(LLMessageSystem* msg, void**) | |||
1985 | { | 2097 | { |
1986 | // automatically decline offer | 2098 | // automatically decline offer |
1987 | callingcard_offer_callback(1, (void*)offerdata); | 2099 | callingcard_offer_callback(1, (void*)offerdata); |
1988 | return; | 2100 | offerdata = NULL; // pointer was freed by callback |
2101 | } | ||
2102 | else | ||
2103 | { | ||
2104 | LLNotifyBox::showXml("OfferCallingCard", args, | ||
2105 | &callingcard_offer_callback, (void*)offerdata); | ||
2106 | offerdata = NULL; // pointer ownership transferred | ||
1989 | } | 2107 | } |
1990 | |||
1991 | LLNotifyBox::showXml("OfferCallingCard", args, | ||
1992 | &callingcard_offer_callback, (void*)offerdata); | ||
1993 | } | 2108 | } |
1994 | else | 2109 | else |
1995 | { | 2110 | { |
1996 | llwarns << "Calling card offer from an unknown source." << llendl; | 2111 | llwarns << "Calling card offer from an unknown source." << llendl; |
1997 | } | 2112 | } |
2113 | |||
2114 | delete offerdata; // !=NULL if we didn't give ownership away | ||
2115 | offerdata = NULL; | ||
1998 | } | 2116 | } |
1999 | 2117 | ||
2000 | void process_accept_callingcard(LLMessageSystem* msg, void**) | 2118 | void process_accept_callingcard(LLMessageSystem* msg, void**) |
@@ -3609,7 +3727,7 @@ void process_avatar_sit_response(LLMessageSystem *mesgsys, void **user_data) | |||
3609 | if (object) | 3727 | if (object) |
3610 | { | 3728 | { |
3611 | LLVector3 sit_spot = object->getPositionAgent() + (sitPosition * object->getRotation()); | 3729 | LLVector3 sit_spot = object->getPositionAgent() + (sitPosition * object->getRotation()); |
3612 | if (!use_autopilot || (avatar->mIsSitting && avatar->getRoot() == object->getRoot())) | 3730 | if (!use_autopilot || (avatar && avatar->mIsSitting && avatar->getRoot() == object->getRoot())) |
3613 | { | 3731 | { |
3614 | //we're already sitting on this object, so don't autopilot | 3732 | //we're already sitting on this object, so don't autopilot |
3615 | } | 3733 | } |
@@ -5002,9 +5120,10 @@ void onCovenantLoadComplete(LLVFS *vfs, | |||
5002 | 5120 | ||
5003 | if( (file_length > 19) && !strncmp( buffer, "Linden text version", 19 ) ) | 5121 | if( (file_length > 19) && !strncmp( buffer, "Linden text version", 19 ) ) |
5004 | { | 5122 | { |
5005 | LLViewerTextEditor* editor = new LLViewerTextEditor("temp", | 5123 | LLViewerTextEditor* editor = |
5006 | LLRect(0,0,0,0), | 5124 | new LLViewerTextEditor("temp", |
5007 | file_length+1); | 5125 | LLRect(0,0,0,0), |
5126 | file_length+1); | ||
5008 | if( !editor->importBuffer( buffer ) ) | 5127 | if( !editor->importBuffer( buffer ) ) |
5009 | { | 5128 | { |
5010 | llwarns << "Problem importing estate covenant." << llendl; | 5129 | llwarns << "Problem importing estate covenant." << llendl; |
@@ -5020,27 +5139,32 @@ void onCovenantLoadComplete(LLVFS *vfs, | |||
5020 | } | 5139 | } |
5021 | else | 5140 | else |
5022 | { | 5141 | { |
5023 | if( gViewerStats ) | 5142 | llwarns << "Problem importing estate covenant: Covenant file format error." << llendl; |
5024 | { | 5143 | covenant_text = "Problem importing estate covenant: Covenant file format error."; |
5025 | gViewerStats->incStat( LLViewerStats::ST_DOWNLOAD_FAILED ); | 5144 | } |
5026 | } | 5145 | } |
5027 | 5146 | else | |
5028 | if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status || | 5147 | { |
5029 | LL_ERR_FILE_EMPTY == status) | 5148 | if( gViewerStats ) |
5030 | { | 5149 | { |
5031 | covenant_text = "Estate covenant notecard is missing from database."; | 5150 | gViewerStats->incStat( LLViewerStats::ST_DOWNLOAD_FAILED ); |
5032 | } | ||
5033 | else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status) | ||
5034 | { | ||
5035 | covenant_text = "Insufficient permissions to view estate covenant."; | ||
5036 | } | ||
5037 | else | ||
5038 | { | ||
5039 | covenant_text = "Unable to load estate covenant at this time."; | ||
5040 | } | ||
5041 | |||
5042 | llwarns << "Problem loading notecard: " << status << llendl; | ||
5043 | } | 5151 | } |
5152 | |||
5153 | if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status || | ||
5154 | LL_ERR_FILE_EMPTY == status) | ||
5155 | { | ||
5156 | covenant_text = "Estate covenant notecard is missing from database."; | ||
5157 | } | ||
5158 | else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status) | ||
5159 | { | ||
5160 | covenant_text = "Insufficient permissions to view estate covenant."; | ||
5161 | } | ||
5162 | else | ||
5163 | { | ||
5164 | covenant_text = "Unable to load estate covenant at this time."; | ||
5165 | } | ||
5166 | |||
5167 | llwarns << "Problem loading notecard: " << status << llendl; | ||
5044 | } | 5168 | } |
5045 | LLPanelEstateCovenant::updateCovenantText(covenant_text, asset_uuid); | 5169 | LLPanelEstateCovenant::updateCovenantText(covenant_text, asset_uuid); |
5046 | LLPanelLandCovenant::updateCovenantText(covenant_text); | 5170 | LLPanelLandCovenant::updateCovenantText(covenant_text); |
diff --git a/linden/indra/newview/llviewermessage.h b/linden/indra/newview/llviewermessage.h index ce8f6a7..14f2cda 100644 --- a/linden/indra/newview/llviewermessage.h +++ b/linden/indra/newview/llviewermessage.h | |||
@@ -48,6 +48,14 @@ class LLViewerRegion; | |||
48 | // Prototypes | 48 | // Prototypes |
49 | // | 49 | // |
50 | 50 | ||
51 | enum InventoryOfferResponse | ||
52 | { | ||
53 | IOR_ACCEPT, | ||
54 | IOR_DECLINE, | ||
55 | IOR_MUTE, | ||
56 | IOR_BUSY | ||
57 | }; | ||
58 | |||
51 | BOOL can_afford_transaction(S32 cost); | 59 | BOOL can_afford_transaction(S32 cost); |
52 | void give_money(const LLUUID& uuid, LLViewerRegion* region, S32 amount, BOOL is_group = FALSE, | 60 | void give_money(const LLUUID& uuid, LLViewerRegion* region, S32 amount, BOOL is_group = FALSE, |
53 | S32 trx_type = TRANS_GIFT, const LLString& desc = LLString::null); | 61 | S32 trx_type = TRANS_GIFT, const LLString& desc = LLString::null); |
@@ -190,6 +198,7 @@ void invalid_message_callback(LLMessageSystem*, void*, EMessageException); | |||
190 | 198 | ||
191 | void process_initiate_download(LLMessageSystem* msg, void**); | 199 | void process_initiate_download(LLMessageSystem* msg, void**); |
192 | void inventory_offer_callback(S32 option, void* user_data); | 200 | void inventory_offer_callback(S32 option, void* user_data); |
201 | void start_new_inventory_observer(); | ||
193 | 202 | ||
194 | struct LLOfferInfo | 203 | struct LLOfferInfo |
195 | { | 204 | { |
diff --git a/linden/indra/newview/llviewerobject.cpp b/linden/indra/newview/llviewerobject.cpp index 5cb65b6..58d57b5 100644 --- a/linden/indra/newview/llviewerobject.cpp +++ b/linden/indra/newview/llviewerobject.cpp | |||
@@ -639,10 +639,10 @@ BOOL LLViewerObject::setDrawableParent(LLDrawable* parentp) | |||
639 | } | 639 | } |
640 | 640 | ||
641 | U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, | 641 | U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, |
642 | void **user_data, | 642 | void **user_data, |
643 | U32 block_num, | 643 | U32 block_num, |
644 | const EObjectUpdateType update_type, | 644 | const EObjectUpdateType update_type, |
645 | LLDataPacker *dp) | 645 | LLDataPacker *dp) |
646 | { | 646 | { |
647 | LLMemType mt(LLMemType::MTYPE_OBJECT); | 647 | LLMemType mt(LLMemType::MTYPE_OBJECT); |
648 | 648 | ||
@@ -658,6 +658,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, | |||
658 | from_region_handle(region_handle, &x, &y); | 658 | from_region_handle(region_handle, &x, &y); |
659 | 659 | ||
660 | llerrs << "Object has invalid region " << x << ":" << y << "!" << llendl; | 660 | llerrs << "Object has invalid region " << x << ":" << y << "!" << llendl; |
661 | return retval; | ||
661 | } | 662 | } |
662 | 663 | ||
663 | U16 time_dilation16; | 664 | U16 time_dilation16; |
@@ -934,7 +935,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, | |||
934 | 935 | ||
935 | // Check for appended generic data | 936 | // Check for appended generic data |
936 | S32 data_size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_Data); | 937 | S32 data_size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_Data); |
937 | if (data_size == 0) | 938 | if (data_size <= 0) |
938 | { | 939 | { |
939 | mData = NULL; | 940 | mData = NULL; |
940 | } | 941 | } |
@@ -1757,9 +1758,16 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, | |||
1757 | if (gPingInterpolate) | 1758 | if (gPingInterpolate) |
1758 | { | 1759 | { |
1759 | LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mesgsys->getSender()); | 1760 | LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mesgsys->getSender()); |
1760 | F32 ping_delay = 0.5f * mTimeDilation * ( ((F32)cdp->getPingDelay()) * 0.001f + gFrameDTClamped); | 1761 | if (cdp) |
1761 | LLVector3 diff = getVelocity() * (0.5f*mTimeDilation*(gFrameDTClamped + ((F32)ping_delay)*0.001f)); | 1762 | { |
1762 | new_pos_parent += diff; | 1763 | F32 ping_delay = 0.5f * mTimeDilation * ( ((F32)cdp->getPingDelay()) * 0.001f + gFrameDTClamped); |
1764 | LLVector3 diff = getVelocity() * (0.5f*mTimeDilation*(gFrameDTClamped + ((F32)ping_delay)*0.001f)); | ||
1765 | new_pos_parent += diff; | ||
1766 | } | ||
1767 | else | ||
1768 | { | ||
1769 | llwarns << "findCircuit() returned NULL; skipping interpolation" << llendl; | ||
1770 | } | ||
1763 | } | 1771 | } |
1764 | 1772 | ||
1765 | ////////////////////////// | 1773 | ////////////////////////// |
@@ -4134,7 +4142,7 @@ void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& ow | |||
4134 | { | 4142 | { |
4135 | return; | 4143 | return; |
4136 | } | 4144 | } |
4137 | 4145 | ||
4138 | if (audio_uuid.isNull()) | 4146 | if (audio_uuid.isNull()) |
4139 | { | 4147 | { |
4140 | if (mAudioSourcep && mAudioSourcep->isLoop() && !mAudioSourcep->hasPendingPreloads()) | 4148 | if (mAudioSourcep && mAudioSourcep->isLoop() && !mAudioSourcep->hasPendingPreloads()) |
@@ -4169,7 +4177,8 @@ void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& ow | |||
4169 | } | 4177 | } |
4170 | } | 4178 | } |
4171 | 4179 | ||
4172 | if ( mAudioSourcep ) | 4180 | // don't clean up before previous sound is done. Solves: SL-33486 |
4181 | if ( mAudioSourcep && mAudioSourcep->isDone() ) | ||
4173 | { | 4182 | { |
4174 | gAudiop->cleanupAudioSource(mAudioSourcep); | 4183 | gAudiop->cleanupAudioSource(mAudioSourcep); |
4175 | mAudioSourcep = NULL; | 4184 | mAudioSourcep = NULL; |
diff --git a/linden/indra/newview/llviewerparceloverlay.cpp b/linden/indra/newview/llviewerparceloverlay.cpp index d5ad910..e31b714 100644 --- a/linden/indra/newview/llviewerparceloverlay.cpp +++ b/linden/indra/newview/llviewerparceloverlay.cpp | |||
@@ -485,20 +485,21 @@ void LLViewerParcelOverlay::updatePropertyLines() | |||
485 | // shuffling. | 485 | // shuffling. |
486 | S32 new_vertex_count = new_vertex_array.count(); | 486 | S32 new_vertex_count = new_vertex_array.count(); |
487 | 487 | ||
488 | // NOTE: If the new_vertex_count is 0 and wasn't 0 previously | 488 | if (!(mVertexArray && mColorArray && new_vertex_count == mVertexCount)) |
489 | // the arrays are still allocated as the arrays aren't set to NULL, etc. | ||
490 | // This won't cause any problems, but might waste a few cycles copying over | ||
491 | // old data. - jwolk | ||
492 | if ( !(mVertexArray && mColorArray && new_vertex_count == mVertexCount) && new_vertex_count > 0 ) | ||
493 | { | 489 | { |
494 | // ...need new arrays | 490 | // ...need new arrays |
495 | delete[] mVertexArray; | 491 | delete[] mVertexArray; |
492 | mVertexArray = NULL; | ||
496 | delete[] mColorArray; | 493 | delete[] mColorArray; |
494 | mColorArray = NULL; | ||
497 | 495 | ||
498 | mVertexCount = new_vertex_count; | 496 | mVertexCount = new_vertex_count; |
499 | 497 | ||
500 | mVertexArray = new F32[3 * mVertexCount]; | 498 | if (new_vertex_count > 0) |
501 | mColorArray = new U8 [4 * mVertexCount]; | 499 | { |
500 | mVertexArray = new F32[3 * mVertexCount]; | ||
501 | mColorArray = new U8 [4 * mVertexCount]; | ||
502 | } | ||
502 | } | 503 | } |
503 | 504 | ||
504 | // Copy the new data into the arrays | 505 | // Copy the new data into the arrays |
diff --git a/linden/indra/newview/llviewerwindow.cpp b/linden/indra/newview/llviewerwindow.cpp index 9498dbd..c57c84a 100644 --- a/linden/indra/newview/llviewerwindow.cpp +++ b/linden/indra/newview/llviewerwindow.cpp | |||
@@ -1504,27 +1504,8 @@ LLViewerWindow::LLViewerWindow( | |||
1504 | // stuff like AGP if we think that it'll crash the viewer. | 1504 | // stuff like AGP if we think that it'll crash the viewer. |
1505 | // | 1505 | // |
1506 | gFeatureManagerp->initGraphicsFeatureMasks(); | 1506 | gFeatureManagerp->initGraphicsFeatureMasks(); |
1507 | |||
1508 | // The ATI Mobility Radeon with 1.15.0 causes crashes in FMOD on startup for | ||
1509 | // unknown reasons, but only if you have an old settings.ini file. | ||
1510 | // In this case, force the graphics settings back to recommended, but only | ||
1511 | // do it once. JC | ||
1512 | std::string gpu_string = gFeatureManagerp->getGPUString(); | ||
1513 | LLString::toLower(gpu_string); | ||
1514 | bool upgrade_to_1_15 = (gSavedSettings.getString("LastRunVersion") != "1.15.0"); | ||
1515 | bool mobility_radeon = (gpu_string.find("mobility radeon") != std::string::npos); | ||
1516 | bool mobility_radeon_upgrade_hack = upgrade_to_1_15 && mobility_radeon; | ||
1517 | if (mobility_radeon_upgrade_hack) | ||
1518 | { | ||
1519 | llinfos << "1.15.0 update on Mobility Radeon" << llendl; | ||
1520 | llinfos << "Forcing recommended graphics settings" << llendl; | ||
1521 | llinfos << "Forcing audio off" << llendl; | ||
1522 | gUseAudio = FALSE; | ||
1523 | } | ||
1524 | |||
1525 | if (gFeatureManagerp->isSafe() | 1507 | if (gFeatureManagerp->isSafe() |
1526 | || (gSavedSettings.getS32("LastFeatureVersion") != gFeatureManagerp->getVersion()) | 1508 | || (gSavedSettings.getS32("LastFeatureVersion") != gFeatureManagerp->getVersion())) |
1527 | || mobility_radeon_upgrade_hack) | ||
1528 | { | 1509 | { |
1529 | gFeatureManagerp->applyRecommendedFeatures(); | 1510 | gFeatureManagerp->applyRecommendedFeatures(); |
1530 | } | 1511 | } |
@@ -1747,7 +1728,7 @@ void LLViewerWindow::initBase() | |||
1747 | mToolTip->setBorderVisible( FALSE ); | 1728 | mToolTip->setBorderVisible( FALSE ); |
1748 | mToolTip->setBackgroundColor( gColors.getColor( "ToolTipBgColor" ) ); | 1729 | mToolTip->setBackgroundColor( gColors.getColor( "ToolTipBgColor" ) ); |
1749 | mToolTip->setBackgroundVisible( TRUE ); | 1730 | mToolTip->setBackgroundVisible( TRUE ); |
1750 | mToolTip->setDropshadowVisible( FALSE ); | 1731 | mToolTip->setFontStyle(LLFontGL::NORMAL); |
1751 | mToolTip->setBorderDropshadowVisible( TRUE ); | 1732 | mToolTip->setBorderDropshadowVisible( TRUE ); |
1752 | mToolTip->setVisible( FALSE ); | 1733 | mToolTip->setVisible( FALSE ); |
1753 | 1734 | ||
diff --git a/linden/indra/newview/llvlcomposition.cpp b/linden/indra/newview/llvlcomposition.cpp index af0fe96..370bf24 100644 --- a/linden/indra/newview/llvlcomposition.cpp +++ b/linden/indra/newview/llvlcomposition.cpp | |||
@@ -126,6 +126,13 @@ BOOL LLVLComposition::generateHeights(const F32 x, const F32 y, | |||
126 | } | 126 | } |
127 | 127 | ||
128 | llassert(mSurfacep); | 128 | llassert(mSurfacep); |
129 | |||
130 | if (!mSurfacep || !mSurfacep->getRegion()) | ||
131 | { | ||
132 | // We don't always have the region yet here.... | ||
133 | return FALSE; | ||
134 | } | ||
135 | |||
129 | S32 x_begin, y_begin, x_end, y_end; | 136 | S32 x_begin, y_begin, x_end, y_end; |
130 | 137 | ||
131 | x_begin = llround( x * mScaleInv ); | 138 | x_begin = llround( x * mScaleInv ); |
diff --git a/linden/indra/newview/llvoavatar.cpp b/linden/indra/newview/llvoavatar.cpp index 25c6eb6..37380a4 100644 --- a/linden/indra/newview/llvoavatar.cpp +++ b/linden/indra/newview/llvoavatar.cpp | |||
@@ -1486,6 +1486,7 @@ void LLVOAvatar::initClass() | |||
1486 | if (!root) | 1486 | if (!root) |
1487 | { | 1487 | { |
1488 | llerrs << "No root node found in avatar configuration file: " << xmlFile << llendl; | 1488 | llerrs << "No root node found in avatar configuration file: " << xmlFile << llendl; |
1489 | return; | ||
1489 | } | 1490 | } |
1490 | 1491 | ||
1491 | //------------------------------------------------------------------------- | 1492 | //------------------------------------------------------------------------- |
@@ -1893,6 +1894,7 @@ void LLVOAvatar::buildCharacter() | |||
1893 | mEyeRightp)) | 1894 | mEyeRightp)) |
1894 | { | 1895 | { |
1895 | llerrs << "Failed to create avatar." << llendl; | 1896 | llerrs << "Failed to create avatar." << llendl; |
1897 | return; | ||
1896 | } | 1898 | } |
1897 | 1899 | ||
1898 | //------------------------------------------------------------------------- | 1900 | //------------------------------------------------------------------------- |
@@ -2461,7 +2463,7 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) | |||
2461 | 2463 | ||
2462 | if (LLVOAvatar::sJointDebug) | 2464 | if (LLVOAvatar::sJointDebug) |
2463 | { | 2465 | { |
2464 | llinfos << getNVPair("FirstName")->getString() << getNVPair("LastName")->getString() << ": joint touches: " << LLJoint::sNumTouches << " updates: " << LLJoint::sNumUpdates << llendl; | 2466 | llinfos << getFullname() << ": joint touches: " << LLJoint::sNumTouches << " updates: " << LLJoint::sNumUpdates << llendl; |
2465 | } | 2467 | } |
2466 | 2468 | ||
2467 | LLJoint::sNumUpdates = 0; | 2469 | LLJoint::sNumUpdates = 0; |
@@ -4809,7 +4811,7 @@ BOOL LLVOAvatar::allocateCollisionVolumes( U32 num ) | |||
4809 | LLJoint *LLVOAvatar::getCharacterJoint( U32 num ) | 4811 | LLJoint *LLVOAvatar::getCharacterJoint( U32 num ) |
4810 | { | 4812 | { |
4811 | if ((S32)num >= mNumJoints | 4813 | if ((S32)num >= mNumJoints |
4812 | || num < 0) | 4814 | || (S32)num < 0) |
4813 | { | 4815 | { |
4814 | return NULL; | 4816 | return NULL; |
4815 | } | 4817 | } |
diff --git a/linden/indra/newview/llvoclouds.cpp b/linden/indra/newview/llvoclouds.cpp index 24084cf..be7c1b1 100644 --- a/linden/indra/newview/llvoclouds.cpp +++ b/linden/indra/newview/llvoclouds.cpp | |||
@@ -126,6 +126,12 @@ BOOL LLVOClouds::updateGeometry(LLDrawable *drawable) | |||
126 | for ( ; face_indx < num_faces; face_indx++) | 126 | for ( ; face_indx < num_faces; face_indx++) |
127 | { | 127 | { |
128 | facep = drawable->getFace(face_indx); | 128 | facep = drawable->getFace(face_indx); |
129 | if (!facep) | ||
130 | { | ||
131 | llwarns << "No facep for index " << face_indx << llendl; | ||
132 | continue; | ||
133 | } | ||
134 | |||
129 | if (isParticle()) | 135 | if (isParticle()) |
130 | { | 136 | { |
131 | facep->setSize(1,1); | 137 | facep->setSize(1,1); |
@@ -143,6 +149,12 @@ BOOL LLVOClouds::updateGeometry(LLDrawable *drawable) | |||
143 | for ( ; face_indx < drawable->getNumFaces(); face_indx++) | 149 | for ( ; face_indx < drawable->getNumFaces(); face_indx++) |
144 | { | 150 | { |
145 | facep = drawable->getFace(face_indx); | 151 | facep = drawable->getFace(face_indx); |
152 | if (!facep) | ||
153 | { | ||
154 | llwarns << "No facep for index " << face_indx << llendl; | ||
155 | continue; | ||
156 | } | ||
157 | |||
146 | facep->setTEOffset(face_indx); | 158 | facep->setTEOffset(face_indx); |
147 | facep->setSize(0,0); | 159 | facep->setSize(0,0); |
148 | } | 160 | } |
diff --git a/linden/indra/newview/llvopartgroup.cpp b/linden/indra/newview/llvopartgroup.cpp index 28aeb29..fbf753a 100644 --- a/linden/indra/newview/llvopartgroup.cpp +++ b/linden/indra/newview/llvopartgroup.cpp | |||
@@ -151,7 +151,7 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable) | |||
151 | 151 | ||
152 | if (!num_parts) | 152 | if (!num_parts) |
153 | { | 153 | { |
154 | if (drawable->getNumFaces()) | 154 | if (group && drawable->getNumFaces()) |
155 | { | 155 | { |
156 | group->dirtyGeom(); | 156 | group->dirtyGeom(); |
157 | } | 157 | } |
@@ -206,6 +206,12 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable) | |||
206 | count++; | 206 | count++; |
207 | 207 | ||
208 | facep = drawable->getFace(i); | 208 | facep = drawable->getFace(i); |
209 | if (!facep) | ||
210 | { | ||
211 | llwarns << "No face found for index " << i << "!" << llendl; | ||
212 | continue; | ||
213 | } | ||
214 | |||
209 | facep->setTEOffset(i); | 215 | facep->setTEOffset(i); |
210 | const F32 NEAR_PART_DIST_SQ = 5.f*5.f; // Only discard particles > 5 m from the camera | 216 | const F32 NEAR_PART_DIST_SQ = 5.f*5.f; // Only discard particles > 5 m from the camera |
211 | const F32 MIN_PART_AREA = .005f*.005f; // only less than 5 mm x 5 mm at 1 m from camera | 217 | const F32 MIN_PART_AREA = .005f*.005f; // only less than 5 mm x 5 mm at 1 m from camera |
@@ -259,6 +265,11 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable) | |||
259 | for (i = count; i < drawable->getNumFaces(); i++) | 265 | for (i = count; i < drawable->getNumFaces(); i++) |
260 | { | 266 | { |
261 | LLFace* facep = drawable->getFace(i); | 267 | LLFace* facep = drawable->getFace(i); |
268 | if (!facep) | ||
269 | { | ||
270 | llwarns << "No face found for index " << i << "!" << llendl; | ||
271 | continue; | ||
272 | } | ||
262 | facep->setTEOffset(i); | 273 | facep->setTEOffset(i); |
263 | facep->setSize(0,0); | 274 | facep->setSize(0,0); |
264 | } | 275 | } |
diff --git a/linden/indra/newview/llwindebug.cpp b/linden/indra/newview/llwindebug.cpp index 6221b85..7433984 100644 --- a/linden/indra/newview/llwindebug.cpp +++ b/linden/indra/newview/llwindebug.cpp | |||
@@ -131,6 +131,8 @@ BOOL LLWinDebug::setupExceptionHandler() | |||
131 | if (!f_mdwp) | 131 | if (!f_mdwp) |
132 | { | 132 | { |
133 | write_debug("No MiniDumpWriteDump!\n"); | 133 | write_debug("No MiniDumpWriteDump!\n"); |
134 | FreeLibrary(hDll); | ||
135 | hDll = NULL; | ||
134 | ok = FALSE; | 136 | ok = FALSE; |
135 | } | 137 | } |
136 | } | 138 | } |
diff --git a/linden/indra/newview/llworldmap.cpp b/linden/indra/newview/llworldmap.cpp index f2a2c90..db7ac19 100644 --- a/linden/indra/newview/llworldmap.cpp +++ b/linden/indra/newview/llworldmap.cpp | |||
@@ -491,7 +491,7 @@ void LLWorldMap::processMapBlockReply(LLMessageSystem* msg, void**) | |||
491 | U32 agent_flags; | 491 | U32 agent_flags; |
492 | msg->getU32Fast(_PREHASH_AgentData, _PREHASH_Flags, agent_flags); | 492 | msg->getU32Fast(_PREHASH_AgentData, _PREHASH_Flags, agent_flags); |
493 | 493 | ||
494 | if (agent_flags < 0 || agent_flags >= MAP_SIM_IMAGE_TYPES) | 494 | if ((S32)agent_flags < 0 || agent_flags >= MAP_SIM_IMAGE_TYPES) |
495 | { | 495 | { |
496 | llwarns << "Invalid map image type returned! " << agent_flags << llendl; | 496 | llwarns << "Invalid map image type returned! " << agent_flags << llendl; |
497 | return; | 497 | return; |
diff --git a/linden/indra/newview/llworldmapview.cpp b/linden/indra/newview/llworldmapview.cpp index 01dd1b8..328af72 100644 --- a/linden/indra/newview/llworldmapview.cpp +++ b/linden/indra/newview/llworldmapview.cpp | |||
@@ -178,7 +178,6 @@ LLWorldMapView::LLWorldMapView(const std::string& name, const LLRect& rect ) | |||
178 | LLRect major_dir_rect( 0, DIR_HEIGHT, DIR_WIDTH, 0 ); | 178 | LLRect major_dir_rect( 0, DIR_HEIGHT, DIR_WIDTH, 0 ); |
179 | 179 | ||
180 | mTextBoxNorth = new LLTextBox( "N", major_dir_rect ); | 180 | mTextBoxNorth = new LLTextBox( "N", major_dir_rect ); |
181 | mTextBoxNorth->setDropshadowVisible( TRUE ); | ||
182 | addChild( mTextBoxNorth ); | 181 | addChild( mTextBoxNorth ); |
183 | 182 | ||
184 | LLColor4 minor_color( 1.f, 1.f, 1.f, .7f ); | 183 | LLColor4 minor_color( 1.f, 1.f, 1.f, .7f ); |
diff --git a/linden/indra/newview/macview.xcodeproj/project.pbxproj b/linden/indra/newview/macview.xcodeproj/project.pbxproj index 9534878..8bc52b1 100644 --- a/linden/indra/newview/macview.xcodeproj/project.pbxproj +++ b/linden/indra/newview/macview.xcodeproj/project.pbxproj | |||
@@ -40,6 +40,8 @@ | |||
40 | 1A758C940A436FD800589675 /* llpanellandobjects.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A758C930A436FD800589675 /* llpanellandobjects.cpp */; }; | 40 | 1A758C940A436FD800589675 /* llpanellandobjects.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A758C930A436FD800589675 /* llpanellandobjects.cpp */; }; |
41 | 1A758C960A436FDE00589675 /* llpanellandoptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A758C950A436FDE00589675 /* llpanellandoptions.cpp */; }; | 41 | 1A758C960A436FDE00589675 /* llpanellandoptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A758C950A436FDE00589675 /* llpanellandoptions.cpp */; }; |
42 | 1A83767E0BA2169600F28979 /* llviewergenericmessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A83767D0BA2169600F28979 /* llviewergenericmessage.cpp */; }; | 42 | 1A83767E0BA2169600F28979 /* llviewergenericmessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A83767D0BA2169600F28979 /* llviewergenericmessage.cpp */; }; |
43 | 1A8870D50BCC5A6300E89AA6 /* llinventorytype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A8870D40BCC5A6300E89AA6 /* llinventorytype.cpp */; }; | ||
44 | 1A8870E50BCC5A9500E89AA6 /* llviewermenufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A8870E40BCC5A9500E89AA6 /* llviewermenufile.cpp */; }; | ||
43 | 1A89230508B12D1000A04AA9 /* llurlwhitelist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A89230308B12D1000A04AA9 /* llurlwhitelist.cpp */; }; | 45 | 1A89230508B12D1000A04AA9 /* llurlwhitelist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A89230308B12D1000A04AA9 /* llurlwhitelist.cpp */; }; |
44 | 1A89230808B12D2E00A04AA9 /* llfloateropenobject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A89230608B12D2E00A04AA9 /* llfloateropenobject.cpp */; }; | 46 | 1A89230808B12D2E00A04AA9 /* llfloateropenobject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A89230608B12D2E00A04AA9 /* llfloateropenobject.cpp */; }; |
45 | 1A89230A08B12D9900A04AA9 /* llmediabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A89230908B12D9800A04AA9 /* llmediabase.cpp */; }; | 47 | 1A89230A08B12D9900A04AA9 /* llmediabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A89230908B12D9800A04AA9 /* llmediabase.cpp */; }; |
@@ -850,6 +852,11 @@ | |||
850 | 1A758C990A43700400589675 /* llagentdata.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llagentdata.h; sourceTree = "<group>"; }; | 852 | 1A758C990A43700400589675 /* llagentdata.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llagentdata.h; sourceTree = "<group>"; }; |
851 | 1A83767C0BA2169600F28979 /* llviewergenericmessage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llviewergenericmessage.h; sourceTree = "<group>"; }; | 853 | 1A83767C0BA2169600F28979 /* llviewergenericmessage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llviewergenericmessage.h; sourceTree = "<group>"; }; |
852 | 1A83767D0BA2169600F28979 /* llviewergenericmessage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llviewergenericmessage.cpp; sourceTree = "<group>"; }; | 854 | 1A83767D0BA2169600F28979 /* llviewergenericmessage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llviewergenericmessage.cpp; sourceTree = "<group>"; }; |
855 | 1A8870D30BCC5A6300E89AA6 /* llinventorytype.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llinventorytype.h; sourceTree = "<group>"; }; | ||
856 | 1A8870D40BCC5A6300E89AA6 /* llinventorytype.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llinventorytype.cpp; sourceTree = "<group>"; }; | ||
857 | 1A8870E30BCC5A9500E89AA6 /* llviewermenufile.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llviewermenufile.h; sourceTree = "<group>"; }; | ||
858 | 1A8870E40BCC5A9500E89AA6 /* llviewermenufile.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llviewermenufile.cpp; sourceTree = "<group>"; }; | ||
859 | 1A8870E60BCC5AAD00E89AA6 /* llresourcedata.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llresourcedata.h; sourceTree = "<group>"; }; | ||
853 | 1A89230308B12D1000A04AA9 /* llurlwhitelist.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llurlwhitelist.cpp; sourceTree = "<group>"; }; | 860 | 1A89230308B12D1000A04AA9 /* llurlwhitelist.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llurlwhitelist.cpp; sourceTree = "<group>"; }; |
854 | 1A89230408B12D1000A04AA9 /* llurlwhitelist.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llurlwhitelist.h; sourceTree = "<group>"; }; | 861 | 1A89230408B12D1000A04AA9 /* llurlwhitelist.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llurlwhitelist.h; sourceTree = "<group>"; }; |
855 | 1A89230608B12D2E00A04AA9 /* llfloateropenobject.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloateropenobject.cpp; sourceTree = "<group>"; }; | 862 | 1A89230608B12D2E00A04AA9 /* llfloateropenobject.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloateropenobject.cpp; sourceTree = "<group>"; }; |
@@ -2334,6 +2341,8 @@ | |||
2334 | 1A83767C0BA2169600F28979 /* llviewergenericmessage.h */, | 2341 | 1A83767C0BA2169600F28979 /* llviewergenericmessage.h */, |
2335 | 1A83767D0BA2169600F28979 /* llviewergenericmessage.cpp */, | 2342 | 1A83767D0BA2169600F28979 /* llviewergenericmessage.cpp */, |
2336 | 9C18425A0B9F951500208356 /* llcaphttpsender.cpp */, | 2343 | 9C18425A0B9F951500208356 /* llcaphttpsender.cpp */, |
2344 | 1A8870E30BCC5A9500E89AA6 /* llviewermenufile.h */, | ||
2345 | 1A8870E40BCC5A9500E89AA6 /* llviewermenufile.cpp */, | ||
2337 | A3C20E4B0BB0BD12007E872B /* llviewerjoystick.cpp */, | 2346 | A3C20E4B0BB0BD12007E872B /* llviewerjoystick.cpp */, |
2338 | A3C20E490BB0BCDF007E872B /* llglslshader.cpp */, | 2347 | A3C20E490BB0BCDF007E872B /* llglslshader.cpp */, |
2339 | AAF5FFD00B13F71900D28A84 /* lltexturecache.cpp */, | 2348 | AAF5FFD00B13F71900D28A84 /* lltexturecache.cpp */, |
@@ -2863,6 +2872,8 @@ | |||
2863 | 6192217F074A9B58005E1F34 /* llinventory */ = { | 2872 | 6192217F074A9B58005E1F34 /* llinventory */ = { |
2864 | isa = PBXGroup; | 2873 | isa = PBXGroup; |
2865 | children = ( | 2874 | children = ( |
2875 | 1A8870D30BCC5A6300E89AA6 /* llinventorytype.h */, | ||
2876 | 1A8870D40BCC5A6300E89AA6 /* llinventorytype.cpp */, | ||
2866 | 913B26970B4DDCDA0030C3EC /* lllandmark.cpp */, | 2877 | 913B26970B4DDCDA0030C3EC /* lllandmark.cpp */, |
2867 | 913B26980B4DDCDA0030C3EC /* lllandmark.h */, | 2878 | 913B26980B4DDCDA0030C3EC /* lllandmark.h */, |
2868 | C1F5D0A30B138AEB00827F1D /* lluserrelations.cpp */, | 2879 | C1F5D0A30B138AEB00827F1D /* lluserrelations.cpp */, |
@@ -3499,6 +3510,7 @@ | |||
3499 | isa = PBXGroup; | 3510 | isa = PBXGroup; |
3500 | children = ( | 3511 | children = ( |
3501 | 9C1842500B9F94F200208356 /* llcaphttpsender.h */, | 3512 | 9C1842500B9F94F200208356 /* llcaphttpsender.h */, |
3513 | 1A8870E60BCC5AAD00E89AA6 /* llresourcedata.h */, | ||
3502 | A3C20E4E0BB0BD49007E872B /* llviewerjoystick.h */, | 3514 | A3C20E4E0BB0BD49007E872B /* llviewerjoystick.h */, |
3503 | A3C20E4D0BB0BD37007E872B /* llglslshader.h */, | 3515 | A3C20E4D0BB0BD37007E872B /* llglslshader.h */, |
3504 | 1AF7C1F20AF6C45000C4BF4A /* llweb.h */, | 3516 | 1AF7C1F20AF6C45000C4BF4A /* llweb.h */, |
@@ -4538,6 +4550,8 @@ | |||
4538 | 9C659A870BAB0B6E00D2EB60 /* llmessageconfig.cpp in Sources */, | 4550 | 9C659A870BAB0B6E00D2EB60 /* llmessageconfig.cpp in Sources */, |
4539 | A3C20E4A0BB0BCDF007E872B /* llglslshader.cpp in Sources */, | 4551 | A3C20E4A0BB0BCDF007E872B /* llglslshader.cpp in Sources */, |
4540 | A3C20E4C0BB0BD12007E872B /* llviewerjoystick.cpp in Sources */, | 4552 | A3C20E4C0BB0BD12007E872B /* llviewerjoystick.cpp in Sources */, |
4553 | 1A8870D50BCC5A6300E89AA6 /* llinventorytype.cpp in Sources */, | ||
4554 | 1A8870E50BCC5A9500E89AA6 /* llviewermenufile.cpp in Sources */, | ||
4541 | ); | 4555 | ); |
4542 | runOnlyForDeploymentPostprocessing = 0; | 4556 | runOnlyForDeploymentPostprocessing = 0; |
4543 | }; | 4557 | }; |
diff --git a/linden/indra/newview/newview.vcproj b/linden/indra/newview/newview.vcproj index 33c2d90..699a2bc 100644 --- a/linden/indra/newview/newview.vcproj +++ b/linden/indra/newview/newview.vcproj | |||
@@ -1121,6 +1121,9 @@ | |||
1121 | RelativePath=".\llviewermenu.cpp"> | 1121 | RelativePath=".\llviewermenu.cpp"> |
1122 | </File> | 1122 | </File> |
1123 | <File | 1123 | <File |
1124 | RelativePath=".\llviewermenufile.cpp"> | ||
1125 | </File> | ||
1126 | <File | ||
1124 | RelativePath=".\llviewermessage.cpp"> | 1127 | RelativePath=".\llviewermessage.cpp"> |
1125 | </File> | 1128 | </File> |
1126 | <File | 1129 | <File |
@@ -1942,6 +1945,9 @@ | |||
1942 | RelativePath=".\llregionposition.h"> | 1945 | RelativePath=".\llregionposition.h"> |
1943 | </File> | 1946 | </File> |
1944 | <File | 1947 | <File |
1948 | RelativePath=".\llresourcedata.h"> | ||
1949 | </File> | ||
1950 | <File | ||
1945 | RelativePath=".\llrig.h"> | 1951 | RelativePath=".\llrig.h"> |
1946 | </File> | 1952 | </File> |
1947 | <File | 1953 | <File |
@@ -2146,6 +2152,9 @@ | |||
2146 | RelativePath=".\llviewermenu.h"> | 2152 | RelativePath=".\llviewermenu.h"> |
2147 | </File> | 2153 | </File> |
2148 | <File | 2154 | <File |
2155 | RelativePath=".\llviewermenufile.h"> | ||
2156 | </File> | ||
2157 | <File | ||
2149 | RelativePath=".\llviewermessage.h"> | 2158 | RelativePath=".\llviewermessage.h"> |
2150 | </File> | 2159 | </File> |
2151 | <File | 2160 | <File |
@@ -2863,6 +2872,9 @@ | |||
2863 | </File> | 2872 | </File> |
2864 | </Filter> | 2873 | </Filter> |
2865 | <File | 2874 | <File |
2875 | RelativePath=".\files.lst"> | ||
2876 | </File> | ||
2877 | <File | ||
2866 | RelativePath=".\llviewerprecompiledheaders.cpp"> | 2878 | RelativePath=".\llviewerprecompiledheaders.cpp"> |
2867 | <FileConfiguration | 2879 | <FileConfiguration |
2868 | Name="Debug|Win32"> | 2880 | Name="Debug|Win32"> |
diff --git a/linden/indra/newview/newview_vc8.vcproj b/linden/indra/newview/newview_vc8.vcproj index e98c4ed..4cb359b 100644 --- a/linden/indra/newview/newview_vc8.vcproj +++ b/linden/indra/newview/newview_vc8.vcproj | |||
@@ -41,13 +41,12 @@ | |||
41 | <Tool | 41 | <Tool |
42 | Name="VCCLCompilerTool" | 42 | Name="VCCLCompilerTool" |
43 | Optimization="0" | 43 | Optimization="0" |
44 | AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;"..\..\libraries\i686-win32\include";..\..\libraries\include\;"..\..\libraries\i686-win32\include\quicktime"" | 44 | AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;"..\..\libraries\i686-win32\include";..\..\libraries\include\;"..\..\libraries\i686-win32\include\quicktime";..\llwindow\Logitech_LCD;..\llwindow\Logitech_LCD\LCDUI" |
45 | PreprocessorDefinitions="WIN32;_DEBUG;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_DEBUG;XP_WIN;XP_WIN32;MOZILLA_INTERNAL_API" | 45 | PreprocessorDefinitions="WIN32;_DEBUG;LL_WINDOWS;LL_DEBUG;XP_WIN;XP_WIN32;MOZILLA_INTERNAL_API" |
46 | MinimalRebuild="false" | 46 | MinimalRebuild="false" |
47 | BasicRuntimeChecks="3" | 47 | BasicRuntimeChecks="3" |
48 | RuntimeLibrary="1" | 48 | RuntimeLibrary="1" |
49 | StructMemberAlignment="4" | 49 | StructMemberAlignment="4" |
50 | TreatWChar_tAsBuiltInType="false" | ||
51 | ForceConformanceInForLoopScope="true" | 50 | ForceConformanceInForLoopScope="true" |
52 | UsePrecompiledHeader="0" | 51 | UsePrecompiledHeader="0" |
53 | PrecompiledHeaderThrough="llviewerprecompiledheaders.h" | 52 | PrecompiledHeaderThrough="llviewerprecompiledheaders.h" |
@@ -67,7 +66,7 @@ | |||
67 | /> | 66 | /> |
68 | <Tool | 67 | <Tool |
69 | Name="VCLinkerTool" | 68 | Name="VCLinkerTool" |
70 | AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc80-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib LibOpenJPEG.lib llaudio.lib llmedia.lib llcharacter.lib llcommon.lib llimage.lib llimagej2coj.lib llinventory.lib llmath.lib llmessage.lib llmozlib-vc80.lib llprimitive.lib llrender.lib llui.lib llvfs.lib llwindow.lib llxml.lib lscript_library.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib" | 69 | AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc71-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib LibOpenJPEG.lib llmozlib.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib lglcd.lib" |
71 | OutputFile="$(ConfigurationName)/debugview.exe" | 70 | OutputFile="$(ConfigurationName)/debugview.exe" |
72 | LinkIncremental="2" | 71 | LinkIncremental="2" |
73 | AdditionalLibraryDirectories=""../lib_$(ConfigurationName)/i686-win32";"../../libraries/i686-win32/lib_debug"" | 72 | AdditionalLibraryDirectories=""../lib_$(ConfigurationName)/i686-win32";"../../libraries/i686-win32/lib_debug"" |
@@ -133,7 +132,7 @@ | |||
133 | Name="VCCLCompilerTool" | 132 | Name="VCCLCompilerTool" |
134 | InlineFunctionExpansion="2" | 133 | InlineFunctionExpansion="2" |
135 | EnableIntrinsicFunctions="true" | 134 | EnableIntrinsicFunctions="true" |
136 | AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;"..\..\libraries\i686-win32\include";..\..\libraries\include\;"..\..\libraries\i686-win32\include\quicktime"" | 135 | AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;"..\..\libraries\i686-win32\include";..\..\libraries\include\;"..\..\libraries\i686-win32\include\quicktime";..\llwindow\Logitech_LCD;..\llwindow\Logitech_LCD\LCDUI" |
137 | PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_RELEASE;XP_WIN;XP_WIN32;MOZILLA_INTERNAL_API" | 136 | PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_RELEASE;XP_WIN;XP_WIN32;MOZILLA_INTERNAL_API" |
138 | StringPooling="true" | 137 | StringPooling="true" |
139 | RuntimeLibrary="0" | 138 | RuntimeLibrary="0" |
@@ -158,7 +157,7 @@ | |||
158 | /> | 157 | /> |
159 | <Tool | 158 | <Tool |
160 | Name="VCLinkerTool" | 159 | Name="VCLinkerTool" |
161 | AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc80-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib LibOpenJPEG.lib llaudio.lib llmedia.lib llcharacter.lib llcommon.lib llimage.lib llimagej2coj.lib llinventory.lib llmath.lib llmessage.lib llmozlib-vc80.lib llprimitive.lib llrender.lib llui.lib llvfs.lib llwindow.lib llxml.lib lscript_library.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib" | 160 | AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc80-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib LibOpenJPEG.lib llaudio.lib llmedia.lib llcharacter.lib llcommon.lib llimage.lib llimagej2coj.lib llinventory.lib llmath.lib llmessage.lib llmozlib-vc80.lib llprimitive.lib llrender.lib llui.lib llvfs.lib llwindow.lib llxml.lib lscript_library.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib lglcd.lib" |
162 | OutputFile="$(ConfigurationName)/newview.exe" | 161 | OutputFile="$(ConfigurationName)/newview.exe" |
163 | LinkIncremental="2" | 162 | LinkIncremental="2" |
164 | AdditionalLibraryDirectories=""../lib_$(ConfigurationName)/i686-win32";"../../libraries/i686-win32/lib_release"" | 163 | AdditionalLibraryDirectories=""../lib_$(ConfigurationName)/i686-win32";"../../libraries/i686-win32/lib_release"" |
@@ -225,12 +224,10 @@ | |||
225 | /> | 224 | /> |
226 | <Tool | 225 | <Tool |
227 | Name="VCCLCompilerTool" | 226 | Name="VCCLCompilerTool" |
228 | WholeProgramOptimization="true" | 227 | AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;"..\..\libraries\i686-win32\include";..\..\libraries\include\;"..\..\libraries\i686-win32\include\quicktime";..\llwindow\Logitech_LCD;..\llwindow\Logitech_LCD\LCDUI" |
229 | AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;"..\..\libraries\i686-win32\include";..\..\libraries\include\;"..\..\libraries\i686-win32\include\quicktime"" | 228 | PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;LL_RELEASE;LL_RELEASE_FOR_DOWNLOAD;XP_WIN;XP_WIN32;MOZILLA_INTERNAL_API" |
230 | PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_RELEASE;LL_RELEASE_FOR_DOWNLOAD;XP_WIN;XP_WIN32;MOZILLA_INTERNAL_API" | ||
231 | RuntimeLibrary="0" | 229 | RuntimeLibrary="0" |
232 | StructMemberAlignment="0" | 230 | StructMemberAlignment="0" |
233 | TreatWChar_tAsBuiltInType="false" | ||
234 | UsePrecompiledHeader="2" | 231 | UsePrecompiledHeader="2" |
235 | PrecompiledHeaderThrough="llviewerprecompiledheaders.h" | 232 | PrecompiledHeaderThrough="llviewerprecompiledheaders.h" |
236 | WarningLevel="3" | 233 | WarningLevel="3" |
@@ -249,7 +246,7 @@ | |||
249 | /> | 246 | /> |
250 | <Tool | 247 | <Tool |
251 | Name="VCLinkerTool" | 248 | Name="VCLinkerTool" |
252 | AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc80-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib LibOpenJPEG.lib llaudio.lib llmedia.lib llcharacter.lib llcommon.lib llimage.lib llimagej2coj.lib llinventory.lib llmath.lib llmessage.lib llmozlib-vc80.lib llprimitive.lib llrender.lib llui.lib llvfs.lib llwindow.lib llxml.lib lscript_library.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib" | 249 | AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc71-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib LibOpenJPEG.lib llaudio.lib llmedia.lib llcharacter.lib llcommon.lib llimage.lib llimagej2coj.lib llinventory.lib llmath.lib llmessage.lib llmozlib.lib llprimitive.lib llrender.lib llui.lib llvfs.lib llwindow.lib llxml.lib lscript_library.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib lglcd.lib" |
253 | OutputFile="$(ConfigurationName)/SecondLife.exe" | 250 | OutputFile="$(ConfigurationName)/SecondLife.exe" |
254 | LinkIncremental="0" | 251 | LinkIncremental="0" |
255 | AdditionalLibraryDirectories=""../lib_release/i686-win32";"../../libraries/i686-win32/lib_release"" | 252 | AdditionalLibraryDirectories=""../lib_release/i686-win32";"../../libraries/i686-win32/lib_release"" |
@@ -259,7 +256,6 @@ | |||
259 | SubSystem="2" | 256 | SubSystem="2" |
260 | OptimizeReferences="2" | 257 | OptimizeReferences="2" |
261 | EnableCOMDATFolding="2" | 258 | EnableCOMDATFolding="2" |
262 | LinkTimeCodeGeneration="1" | ||
263 | TargetMachine="1" | 259 | TargetMachine="1" |
264 | /> | 260 | /> |
265 | <Tool | 261 | <Tool |
@@ -315,15 +311,13 @@ | |||
315 | <Tool | 311 | <Tool |
316 | Name="VCCLCompilerTool" | 312 | Name="VCCLCompilerTool" |
317 | Optimization="0" | 313 | Optimization="0" |
318 | AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;"..\..\libraries\i686-win32\include";..\..\libraries\include\;"..\..\libraries\i686-win32\include\quicktime"" | 314 | AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;"..\..\libraries\i686-win32\include";..\..\libraries\include\;"..\..\libraries\i686-win32\include\quicktime";..\llwindow\Logitech_LCD;..\llwindow\Logitech_LCD\LCDUI" |
319 | PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_RELEASE;XP_WIN;XP_WIN32;MOZILLA_INTERNAL_API" | 315 | PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;LL_RELEASE;XP_WIN;XP_WIN32;MOZILLA_INTERNAL_API" |
320 | RuntimeLibrary="0" | 316 | RuntimeLibrary="0" |
321 | StructMemberAlignment="0" | 317 | StructMemberAlignment="0" |
322 | TreatWChar_tAsBuiltInType="false" | ||
323 | ForceConformanceInForLoopScope="true" | 318 | ForceConformanceInForLoopScope="true" |
324 | UsePrecompiledHeader="2" | 319 | UsePrecompiledHeader="2" |
325 | PrecompiledHeaderThrough="llviewerprecompiledheaders.h" | 320 | PrecompiledHeaderThrough="llviewerprecompiledheaders.h" |
326 | BrowseInformation="1" | ||
327 | WarningLevel="3" | 321 | WarningLevel="3" |
328 | WarnAsError="true" | 322 | WarnAsError="true" |
329 | Detect64BitPortabilityProblems="false" | 323 | Detect64BitPortabilityProblems="false" |
@@ -340,7 +334,7 @@ | |||
340 | /> | 334 | /> |
341 | <Tool | 335 | <Tool |
342 | Name="VCLinkerTool" | 336 | Name="VCLinkerTool" |
343 | AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc80-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib LibOpenJPEG.lib llaudio.lib llmedia.lib llcharacter.lib llcommon.lib llimage.lib llimagej2coj.lib llinventory.lib llmath.lib llmessage.lib llmozlib-vc80.lib llprimitive.lib llrender.lib llui.lib llvfs.lib llwindow.lib llxml.lib lscript_library.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib" | 337 | AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc71-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib LibOpenJPEG.lib llmozlib.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib lglcd.lib" |
344 | OutputFile="$(ConfigurationName)/newview_noopt.exe" | 338 | OutputFile="$(ConfigurationName)/newview_noopt.exe" |
345 | LinkIncremental="2" | 339 | LinkIncremental="2" |
346 | AdditionalLibraryDirectories=""../lib_releasenoopt/i686-win32";"../../libraries/i686-win32/lib_release"" | 340 | AdditionalLibraryDirectories=""../lib_releasenoopt/i686-win32";"../../libraries/i686-win32/lib_release"" |
@@ -979,6 +973,10 @@ | |||
979 | > | 973 | > |
980 | </File> | 974 | </File> |
981 | <File | 975 | <File |
976 | RelativePath=".\lllcd.cpp" | ||
977 | > | ||
978 | </File> | ||
979 | <File | ||
982 | RelativePath=".\lllocalanimationobject.cpp" | 980 | RelativePath=".\lllocalanimationobject.cpp" |
983 | > | 981 | > |
984 | </File> | 982 | </File> |
@@ -1175,6 +1173,10 @@ | |||
1175 | > | 1173 | > |
1176 | </File> | 1174 | </File> |
1177 | <File | 1175 | <File |
1176 | RelativePath=".\llpanelLCD.cpp" | ||
1177 | > | ||
1178 | </File> | ||
1179 | <File | ||
1178 | RelativePath=".\llpanellogin.cpp" | 1180 | RelativePath=".\llpanellogin.cpp" |
1179 | > | 1181 | > |
1180 | </File> | 1182 | </File> |
@@ -1753,10 +1755,6 @@ | |||
1753 | > | 1755 | > |
1754 | </File> | 1756 | </File> |
1755 | <File | 1757 | <File |
1756 | RelativePath=".\llagparray.h" | ||
1757 | > | ||
1758 | </File> | ||
1759 | <File | ||
1760 | RelativePath=".\llanimalcontrols.h" | 1758 | RelativePath=".\llanimalcontrols.h" |
1761 | > | 1759 | > |
1762 | </File> | 1760 | </File> |
@@ -1893,18 +1891,10 @@ | |||
1893 | > | 1891 | > |
1894 | </File> | 1892 | </File> |
1895 | <File | 1893 | <File |
1896 | RelativePath=".\lldrawpoolclouds.h" | ||
1897 | > | ||
1898 | </File> | ||
1899 | <File | ||
1900 | RelativePath=".\lldrawpoolground.h" | 1894 | RelativePath=".\lldrawpoolground.h" |
1901 | > | 1895 | > |
1902 | </File> | 1896 | </File> |
1903 | <File | 1897 | <File |
1904 | RelativePath=".\lldrawpoolhud.h" | ||
1905 | > | ||
1906 | </File> | ||
1907 | <File | ||
1908 | RelativePath=".\lldrawpoolsimple.h" | 1898 | RelativePath=".\lldrawpoolsimple.h" |
1909 | > | 1899 | > |
1910 | </File> | 1900 | </File> |
@@ -1925,10 +1915,6 @@ | |||
1925 | > | 1915 | > |
1926 | </File> | 1916 | </File> |
1927 | <File | 1917 | <File |
1928 | RelativePath=".\lldrawpooltreenew.h" | ||
1929 | > | ||
1930 | </File> | ||
1931 | <File | ||
1932 | RelativePath=".\lldrawpoolwater.h" | 1918 | RelativePath=".\lldrawpoolwater.h" |
1933 | > | 1919 | > |
1934 | </File> | 1920 | </File> |
@@ -2337,6 +2323,10 @@ | |||
2337 | > | 2323 | > |
2338 | </File> | 2324 | </File> |
2339 | <File | 2325 | <File |
2326 | RelativePath=".\lllcd.h" | ||
2327 | > | ||
2328 | </File> | ||
2329 | <File | ||
2340 | RelativePath=".\lllightconstants.h" | 2330 | RelativePath=".\lllightconstants.h" |
2341 | > | 2331 | > |
2342 | </File> | 2332 | </File> |
@@ -2537,6 +2527,10 @@ | |||
2537 | > | 2527 | > |
2538 | </File> | 2528 | </File> |
2539 | <File | 2529 | <File |
2530 | RelativePath=".\llpanelLCD.h" | ||
2531 | > | ||
2532 | </File> | ||
2533 | <File | ||
2540 | RelativePath=".\llpanellogin.h" | 2534 | RelativePath=".\llpanellogin.h" |
2541 | > | 2535 | > |
2542 | </File> | 2536 | </File> |
@@ -3041,10 +3035,6 @@ | |||
3041 | > | 3035 | > |
3042 | </File> | 3036 | </File> |
3043 | <File | 3037 | <File |
3044 | RelativePath=".\llvotreenew.h" | ||
3045 | > | ||
3046 | </File> | ||
3047 | <File | ||
3048 | RelativePath=".\llvovolume.h" | 3038 | RelativePath=".\llvovolume.h" |
3049 | > | 3039 | > |
3050 | </File> | 3040 | </File> |
@@ -3487,6 +3477,10 @@ | |||
3487 | > | 3477 | > |
3488 | </File> | 3478 | </File> |
3489 | <File | 3479 | <File |
3480 | RelativePath=".\res\icon1.ico" | ||
3481 | > | ||
3482 | </File> | ||
3483 | <File | ||
3490 | RelativePath=".\Info-SecondLife.plist" | 3484 | RelativePath=".\Info-SecondLife.plist" |
3491 | > | 3485 | > |
3492 | </File> | 3486 | </File> |
@@ -3507,6 +3501,10 @@ | |||
3507 | > | 3501 | > |
3508 | </File> | 3502 | </File> |
3509 | <File | 3503 | <File |
3504 | RelativePath=".\skins\xui\en-us\LCD_text.xml" | ||
3505 | > | ||
3506 | </File> | ||
3507 | <File | ||
3510 | RelativePath=".\res\ll_icon.ico" | 3508 | RelativePath=".\res\ll_icon.ico" |
3511 | > | 3509 | > |
3512 | </File> | 3510 | </File> |
@@ -3751,6 +3749,10 @@ | |||
3751 | > | 3749 | > |
3752 | </File> | 3750 | </File> |
3753 | <File | 3751 | <File |
3752 | RelativePath=".\skins\xui\en-us\panel_preferences_LCD.xml" | ||
3753 | > | ||
3754 | </File> | ||
3755 | <File | ||
3754 | RelativePath=".\skins\xui\en-us\panel_preferences_network.xml" | 3756 | RelativePath=".\skins\xui\en-us\panel_preferences_network.xml" |
3755 | > | 3757 | > |
3756 | </File> | 3758 | </File> |
diff --git a/linden/indra/newview/pipeline.cpp b/linden/indra/newview/pipeline.cpp index 5d4618e..d030ac2 100644 --- a/linden/indra/newview/pipeline.cpp +++ b/linden/indra/newview/pipeline.cpp | |||
@@ -768,6 +768,7 @@ void LLPipeline::updateMoveDampedAsync(LLDrawable* drawablep) | |||
768 | if (!drawablep) | 768 | if (!drawablep) |
769 | { | 769 | { |
770 | llerrs << "updateMove called with NULL drawablep" << llendl; | 770 | llerrs << "updateMove called with NULL drawablep" << llendl; |
771 | return; | ||
771 | } | 772 | } |
772 | if (drawablep->isState(LLDrawable::EARLY_MOVE)) | 773 | if (drawablep->isState(LLDrawable::EARLY_MOVE)) |
773 | { | 774 | { |
@@ -1124,7 +1125,7 @@ void LLPipeline::updateGeom(F32 max_dtime) | |||
1124 | last_bridge = bridge; | 1125 | last_bridge = bridge; |
1125 | 1126 | ||
1126 | BOOL update_complete = TRUE; | 1127 | BOOL update_complete = TRUE; |
1127 | if (drawablep && !drawablep->isDead()) | 1128 | if (!drawablep->isDead()) |
1128 | { | 1129 | { |
1129 | update_complete = updateDrawableGeom(drawablep, FALSE); | 1130 | update_complete = updateDrawableGeom(drawablep, FALSE); |
1130 | count++; | 1131 | count++; |
@@ -1398,7 +1399,9 @@ void LLPipeline::stateSort(LLDrawable* drawablep, LLCamera& camera) | |||
1398 | LLMemType mt(LLMemType::MTYPE_PIPELINE); | 1399 | LLMemType mt(LLMemType::MTYPE_PIPELINE); |
1399 | LLFastTimer ftm(LLFastTimer::FTM_STATESORT_DRAWABLE); | 1400 | LLFastTimer ftm(LLFastTimer::FTM_STATESORT_DRAWABLE); |
1400 | 1401 | ||
1401 | if (drawablep->isDead() || !hasRenderType(drawablep->getRenderType())) | 1402 | if (!drawablep |
1403 | || drawablep->isDead() | ||
1404 | || !hasRenderType(drawablep->getRenderType())) | ||
1402 | { | 1405 | { |
1403 | return; | 1406 | return; |
1404 | } | 1407 | } |
@@ -1412,7 +1415,7 @@ void LLPipeline::stateSort(LLDrawable* drawablep, LLCamera& camera) | |||
1412 | } | 1415 | } |
1413 | } | 1416 | } |
1414 | 1417 | ||
1415 | if (drawablep && (hasRenderType(drawablep->mRenderType))) | 1418 | if (hasRenderType(drawablep->mRenderType)) |
1416 | { | 1419 | { |
1417 | if (!drawablep->isState(LLDrawable::INVISIBLE|LLDrawable::FORCE_INVISIBLE)) | 1420 | if (!drawablep->isState(LLDrawable::INVISIBLE|LLDrawable::FORCE_INVISIBLE)) |
1418 | { | 1421 | { |
@@ -1835,6 +1838,7 @@ void LLPipeline::renderHighlights() | |||
1835 | if (!facep || facep->getDrawable()->isDead()) | 1838 | if (!facep || facep->getDrawable()->isDead()) |
1836 | { | 1839 | { |
1837 | llerrs << "Bad face on selection" << llendl; | 1840 | llerrs << "Bad face on selection" << llendl; |
1841 | return; | ||
1838 | } | 1842 | } |
1839 | 1843 | ||
1840 | facep->renderSelected(mFaceSelectImagep, color); | 1844 | facep->renderSelected(mFaceSelectImagep, color); |
@@ -4045,4 +4049,4 @@ void LLPipeline::renderBloom(GLuint source, GLuint dest, GLuint buffer, U32 res, | |||
4045 | glPopMatrix(); | 4049 | glPopMatrix(); |
4046 | glMatrixMode(GL_MODELVIEW); | 4050 | glMatrixMode(GL_MODELVIEW); |
4047 | glPopMatrix(); | 4051 | glPopMatrix(); |
4048 | } \ No newline at end of file | 4052 | } |
diff --git a/linden/indra/newview/releasenotes.txt b/linden/indra/newview/releasenotes.txt index 2fc26c7..c6c57f0 100644 --- a/linden/indra/newview/releasenotes.txt +++ b/linden/indra/newview/releasenotes.txt | |||
@@ -1,6 +1,54 @@ | |||
1 | Release Notes for Second Life 1.15.1(3) May 14, 2007 | ||
2 | ===================================== | ||
3 | Changes: | ||
4 | * Soft shadow for text is now an option available via the text style flag | ||
5 | * Expanded Tools->Report Bug to include additional information and links | ||
6 | * Alt-Left and Alt-Right switch between tabs in IM | ||
7 | * Ctrl-W closes one tab in IM window (Ctrl-T closes IM window) | ||
8 | * Ctrl-Shift-W closes all windows | ||
9 | * Inventory system folders may be sorted to top | ||
10 | * Busy mode declines notecards and textures and silently sends all other transfers to Inventory | ||
11 | * L$ balance displays "Loading..." (instead of a blank) when first checking your balance | ||
12 | * Minimap is enabled when Second Life runs for the first time | ||
13 | * Texture transfers are limited to 5 items per 10 seconds | ||
14 | |||
15 | Bug fixes: | ||
16 | * Fixed windows maximizing when opening other windows | ||
17 | * Fixed floating text inworld (original hard shadow restored) | ||
18 | * Fixed LSL Help window restoring when clicking on script editor | ||
19 | * Fixed LSL Wiki Help window forgetting its size | ||
20 | * Fixed Ctrl-W closing the floater instead of one IM panel | ||
21 | * Fixed a client crash when deleting an object from inventory | ||
22 | * Fixed avatar eyeball shader | ||
23 | * Fixed closing an inventory folder while selection is inside moves selection to 'My Inventory' | ||
24 | * Fixed nametag text leaving background box while moving | ||
25 | * Fixed graphics cards with unlisted memory sizes defaulting to 16MB | ||
26 | * Fixed right-clicking on self failing if you are wearing a HUD | ||
27 | * Fixed llSetText appearance on HUD attachments | ||
28 | * Fixed Alt-WASD behavior when sitting | ||
29 | * Fixed first digit in Pay dialog cannot be erased | ||
30 | * Fixed reference ruler measuring to region edge instead of reference object | ||
31 | * Fixed permissions on group-owned object's script when group member clicks New Script | ||
32 | * Improved detection of Linux video memory | ||
33 | * VWR-38: Magic Opening Folders | ||
34 | * VWR-42: llSetSoundQueueing() is broken | ||
35 | * VWR-71: Tabulating and moving by word (Ctrl-left, ctrl-right) off-by-one errors in scripting editor. | ||
36 | * VWR-136: Seg fault in llpolymorph.cpp | ||
37 | * VWR-148: llListStatistics tooltip wrong | ||
38 | * VWR-154: typo in en-US/floater_mute.xml 'Resident' not 'resident' | ||
39 | * VWR-155: typo in en-US/floater_mute.xml 'Resident' not 'Person' | ||
40 | * VWR-165: First Digit in the 'Pay' dialog does not erase without entering more digits | ||
41 | * VWR-166: moving of open folders in the inventory to an other indentation level leaves the contents on the previous level | ||
42 | * VWR-192: textures in windows only stretches horizontally | ||
43 | * VWR-326: Allow a 'limit texture recieving' in the client | ||
44 | * VWR-346: Selecting Client>Character>Flush Animations immediately crashes 1.14.0.x | ||
45 | * VWR-379: Fix shell scripts to use bash and not sh when appropriate. | ||
46 | * VWR-414: 8-bit character in llagent.cpp comment confuses Japanese text editors | ||
47 | * VWR-415: Definitions of WM_MOUSEWHEEL and WHEEL_DELTA need conditionals (on Windows) | ||
48 | * VWR-429: add scons option making FMOD optional | ||
49 | |||
1 | Release Notes for Second Life 1.15.0(2) April 25, 2007 | 50 | Release Notes for Second Life 1.15.0(2) April 25, 2007 |
2 | ===================================== | 51 | ===================================== |
3 | |||
4 | Changes: | 52 | Changes: |
5 | * Improved Help menu with links to additional resources | 53 | * Improved Help menu with links to additional resources |
6 | * 'Add as Friend' button added to Profile | 54 | * 'Add as Friend' button added to Profile |
diff --git a/linden/indra/newview/res/newViewRes.rc b/linden/indra/newview/res/newViewRes.rc index e544a39..e9ac143 100644 --- a/linden/indra/newview/res/newViewRes.rc +++ b/linden/indra/newview/res/newViewRes.rc | |||
@@ -227,8 +227,8 @@ TOOLPIPETTE CURSOR "toolpipette.cur" | |||
227 | // | 227 | // |
228 | 228 | ||
229 | VS_VERSION_INFO VERSIONINFO | 229 | VS_VERSION_INFO VERSIONINFO |
230 | FILEVERSION 1,15,0,2 | 230 | FILEVERSION 1,15,1,3 |
231 | PRODUCTVERSION 1,15,0,2 | 231 | PRODUCTVERSION 1,15,1,3 |
232 | FILEFLAGSMASK 0x3fL | 232 | FILEFLAGSMASK 0x3fL |
233 | #ifdef _DEBUG | 233 | #ifdef _DEBUG |
234 | FILEFLAGS 0x1L | 234 | FILEFLAGS 0x1L |
@@ -245,12 +245,12 @@ BEGIN | |||
245 | BEGIN | 245 | BEGIN |
246 | VALUE "CompanyName", "Linden Lab" | 246 | VALUE "CompanyName", "Linden Lab" |
247 | VALUE "FileDescription", "Second Life" | 247 | VALUE "FileDescription", "Second Life" |
248 | VALUE "FileVersion", "1.15.0.2" | 248 | VALUE "FileVersion", "1.15.1.3" |
249 | VALUE "InternalName", "Second Life" | 249 | VALUE "InternalName", "Second Life" |
250 | VALUE "LegalCopyright", "Copyright © 2001-2007, Linden Research, Inc." | 250 | VALUE "LegalCopyright", "Copyright © 2001-2007, Linden Research, Inc." |
251 | VALUE "OriginalFilename", "SecondLife.exe" | 251 | VALUE "OriginalFilename", "SecondLife.exe" |
252 | VALUE "ProductName", "Second Life" | 252 | VALUE "ProductName", "Second Life" |
253 | VALUE "ProductVersion", "1.15.0.2" | 253 | VALUE "ProductVersion", "1.15.1.3" |
254 | END | 254 | END |
255 | END | 255 | END |
256 | BLOCK "VarFileInfo" | 256 | BLOCK "VarFileInfo" |
diff --git a/linden/indra/newview/secondlife setup build uma.bat b/linden/indra/newview/secondlife setup build uma.bat index 72c27fb..ad2d849 100644 --- a/linden/indra/newview/secondlife setup build uma.bat +++ b/linden/indra/newview/secondlife setup build uma.bat | |||
@@ -1,4 +1,4 @@ | |||
1 | @rem Invoke the script which preps then runs the installer. | 1 | @rem Invoke the script which preps then runs the installer. |
2 | @rem This batch file is customized per grid. | 2 | @rem This batch file is customized per grid. |
3 | 3 | ||
4 | @"secondlife setup build.bat" --grid=uma | 4 | @"secondlife setup build.bat" --grid=uma |
diff --git a/linden/indra/newview/secondlife setup build vaak.bat b/linden/indra/newview/secondlife setup build vaak.bat index 2036c33..f957918 100644 --- a/linden/indra/newview/secondlife setup build vaak.bat +++ b/linden/indra/newview/secondlife setup build vaak.bat | |||
@@ -1,4 +1,4 @@ | |||
1 | @rem Invoke the script which preps then runs the installer. | 1 | @rem Invoke the script which preps then runs the installer. |
2 | @rem This batch file is customized per grid. | 2 | @rem This batch file is customized per grid. |
3 | 3 | ||
4 | @"secondlife setup build.bat" --grid=vaak | 4 | @"secondlife setup build.bat" --grid=vaak |
diff --git a/linden/indra/newview/secondlife setup build yami.bat b/linden/indra/newview/secondlife setup build yami.bat index ffc8568..4f88805 100644 --- a/linden/indra/newview/secondlife setup build yami.bat +++ b/linden/indra/newview/secondlife setup build yami.bat | |||
@@ -1,4 +1,4 @@ | |||
1 | @rem Invoke the script which preps then runs the installer. | 1 | @rem Invoke the script which preps then runs the installer. |
2 | @rem This batch file is customized per grid. | 2 | @rem This batch file is customized per grid. |
3 | 3 | ||
4 | @"secondlife setup build.bat" --grid=yami | 4 | @"secondlife setup build.bat" --grid=yami |
diff --git a/linden/indra/newview/skins/xui/en-us/alerts.xml b/linden/indra/newview/skins/xui/en-us/alerts.xml index 265fca8..a783d00 100644 --- a/linden/indra/newview/skins/xui/en-us/alerts.xml +++ b/linden/indra/newview/skins/xui/en-us/alerts.xml | |||
@@ -11,7 +11,7 @@ | |||
11 | <alert modal="true" name="FloaterNotFound"> | 11 | <alert modal="true" name="FloaterNotFound"> |
12 | <message name="message"> | 12 | <message name="message"> |
13 | Floater error: Could not find the following controls: | 13 | Floater error: Could not find the following controls: |
14 | 14 | ||
15 | [CONTROLS] | 15 | [CONTROLS] |
16 | </message> | 16 | </message> |
17 | <option name="OK"> | 17 | <option name="OK"> |
@@ -126,7 +126,7 @@ Enter a brief description of the group's purpose. | |||
126 | <alert modal="true" name="CharacterSnapshotSaved"> | 126 | <alert modal="true" name="CharacterSnapshotSaved"> |
127 | <message name="message"> | 127 | <message name="message"> |
128 | A snapshot of your character has been saved. | 128 | A snapshot of your character has been saved. |
129 | 129 | ||
130 | Visit the Webpage Studio exhibit to see it. | 130 | Visit the Webpage Studio exhibit to see it. |
131 | </message> | 131 | </message> |
132 | </alert> | 132 | </alert> |
@@ -146,8 +146,8 @@ Visit the Webpage Studio exhibit to see it. | |||
146 | </alert> | 146 | </alert> |
147 | <alert modal="true" name="GrantModifyRights"> | 147 | <alert modal="true" name="GrantModifyRights"> |
148 | <message name="message"> | 148 | <message name="message"> |
149 | Granting modify rights to another resident allows them to change | 149 | Granting modify rights to another resident allows them to change |
150 | ANY objects you may have in-world. Be VERY careful when handing | 150 | ANY objects you may have in-world. Be VERY careful when handing |
151 | out this permission. | 151 | out this permission. |
152 | Do you want to grant modify rights for [FIRST_NAME] [LAST_NAME]? | 152 | Do you want to grant modify rights for [FIRST_NAME] [LAST_NAME]? |
153 | </message> | 153 | </message> |
@@ -212,10 +212,10 @@ Do you want to grant modify rights for [FIRST_NAME] [LAST_NAME]? | |||
212 | <alert modal="true" name="CreateGroupCanAfford"> | 212 | <alert modal="true" name="CreateGroupCanAfford"> |
213 | <message name="message"> | 213 | <message name="message"> |
214 | Creating a group costs L$[COST]. | 214 | Creating a group costs L$[COST]. |
215 | 215 | ||
216 | To maintain the group for more than three days, | 216 | To maintain the group for more than three days, |
217 | you must reach a total of three or more members. | 217 | you must reach a total of three or more members. |
218 | 218 | ||
219 | Create group? | 219 | Create group? |
220 | </message> | 220 | </message> |
221 | <option name="Create"> | 221 | <option name="Create"> |
@@ -275,16 +275,16 @@ Are you sure you want to continue? | |||
275 | </alert> | 275 | </alert> |
276 | <alert modal="true" name="AssignDangerousActionWarning"> | 276 | <alert modal="true" name="AssignDangerousActionWarning"> |
277 | <message name="message"> | 277 | <message name="message"> |
278 | You are about to add the Ability '[ACTION_NAME]' to the | 278 | You are about to add the Ability '[ACTION_NAME]' to the |
279 | Role '[ROLE_NAME]'. | 279 | Role '[ROLE_NAME]'. |
280 | 280 | ||
281 | *WARNING* | 281 | *WARNING* |
282 | Any Member in a Role with this Ability can assign themselves-- | 282 | Any Member in a Role with this Ability can assign themselves-- |
283 | and any other member--to Roles that have more powers than they | 283 | and any other member--to Roles that have more powers than they |
284 | currently have, potentially elevating themselves to | 284 | currently have, potentially elevating themselves to |
285 | near-Owner power. Be sure you know what you're doing before | 285 | near-Owner power. Be sure you know what you're doing before |
286 | assigning this Ability. | 286 | assigning this Ability. |
287 | 287 | ||
288 | Add this Ability to '[ROLE_NAME]'? | 288 | Add this Ability to '[ROLE_NAME]'? |
289 | </message> | 289 | </message> |
290 | <option name="Yes"> | 290 | <option name="Yes"> |
@@ -296,14 +296,14 @@ Add this Ability to '[ROLE_NAME]'? | |||
296 | </alert> | 296 | </alert> |
297 | <alert modal="true" name="AssignDangerousAbilityWarning"> | 297 | <alert modal="true" name="AssignDangerousAbilityWarning"> |
298 | <message name="message"> | 298 | <message name="message"> |
299 | You are about to add the Ability '[ACTION_NAME]' to the | 299 | You are about to add the Ability '[ACTION_NAME]' to the |
300 | Role '[ROLE_NAME]'. | 300 | Role '[ROLE_NAME]'. |
301 | 301 | ||
302 | *WARNING* | 302 | *WARNING* |
303 | Any Member in a Role with this Ability can assign themselves-- | 303 | Any Member in a Role with this Ability can assign themselves-- |
304 | and any other member--all Abilities, elevating themselves | 304 | and any other member--all Abilities, elevating themselves |
305 | to near-Owner power. | 305 | to near-Owner power. |
306 | 306 | ||
307 | Add this Ability to '[ROLE_NAME]'? | 307 | Add this Ability to '[ROLE_NAME]'? |
308 | </message> | 308 | </message> |
309 | <option name="Yes"> | 309 | <option name="Yes"> |
@@ -364,7 +364,7 @@ Go to the Second Life web site for more information on partnering? | |||
364 | If this resident has a web profile URL set then you can: | 364 | If this resident has a web profile URL set then you can: |
365 | * Click Load to load the page with the embedded web browser. | 365 | * Click Load to load the page with the embedded web browser. |
366 | * Click Open to view externally in your default web browser. | 366 | * Click Open to view externally in your default web browser. |
367 | 367 | ||
368 | When viewing your profile you can enter any URL as your Web Profile. | 368 | When viewing your profile you can enter any URL as your Web Profile. |
369 | Residents can visit the URL you specify when they view your profile. | 369 | Residents can visit the URL you specify when they view your profile. |
370 | </message> | 370 | </message> |
@@ -373,7 +373,7 @@ Residents can visit the URL you specify when they view your profile. | |||
373 | <message name="message"> | 373 | <message name="message"> |
374 | If this resident has a web profile URL set then you can: | 374 | If this resident has a web profile URL set then you can: |
375 | * Click Open to view externally in your default web browser. | 375 | * Click Open to view externally in your default web browser. |
376 | 376 | ||
377 | When viewing your profile you can enter any URL as your Web Profile. | 377 | When viewing your profile you can enter any URL as your Web Profile. |
378 | Residents can visit the URL you specify when they view your profile. | 378 | Residents can visit the URL you specify when they view your profile. |
379 | </message> | 379 | </message> |
@@ -478,7 +478,7 @@ Please select an individual to sell to if selling for L$0. | |||
478 | <message name="message"> | 478 | <message name="message"> |
479 | The selected [LAND_SIZE] sq. m. land is being set for sale. | 479 | The selected [LAND_SIZE] sq. m. land is being set for sale. |
480 | Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME]. | 480 | Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME]. |
481 | 481 | ||
482 | Would you like to continue making this change? | 482 | Would you like to continue making this change? |
483 | </message> | 483 | </message> |
484 | <option name="Continue"> | 484 | <option name="Continue"> |
@@ -493,10 +493,10 @@ Would you like to continue making this change? | |||
493 | Are you sure you want to return all objects shared with | 493 | Are you sure you want to return all objects shared with |
494 | the group '[NAME]' on this parcel of land | 494 | the group '[NAME]' on this parcel of land |
495 | back to their previous owner's inventory? | 495 | back to their previous owner's inventory? |
496 | 496 | ||
497 | *WARNING* This will delete the non-transferable objects | 497 | *WARNING* This will delete the non-transferable objects |
498 | deeded to the group! | 498 | deeded to the group! |
499 | 499 | ||
500 | Objects: [N] | 500 | Objects: [N] |
501 | </message> | 501 | </message> |
502 | <option name="Return"> | 502 | <option name="Return"> |
@@ -511,7 +511,7 @@ Objects: [N] | |||
511 | Are you sure you want to return all objects owned by the | 511 | Are you sure you want to return all objects owned by the |
512 | resident '[NAME]' on this parcel of land | 512 | resident '[NAME]' on this parcel of land |
513 | back to their inventory? | 513 | back to their inventory? |
514 | 514 | ||
515 | Objects: [N] | 515 | Objects: [N] |
516 | </message> | 516 | </message> |
517 | <option name="Return"> | 517 | <option name="Return"> |
@@ -526,7 +526,7 @@ Objects: [N] | |||
526 | Are you sure you want to return all objects | 526 | Are you sure you want to return all objects |
527 | owned by you on this parcel of land back to | 527 | owned by you on this parcel of land back to |
528 | your inventory? | 528 | your inventory? |
529 | 529 | ||
530 | Objects: [N] | 530 | Objects: [N] |
531 | </message> | 531 | </message> |
532 | <option name="Return"> | 532 | <option name="Return"> |
@@ -542,10 +542,10 @@ Objects: [N] | |||
542 | by you on this parcel of land back to their owner's inventory? | 542 | by you on this parcel of land back to their owner's inventory? |
543 | Transferable objects deeded to a group will be | 543 | Transferable objects deeded to a group will be |
544 | returned to their previous owners. | 544 | returned to their previous owners. |
545 | 545 | ||
546 | *WARNING* This will delete the non-transferable objects | 546 | *WARNING* This will delete the non-transferable objects |
547 | deeded to the group! | 547 | deeded to the group! |
548 | 548 | ||
549 | Objects: [N] | 549 | Objects: [N] |
550 | </message> | 550 | </message> |
551 | <option name="Return"> | 551 | <option name="Return"> |
@@ -561,10 +561,10 @@ Objects: [N] | |||
561 | by [NAME] on this parcel of land back to their owner's inventory? | 561 | by [NAME] on this parcel of land back to their owner's inventory? |
562 | Transferable objects deeded to a group will be | 562 | Transferable objects deeded to a group will be |
563 | returned to their previous owners. | 563 | returned to their previous owners. |
564 | 564 | ||
565 | *WARNING* This will delete the non-transferable objects | 565 | *WARNING* This will delete the non-transferable objects |
566 | deeded to the group! | 566 | deeded to the group! |
567 | 567 | ||
568 | Objects: [N] | 568 | Objects: [N] |
569 | </message> | 569 | </message> |
570 | <option name="Return"> | 570 | <option name="Return"> |
@@ -602,7 +602,7 @@ in this region back to their owner's inventory? | |||
602 | Return the objects on this parcel of land | 602 | Return the objects on this parcel of land |
603 | that are NOT shared with the group [NAME] | 603 | that are NOT shared with the group [NAME] |
604 | back to their owners? | 604 | back to their owners? |
605 | 605 | ||
606 | Objects: [N] | 606 | Objects: [N] |
607 | </message> | 607 | </message> |
608 | <option name="Return"> | 608 | <option name="Return"> |
@@ -690,7 +690,7 @@ The outfit folder contains no clothing, body parts, or attachments. | |||
690 | <alert modal="true" name="MustHaveAccountToLogIn"> | 690 | <alert modal="true" name="MustHaveAccountToLogIn"> |
691 | <message name="message"> | 691 | <message name="message"> |
692 | You must have an account to connect to [SECOND_LIFE]. | 692 | You must have an account to connect to [SECOND_LIFE]. |
693 | 693 | ||
694 | Go to www.secondlife.com to create a new account? | 694 | Go to www.secondlife.com to create a new account? |
695 | </message> | 695 | </message> |
696 | <option name="OK"> | 696 | <option name="OK"> |
@@ -704,10 +704,10 @@ Go to www.secondlife.com to create a new account? | |||
704 | <message name="message"> | 704 | <message name="message"> |
705 | Classified ads appear in the 'Classified' section of the | 705 | Classified ads appear in the 'Classified' section of the |
706 | Search directory for one week. | 706 | Search directory for one week. |
707 | 707 | ||
708 | Fill out your ad, then click 'Publish...' to add it to the | 708 | Fill out your ad, then click 'Publish...' to add it to the |
709 | directory. | 709 | directory. |
710 | 710 | ||
711 | You'll be asked for a price to pay when clicking Publish. | 711 | You'll be asked for a price to pay when clicking Publish. |
712 | Paying more makes your ad appear higher in the list, and | 712 | Paying more makes your ad appear higher in the list, and |
713 | also appear higher when people search for keywords. | 713 | also appear higher when people search for keywords. |
@@ -750,7 +750,7 @@ There is no reimbursement for fees paid. | |||
750 | Some of the display changes that you have made | 750 | Some of the display changes that you have made |
751 | require [SECOND_LIFE] to shut down immediately, | 751 | require [SECOND_LIFE] to shut down immediately, |
752 | which will cause you to lose any work in progress. | 752 | which will cause you to lose any work in progress. |
753 | 753 | ||
754 | Apply those changes and quit | 754 | Apply those changes and quit |
755 | </message> | 755 | </message> |
756 | <option name="ApplyandQuit"> | 756 | <option name="ApplyandQuit"> |
@@ -960,15 +960,6 @@ based on your system configuration. | |||
960 | OK | 960 | OK |
961 | </option> | 961 | </option> |
962 | </alert> | 962 | </alert> |
963 | <alert modal="true" name="DisplaySettingsNoShaders"> | ||
964 | <message name="message"> | ||
965 | [SECOND_LIFE] crashed while initializing graphics drivers. | ||
966 | Shaders will be disabled in order to avoid some common driver errors. | ||
967 | This will disable some graphics features. | ||
968 | We recommend updating your graphics card drivers. | ||
969 | Shaders can be re-enabled in Preferences > Graphics Detail. | ||
970 | </message> | ||
971 | </alert> | ||
972 | <alert modal="true" name="CannotRequestDomain"> | 963 | <alert modal="true" name="CannotRequestDomain"> |
973 | <message name="message"> | 964 | <message name="message"> |
974 | Unable to connect to server. | 965 | Unable to connect to server. |
@@ -980,7 +971,7 @@ Could not request domain name: [HOST] | |||
980 | Unable to find the server domain name. | 971 | Unable to find the server domain name. |
981 | This could be the result of a lost network connection | 972 | This could be the result of a lost network connection |
982 | or a server problem. | 973 | or a server problem. |
983 | 974 | ||
984 | Please try again in a few minutes, or click Help | 975 | Please try again in a few minutes, or click Help |
985 | for advice and a link to the system status web page. | 976 | for advice and a link to the system status web page. |
986 | </message> | 977 | </message> |
@@ -1012,7 +1003,7 @@ please go to the support section and report this problem. | |||
1012 | Often this means that your computer's clock is set incorrectly. | 1003 | Often this means that your computer's clock is set incorrectly. |
1013 | Please go to Control Panels and make sure the time and date | 1004 | Please go to Control Panels and make sure the time and date |
1014 | are set correctly. | 1005 | are set correctly. |
1015 | 1006 | ||
1016 | If you continue to receive this error, please go | 1007 | If you continue to receive this error, please go |
1017 | to the Support section of the SecondLife.com web site | 1008 | to the Support section of the SecondLife.com web site |
1018 | and report the problem. | 1009 | and report the problem. |
@@ -1060,7 +1051,7 @@ SecondLife.com web site. | |||
1060 | <message name="message"> | 1051 | <message name="message"> |
1061 | Unknown problem trying to connect. | 1052 | Unknown problem trying to connect. |
1062 | (Blank error message from server.) | 1053 | (Blank error message from server.) |
1063 | 1054 | ||
1064 | Please try again in a few minutes, or click Help | 1055 | Please try again in a few minutes, or click Help |
1065 | for advice and a link to the system status web page. | 1056 | for advice and a link to the system status web page. |
1066 | </message> | 1057 | </message> |
@@ -1074,7 +1065,7 @@ for advice and a link to the system status web page. | |||
1074 | <alert modal="true" name="CannotConnectNoReplyFromLogin"> | 1065 | <alert modal="true" name="CannotConnectNoReplyFromLogin"> |
1075 | <message name="message"> | 1066 | <message name="message"> |
1076 | Unable to connect. No reply from login database. | 1067 | Unable to connect. No reply from login database. |
1077 | 1068 | ||
1078 | Please try again in a few minutes, or click Help | 1069 | Please try again in a few minutes, or click Help |
1079 | for advice and a link to the system status web page. | 1070 | for advice and a link to the system status web page. |
1080 | </message> | 1071 | </message> |
@@ -1093,10 +1084,10 @@ for advice and a link to the system status web page. | |||
1093 | <alert modal="true" name="FirstRunDialog"> | 1084 | <alert modal="true" name="FirstRunDialog"> |
1094 | <message name="message"> | 1085 | <message name="message"> |
1095 | [SECOND_LIFE] installation is complete. | 1086 | [SECOND_LIFE] installation is complete. |
1096 | 1087 | ||
1097 | If this is your first time using [SECOND_LIFE], you will need to create | 1088 | If this is your first time using [SECOND_LIFE], you will need to create |
1098 | an account before you can log on. | 1089 | an account before you can log on. |
1099 | 1090 | ||
1100 | Return to www.secondlife.com to create a new account? | 1091 | Return to www.secondlife.com to create a new account? |
1101 | </message> | 1092 | </message> |
1102 | <option name="NewAccount..."> | 1093 | <option name="NewAccount..."> |
@@ -1124,7 +1115,7 @@ Please check your network connection. | |||
1124 | <message name="message"> | 1115 | <message name="message"> |
1125 | Unable to connect. Login packet never received by | 1116 | Unable to connect. Login packet never received by |
1126 | login server. | 1117 | login server. |
1127 | 1118 | ||
1128 | Please try again in a few minutes, or click Help | 1119 | Please try again in a few minutes, or click Help |
1129 | for advice and a link to the system status web page. | 1120 | for advice and a link to the system status web page. |
1130 | </message> | 1121 | </message> |
@@ -1137,11 +1128,11 @@ for advice and a link to the system status web page. | |||
1137 | </alert> | 1128 | </alert> |
1138 | <alert modal="true" name="WelcomeToSecondLife"> | 1129 | <alert modal="true" name="WelcomeToSecondLife"> |
1139 | <message name="message"> | 1130 | <message name="message"> |
1140 | Welcome to [SECOND_LIFE]! | 1131 | Welcome to [SECOND_LIFE]! |
1141 | 1132 | ||
1142 | Use arrow keys to walk. | 1133 | Use arrow keys to walk. |
1143 | 1134 | ||
1144 | Please choose the male or female character. | 1135 | Please choose the male or female character. |
1145 | You can change your mind later. | 1136 | You can change your mind later. |
1146 | </message> | 1137 | </message> |
1147 | <option name="Male"> | 1138 | <option name="Male"> |
@@ -1153,10 +1144,10 @@ You can change your mind later. | |||
1153 | </alert> | 1144 | </alert> |
1154 | <alert modal="true" name="WelcomeToSecondLifeSimple"> | 1145 | <alert modal="true" name="WelcomeToSecondLifeSimple"> |
1155 | <message name="message"> | 1146 | <message name="message"> |
1156 | Welcome to [SECOND_LIFE]! | 1147 | Welcome to [SECOND_LIFE]! |
1157 | 1148 | ||
1158 | Use arrow keys to walk. | 1149 | Use arrow keys to walk. |
1159 | 1150 | ||
1160 | Please choose the male or female character. | 1151 | Please choose the male or female character. |
1161 | </message> | 1152 | </message> |
1162 | <option name="Male"> | 1153 | <option name="Male"> |
@@ -1287,7 +1278,7 @@ same region. | |||
1287 | <alert modal="true" name="TakeLockedOrNotOwnedBy"> | 1278 | <alert modal="true" name="TakeLockedOrNotOwnedBy"> |
1288 | <message name="message"> | 1279 | <message name="message"> |
1289 | At least one object is locked or not owned by you. | 1280 | At least one object is locked or not owned by you. |
1290 | If an object is not owned by you and you take it, | 1281 | If an object is not owned by you and you take it, |
1291 | next owner permissions will be applied to it and | 1282 | next owner permissions will be applied to it and |
1292 | possibly restrict your ability to modify or copy it | 1283 | possibly restrict your ability to modify or copy it |
1293 | in the future. | 1284 | in the future. |
@@ -1304,8 +1295,8 @@ Are you sure you want to take these itmes? | |||
1304 | <alert modal="true" name="PromptGoToCurrencyPage"> | 1295 | <alert modal="true" name="PromptGoToCurrencyPage"> |
1305 | <message name="message"> | 1296 | <message name="message"> |
1306 | [EXTRA] | 1297 | [EXTRA] |
1307 | 1298 | ||
1308 | 1299 | ||
1309 | Go to [URL] for information on purchasing currency? | 1300 | Go to [URL] for information on purchasing currency? |
1310 | </message> | 1301 | </message> |
1311 | <option name="GotoPage"> | 1302 | <option name="GotoPage"> |
@@ -1364,50 +1355,50 @@ Expected [VALIDS] | |||
1364 | </alert> | 1355 | </alert> |
1365 | <alert modal="true" name="SoundFileNotRIFF"> | 1356 | <alert modal="true" name="SoundFileNotRIFF"> |
1366 | <message name="message"> | 1357 | <message name="message"> |
1367 | File does not appear to be a RIFF WAVE file: | 1358 | File does not appear to be a RIFF WAVE file: |
1368 | [FILE] | 1359 | [FILE] |
1369 | </message> | 1360 | </message> |
1370 | </alert> | 1361 | </alert> |
1371 | <alert modal="true" name="SoundFileNotPCM"> | 1362 | <alert modal="true" name="SoundFileNotPCM"> |
1372 | <message name="message"> | 1363 | <message name="message"> |
1373 | File does not appear to be a PCM WAVE audio file: | 1364 | File does not appear to be a PCM WAVE audio file: |
1374 | [FILE] | 1365 | [FILE] |
1375 | </message> | 1366 | </message> |
1376 | </alert> | 1367 | </alert> |
1377 | <alert modal="true" name="SoundFileInvalidChannelCount"> | 1368 | <alert modal="true" name="SoundFileInvalidChannelCount"> |
1378 | <message name="message"> | 1369 | <message name="message"> |
1379 | File has invalid number of channels (must be mono or stereo): | 1370 | File has invalid number of channels (must be mono or stereo): |
1380 | [FILE] | 1371 | [FILE] |
1381 | </message> | 1372 | </message> |
1382 | </alert> | 1373 | </alert> |
1383 | <alert modal="true" name="SoundFileInvalidSampleRate"> | 1374 | <alert modal="true" name="SoundFileInvalidSampleRate"> |
1384 | <message name="message"> | 1375 | <message name="message"> |
1385 | File does not appear to be a supported sample rate (must be 44.1k): | 1376 | File does not appear to be a supported sample rate (must be 44.1k): |
1386 | [FILE] | 1377 | [FILE] |
1387 | </message> | 1378 | </message> |
1388 | </alert> | 1379 | </alert> |
1389 | <alert modal="true" name="SoundFileInvalidWordSize"> | 1380 | <alert modal="true" name="SoundFileInvalidWordSize"> |
1390 | <message name="message"> | 1381 | <message name="message"> |
1391 | File does not appear to be a supported word size (must be 8 or 16 bit): | 1382 | File does not appear to be a supported word size (must be 8 or 16 bit): |
1392 | [FILE] | 1383 | [FILE] |
1393 | </message> | 1384 | </message> |
1394 | </alert> | 1385 | </alert> |
1395 | <alert modal="true" name="SoundFileInvalidHeader"> | 1386 | <alert modal="true" name="SoundFileInvalidHeader"> |
1396 | <message name="message"> | 1387 | <message name="message"> |
1397 | Could not find 'data' chunk in WAV header: | 1388 | Could not find 'data' chunk in WAV header: |
1398 | [FILE] | 1389 | [FILE] |
1399 | </message> | 1390 | </message> |
1400 | </alert> | 1391 | </alert> |
1401 | <alert modal="true" name="SoundFileInvalidTooLong"> | 1392 | <alert modal="true" name="SoundFileInvalidTooLong"> |
1402 | <message name="message"> | 1393 | <message name="message"> |
1403 | Audio file is too long (10 second maximum): | 1394 | Audio file is too long (10 second maximum): |
1404 | [FILE] | 1395 | [FILE] |
1405 | </message> | 1396 | </message> |
1406 | </alert> | 1397 | </alert> |
1407 | <alert modal="true" name="ProblemWithFile"> | 1398 | <alert modal="true" name="ProblemWithFile"> |
1408 | <message name="message"> | 1399 | <message name="message"> |
1409 | Problem with file [FILE]: | 1400 | Problem with file [FILE]: |
1410 | 1401 | ||
1411 | [ERROR] | 1402 | [ERROR] |
1412 | </message> | 1403 | </message> |
1413 | </alert> | 1404 | </alert> |
@@ -1679,11 +1670,11 @@ Try selecting a smaller area. | |||
1679 | </alert> | 1670 | </alert> |
1680 | <alert modal="true" name="ParcelCanPlayMusic"> | 1671 | <alert modal="true" name="ParcelCanPlayMusic"> |
1681 | <message name="message"> | 1672 | <message name="message"> |
1682 | This location can play streaming music. | 1673 | This location can play streaming music. |
1683 | 1674 | ||
1684 | Music requires a 768 kbps or faster | 1675 | Music requires a 768 kbps or faster |
1685 | Internet connection. | 1676 | Internet connection. |
1686 | 1677 | ||
1687 | Play music when available? | 1678 | Play music when available? |
1688 | </message> | 1679 | </message> |
1689 | <option name="PlayMusic"> | 1680 | <option name="PlayMusic"> |
@@ -1695,14 +1686,14 @@ Play music when available? | |||
1695 | </alert> | 1686 | </alert> |
1696 | <alert modal="true" name="ParcelCanPlayMedia"> | 1687 | <alert modal="true" name="ParcelCanPlayMedia"> |
1697 | <message name="message"> | 1688 | <message name="message"> |
1698 | This location can play streaming video. | 1689 | This location can play streaming video. |
1699 | 1690 | ||
1700 | Streaming video requires a 768 kbps or | 1691 | Streaming video requires a 768 kbps or |
1701 | faster Internet connection. | 1692 | faster Internet connection. |
1702 | 1693 | ||
1703 | Play streaming video when available? | 1694 | Play streaming video when available? |
1704 | 1695 | ||
1705 | (You can change this option later under | 1696 | (You can change this option later under |
1706 | Preferences > Audio & Video.) | 1697 | Preferences > Audio & Video.) |
1707 | </message> | 1698 | </message> |
1708 | <option name="PlayMedia"> | 1699 | <option name="PlayMedia"> |
@@ -1815,7 +1806,7 @@ The region [REGION] does not allow transfer of land. | |||
1815 | <message name="message"> | 1806 | <message name="message"> |
1816 | Unable to abandon land: | 1807 | Unable to abandon land: |
1817 | You must select an entire parcel to release it. | 1808 | You must select an entire parcel to release it. |
1818 | Try double-clicking to select an entire parcel, or | 1809 | Try double-clicking to select an entire parcel, or |
1819 | first divide your parcel. | 1810 | first divide your parcel. |
1820 | </message> | 1811 | </message> |
1821 | </alert> | 1812 | </alert> |
@@ -1824,7 +1815,7 @@ first divide your parcel. | |||
1824 | You are about to release [AREA] sq. meters of land. | 1815 | You are about to release [AREA] sq. meters of land. |
1825 | Releasing this parcel will remove it from your land | 1816 | Releasing this parcel will remove it from your land |
1826 | holdings, but will not credit any L$. | 1817 | holdings, but will not credit any L$. |
1827 | 1818 | ||
1828 | Release this land? | 1819 | Release this land? |
1829 | </message> | 1820 | </message> |
1830 | <option name="Release"> | 1821 | <option name="Release"> |
@@ -1853,7 +1844,7 @@ and dragging. | |||
1853 | Dividing this land will split this parcel into two | 1844 | Dividing this land will split this parcel into two |
1854 | and each parcel can have its own settings. Some settings | 1845 | and each parcel can have its own settings. Some settings |
1855 | will be reset to defaults after the operation. | 1846 | will be reset to defaults after the operation. |
1856 | 1847 | ||
1857 | Divide land? | 1848 | Divide land? |
1858 | </message> | 1849 | </message> |
1859 | <option name="Divide"> | 1850 | <option name="Divide"> |
@@ -1901,12 +1892,12 @@ and dragging. | |||
1901 | </alert> | 1892 | </alert> |
1902 | <alert modal="true" name="JoinLandWarning"> | 1893 | <alert modal="true" name="JoinLandWarning"> |
1903 | <message name="message"> | 1894 | <message name="message"> |
1904 | Joining this land will create one large parcel | 1895 | Joining this land will create one large parcel |
1905 | out of all parcels intersecting the selected rectangle. | 1896 | out of all parcels intersecting the selected rectangle. |
1906 | 1897 | ||
1907 | You will need to reset the name and options of the | 1898 | You will need to reset the name and options of the |
1908 | new parcel. | 1899 | new parcel. |
1909 | 1900 | ||
1910 | Join land? | 1901 | Join land? |
1911 | </message> | 1902 | </message> |
1912 | <option name="Join"> | 1903 | <option name="Join"> |
@@ -1984,7 +1975,7 @@ and provide details about your network setup. | |||
1984 | <alert modal="true" name="AppEarlyExit"> | 1975 | <alert modal="true" name="AppEarlyExit"> |
1985 | <message name="message"> | 1976 | <message name="message"> |
1986 | [MESSAGE] | 1977 | [MESSAGE] |
1987 | 1978 | ||
1988 | We are unable to recover from this problem. Please | 1979 | We are unable to recover from this problem. Please |
1989 | uninstall and reinstall before trying again. If this | 1980 | uninstall and reinstall before trying again. If this |
1990 | problem persists, check the Tech Support FAQ at: | 1981 | problem persists, check the Tech Support FAQ at: |
@@ -1997,9 +1988,9 @@ www.secondlife.com/support. | |||
1997 | <alert modal="true" name="YouHaveBeenLoggedOut"> | 1988 | <alert modal="true" name="YouHaveBeenLoggedOut"> |
1998 | <message name="message"> | 1989 | <message name="message"> |
1999 | You have been logged out of [SECOND_LIFE]: | 1990 | You have been logged out of [SECOND_LIFE]: |
2000 | 1991 | ||
2001 | [MESSAGE] | 1992 | [MESSAGE] |
2002 | 1993 | ||
2003 | Click Continue to look at existing IM and chat. | 1994 | Click Continue to look at existing IM and chat. |
2004 | You will not be able to perform any other operations. | 1995 | You will not be able to perform any other operations. |
2005 | Click Quit to exit [SECOND_LIFE] immediately. | 1996 | Click Quit to exit [SECOND_LIFE] immediately. |
@@ -2020,10 +2011,10 @@ Please activate another group using Edit -> Groups... | |||
2020 | </alert> | 2011 | </alert> |
2021 | <alert model="true" name="AddFriend" title="Add Friend"> | 2012 | <alert model="true" name="AddFriend" title="Add Friend"> |
2022 | <message name="message"> | 2013 | <message name="message"> |
2023 | Friends can give permissions to | 2014 | Friends can give permissions to |
2024 | track each other on the map and | 2015 | track each other on the map and |
2025 | receive online status updates. | 2016 | receive online status updates. |
2026 | 2017 | ||
2027 | Offer friendship to [NAME]? | 2018 | Offer friendship to [NAME]? |
2028 | </message> | 2019 | </message> |
2029 | <option name="Offer"> | 2020 | <option name="Offer"> |
@@ -2058,9 +2049,9 @@ Offer friendship to [NAME]? | |||
2058 | <alert modal="true" name="GodDeleteAllScriptedPublicObjectsByUser"> | 2049 | <alert modal="true" name="GodDeleteAllScriptedPublicObjectsByUser"> |
2059 | <message name="message"> | 2050 | <message name="message"> |
2060 | Are you sure you want to delete all scripted objects owned by | 2051 | Are you sure you want to delete all scripted objects owned by |
2061 | 2052 | ||
2062 | ** [AVATAR_NAME] ** | 2053 | ** [AVATAR_NAME] ** |
2063 | 2054 | ||
2064 | on all others land in this sim? | 2055 | on all others land in this sim? |
2065 | </message> | 2056 | </message> |
2066 | <option name="DELETE!!"> | 2057 | <option name="DELETE!!"> |
@@ -2073,9 +2064,9 @@ on all others land in this sim? | |||
2073 | <alert modal="true" name="GodDeleteAllScriptedObjectsByUser"> | 2064 | <alert modal="true" name="GodDeleteAllScriptedObjectsByUser"> |
2074 | <message name="message"> | 2065 | <message name="message"> |
2075 | Are you sure you want to DELETE ALL scripted objects owned by | 2066 | Are you sure you want to DELETE ALL scripted objects owned by |
2076 | 2067 | ||
2077 | ** [AVATAR_NAME] ** | 2068 | ** [AVATAR_NAME] ** |
2078 | 2069 | ||
2079 | on ALL LAND in this sim? | 2070 | on ALL LAND in this sim? |
2080 | </message> | 2071 | </message> |
2081 | <option name="!!DELETEALL!!"> | 2072 | <option name="!!DELETEALL!!"> |
@@ -2089,9 +2080,9 @@ on ALL LAND in this sim? | |||
2089 | <message name="message"> | 2080 | <message name="message"> |
2090 | Are you sure you want to DELETE ALL objects (scripted or not) | 2081 | Are you sure you want to DELETE ALL objects (scripted or not) |
2091 | owned by | 2082 | owned by |
2092 | 2083 | ||
2093 | ** [AVATAR_NAME] ** | 2084 | ** [AVATAR_NAME] ** |
2094 | 2085 | ||
2095 | on ALL LAND in this sim? | 2086 | on ALL LAND in this sim? |
2096 | </message> | 2087 | </message> |
2097 | <option name="!!DELETEALL!!"> | 2088 | <option name="!!DELETEALL!!"> |
@@ -2104,7 +2095,7 @@ on ALL LAND in this sim? | |||
2104 | <alert modal="true" name="PublishGroupInfoToWeb"> | 2095 | <alert modal="true" name="PublishGroupInfoToWeb"> |
2105 | <message name="message"> | 2096 | <message name="message"> |
2106 | Selecting the "Publish on the Web" option allows us to publish | 2097 | Selecting the "Publish on the Web" option allows us to publish |
2107 | the group name, insignia, charter, titles, and founder on the | 2098 | the group name, insignia, charter, titles, and founder on the |
2108 | [SECOND_LIFE] website. You are responsible for indicating if any | 2099 | [SECOND_LIFE] website. You are responsible for indicating if any |
2109 | of the above content is considered Mature according to the | 2100 | of the above content is considered Mature according to the |
2110 | Community Standards. | 2101 | Community Standards. |
@@ -2123,7 +2114,7 @@ Community Standards. | |||
2123 | <alert modal="true" name="MinClassifiedPrice"> | 2114 | <alert modal="true" name="MinClassifiedPrice"> |
2124 | <message name="message"> | 2115 | <message name="message"> |
2125 | Price to pay for listing must be at least L$[MIN_PRICE]. | 2116 | Price to pay for listing must be at least L$[MIN_PRICE]. |
2126 | 2117 | ||
2127 | Please enter a higher price. | 2118 | Please enter a higher price. |
2128 | </message> | 2119 | </message> |
2129 | </alert> | 2120 | </alert> |
@@ -2284,11 +2275,11 @@ Please select a smaller area and try again. | |||
2284 | <message name="message"> | 2275 | <message name="message"> |
2285 | By deeding this parcel, the group will be required | 2276 | By deeding this parcel, the group will be required |
2286 | to have and maintain sufficient land use credits. | 2277 | to have and maintain sufficient land use credits. |
2287 | 2278 | ||
2288 | The purchase price of the land is not refunded to | 2279 | The purchase price of the land is not refunded to |
2289 | the owner. If a deeded parcel is sold, the sale | 2280 | the owner. If a deeded parcel is sold, the sale |
2290 | price will be divided evenly among group members. | 2281 | price will be divided evenly among group members. |
2291 | 2282 | ||
2292 | Deed this [AREA] square meters of land to the group | 2283 | Deed this [AREA] square meters of land to the group |
2293 | '[GROUP_NAME]'? | 2284 | '[GROUP_NAME]'? |
2294 | </message> | 2285 | </message> |
@@ -2303,14 +2294,14 @@ Deed this [AREA] square meters of land to the group | |||
2303 | <message name="message"> | 2294 | <message name="message"> |
2304 | By deeding this parcel, the group will be required | 2295 | By deeding this parcel, the group will be required |
2305 | to have and maintain sufficient land use credits. | 2296 | to have and maintain sufficient land use credits. |
2306 | 2297 | ||
2307 | The deed will include a simultaneous land | 2298 | The deed will include a simultaneous land |
2308 | contribution to the group from '[FIRST_NAME] [LAST_NAME]'. | 2299 | contribution to the group from '[FIRST_NAME] [LAST_NAME]'. |
2309 | 2300 | ||
2310 | The purchase price of the land is not refunded to | 2301 | The purchase price of the land is not refunded to |
2311 | the owner. If a deeded parcel is sold, the sale | 2302 | the owner. If a deeded parcel is sold, the sale |
2312 | price will be divided evenly among group members. | 2303 | price will be divided evenly among group members. |
2313 | 2304 | ||
2314 | Deed this [AREA] square meters of land to the group | 2305 | Deed this [AREA] square meters of land to the group |
2315 | '[GROUP_NAME]'? | 2306 | '[GROUP_NAME]'? |
2316 | </message> | 2307 | </message> |
@@ -2344,7 +2335,7 @@ Could not request domain name: [HOST_NAME] | |||
2344 | Unable to find the server domain name. | 2335 | Unable to find the server domain name. |
2345 | This could be the result of a lost network connection | 2336 | This could be the result of a lost network connection |
2346 | or a server problem. | 2337 | or a server problem. |
2347 | 2338 | ||
2348 | Please try again in a few minutes, or click Help | 2339 | Please try again in a few minutes, or click Help |
2349 | for advice and a link to the system status web page. | 2340 | for advice and a link to the system status web page. |
2350 | </message> | 2341 | </message> |
@@ -2383,7 +2374,7 @@ for advice and a link to the system status web page. | |||
2383 | <alert modal="true" name="AvatarMoved"> | 2374 | <alert modal="true" name="AvatarMoved"> |
2384 | <message name="message"> | 2375 | <message name="message"> |
2385 | Your [TYPE] location is not currently available. | 2376 | Your [TYPE] location is not currently available. |
2386 | [HELP] | 2377 | [HELP] |
2387 | You have been moved into a nearby region. | 2378 | You have been moved into a nearby region. |
2388 | </message> | 2379 | </message> |
2389 | </alert> | 2380 | </alert> |
@@ -2397,10 +2388,10 @@ will see you correctly. | |||
2397 | <alert modal="true" name="FirstRun"> | 2388 | <alert modal="true" name="FirstRun"> |
2398 | <message name="message"> | 2389 | <message name="message"> |
2399 | [SECOND_LIFE] installation is complete. | 2390 | [SECOND_LIFE] installation is complete. |
2400 | 2391 | ||
2401 | If this is your first time using [SECOND_LIFE], you will need to create | 2392 | If this is your first time using [SECOND_LIFE], you will need to create |
2402 | an account before you can log on. | 2393 | an account before you can log on. |
2403 | 2394 | ||
2404 | Return to www.secondlife.com to create a new account? | 2395 | Return to www.secondlife.com to create a new account? |
2405 | </message> | 2396 | </message> |
2406 | <option name="NewAccount..."> | 2397 | <option name="NewAccount..."> |
@@ -2421,7 +2412,7 @@ Please check your network connection. | |||
2421 | <message name="message"> | 2412 | <message name="message"> |
2422 | Unable to connect. Login packet never received by | 2413 | Unable to connect. Login packet never received by |
2423 | login server. | 2414 | login server. |
2424 | 2415 | ||
2425 | Please try again in a few minutes, or click Help | 2416 | Please try again in a few minutes, or click Help |
2426 | for advice and a link to the system status web page. | 2417 | for advice and a link to the system status web page. |
2427 | </message> | 2418 | </message> |
@@ -2435,9 +2426,9 @@ for advice and a link to the system status web page. | |||
2435 | <alert modal="true" name="WelcomeNoClothes"> | 2426 | <alert modal="true" name="WelcomeNoClothes"> |
2436 | <message name="message"> | 2427 | <message name="message"> |
2437 | Your character will appear in a moment. | 2428 | Your character will appear in a moment. |
2438 | 2429 | ||
2439 | Use arrow keys to walk. | 2430 | Use arrow keys to walk. |
2440 | 2431 | ||
2441 | Press the F1 key at any time for help or | 2432 | Press the F1 key at any time for help or |
2442 | to learn more about [SECOND_LIFE]. | 2433 | to learn more about [SECOND_LIFE]. |
2443 | </message> | 2434 | </message> |
@@ -2445,12 +2436,12 @@ to learn more about [SECOND_LIFE]. | |||
2445 | <alert modal="true" name="WelcomeChooseSex" nodefault="true"> | 2436 | <alert modal="true" name="WelcomeChooseSex" nodefault="true"> |
2446 | <message name="message"> | 2437 | <message name="message"> |
2447 | Your character will appear in a moment. | 2438 | Your character will appear in a moment. |
2448 | 2439 | ||
2449 | Use arrow keys to walk. | 2440 | Use arrow keys to walk. |
2450 | 2441 | ||
2451 | Press the F1 key at any time for help or | 2442 | Press the F1 key at any time for help or |
2452 | to learn more about [SECOND_LIFE]. | 2443 | to learn more about [SECOND_LIFE]. |
2453 | 2444 | ||
2454 | Please choose the male or female character. | 2445 | Please choose the male or female character. |
2455 | You can change your mind later. | 2446 | You can change your mind later. |
2456 | </message> | 2447 | </message> |
@@ -2479,10 +2470,10 @@ You can change your mind later. | |||
2479 | <alert modal="true" name="FlushMapVisibilityCaches"> | 2470 | <alert modal="true" name="FlushMapVisibilityCaches"> |
2480 | <message name="message"> | 2471 | <message name="message"> |
2481 | This will flush the map caches on this region. | 2472 | This will flush the map caches on this region. |
2482 | 2473 | ||
2483 | This is really only useful for debugging. | 2474 | This is really only useful for debugging. |
2484 | 2475 | ||
2485 | (In production, wait 5 minutes, then everyone's map will | 2476 | (In production, wait 5 minutes, then everyone's map will |
2486 | update after they relog.) | 2477 | update after they relog.) |
2487 | </message> | 2478 | </message> |
2488 | <option name="OK"> | 2479 | <option name="OK"> |
@@ -2543,34 +2534,34 @@ non ALL LAND in this region? | |||
2543 | </alert> | 2534 | </alert> |
2544 | <alert modal="true" name="InvalidTerrainBitDepth"> | 2535 | <alert modal="true" name="InvalidTerrainBitDepth"> |
2545 | <message name="message"> | 2536 | <message name="message"> |
2546 | Couldn't set region textures: | 2537 | Couldn't set region textures: |
2547 | 2538 | ||
2548 | Terrain texture [TEXTURE_NUM] has an invalid bit depth of [TEXTURE_BIT_DEPTH]. | 2539 | Terrain texture [TEXTURE_NUM] has an invalid bit depth of [TEXTURE_BIT_DEPTH]. |
2549 | 2540 | ||
2550 | Replace texture [TEXTURE_NUM] with a 24 bit 512x512 or smaller image | 2541 | Replace texture [TEXTURE_NUM] with a 24 bit 512x512 or smaller image |
2551 | then click "Set" again. | 2542 | then click "Set" again. |
2552 | </message> | 2543 | </message> |
2553 | </alert> | 2544 | </alert> |
2554 | <alert modal="true" name="InvalidTerrainSize"> | 2545 | <alert modal="true" name="InvalidTerrainSize"> |
2555 | <message name="message"> | 2546 | <message name="message"> |
2556 | Couldn't set region textures: | 2547 | Couldn't set region textures: |
2557 | 2548 | ||
2558 | Terrain texture [TEXTURE_NUM] is too large at [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]. | 2549 | Terrain texture [TEXTURE_NUM] is too large at [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]. |
2559 | 2550 | ||
2560 | Replace texture [TEXTURE_NUM] with a 24 bit 512x512 or smaller image | 2551 | Replace texture [TEXTURE_NUM] with a 24 bit 512x512 or smaller image |
2561 | then click "Set" again. | 2552 | then click "Set" again. |
2562 | </message> | 2553 | </message> |
2563 | </alert> | 2554 | </alert> |
2564 | <alert modal="true" name="RawUploadStarted"> | 2555 | <alert modal="true" name="RawUploadStarted"> |
2565 | <message name="message"> | 2556 | <message name="message"> |
2566 | Upload started. It may take up to two minutes, | 2557 | Upload started. It may take up to two minutes, |
2567 | depending on your connection speed. | 2558 | depending on your connection speed. |
2568 | </message> | 2559 | </message> |
2569 | </alert> | 2560 | </alert> |
2570 | <alert modal="true" name="ConfirmBakeTerrain"> | 2561 | <alert modal="true" name="ConfirmBakeTerrain"> |
2571 | <message name="message"> | 2562 | <message name="message"> |
2572 | Do you really want to bake the current terrain, | 2563 | Do you really want to bake the current terrain, |
2573 | make it the center for terrain raise/lower limits | 2564 | make it the center for terrain raise/lower limits |
2574 | and the default for the 'Revert' tool? | 2565 | and the default for the 'Revert' tool? |
2575 | </message> | 2566 | </message> |
2576 | <option name="Bake"> | 2567 | <option name="Bake"> |
@@ -2618,19 +2609,19 @@ and the default for the 'Revert' tool? | |||
2618 | </alert> | 2609 | </alert> |
2619 | <alert modal="true" name="ClassifiedMustBeAlphanumeric"> | 2610 | <alert modal="true" name="ClassifiedMustBeAlphanumeric"> |
2620 | <message name="message"> | 2611 | <message name="message"> |
2621 | The name of your classified must start with a letter | 2612 | The name of your classified must start with a letter |
2622 | from A to Z or a number. No punctuation is allowed. | 2613 | from A to Z or a number. No punctuation is allowed. |
2623 | </message> | 2614 | </message> |
2624 | </alert> | 2615 | </alert> |
2625 | <alert modal="true" name="CantSetBuyObject"> | 2616 | <alert modal="true" name="CantSetBuyObject"> |
2626 | <message name="message"> | 2617 | <message name="message"> |
2627 | Can't set Buy Object, because the object is not for sale. | 2618 | Can't set Buy Object, because the object is not for sale. |
2628 | Please set the object for sale and try again. | 2619 | Please set the object for sale and try again. |
2629 | </message> | 2620 | </message> |
2630 | </alert> | 2621 | </alert> |
2631 | <alert modal="true" name="FinishedRawDownload"> | 2622 | <alert modal="true" name="FinishedRawDownload"> |
2632 | <message name="message"> | 2623 | <message name="message"> |
2633 | Finished download of raw terrain file to: | 2624 | Finished download of raw terrain file to: |
2634 | [DOWNLOAD_PATH] | 2625 | [DOWNLOAD_PATH] |
2635 | </message> | 2626 | </message> |
2636 | </alert> | 2627 | </alert> |
@@ -2638,7 +2629,7 @@ Please set the object for sale and try again. | |||
2638 | <message name="message"> | 2629 | <message name="message"> |
2639 | A new version of [SECOND_LIFE] is available. | 2630 | A new version of [SECOND_LIFE] is available. |
2640 | [MESSAGE] | 2631 | [MESSAGE] |
2641 | 2632 | ||
2642 | You must download this update to use the system. | 2633 | You must download this update to use the system. |
2643 | </message> | 2634 | </message> |
2644 | <option name="Download"> | 2635 | <option name="Download"> |
@@ -2652,7 +2643,7 @@ You must download this update to use the system. | |||
2652 | <message name="message"> | 2643 | <message name="message"> |
2653 | An updated version of [SECOND_LIFE] is available. | 2644 | An updated version of [SECOND_LIFE] is available. |
2654 | [MESSAGE] | 2645 | [MESSAGE] |
2655 | 2646 | ||
2656 | This update is not required, but we suggest you install it to improve performance and stability. | 2647 | This update is not required, but we suggest you install it to improve performance and stability. |
2657 | </message> | 2648 | </message> |
2658 | <option name="Download"> | 2649 | <option name="Download"> |
@@ -2666,7 +2657,7 @@ This update is not required, but we suggest you install it to improve performanc | |||
2666 | <message name="message"> | 2657 | <message name="message"> |
2667 | An updated version of [SECOND_LIFE] is available. | 2658 | An updated version of [SECOND_LIFE] is available. |
2668 | [MESSAGE] | 2659 | [MESSAGE] |
2669 | 2660 | ||
2670 | This update is not required, but we suggest you install it to improve performance and stability. | 2661 | This update is not required, but we suggest you install it to improve performance and stability. |
2671 | </message> | 2662 | </message> |
2672 | <option name="Download"> | 2663 | <option name="Download"> |
@@ -2682,7 +2673,7 @@ This update is not required, but we suggest you install it to improve performanc | |||
2682 | [MESSAGE] | 2673 | [MESSAGE] |
2683 | 2674 | ||
2684 | You must download this update to use the system. | 2675 | You must download this update to use the system. |
2685 | 2676 | ||
2686 | Download to your Applications folder? | 2677 | Download to your Applications folder? |
2687 | </message> | 2678 | </message> |
2688 | <option name="Download"> | 2679 | <option name="Download"> |
@@ -2696,9 +2687,9 @@ Download to your Applications folder? | |||
2696 | <message name="message"> | 2687 | <message name="message"> |
2697 | An updated version of [SECOND_LIFE] is available. | 2688 | An updated version of [SECOND_LIFE] is available. |
2698 | [MESSAGE] | 2689 | [MESSAGE] |
2699 | 2690 | ||
2700 | This update is not required, but we suggest you install it to improve performance and stability. | 2691 | This update is not required, but we suggest you install it to improve performance and stability. |
2701 | 2692 | ||
2702 | Download to your Applications folder? | 2693 | Download to your Applications folder? |
2703 | </message> | 2694 | </message> |
2704 | <option name="Download"> | 2695 | <option name="Download"> |
@@ -2712,9 +2703,9 @@ Download to your Applications folder? | |||
2712 | <message name="message"> | 2703 | <message name="message"> |
2713 | An updated version of [SECOND_LIFE] is available. | 2704 | An updated version of [SECOND_LIFE] is available. |
2714 | [MESSAGE] | 2705 | [MESSAGE] |
2715 | 2706 | ||
2716 | This update is not required, but we suggest you install it to improve performance and stability. | 2707 | This update is not required, but we suggest you install it to improve performance and stability. |
2717 | 2708 | ||
2718 | Download to your Applications folder? | 2709 | Download to your Applications folder? |
2719 | </message> | 2710 | </message> |
2720 | <option name="Download"> | 2711 | <option name="Download"> |
@@ -2743,10 +2734,10 @@ Download to your Applications folder? | |||
2743 | <message name="message"> | 2734 | <message name="message"> |
2744 | Classified ads appear in the 'Classified' section of the | 2735 | Classified ads appear in the 'Classified' section of the |
2745 | Find directory for one week. | 2736 | Find directory for one week. |
2746 | 2737 | ||
2747 | Fill out your ad, then click 'Publish...' to add it to the | 2738 | Fill out your ad, then click 'Publish...' to add it to the |
2748 | directory. | 2739 | directory. |
2749 | 2740 | ||
2750 | You'll be asked for a price to pay when clicking Publish. | 2741 | You'll be asked for a price to pay when clicking Publish. |
2751 | Paying more makes your ad appear higher in the list, and | 2742 | Paying more makes your ad appear higher in the list, and |
2752 | also appear higher when people search for keywords. | 2743 | also appear higher when people search for keywords. |
@@ -2775,6 +2766,62 @@ also appear higher when people search for keywords. | |||
2775 | Cancel | 2766 | Cancel |
2776 | </option> | 2767 | </option> |
2777 | </alert> | 2768 | </alert> |
2769 | <alert modal="true" name="WebLaunchBugReport101"> | ||
2770 | <message name="message"> | ||
2771 | Visit the [SECOND_LIFE] Wiki and Learn how to Report Bugs Correctly. | ||
2772 | </message> | ||
2773 | <ignore> | ||
2774 | When launching web browser to view the Bug Reporting 101 Wiki | ||
2775 | </ignore> | ||
2776 | <option name="Gotopage"> | ||
2777 | Go to page | ||
2778 | </option> | ||
2779 | <option name="Cancel"> | ||
2780 | Cancel | ||
2781 | </option> | ||
2782 | </alert> | ||
2783 | <alert modal="true" name="WebLaunchSecurityIssues"> | ||
2784 | <message name="message"> | ||
2785 | Visit the [SECOND_LIFE] Wiki for Details of How to Report a Security Issue. | ||
2786 | </message> | ||
2787 | <ignore> | ||
2788 | When launching web browser to view Security Issues Wiki | ||
2789 | </ignore> | ||
2790 | <option name="Gotopage"> | ||
2791 | Go to page | ||
2792 | </option> | ||
2793 | <option name="Cancel"> | ||
2794 | Cancel | ||
2795 | </option> | ||
2796 | </alert> | ||
2797 | <alert modal="true" name="WebLaunchPublicIssue"> | ||
2798 | <message name="message"> | ||
2799 | Visit the [SECOND_LIFE] Public Issue Tracker, Where you can Report Bugs and other Issues. | ||
2800 | </message> | ||
2801 | <ignore> | ||
2802 | When launching web browser to view the Public Issue Tracker | ||
2803 | </ignore> | ||
2804 | <option name="Gotopage"> | ||
2805 | Go to page | ||
2806 | </option> | ||
2807 | <option name="Cancel"> | ||
2808 | Cancel | ||
2809 | </option> | ||
2810 | </alert> | ||
2811 | <alert modal="true" name="WebLaunchPublicIssueHelp"> | ||
2812 | <message name="message"> | ||
2813 | Visit the [SECOND_LIFE] Wiki for info on how to use the Public Issue Tracker. | ||
2814 | </message> | ||
2815 | <ignore> | ||
2816 | When launching web browser to view Public Issue Tracker Wiki | ||
2817 | </ignore> | ||
2818 | <option name="Gotopage"> | ||
2819 | Go to page | ||
2820 | </option> | ||
2821 | <option name="Cancel"> | ||
2822 | Cancel | ||
2823 | </option> | ||
2824 | </alert> | ||
2778 | <alert modal="true" name="WebLaunchForums"> | 2825 | <alert modal="true" name="WebLaunchForums"> |
2779 | <message name="message"> | 2826 | <message name="message"> |
2780 | Search the [SECOND_LIFE] Knowledge Base for the latest tips and tricks. | 2827 | Search the [SECOND_LIFE] Knowledge Base for the latest tips and tricks. |
@@ -2865,7 +2912,7 @@ also appear higher when people search for keywords. | |||
2865 | objects to their owners? Transferable deeded | 2912 | objects to their owners? Transferable deeded |
2866 | objects will be returned to their previous owners. | 2913 | objects will be returned to their previous owners. |
2867 | (All objects returned will return to the folder they were last in.) | 2914 | (All objects returned will return to the folder they were last in.) |
2868 | 2915 | ||
2869 | *WARNING* No-transfer deeded objects will be deleted! | 2916 | *WARNING* No-transfer deeded objects will be deleted! |
2870 | </message> | 2917 | </message> |
2871 | <ignore> | 2918 | <ignore> |
@@ -2931,7 +2978,7 @@ Leave Group? | |||
2931 | </alert> | 2978 | </alert> |
2932 | <alert modal="true" name="MuteByName" title="Mute object by name"> | 2979 | <alert modal="true" name="MuteByName" title="Mute object by name"> |
2933 | <message name="message"> | 2980 | <message name="message"> |
2934 | Mute by name only affects object chat and IM, not sounds. | 2981 | Mute by name only affects object chat and IM, not sounds. |
2935 | You must type the object's name exactly. | 2982 | You must type the object's name exactly. |
2936 | </message> | 2983 | </message> |
2937 | <editline> | 2984 | <editline> |
@@ -3173,13 +3220,13 @@ sent to everyone currently in your estate. | |||
3173 | </alert> | 3220 | </alert> |
3174 | <alert name="ChangeLindenEstate" title="Change Linden Estate"> | 3221 | <alert name="ChangeLindenEstate" title="Change Linden Estate"> |
3175 | <message name="message"> | 3222 | <message name="message"> |
3176 | You are about to change a Linden owned estate (mainland, | 3223 | You are about to change a Linden owned estate (mainland, |
3177 | teen grid, orientation, etc.). | 3224 | teen grid, orientation, etc.). |
3178 | 3225 | ||
3179 | This is EXTREMELY DANGEROUS because it can fundamentally | 3226 | This is EXTREMELY DANGEROUS because it can fundamentally |
3180 | affect the user experience. On the mainland, it will change | 3227 | affect the user experience. On the mainland, it will change |
3181 | thousands of regions and make the spaceserver hiccup. | 3228 | thousands of regions and make the spaceserver hiccup. |
3182 | 3229 | ||
3183 | Proceed? | 3230 | Proceed? |
3184 | </message> | 3231 | </message> |
3185 | <option name="ChangeEstate"> | 3232 | <option name="ChangeEstate"> |
@@ -3191,16 +3238,16 @@ Proceed? | |||
3191 | </alert> | 3238 | </alert> |
3192 | <alert name="ChangeLindenAccess" title="Change Linden Estate Access"> | 3239 | <alert name="ChangeLindenAccess" title="Change Linden Estate Access"> |
3193 | <message name="message"> | 3240 | <message name="message"> |
3194 | You are about to change the access list for a Linden owned | 3241 | You are about to change the access list for a Linden owned |
3195 | estate (mainland, teen grid, orientation, etc.). | 3242 | estate (mainland, teen grid, orientation, etc.). |
3196 | 3243 | ||
3197 | This is DANGEROUS and should only be done to invoke the | 3244 | This is DANGEROUS and should only be done to invoke the |
3198 | hack allowing objects/money to be transfered in/out of | 3245 | hack allowing objects/money to be transfered in/out of |
3199 | a grid. | 3246 | a grid. |
3200 | 3247 | ||
3201 | It will change thousands of regions and make the | 3248 | It will change thousands of regions and make the |
3202 | spaceserver hiccup. | 3249 | spaceserver hiccup. |
3203 | 3250 | ||
3204 | Proceed? | 3251 | Proceed? |
3205 | </message> | 3252 | </message> |
3206 | <option name="ChangeEstate"> | 3253 | <option name="ChangeEstate"> |
@@ -3393,7 +3440,7 @@ Proceed? | |||
3393 | <alert name="PublishClassified"> | 3440 | <alert name="PublishClassified"> |
3394 | <message name="message"> | 3441 | <message name="message"> |
3395 | Remember: Classified ad fees are non-refundable. | 3442 | Remember: Classified ad fees are non-refundable. |
3396 | 3443 | ||
3397 | Publish this classified now for L$[AMOUNT]? | 3444 | Publish this classified now for L$[AMOUNT]? |
3398 | </message> | 3445 | </message> |
3399 | <option name="Publish"> | 3446 | <option name="Publish"> |
@@ -3431,7 +3478,7 @@ sent to everyone in this region. | |||
3431 | <message name="message"> | 3478 | <message name="message"> |
3432 | If this box is checked, land owners will not be able to terraform | 3479 | If this box is checked, land owners will not be able to terraform |
3433 | their land regardless of the per-parcel 'Edit Terrain' setting. | 3480 | their land regardless of the per-parcel 'Edit Terrain' setting. |
3434 | 3481 | ||
3435 | Default: off | 3482 | Default: off |
3436 | </message> | 3483 | </message> |
3437 | </alert> | 3484 | </alert> |
@@ -3439,7 +3486,7 @@ Default: off | |||
3439 | <message name="message"> | 3486 | <message name="message"> |
3440 | If this box is checked, people will not be able to fly in this region | 3487 | If this box is checked, people will not be able to fly in this region |
3441 | regardless of the per-parcel 'Fly' setting. | 3488 | regardless of the per-parcel 'Fly' setting. |
3442 | 3489 | ||
3443 | Default: off | 3490 | Default: off |
3444 | </message> | 3491 | </message> |
3445 | </alert> | 3492 | </alert> |
@@ -3447,18 +3494,18 @@ Default: off | |||
3447 | <message name="message"> | 3494 | <message name="message"> |
3448 | Checking this box enables the health system across all parcels | 3495 | Checking this box enables the health system across all parcels |
3449 | regardless of individual parcel settings. If this box is left | 3496 | regardless of individual parcel settings. If this box is left |
3450 | unchecked, individual parcel owners will still be able to | 3497 | unchecked, individual parcel owners will still be able to |
3451 | activate the health system on their parcels. | 3498 | activate the health system on their parcels. |
3452 | 3499 | ||
3453 | Default: off | 3500 | Default: off |
3454 | </message> | 3501 | </message> |
3455 | </alert> | 3502 | </alert> |
3456 | <alert modal="true" name="HelpRegionAgentLimit" title="Agent Limit"> | 3503 | <alert modal="true" name="HelpRegionAgentLimit" title="Agent Limit"> |
3457 | <message name="message"> | 3504 | <message name="message"> |
3458 | Sets the maximum number of avatars allowed in this region. | 3505 | Sets the maximum number of avatars allowed in this region. |
3459 | Note that the more avatars you have in one region, the worse | 3506 | Note that the more avatars you have in one region, the worse |
3460 | the performance can be. | 3507 | the performance can be. |
3461 | 3508 | ||
3462 | Default: 30 | 3509 | Default: 30 |
3463 | </message> | 3510 | </message> |
3464 | </alert> | 3511 | </alert> |
@@ -3472,7 +3519,7 @@ allowed per region remains 15,000 no matter what the value set for | |||
3472 | Object Bonus. Once this value is set, it should not be lowered until | 3519 | Object Bonus. Once this value is set, it should not be lowered until |
3473 | you are certain that changing it will not force return or deletion of | 3520 | you are certain that changing it will not force return or deletion of |
3474 | the objects currently on parcels. | 3521 | the objects currently on parcels. |
3475 | 3522 | ||
3476 | Default: 1.0 | 3523 | Default: 1.0 |
3477 | </message> | 3524 | </message> |
3478 | </alert> | 3525 | </alert> |
@@ -3482,10 +3529,10 @@ Default: 1.0 | |||
3482 | corner of the screen and in pop-up tips on the map. Maturity | 3529 | corner of the screen and in pop-up tips on the map. Maturity |
3483 | also affects search results - residents can choose not to find | 3530 | also affects search results - residents can choose not to find |
3484 | content in Mature regions. | 3531 | content in Mature regions. |
3485 | 3532 | ||
3486 | The pop-up tips on the map will not change for 5 minutes, because | 3533 | The pop-up tips on the map will not change for 5 minutes, because |
3487 | the system only updates map information periodically. | 3534 | the system only updates map information periodically. |
3488 | 3535 | ||
3489 | Default: PG | 3536 | Default: PG |
3490 | </message> | 3537 | </message> |
3491 | </alert> | 3538 | </alert> |
@@ -3496,49 +3543,49 @@ Agents may only push themselves, or be pushed by scripts owned by | |||
3496 | the owner of a parcel, or that are set to the group of the parcel, | 3543 | the owner of a parcel, or that are set to the group of the parcel, |
3497 | assuming the parcel has a group set/deeded. | 3544 | assuming the parcel has a group set/deeded. |
3498 | Push refers to the llPushObject() LSL function. | 3545 | Push refers to the llPushObject() LSL function. |
3499 | 3546 | ||
3500 | Default: Off | 3547 | Default: Off |
3501 | </message> | 3548 | </message> |
3502 | </alert> | 3549 | </alert> |
3503 | <alert modal="true" name="HelpParcelChanges" title="Parcel Join/Subdivide"> | 3550 | <alert modal="true" name="HelpParcelChanges" title="Parcel Join/Subdivide"> |
3504 | <message name="message"> | 3551 | <message name="message"> |
3505 | Sets whether or not parcels not owned by the estate owner | 3552 | Sets whether or not parcels not owned by the estate owner |
3506 | can be joined or subdivided. | 3553 | can be joined or subdivided. |
3507 | If this option is unchecked: | 3554 | If this option is unchecked: |
3508 | * Only estate owners or managers can join or subdivide parcels. | 3555 | * Only estate owners or managers can join or subdivide parcels. |
3509 | * They may only join or subdivide parcels belonging to the owner, | 3556 | * They may only join or subdivide parcels belonging to the owner, |
3510 | or to a group where they have the appropriate group powers. | 3557 | or to a group where they have the appropriate group powers. |
3511 | If this option is checked: | 3558 | If this option is checked: |
3512 | * All parcel owners can join or subdivide the parcels they own. | 3559 | * All parcel owners can join or subdivide the parcels they own. |
3513 | * For group owned parcels, those with appropriate group powers | 3560 | * For group owned parcels, those with appropriate group powers |
3514 | may join or subdivide parcels. | 3561 | may join or subdivide parcels. |
3515 | 3562 | ||
3516 | Default: Checked | 3563 | Default: Checked |
3517 | </message> | 3564 | </message> |
3518 | </alert> | 3565 | </alert> |
3519 | <alert modal="true" name="RegionMaturityChange" title="Changed Region Maturity"> | 3566 | <alert modal="true" name="RegionMaturityChange" title="Changed Region Maturity"> |
3520 | <message name="message"> | 3567 | <message name="message"> |
3521 | The maturity rating for this region has been updated. | 3568 | The maturity rating for this region has been updated. |
3522 | 3569 | ||
3523 | The world map, however, will take approximately 5 minutes | 3570 | The world map, however, will take approximately 5 minutes |
3524 | to update, because the system only updates map information | 3571 | to update, because the system only updates map information |
3525 | periodically. | 3572 | periodically. |
3526 | </message> | 3573 | </message> |
3527 | </alert> | 3574 | </alert> |
3528 | <alert modal="true" name="HelpRegionLandResell" title="Land Resale"> | 3575 | <alert modal="true" name="HelpRegionLandResell" title="Land Resale"> |
3529 | <message name="message"> | 3576 | <message name="message"> |
3530 | Estate owners and managers can sell any land owned by the estate owner. | 3577 | Estate owners and managers can sell any land owned by the estate owner. |
3531 | If this option is left unchecked, buyers cannot resell their land in this region. | 3578 | If this option is left unchecked, buyers cannot resell their land in this region. |
3532 | If this option is checked, buyers can resell their land in this region. | 3579 | If this option is checked, buyers can resell their land in this region. |
3533 | 3580 | ||
3534 | Default: Disallow | 3581 | Default: Disallow |
3535 | </message> | 3582 | </message> |
3536 | </alert> | 3583 | </alert> |
3537 | <alert modal="true" name="HelpEstateCovenantID" title="Covenant Asset ID"> | 3584 | <alert modal="true" name="HelpEstateCovenantID" title="Covenant Asset ID"> |
3538 | <message name="message"> | 3585 | <message name="message"> |
3539 | Sets the notecard asset ID for the Estate Covenant belonging to this | 3586 | Sets the notecard asset ID for the Estate Covenant belonging to this |
3540 | estate. | 3587 | estate. |
3541 | 3588 | ||
3542 | Default: 00000000-0000-0000-0000-000000000000 or none | 3589 | Default: 00000000-0000-0000-0000-000000000000 or none |
3543 | </message> | 3590 | </message> |
3544 | </alert> | 3591 | </alert> |
@@ -3546,200 +3593,200 @@ Default: 00000000-0000-0000-0000-000000000000 or none | |||
3546 | <message name="message"> | 3593 | <message name="message"> |
3547 | When sim performance is poor, a script may be to blame. Open the | 3594 | When sim performance is poor, a script may be to blame. Open the |
3548 | Statistics Bar (Ctrl-Shift-1). Look at the Simulator Physics FPS. | 3595 | Statistics Bar (Ctrl-Shift-1). Look at the Simulator Physics FPS. |
3549 | If it is lower than 45 then open the 'Time' panel located at the | 3596 | If it is lower than 45 then open the 'Time' panel located at the |
3550 | bottom of the Stats Bar. If Script Time reads 25 ms or higher, click | 3597 | bottom of the Stats Bar. If Script Time reads 25 ms or higher, click |
3551 | the 'Get Top Scripts' button. You will be given the name and location | 3598 | the 'Get Top Scripts' button. You will be given the name and location |
3552 | of scripts that may be causing poor performance. | 3599 | of scripts that may be causing poor performance. |
3553 | 3600 | ||
3554 | Checking the 'Disable Scripts' box and then pressing the 'Apply' | 3601 | Checking the 'Disable Scripts' box and then pressing the 'Apply' |
3555 | button will temporarily disable all scripts in this region. You may | 3602 | button will temporarily disable all scripts in this region. You may |
3556 | need to do this in order to travel to the location of a noted | 3603 | need to do this in order to travel to the location of a noted |
3557 | 'top script'. Once you have arrived at the location, investigate the | 3604 | 'top script'. Once you have arrived at the location, investigate the |
3558 | script to determine if it is causing the problem. You may want to | 3605 | script to determine if it is causing the problem. You may want to |
3559 | contact the owner of the script or delete or return the object. | 3606 | contact the owner of the script or delete or return the object. |
3560 | Uncheck the 'Disable Script' box and then 'Apply' to reactivate | 3607 | Uncheck the 'Disable Script' box and then 'Apply' to reactivate |
3561 | the scripts in the region. | 3608 | the scripts in the region. |
3562 | 3609 | ||
3563 | Default: off | 3610 | Default: off |
3564 | </message> | 3611 | </message> |
3565 | </alert> | 3612 | </alert> |
3566 | <alert modal="true" name="HelpRegionDisableCollisions" title="Disable Collisions"> | 3613 | <alert modal="true" name="HelpRegionDisableCollisions" title="Disable Collisions"> |
3567 | <message name="message"> | 3614 | <message name="message"> |
3568 | When sim performance is poor, physical objects may be to blame. | 3615 | When sim performance is poor, physical objects may be to blame. |
3569 | Open the Statistics Bar (Ctrl-Shift-1). Look at the Simulator | 3616 | Open the Statistics Bar (Ctrl-Shift-1). Look at the Simulator |
3570 | Physics FPS. If it is lower than 45 then open the 'Time' panel | 3617 | Physics FPS. If it is lower than 45 then open the 'Time' panel |
3571 | located at the bottom of the Stats Bar. If Sim Time (Physics) | 3618 | located at the bottom of the Stats Bar. If Sim Time (Physics) |
3572 | reads 20 ms or higher, click the 'Get Top Colliders' button. | 3619 | reads 20 ms or higher, click the 'Get Top Colliders' button. |
3573 | You will be given the name and location of physical objects | 3620 | You will be given the name and location of physical objects |
3574 | that may be causing poor performance. | 3621 | that may be causing poor performance. |
3575 | 3622 | ||
3576 | Checking the 'Disable Collisions' box and then pressing the 'Apply' | 3623 | Checking the 'Disable Collisions' box and then pressing the 'Apply' |
3577 | button will temporarily disable object-object collisions. You may | 3624 | button will temporarily disable object-object collisions. You may |
3578 | need to do this in order to travel to the location of a noted | 3625 | need to do this in order to travel to the location of a noted |
3579 | 'top collider'. Once you have arrived at the location, investigate the | 3626 | 'top collider'. Once you have arrived at the location, investigate the |
3580 | object - is it constantly colliding with other objects? You may want to | 3627 | object - is it constantly colliding with other objects? You may want to |
3581 | contact the owner of the object or delete or return the object. | 3628 | contact the owner of the object or delete or return the object. |
3582 | Uncheck the 'Disable Collisions' box and then 'Apply' to reactivate | 3629 | Uncheck the 'Disable Collisions' box and then 'Apply' to reactivate |
3583 | collisions in the region. | 3630 | collisions in the region. |
3584 | 3631 | ||
3585 | Default: off | 3632 | Default: off |
3586 | </message> | 3633 | </message> |
3587 | </alert> | 3634 | </alert> |
3588 | <alert modal="true" name="HelpRegionDisablePhysics" title="Disable Physics"> | 3635 | <alert modal="true" name="HelpRegionDisablePhysics" title="Disable Physics"> |
3589 | <message name="message"> | 3636 | <message name="message"> |
3590 | Disable Physics is similar to Disable Collisions, except all | 3637 | Disable Physics is similar to Disable Collisions, except all |
3591 | physics simulation is disabled. This means that not only will | 3638 | physics simulation is disabled. This means that not only will |
3592 | objects stop colliding, but avatars will be unable to move. | 3639 | objects stop colliding, but avatars will be unable to move. |
3593 | 3640 | ||
3594 | This should only be used when Disable Collisions does not | 3641 | This should only be used when Disable Collisions does not |
3595 | give back enough performance to the region to investigate | 3642 | give back enough performance to the region to investigate |
3596 | a physics problem or 'Top Collider'. | 3643 | a physics problem or 'Top Collider'. |
3597 | 3644 | ||
3598 | Be sure to re-enable physics when you are done, or avatars | 3645 | Be sure to re-enable physics when you are done, or avatars |
3599 | will continue to be unable to move. | 3646 | will continue to be unable to move. |
3600 | 3647 | ||
3601 | Default: off | 3648 | Default: off |
3602 | </message> | 3649 | </message> |
3603 | </alert> | 3650 | </alert> |
3604 | <alert modal="true" name="HelpRegionTopColliders" title="Top Colliders"> | 3651 | <alert modal="true" name="HelpRegionTopColliders" title="Top Colliders"> |
3605 | <message name="message"> | 3652 | <message name="message"> |
3606 | Show a list of objects experiencing the greatest number | 3653 | Show a list of objects experiencing the greatest number |
3607 | of potential object-object collisions. These objects can | 3654 | of potential object-object collisions. These objects can |
3608 | slow sim performance. Select View > Statistics Bar and | 3655 | slow sim performance. Select View > Statistics Bar and |
3609 | look under Simulator > Time > Sim Time (Physics) to see | 3656 | look under Simulator > Time > Sim Time (Physics) to see |
3610 | if more than 20 ms is being spent in physics. | 3657 | if more than 20 ms is being spent in physics. |
3611 | </message> | 3658 | </message> |
3612 | </alert> | 3659 | </alert> |
3613 | <alert modal="true" name="HelpRegionTopScripts" title="Top Scripts"> | 3660 | <alert modal="true" name="HelpRegionTopScripts" title="Top Scripts"> |
3614 | <message name="message"> | 3661 | <message name="message"> |
3615 | Show a list of objects spending the most time running | 3662 | Show a list of objects spending the most time running |
3616 | LSL scripts. These objects can slow sim performance. | 3663 | LSL scripts. These objects can slow sim performance. |
3617 | Select View > Statistics Bar and look under | 3664 | Select View > Statistics Bar and look under |
3618 | Simulator > Time > Script Time to see if more than | 3665 | Simulator > Time > Script Time to see if more than |
3619 | 25 ms is being spent in scripts. | 3666 | 25 ms is being spent in scripts. |
3620 | </message> | 3667 | </message> |
3621 | </alert> | 3668 | </alert> |
3622 | <alert modal="true" name="HelpRegionRestart" title="Restart Region"> | 3669 | <alert modal="true" name="HelpRegionRestart" title="Restart Region"> |
3623 | <message name="message"> | 3670 | <message name="message"> |
3624 | Restart the server process running this region after a | 3671 | Restart the server process running this region after a |
3625 | two minute warning. All residents in the region will be | 3672 | two minute warning. All residents in the region will be |
3626 | disconnected. The region will save its data, and should | 3673 | disconnected. The region will save its data, and should |
3627 | come back up within 90 seconds. | 3674 | come back up within 90 seconds. |
3628 | 3675 | ||
3629 | Restarting the region will not fix most performance | 3676 | Restarting the region will not fix most performance |
3630 | problems, and should usually be used only when directed. | 3677 | problems, and should usually be used only when directed. |
3631 | </message> | 3678 | </message> |
3632 | </alert> | 3679 | </alert> |
3633 | <alert modal="true" name="HelpRegionWaterHeight" title="Water Height"> | 3680 | <alert modal="true" name="HelpRegionWaterHeight" title="Water Height"> |
3634 | <message name="message"> | 3681 | <message name="message"> |
3635 | This is the height in meters where water appears. If | 3682 | This is the height in meters where water appears. If |
3636 | this setting is anything other than 20 and you have | 3683 | this setting is anything other than 20 and you have |
3637 | water that is adjacent to the edge of world or 'void' | 3684 | water that is adjacent to the edge of world or 'void' |
3638 | water, there will be a visible gap. | 3685 | water, there will be a visible gap. |
3639 | 3686 | ||
3640 | Default: 20 | 3687 | Default: 20 |
3641 | </message> | 3688 | </message> |
3642 | </alert> | 3689 | </alert> |
3643 | <alert modal="true" name="HelpRegionTerrainRaise" title="Terrain Raise"> | 3690 | <alert modal="true" name="HelpRegionTerrainRaise" title="Terrain Raise"> |
3644 | <message name="message"> | 3691 | <message name="message"> |
3645 | This is the distance that parcel owners can raise | 3692 | This is the distance that parcel owners can raise |
3646 | their terrain above the 'baked' terrain default | 3693 | their terrain above the 'baked' terrain default |
3647 | height. | 3694 | height. |
3648 | 3695 | ||
3649 | Default: 4 | 3696 | Default: 4 |
3650 | </message> | 3697 | </message> |
3651 | </alert> | 3698 | </alert> |
3652 | <alert modal="true" name="HelpRegionTerrainLower" title="Terrain Lower"> | 3699 | <alert modal="true" name="HelpRegionTerrainLower" title="Terrain Lower"> |
3653 | <message name="message"> | 3700 | <message name="message"> |
3654 | This is the distance that parcel owners can lower | 3701 | This is the distance that parcel owners can lower |
3655 | their terrain below the 'baked' terrain default | 3702 | their terrain below the 'baked' terrain default |
3656 | height. | 3703 | height. |
3657 | 3704 | ||
3658 | Default: -4 | 3705 | Default: -4 |
3659 | </message> | 3706 | </message> |
3660 | </alert> | 3707 | </alert> |
3661 | <alert modal="true" name="HelpRegionUploadRaw" title="Upload RAW Terrain"> | 3708 | <alert modal="true" name="HelpRegionUploadRaw" title="Upload RAW Terrain"> |
3662 | <message name="message"> | 3709 | <message name="message"> |
3663 | This button uploads a .RAW file to the region you are in. | 3710 | This button uploads a .RAW file to the region you are in. |
3664 | The file must have the correct dimensions/number of channels: | 3711 | The file must have the correct dimensions/number of channels: |
3665 | RGB, 256x256 and 13 channels. The best way to create a | 3712 | RGB, 256x256 and 13 channels. The best way to create a |
3666 | terrain file is to download the existing RAW file. A good | 3713 | terrain file is to download the existing RAW file. A good |
3667 | first step is to modify the first channel (land height), | 3714 | first step is to modify the first channel (land height), |
3668 | and upload it. | 3715 | and upload it. |
3669 | 3716 | ||
3670 | The upload can take up to 45 seconds. Note that uploading a | 3717 | The upload can take up to 45 seconds. Note that uploading a |
3671 | terrain file *will not* move the objects that are on the land, | 3718 | terrain file *will not* move the objects that are on the land, |
3672 | only the terrain itself and the permissions associated with the | 3719 | only the terrain itself and the permissions associated with the |
3673 | parcels. This can result in objects going underground. | 3720 | parcels. This can result in objects going underground. |
3674 | 3721 | ||
3675 | For more information on editing region height fields, go to: | 3722 | For more information on editing region height fields, go to: |
3676 | http://secondlife.com/tiki/tiki-index.php?page=RawTerrainFile | 3723 | http://secondlife.com/tiki/tiki-index.php?page=RawTerrainFile |
3677 | </message> | 3724 | </message> |
3678 | </alert> | 3725 | </alert> |
3679 | <alert modal="true" name="HelpRegionDownloadRaw" title="Download RAW Terrain"> | 3726 | <alert modal="true" name="HelpRegionDownloadRaw" title="Download RAW Terrain"> |
3680 | <message name="message"> | 3727 | <message name="message"> |
3681 | This button downloads a file containing the height field data, | 3728 | This button downloads a file containing the height field data, |
3682 | parcel dimensions, parcel for sale status and some parcel permissions | 3729 | parcel dimensions, parcel for sale status and some parcel permissions |
3683 | for this region. When opening the file in a program such as | 3730 | for this region. When opening the file in a program such as |
3684 | Photoshop you must specify the document's dimensions which | 3731 | Photoshop you must specify the document's dimensions which |
3685 | are: RGB, 256x256 with 13 channels. This terrain file cannot | 3732 | are: RGB, 256x256 with 13 channels. This terrain file cannot |
3686 | be opened in any other way. | 3733 | be opened in any other way. |
3687 | 3734 | ||
3688 | For more information on editing region height fields, go to: | 3735 | For more information on editing region height fields, go to: |
3689 | http://secondlife.com/tiki/tiki-index.php?page=RawTerrainFile | 3736 | http://secondlife.com/tiki/tiki-index.php?page=RawTerrainFile |
3690 | </message> | 3737 | </message> |
3691 | </alert> | 3738 | </alert> |
3692 | <alert modal="true" name="HelpRegionUseEstateSun" title="Use Estate Sun"> | 3739 | <alert modal="true" name="HelpRegionUseEstateSun" title="Use Estate Sun"> |
3693 | <message name="message"> | 3740 | <message name="message"> |
3694 | This checkbox makes the sun position in this region the | 3741 | This checkbox makes the sun position in this region the |
3695 | same as the sun position in the rest of the estate. | 3742 | same as the sun position in the rest of the estate. |
3696 | 3743 | ||
3697 | Default: on | 3744 | Default: on |
3698 | </message> | 3745 | </message> |
3699 | </alert> | 3746 | </alert> |
3700 | <alert modal="true" name="HelpRegionFixedSun" title="Fixed Sun"> | 3747 | <alert modal="true" name="HelpRegionFixedSun" title="Fixed Sun"> |
3701 | <message name="message"> | 3748 | <message name="message"> |
3702 | This checkbox sets the sun position to the position | 3749 | This checkbox sets the sun position to the position |
3703 | in the Phase slider and stops the sun from moving. | 3750 | in the Phase slider and stops the sun from moving. |
3704 | 3751 | ||
3705 | Default: off | 3752 | Default: off |
3706 | </message> | 3753 | </message> |
3707 | </alert> | 3754 | </alert> |
3708 | <alert modal="true" name="HelpRegionBakeTerrain" title="Bake Terrain"> | 3755 | <alert modal="true" name="HelpRegionBakeTerrain" title="Bake Terrain"> |
3709 | <message name="message"> | 3756 | <message name="message"> |
3710 | This button saves the current shape of the terrain as the | 3757 | This button saves the current shape of the terrain as the |
3711 | new default for the region. Once baked, the land can revert | 3758 | new default for the region. Once baked, the land can revert |
3712 | to the saved shape whenever you or others use the Edit Terrain | 3759 | to the saved shape whenever you or others use the Edit Terrain |
3713 | 'Revert' option/tool. The baked terrain is also the middle | 3760 | 'Revert' option/tool. The baked terrain is also the middle |
3714 | point for the terrain raise and lower limits. | 3761 | point for the terrain raise and lower limits. |
3715 | </message> | 3762 | </message> |
3716 | </alert> | 3763 | </alert> |
3717 | <alert modal="true" name="HelpEstateEstateManager" title="Estate Managers"> | 3764 | <alert modal="true" name="HelpEstateEstateManager" title="Estate Managers"> |
3718 | <message name="message"> | 3765 | <message name="message"> |
3719 | An estate manager is a resident to whom you have delegated | 3766 | An estate manager is a resident to whom you have delegated |
3720 | control of region and estate settings. An estate manager | 3767 | control of region and estate settings. An estate manager |
3721 | can change any setting in these panels, except for uploading, | 3768 | can change any setting in these panels, except for uploading, |
3722 | downloading, and baking terrain. In particular, they can | 3769 | downloading, and baking terrain. In particular, they can |
3723 | allow or ban residents from your estate. | 3770 | allow or ban residents from your estate. |
3724 | 3771 | ||
3725 | Estate managers can only be added or removed by the owner | 3772 | Estate managers can only be added or removed by the owner |
3726 | of the estate, not by each other. Please only choose | 3773 | of the estate, not by each other. Please only choose |
3727 | residents you trust as estate managers, as you will be | 3774 | residents you trust as estate managers, as you will be |
3728 | ultimately responsible for their actions. | 3775 | ultimately responsible for their actions. |
3729 | </message> | 3776 | </message> |
3730 | </alert> | 3777 | </alert> |
3731 | <alert modal="true" name="HelpEstateUseGlobalTime" title="Use Global Time"> | 3778 | <alert modal="true" name="HelpEstateUseGlobalTime" title="Use Global Time"> |
3732 | <message name="message"> | 3779 | <message name="message"> |
3733 | This checkbox makes the sun in your estate follow | 3780 | This checkbox makes the sun in your estate follow |
3734 | the same position as on the Linden-owned 'mainland' | 3781 | the same position as on the Linden-owned 'mainland' |
3735 | estates. | 3782 | estates. |
3736 | 3783 | ||
3737 | Default: on | 3784 | Default: on |
3738 | </message> | 3785 | </message> |
3739 | </alert> | 3786 | </alert> |
3740 | <alert modal="true" name="HelpEstateFixedSun" title="Fixed Sun"> | 3787 | <alert modal="true" name="HelpEstateFixedSun" title="Fixed Sun"> |
3741 | <message name="message"> | 3788 | <message name="message"> |
3742 | This checkbox sets the sun position to the position | 3789 | This checkbox sets the sun position to the position |
3743 | in the Phase slider and stops the sun from moving. | 3790 | in the Phase slider and stops the sun from moving. |
3744 | </message> | 3791 | </message> |
3745 | </alert> | 3792 | </alert> |
@@ -3747,91 +3794,91 @@ in the Phase slider and stops the sun from moving. | |||
3747 | <message name="message"> | 3794 | <message name="message"> |
3748 | Sets whether residents who are on other estates can enter this | 3795 | Sets whether residents who are on other estates can enter this |
3749 | estate without being on an access list. | 3796 | estate without being on an access list. |
3750 | 3797 | ||
3751 | Default: on | 3798 | Default: on |
3752 | </message> | 3799 | </message> |
3753 | </alert> | 3800 | </alert> |
3754 | <alert modal="true" name="HelpEstateAllowDirectTeleport" title="Allow Direct Teleport"> | 3801 | <alert modal="true" name="HelpEstateAllowDirectTeleport" title="Allow Direct Teleport"> |
3755 | <message name="message"> | 3802 | <message name="message"> |
3756 | When checked, allows residents to directly teleport to any | 3803 | When checked, allows residents to directly teleport to any |
3757 | point in your estate. When unchecked, residents teleport | 3804 | point in your estate. When unchecked, residents teleport |
3758 | to the nearest telehub. | 3805 | to the nearest telehub. |
3759 | 3806 | ||
3760 | Default: off | 3807 | Default: off |
3761 | </message> | 3808 | </message> |
3762 | </alert> | 3809 | </alert> |
3763 | <alert modal="true" name="HelpEstateAllowResident" title="Allow Access"> | 3810 | <alert modal="true" name="HelpEstateAllowResident" title="Allow Access"> |
3764 | <message name="message"> | 3811 | <message name="message"> |
3765 | If any resident is listed here, access to the estate will be | 3812 | If any resident is listed here, access to the estate will be |
3766 | limited to residents on this list and groups listed below. | 3813 | limited to residents on this list and groups listed below. |
3767 | 3814 | ||
3768 | (If the estate is visible from the mainland, access cannot be | 3815 | (If the estate is visible from the mainland, access cannot be |
3769 | limited to a resident or group list, and these controls will be | 3816 | limited to a resident or group list, and these controls will be |
3770 | disabled. Only the 'access denied' list will be used.) | 3817 | disabled. Only the 'access denied' list will be used.) |
3771 | </message> | 3818 | </message> |
3772 | </alert> | 3819 | </alert> |
3773 | <alert modal="true" name="HelpEstateAllowGroup" title="Allow Group Access"> | 3820 | <alert modal="true" name="HelpEstateAllowGroup" title="Allow Group Access"> |
3774 | <message name="message"> | 3821 | <message name="message"> |
3775 | If any group is listed here, access to the estate will be | 3822 | If any group is listed here, access to the estate will be |
3776 | limited to the groups on this list and residents specifically | 3823 | limited to the groups on this list and residents specifically |
3777 | allowed above. | 3824 | allowed above. |
3778 | 3825 | ||
3779 | (If the estate is visible from the mainland, access cannot be | 3826 | (If the estate is visible from the mainland, access cannot be |
3780 | limited to a resident or group list, and these controls will be | 3827 | limited to a resident or group list, and these controls will be |
3781 | disabled. Only the 'access denied' list will be used.) | 3828 | disabled. Only the 'access denied' list will be used.) |
3782 | </message> | 3829 | </message> |
3783 | </alert> | 3830 | </alert> |
3784 | <alert modal="true" name="HelpEstateBanResident" title="Deny Access"> | 3831 | <alert modal="true" name="HelpEstateBanResident" title="Deny Access"> |
3785 | <message name="message"> | 3832 | <message name="message"> |
3786 | Residents on this list are denied access to your estate, | 3833 | Residents on this list are denied access to your estate, |
3787 | regardless of the allow and group settings above. | 3834 | regardless of the allow and group settings above. |
3788 | 3835 | ||
3789 | Adding a resident to this list will remove them from | 3836 | Adding a resident to this list will remove them from |
3790 | the allow list. | 3837 | the allow list. |
3791 | </message> | 3838 | </message> |
3792 | </alert> | 3839 | </alert> |
3793 | <alert modal="true" name="HelpEstateCovenant" title="Estate Covenant"> | 3840 | <alert modal="true" name="HelpEstateCovenant" title="Estate Covenant"> |
3794 | <message name="message"> | 3841 | <message name="message"> |
3795 | Setting an estate covenant enables you to sell parcels | 3842 | Setting an estate covenant enables you to sell parcels |
3796 | within that estate. If a covenant is not set, you cannot | 3843 | within that estate. If a covenant is not set, you cannot |
3797 | sell the land. The notecard for your covenant can be empty | 3844 | sell the land. The notecard for your covenant can be empty |
3798 | if you do not wish to apply any rules or advise buyers of | 3845 | if you do not wish to apply any rules or advise buyers of |
3799 | anything in relation to the land before they buy it. | 3846 | anything in relation to the land before they buy it. |
3800 | 3847 | ||
3801 | A covenant can be used to communicate rules, guidelines, | 3848 | A covenant can be used to communicate rules, guidelines, |
3802 | cultural information or simply your own expectations to the | 3849 | cultural information or simply your own expectations to the |
3803 | prospective buyer. This can include zoning, building regulations, | 3850 | prospective buyer. This can include zoning, building regulations, |
3804 | payment options or any other information you feel it is | 3851 | payment options or any other information you feel it is |
3805 | important for the new owner to have seen and to have agreed | 3852 | important for the new owner to have seen and to have agreed |
3806 | to before they purchase. | 3853 | to before they purchase. |
3807 | 3854 | ||
3808 | The buyer must agree to the covenant by ticking the check box | 3855 | The buyer must agree to the covenant by ticking the check box |
3809 | before they will be able to finish the purchase. Estate | 3856 | before they will be able to finish the purchase. Estate |
3810 | covenants are always visible in the About Land dialog for | 3857 | covenants are always visible in the About Land dialog for |
3811 | any parcels that have one set. | 3858 | any parcels that have one set. |
3812 | </message> | 3859 | </message> |
3813 | </alert> | 3860 | </alert> |
3814 | <alert modal="true" name="BuyObjectOneOnly" title="Can't Buy Objects"> | 3861 | <alert modal="true" name="BuyObjectOneOnly" title="Can't Buy Objects"> |
3815 | <message name="message"> | 3862 | <message name="message"> |
3816 | Unable to buy more than one object at a time. | 3863 | Unable to buy more than one object at a time. |
3817 | Please select only one object and try again. | 3864 | Please select only one object and try again. |
3818 | </message> | 3865 | </message> |
3819 | </alert> | 3866 | </alert> |
3820 | <alert modal="true" name="BuyObjectOneOwner" title="Can't Buy Objects"> | 3867 | <alert modal="true" name="BuyObjectOneOwner" title="Can't Buy Objects"> |
3821 | <message name="message"> | 3868 | <message name="message"> |
3822 | Cannot buy objects from different owners at the same time. | 3869 | Cannot buy objects from different owners at the same time. |
3823 | Please select only one object and try again. | 3870 | Please select only one object and try again. |
3824 | </message> | 3871 | </message> |
3825 | </alert> | 3872 | </alert> |
3826 | <alert modal="true" name="BuyContentsOneOnly" title="Can't Buy Contents"> | 3873 | <alert modal="true" name="BuyContentsOneOnly" title="Can't Buy Contents"> |
3827 | <message name="message"> | 3874 | <message name="message"> |
3828 | Unable to buy the contents of more than one object at a time. | 3875 | Unable to buy the contents of more than one object at a time. |
3829 | Please select only one object and try again. | 3876 | Please select only one object and try again. |
3830 | </message> | 3877 | </message> |
3831 | </alert> | 3878 | </alert> |
3832 | <alert modal="true" name="BuyContentsOneOwner" title="Can't Buy Contents"> | 3879 | <alert modal="true" name="BuyContentsOneOwner" title="Can't Buy Contents"> |
3833 | <message name="message"> | 3880 | <message name="message"> |
3834 | Cannot buy objects from different owners at the same time. | 3881 | Cannot buy objects from different owners at the same time. |
3835 | Please select only one object and try again. | 3882 | Please select only one object and try again. |
3836 | </message> | 3883 | </message> |
3837 | </alert> | 3884 | </alert> |
@@ -3936,9 +3983,9 @@ They will be copied to your inventory. | |||
3936 | <alert modal="true" name="ConfirmPurchase" nodefault="true"> | 3983 | <alert modal="true" name="ConfirmPurchase" nodefault="true"> |
3937 | <message name="message"> | 3984 | <message name="message"> |
3938 | This transaction will: | 3985 | This transaction will: |
3939 | 3986 | ||
3940 | [ACTION] | 3987 | [ACTION] |
3941 | 3988 | ||
3942 | Are you sure you want to proceed with this purchase? | 3989 | Are you sure you want to proceed with this purchase? |
3943 | </message> | 3990 | </message> |
3944 | <option name="Confirm"> | 3991 | <option name="Confirm"> |
@@ -3951,9 +3998,9 @@ Are you sure you want to proceed with this purchase? | |||
3951 | <alert modal="true" name="ConfirmPurchasePassword" nodefault="true"> | 3998 | <alert modal="true" name="ConfirmPurchasePassword" nodefault="true"> |
3952 | <message name="message"> | 3999 | <message name="message"> |
3953 | This transaction will: | 4000 | This transaction will: |
3954 | 4001 | ||
3955 | [ACTION] | 4002 | [ACTION] |
3956 | 4003 | ||
3957 | Are you sure you want to proceed with this purchase? | 4004 | Are you sure you want to proceed with this purchase? |
3958 | Please re-enter your password and click Confirm. | 4005 | Please re-enter your password and click Confirm. |
3959 | </message> | 4006 | </message> |
@@ -3980,7 +4027,7 @@ will retain their original values. | |||
3980 | <message name="message"> | 4027 | <message name="message"> |
3981 | You have selected 'no copy' inventory items. | 4028 | You have selected 'no copy' inventory items. |
3982 | These items will be moved to your inventory, not copied. | 4029 | These items will be moved to your inventory, not copied. |
3983 | 4030 | ||
3984 | Move the inventory item(s)? | 4031 | Move the inventory item(s)? |
3985 | </message> | 4032 | </message> |
3986 | <ignore> | 4033 | <ignore> |
@@ -3995,12 +4042,12 @@ Move the inventory item(s)? | |||
3995 | </alert> | 4042 | </alert> |
3996 | <alert modal="true" name="MoveInventoryFromScriptedObject"> | 4043 | <alert modal="true" name="MoveInventoryFromScriptedObject"> |
3997 | <message name="message"> | 4044 | <message name="message"> |
3998 | You have selected 'no copy' inventory items. These items | 4045 | You have selected 'no copy' inventory items. These items |
3999 | will be moved to your inventory, not copied. | 4046 | will be moved to your inventory, not copied. |
4000 | 4047 | ||
4001 | Because this object is scripted, moving these items | 4048 | Because this object is scripted, moving these items |
4002 | to your inventory may cause the script to malfunction. | 4049 | to your inventory may cause the script to malfunction. |
4003 | 4050 | ||
4004 | Move the inventory item(s)? | 4051 | Move the inventory item(s)? |
4005 | </message> | 4052 | </message> |
4006 | <ignore> | 4053 | <ignore> |
@@ -4015,9 +4062,9 @@ Move the inventory item(s)? | |||
4015 | </alert> | 4062 | </alert> |
4016 | <alert name="ClickActionNotPayable"> | 4063 | <alert name="ClickActionNotPayable"> |
4017 | <message name="message"> | 4064 | <message name="message"> |
4018 | Warning: The Pay Object click action has been set, but it | 4065 | Warning: The Pay Object click action has been set, but it |
4019 | will only work if a script is added with a money() event. | 4066 | will only work if a script is added with a money() event. |
4020 | This is because residents generally expect that objects | 4067 | This is because residents generally expect that objects |
4021 | will react somehow when money is payed into them. | 4068 | will react somehow when money is payed into them. |
4022 | </message> | 4069 | </message> |
4023 | <ignore> | 4070 | <ignore> |
@@ -4045,48 +4092,48 @@ will react somehow when money is payed into them. | |||
4045 | </alert> | 4092 | </alert> |
4046 | <alert modal="true" name="HelpReportAbuseEmailLL" > | 4093 | <alert modal="true" name="HelpReportAbuseEmailLL" > |
4047 | <message name="message"> | 4094 | <message name="message"> |
4048 | Use this tool to report violations of the Terms of Service | 4095 | Use this tool to report violations of the Terms of Service |
4049 | and Community Standards. See: | 4096 | and Community Standards. See: |
4050 | - | 4097 | - |
4051 | http://secondlife.com/corporate/tos.php | 4098 | http://secondlife.com/corporate/tos.php |
4052 | http://secondlife.com/corporate/cs.php | 4099 | http://secondlife.com/corporate/cs.php |
4053 | - | 4100 | - |
4054 | All reported abuses of the Terms of Service and Community Standards | 4101 | All reported abuses of the Terms of Service and Community Standards |
4055 | are investigated and resolved. You will receive an email informing you | 4102 | are investigated and resolved. You will receive an email informing you |
4056 | of the resolution when it occurs. You can also view the incident | 4103 | of the resolution when it occurs. You can also view the incident |
4057 | resolution on the Police Blotter at: | 4104 | resolution on the Police Blotter at: |
4058 | - | 4105 | - |
4059 | http://secondlife.com/community/blotter.php | 4106 | http://secondlife.com/community/blotter.php |
4060 | </message> | 4107 | </message> |
4061 | </alert> | 4108 | </alert> |
4062 | <alert modal="true" name="HelpReportAbuseEmailEO"> | 4109 | <alert modal="true" name="HelpReportAbuseEmailEO"> |
4063 | <message name="message"> | 4110 | <message name="message"> |
4064 | IMPORTANT: This report will go to the owner of the | 4111 | IMPORTANT: This report will go to the owner of the |
4065 | region you are currently in and not to Linden Lab. | 4112 | region you are currently in and not to Linden Lab. |
4066 | - | 4113 | - |
4067 | As a service to residents and visitors, the owner of | 4114 | As a service to residents and visitors, the owner of |
4068 | the region you are in has elected to receive and resolve | 4115 | the region you are in has elected to receive and resolve |
4069 | all reports originating in this region. Linden Lab will | 4116 | all reports originating in this region. Linden Lab will |
4070 | not investigate reports you file from this location. | 4117 | not investigate reports you file from this location. |
4071 | The region owner will resolve reports based on the local | 4118 | The region owner will resolve reports based on the local |
4072 | rules of this region as outlined in the estate Covenant. | 4119 | rules of this region as outlined in the estate Covenant. |
4073 | (View covenants by going to the World menu and selecting | 4120 | (View covenants by going to the World menu and selecting |
4074 | About Land.) | 4121 | About Land.) |
4075 | - | 4122 | - |
4076 | The resolution of this report applies only to this Region; | 4123 | The resolution of this report applies only to this Region; |
4077 | Residents access to other areas of Second Life will not be | 4124 | Residents access to other areas of Second Life will not be |
4078 | affected by the outcome of this report. Only Linden Lab can | 4125 | affected by the outcome of this report. Only Linden Lab can |
4079 | restrict access to the entirety of Second Life. | 4126 | restrict access to the entirety of Second Life. |
4080 | </message> | 4127 | </message> |
4081 | </alert> | 4128 | </alert> |
4082 | <alert modal="true" name="HelpReportBug"> | 4129 | <alert modal="true" name="HelpReportBug"> |
4083 | <message name="message"> | 4130 | <message name="message"> |
4084 | Use this tool to *only* report technical features that do not perform as | 4131 | Use this tool to *only* report technical features that do not perform as |
4085 | described or expected, please provide as much detail as possible, You | 4132 | described or expected, please provide as much detail as possible, You |
4086 | may reply to the auto-response email to add more details to your report. | 4133 | may reply to the auto-response email to add more details to your report. |
4087 | All bug reports are investigated and assessed. No email response will be sent. | 4134 | All bug reports are investigated and assessed. No email response will be sent. |
4088 | - | 4135 | - |
4089 | If you are having a technical difficulty, please contact Support at: | 4136 | If you are having a technical difficulty, please contact Support at: |
4090 | http://secondlife.com/community/support.php | 4137 | http://secondlife.com/community/support.php |
4091 | - | 4138 | - |
4092 | Note: Incomplete reports will not be investigated | 4139 | Note: Incomplete reports will not be investigated |
@@ -4095,42 +4142,42 @@ Note: Incomplete reports will not be investigated | |||
4095 | <alert modal="true" name="HelpReportAbuseSelectCategory"> | 4142 | <alert modal="true" name="HelpReportAbuseSelectCategory"> |
4096 | <message name="message"> | 4143 | <message name="message"> |
4097 | Please select a category for this abuse report. | 4144 | Please select a category for this abuse report. |
4098 | 4145 | ||
4099 | Selecting a category helps us file and process abuse reports. | 4146 | Selecting a category helps us file and process abuse reports. |
4100 | </message> | 4147 | </message> |
4101 | </alert> | 4148 | </alert> |
4102 | <alert modal="true" name="HelpReportBugSelectCategory"> | 4149 | <alert modal="true" name="HelpReportBugSelectCategory"> |
4103 | <message name="message"> | 4150 | <message name="message"> |
4104 | Please select a category for this bug. | 4151 | Please select a category for this bug. |
4105 | 4152 | ||
4106 | Selecting a category helps us file and process bug reports. | 4153 | Selecting a category helps us file and process bug reports. |
4107 | </message> | 4154 | </message> |
4108 | </alert> | 4155 | </alert> |
4109 | <alert modal="true" name="HelpReportAbuseAbuserNameEmpty"> | 4156 | <alert modal="true" name="HelpReportAbuseAbuserNameEmpty"> |
4110 | <message name="message"> | 4157 | <message name="message"> |
4111 | Please enter the name of the abuser. | 4158 | Please enter the name of the abuser. |
4112 | 4159 | ||
4113 | Entering an accurate value helps us file and process abuse reports. | 4160 | Entering an accurate value helps us file and process abuse reports. |
4114 | </message> | 4161 | </message> |
4115 | </alert> | 4162 | </alert> |
4116 | <alert modal="true" name="HelpReportAbuseAbuserLocationEmpty"> | 4163 | <alert modal="true" name="HelpReportAbuseAbuserLocationEmpty"> |
4117 | <message name="message"> | 4164 | <message name="message"> |
4118 | Please enter the location where the abuse took place. | 4165 | Please enter the location where the abuse took place. |
4119 | 4166 | ||
4120 | Entering an accurate value helps us file and process abuse reports. | 4167 | Entering an accurate value helps us file and process abuse reports. |
4121 | </message> | 4168 | </message> |
4122 | </alert> | 4169 | </alert> |
4123 | <alert modal="true" name="HelpReportAbuseSummaryEmpty"> | 4170 | <alert modal="true" name="HelpReportAbuseSummaryEmpty"> |
4124 | <message name="message"> | 4171 | <message name="message"> |
4125 | Please enter a summary of the abuse that took place. | 4172 | Please enter a summary of the abuse that took place. |
4126 | 4173 | ||
4127 | Entering an accurate summary helps us file and process abuse reports. | 4174 | Entering an accurate summary helps us file and process abuse reports. |
4128 | </message> | 4175 | </message> |
4129 | </alert> | 4176 | </alert> |
4130 | <alert modal="true" name="HelpReportBugSummaryEmpty"> | 4177 | <alert modal="true" name="HelpReportBugSummaryEmpty"> |
4131 | <message name="message"> | 4178 | <message name="message"> |
4132 | Please enter a summary of the bug. | 4179 | Please enter a summary of the bug. |
4133 | 4180 | ||
4134 | Entering an accurate summary helps us file and process bug reports. | 4181 | Entering an accurate summary helps us file and process bug reports. |
4135 | </message> | 4182 | </message> |
4136 | </alert> | 4183 | </alert> |
@@ -4139,7 +4186,7 @@ Entering an accurate summary helps us file and process bug reports. | |||
4139 | Please enter a detailed description of the abuse that took place. | 4186 | Please enter a detailed description of the abuse that took place. |
4140 | Be as specific as you can, including names and the details of the | 4187 | Be as specific as you can, including names and the details of the |
4141 | incident you are reporting. | 4188 | incident you are reporting. |
4142 | 4189 | ||
4143 | Entering an accurate description helps us file and process abuse reports. | 4190 | Entering an accurate description helps us file and process abuse reports. |
4144 | </message> | 4191 | </message> |
4145 | </alert> | 4192 | </alert> |
@@ -4148,24 +4195,24 @@ Entering an accurate description helps us file and process abuse reports. | |||
4148 | Please enter a detailed description of the bug. | 4195 | Please enter a detailed description of the bug. |
4149 | Be as specific as you can, including steps to reproduce the bug | 4196 | Be as specific as you can, including steps to reproduce the bug |
4150 | if possible. | 4197 | if possible. |
4151 | 4198 | ||
4152 | Entering an accurate description helps us file and process bug reports. | 4199 | Entering an accurate description helps us file and process bug reports. |
4153 | </message> | 4200 | </message> |
4154 | </alert> | 4201 | </alert> |
4155 | <alert modal="true" name="HelpReportAbuseContainsCopyright"> | 4202 | <alert modal="true" name="HelpReportAbuseContainsCopyright"> |
4156 | <message name="message"> | 4203 | <message name="message"> |
4157 | Dear Resident, | 4204 | Dear Resident, |
4158 | 4205 | ||
4159 | Reports about copyright infringement can only be submitted | 4206 | Reports about copyright infringement can only be submitted |
4160 | as described at http://secondlife.com/corporate/dmca.php. | 4207 | as described at http://secondlife.com/corporate/dmca.php. |
4161 | 4208 | ||
4162 | Reports concerning copyright infringement will automatically | 4209 | Reports concerning copyright infringement will automatically |
4163 | be discarded if they are submitted through the 'Abuse Report' | 4210 | be discarded if they are submitted through the 'Abuse Report' |
4164 | feature. If your report does not relate to copyright infringement, | 4211 | feature. If your report does not relate to copyright infringement, |
4165 | you may close this window and finish submitting your report. | 4212 | you may close this window and finish submitting your report. |
4166 | 4213 | ||
4167 | Thank you, | 4214 | Thank you, |
4168 | 4215 | ||
4169 | Linden Lab | 4216 | Linden Lab |
4170 | </message> | 4217 | </message> |
4171 | </alert> | 4218 | </alert> |
@@ -4195,7 +4242,7 @@ Do you want to replace it with the selected object? | |||
4195 | You are in Busy Mode, which means you will not | 4242 | You are in Busy Mode, which means you will not |
4196 | receive any items offered in exchange for | 4243 | receive any items offered in exchange for |
4197 | this payment. | 4244 | this payment. |
4198 | 4245 | ||
4199 | Would you like to leave Busy Mode before | 4246 | Would you like to leave Busy Mode before |
4200 | completing this transaction? | 4247 | completing this transaction? |
4201 | </message> | 4248 | </message> |
@@ -4242,9 +4289,9 @@ the contents of your Lost And Found folder? | |||
4242 | <alert modal="true" name="CopySLURL"> | 4289 | <alert modal="true" name="CopySLURL"> |
4243 | <message name="message"> | 4290 | <message name="message"> |
4244 | The following SLURL has been copied to your clipboard: | 4291 | The following SLURL has been copied to your clipboard: |
4245 | 4292 | ||
4246 | [SLURL] | 4293 | [SLURL] |
4247 | 4294 | ||
4248 | Put it in a web page to give others easy access to this location or | 4295 | Put it in a web page to give others easy access to this location or |
4249 | try it out yourself by pasting it into the address bar of your web browser. | 4296 | try it out yourself by pasting it into the address bar of your web browser. |
4250 | </message> | 4297 | </message> |
@@ -4288,4 +4335,11 @@ the contents of your Lost And Found folder? | |||
4288 | OK | 4335 | OK |
4289 | </option> | 4336 | </option> |
4290 | </alert> | 4337 | </alert> |
4338 | <alert modal="true" name="Cannot_Purchase_an_Attachment"> | ||
4339 | <message name="message"> | ||
4340 | Items may not be purchased while | ||
4341 | they are part of an attachment. | ||
4342 | </message> | ||
4343 | </alert> | ||
4344 | |||
4291 | </alerts> | 4345 | </alerts> |
diff --git a/linden/indra/newview/skins/xui/en-us/floater_avatar_picker.xml b/linden/indra/newview/skins/xui/en-us/floater_avatar_picker.xml index a0e6a91..71a3bd4 100644 --- a/linden/indra/newview/skins/xui/en-us/floater_avatar_picker.xml +++ b/linden/indra/newview/skins/xui/en-us/floater_avatar_picker.xml | |||
@@ -6,7 +6,7 @@ | |||
6 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" | 6 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" |
7 | bottom="-40" drop_shadow_visible="true" follows="left|top" | 7 | bottom="-40" drop_shadow_visible="true" follows="left|top" |
8 | font="SansSerifSmall" h_pad="0" halign="left" height="16" hidden="false" | 8 | font="SansSerifSmall" h_pad="0" halign="left" height="16" hidden="false" |
9 | left="12" mouse_opaque="true" name="Type part of the person's name:" | 9 | left="12" mouse_opaque="true" name="Type part of the resident's name:" |
10 | v_pad="0" width="220"> | 10 | v_pad="0" width="220"> |
11 | Type part of the resident's name: | 11 | Type part of the resident's name: |
12 | </text> | 12 | </text> |
@@ -24,7 +24,7 @@ | |||
24 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" | 24 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" |
25 | bottom_delta="-24" drop_shadow_visible="true" follows="left|top" | 25 | bottom_delta="-24" drop_shadow_visible="true" follows="left|top" |
26 | font="SansSerifSmall" h_pad="0" halign="left" height="16" hidden="false" | 26 | font="SansSerifSmall" h_pad="0" halign="left" height="16" hidden="false" |
27 | left="12" mouse_opaque="true" name="Or select a calling card:" v_pad="0" | 27 | left="12" mouse_opaque="true" name="Or select their calling card:" v_pad="0" |
28 | width="220"> | 28 | width="220"> |
29 | Or select a calling card: | 29 | Or select a calling card: |
30 | </text> | 30 | </text> |
diff --git a/linden/indra/newview/skins/xui/en-us/floater_inventory.xml b/linden/indra/newview/skins/xui/en-us/floater_inventory.xml index 52af7a3..d9d8eb8 100755..100644 --- a/linden/indra/newview/skins/xui/en-us/floater_inventory.xml +++ b/linden/indra/newview/skins/xui/en-us/floater_inventory.xml | |||
@@ -149,6 +149,11 @@ | |||
149 | name="Folders Always By Name" width="118"> | 149 | name="Folders Always By Name" width="118"> |
150 | <on_click filter="" function="Inventory.SetSortBy" userdata="foldersalwaysbyname" /> | 150 | <on_click filter="" function="Inventory.SetSortBy" userdata="foldersalwaysbyname" /> |
151 | </menu_item_check> | 151 | </menu_item_check> |
152 | <menu_item_check bottom_delta="-18" control_name="Inventory.SystemFoldersToTop" height="18" | ||
153 | hidden="false" label="System Folders To Top" left="0" mouse_opaque="true" | ||
154 | name="System Folders To Top" width="118"> | ||
155 | <on_click filter="" function="Inventory.SetSortBy" userdata="systemfolderstotop" /> | ||
156 | </menu_item_check> | ||
152 | </menu> | 157 | </menu> |
153 | <menu bottom_delta="28" color="0, 0, 0, 1" drop_shadow="true" height="49" | 158 | <menu bottom_delta="28" color="0, 0, 0, 1" drop_shadow="true" height="49" |
154 | hidden="false" label="Filters" left="0" mouse_opaque="false" name="Filters" | 159 | hidden="false" label="Filters" left="0" mouse_opaque="false" name="Filters" |
diff --git a/linden/indra/newview/skins/xui/en-us/floater_lsl_guide.xml b/linden/indra/newview/skins/xui/en-us/floater_lsl_guide.xml index 29d1fa2..773b54b 100644 --- a/linden/indra/newview/skins/xui/en-us/floater_lsl_guide.xml +++ b/linden/indra/newview/skins/xui/en-us/floater_lsl_guide.xml | |||
@@ -1,23 +1,21 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <floater bottom="-500" can_close="true" can_drag_on_left="false" can_minimize="true" | 1 | <floater bottom="-500" can_close="true" can_drag_on_left="false" can_minimize="true" |
3 | can_resize="true" enabled="true" follows="left|top" height="400" | 2 | can_resize="true" enabled="true" follows="left|top" height="400" |
4 | hidden="false" left="306" min_height="271" min_width="350" | 3 | hidden="false" left="306" min_height="271" min_width="350" |
5 | mouse_opaque="true" name="script ed float" | 4 | mouse_opaque="true" name="script ed float" rect_control="LSLHelpRect" |
6 | title="LSL Wiki" width="370"> | 5 | title="LSL Wiki" width="370"> |
7 | <check_box bottom="-45" enabled="true" follows="top|left" font="SansSerif" | 6 | <check_box bottom="-45" enabled="true" follows="top|left" font="SansSerif" halign="center" |
8 | halign="center" height="20" hidden="false" label="Follow cursor" | 7 | height="20" hidden="false" label="Follow cursor" left="10" |
9 | left="10" mouse_opaque="true" name="lock_check" width="60" /> | 8 | mouse_opaque="true" name="lock_check" width="60" /> |
10 | <combo_box bottom_delta="0" enabled="true" follows="top|left|right" font="SansSerif" | 9 | <combo_box allow_text_entry="true" bottom_delta="0" enabled="true" |
11 | halign="center" height="20" hidden="false" label="Lock" | 10 | follows="top|left|right" font="SansSerif" halign="center" height="20" |
12 | left_delta="100" mouse_opaque="true" name="history_combo" | 11 | hidden="false" label="Lock" left_delta="100" mouse_opaque="true" |
13 | width="90" /> | 12 | name="history_combo" width="90" /> |
14 | <button bottom_delta="0" enabled="true" follows="top|right" font="SansSerif" | 13 | <button bottom_delta="0" enabled="true" follows="top|right" font="SansSerif" |
15 | halign="center" height="20" hidden="false" label="Back" | 14 | halign="center" height="20" hidden="false" label="Back" left_delta="95" |
16 | left_delta="95" mouse_opaque="true" name="back_btn" | 15 | mouse_opaque="true" name="back_btn" width="70" /> |
17 | width="70" /> | ||
18 | <button bottom_delta="0" enabled="true" follows="top|right" font="SansSerif" | 16 | <button bottom_delta="0" enabled="true" follows="top|right" font="SansSerif" |
19 | halign="center" height="20" hidden="false" label="Forward" | 17 | halign="center" height="20" hidden="false" label="Forward" left_delta="75" |
20 | left_delta="75" mouse_opaque="true" name="fwd_btn" | 18 | mouse_opaque="true" name="fwd_btn" width="70" /> |
21 | width="70" /> | 19 | <web_browser bottom="10" follows="left|right|top|bottom" left="10" name="lsl_guide_html" |
22 | <web_browser left="10" right="-10" follows="left|right|top|bottom" bottom="10" top="-50" name="lsl_guide_html"/> | 20 | right="-10" top="-50" /> |
23 | </floater> | 21 | </floater> |
diff --git a/linden/indra/newview/skins/xui/en-us/floater_mute.xml b/linden/indra/newview/skins/xui/en-us/floater_mute.xml index bb45932..132f53a 100644 --- a/linden/indra/newview/skins/xui/en-us/floater_mute.xml +++ b/linden/indra/newview/skins/xui/en-us/floater_mute.xml | |||
@@ -11,8 +11,8 @@ | |||
11 | hidden="false" left="4" mouse_opaque="true" multi_select="false" | 11 | hidden="false" left="4" mouse_opaque="true" multi_select="false" |
12 | name="mutes" tool_tip="List of currently muted residents" width="292" /> | 12 | name="mutes" tool_tip="List of currently muted residents" width="292" /> |
13 | <button bottom="-244" enabled="true" follows="left|bottom" font="SansSerif" | 13 | <button bottom="-244" enabled="true" follows="left|bottom" font="SansSerif" |
14 | halign="center" height="20" hidden="false" label="Mute resident..." | 14 | halign="center" height="20" hidden="false" label="Mute Resident..." |
15 | label_selected="Mute resident..." left="4" mouse_opaque="true" | 15 | label_selected="Mute Resident..." left="4" mouse_opaque="true" |
16 | name="Mute resident..." tool_tip="Pick a resident to mute" width="200" /> | 16 | name="Mute resident..." tool_tip="Pick a resident to mute" width="200" /> |
17 | <button bottom="-268" enabled="true" follows="left|bottom" font="SansSerif" | 17 | <button bottom="-268" enabled="true" follows="left|bottom" font="SansSerif" |
18 | halign="center" height="20" hidden="false" label="Mute object by name..." | 18 | halign="center" height="20" hidden="false" label="Mute object by name..." |
diff --git a/linden/indra/newview/skins/xui/en-us/floater_sell_land.xml b/linden/indra/newview/skins/xui/en-us/floater_sell_land.xml index 13e5f2e..13e5f2e 100755..100644 --- a/linden/indra/newview/skins/xui/en-us/floater_sell_land.xml +++ b/linden/indra/newview/skins/xui/en-us/floater_sell_land.xml | |||
diff --git a/linden/indra/newview/skins/xui/en-us/menu_inventory.xml b/linden/indra/newview/skins/xui/en-us/menu_inventory.xml index bd955e3..bd955e3 100755..100644 --- a/linden/indra/newview/skins/xui/en-us/menu_inventory.xml +++ b/linden/indra/newview/skins/xui/en-us/menu_inventory.xml | |||
diff --git a/linden/indra/newview/skins/xui/en-us/menu_pie_attachment.xml b/linden/indra/newview/skins/xui/en-us/menu_pie_attachment.xml index 66e12f0..66e12f0 100755..100644 --- a/linden/indra/newview/skins/xui/en-us/menu_pie_attachment.xml +++ b/linden/indra/newview/skins/xui/en-us/menu_pie_attachment.xml | |||
diff --git a/linden/indra/newview/skins/xui/en-us/menu_pie_avatar.xml b/linden/indra/newview/skins/xui/en-us/menu_pie_avatar.xml index 91e27b7..91e27b7 100755..100644 --- a/linden/indra/newview/skins/xui/en-us/menu_pie_avatar.xml +++ b/linden/indra/newview/skins/xui/en-us/menu_pie_avatar.xml | |||
diff --git a/linden/indra/newview/skins/xui/en-us/menu_pie_land.xml b/linden/indra/newview/skins/xui/en-us/menu_pie_land.xml index cb06ebf..cb06ebf 100755..100644 --- a/linden/indra/newview/skins/xui/en-us/menu_pie_land.xml +++ b/linden/indra/newview/skins/xui/en-us/menu_pie_land.xml | |||
diff --git a/linden/indra/newview/skins/xui/en-us/menu_pie_object.xml b/linden/indra/newview/skins/xui/en-us/menu_pie_object.xml index e59ac38..e59ac38 100755..100644 --- a/linden/indra/newview/skins/xui/en-us/menu_pie_object.xml +++ b/linden/indra/newview/skins/xui/en-us/menu_pie_object.xml | |||
diff --git a/linden/indra/newview/skins/xui/en-us/menu_pie_self.xml b/linden/indra/newview/skins/xui/en-us/menu_pie_self.xml index 82113d4..82113d4 100755..100644 --- a/linden/indra/newview/skins/xui/en-us/menu_pie_self.xml +++ b/linden/indra/newview/skins/xui/en-us/menu_pie_self.xml | |||
diff --git a/linden/indra/newview/skins/xui/en-us/menu_viewer.xml b/linden/indra/newview/skins/xui/en-us/menu_viewer.xml index d964ec3..6d4840f 100755..100644 --- a/linden/indra/newview/skins/xui/en-us/menu_viewer.xml +++ b/linden/indra/newview/skins/xui/en-us/menu_viewer.xml | |||
@@ -39,6 +39,12 @@ | |||
39 | <on_click function="File.CloseWindow" userdata="" /> | 39 | <on_click function="File.CloseWindow" userdata="" /> |
40 | <on_enable function="File.EnableCloseWindow" userdata="" /> | 40 | <on_enable function="File.EnableCloseWindow" userdata="" /> |
41 | </menu_item_call> | 41 | </menu_item_call> |
42 | <menu_item_call bottom="-113" enabled="true" height="19" hidden="false" label="Close All Windows" | ||
43 | left="0" mouse_opaque="true" name="Close All Windows" shortcut="control|shift|W" | ||
44 | width="243"> | ||
45 | <on_click function="File.CloseAllWindows" userdata="" /> | ||
46 | <on_enable function="File.EnableCloseWindow" userdata="" /> | ||
47 | </menu_item_call> | ||
42 | <menu_item_separator bottom="-121" enabled="true" height="8" hidden="false" label="-----------" | 48 | <menu_item_separator bottom="-121" enabled="true" height="8" hidden="false" label="-----------" |
43 | left="0" mouse_opaque="true" name="separator2" width="243" /> | 49 | left="0" mouse_opaque="true" name="separator2" width="243" /> |
44 | <menu_item_call bottom="-140" enabled="true" height="19" hidden="false" | 50 | <menu_item_call bottom="-140" enabled="true" height="19" hidden="false" |
@@ -771,12 +777,43 @@ | |||
771 | <on_click function="Tools.SelectedScriptAction" userdata="stop" /> | 777 | <on_click function="Tools.SelectedScriptAction" userdata="stop" /> |
772 | <on_enable function="EditableSelected" /> | 778 | <on_enable function="EditableSelected" /> |
773 | </menu_item_call> | 779 | </menu_item_call> |
774 | <menu_item_separator bottom="-411" enabled="true" height="8" hidden="false" label="-----------" | 780 | <menu_item_separator bottom="-411" enabled="true" height="8" hidden="false" label="-----------" |
775 | left="0" mouse_opaque="true" name="separator6" width="250" /> | 781 | left="0" mouse_opaque="true" name="separator7" width="250" /> |
776 | <menu_item_call bottom="-240" enabled="true" height="19" hidden="false" label="Report Bug..." | 782 | <menu bottom="-554" color="0 0 0 1" drop_shadow="true" enabled="true" height="109" |
783 | hidden="false" label="Bug Reporting" left="0" mouse_opaque="false" | ||
784 | name="Select Tool" opaque="true" tear_off="true" create_jump_keys="true" | ||
785 | width="118"> | ||
786 | <menu_item_call bottom="-240" enabled="true" height="19" hidden="false" label="Report Bug..." | ||
777 | left="0" mouse_opaque="true" name="Report Bug..." width="166"> | 787 | left="0" mouse_opaque="true" name="Report Bug..." width="166"> |
778 | <on_click function="ShowFloater" userdata="bug reporter" /> | 788 | <on_click function="ShowFloater" userdata="bug reporter" /> |
779 | </menu_item_call> | 789 | </menu_item_call> |
790 | <menu_item_call bottom="-94" enabled="true" height="19" hidden="false" | ||
791 | label="Bug Reporting 101..." left="0" mouse_opaque="true" | ||
792 | name="Bug Reporing 101..." width="166"> | ||
793 | <on_click function="PromptShowURL" | ||
794 | userdata="WebLaunchBugReport101,https://wiki.secondlife.com/wiki/Bug_Reporting_101" /> | ||
795 | </menu_item_call> | ||
796 | <menu_item_call bottom="-94" enabled="true" height="19" hidden="false" | ||
797 | label="Security Issues..." left="0" mouse_opaque="true" | ||
798 | name="Security Issues..." width="166"> | ||
799 | <on_click function="PromptShowURL" | ||
800 | userdata="WebLaunchSecurityIssues,https://wiki.secondlife.com/wiki/Security_issues" /> | ||
801 | </menu_item_call> | ||
802 | <menu_item_separator bottom="-411" enabled="true" height="8" hidden="false" label="-----------" | ||
803 | left="0" mouse_opaque="true" name="separator7" width="250" /> | ||
804 | <menu_item_call bottom="-94" enabled="true" height="19" hidden="false" | ||
805 | label="Public Issue Tracker..." left="0" mouse_opaque="true" | ||
806 | name="Public Issue Tracker..." width="166"> | ||
807 | <on_click function="PromptShowURL" | ||
808 | userdata="WebLaunchPublicIssue,https://jira.secondlife.com" /> | ||
809 | </menu_item_call> | ||
810 | <menu_item_call bottom="-94" enabled="true" height="19" hidden="false" | ||
811 | label="Public Issue Tracker Help..." left="0" mouse_opaque="true" | ||
812 | name="Publc Issue Tracker Help..." width="166"> | ||
813 | <on_click function="PromptShowURL" | ||
814 | userdata="WebLaunchPublicIssueHelp,https://wiki.secondlife.com/wiki/Issue_tracker" /> | ||
815 | </menu_item_call> | ||
816 | </menu> | ||
780 | </menu> | 817 | </menu> |
781 | <menu bottom="219" color="0 0 0 1" drop_shadow="true" enabled="true" height="317" | 818 | <menu bottom="219" color="0 0 0 1" drop_shadow="true" enabled="true" height="317" |
782 | hidden="false" label="Help" left="227" mouse_opaque="false" name="Help" | 819 | hidden="false" label="Help" left="227" mouse_opaque="false" name="Help" |
diff --git a/linden/indra/newview/skins/xui/en-us/notify.xml b/linden/indra/newview/skins/xui/en-us/notify.xml index 291b1b8..54451ab 100644 --- a/linden/indra/newview/skins/xui/en-us/notify.xml +++ b/linden/indra/newview/skins/xui/en-us/notify.xml | |||
@@ -420,7 +420,7 @@ No scripts will run except those belonging to the land owner. | |||
420 | </notify> | 420 | </notify> |
421 | <notify name="ObjectGiveItem" tip="false"> | 421 | <notify name="ObjectGiveItem" tip="false"> |
422 | <message name="message"> | 422 | <message name="message"> |
423 | An object named [OBJECTFROMNAME] owned by [FIRST] [LAST] has given you a [OBJECTTYPE] named '[OBJECTNAME]'. | 423 | An object named [OBJECTFROMNAME] owned by [FIRST] [LAST] has given you a [OBJECTTYPE] named [OBJECTNAME]. |
424 | </message> | 424 | </message> |
425 | <option name="Keep"> | 425 | <option name="Keep"> |
426 | Keep | 426 | Keep |
@@ -434,7 +434,7 @@ No scripts will run except those belonging to the land owner. | |||
434 | </notify> | 434 | </notify> |
435 | <notify name="ObjectGiveItemUnknownUser" tip="false"> | 435 | <notify name="ObjectGiveItemUnknownUser" tip="false"> |
436 | <message name="message"> | 436 | <message name="message"> |
437 | An object named [OBJECTFROMNAME] owned by (an unknown user) has given you a [OBJECTTYPE] named '[OBJECTNAME]'. | 437 | An object named [OBJECTFROMNAME] owned by (an unknown user) has given you a [OBJECTTYPE] named [OBJECTNAME]. |
438 | </message> | 438 | </message> |
439 | <option name="Keep"> | 439 | <option name="Keep"> |
440 | Keep | 440 | Keep |
diff --git a/linden/indra/newview/skins/xui/en-us/panel_preferences_general.xml b/linden/indra/newview/skins/xui/en-us/panel_preferences_general.xml index a92155a..8297887 100644 --- a/linden/indra/newview/skins/xui/en-us/panel_preferences_general.xml +++ b/linden/indra/newview/skins/xui/en-us/panel_preferences_general.xml | |||
@@ -69,12 +69,11 @@ | |||
69 | label="Notify when Linden dollars (L$) spent or received" left="148" | 69 | label="Notify when Linden dollars (L$) spent or received" left="148" |
70 | mouse_opaque="true" name="notify_money_change_checkbox" radio_style="false" | 70 | mouse_opaque="true" name="notify_money_change_checkbox" radio_style="false" |
71 | width="256" /> | 71 | width="256" /> |
72 | <check_box bottom="-326" control_name="ProbeHardwareOnStartup" enabled="true" | 72 | <check_box bottom="-326" control_name="ShowNewInventory" enabled="true" |
73 | follows="left|top" font="SansSerifSmall" height="16" hidden="false" | 73 | follows="left|top" font="SansSerifSmall" height="16" hidden="false" |
74 | initial_value="false" label="Auto-detect graphics hardware on next startup" | 74 | initial_value="false" label="Automatic previews of new notecards/textures/landmarks" |
75 | left="148" mouse_opaque="true" name="probe_hardware_checkbox" | 75 | left="148" mouse_opaque="true" name="show_new_inventory" |
76 | radio_style="false" | 76 | radio_style="false" |
77 | tool_tip="Second Life automatically configures some graphics settings based on your hardware. If you install new hardware, you should have Second Life detect it again." | ||
78 | width="270" /> | 77 | width="270" /> |
79 | <check_box bottom="-344" control_name="UseDefaultColorPicker" enabled="true" | 78 | <check_box bottom="-344" control_name="UseDefaultColorPicker" enabled="true" |
80 | follows="left|top" font="SansSerifSmall" height="16" hidden="false" | 79 | follows="left|top" font="SansSerifSmall" height="16" hidden="false" |
diff --git a/linden/indra/newview/skins/xui/en-us/panel_preferences_graphics3.xml b/linden/indra/newview/skins/xui/en-us/panel_preferences_graphics3.xml index 3a1f32e..fd48f34 100644 --- a/linden/indra/newview/skins/xui/en-us/panel_preferences_graphics3.xml +++ b/linden/indra/newview/skins/xui/en-us/panel_preferences_graphics3.xml | |||
@@ -109,4 +109,11 @@ | |||
109 | increment="1" initial_val="1" label="Debug Beacon Line Width:" | 109 | increment="1" initial_val="1" label="Debug Beacon Line Width:" |
110 | label_width="138" left="10" max_val="127" min_val="1" mouse_opaque="true" | 110 | label_width="138" left="10" max_val="127" min_val="1" mouse_opaque="true" |
111 | name="debug beacon line width" width="202" /> | 111 | name="debug beacon line width" width="202" /> |
112 | <check_box bottom="-304" control_name="ProbeHardwareOnStartup" enabled="true" | ||
113 | follows="left|top" font="SansSerifSmall" height="16" hidden="false" | ||
114 | initial_value="false" label="Auto-detect graphics hardware on next startup" | ||
115 | left="148" mouse_opaque="true" name="probe_hardware_checkbox" | ||
116 | radio_style="false" | ||
117 | tool_tip="Second Life automatically configures some graphics settings based on your hardware. If you install new hardware, you should have Second Life detect it again." | ||
118 | width="270" /> | ||
112 | </panel> | 119 | </panel> |
diff --git a/linden/indra/newview/skins/xui/en-us/panel_status_bar.xml b/linden/indra/newview/skins/xui/en-us/panel_status_bar.xml index 2ee26d1..9feaafc 100644 --- a/linden/indra/newview/skins/xui/en-us/panel_status_bar.xml +++ b/linden/indra/newview/skins/xui/en-us/panel_status_bar.xml | |||
@@ -18,7 +18,7 @@ | |||
18 | halign="right" height="18" hidden="false" left="-120" mouse_opaque="true" | 18 | halign="right" height="18" hidden="false" left="-120" mouse_opaque="true" |
19 | name="BalanceText" text_color="0 1 0 1" tool_tip="Account Balance" | 19 | name="BalanceText" text_color="0 1 0 1" tool_tip="Account Balance" |
20 | v_pad="2" width="76"> | 20 | v_pad="2" width="76"> |
21 | L$ | 21 | Loading... |
22 | </text> | 22 | </text> |
23 | <button bottom="-18" enabled="true" follows="right|bottom" font="SansSerif" | 23 | <button bottom="-18" enabled="true" follows="right|bottom" font="SansSerif" |
24 | halign="center" height="16" hidden="false" | 24 | halign="center" height="16" hidden="false" |
diff --git a/linden/indra/newview/viewer.cpp b/linden/indra/newview/viewer.cpp index c42ac69..b71c6f2 100644 --- a/linden/indra/newview/viewer.cpp +++ b/linden/indra/newview/viewer.cpp | |||
@@ -27,6 +27,9 @@ | |||
27 | */ | 27 | */ |
28 | 28 | ||
29 | #include "llviewerprecompiledheaders.h" | 29 | #include "llviewerprecompiledheaders.h" |
30 | |||
31 | #include "viewer.h" | ||
32 | |||
30 | #include "llparcel.h" | 33 | #include "llparcel.h" |
31 | #include "llviewerparcelmgr.h" | 34 | #include "llviewerparcelmgr.h" |
32 | #include "llviewerjoystick.h" | 35 | #include "llviewerjoystick.h" |
@@ -104,8 +107,6 @@ | |||
104 | //#define LL_SEND_CRASH_REPORTS 0 | 107 | //#define LL_SEND_CRASH_REPORTS 0 |
105 | 108 | ||
106 | 109 | ||
107 | #include "viewer.h" | ||
108 | |||
109 | // | 110 | // |
110 | // Linden library headers | 111 | // Linden library headers |
111 | // | 112 | // |
@@ -411,8 +412,6 @@ LLFrameTimer gRestoreGLTimer; | |||
411 | BOOL gRestoreGL = FALSE; | 412 | BOOL gRestoreGL = FALSE; |
412 | 413 | ||
413 | 414 | ||
414 | LLGlobalEconomy *gGlobalEconomy = NULL; | ||
415 | |||
416 | // VFS globals - see viewer.h | 415 | // VFS globals - see viewer.h |
417 | LLVFS* gStaticVFS = NULL; | 416 | LLVFS* gStaticVFS = NULL; |
418 | 417 | ||
@@ -485,6 +484,7 @@ static const char USAGE[] = "\n" | |||
485 | "usage:\tviewer [options]\n" | 484 | "usage:\tviewer [options]\n" |
486 | "options:\n" | 485 | "options:\n" |
487 | " -login <first> <last> <password> log in as a user\n" | 486 | " -login <first> <last> <password> log in as a user\n" |
487 | " -autologin log in as last saved user\n" | ||
488 | " -loginuri <URI> login server and CGI script to use\n" | 488 | " -loginuri <URI> login server and CGI script to use\n" |
489 | " -helperuri <URI> helper web CGI prefix to use\n" | 489 | " -helperuri <URI> helper web CGI prefix to use\n" |
490 | " -settings <filename> specify the filename of a\n" | 490 | " -settings <filename> specify the filename of a\n" |
@@ -515,6 +515,8 @@ static const char USAGE[] = "\n" | |||
515 | #if LL_WINDOWS | 515 | #if LL_WINDOWS |
516 | " -noprobe disable hardware probe\n" | 516 | " -noprobe disable hardware probe\n" |
517 | #endif | 517 | #endif |
518 | " -noquicktime disable QuickTime movies, speeds startup\n" | ||
519 | " -nopreload don't preload UI images or sounds, speeds startup\n" | ||
518 | // these seem to be unused | 520 | // these seem to be unused |
519 | //" -noenv turn off environmental effects\n" | 521 | //" -noenv turn off environmental effects\n" |
520 | //" -proxy <proxy_ip> specify the proxy ip address\n" | 522 | //" -proxy <proxy_ip> specify the proxy ip address\n" |
@@ -536,6 +538,8 @@ std::string gChannelName = "Second Life Release"; | |||
536 | 538 | ||
537 | LLUUID gInventoryLibraryOwner; | 539 | LLUUID gInventoryLibraryOwner; |
538 | LLUUID gInventoryLibraryRoot; | 540 | LLUUID gInventoryLibraryRoot; |
541 | bool gPreloadImages = true; | ||
542 | bool gPreloadSounds = true; | ||
539 | 543 | ||
540 | LLString gCmdLineFirstName; | 544 | LLString gCmdLineFirstName; |
541 | LLString gCmdLineLastName; | 545 | LLString gCmdLineLastName; |
@@ -4035,7 +4039,7 @@ void init_audio() | |||
4035 | 4039 | ||
4036 | BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio"); | 4040 | BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio"); |
4037 | 4041 | ||
4038 | if (!mute_audio) | 4042 | if (!mute_audio && gPreloadSounds) |
4039 | { | 4043 | { |
4040 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndAlert"))); | 4044 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndAlert"))); |
4041 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndBadKeystroke"))); | 4045 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndBadKeystroke"))); |
@@ -4198,8 +4202,13 @@ BOOL add_object( LLPCode pcode, S32 x, S32 y, U8 use_physics ) | |||
4198 | return FALSE; | 4202 | return FALSE; |
4199 | } | 4203 | } |
4200 | 4204 | ||
4201 | if (regionp | 4205 | if (NULL == regionp) |
4202 | && (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX)) | 4206 | { |
4207 | llwarns << "regionp was NULL; aborting function." << llendl; | ||
4208 | return FALSE; | ||
4209 | } | ||
4210 | |||
4211 | if (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX) | ||
4203 | { | 4212 | { |
4204 | LLFirstUse::useSandbox(); | 4213 | LLFirstUse::useSandbox(); |
4205 | } | 4214 | } |
@@ -5692,6 +5701,19 @@ int parse_args(int argc, char **argv) | |||
5692 | { | 5701 | { |
5693 | gProbeHardware = FALSE; | 5702 | gProbeHardware = FALSE; |
5694 | } | 5703 | } |
5704 | else if (!strcmp(argv[j], "-noquicktime")) | ||
5705 | { | ||
5706 | // Developers can log in faster if they don't load all the | ||
5707 | // quicktime dlls. | ||
5708 | gUseQuickTime = false; | ||
5709 | } | ||
5710 | else if (!strcmp(argv[j], "-nopreload")) | ||
5711 | { | ||
5712 | // Developers can log in faster if they don't decode sounds | ||
5713 | // or images on startup, ~5 seconds faster. | ||
5714 | gPreloadSounds = false; | ||
5715 | gPreloadImages = false; | ||
5716 | } | ||
5695 | else if (!strcmp(argv[j], "-purge")) | 5717 | else if (!strcmp(argv[j], "-purge")) |
5696 | { | 5718 | { |
5697 | purge_cache(); | 5719 | purge_cache(); |
diff --git a/linden/indra/newview/viewer.h b/linden/indra/newview/viewer.h index f082e99..141206c 100644 --- a/linden/indra/newview/viewer.h +++ b/linden/indra/newview/viewer.h | |||
@@ -29,44 +29,41 @@ | |||
29 | #ifndef LL_VIEWER_H | 29 | #ifndef LL_VIEWER_H |
30 | #define LL_VIEWER_H | 30 | #define LL_VIEWER_H |
31 | 31 | ||
32 | #include "stdtypes.h" | 32 | // DO NOT ADD DEPENDENCIES HERE |
33 | #include "v3math.h" | 33 | // Almost every file in the viewer depends on this file. |
34 | #include "llcoord.h" | 34 | // If you need to add a shared class, put it in its own |
35 | 35 | // little file. JC | |
36 | #include "lltimer.h" | ||
37 | #include "llframetimer.h" | ||
38 | #include "lluuid.h" | ||
39 | #include "llsys.h" | ||
40 | #include "lltransactiontypes.h" | 36 | #include "lltransactiontypes.h" |
41 | #include "llviewercontrol.h" | 37 | #include "llviewercontrol.h" |
42 | 38 | ||
43 | // ************************************************************ | ||
44 | // Enabled this definition to compile a 'hacked' viewer that | 39 | // Enabled this definition to compile a 'hacked' viewer that |
45 | // allows a hacked godmode to be toggled on and off. | 40 | // allows a hacked godmode to be toggled on and off. |
46 | #define TOGGLE_HACKED_GODLIKE_VIEWER | 41 | #define TOGGLE_HACKED_GODLIKE_VIEWER |
47 | |||
48 | #ifdef TOGGLE_HACKED_GODLIKE_VIEWER | 42 | #ifdef TOGGLE_HACKED_GODLIKE_VIEWER |
49 | extern BOOL gHackGodmode; | 43 | extern BOOL gHackGodmode; |
50 | #endif | 44 | #endif |
51 | // ************************************************************ | 45 | |
52 | 46 | ||
53 | // | 47 | // |
54 | // Forward Declarations | 48 | // Forward Declarations |
55 | // | 49 | // |
56 | class LLVector3d; | 50 | class LLAudioEngine; |
57 | class LLViewerObject; | 51 | class LLFrameTimer; |
58 | class LLMessageSystem; | 52 | class LLMessageSystem; |
59 | class LLHost; | 53 | class LLHost; |
60 | class LLAudioEngine; | ||
61 | class LLViewerRegion; | ||
62 | class LLVFS; | ||
63 | class LLGlobalEconomy; | ||
64 | class LLPieMenu; | 54 | class LLPieMenu; |
65 | class LLWorkerThread; | 55 | class LLWorkerThread; |
66 | class LLTextureFetch; | 56 | class LLTextureFetch; |
67 | class LLTextureCache; | 57 | class LLTextureCache; |
68 | class LLPumpIO; | 58 | class LLPumpIO; |
69 | class LLHTTPNode; | 59 | class LLHTTPNode; |
60 | class LLTimer; | ||
61 | class LLUUID; | ||
62 | class LLVector3; | ||
63 | class LLVector3d; | ||
64 | class LLViewerObject; | ||
65 | class LLViewerRegion; | ||
66 | class LLVFS; | ||
70 | 67 | ||
71 | // | 68 | // |
72 | // Global Variables | 69 | // Global Variables |
@@ -79,6 +76,7 @@ extern BOOL gNoRender; | |||
79 | extern LLMemoryInfo gSysMemory; | 76 | extern LLMemoryInfo gSysMemory; |
80 | extern BOOL gLogMessages; | 77 | extern BOOL gLogMessages; |
81 | extern BOOL gUseAudio; | 78 | extern BOOL gUseAudio; |
79 | extern bool gPreloadImages; | ||
82 | extern BOOL gConnectToSomething; | 80 | extern BOOL gConnectToSomething; |
83 | extern BOOL gGodConnect; | 81 | extern BOOL gGodConnect; |
84 | extern BOOL gRunLocal; | 82 | extern BOOL gRunLocal; |
@@ -143,8 +141,6 @@ extern BOOL gShowObjectUpdates; | |||
143 | extern BOOL gTeleportDisplay; | 141 | extern BOOL gTeleportDisplay; |
144 | extern LLFrameTimer gTeleportDisplayTimer; | 142 | extern LLFrameTimer gTeleportDisplayTimer; |
145 | 143 | ||
146 | extern LLGlobalEconomy *gGlobalEconomy; | ||
147 | |||
148 | extern std::map<S32,LLFrameTimer> gDebugTimers; | 144 | extern std::map<S32,LLFrameTimer> gDebugTimers; |
149 | 145 | ||
150 | // VFS globals - gVFS is for general use | 146 | // VFS globals - gVFS is for general use |
diff --git a/linden/indra/newview/viewer_manifest.py b/linden/indra/newview/viewer_manifest.py index 0c8ef60..2f4eb7c 100755 --- a/linden/indra/newview/viewer_manifest.py +++ b/linden/indra/newview/viewer_manifest.py | |||
@@ -84,7 +84,6 @@ class ViewerManifest(LLManifest): | |||
84 | self.end_prefix("html/*") | 84 | self.end_prefix("html/*") |
85 | self.end_prefix("skins") | 85 | self.end_prefix("skins") |
86 | 86 | ||
87 | self.path("featuretable.txt") | ||
88 | self.path("releasenotes.txt") | 87 | self.path("releasenotes.txt") |
89 | self.path("lsl_guide.html") | 88 | self.path("lsl_guide.html") |
90 | self.path("gpu_table.txt") | 89 | self.path("gpu_table.txt") |
@@ -135,6 +134,8 @@ class WindowsManifest(ViewerManifest): | |||
135 | self.path(self.find_existing_file('ReleaseForDownload/llkdu.dll', 'llkdu.dll', '../../libraries/i686-win32/lib_release/llkdu.dll'), dst='llkdu.dll') | 134 | self.path(self.find_existing_file('ReleaseForDownload/llkdu.dll', 'llkdu.dll', '../../libraries/i686-win32/lib_release/llkdu.dll'), dst='llkdu.dll') |
136 | self.path(src="licenses-win32.txt", dst="licenses.txt") | 135 | self.path(src="licenses-win32.txt", dst="licenses.txt") |
137 | 136 | ||
137 | self.path("featuretable.txt") | ||
138 | |||
138 | # For use in crash reporting (generates minidumps) | 139 | # For use in crash reporting (generates minidumps) |
139 | self.path("dbghelp.dll") | 140 | self.path("dbghelp.dll") |
140 | 141 | ||
@@ -408,6 +409,8 @@ class Linux_i686Manifest(LinuxManifest): | |||
408 | # recurse | 409 | # recurse |
409 | self.end_prefix("res-sdl") | 410 | self.end_prefix("res-sdl") |
410 | 411 | ||
412 | self.path("featuretable_linux.txt") | ||
413 | |||
411 | self.path("app_settings/mozilla-runtime-linux-i686") | 414 | self.path("app_settings/mozilla-runtime-linux-i686") |
412 | 415 | ||
413 | if self.prefix("../../libraries/i686-linux/lib_release_client", "lib"): | 416 | if self.prefix("../../libraries/i686-linux/lib_release_client", "lib"): |