Merge Firestorm LGPL

master
Ansariel 2016-05-09 12:41:24 +02:00
commit a0188a5358
124 changed files with 1403 additions and 510 deletions

View File

@ -548,3 +548,4 @@ ae3297cdd03ab14f19f3811acbc4acd3eb600336 4.0.0-release
759710a9acef61aaf7b69f4bc4a5a913de87ad8a 4.0.1-release
e9d350764dfbf5a46229e627547ef5c1b1eeef00 4.0.2-release
86dfba7ec4332c323025ebeacd8bf343ed0d8cfd 4.0.3-release
0a5de9ec2cb868f367501024d8d6958c20869053 4.0.4-release

View File

@ -340,6 +340,7 @@ Cinder Roxley
STORM-2105
STORM-2113
STORM-2124
STORM-2127
Clara Young
Coaldust Numbers
VWR-1095

View File

@ -229,6 +229,28 @@ LLSD llcoro::postAndSuspend(const LLSD& event, const LLEventPumpOrPumpName& requ
return value;
}
LLSD llcoro::suspendUntilEventOnWithTimeout(const LLEventPumpOrPumpName& suspendPumpOrName,
F32 timeoutin, const LLSD &timeoutResult)
{
/**
* The timeout pump is attached upstream of of the waiting pump and will
* pass the timeout event through it. We CAN NOT attach downstream since
* doing so will cause the suspendPump to fire any waiting events immediately
* and they will be lost. This becomes especially problematic with the
* LLEventTimeout(pump) constructor which will also attempt to fire those
* events using the virtual listen_impl method in the not yet fully constructed
* timeoutPump.
*/
LLEventTimeout timeoutPump;
LLEventPump &suspendPump = suspendPumpOrName.getPump();
LLTempBoundListener timeoutListener(timeoutPump.listen(suspendPump.getName(),
boost::bind(&LLEventPump::post, &suspendPump, _1)));
timeoutPump.eventAfter(timeoutin, timeoutResult);
return llcoro::suspendUntilEventOn(suspendPump);
}
namespace
{

View File

@ -147,6 +147,11 @@ LLSD suspendUntilEventOn(const LLEventPumpOrPumpName& pump)
return postAndSuspend(LLSD(), LLEventPumpOrPumpName(), pump);
}
/// Suspend the coroutine until an event is fired on the identified pump
/// or the timeout duration has elapsed. If the timeout duration
/// elapses the specified LLSD is returned.
LLSD suspendUntilEventOnWithTimeout(const LLEventPumpOrPumpName& suspendPumpOrName, F32 timeoutin, const LLSD &timeoutResult);
} // namespace llcoro
/// return type for two-pump variant of suspendUntilEventOn()

View File

@ -39,9 +39,9 @@
#include "llsdutil.h" // llsd_matches()
LLEventFilter::LLEventFilter(LLEventPump& source, const std::string& name, bool tweak):
LLEventStream(name, tweak)
LLEventStream(name, tweak),
mSource(source.listen(getName(), boost::bind(&LLEventFilter::post, this, _1)))
{
source.listen(getName(), boost::bind(&LLEventFilter::post, this, _1));
}
LLEventMatching::LLEventMatching(const LLSD& pattern):

View File

@ -49,6 +49,9 @@ public:
/// Post an event to all listeners
virtual bool post(const LLSD& event) = 0;
private:
LLTempBoundListener mSource;
};
/**
@ -181,11 +184,23 @@ protected:
private:
bool tick(const LLSD&);
LLBoundListener mMainloop;
LLTempBoundListener mMainloop;
Action mAction;
};
/// Production implementation of LLEventTimoutBase
/**
* Production implementation of LLEventTimoutBase.
*
* @NOTE: Caution should be taken when using the LLEventTimeout(LLEventPump &)
* constructor to ensure that the upstream event pump is not an LLEventMaildrop
* or any other kind of store and forward pump which may have events outstanding.
* Using this constructor will cause the upstream event pump to fire any pending
* events and could result in the invocation of a virtual method before the timeout
* has been fully constructed. The timeout should instead be connected upstream
* from the event pump and attached using the listen method.
* See llcoro::suspendUntilEventOnWithTimeout() for an example.
*/
class LL_COMMON_API LLEventTimeout: public LLEventTimeoutBase
{
public:

View File

@ -616,6 +616,12 @@ public:
* a queue. Subsequent attaching listeners will receive stored events from the queue
* until a listener indicates that the event has been handled. In order to receive
* multiple events from a mail drop the listener must disconnect and reconnect.
*
* @NOTE: When using an LLEventMailDrop (or LLEventQueue) with a LLEventTimeout or
* LLEventFilter attaching the filter downstream using Timeout's constructor will
* cause the MailDrop to discharge any of it's stored events. The timeout should
* instead be connected upstream using its listen() method.
* See llcoro::suspendUntilEventOnWithTimeout() for an example.
*/
class LL_COMMON_API LLEventMailDrop : public LLEventStream
{

View File

@ -118,8 +118,10 @@ public:
if (end_y < mBottom) clip_y = end_y - mBottom;
// clip_? and delta_? should have same sign, since starting point is in rect
// so ratios will be positive
F32 ratio_x = ((F32)clip_x / (F32)delta_x);
F32 ratio_y = ((F32)clip_y / (F32)delta_y);
F32 ratio_x = 0;
F32 ratio_y = 0;
if (delta_x != 0) ratio_x = ((F32)clip_x / (F32)delta_x);
if (delta_y != 0) ratio_y = ((F32)clip_y / (F32)delta_y);
if (ratio_x > ratio_y)
{
// clip along x direction

View File

@ -36,7 +36,8 @@
static std::map<std::string, U32> DefaultPoolSizes =
boost::assign::map_list_of
(std::string("Upload"), 1)
(std::string("AIS"), 25);
(std::string("AIS"), 1);
// *TODO: Rider for the moment keep AIS calls serialized otherwise the COF will tend to get out of sync.
#define DEFAULT_POOL_SIZE 5

View File

@ -41,14 +41,41 @@
#include "message.h" // for getting the port
using namespace LLCore;
using namespace LLCore;
namespace LLCoreHttpUtil
{
const F32 HTTP_REQUEST_EXPIRY_SECS = 60.0f;
namespace
{
const std::string HTTP_LOGBODY_KEY("HTTPLogBodyOnError");
BoolSettingQuery_t mBoolSettingGet;
BoolSettingUpdate_t mBoolSettingPut;
inline bool getBoolSetting(const std::string &keyname)
{
if (!mBoolSettingGet || mBoolSettingGet.empty())
return(false);
return mBoolSettingGet(HTTP_LOGBODY_KEY);
}
}
void setPropertyMethods(BoolSettingQuery_t queryfn, BoolSettingUpdate_t updatefn)
{
mBoolSettingGet = queryfn;
mBoolSettingPut = updatefn;
if (mBoolSettingPut && !mBoolSettingPut.empty())
{
mBoolSettingPut(HTTP_LOGBODY_KEY, false, "Log the entire HTTP body in the case of an HTTP error.");
}
}
void logMessageSuccess(std::string logAuth, std::string url, std::string message)
{
@ -293,10 +320,11 @@ void HttpCoroHandler::onCompleted(LLCore::HttpHandle handle, LLCore::HttpRespons
bas >> std::noskipws;
bodyData.assign(std::istream_iterator<U8>(bas), std::istream_iterator<U8>());
httpStatus["error_body"] = LLSD(bodyData);
#if 1
// commenting out, but keeping since this can be useful for debugging
LL_WARNS() << "Returned body=" << std::endl << httpStatus["error_body"].asString() << LL_ENDL;
#endif
if (getBoolSetting(HTTP_LOGBODY_KEY))
{
// commenting out, but keeping since this can be useful for debugging
LL_WARNS() << "Returned body=" << std::endl << httpStatus["error_body"].asString() << LL_ENDL;
}
}
mReplyPump.post(result);

View File

@ -57,7 +57,14 @@
///
namespace LLCoreHttpUtil
{
extern const F32 HTTP_REQUEST_EXPIRY_SECS;
/// Allow access to to the property settings methods.
typedef boost::function<bool(const std::string &)> BoolSettingQuery_t;
typedef boost::function<void(const std::string &, bool, const std::string &)> BoolSettingUpdate_t;
void setPropertyMethods(BoolSettingQuery_t queryfn, BoolSettingUpdate_t updatefn);
extern const F32 HTTP_REQUEST_EXPIRY_SECS;
/// Attempt to convert a response object's contents to LLSD.
/// It is expected that the response body will be of non-zero

View File

@ -348,15 +348,11 @@ void LLGLSLShader::unloadInternal()
GLhandleARB obj[1024];
GLsizei count;
glGetAttachedObjectsARB(mProgramObject, 1024, &count, obj);
glGetAttachedObjectsARB(mProgramObject, sizeof(obj)/sizeof(obj[0]), &count, obj);
for (GLsizei i = 0; i < count; i++)
{
#if !LL_DARWIN
if (glIsProgramARB(obj[i]))
#endif
{
glDeleteObjectARB(obj[i]);
}
glDetachObjectARB(mProgramObject, obj[i]);
glDeleteObjectARB(obj[i]);
}
glDeleteObjectARB(mProgramObject);

View File

@ -83,7 +83,12 @@ void LLIconCtrl::draw()
// virtual
// value might be a string or a UUID
void LLIconCtrl::setValue(const LLSD& value )
void LLIconCtrl::setValue(const LLSD& value)
{
setValue(value, mPriority);
}
void LLIconCtrl::setValue(const LLSD& value, S32 priority)
{
LLSD tvalue(value);
if (value.isString() && LLUUID::validate(value.asString()))
@ -94,11 +99,11 @@ void LLIconCtrl::setValue(const LLSD& value )
LLUICtrl::setValue(tvalue);
if (tvalue.isUUID())
{
mImagep = LLUI::getUIImageByID(tvalue.asUUID(), mPriority);
mImagep = LLUI::getUIImageByID(tvalue.asUUID(), priority);
}
else
{
mImagep = LLUI::getUIImage(tvalue.asString(), mPriority);
mImagep = LLUI::getUIImage(tvalue.asString(), priority);
}
if(mImagep.notNull()

View File

@ -59,6 +59,8 @@ protected:
LLIconCtrl(const Params&);
friend class LLUICtrlFactory;
void setValue(const LLSD& value, S32 priority);
public:
virtual ~LLIconCtrl();

View File

@ -418,6 +418,7 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par
mExpireOption(p.expire_option),
mURLOption(p.url.option),
mURLTarget(p.url.target),
mForceUrlsExternal(p.force_urls_external),
mUnique(p.unique.isProvided()),
mCombineBehavior(p.unique.combine),
mPriority(p.priority),
@ -749,6 +750,11 @@ S32 LLNotification::getURLOpenExternally() const
return(mTemplatep? mTemplatep->mURLTarget == "_external": -1);
}
bool LLNotification::getForceUrlsExternal() const
{
return (mTemplatep ? mTemplatep->mForceUrlsExternal : false);
}
bool LLNotification::hasUniquenessConstraints() const
{
return (mTemplatep ? mTemplatep->mUnique : false);

View File

@ -559,7 +559,8 @@ public:
std::string getLabel() const;
std::string getURL() const;
S32 getURLOption() const;
S32 getURLOpenExternally() const;
S32 getURLOpenExternally() const; //for url responce option
bool getForceUrlsExternal() const;
bool canLogToChat() const;
bool canLogToIM() const;
bool canShowToast() const;

View File

@ -177,7 +177,8 @@ struct LLNotificationTemplate
Optional<bool> persist,
log_to_im,
show_toast,
log_to_chat;
log_to_chat,
force_urls_external;
Optional<std::string> functor,
icon,
label,
@ -201,6 +202,7 @@ struct LLNotificationTemplate
log_to_im("log_to_im", false),
show_toast("show_toast", true),
log_to_chat("log_to_chat", true),
force_urls_external("force_urls_external", false),
functor("functor"),
icon("icon"),
label("label"),
@ -284,11 +286,16 @@ struct LLNotificationTemplate
// that URL. Obsolete this and eliminate the buttons for affected
// messages when we allow clickable URLs in the UI
U32 mURLOption;
std::string mURLTarget;
//This is a flag that tells if the url needs to open externally dispite
//This is a flag that tells if option url needs to open externally dispite
//what the user setting is.
std::string mURLTarget;
// All links clicked inside notification will be opened in external browser
// Note: Some notifications block and exit viewer, yet they provide a link
// to click, we should be able to open such links in external browser.
bool mForceUrlsExternal;
// does this notification persist across sessions? if so, it will be
// serialized to disk on first receipt and read on startup
bool mPersist;

View File

@ -2016,14 +2016,14 @@ BOOL LLScrollListCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
// <FS:Ansariel> Additional convenience options
registrar.add("Url.RemoveFriend", boost::bind(&LLScrollListCtrl::removeFriend, id));
registrar.add("FS.ZoomIn", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + id + "/zoom"));
registrar.add("FS.TeleportToTarget", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + id + "/teleportto"));
registrar.add("FS.OfferTeleport", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + id + "/offerteleport"));
registrar.add("FS.RequestTeleport", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + id + "/requestteleport"));
registrar.add("FS.TrackAvatar", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + id + "/track"));
registrar.add("FS.AddToContactSet", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + id + "/addtocontactset")); // [FS:CR]
registrar.add("FS.BlockAvatar", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + id + "/blockavatar"));
registrar.add("FS.ViewLog", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + id + "/viewlog"));
registrar.add("FS.ZoomIn", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + id + "/zoom", true));
registrar.add("FS.TeleportToTarget", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + id + "/teleportto", true));
registrar.add("FS.OfferTeleport", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + id + "/offerteleport", true));
registrar.add("FS.RequestTeleport", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + id + "/requestteleport", true));
registrar.add("FS.TrackAvatar", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + id + "/track", true));
registrar.add("FS.AddToContactSet", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + id + "/addtocontactset", true)); // [FS:CR]
registrar.add("FS.BlockAvatar", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + id + "/blockavatar", true));
registrar.add("FS.ViewLog", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + id + "/viewlog", true));
// </FS:Ansariel> Additional convenience options
// <FS:Ansariel> Add enable checks for menu items

View File

@ -186,6 +186,7 @@ LLTextBase::Params::Params()
icon_positioning("icon_positioning", LLTextBaseEnums::RIGHT),
// </FS:Ansariel> Optional icon position
parse_urls("parse_urls", false),
force_urls_external("force_urls_external", false),
parse_highlights("parse_highlights", false)
{
addSynonym(track_end, "track_bottom");
@ -241,6 +242,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
mWordWrap(p.wrap),
mUseEllipses( p.use_ellipses ),
mParseHTML(p.parse_urls),
mForceUrlsExternal(p.force_urls_external),
mParseHighlights(p.parse_highlights),
mBGVisible(p.bg_visible),
mScroller(NULL),
@ -2060,7 +2062,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
registrar.add("Url.Open", boost::bind(&LLUrlAction::openURL, url));
registrar.add("Url.OpenInternal", boost::bind(&LLUrlAction::openURLInternal, url));
registrar.add("Url.OpenExternal", boost::bind(&LLUrlAction::openURLExternal, url));
registrar.add("Url.Execute", boost::bind(&LLUrlAction::executeSLURL, url));
registrar.add("Url.Execute", boost::bind(&LLUrlAction::executeSLURL, url, true));
registrar.add("Url.Block", boost::bind(&LLUrlAction::blockObject, url));
registrar.add("Url.Teleport", boost::bind(&LLUrlAction::teleportToLocation, url));
registrar.add("Url.ShowProfile", boost::bind(&LLUrlAction::showProfile, url));
@ -2073,14 +2075,14 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
// <FS:Ansariel> Additional convenience options
std::string target_id_str = LLUrlAction::extractUuidFromSlurl(url).asString();
registrar.add("FS.ZoomIn", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/zoom"));
registrar.add("FS.TeleportToTarget", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/teleportto"));
registrar.add("FS.OfferTeleport", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/offerteleport"));
registrar.add("FS.RequestTeleport", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/requestteleport"));
registrar.add("FS.TrackAvatar", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/track"));
registrar.add("FS.AddToContactSet", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/addtocontactset")); // [FS:CR]
registrar.add("FS.BlockAvatar", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/blockavatar"));
registrar.add("FS.ViewLog", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/viewlog"));
registrar.add("FS.ZoomIn", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/zoom", true));
registrar.add("FS.TeleportToTarget", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/teleportto", true));
registrar.add("FS.OfferTeleport", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/offerteleport", true));
registrar.add("FS.RequestTeleport", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/requestteleport", true));
registrar.add("FS.TrackAvatar", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/track", true));
registrar.add("FS.AddToContactSet", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/addtocontactset", true)); // [FS:CR]
registrar.add("FS.BlockAvatar", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/blockavatar", true));
registrar.add("FS.ViewLog", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/viewlog", true));
// </FS:Ansariel>
// <FS:Ansariel> Add enable checks for menu items
@ -3463,7 +3465,15 @@ BOOL LLNormalTextSegment::handleMouseUp(S32 x, S32 y, MASK mask)
// Only process the click if it's actually in this segment, not to the right of the end-of-line.
if(mEditor.getSegmentAtLocalPos(x, y, false) == this)
{
LLUrlAction::clickAction(getStyle()->getLinkHREF(), mEditor.isContentTrusted());
std::string url = getStyle()->getLinkHREF();
if (!mEditor.mForceUrlsExternal)
{
LLUrlAction::clickAction(url, mEditor.isContentTrusted());
}
else if (!LLUrlAction::executeSLURL(url, mEditor.isContentTrusted()))
{
LLUrlAction::openURLExternal(url);
}
return TRUE;
}
}

View File

@ -325,6 +325,7 @@ public:
wrap,
use_ellipses,
parse_urls,
force_urls_external,
parse_highlights,
clip,
clip_partial,
@ -720,6 +721,7 @@ protected:
S32 mLineSpacingPixels; // padding between lines
bool mBorderVisible;
bool mParseHTML; // make URLs interactive
bool mForceUrlsExternal; // URLs from this textbox will be opened in external browser
bool mParseHighlights; // highlight user-defined keywords
bool mWordWrap;
bool mUseEllipses;

View File

@ -1842,7 +1842,20 @@ void LLTextEditor::unindentLineBeforeCloseBrace()
LLWString text = getWText();
if( ' ' == text[ mCursorPos - 1 ] )
{
removeCharOrTab();
S32 line = getLineNumFromDocIndex(mCursorPos, false);
S32 line_start = getLineStart(line);
// Jump over spaces in the current line
while ((' ' == text[line_start]) && (line_start < mCursorPos))
{
line_start++;
}
// Make sure there is nothing but ' ' before the Brace we are unindenting
if (line_start == mCursorPos)
{
removeCharOrTab();
}
}
}
}
@ -1926,7 +1939,7 @@ BOOL LLTextEditor::handleUnicodeCharHere(llwchar uni_char)
// Handle most keys only if the text editor is writeable.
if( !mReadOnly )
{
if( '}' == uni_char )
if( mAutoIndent && '}' == uni_char )
{
unindentLineBeforeCloseBrace();
}

View File

@ -83,12 +83,13 @@ void LLUrlAction::openURLExternal(std::string url)
}
}
void LLUrlAction::executeSLURL(std::string url)
bool LLUrlAction::executeSLURL(std::string url, bool trusted_content)
{
if (sExecuteSLURLCallback)
{
sExecuteSLURLCallback(url ,true);
return sExecuteSLURLCallback(url, trusted_content);
}
return false;
}
void LLUrlAction::clickAction(std::string url, bool trusted_content)

View File

@ -57,7 +57,7 @@ public:
static void openURLExternal(std::string url);
/// execute the given secondlife: SLURL
static void executeSLURL(std::string url);
static bool executeSLURL(std::string url, bool trusted_content = true);
/// if the Url specifies an SL location, teleport there
static void teleportToLocation(std::string url);

View File

@ -25,13 +25,69 @@
*/
#import "llopenglview-objc.h"
#include "llwindowmacosx-objc.h"
#import "llwindowmacosx-objc.h"
#import "llappdelegate-objc.h"
#pragma mark local functions
NativeKeyEventData extractKeyDataFromKeyEvent(NSEvent* theEvent)
{
NativeKeyEventData eventData;
eventData.mKeyEvent = NativeKeyEventData::KEYUNKNOWN;
eventData.mEventType = [theEvent type];
eventData.mEventModifiers = [theEvent modifierFlags];
eventData.mEventKeyCode = [theEvent keyCode];
NSString *strEventChars = [theEvent characters];
eventData.mEventChars = (strEventChars.length) ? [strEventChars characterAtIndex:0] : 0;
NSString *strEventUChars = [theEvent charactersIgnoringModifiers];
eventData.mEventUnmodChars = (strEventUChars.length) ? [strEventUChars characterAtIndex:0] : 0;
eventData.mEventRepeat = [theEvent isARepeat];
return eventData;
}
NativeKeyEventData extractKeyDataFromModifierEvent(NSEvent* theEvent)
{
NativeKeyEventData eventData;
eventData.mKeyEvent = NativeKeyEventData::KEYUNKNOWN;
eventData.mEventType = [theEvent type];
eventData.mEventModifiers = [theEvent modifierFlags];
eventData.mEventKeyCode = [theEvent keyCode];
return eventData;
}
//---------------------------
attributedStringInfo getSegments(NSAttributedString *str)
{
attributedStringInfo segments;
segment_lengths seg_lengths;
segment_standouts seg_standouts;
NSRange effectiveRange;
NSRange limitRange = NSMakeRange(0, [str length]);
while (limitRange.length > 0) {
NSNumber *attr = [str attribute:NSUnderlineStyleAttributeName atIndex:limitRange.location longestEffectiveRange:&effectiveRange inRange:limitRange];
limitRange = NSMakeRange(NSMaxRange(effectiveRange), NSMaxRange(limitRange) - NSMaxRange(effectiveRange));
if (effectiveRange.length <= 0)
{
effectiveRange.length = 1;
}
if ([attr integerValue] == 2)
{
seg_lengths.push_back(effectiveRange.length);
seg_standouts.push_back(true);
} else
{
seg_lengths.push_back(effectiveRange.length);
seg_standouts.push_back(false);
}
}
segments.seg_lengths = seg_lengths;
segments.seg_standouts = seg_standouts;
return segments;
}
#pragma mark class implementations
@implementation NSScreen (PointConversion)
@ -63,53 +119,6 @@
@end
void extractKeyDataFromEvent (NSEvent *theEvent, NativeKeyEventData * eventData)
{
eventData->mKeyEvent = NativeKeyEventData::KEYUNKNOWN;
eventData->mEventType = [theEvent type];
eventData->mEventModifiers = [theEvent modifierFlags];
eventData->mEventKeyCode = [theEvent keyCode];
NSString *strEventChars = [theEvent characters];
eventData->mEventChars = (strEventChars.length) ? [strEventChars characterAtIndex:0] : 0;
NSString *strEventUChars = [theEvent charactersIgnoringModifiers];
eventData->mEventUnmodChars = (strEventUChars.length) ? [strEventUChars characterAtIndex:0] : 0;
eventData->mEventRepeat = [theEvent isARepeat];
}
attributedStringInfo getSegments(NSAttributedString *str)
{
attributedStringInfo segments;
segment_lengths seg_lengths;
segment_standouts seg_standouts;
NSRange effectiveRange;
NSRange limitRange = NSMakeRange(0, [str length]);
while (limitRange.length > 0) {
NSNumber *attr = [str attribute:NSUnderlineStyleAttributeName atIndex:limitRange.location longestEffectiveRange:&effectiveRange inRange:limitRange];
limitRange = NSMakeRange(NSMaxRange(effectiveRange), NSMaxRange(limitRange) - NSMaxRange(effectiveRange));
if (effectiveRange.length <= 0)
{
effectiveRange.length = 1;
}
if ([attr integerValue] == 2)
{
seg_lengths.push_back(effectiveRange.length);
seg_standouts.push_back(true);
} else
{
seg_lengths.push_back(effectiveRange.length);
seg_standouts.push_back(false);
}
}
segments.seg_lengths = seg_lengths;
segments.seg_standouts = seg_standouts;
return segments;
}
@implementation LLOpenGLView
// Force a high quality update after live resizing
@ -351,6 +360,9 @@ attributedStringInfo getSegments(NSAttributedString *str)
callRightMouseUp(mMousePos, [theEvent modifierFlags]);
mSimulatedRightClick = false;
} else {
NSPoint mPoint = [theEvent locationInWindow];
mMousePos[0] = mPoint.x;
mMousePos[1] = mPoint.y;
callLeftMouseUp(mMousePos, [theEvent modifierFlags]);
}
}
@ -398,7 +410,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
NSPoint mPoint = [theEvent locationInWindow];
mMousePos[0] = mPoint.x;
mMousePos[1] = mPoint.y;
callMouseMoved(mMousePos, 0);
callMouseDragged(mMousePos, 0);
}
- (void) otherMouseDown:(NSEvent *)theEvent
@ -433,18 +445,14 @@ attributedStringInfo getSegments(NSAttributedString *str)
- (void) keyUp:(NSEvent *)theEvent
{
NativeKeyEventData eventData;
extractKeyDataFromEvent( theEvent, &eventData );
NativeKeyEventData eventData = extractKeyDataFromKeyEvent(theEvent);
eventData.mKeyEvent = NativeKeyEventData::KEYUP;
callKeyUp(&eventData, [theEvent keyCode], [theEvent modifierFlags]);
}
- (void) keyDown:(NSEvent *)theEvent
{
NativeKeyEventData eventData;
extractKeyDataFromEvent( theEvent, &eventData );
NativeKeyEventData eventData = extractKeyDataFromKeyEvent(theEvent);
eventData.mKeyEvent = NativeKeyEventData::KEYDOWN;
uint keycode = [theEvent keyCode];
@ -484,9 +492,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
- (void)flagsChanged:(NSEvent *)theEvent
{
NativeKeyEventData eventData;
extractKeyDataFromEvent( theEvent, &eventData );
NativeKeyEventData eventData = extractKeyDataFromModifierEvent(theEvent);
mModifiers = [theEvent modifierFlags];
callModifier([theEvent modifierFlags]);

View File

@ -112,6 +112,10 @@ void LLWindowCallbacks::handleMouseMove(LLWindow *window, const LLCoordGL pos, M
{
}
void LLWindowCallbacks::handleMouseDragged(LLWindow *window, const LLCoordGL pos, MASK mask)
{
}
void LLWindowCallbacks::handleScrollWheel(LLWindow *window, S32 clicks)
{
}

View File

@ -52,6 +52,7 @@ public:
virtual BOOL handleActivate(LLWindow *window, BOOL activated);
virtual BOOL handleActivateApp(LLWindow *window, BOOL activating);
virtual void handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask);
virtual void handleMouseDragged(LLWindow *window, LLCoordGL pos, MASK mask);
virtual void handleScrollWheel(LLWindow *window, S32 clicks);
virtual void handleResize(LLWindow *window, S32 width, S32 height);
virtual void handleFocus(LLWindow *window);

View File

@ -55,13 +55,13 @@ struct NativeKeyEventData {
KEYCHAR
};
EventType mKeyEvent;
uint32_t mEventType;
uint32_t mEventModifiers;
uint32_t mEventKeyCode;
uint32_t mEventChars;
uint32_t mEventUnmodChars;
bool mEventRepeat;
EventType mKeyEvent = KEYUNKNOWN;
uint32_t mEventType = 0;
uint32_t mEventModifiers = 0;
uint32_t mEventKeyCode = 0;
uint32_t mEventChars = 0;
uint32_t mEventUnmodChars = 0;
bool mEventRepeat = false;
};
typedef const NativeKeyEventData * NSKeyEventRef;
@ -92,6 +92,7 @@ void setCrossCursor();
void setNotAllowedCursor();
void hideNSCursor();
void showNSCursor();
bool isCGCursorVisible();
void hideNSCursorTillMove(bool hide);
void requestUserAttention();
long showAlert(std::string title, std::string text, int type);
@ -134,6 +135,7 @@ void callLeftMouseUp(float *pos, unsigned int mask);
void callDoubleClick(float *pos, unsigned int mask);
void callResize(unsigned int width, unsigned int height);
void callMouseMoved(float *pos, unsigned int mask);
void callMouseDragged(float *pos, unsigned int mask);
void callScrollMoved(float delta);
void callMouseExit();
void callWindowFocus();

View File

@ -169,6 +169,11 @@ void showNSCursor()
[NSCursor unhide];
}
bool isCGCursorVisible()
{
return CGCursorIsVisible();
}
void hideNSCursorTillMove(bool hide)
{
[NSCursor setHiddenUntilMouseMoves:hide];

View File

@ -352,6 +352,18 @@ void callMouseMoved(float *pos, MASK mask)
//gWindowImplementation->getCallbacks()->handleScrollWheel(gWindowImplementation, 0);
}
void callMouseDragged(float *pos, MASK mask)
{
LLCoordGL outCoords;
outCoords.mX = ll_round(pos[0]);
outCoords.mY = ll_round(pos[1]);
float deltas[2];
gWindowImplementation->getMouseDeltas(deltas);
outCoords.mX += deltas[0];
outCoords.mY += deltas[1];
gWindowImplementation->getCallbacks()->handleMouseDragged(gWindowImplementation, outCoords, gKeyboard->currentMask(TRUE));
}
void callScrollMoved(float delta)
{
gWindowImplementation->getCallbacks()->handleScrollWheel(gWindowImplementation, delta);
@ -1462,8 +1474,15 @@ void LLWindowMacOSX::updateCursor()
mNextCursor = UI_CURSOR_WORKING;
}
if(mCurrentCursor == mNextCursor)
return;
if(mCurrentCursor == mNextCursor)
{
if(mCursorHidden && mHideCursorPermanent && isCGCursorVisible())
{
hideNSCursor();
adjustCursorDecouple();
}
return;
}
// RN: replace multi-drag cursors with single versions
if (mNextCursor == UI_CURSOR_ARROWDRAGMULTI)

View File

@ -2888,7 +2888,7 @@ BOOL LLWindowWin32::getClientRectInScreenSpace( RECT* rectp )
void LLWindowWin32::flashIcon(F32 seconds)
{
if (getMinimized()) // <FS:CR> Moved this here from llviewermessage.cpp
if (mWindowHandle && GetFocus() != mWindowHandle) // <FS:CR> Moved this here from llviewermessage.cpp
{
FLASHWINFO flash_info;

View File

@ -6924,6 +6924,17 @@
<key>Value</key>
<integer>7</integer>
</map>
<key>InventoryTrashMaxCapacity</key>
<map>
<key>Comment</key>
<string>Maximum capacity of the Trash folder. User will ve offered to clean it up when exceeded.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>5000</integer>
</map>
<key>MarketplaceListingsSortOrder</key>
<map>
<key>Comment</key>
@ -9400,6 +9411,28 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>1</integer>
</map>
<key>NotifyMoneySpend</key>
<map>
<key>Comment</key>
<string>Pop up notifications when spending L$</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>NotifyMoneyReceived</key>
<map>
<key>Comment</key>
<string>Pop up notifications when receiving L$</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>NotifyTipDuration</key>
<map>
<key>Comment</key>
@ -17699,7 +17732,7 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>25</integer>
<integer>1</integer>
</map>
<key>PoolSizeUpload</key>
<map>
@ -23908,6 +23941,17 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>0</integer>
</map>
<key>FSStaticEyesUUID</key>
<map>
<key>Comment</key>
<string>Animation UUID to used to stop idle eye moment (Default uses priority 2)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>eff31dd2-1b65-5a03-5e37-15aca8e53ab7</string>
</map>
</map>
</llsd>

View File

@ -1059,5 +1059,16 @@
<key>Backup</key>
<integer>0</integer>
</map>
<key>FSStaticEyes</key>
<map>
<key>Comment</key>
<string>Disables built in random eye moment on own avatar via animation defined at FSStaticEyesUUID.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
</map>
</llsd>

View File

@ -486,7 +486,7 @@ void ColladaExportFloater::CacheReadResponder::saveTexturesWorker(void* data)
}
LLUUID id = me->mTexturesToSave.begin()->first;
LLViewerTexture* imagep = LLViewerTextureManager::findFetchedTexture(id, TEX_LIST_DISCARD);
LLViewerTexture* imagep = LLViewerTextureManager::findFetchedTexture(id, TEX_LIST_STANDARD);
if (!imagep)
{
me->mTexturesToSave.erase(id);

View File

@ -36,6 +36,8 @@
#include "llsecapi.h"
#include <curl/curl.h>
#include "llcorehttputil.h"
#ifdef OPENSIM
#include "llviewernetwork.h"
#endif
@ -142,6 +144,9 @@ LLAppCoreHttp::~LLAppCoreHttp()
void LLAppCoreHttp::init()
{
LLCoreHttpUtil::setPropertyMethods(
boost::bind(&LLControlGroup::getBOOL, boost::ref(gSavedSettings), _1),
boost::bind(&LLControlGroup::declareBOOL, boost::ref(gSavedSettings), _1, _2, _3, LLControlVariable::PERSIST_NONDFT));
LLCore::LLHttp::initialize();

View File

@ -72,7 +72,12 @@
#pragma warning (disable:4702)
#endif
#if 1
namespace
{
const S32 BAKE_RETRY_MAX_COUNT = 5;
const F32 BAKE_RETRY_TIMEOUT = 2.0F;
}
// *TODO$: LLInventoryCallback should be deprecated to conform to the new boost::bind/coroutine model.
// temp code in transition
void doAppearanceCb(LLPointer<LLInventoryCallback> cb, LLUUID id)
@ -80,8 +85,6 @@ void doAppearanceCb(LLPointer<LLInventoryCallback> cb, LLUUID id)
if (cb.notNull())
cb->fire(id);
}
#endif
std::string self_av_string()
{
@ -2078,8 +2081,6 @@ void LLAppearanceMgr::filterWearableItems(
}
}
//void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append)
// [RLVa:KB] - Checked: 2010-03-05 (RLVa-1.2.0)
void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append)
{
LLViewerInventoryCategory *pcat = gInventory.getCategory(category);
@ -3327,9 +3328,7 @@ void LLAppearanceMgr::updateIsDirty()
if(outfit_items.size() != cof_items.size())
{
// <FS:Ansariel> Change log tag for easier debugging
//LL_DEBUGS("Avatar") << "item count different - base " << outfit_items.size() << " cof " << cof_items.size() << LL_ENDL;
LL_DEBUGS("Outfit") << "item count different - base " << outfit_items.size() << " cof " << cof_items.size() << LL_ENDL;
LL_DEBUGS("Avatar") << "item count different - base " << outfit_items.size() << " cof " << cof_items.size() << LL_ENDL;
// Current outfit folder should have one more item than the outfit folder.
// this one item is the link back to the outfit folder itself.
mOutfitIsDirty = true;
@ -3741,12 +3740,36 @@ LLSD LLAppearanceMgr::dumpCOF() const
void LLAppearanceMgr::requestServerAppearanceUpdate()
{
LLCoprocedureManager::CoProcedure_t proc = boost::bind(&LLAppearanceMgr::serverAppearanceUpdateCoro, this, _1);
LLCoprocedureManager::instance().enqueueCoprocedure("AIS", "LLAppearanceMgr::serverAppearanceUpdateCoro", proc);
if (!mOutstandingAppearanceBakeRequest)
{
#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE
mRerequestAppearanceBake = false;
LLCoprocedureManager::CoProcedure_t proc = boost::bind(&LLAppearanceMgr::serverAppearanceUpdateCoro, this, _1);
LLCoprocedureManager::instance().enqueueCoprocedure("AIS", "LLAppearanceMgr::serverAppearanceUpdateCoro", proc);
#else
LLCoros::instance().launch("serverAppearanceUpdateCoro",
boost::bind(&LLAppearanceMgr::serverAppearanceUpdateCoro, this));
#endif
}
else
{
mRerequestAppearanceBake = true;
}
}
#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE
void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter)
#else
void LLAppearanceMgr::serverAppearanceUpdateCoro()
#endif
{
#ifndef APPEARANCEBAKE_AS_IN_AIS_QUEUE
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(
new LLCoreHttpUtil::HttpCoroutineAdapter("serverAppearanceUpdateCoro", LLCore::HttpRequest::DEFAULT_POLICY_ID));
#endif
mRerequestAppearanceBake = false;
if (!gAgent.getRegion())
{
LL_WARNS("Avatar") << "Region not set, cannot request server appearance update" << LL_ENDL;
@ -3773,57 +3796,57 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
return;
}
#if 0
static int reqcount = 0;
int r_count = ++reqcount;
LL_WARNS("Avatar") << "START: Server Bake request #" << r_count << "!" << LL_ENDL;
#endif
// If we have already received an update for this or higher cof version,
// put a warning in the log but request anyway.
S32 cofVersion = getCOFVersion();
S32 lastRcv = gAgentAvatarp->mLastUpdateReceivedCOFVersion;
S32 lastReq = gAgentAvatarp->mLastUpdateRequestCOFVersion;
LL_INFOS("Avatar") << "Requesting COF version " << cofVersion <<
" (Last Received:" << lastRcv << ")" <<
" (Last Requested:" << lastReq << ")" << LL_ENDL;
if ((cofVersion != LLViewerInventoryCategory::VERSION_UNKNOWN))
{
if (cofVersion < lastRcv)
{
LL_WARNS("Avatar") << "Have already received update for cof version " << lastRcv
<< " but requesting for " << cofVersion << LL_ENDL;
}
if (lastReq > cofVersion)
{
LL_WARNS("Avatar") << "Request already in flight for cof version " << lastReq
<< " but requesting for " << cofVersion << LL_ENDL;
}
}
// Actually send the request.
LL_DEBUGS("Avatar") << "Will send request for cof_version " << cofVersion << LL_ENDL;
// LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter(
// "UpdateAvatarAppearance", gAgent.getAgentPolicy()));
llcoro::suspend();
S32 retryCount(0);
bool bRetry;
do
{
BoolSetter outstanding(mOutstandingAppearanceBakeRequest);
// If we have already received an update for this or higher cof version,
// put a warning in the log and cancel the request.
S32 cofVersion = getCOFVersion();
S32 lastRcv = gAgentAvatarp->mLastUpdateReceivedCOFVersion;
S32 lastReq = gAgentAvatarp->mLastUpdateRequestCOFVersion;
LL_INFOS("Avatar") << "Requesting COF version " << cofVersion <<
" (Last Received:" << lastRcv << ")" <<
" (Last Requested:" << lastReq << ")" << LL_ENDL;
if (cofVersion == LLViewerInventoryCategory::VERSION_UNKNOWN)
{
LL_WARNS("AVatar") << "COF version is unknown... not requesting until COF version is known." << LL_ENDL;
return;
}
else
{
if (cofVersion < lastRcv)
{
LL_WARNS("Avatar") << "Have already received update for cof version " << lastRcv
<< " but requesting for " << cofVersion << LL_ENDL;
return;
}
if (lastReq > cofVersion)
{
LL_WARNS("Avatar") << "Request already in flight for cof version " << lastReq
<< " but requesting for " << cofVersion << LL_ENDL;
return;
}
}
// Actually send the request.
LL_DEBUGS("Avatar") << "Will send request for cof_version " << cofVersion << LL_ENDL;
bRetry = false;
LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest());
S32 reqCofVersion = getCOFVersion(); // Treat COF version (gets set by AISAPI as authoritative,
// not what the bake request tells us to use).
if (gSavedSettings.getBOOL("DebugForceAppearanceRequestFailure"))
{
reqCofVersion += 999;
cofVersion += 999;
LL_WARNS("Avatar") << "Forcing version failure on COF Baking" << LL_ENDL;
}
LL_INFOS() << "Requesting bake for COF version " << reqCofVersion << LL_ENDL;
LL_INFOS() << "Requesting bake for COF version " << cofVersion << LL_ENDL;
LLSD postData;
if (gSavedSettings.getBOOL("DebugAvatarExperimentalServerAppearanceUpdate"))
@ -3832,10 +3855,10 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
}
else
{
postData["cof_version"] = reqCofVersion;
postData["cof_version"] = cofVersion;
}
gAgentAvatarp->mLastUpdateRequestCOFVersion = reqCofVersion;
gAgentAvatarp->mLastUpdateRequestCOFVersion = cofVersion;
LLSD result = httpAdapter->postAndSuspend(httpRequest, url, postData);
@ -3853,14 +3876,30 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
// on multiple machines.
if (result.has("expected"))
{
S32 expectedCofVersion = result["expected"].asInteger();
LL_WARNS("Avatar") << "Server expected " << expectedCofVersion << " as COF version" << LL_ENDL;
bRetry = true;
// Wait for a 1/2 second before trying again. Just to keep from asking too quickly.
llcoro::suspendUntilTimeout(0.5);
if (++retryCount > BAKE_RETRY_MAX_COUNT)
{
LL_WARNS("Avatar") << "Bake retry count exceeded!" << LL_ENDL;
break;
}
F32 timeout = pow(BAKE_RETRY_TIMEOUT, static_cast<float>(retryCount)) - 1.0;
LL_WARNS("Avatar") << "Server expected " << expectedCofVersion << " as COF version" << LL_ENDL;
LL_WARNS("Avatar") << "Bake retry #" << retryCount << " in " << timeout << " seconds." << LL_ENDL;
llcoro::suspendUntilTimeout(timeout);
bRetry = true;
continue;
}
else
{
LL_WARNS("Avatar") << "No retry attempted." << LL_ENDL;
break;
}
}
LL_DEBUGS("Avatar") << "succeeded" << LL_ENDL;
@ -3871,10 +3910,11 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
} while (bRetry);
#if 0
LL_WARNS("Avatar") << "END: Server Bake request #" << r_count << "!" << LL_ENDL;
#endif
if (mRerequestAppearanceBake)
{ // A bake request came in while this one was still outstanding.
// Requeue ourself for a later request.
requestServerAppearanceUpdate();
}
}
/*static*/
@ -4078,7 +4118,7 @@ void LLAppearanceMgr::removeItemsFromAvatar(const uuid_vec_t& ids_to_remove, LLP
return;
}
// [RLVa:KB] - Checked: 2013-02-12 (RLVa-1.4.8)
// LLPointer<LLInventoryCallback> cb = NULL;
// LLPointer<LLInventoryCallback> cb = new LLUpdateAppearanceOnDestroy;
for (uuid_vec_t::const_iterator it = ids_to_remove.begin(); it != ids_to_remove.end(); ++it)
{
const LLUUID& id_to_remove = *it;
@ -4291,7 +4331,9 @@ LLAppearanceMgr::LLAppearanceMgr():
mOutfitLocked(false),
mInFlightCounter(0),
mInFlightTimer(),
mIsInUpdateAppearanceFromCOF(false)
mIsInUpdateAppearanceFromCOF(false),
mOutstandingAppearanceBakeRequest(false),
mRerequestAppearanceBake(false)
{
LLOutfitObserver& outfit_observer = LLOutfitObserver::instance();
// unlock outfit on save operation completed

View File

@ -246,7 +246,12 @@ public:
private:
#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE
void serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter);
#else
void serverAppearanceUpdateCoro();
#endif
static void debugAppearanceUpdateCOF(const LLSD& content);
std::string mAppearanceServiceURL;
@ -273,6 +278,8 @@ private:
bool mAttachmentInvLinkEnabled;
bool mOutfitIsDirty;
bool mIsInUpdateAppearanceFromCOF; // to detect recursive calls.
bool mOutstandingAppearanceBakeRequest; // A bake request is outstanding. Do not overlap.
bool mRerequestAppearanceBake;
/**
* Lock for blocking operations on outfit until server reply or timeout exceed

View File

@ -196,7 +196,7 @@ LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p)
}
else
{
LLIconCtrl::setValue(mDefaultIconName);
LLIconCtrl::setValue(mDefaultIconName, LLViewerFetchedTexture::BOOST_UI);
}
}
@ -243,7 +243,7 @@ void LLAvatarIconCtrl::setValue(const LLSD& value)
// *TODO: Consider getting avatar icon/badge directly from
// People API, rather than sending AvatarPropertyRequest
// messages. People API already hits the user table.
LLIconCtrl::setValue(mDefaultIconName);
LLIconCtrl::setValue(mDefaultIconName, LLViewerFetchedTexture::BOOST_UI);
app->addObserver(mAvatarId, this);
app->sendAvatarPropertiesRequest(mAvatarId);
}
@ -284,7 +284,7 @@ bool LLAvatarIconCtrl::updateFromCache()
}
else
{
LLIconCtrl::setValue(mDefaultIconName);
LLIconCtrl::setValue(mDefaultIconName, LLViewerFetchedTexture::BOOST_UI);
return false;
}

View File

@ -1981,7 +1981,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
LLViewerTexture* specular = NULL;
if (LLPipeline::sImpostorRender)
{
specular = LLViewerTextureManager::findFetchedTexture(gBlackSquareID, TEX_LIST_DISCARD);
specular = LLViewerTextureManager::findFetchedTexture(gBlackSquareID, TEX_LIST_STANDARD);
llassert(NULL != specular);
}
else

View File

@ -122,8 +122,6 @@ LLExpandableTextBox::LLTextBoxEx::LLTextBoxEx(const Params& p)
void LLExpandableTextBox::LLTextBoxEx::reshape(S32 width, S32 height, BOOL called_from_parent)
{
LLTextEditor::reshape(width, height, called_from_parent);
hideOrShowExpandTextAsNeeded();
}
void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,const LLStyle::Params& input_params)
@ -298,6 +296,12 @@ void LLExpandableTextBox::updateTextBoxRect()
mTextBox->reshape(rc.getWidth(), rc.getHeight());
mTextBox->setRect(rc);
// *HACK
// hideExpandText brakes text styles (replaces hyper-links with plain text), see ticket EXT-3290
// Also text segments are not removed properly. Same issue at expandTextBox().
// So set text again to make text box re-apply styles and clear segments.
// *TODO Find a solution that does not involve text segment.
mTextBox->setText(mText);
}
S32 LLExpandableTextBox::recalculateTextDelta(S32 text_delta)
@ -403,8 +407,6 @@ void LLExpandableTextBox::collapseTextBox()
setRect(mCollapsedRect);
updateTextBoxRect();
gViewerWindow->removePopup(this);
}
void LLExpandableTextBox::onFocusLost()
@ -423,13 +425,19 @@ void LLExpandableTextBox::onTopLost()
void LLExpandableTextBox::updateTextShape()
{
// I guess this should be done on every reshape(),
// but adding this code to reshape() currently triggers bug VWR-26455,
// which makes the text virtually unreadable.
llassert(!mExpanded);
updateTextBoxRect();
}
void LLExpandableTextBox::reshape(S32 width, S32 height, BOOL called_from_parent)
{
mExpanded = false;
LLUICtrl::reshape(width, height, called_from_parent);
updateTextBoxRect();
gViewerWindow->removePopup(this);
}
void LLExpandableTextBox::setValue(const LLSD& value)
{
collapseTextBox();

View File

@ -147,6 +147,7 @@ public:
* *HACK: Update the inner textbox shape.
*/
void updateTextShape();
virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
/**
* Draws text box, collapses text box if its expanded and its parent's position changed

View File

@ -350,25 +350,25 @@ BOOL LLFloaterModelPreview::postBuild()
LLTextBox* text = getChild<LLTextBox>(lod_label_name[i]);
if (text)
{
text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i));
text->setMouseDownCallback(boost::bind(&LLFloaterModelPreview::setPreviewLOD, this, i));
}
text = getChild<LLTextBox>(lod_triangles_name[i]);
if (text)
{
text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i));
text->setMouseDownCallback(boost::bind(&LLFloaterModelPreview::setPreviewLOD, this, i));
}
text = getChild<LLTextBox>(lod_vertices_name[i]);
if (text)
{
text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i));
text->setMouseDownCallback(boost::bind(&LLFloaterModelPreview::setPreviewLOD, this, i));
}
text = getChild<LLTextBox>(lod_status_name[i]);
if (text)
{
text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i));
text->setMouseDownCallback(boost::bind(&LLFloaterModelPreview::setPreviewLOD, this, i));
}
}
@ -1424,6 +1424,14 @@ void LLFloaterModelPreview::setDetails(F32 x, F32 y, F32 z, F32 streaming_cost,
childSetTextArg("import_dimensions", "[Z]", llformat("%.3f", z));
}
void LLFloaterModelPreview::setPreviewLOD(S32 lod)
{
if (mModelPreview)
{
mModelPreview->setPreviewLOD(lod);
}
}
void LLModelPreview::rebuildUploadData()
{

View File

@ -95,6 +95,7 @@ public:
static void setUploadAmount(S32 amount) { sUploadAmount = amount; }
void setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost);
void setPreviewLOD(S32 lod);
void onBrowseLOD(S32 lod);

View File

@ -573,6 +573,9 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
// <FS:Ansariel> FIRE-2912: Reset voice button
mCommitCallbackRegistrar.add("Pref.ResetVoice", boost::bind(&LLFloaterPreference::onClickResetVoice, this));
// <FS: KC> FIRE-18250: Option to disable default eye movement
mCommitCallbackRegistrar.add("Pref.StaticEyes", boost::bind(&LLFloaterPreference::onClickStaticEyes, this));
// </Firestorm callbacks>
mCommitCallbackRegistrar.add("UpdateFilter", boost::bind(&LLFloaterPreference::onUpdateFilterTerm, this, false)); // <FS:ND/> Hook up for filtering
@ -2945,6 +2948,9 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im
// <FS:Ansariel> Clear inventory cache button
getChildView("ClearInventoryCache")->setEnabled(TRUE);
// <FS:Ansariel> FIRE-18250: Option to disable default eye movement
getChildView("FSStaticEyes")->setEnabled(TRUE);
}
@ -5266,6 +5272,23 @@ void LLFloaterPreference::populateFontSelectionCombo()
}
// </FS:Kadah>
// <FS:KC> FIRE-18250: Option to disable default eye movement
void LLFloaterPreference::onClickStaticEyes()
{
LLUUID anim_id(gSavedSettings.getString("FSStaticEyesUUID"));
if (gSavedPerAccountSettings.getBOOL("FSStaticEyes"))
{
gAgentAvatarp->startMotion(anim_id);
gAgent.sendAnimationRequest(anim_id, ANIM_REQUEST_START);
}
else
{
gAgentAvatarp->stopMotion(anim_id);
gAgent.sendAnimationRequest(anim_id, ANIM_REQUEST_STOP);
}
}
// </FS:KC>
// <FS:AW optional opensim support>
#ifdef OPENSIM
static LLPanelInjector<LLPanelPreferenceOpensim> t_pref_opensim("panel_preference_opensim");

View File

@ -177,6 +177,9 @@ public:
// <FS:Ansariel> FIRE-2912: Reset voice button
void onClickResetVoice();
// <FS:KC> FIRE-18250: Option to disable default eye movement
void onClickStaticEyes();
void onClickSetCache();
void onClickBrowseCache();
void onClickBrowseCrashLogs();

View File

@ -64,7 +64,8 @@ LLGroupIconCtrl::LLGroupIconCtrl(const LLGroupIconCtrl::Params& p)
}
else
{
LLIconCtrl::setValue(mDefaultIconName);
//TODO: Consider implementing dedicated setDefault() function instead of passing priority for local file
LLIconCtrl::setValue(mDefaultIconName, LLViewerFetchedTexture::BOOST_UI);
}
}
@ -73,6 +74,11 @@ LLGroupIconCtrl::~LLGroupIconCtrl()
LLGroupMgr::getInstance()->removeObserver(this);
}
void LLGroupIconCtrl::setIconId(const LLSD& value)
{
LLIconCtrl::setValue(value);
}
void LLGroupIconCtrl::setValue(const LLSD& value)
{
if (value.isUUID())
@ -91,7 +97,7 @@ void LLGroupIconCtrl::setValue(const LLSD& value)
// Check if cache already contains image_id for that group
if (!updateFromCache())
{
LLIconCtrl::setValue(mDefaultIconName);
LLIconCtrl::setValue(mDefaultIconName, LLViewerFetchedTexture::BOOST_UI);
gm->addObserver(this);
gm->sendGroupPropertiesRequest(mGroupId);
}
@ -122,7 +128,7 @@ bool LLGroupIconCtrl::updateFromCache()
}
else
{
LLIconCtrl::setValue(mDefaultIconName);
LLIconCtrl::setValue(mDefaultIconName, LLViewerFetchedTexture::BOOST_UI);
}
if (mDrawTooltip && !group_data->mName.empty())

View File

@ -66,6 +66,8 @@ public:
*/
virtual void setValue(const LLSD& value);
void setIconId(const LLSD& value);
// LLGroupMgrObserver observer trigger
virtual void changed(LLGroupChange gc);

View File

@ -30,7 +30,7 @@
// libs
#include "llbutton.h"
#include "lliconctrl.h"
#include "llgroupiconctrl.h"
#include "llmenugl.h"
#include "lltextbox.h"
#include "lltextutil.h"
@ -407,7 +407,7 @@ LLGroupListItem::~LLGroupListItem()
//virtual
BOOL LLGroupListItem::postBuild()
{
mGroupIcon = getChild<LLIconCtrl>("group_icon");
mGroupIcon = getChild<LLGroupIconCtrl>("group_icon");
mGroupNameBox = getChild<LLTextBox>("group_name");
mInfoBtn = getChild<LLButton>("info_btn");
@ -469,7 +469,7 @@ void LLGroupListItem::setGroupIconID(const LLUUID& group_icon_id)
{
if (group_icon_id.notNull())
{
mGroupIcon->setValue(group_icon_id);
mGroupIcon->setIconId(group_icon_id);
}
}

View File

@ -96,7 +96,7 @@ private:
};
class LLButton;
class LLIconCtrl;
class LLGroupIconCtrl;
class LLTextBox;
class LLGroupListItem : public LLPanel
@ -130,7 +130,7 @@ private:
LLTextBox* mGroupNameBox;
LLUUID mGroupID;
LLIconCtrl* mGroupIcon;
LLGroupIconCtrl* mGroupIcon;
LLButton* mInfoBtn;
std::string mGroupName;

View File

@ -2195,6 +2195,7 @@ BOOL LLItemBridge::removeItem()
}
LLNotifications::instance().forceResponse(params, 0);
model->checkTrashOverflow();
return TRUE;
}

View File

@ -44,6 +44,7 @@
#include "llmarketplacefunctions.h"
#include "llwindow.h"
#include "llviewercontrol.h"
#include "llviewernetwork.h"
#include "llpreview.h"
#include "llviewermessage.h"
#include "llviewerfoldertype.h"
@ -88,7 +89,8 @@ BOOL LLInventoryModel::sFirstTimeInViewer2 = TRUE;
///----------------------------------------------------------------------------
//BOOL decompress_file(const char* src_filename, const char* dst_filename);
static const char CACHE_FORMAT_STRING[] = "%s.inv";
static const char PRODUCTION_CACHE_FORMAT_STRING[] = "%s.inv";
static const char GRID_CACHE_FORMAT_STRING[] = "%s.%s.inv";
static const char * const LOG_INV("Inventory");
struct InventoryIDPtrLess
@ -854,6 +856,22 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id,
// [/RLVa:KB]
}
U32 LLInventoryModel::getDescendentsCountRecursive(const LLUUID& id, U32 max_item_limit)
{
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
gInventory.collectDescendents(id, cats, items, LLInventoryModel::INCLUDE_TRASH);
U32 items_found = items.size() + cats.size();
for (U32 i = 0; i < cats.size() && items_found <= max_item_limit; ++i)
{
items_found += getDescendentsCountRecursive(cats[i]->getUUID(), max_item_limit - items_found);
}
return items_found;
}
void LLInventoryModel::addChangedMaskForLinks(const LLUUID& object_id, U32 mask)
{
const LLInventoryObject *obj = getObject(object_id);
@ -1748,6 +1766,35 @@ bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) const
return cat->fetch();
}
//static
std::string LLInventoryModel::getInvCacheAddres(const LLUUID& owner_id)
{
std::string inventory_addr;
std::string owner_id_str;
owner_id.toString(owner_id_str);
std::string path(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, owner_id_str));
// <FS:Ansariel> OpenSim fix
//if (LLGridManager::getInstance()->isInProductionGrid())
if (LLGridManager::getInstance()->isInSLMain())
// </FS:Ansariel>
{
inventory_addr = llformat(PRODUCTION_CACHE_FORMAT_STRING, path.c_str());
}
else
{
// NOTE: The inventory cache filenames now include the grid name.
// Add controls against directory traversal or problematic pathname lengths
// if your viewer uses grid names from an untrusted source.
// <FS:Ansariel> Replace illegal filename characters
//const std::string& grid_id_str = LLGridManager::getInstance()->getGridId();
const std::string grid_id_str = LLDir::getScrubbedFileName(LLGridManager::getInstance()->getGridId());
// </FS:Ansariel>
const std::string& grid_id_lower = utf8str_tolower(grid_id_str);
inventory_addr = llformat(GRID_CACHE_FORMAT_STRING, path.c_str(), grid_id_lower.c_str());
}
return inventory_addr;
}
void LLInventoryModel::cache(
const LLUUID& parent_folder_id,
const LLUUID& agent_id)
@ -1768,11 +1815,7 @@ void LLInventoryModel::cache(
items,
INCLUDE_TRASH,
can_cache);
std::string agent_id_str;
std::string inventory_filename;
agent_id.toString(agent_id_str);
std::string path(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, agent_id_str));
inventory_filename = llformat(CACHE_FORMAT_STRING, path.c_str());
std::string inventory_filename = getInvCacheAddres(agent_id);
saveToFile(inventory_filename, categories, items);
std::string gzip_filename(inventory_filename);
gzip_filename.append(".gz");
@ -2076,11 +2119,7 @@ bool LLInventoryModel::loadSkeleton(
item_array_t items;
item_array_t possible_broken_links;
cat_set_t invalid_categories; // Used to mark categories that weren't successfully loaded.
std::string owner_id_str;
owner_id.toString(owner_id_str);
std::string path(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, owner_id_str));
std::string inventory_filename;
inventory_filename = llformat(CACHE_FORMAT_STRING, path.c_str());
std::string inventory_filename = getInvCacheAddres(owner_id);
const S32 NO_VERSION = LLViewerInventoryCategory::VERSION_UNKNOWN;
std::string gzip_filename(inventory_filename);
gzip_filename.append(".gz");
@ -3495,6 +3534,7 @@ void LLInventoryModel::processMoveInventoryItem(LLMessageSystem* msg, void**)
//----------------------------------------------------------------------------
// Trash: LLFolderType::FT_TRASH, "ConfirmEmptyTrash"
// Trash: LLFolderType::FT_TRASH, "TrashIsFull" when trash exceeds maximum capacity
// Lost&Found: LLFolderType::FT_LOST_AND_FOUND, "ConfirmEmptyLostAndFound"
bool LLInventoryModel::callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type)
@ -3576,6 +3616,8 @@ void LLInventoryModel::removeCategory(const LLUUID& category_id)
changeCategoryParent(cat, trash_id, TRUE);
}
}
checkTrashOverflow();
}
void LLInventoryModel::removeObject(const LLUUID& object_id)
@ -3606,6 +3648,16 @@ void LLInventoryModel::removeObject(const LLUUID& object_id)
}
}
void LLInventoryModel::checkTrashOverflow()
{
static const U32 trash_max_capacity = gSavedSettings.getU32("InventoryTrashMaxCapacity");
const LLUUID trash_id = findCategoryUUIDForType(LLFolderType::FT_TRASH);
if (getDescendentsCountRecursive(trash_id, trash_max_capacity) >= trash_max_capacity)
{
gInventory.emptyFolderType("TrashIsFull", LLFolderType::FT_TRASH);
}
}
const LLUUID &LLInventoryModel::getRootFolderID() const
{
return mRootFolderID;

View File

@ -174,7 +174,9 @@ public:
bool loadSkeleton(const LLSD& options, const LLUUID& owner_id);
void buildParentChildMap(); // brute force method to rebuild the entire parent-child relations
void createCommonSystemCategories();
static std::string getInvCacheAddres(const LLUUID& owner_id);
// Call on logout to save a terse representation.
void cache(const LLUUID& parent_folder_id, const LLUUID& agent_id);
private:
@ -287,6 +289,9 @@ public:
item_array_t collectLinkedItems(const LLUUID& item_id,
const LLUUID& start_folder_id = LLUUID::null);
// </FS:Ansariel>
private:
U32 getDescendentsCountRecursive(const LLUUID& id, U32 max_item_limit);
//--------------------------------------------------------------------
// Find
@ -438,6 +443,8 @@ public:
/// removeItem() or removeCategory(), whichever is appropriate
void removeObject(const LLUUID& object_id);
void checkTrashOverflow();
protected:
void updateLinkedObjectsFromPurge(const LLUUID& baseobj_id);

View File

@ -135,7 +135,7 @@ LLLocalBitmap::~LLLocalBitmap()
}
// delete self from gimagelist
LLViewerFetchedTexture* image = gTextureList.findImage(mWorldID, TEX_LIST_DISCARD);
LLViewerFetchedTexture* image = gTextureList.findImage(mWorldID, TEX_LIST_STANDARD);
gTextureList.deleteImage(image);
if (image)
@ -216,7 +216,7 @@ bool LLLocalBitmap::updateSelf(EUpdateType optional_firstupdate)
texture->setCachedRawImage(LL_LOCAL_DISCARD_LEVEL, raw_image);
texture->ref();
gTextureList.addImage(texture, TEX_LIST_DISCARD);
gTextureList.addImage(texture, TEX_LIST_STANDARD);
if (optional_firstupdate != UT_FIRSTUSE)
{
@ -224,7 +224,7 @@ bool LLLocalBitmap::updateSelf(EUpdateType optional_firstupdate)
replaceIDs(old_id, mWorldID);
// remove old_id from gimagelist
LLViewerFetchedTexture* image = gTextureList.findImage(old_id, TEX_LIST_DISCARD);
LLViewerFetchedTexture* image = gTextureList.findImage(old_id, TEX_LIST_STANDARD);
if (image != NULL)
{
gTextureList.deleteImage(image);
@ -393,7 +393,7 @@ void LLLocalBitmap::replaceIDs(LLUUID old_id, LLUUID new_id)
std::vector<LLViewerObject*> LLLocalBitmap::prepUpdateObjects(LLUUID old_id, U32 channel)
{
std::vector<LLViewerObject*> obj_list;
LLViewerFetchedTexture* old_texture = gTextureList.findImage(old_id, TEX_LIST_DISCARD);
LLViewerFetchedTexture* old_texture = gTextureList.findImage(old_id, TEX_LIST_STANDARD);
for(U32 face_iterator = 0; face_iterator < old_texture->getNumFaces(channel); face_iterator++)
{
@ -511,7 +511,7 @@ void LLLocalBitmap::updateUserPrims(LLUUID old_id, LLUUID new_id, U32 channel)
void LLLocalBitmap::updateUserSculpts(LLUUID old_id, LLUUID new_id)
{
LLViewerFetchedTexture* old_texture = gTextureList.findImage(old_id, TEX_LIST_DISCARD);
LLViewerFetchedTexture* old_texture = gTextureList.findImage(old_id, TEX_LIST_STANDARD);
for(U32 volume_iter = 0; volume_iter < old_texture->getNumVolumes(); volume_iter++)
{
LLVOVolume* volume_to_object = (*old_texture->getVolumeList())[volume_iter];

View File

@ -796,6 +796,15 @@ void LLMarketplaceData::getMerchantStatusCoro()
log_SLM_infos("Get /merchant", httpCode, std::string("Merchant is not migrated"));
setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_MIGRATED_MERCHANT);
}
else if (httpCode == HTTP_INTERNAL_ERROR)
{
// 499 includes timeout and ssl error - marketplace is down or having issues, we do not show it in this request according to MAINT-5938
LL_WARNS("SLM") << "SLM Merchant Request failed with status: " << httpCode
<< ", reason : " << status.toString()
<< ", code : " << result["error_code"].asString()
<< ", description : " << result["error_description"].asString() << LL_ENDL;
LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE);
}
else
{
std::string err_code = result["error_code"].asString();

View File

@ -2360,7 +2360,7 @@ void LLPanelFace::LLSelectedTE::getTexId(LLUUID& id, bool& identical)
LLTextureEntry *te = object->getTE(te_index);
if (te)
{
LLViewerTexture* tex = te->getID().notNull() ? gTextureList.findImage(te->getID(), TEX_LIST_DISCARD) : NULL;
LLViewerTexture* tex = te->getID().notNull() ? gTextureList.findImage(te->getID(), TEX_LIST_STANDARD) : NULL;
if(!tex)
{
tex = LLViewerFetchedTexture::sDefaultImagep;

View File

@ -1294,28 +1294,26 @@ void LLPanelPermissions::setAllSaleInfo()
LLSaleInfo new_sale_info(sale_type, price);
LLSelectMgr::getInstance()->selectionSetObjectSaleInfo(new_sale_info);
U8 old_click_action = 0;
LLSelectMgr::getInstance()->selectionGetClickAction(&old_click_action);
if (old_sale_info.isForSale()
&& !new_sale_info.isForSale()
&& old_click_action == CLICK_ACTION_BUY)
{
// If turned off for-sale, make sure click-action buy is turned
// off as well
LLSelectMgr::getInstance()->
selectionSetClickAction(CLICK_ACTION_TOUCH);
}
else if (new_sale_info.isForSale()
&& !old_sale_info.isForSale()
&& old_click_action == CLICK_ACTION_TOUCH)
{
// If just turning on for-sale, preemptively turn on one-click buy
// unless user have a different click action set
LLSelectMgr::getInstance()->
selectionSetClickAction(CLICK_ACTION_BUY);
}
struct f : public LLSelectedObjectFunctor
{
virtual bool apply(LLViewerObject* object)
{
return object->getClickAction() == CLICK_ACTION_BUY
|| object->getClickAction() == CLICK_ACTION_TOUCH;
}
} check_actions;
// Selection should only contain objects that are of target
// action already or of action we are aiming to remove.
bool default_actions = LLSelectMgr::getInstance()->getSelection()->applyToObjects(&check_actions);
if (default_actions && old_sale_info.isForSale() != new_sale_info.isForSale())
{
U8 new_click_action = new_sale_info.isForSale() ? CLICK_ACTION_BUY : CLICK_ACTION_TOUCH;
LLSelectMgr::getInstance()->selectionSetClickAction(new_click_action);
}
showMarkForSale(FALSE);
}

View File

@ -1292,6 +1292,13 @@ bool idle_startup()
{
gDirUtilp->setChatLogsDir(gSavedPerAccountSettings.getString("InstantMessageLogPath"));
}
// <FS:KC> FIRE-18247: Handle non-existent chat log location
if (!gDirUtilp->fileExists(gSavedPerAccountSettings.getString("InstantMessageLogPath")))
{
gDirUtilp->setChatLogsDir(gDirUtilp->getOSUserAppDir());
gSavedPerAccountSettings.setString("InstantMessageLogPath", gDirUtilp->getChatLogsDir());
}
// </FS:KC>
// <FS:CR> Seperate user directories per grid on OS build
#ifdef OPENSIM
gDirUtilp->setPerAccountChatLogsDir(userid, gridlabel);
@ -2883,6 +2890,15 @@ bool idle_startup()
}
// </FS:PP>
// <FS:KC> FIRE-18250: Option to disable default eye movement
if (gSavedPerAccountSettings.getBOOL("FSStaticEyes"))
{
LLUUID anim_id(gSavedSettings.getString("FSStaticEyesUUID"));
gAgentAvatarp->startMotion(anim_id);
gAgent.sendAnimationRequest(anim_id, ANIM_REQUEST_START);
}
// </FS:KC>
return TRUE;
}

View File

@ -907,7 +907,6 @@ void LLSurface::decompressDCTPatch(LLBitPack &bitpack, LLGroupHeader *gopp, BOOL
<< " quant_wbits " << (S32)ph.quant_wbits
<< " patchids " << (S32)ph.patchids
<< LL_ENDL;
LLAppViewer::instance()->badNetworkHandler();
return;
}

View File

@ -1453,7 +1453,7 @@ void LLTextureCtrl::setOnTextureSelectedCallback(texture_selected_callback cb)
void LLTextureCtrl::setImageAssetName(const std::string& name)
{
LLPointer<LLUIImage> imagep = LLUI::getUIImage(name);
LLPointer<LLUIImage> imagep = LLUI::getUIImage(name, LLGLTexture::BOOST_PREVIEW);
if(imagep)
{
LLViewerFetchedTexture* pTexture = dynamic_cast<LLViewerFetchedTexture*>(imagep->getImage().get());

View File

@ -4465,7 +4465,7 @@ void LLTextureFetchDebugger::addHistoryEntry(LLTextureFetchWorker* worker)
mRefetchedAllData += worker->mFormattedImage->getDataSize();
// refetch list only requests/creates normal images, so requesting ui='false'
LLViewerFetchedTexture* tex = LLViewerTextureManager::findFetchedTexture(worker->mID, TEX_LIST_DISCARD);
LLViewerFetchedTexture* tex = LLViewerTextureManager::findFetchedTexture(worker->mID, TEX_LIST_STANDARD);
if(tex && mRefetchList[tex].begin() != mRefetchList[tex].end())
{
if(worker->mDecodedDiscard == mFetchingHistory[mRefetchList[tex][0]].mDecodedLevel)

View File

@ -187,6 +187,7 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
params.wrap(true);
params.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP);
params.allow_scroll(true);
params.force_urls_external(mNotification->getForceUrlsExternal());
LLTextBox * msg_box = LLUICtrlFactory::create<LLTextBox> (params);
// Compute max allowable height for the dialog text, so we can allocate

View File

@ -31,7 +31,7 @@
#include "llfocusmgr.h"
#include "llbutton.h"
#include "lliconctrl.h"
#include "llgroupiconctrl.h"
#include "llinventoryfunctions.h"
#include "llinventoryicon.h"
#include "llnotifications.h"
@ -70,8 +70,10 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(const LLNotificationPtr& notifi
mGroupID = payload["group_id"].asUUID();
//group icon
LLIconCtrl* pGroupIcon = getChild<LLIconCtrl>("group_icon", TRUE);
pGroupIcon->setValue(groupData.mInsigniaID);
LLGroupIconCtrl* pGroupIcon = getChild<LLGroupIconCtrl>("group_icon", TRUE);
// We should already have this data preloaded, so no sense in setting icon through setValue(group_id)
pGroupIcon->setIconId(groupData.mInsigniaID);
//header title
std::string from_name = payload["sender_name"].asString();

View File

@ -1340,6 +1340,13 @@ void LLViewerMedia::getOpenIDCookieCoro(std::string url)
if (parseRawCookie(sOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure) &&
media_instance->getMediaPlugin())
{
// MAINT-5711 - inexplicably, the CEF setCookie function will no longer set the cookie if the
// url and domain are not the same. This used to be my.sl.com and id.sl.com respectively and worked.
// For now, we use the URL for the OpenID POST request since it will have the same authority
// as the domain field.
// (Feels like there must be a less dirty way to construct a URL from component LLURL parts)
url = std::string(sOpenIDURL.mURI) + "://" + std::string(sOpenIDURL.mAuthority);
media_instance->getMediaPlugin()->setCookie(url, cookie_name, cookie_value, cookie_host, cookie_path, httponly, secure);
}
}

View File

@ -7083,6 +7083,10 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
bool you_paid_someone = (source_id == gAgentID);
if (you_paid_someone)
{
if(!gSavedSettings.getBOOL("NotifyMoneySpend"))
{
return;
}
args["NAME"] = balance_change_in_chat ? "%s" : dest_slurl;
is_name_group = is_dest_group;
name_id = dest_id;
@ -7200,6 +7204,10 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
else
{
// ...someone paid you
if(!gSavedSettings.getBOOL("NotifyMoneyReceived"))
{
return;
}
args["NAME"] = balance_change_in_chat ? "%s" : source_slurl;
is_name_group = is_source_group;
name_id = source_id;

View File

@ -3445,7 +3445,7 @@ LLViewerMediaTexture::LLViewerMediaTexture(const LLUUID& id, BOOL usemipmaps, LL
setCategory(LLGLTexture::MEDIA);
LLViewerTexture* tex = gTextureList.findImage(mID, TEX_LIST_DISCARD);
LLViewerTexture* tex = gTextureList.findImage(mID, TEX_LIST_STANDARD);
if(tex) //this media is a parcel media for tex.
{
tex->setParcelMedia(this);
@ -3455,7 +3455,7 @@ LLViewerMediaTexture::LLViewerMediaTexture(const LLUUID& id, BOOL usemipmaps, LL
//virtual
LLViewerMediaTexture::~LLViewerMediaTexture()
{
LLViewerTexture* tex = gTextureList.findImage(mID, TEX_LIST_DISCARD);
LLViewerTexture* tex = gTextureList.findImage(mID, TEX_LIST_STANDARD);
if(tex) //this media is a parcel media for tex.
{
tex->setParcelMedia(NULL);
@ -3510,7 +3510,7 @@ BOOL LLViewerMediaTexture::findFaces()
BOOL ret = TRUE;
LLViewerTexture* tex = gTextureList.findImage(mID, TEX_LIST_DISCARD);
LLViewerTexture* tex = gTextureList.findImage(mID, TEX_LIST_STANDARD);
if(tex) //this media is a parcel media for tex.
{
for (U32 ch = 0; ch < LLRender::NUM_TEXTURE_CHANNELS; ++ch)
@ -3619,7 +3619,7 @@ void LLViewerMediaTexture::addFace(U32 ch, LLFace* facep)
const LLTextureEntry* te = facep->getTextureEntry();
if(te && te->getID().notNull())
{
LLViewerTexture* tex = gTextureList.findImage(te->getID(), TEX_LIST_DISCARD);
LLViewerTexture* tex = gTextureList.findImage(te->getID(), TEX_LIST_STANDARD);
if(tex)
{
mTextureList.push_back(tex);//increase the reference number by one for tex to avoid deleting it.
@ -3648,7 +3648,7 @@ void LLViewerMediaTexture::removeFace(U32 ch, LLFace* facep)
const LLTextureEntry* te = facep->getTextureEntry();
if(te && te->getID().notNull())
{
LLViewerTexture* tex = gTextureList.findImage(te->getID(), TEX_LIST_DISCARD);
LLViewerTexture* tex = gTextureList.findImage(te->getID(), TEX_LIST_STANDARD);
if(tex)
{
for(std::list< LLPointer<LLViewerTexture> >::iterator iter = mTextureList.begin();
@ -3788,10 +3788,10 @@ void LLViewerMediaTexture::switchTexture(U32 ch, LLFace* facep)
const LLTextureEntry* te = facep->getTextureEntry();
if(te)
{
LLViewerTexture* tex = te->getID().notNull() ? gTextureList.findImage(te->getID(), TEX_LIST_DISCARD) : NULL;
LLViewerTexture* tex = te->getID().notNull() ? gTextureList.findImage(te->getID(), TEX_LIST_STANDARD) : NULL;
if(!tex && te->getID() != mID)//try parcel media.
{
tex = gTextureList.findImage(mID, TEX_LIST_DISCARD);
tex = gTextureList.findImage(mID, TEX_LIST_STANDARD);
}
if(!tex)
{

View File

@ -75,20 +75,14 @@ static LLTrace::BlockTimerStatHandle FTM_PROCESS_IMAGES("Process Images");
ETexListType get_element_type(S32 priority)
{
// don't discard flag can be used in some cases, but it usually is not set yet
if (priority == LLViewerFetchedTexture::BOOST_ICON
|| priority == LLViewerFetchedTexture::BOOST_UI)
{
return TEX_LIST_UI;
}
return TEX_LIST_DISCARD;
return (priority == LLViewerFetchedTexture::BOOST_ICON) ? TEX_LIST_SCALE : TEX_LIST_STANDARD;
}
///////////////////////////////////////////////////////////////////////////////
LLTextureKey::LLTextureKey()
: textureId(LLUUID::null),
textureType(TEX_LIST_DISCARD)
textureType(TEX_LIST_STANDARD)
{
}
@ -192,7 +186,7 @@ void LLViewerTextureList::doPreloadImages()
LLPointer<LLViewerFetchedTexture> img_blak_square(new LLViewerFetchedTexture(img_blak_square_tex, FTT_DEFAULT, FALSE));
gBlackSquareID = img_blak_square->getID();
img_blak_square->setUnremovable(TRUE);
addImage(img_blak_square, TEX_LIST_DISCARD);
addImage(img_blak_square, TEX_LIST_STANDARD);
}
static std::string get_texture_list_name()
@ -588,7 +582,7 @@ LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id,
void LLViewerTextureList::findTexturesByID(const LLUUID &image_id, std::vector<LLViewerFetchedTexture*> &output)
{
LLTextureKey search_key(image_id, TEX_LIST_DISCARD);
LLTextureKey search_key(image_id, TEX_LIST_STANDARD);
uuid_map_t::iterator iter = mUUIDMap.lower_bound(search_key);
while (iter != mUUIDMap.end() && iter->first.textureId == image_id)
{
@ -1664,14 +1658,14 @@ void LLViewerTextureList::processImageNotInDatabase(LLMessageSystem *msg,void **
LLUUID image_id;
msg->getUUIDFast(_PREHASH_ImageID, _PREHASH_ID, image_id);
LLViewerFetchedTexture* image = gTextureList.findImage( image_id, TEX_LIST_DISCARD);
LLViewerFetchedTexture* image = gTextureList.findImage( image_id, TEX_LIST_STANDARD);
if( image )
{
LL_WARNS() << "Image not in db" << LL_ENDL;
image->setIsMissingAsset();
}
image = gTextureList.findImage(image_id, TEX_LIST_UI);
image = gTextureList.findImage(image_id, TEX_LIST_SCALE);
if (image)
{
LL_WARNS() << "Icon not in db" << LL_ENDL;

View File

@ -61,8 +61,8 @@ typedef void (*LLImageCallback)(BOOL success,
enum ETexListType
{
TEX_LIST_DISCARD = 0,
TEX_LIST_UI
TEX_LIST_STANDARD = 0,
TEX_LIST_SCALE
};
struct LLTextureKey

View File

@ -1107,7 +1107,16 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK
BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask)
{
BOOL down = TRUE;
mAllowMouseDragging = FALSE;
if (!mMouseDownTimer.getStarted())
{
mMouseDownTimer.start();
}
else
{
mMouseDownTimer.reset();
}
BOOL down = TRUE;
return handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_LEFT,down);
}
@ -1126,7 +1135,11 @@ BOOL LLViewerWindow::handleDoubleClick(LLWindow *window, LLCoordGL pos, MASK ma
BOOL LLViewerWindow::handleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask)
{
BOOL down = FALSE;
if (mMouseDownTimer.getStarted())
{
mMouseDownTimer.stop();
}
BOOL down = FALSE;
return handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_LEFT,down);
}
@ -1358,6 +1371,22 @@ void LLViewerWindow::handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask
}
}
void LLViewerWindow::handleMouseDragged(LLWindow *window, LLCoordGL pos, MASK mask)
{
if (mMouseDownTimer.getStarted())
{
if (mMouseDownTimer.getElapsedTimeF32() > 0.1)
{
mAllowMouseDragging = TRUE;
mMouseDownTimer.stop();
}
}
if(mAllowMouseDragging || !LLToolCamera::getInstance()->hasMouseCapture())
{
handleMouseMove(window, pos, mask);
}
}
void LLViewerWindow::handleMouseLeave(LLWindow *window)
{
// Note: we won't get this if we have captured the mouse.
@ -1687,6 +1716,8 @@ LLViewerWindow::LLViewerWindow(const Params& p)
mMiddleMouseDown(FALSE),
mRightMouseDown(FALSE),
mMouseInWindow( FALSE ),
mAllowMouseDragging(TRUE),
mMouseDownTimer(),
mLastMask( MASK_NONE ),
mToolStored( NULL ),
mHideCursorPermanent( FALSE ),
@ -5572,6 +5603,13 @@ void LLViewerWindow::stopGL(BOOL save_state)
gGLManager.mIsDisabled = TRUE;
stop_glerror();
//unload shader's
while (LLGLSLShader::sInstances.size())
{
LLGLSLShader* shader = *(LLGLSLShader::sInstances.begin());
shader->unload();
}
LL_INFOS() << "Remaining allocated texture memory: " << LLImageGL::sGlobalTextureMemory.value() << " bytes" << LL_ENDL;
}

View File

@ -194,6 +194,7 @@ public:
/*virtual*/ BOOL handleMiddleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask);
/*virtual*/ LLWindowCallbacks::DragNDropResult handleDragNDrop(LLWindow *window, LLCoordGL pos, MASK mask, LLWindowCallbacks::DragNDropAction action, std::string data);
void handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask);
void handleMouseDragged(LLWindow *window, LLCoordGL pos, MASK mask);
/*virtual*/ void handleMouseLeave(LLWindow *window);
/*virtual*/ void handleResize(LLWindow *window, S32 x, S32 y);
/*virtual*/ void handleFocus(LLWindow *window);
@ -474,6 +475,8 @@ private:
BOOL mMouseInWindow; // True if the mouse is over our window or if we have captured the mouse.
BOOL mFocusCycleMode;
BOOL mAllowMouseDragging;
LLFrameTimer mMouseDownTimer;
typedef std::set<LLHandle<LLView> > view_handle_set_t;
view_handle_set_t mMouseHoverViews;

View File

@ -2084,7 +2084,7 @@ LLViewerFetchedTexture *LLVOAvatar::getBakedTextureImage(const U8 te, const LLUU
uuid == IMG_INVISIBLE)
{
// Should already exist, don't need to find it on sim or baked-texture host.
result = gTextureList.findImage(uuid, TEX_LIST_DISCARD);
result = gTextureList.findImage(uuid, TEX_LIST_STANDARD);
}
if (!result)
{
@ -4765,7 +4765,7 @@ bool LLVOAvatar::allTexturesCompletelyDownloaded(std::set<LLUUID>& ids) const
{
for (std::set<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); ++it)
{
LLViewerFetchedTexture *imagep = gTextureList.findImage(*it, TEX_LIST_DISCARD);
LLViewerFetchedTexture *imagep = gTextureList.findImage(*it, TEX_LIST_STANDARD);
if (imagep && imagep->getDiscardLevel()!=0)
{
return false;
@ -4837,7 +4837,7 @@ S32Bytes LLVOAvatar::totalTextureMemForUUIDS(std::set<LLUUID>& ids)
S32Bytes result(0);
for (std::set<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); ++it)
{
LLViewerFetchedTexture *imagep = gTextureList.findImage(*it, TEX_LIST_DISCARD);
LLViewerFetchedTexture *imagep = gTextureList.findImage(*it, TEX_LIST_STANDARD);
if (imagep)
{
result += imagep->getTextureMemory();
@ -4925,7 +4925,7 @@ void LLVOAvatar::releaseOldTextures()
{
if (new_texture_ids.find(*it) == new_texture_ids.end())
{
LLViewerFetchedTexture *imagep = gTextureList.findImage(*it, TEX_LIST_DISCARD);
LLViewerFetchedTexture *imagep = gTextureList.findImage(*it, TEX_LIST_STANDARD);
if (imagep)
{
current_texture_mem += imagep->getTextureMemory();
@ -9503,7 +9503,7 @@ void LLVOAvatar::bakedTextureOriginCounts(S32 &sb_count, // server-bake, has ori
collectBakedTextureUUIDs(baked_ids);
for (std::set<LLUUID>::const_iterator it = baked_ids.begin(); it != baked_ids.end(); ++it)
{
LLViewerFetchedTexture *imagep = gTextureList.findImage(*it, TEX_LIST_DISCARD);
LLViewerFetchedTexture *imagep = gTextureList.findImage(*it, TEX_LIST_STANDARD);
bool has_url = false, has_host = false;
if (!imagep->getUrl().empty())
{

View File

@ -673,19 +673,25 @@ void LLVoiceClient::keyDown(KEY key, MASK mask)
return;
}
if(!mPTTIsMiddleMouse && LLAgent::isActionAllowed("speak"))
if (!mPTTIsMiddleMouse && LLAgent::isActionAllowed("speak") && (key == mPTTKey))
{
bool down = (mPTTKey != KEY_NONE) && gKeyboard->getKeyDown(mPTTKey);
if (down) { inputUserControlState(down); }
bool down = gKeyboard->getKeyDown(mPTTKey);
if (down)
{
inputUserControlState(down);
}
}
}
void LLVoiceClient::keyUp(KEY key, MASK mask)
{
if(!mPTTIsMiddleMouse)
if (!mPTTIsMiddleMouse && (key == mPTTKey))
{
bool down = (mPTTKey != KEY_NONE) && gKeyboard->getKeyDown(mPTTKey);
if (down) { inputUserControlState(down); }
bool down = gKeyboard->getKeyDown(mPTTKey);
if (!down)
{
inputUserControlState(down);
}
}
}
void LLVoiceClient::middleMouseState(bool down)

View File

@ -80,39 +80,49 @@
extern LLMenuBarGL* gMenuBarView;
extern void handle_voice_morphing_subscribe();
const F32 VOLUME_SCALE_VIVOX = 0.01f;
namespace {
const F32 VOLUME_SCALE_VIVOX = 0.01f;
const F32 SPEAKING_TIMEOUT = 1.f;
const F32 SPEAKING_TIMEOUT = 1.f;
static const std::string VOICE_SERVER_TYPE = "Vivox";
static const std::string VOICE_SERVER_TYPE = "Vivox";
// Don't retry connecting to the daemon more frequently than this:
const F32 CONNECT_THROTTLE_SECONDS = 1.0f;
// Don't retry connecting to the daemon more frequently than this:
const F32 CONNECT_THROTTLE_SECONDS = 1.0f;
// Don't send positional updates more frequently than this:
const F32 UPDATE_THROTTLE_SECONDS = 0.5f;
// Don't send positional updates more frequently than this:
const F32 UPDATE_THROTTLE_SECONDS = 0.5f;
const F32 LOGIN_RETRY_SECONDS = 10.0f;
const int MAX_LOGIN_RETRIES = 12;
const F32 LOGIN_ATTEMPT_TIMEOUT = 5.0f;
const int LOGIN_RETRY_MAX = 5;
const F32 LOGIN_RETRY_TIMEOUT = 4.0f;
// Cosine of a "trivially" small angle
const F32 MINUSCULE_ANGLE_COS = 0.999f;
const int PROVISION_RETRY_MAX = 5;
const F32 PROVISION_RETRY_TIMEOUT = 2.0;
// Defines the maximum number of times(in a row) "stateJoiningSession" case for spatial channel is reached in stateMachine()
// which is treated as normal. The is the number of frames to wait for a channel join before giving up. This was changed
// from the original count of 50 for two reason. Modern PCs have higher frame rates and sometimes the SLVoice process
// backs up processing join requests. There is a log statement that records when channel joins take longer than 100 frames.
const int MAX_NORMAL_JOINING_SPATIAL_NUM = 1500;
// Cosine of a "trivially" small angle
const F32 MINUSCULE_ANGLE_COS = 0.999f;
// How often to check for expired voice fonts in seconds
const F32 VOICE_FONT_EXPIRY_INTERVAL = 10.f;
// Time of day at which Vivox expires voice font subscriptions.
// Used to replace the time portion of received expiry timestamps.
static const std::string VOICE_FONT_EXPIRY_TIME = "T05:00:00Z";
const F32 SESSION_JOIN_TIMEOUT = 10.0f;
// Maximum length of capture buffer recordings in seconds.
const F32 CAPTURE_BUFFER_MAX_TIME = 10.f;
// Defines the maximum number of times(in a row) "stateJoiningSession" case for spatial channel is reached in stateMachine()
// which is treated as normal. The is the number of frames to wait for a channel join before giving up. This was changed
// from the original count of 50 for two reason. Modern PCs have higher frame rates and sometimes the SLVoice process
// backs up processing join requests. There is a log statement that records when channel joins take longer than 100 frames.
const int MAX_NORMAL_JOINING_SPATIAL_NUM = 1500;
// How often to check for expired voice fonts in seconds
const F32 VOICE_FONT_EXPIRY_INTERVAL = 10.f;
// Time of day at which Vivox expires voice font subscriptions.
// Used to replace the time portion of received expiry timestamps.
static const std::string VOICE_FONT_EXPIRY_TIME = "T05:00:00Z";
// Maximum length of capture buffer recordings in seconds.
const F32 CAPTURE_BUFFER_MAX_TIME = 10.f;
const int ERROR_VIVOX_OBJECT_NOT_FOUND = 1001;
const int ERROR_VIVOX_NOT_LOGGED_IN = 1007;
}
static int scale_mic_volume(float volume)
{
@ -129,8 +139,6 @@ static int scale_speaker_volume(float volume)
}
const int ERROR_VIVOX_OBJECT_NOT_FOUND = 1001;
const int ERROR_VIVOX_NOT_LOGGED_IN = 1007;
///////////////////////////////////////////////////////////////////////////////////////////////
@ -570,7 +578,7 @@ void LLVivoxVoiceClient::voiceControlCoro()
// if we hit this and mRelogRequested is true, that indicates
// that we attempted to relog into Vivox and were rejected.
// Rather than just quit out of voice, we will tear it down (above)
// and then reconstruct the voice connecino from scratch.
// and then reconstruct the voice connecion from scratch.
if (mRelogRequested)
{
while (isGatewayRunning())
@ -830,13 +838,15 @@ bool LLVivoxVoiceClient::provisionVoiceAccount()
if (status == LLCore::HttpStatus(404))
{
if (++retryCount > 5)
if (++retryCount > PROVISION_RETRY_MAX)
{
LL_WARNS("Voice") << "Could not access voice provision cap after 5 attempts." << LL_ENDL;
LL_WARNS("Voice") << "Could not access voice provision cap after " << PROVISION_RETRY_MAX << " attempts." << LL_ENDL;
return false;
}
LL_WARNS("Voice") << "Provision CAP 404. Retrying in 1.0" << LL_ENDL;
llcoro::suspendUntilTimeout(1.0);
F32 timeout = pow(PROVISION_RETRY_TIMEOUT, static_cast<float>(retryCount));
LL_WARNS("Voice") << "Provision CAP 404. Retrying in " << timeout << " seconds." << LL_ENDL;
llcoro::suspendUntilTimeout(timeout);
continue;
}
@ -934,38 +944,42 @@ bool LLVivoxVoiceClient::breakVoiceConnection(bool corowait)
bool LLVivoxVoiceClient::loginToVivox()
{
int loginRetryCount(0);
LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
LLSD timeoutResult(LLSDMap("login", "timeout"));
int loginRetryCount(0);
bool response_ok(false);
bool account_login(false);
bool send_login(true);
do
{
mIsLoggingIn = true;
if (send_login)
loginSendMessage();
send_login = false;
LLSD result = llcoro::suspendUntilEventOn(voicePump);
LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, LOGIN_ATTEMPT_TIMEOUT, timeoutResult);
LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL;
if (result.has("login"))
{
std::string loginresp = result["login"];
if (loginresp == "retry")
if ((loginresp == "retry") || (loginresp == "timeout"))
{
if (!loginRetryCount)
if ((!loginRetryCount) && (loginresp != "timeout"))
{ // on first retry notify user
notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LOGIN_RETRY);
}
if ((++loginRetryCount > MAX_LOGIN_RETRIES) || (!result["login_retry"]))
if ((++loginRetryCount > LOGIN_RETRY_MAX) || (loginresp == "timeout"))
{
LL_WARNS("Voice") << "too many login retries, giving up." << LL_ENDL;
LL_WARNS("Voice") << "too many login retries or timeout connecting, giving up." << LL_ENDL;
LLSD args;
std::stringstream errs;
errs << mVoiceAccountServerURI << "\n:UDP: 3478, 3479, 5060, 5062, 12000-17000";
@ -988,8 +1002,10 @@ bool LLVivoxVoiceClient::loginToVivox()
account_login = false;
send_login = true;
LL_INFOS("Voice") << "will retry login in " << LOGIN_RETRY_SECONDS << " seconds." << LL_ENDL;
llcoro::suspendUntilTimeout(LOGIN_RETRY_SECONDS);
F32 timeout = pow(LOGIN_RETRY_TIMEOUT, static_cast<float>(loginRetryCount)) - 1.0f;
LL_INFOS("Voice") << "will retry login in " << timeout << " seconds." << LL_ENDL;
llcoro::suspendUntilTimeout(timeout);
}
else if (loginresp == "failed")
{
@ -1028,7 +1044,6 @@ bool LLVivoxVoiceClient::loginToVivox()
void LLVivoxVoiceClient::logoutOfVivox(bool wait)
{
LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
if (!mIsLoggedIn)
return;
@ -1041,7 +1056,10 @@ void LLVivoxVoiceClient::logoutOfVivox(bool wait)
if (wait)
{
LLSD result = llcoro::suspendUntilEventOn(voicePump);
LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
LLSD timeoutResult(LLSDMap("lougout", "timeout"));
LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, LOGIN_ATTEMPT_TIMEOUT, timeoutResult);
LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL;
@ -1215,6 +1233,7 @@ bool LLVivoxVoiceClient::addAndJoinSession(const sessionStatePtr_t &nextSession)
if (!mVoiceEnabled && mIsInitialized)
{
LL_DEBUGS("Voice") << "Voice no longer enabled. Exiting." << LL_ENDL;
mIsJoiningSession = false;
// User bailed out during connect -- jump straight to teardown.
terminateAudioSession(true);
@ -1223,6 +1242,7 @@ bool LLVivoxVoiceClient::addAndJoinSession(const sessionStatePtr_t &nextSession)
}
else if (mSessionTerminateRequested)
{
LL_DEBUGS("Voice") << "Terminate requested" << LL_ENDL;
if (mAudioSession && !mAudioSession->mHandle.empty())
{
// Only allow direct exits from this state in p2p calls (for cancelling an invite).
@ -1240,15 +1260,17 @@ bool LLVivoxVoiceClient::addAndJoinSession(const sessionStatePtr_t &nextSession)
bool added(true);
bool joined(false);
LLSD timeoutResult(LLSDMap("session", "timeout"));
// It appears that I need to wait for BOTH the SessionGroup.AddSession response and the SessionStateChangeEvent with state 4
// before continuing from this state. They can happen in either order, and if I don't wait for both, things can get stuck.
// For now, the SessionGroup.AddSession response handler sets mSessionHandle and the SessionStateChangeEvent handler transitions to stateSessionJoined.
// This is a cheap way to make sure both have happened before proceeding.
do
{
result = llcoro::suspendUntilEventOn(voicePump);
result = llcoro::suspendUntilEventOnWithTimeout(voicePump, SESSION_JOIN_TIMEOUT, timeoutResult);
LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL;
LL_INFOS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL;
if (result.has("session"))
{
if (result.has("handle"))
@ -1261,14 +1283,15 @@ bool LLVivoxVoiceClient::addAndJoinSession(const sessionStatePtr_t &nextSession)
}
std::string message = result["session"].asString();
if ((message == "added") || (message == "created"))
added = true;
else if (message == "joined")
joined = true;
else if ((message == "failed") || (message == "removed"))
else if ((message == "failed") || (message == "removed") || (message == "timeout"))
{ // we will get a removed message if a voice call is declined.
if (message == "failed")
if (message == "failed")
{
int reason = result["reason"].asInteger();
LL_WARNS("Voice") << "Add and join failed for reason " << reason << LL_ENDL;
@ -1276,7 +1299,7 @@ bool LLVivoxVoiceClient::addAndJoinSession(const sessionStatePtr_t &nextSession)
if ((reason == ERROR_VIVOX_NOT_LOGGED_IN) ||
(reason == ERROR_VIVOX_OBJECT_NOT_FOUND))
{
LL_INFOS("Voice") << "Requesting reprovision and login." << LL_ENDL;
LL_DEBUGS("Voice") << "Requesting reprovision and login." << LL_ENDL;
requestRelog();
}
@ -1518,11 +1541,9 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
notifyParticipantObservers();
notifyVoiceFontObservers();
LLSD timeoutEvent = LLSD::emptyMap();
timeoutEvent["timeout"] = LLSD::Boolean(true);
LLSD timeoutEvent(LLSDMap("timeout", LLSD::Boolean(true)));
LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
LLEventTimeout timeout(voicePump);
mIsInChannel = true;
mMuteMicDirty = true;
@ -1574,8 +1595,7 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
sendLocalAudioUpdates();
mIsInitialized = true;
timeout.eventAfter(UPDATE_THROTTLE_SECONDS, timeoutEvent);
LLSD result = llcoro::suspendUntilEventOn(timeout);
LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, UPDATE_THROTTLE_SECONDS, timeoutEvent);
if (!result.has("timeout")) // logging the timeout event spams the log
LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL;
if (result.has("session"))
@ -1673,22 +1693,19 @@ void LLVivoxVoiceClient::recordingAndPlaybackMode()
int LLVivoxVoiceClient::voiceRecordBuffer()
{
LLSD timeoutResult;
timeoutResult["recplay"] = LLSD::String("stop");
LLSD timeoutResult(LLSDMap("recplay", "stop"));
LL_INFOS("Voice") << "Recording voice buffer" << LL_ENDL;
LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
LLEventTimeout timeout(voicePump);
timeout.eventAfter(CAPTURE_BUFFER_MAX_TIME, timeoutResult);
LLSD result;
captureBufferRecordStartSendMessage();
notifyVoiceFontObservers();
do
{
result = llcoro::suspendUntilEventOn(voicePump);
result = llcoro::suspendUntilEventOnWithTimeout(voicePump, CAPTURE_BUFFER_MAX_TIME, timeoutResult);
LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL;
} while (!result.has("recplay"));
@ -1706,14 +1723,11 @@ int LLVivoxVoiceClient::voiceRecordBuffer()
int LLVivoxVoiceClient::voicePlaybackBuffer()
{
LLSD timeoutResult;
timeoutResult["recplay"] = LLSD::String("stop");
LLSD timeoutResult(LLSDMap("recplay", "stop"));
LL_INFOS("Voice") << "Playing voice buffer" << LL_ENDL;
LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
LLEventTimeout timeout(voicePump);
timeout.eventAfter(CAPTURE_BUFFER_MAX_TIME, timeoutResult);
LLSD result;
do
@ -1728,7 +1742,7 @@ int LLVivoxVoiceClient::voicePlaybackBuffer()
// Update UI, should really use a separate callback.
notifyVoiceFontObservers();
result = llcoro::suspendUntilEventOn(voicePump);
result = llcoro::suspendUntilEventOnWithTimeout(voicePump, CAPTURE_BUFFER_MAX_TIME, timeoutResult);
LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL;
} while (!result.has("recplay"));
@ -2955,11 +2969,9 @@ void LLVivoxVoiceClient::sessionCreateResponse(std::string &requestId, int statu
session->mErrorStatusString = statusString;
if(session == mAudioSession)
{
LLSD vivoxevent = LLSD::emptyMap();
vivoxevent["handle"] = LLSD::String(sessionHandle);
vivoxevent["session"] = LLSD::String("failed");
vivoxevent["reason"] = LLSD::Integer(statusCode);
LLSD vivoxevent(LLSDMap("handle", LLSD::String(sessionHandle))
("session", "failed")
("reason", LLSD::Integer(statusCode)));
LLEventPumps::instance().post("vivoxClientPump", vivoxevent);
}
@ -2976,10 +2988,8 @@ void LLVivoxVoiceClient::sessionCreateResponse(std::string &requestId, int statu
{
setSessionHandle(session, sessionHandle);
}
LLSD vivoxevent = LLSD::emptyMap();
vivoxevent["handle"] = LLSD::String(sessionHandle);
vivoxevent["session"] = LLSD::String("created");
LLSD vivoxevent(LLSDMap("handle", LLSD::String(sessionHandle))
("session", "created"));
LLEventPumps::instance().post("vivoxClientPump", vivoxevent);
}
@ -3003,10 +3013,8 @@ void LLVivoxVoiceClient::sessionGroupAddSessionResponse(std::string &requestId,
session->mErrorStatusString = statusString;
if(session == mAudioSession)
{
LLSD vivoxevent = LLSD::emptyMap();
vivoxevent["handle"] = LLSD::String(sessionHandle);
vivoxevent["session"] = LLSD::String("failed");
LLSD vivoxevent(LLSDMap("handle", LLSD::String(sessionHandle))
("session", "failed"));
LLEventPumps::instance().post("vivoxClientPump", vivoxevent);
}
@ -3024,10 +3032,8 @@ void LLVivoxVoiceClient::sessionGroupAddSessionResponse(std::string &requestId,
setSessionHandle(session, sessionHandle);
}
LLSD vivoxevent = LLSD::emptyMap();
vivoxevent["handle"] = LLSD::String(sessionHandle);
vivoxevent["session"] = LLSD::String("added");
LLSD vivoxevent(LLSDMap("handle", LLSD::String(sessionHandle))
("session", "added"));
LLEventPumps::instance().post("vivoxClientPump", vivoxevent);
@ -3072,9 +3078,7 @@ void LLVivoxVoiceClient::logoutResponse(int statusCode, std::string &statusStrin
LL_WARNS("Voice") << "Account.Logout response failure: " << statusString << LL_ENDL;
// Should this ever fail? do we care if it does?
}
LLSD vivoxevent = LLSD::emptyMap();
vivoxevent["logout"] = LLSD::Boolean(true);
LLSD vivoxevent(LLSDMap("logout", LLSD::Boolean(true)));
LLEventPumps::instance().post("vivoxClientPump", vivoxevent);
}
@ -3089,9 +3093,7 @@ void LLVivoxVoiceClient::connectorShutdownResponse(int statusCode, std::string &
mConnected = false;
LLSD vivoxevent = LLSD::emptyMap();
vivoxevent["connector"] = LLSD::Boolean(false);
LLSD vivoxevent(LLSDMap("connector", LLSD::Boolean(false)));
LLEventPumps::instance().post("vivoxClientPump", vivoxevent);
}
@ -3199,10 +3201,8 @@ void LLVivoxVoiceClient::joinedAudioSession(const sessionStatePtr_t &session)
// This is the session we're joining.
if(mIsJoiningSession)
{
LLSD vivoxevent = LLSD::emptyMap();
vivoxevent["handle"] = LLSD::String(session->mHandle);
vivoxevent["session"] = LLSD::String("joined");
LLSD vivoxevent(LLSDMap("handle", LLSD::String(session->mHandle))
("session", "joined"));
LLEventPumps::instance().post("vivoxClientPump", vivoxevent);
@ -3345,10 +3345,8 @@ void LLVivoxVoiceClient::leftAudioSession(const sessionStatePtr_t &session)
{
if (mAudioSession == session)
{
LLSD vivoxevent = LLSD::emptyMap();
vivoxevent["handle"] = LLSD::String(session->mHandle);
vivoxevent["session"] = LLSD::String("removed");
LLSD vivoxevent(LLSDMap("handle", LLSD::String(session->mHandle))
("session", "removed"));
LLEventPumps::instance().post("vivoxClientPump", vivoxevent);
}
@ -6225,9 +6223,7 @@ void LLVivoxVoiceClient::accountGetSessionFontsResponse(int statusCode, const st
{
// *TODO: We seem to get multiple events of this type. Should figure a way to advance only after
// receiving the last one.
LLSD result = LLSD::emptyMap();
result["voice_fonts"] = LLSD::Boolean(true);
LLSD result(LLSDMap("voice_fonts", LLSD::Boolean(true)));
LLEventPumps::instance().post("vivoxClientPump", result);
}
@ -6400,8 +6396,7 @@ void LLVivoxVoiceClient::recordPreviewBuffer()
mCaptureBufferRecording = true;
LLSD result;
result["recplay"] = "record";
LLSD result(LLSDMap("recplay", "record"));
LLEventPumps::instance().post("vivoxClientPump", result);
}
@ -6424,8 +6419,7 @@ void LLVivoxVoiceClient::playPreviewBuffer(const LLUUID& effect_id)
mPreviewVoiceFont = effect_id;
mCaptureBufferPlaying = true;
LLSD result;
result["recplay"] = "playback";
LLSD result(LLSDMap("recplay", "playback"));
LLEventPumps::instance().post("vivoxClientPump", result);
}
@ -6434,8 +6428,7 @@ void LLVivoxVoiceClient::stopPreviewBuffer()
mCaptureBufferRecording = false;
mCaptureBufferPlaying = false;
LLSD result;
result["recplay"] = "quit";
LLSD result(LLSDMap("recplay", "quit"));
LLEventPumps::instance().post("vivoxClientPump", result);
}

View File

@ -87,7 +87,7 @@ void LLSimInfo::setLandForSaleImage (LLUUID image_id)
// <FS:CR> Aurora Sim
if (mMapImageID.isNull() && image_id.notNull())
{
mOverlayImage = LLViewerTextureManager::findFetchedTexture(image_id, TEX_LIST_DISCARD);
mOverlayImage = LLViewerTextureManager::findFetchedTexture(image_id, TEX_LIST_STANDARD);
if(mOverlayImage.notNull())
{
LLAppViewer::getTextureCache()->removeFromCache(image_id);

View File

@ -42,7 +42,7 @@
use_ellipses="true"
width="380"
value="Sent by Sender Name, Group Name"/>
<icon
<group_icon
follows="left|top"
height="64"
image_name="Generic_Group"

View File

@ -2514,6 +2514,10 @@ Möchten Sie den Nicht-stören-Modus deaktivieren, bevor Sie diese Transaktion a
Sind Sie sicher, dass Sie den Inhalt Ihres Papierkorbs löschen möchten?
<usetemplate ignoretext="Bestätigen, bevor der Ordner Papierkorb im Inventar geleert wird" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="TrashIsFull">
Ihr Papierkorb läuft über. Dies kann zu Problemen beim Login führen.
<usetemplate name="okcancelbuttons" notext="Ich leere den Papierkorb später" yestext="Papierkorb jetzt leeren"/>
</notification>
<notification name="ConfirmClearBrowserCache">
Sind Sie sicher, dass Sie Ihren Reise-, Internet- und Suchverlauf löschen möchten?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>

View File

@ -95,6 +95,7 @@
<text name="note_lookat">
(Einstellungen für Avatar-Kamerafokus befinden sich auf dem Reiter &quot;Privatsphäre&quot;.)
</text>
<check_box label="Zufällige Augenbewegungen deaktivieren" name="FSStaticEyes"/>
<!-- LGG Color Beams -->
<text name="BeamPrefs">

View File

@ -3981,9 +3981,10 @@ We have downloaded an update to your [APP_NAME] installation.
</notification>
<notification
icon="alertmodal.tga"
name="RequiredUpdateDownloadedVerboseDialog"
type="alertmodal">
icon="alertmodal.tga"
name="RequiredUpdateDownloadedVerboseDialog"
type="alertmodal"
force_urls_external="true">
We have downloaded a required software update.
Version [VERSION] [[INFO_URL] Information about this update]
@ -3995,9 +3996,10 @@ We must restart [APP_NAME] to install the update.
</notification>
<notification
icon="alertmodal.tga"
name="RequiredUpdateDownloadedDialog"
type="alertmodal">
icon="alertmodal.tga"
name="RequiredUpdateDownloadedDialog"
type="alertmodal"
force_urls_external="true">
We must restart [APP_NAME] to install the update.
[[INFO_URL] Information about this update]
<tag>confirm</tag>
@ -4037,9 +4039,10 @@ see [[INFO_URL] Information about this update]
</notification>
<notification
icon="alertmodal.tga"
name="OtherChannelRequiredUpdateDownloadedVerboseDialog"
type="alertmodal">
icon="alertmodal.tga"
name="OtherChannelRequiredUpdateDownloadedVerboseDialog"
type="alertmodal"
force_urls_external="true">
We have downloaded a required software update.
Version [VERSION]
This experimental viewer has been replaced by a [NEW_CHANNEL] viewer;
@ -4053,9 +4056,10 @@ We must restart [APP_NAME] to install the update.
</notification>
<notification
icon="alertmodal.tga"
name="OtherChannelRequiredUpdateDownloadedDialog"
type="alertmodal">
icon="alertmodal.tga"
name="OtherChannelRequiredUpdateDownloadedDialog"
type="alertmodal"
force_urls_external="true">
We must restart [APP_NAME] to install the update.
This experimental viewer has been replaced by a [NEW_CHANNEL] viewer;
see [[INFO_URL] Information about this update]
@ -6248,6 +6252,18 @@ Are you sure you want to permanently delete the contents of your Trash?
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="TrashIsFull"
type="alertmodal">
Your trash is overflowing. This may cause problems logging in.
<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="I will empty trash later"
yestext="Empty trash now"/>
</notification>
<notification
icon="alertmodal.tga"
name="ConfirmClearBrowserCache"

View File

@ -27,7 +27,7 @@
top="0"
visible="false"
width="320" />
<icon
<group_icon
height="20"
image_name="Generic_Group"
name="group_icon"

View File

@ -27,7 +27,7 @@
name="header"
top="0"
width="305">
<icon
<group_icon
follows="all"
height="20"
layout="topleft"

View File

@ -547,6 +547,20 @@
(Avatar look at target settings are on the Privacy tab.)
</text>
<check_box
top_pad="10"
enabled="false"
follows="left|top"
height="16"
label="Disable random avatar eye moments"
left="15"
name="FSStaticEyes"
width="250"
control_name="FSStaticEyes">
<check_box.commit_callback
function="Pref.StaticEyes" />
</check_box>
<!-- LGG Color Beams -->
<text
name="BeamPrefs"
@ -769,7 +783,7 @@
<text
type="string"
left="5"
top_pad="90"
top_pad="65"
length="1"
follows="left|top"
height="12"

View File

@ -109,6 +109,9 @@
<floater.string name="E_ST_BAD_ROOT">
ルートジョイント名が不正です。「hip」を使用してください。
</floater.string>
<floater.string name="FS_report_frames">
[F] フレーム [S] 秒 [FPS] FPS
</floater.string>
<text name="name_label">
名前:
</text>
@ -117,8 +120,13 @@
</text>
<spinner label="優先度" name="priority" tool_tip="このアニメーションでどのアニメーションを上書きできるかを決めます"/>
<check_box label="ループ" name="loop_check" tool_tip="このアニメーションをループ再生にします"/>
<text name="frames_label">
300 フレーム 30 秒 10 FPS
</text>
<spinner label="イン(%)" name="loop_in_point" tool_tip="アニメーションのループ復帰点を設定します"/>
<spinner label="アウト(%)" name="loop_out_point" tool_tip="アニメーションのループ終了点を設定します"/>
<spinner label="イン (frm)" name="loop_in_frames" tool_tip="アニメーションがループして戻る、開始フレームを設定します" />
<spinner label="アウト (frm)" name="loop_out_frames" tool_tip="アニメーションのループが終了する、終点フレームを設定します" />
<text name="hand_label">
手のポーズ
</text>

View File

@ -3,6 +3,7 @@
<scroll_list name="animation_list">
<scroll_list.column label="再生した人" name="played_by" />
<scroll_list.column label="優先度" name="priority" />
<scroll_list.column label="再生時間" name="played" />
<scroll_list.column label="時刻" name="timestamp" />
<scroll_list.column label="アニメーションID" name="animation_id" />

View File

@ -65,6 +65,9 @@
<check_box name="filter_temporary" label="臨時" />
<check_box name="filter_attachment" label="アタッチメント" />
<check_box name="filter_moap" label="共有メディア" />
<check_box name="filter_perm_copy" label="コピー" />
<check_box name="filter_perm_modify" label="修正" />
<check_box name="filter_perm_transfer" label="再販・プレゼント" />
<check_box name="filter_for_sale" label="次の価格帯で販売" />
<spinner name="min_price" />
<text name="and">
@ -92,6 +95,7 @@
</text>
<spinner name="max_distance" />
<check_box name="filter_agent_parcel_only" label="今いる区画のみ" />
<text name="only_list">
次の条件のオブジェクトを除外:
</text>

View File

@ -55,6 +55,10 @@
<layout_panel name="send_sysinfo_btn_panel">
<button tool_tip="システム情報を送ります。" name="send_sysinfo_btn" />
</layout_panel>
<layout_panel name="lp_options_btn">
<menu_button tool_tip="チャット・オプション" name="chat_options_btn" />
</layout_panel>
<layout_panel name="support_panel" width="130">
<icon name="dummy_icon_support_group" width="128"/>
@ -82,6 +86,9 @@
<layout_panel name="input_editor_layout_panel">
<chat_editor name="chat_editor" />
</layout_panel>
<layout_panel name="input_button_layout_panel">
<button name="send_chat" label="送信" tool_tip="IMを送信します" />
</layout_panel>
</layout_stack>
</layout_panel>
</layout_stack>

View File

@ -5,6 +5,9 @@
<name_list.columns name="name" label="名前" />
<name_list.columns name="amount" label="金額" />
</name_list>
<text name="summary">
支払い L$ [PAID] - 受け取り L$ [RECEIVED]
</text>
<check_box label="閉じている時も記録" name="FSAlwaysTrackPayments" tool_tip="入金記録のウィンドウが閉じている場合でも、常に入金を記録するようにします。" />
<button name="Clear" label="クリア" />
</floater>

View File

@ -14,7 +14,10 @@
<layout_panel name="lp_chat_history_muted_btn">
<button tool_tip="周辺チャット履歴に無視した会話を表示します。" name="chat_history_muted_btn" />
</layout_panel>
<layout_panel name="lp_options_btn">
<menu_button tool_tip="チャット・オプション" name="chat_options_btn"/>
</layout_panel>
</layout_stack>
<layout_stack name="ls_chat">

View File

@ -12,26 +12,36 @@
<floater.string name="group_notices_tab_title">
グループ ([COUNT])
</floater.string>
<string name="title_notification_tabbed_window">
通知
</string>
<layout_stack name="TabButtonsStack">
<layout_panel name="TabButtonsLayoutPanel">
<tab_container name="notifications_tab_container">
<panel label="システム (0)" name="system_notification_list_tab"/>
<panel label="取引 (0)" name="transaction_notifications_tab"/>
<panel label="招待 (0)" name="group_invite_notifications_tab"/>
<panel label="グループ (0)" name="group_notice_notifications_tab"/>
<panel label="システム (0)" name="system_notification_list_tab">
<notification_list_view name="system_notification_list" />
</panel>
<panel label="取引 (0)" name="transaction_notifications_tab">
<notification_list_view name="transaction_notification_list" />
</panel>
<panel label="招待 (0)" name="group_invite_notifications_tab">
<notification_list_view name="group_invite_notification_list" />
</panel>
<panel label="グループ (0)" name="group_notice_notifications_tab">
<notification_list_view name="group_notice_notification_list" />
</panel>
</tab_container>
<layout_stack name="ButtonsStack">
<layout_panel name="CondenseAllButtonPanel">
<button label="全て折り畳む" name="collapse_all_button"/>
<layout_stack name="ButtonsStack">
<layout_panel name="CondenseAllButtonPanel" auto_resize="false">
<button label="全てたたむ" name="collapse_all_button" />
</layout_panel>
<layout_panel name="GapLayoutPanel">
<panel label="ギャップパネル" name="GapPanel"/>
<panel label="Gap Panel" name="GapPanel">
</panel>
</layout_panel>
<layout_panel name="DeleteAllButtonPanel">
<button label="全て削除" name="delete_all_button"/>
<button label="全て削除" name="delete_all_button" />
</layout_panel>
</layout_stack>
</layout_panel>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container">
<floater title="キー選択" name="modal container">
<button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
<text name="Save item as:">
キーを押してスピーカーボタンのトリガーを設定します。

View File

@ -215,6 +215,8 @@
<combo_box.item label="中身" name="Contents"/>
<combo_box.item label="オリジナル" name="Original"/>
</combo_box>
<button label="適用" name="button mark for sale" tool_tip="販売対象のチェックに対する変更を有効にします" />
<button label="キーをコピー" name="btnCopyKeys" tool_tip="選択されているオブジェクトのルートのキーをクリップボードにコピーします。シフトを押しながらクリックすると選択されている全てのオブジェクトのキーをコピーします。" />
<check_box label="検索に表示" name="search_check" tool_tip="検索結果にこのオブジェクトを表示します"/>
<panel name="perms_build">
<text name="perm_modify">

View File

@ -13,6 +13,6 @@
次の利用規約とプライバシーポリシーをよくお読みください。 [CURRENT_GRID] へのログインを続けるには、規約に同意する必要があります。
</text>
<text name="external_tos_required">
操作を続けるには、my.secondlife.com に移動して、ログインし、利用規約を承諾する必要があります。ありがとうございました
この先に進むには、my.secondlife.com にログインして利用規約Terms of Serviceに同意する必要があります。ご了承下さい
</text>
</floater>

View File

@ -7,6 +7,7 @@
<menu_item_call label="プロフィールの表示" name="view_profile" />
<menu_item_call label="IM" name="im" />
<menu_item_call label="テレポートを送る" name="offer_teleport" />
<menu_item_call label="テレポートを要求" name="request_teleport">
<menu_item_call label="コール" name="voice_call" />
<menu_item_call label="チャット履歴..." name="chat_history" />
<menu_item_call label="フレンド登録" name="add_friend" />

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<toggleable_menu name="Chat Options Menu">
<menu_item_check label="レーダーを表示..." name="nearby_people" />
<menu_item_check label="近くのボイスを表示..." name="nearby_voice" />
<menu_item_check label="ブロックリストを表示..." name="block_list" />
<menu_item_separator/>
<menu_item_check label="V1 形式のチャットヘッダを使用" name="plain_text_chat_history" />
<context_menu label="フォントサイズ..." name="font_size">
<menu_item_check label="小" name="font_size_small" />
<menu_item_check label="中" name="font_size_medium" />
<menu_item_check label="大" name="font_size_large" />
<menu_item_check label="特大" name="font_size_huge" />
</context_menu>
<menu_item_separator/>
<menu_item_check label="相手が入力中であることを示す角かっこ(>)を追加" name="typing_chevron" />
<menu_item_check label="新規メッセージ通知を表示" name="new_message_notification" />
<menu_item_check label="チャットバーを表示" name="show_chat_bar" />
<menu_item_check label="チャンネル選択を表示" name="show_channel_selection" />
<menu_item_check label="チャットの入力/送信ボタンを表示" name="show_send_button" />
<menu_item_check label="IMに送信ボタンを表示" name="show_im_send_button" />
</toggleable_menu>

View File

@ -26,5 +26,9 @@
<menu_item_separator/>
<menu_item_check label="フルネームはユーザ名 (表示名)" name="format_username_displayname" />
<menu_item_check label="フルネームは表示名 (ユーザ名)" name="format_displayname_username" />
<menu_item_separator/>
<menu_item_check label="検索フィルターを表示" name="friend_filter" />
</menu>
<menu_item_separator/>
<menu_item_check label="フレンドのログイン状態" name="GlobalOnlineStatusToggle" />
</context_menu>

View File

@ -16,5 +16,9 @@
<menu_item_separator/>
<menu_item_check label="フルネームはユーザ名 (表示名)" name="format_username_displayname" />
<menu_item_check label="フルネームは表示名 (ユーザ名)" name="format_displayname_username" />
<menu_item_separator/>
<menu_item_check label="検索フィルターを表示" name="friend_filter" />
</menu>
<menu_item_separator/>
<menu_item_check label="フレンドのログイン状態" name="GlobalOnlineStatusToggle" />
</context_menu>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<toggleable_menu name="menu_teleport">
<menu_item_call label="テレポートを送る" name="offer_tp" />
<menu_item_call label="テレポートを要求" name="request_tp" />
</toggleable_menu>

View File

@ -2,14 +2,27 @@
<context_menu name="Avatar Context Menu">
<menu_item_call label="プロフィールの表示" name="View Profile" />
<menu_item_call label="フレンド登録" name="Add Friend" />
<menu_item_call label="連絡先セットに追加" name="Add to Set" />
<menu_item_call label="フレンドを削除" name="Remove Friend" />
<menu_item_call label="IM" name="IM" />
<menu_item_call label="コール" name="Call" />
<menu_item_call label="世界地図" name="Map" />
<menu_item_call label="追跡する" name="Track" />
<menu name="MarkAvatar" label="マーク...">
<menu_item_call label="赤" name="MarkRed" />
<menu_item_call label="緑" name="MarkGreen" />
<menu_item_call label="青" name="MarkBlue" />
<menu_item_call label="紫" name="MarkPurple" />
<menu_item_call label="黄" name="MarkYellow" />
<menu_item_separator/>
<menu_item_call label="マークをクリア" name="Clear Mark" />
<menu_item_separator/>
<menu_item_call label="全てのマークをクリア" name="Clear Marks" />
</menu>
<menu_item_call label="共有" name="Share" />
<menu_item_call label="支払う" name="Pay" />
<menu_item_call label="テレポートを送る" name="teleport" />
<menu_item_call label="テレポートを要求" name="request_teleport" />
<menu_item_call label="テレポートする" name="teleport_to" />
<menu_item_call label="ズームイン" name="zoom_in" />
<menu_item_call label="グループに招待" name="GroupInvite" />

View File

@ -78,6 +78,7 @@
<menu_item_separator/>
<menu_item_check label="テレポートのオファーや依頼を拒否する" name="Automatically reject teleport offers" />
<menu_item_check label="グループ招待を全て拒否" name="Reject all group invites" />
<menu_item_check label="フレンド申請を全て拒否" name="Reject all friendship requests" />
</menu>
<menu_item_call label="フレンド" name="My Friends"/>
<menu_item_check label="連絡先" name="Contacts"/>
@ -267,8 +268,10 @@
<menu_item_check label="権限の詳細を表示する" name="DebugPermissions"/>
<menu_item_check label="私のオブジェクトだけを選択する" name="Select Only My Objects"/>
<menu_item_check label="動的オブジェクトだけを選択する" name="Select Only Movable Objects"/>
<menu_item_check label="ロックされたオブジェクトだけを選択する" name="Select Only Locked Objects" />
<menu_item_check label="コピー可のオブジェクトだけを選択する" name="Select Only Copyable Objects" />
<menu_item_check label="範囲内を選択する" name="Select By Surrounding"/>
<menu_item_check label="グループ所有のオブジェクトを含める" name="Include Group-Owned Objects" />
<menu_item_check label="選択外形を表示" name="Show Selection Outlines"/>
<menu_item_check label="隠れた位置の選択も表示する" name="Show Hidden Selection"/>
<menu_item_check label="選択した光の半径範囲を表示する" name="Show Light Radius for Selection"/>
@ -406,7 +409,6 @@
<menu_item_check label="マウスの平滑化" name="Mouse Smoothing"/>
<menu_item_call label="キーをリリース" name="Release Keys"/>
<menu label="ショートカット" name="Shortcuts">
<menu_item_call label="画像 [COST] ..." name="Upload Image"/>
<menu_item_check label="検索" name="Search"/>
<!-- This second, alternative shortcut for Show Advanced Menu is for backward compatibility. The main shortcut has been changed so it's Linux-friendly, where the old shortcut is typically eaten by the window manager. -->
@ -574,6 +576,7 @@
<menu_item_call label="メディアブラウザのテスト" name="Web Browser Test"/>
<menu_item_check label="地域再起動のテスト..." name="Region Restart Test" />
<menu_item_call label="Web コンテンツブラウザ" name="Web Content Browser"/>
<menu_item_call label="FB 接続テスト" name="FB Connect Test" />
<menu_item_call label="SelectMgr をダンプ" name="Dump SelectMgr"/>
<menu_item_call label="持ち物の出力" name="Dump Inventory"/>
<menu_item_call label="タイマーをダンプ" name="Dump Timers"/>

View File

@ -330,6 +330,14 @@
[COUNT] 名のメンバーをグループから追放しようとしています。
<usetemplate ignoretext="グループからの複数のメンバーの追放を確認します" name="okcancelignore" notext="取り消し" yestext="追放"/>
</notification>
<notification name="BanGroupMemberWarning">
[AVATAR_NAME] をグループ出入禁止にしようとしています。
<usetemplate ignoretext="参加者をグループ出入り禁止にするか確認します" name="okcancelignore" notext="取り消し" yestext="出入禁止"/>
</notification>
<notification name="BanGroupMembersWarning">
[COUNT] 名のメンバーをグループ出入禁止にしようとしています。
<usetemplate ignoretext="複数のメンバーのグループ出入禁止を確認します" name="okcancelignore" notext="取り消し" yestext="出入禁止"/>
</notification>
<notification name="AttachmentDrop">
アタッチメントを下に置こうとしています。
続けますか?
@ -491,6 +499,9 @@ L$ が不足しているのでこのグループに参加することができ
<notification name="CannotWearInfoNotComplete">
まだ読み込まれていないため、そのアイテムを装着できません。後でやり直してください。
</notification>
<notification name="MustEnterPasswordToLogIn">
ログインするにはパスワードを入力して下さい。
</notification>
<notification name="MustHaveAccountToLogIn">
注意:記入漏れの箇所があります。
アバターのユーザー名を入力してください。
@ -628,6 +639,10 @@ L$ が不足しているのでこのグループに参加することができ
<notification name="CannotDownloadFile">
ファイルをダウンロードできません。
</notification>
<notification name="MediaFileDownloadUnsupported">
ファイルのダウンロードが要求されましたが、このファイルは [APP_NAME] で扱うことができません。
<usetemplate ignoretext="未対応のファイルダウンロードに対する警告です" name="okignore" yestext="OK"/>
</notification>
<notification name="CannotWriteFile">
ファイル [[FILE]] を書き込めません。
</notification>
@ -726,7 +741,7 @@ L$ が不足しているのでこのグループに参加することができ
あなたの土地から [AVATAR_NAME] を追放しますか?
<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="追放と禁止" yestext="追放"/>
</notification>
<notification name="EjectAvatarNoBan">
<notification name="EjectAvatarNo">
このアバターをあなたの土地から追放しますか?
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="追放"/>
</notification>
@ -1517,6 +1532,10 @@ SHA1 フィンガープリント: [MD5_DIGEST]
操作を続行しますか?
<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
</notification>
<notification name="ConfirmTextureHeights">
仰角範囲に対して、高い方の値よりも大きな数値を低い方の値に適用しようとしています。このまま進めてよろしいですか?
<usetemplate name="yesnocancelbuttons" yestext="OK" notext="取り消し" canceltext="確認しない"/>
</notification>
<notification name="MaxAllowedAgentOnRegion">
許可住人は [MAX_AGENTS] 人までです。
</notification>
@ -1679,6 +1698,28 @@ http://secondlife.com/download から最新バージョンをダウンロード
[[INFO_URL] このアップデートに関する情報] を参照
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="UpdateDownloadInProgress">
新しいアップデートがあります。
現在バックグラウンドでダウンロード中で、準備が出来次第、インストールを完了させるためにビューワを再起動するようメッセージが表示されます。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="UpdateDownloadComplete">
新しいアップデートのダウンロードが完了しました。インストールするには再起動して下さい。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="UpdateCheckError">
アップデートの確認中にエラーが発生しました。
後ほどやり直してみて下さい。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="UpdateViewerUpToDate">
ご利用のビューワは最新バージョンです!
最新の機能や改修を今すぐ試してみたいという方は、代替ビューワのページをチェックしてみて下さい。 http://wiki.secondlife.com/wiki/Linden_Lab_Official:Alternate_Viewers.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="DeedObjectToGroup">
このオブジェクトを譲渡するとグループは以下のことが可能です:
* オブジェクトに支払われた L$ を受領します。
@ -1726,6 +1767,11 @@ http://secondlife.com/download から最新バージョンをダウンロード
</notification>
<notification name="GroupLeaveConfirmMember">
現在、あなたは &lt;nolink&gt;[GROUP]&lt;/nolink&gt; グループのメンバーです。
グループから脱退しますか?
<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMemberWithFee">
現在、あなたは &lt;nolink&gt;[GROUP]&lt;/nolink&gt; グループのメンバーです。再度入会する場合は L$[AMOUNT] の費用がかかります。
グループから脱退しますか?
<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
</notification>
@ -1793,6 +1839,11 @@ http://secondlife.com/download から最新バージョンをダウンロード
変更したい場合は「コミュニケーション」メニューの「ログイン状態」から行って下さい。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RejectFriendshipRequestsModeSet">
全てのフレンド申請を拒否するモードが有効になっています。
誰が発信するものでもフレンド申請は全て拒否され、あなたが設定した自動応答メッセージが送信されます。このため、申請があっても通知はされません。
<usetemplate ignoretext="「フレンド申請をすべて拒否」モードにログイン状態を変更する" name="okignore" yestext="OK"/>
</notification>
<notification name="RejectAllGroupInvitesModeSet">
「グループ招待をすべて拒否」モードになっています。
誰が発信するものでも、グループ招待はすべて自動的に拒否されます。このため、招待があっても通知はされません。
@ -2449,6 +2500,15 @@ Linden Lab
ビューワのキャッシュをクリアしますか?
<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
</notification>
<notification name="ConfirmClearInventoryCache">
本当にインベントリのキャッシュをクリアしてもよろしいですか?
<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
</notification>
<notification name="ConfirmClearWebBrowserCache">
本当にWebブラウザのキャッシュをクリアしてもよろしいですか再起動が必要
<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
</notification>
<notification name="ConfirmClearCookies">
本当にクッキーをクリアしますか?
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="はい"/>
@ -3435,6 +3495,13 @@ M キーを押して変更します。
<notification name="AttachmentSaved">
アタッチメントが保存されました。
</notification>
<notification name="AppearanceToXMLSaved">
容姿はXMLファイルとして [PATH] に保存されました
</notification>
<notification name="AppearanceToXMLFailed">
容姿のXMLファイルへの保存が失敗しました
</notification>
<notification name="UnableToFindHelpTopic">
ヘルプトピックが見つかりませんでした。
</notification>
@ -4584,6 +4651,69 @@ M キーを押して変更します。
「[SET]」を「[NEW_NAME]」に変更できませんでした。既に同じ名前が存在しているか、無効な名前を指定しようとしています。
</notification>
<notification name="ShapeImportGenericFail">
[FILENAME] のインポートで問題が発生しました。詳細はログで確認して下さい。
</notification>
<notification name="ShapeImportVersionFail">
シェイプのインポートに失敗しました。[FILENAME] が本当にアバターのファイルか確認して下さい。
</notification>
<notification name="AddToMediaList">
[LIST] に追加するドメインネームを入力して下さい
<form name="form">
<button name="Add" text="追加"/>
<button name="Cancel" text="取り消し"/>
</form>
</notification>
<!-- <FS:Zi> Do not allow "Restore To Last Position" for no-copy items -->
<notification name="CantRestoreToWorldNoCopy">
最後の場所にリストアの機能はコピー不可アイテムには使用できません。コンテンツが失われるのを防ぐためです。
</notification>
<!-- <FS:Zi> Do not allow "Restore To Last Position" for no-copy items -->
<notification name="ConfirmRemoveCredential">
保存された &lt;nolink&gt;[NAME]&lt;/nolink&gt; のログインを削除しますか?
<form name="form">
<button name="OK" text="OK"/>
<button name="Cancel" text="取り消し"/>
</form>
</notification>
<!-- <FS:TS> FIRE-5453: Flickr upload support (from Exodus) -->
<notification name="ExodusFlickrVerificationExplanation">
Flickr アップロードの機能を使用するには、 [APP_NAME] があなたのFlickrアカウントにアクセスするのを許可しなければなりません。このまま先に進むと、WebブラウザーがFlickrのWebサイトを開き、ログインして [APP_NAME] を許可するよう促されます。次に表示されたコードをコピーして [APP_NAME] に貼り付けます。
あなたのFlickrアカウントに投稿するのに [APP_NAME] を許可しますか?
<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
</notification>
<notification name="ExodusFlickrVerificationPrompt">
WebブラウザーであなたのFlickrアカウントに投稿する許可を [APP_NAME] に与えて下さい。次にWebサイトで表示されたコードを以下に入力して下さい。
<form name="form">
<button name="OK" text="OK"/>
<button name="Cancel" text="取り消し"/>
</form>
</notification>
<notification name="ExodusFlickrVerificationFailed">
Flickrの認証に失敗しました。もう一度試してみて下さい。その際、認証コードに誤りがないか、よく確認して下さい。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ExodusFlickrUploadComplete">
あなたのスナップショットは次のURLでみることができるようになりました。 [http://www.flickr.com/photos/upload/edit/?ids=[ID] here]
</notification>
<!-- </FS:TS> FIRE-5453 -->
<notification name="RegionTrackerAdd">
次の地域にどのようなラベルをつけますか?
&quot;[REGION]&quot;
<form name="form">
<button name="OK" text="OK"/>
<button name="Cancel" text="取り消し"/>
</form>
</notification>
<notification name="SnoozeDuration">
<unique/>
グループチャットを居眠りさせておく時間(秒)
@ -4611,4 +4741,8 @@ M キーを押して変更します。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="GlobalOnlineStatusToggle">
サーバ負荷のため、多数のオンラインステータス切替が有効になるまでにはしばらく時間がかかります。このままお待ち下さい。
<usetemplate ignoretext="オンラインステータスの切り替えに時間がかかる時は通知する" name="okignore" yestext="OK"/>
</notification>
</notifications>

View File

@ -2,12 +2,13 @@
<panel name="friends">
<layout_stack name="ls_friend_list">
<layout_panel name="lp_search">
<filter_editor label="Filter Friends" name="friend_filter_input"/>
<filter_editor label="フレンドをフィルター" name="friend_filter_input"/>
</layout_panel>
<layout_panel name="lp_friend_list">
<fs_scroll_list name="friend_list">
<fs_scroll_list.column name="icon_online_status" tool_tip="オンライン・ステータス" />
<fs_scroll_list.column label="ユーザー名" name="user_name" tool_tip="この連絡先のユーザー名です。" />
<fs_scroll_list.column label="表示名" name="display_name" tool_tip="この連絡先の表示名です。" />
<fs_scroll_list.column label="名前" name="full_name" tool_tip="この連絡先が選択した名前の表示です。" />
<fs_scroll_list.column name="icon_visible_online" tool_tip="フレンドは、あなたがオンラインかどうか確認することができます。" />
<fs_scroll_list.column name="icon_visible_map" tool_tip="フレンドは、地図であなたの居場所を見つけることができます。" />

View File

@ -0,0 +1,114 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- All our XML is utf-8 encoded. -->
<panel name="main_panel" title="panel_notification_list_item">
<!-- background_opaque="false" -->
<!-- background_visible="true"> -->
<!-- bg_alpha_color="PanelNotificationListItem"> -->
<panel.string name="sender_resident_text">
送信者; "[SENDER_RESIDENT]"
</panel.string>
<panel.string name="group_name_text">
グループ: "[GROUP_NAME]"
</panel.string>
<panel.string name="group_fee_text">
費用: [GROUP_FEE]
</panel.string>
<panel.string name="item_condensed_height">
50
</panel.string>
<panel.string name="item_expanded_height">
87
</panel.string>
<panel.string name="expanded_height_resize_for_attachment">
27
</panel.string>
<panel name="panel_total_view">
<layout_stack name="item_vertical_stack">
<layout_panel name="layout_panel_condensed_view">
<panel name="panel_condensed_view">
<layout_stack name="horizontal_stack">
<layout_panel name="layout_panel_right">
<group_icon name="group_icon" tool_tip="グループ" />
<avatar_icon name="avatar_icon" tool_tip="アバター" />
<icon name="system_notification_icon" tool_tip="アイコン" />
</layout_panel>
<layout_panel name="layout_panel_middle">
<panel name="main_info_panel">
<panel name="notification_title_panel">
<text name="notification_title" >
Group Name:Notice Title N o t i c e T i t l e N o t i c e T i t l e N o t i c e T i t l e N oticeTitle
</text>
<icon name="attachment_icon" tool_tip="添付" />
</panel>
<panel name="sender_time_panel">
<text name="sender_or_fee_box">
Sender: "Resident R e s i d e n t R e s i d e n t"
</text>
<text name="notification_time" />
</panel>
</panel>
</layout_panel>
<layout_panel name="layout_panel_right">
<panel name="close_expand_panel">
<button name="close_btn" />
<button name="expand_btn" />
</panel>
</layout_panel>
</layout_stack>
</panel>
</layout_panel>
<layout_panel name="layout_panel_expanded_view">
<panel name="panel_expanded_view">
<layout_stack name="horizontal_stack">
<layout_panel name="layout_panel_right_exp">
<group_icon name="group_icon_exp" tool_tip="グループ" />
<avatar_icon name="avatar_icon_exp" tool_tip="アバター" />
<icon name="system_notification_icon_exp" tool_tip="アイコン" />
<icon name="attachment_icon_exp" tool_tip="添付" />
</layout_panel>
<layout_panel name="layout_panel_middle_exp">
<panel name="main_info_panel_expanded">
<panel name="notification_title_panel_exp" >
<text name="notification_title_exp">
Notice Title Notice Title N o t i c e T i t l e N o t i c e T i t l e
</text>
<text name="group_name_exp">
Group Name Group Name Group Na m e e
</text>
</panel>
<panel name="sender_time_panel_exp">
<text name="sender_or_fee_box_exp">
Sender: "Resident R e s i d e n t R e s i d e n t"
</text>
<text name="notification_time_exp"value="2014/12/24 23:30" />
</panel>
<panel name="notification_text_panel_exp">
<chat_editor name="notification_text_exp">
Notice text goes here b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla. bla bla bla bla bla bla bla bla bla bla bla bla bla .
</chat_editor>
</panel>
<panel name="attachment_panel">
<text name="attachment_text">
Attachment goes here b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a b l a bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla. bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla .
</text>
</panel>
<panel name="button_panel">
<button name="join_btn" label = "参加"/>
<button name="decline_btn" label = "拒否"/>
<button name="info_btn" label = "情報"/>
</panel>
</panel>
</layout_panel>
<layout_panel name="layout_panel_left_exp">
<panel name="close_expand_panel_exp">
<button name="close_expanded_btn" />
<button name="condense_btn" />
</panel>
</layout_panel>
</layout_stack>
</panel>
</layout_panel>
</layout_stack>
</panel>
</panel>

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="もの" name="Outfits">
<panel.string name="wear_outfit_tooltip">
選択したアウトフィットを着用する
@ -6,6 +6,9 @@
<panel.string name="wear_items_tooltip">
選択したアイテムを着用
</panel.string>
<panel.string name="cof_tab_label">
装着中 ([COUNT]/[MAX])
</panel.string>
<tab_container name="appearance_tabs">
<panel label="マイ アウトフィット" name="outfitslist_tab"/>
<panel label="着用中" name="cof_tab"/>

Some files were not shown because too many files have changed in this diff Show More