Merge with viewer-development

master
Bryan O'Sullivan 2010-11-17 13:25:32 -08:00
commit 3a36ed079c
16 changed files with 488 additions and 53 deletions

View File

@ -767,6 +767,8 @@ WolfPup Lowenhar
STORM-102
STORM-103
STORM-143
STORM-535
STORM-544
VWR-20741
VWR-20933
Zai Lynch

View File

@ -442,6 +442,14 @@
<boolean>true</boolean>
</map>
<key>SimConsoleResponse</key>
<map>
<key>flavor</key>
<string>llsd</string>
<key>trusted-sender</key>
<boolean>true</boolean>
</map>
<key>DirLandReply</key>
<map>
<key>flavor</key>

View File

@ -7,8 +7,9 @@ macro (check_message_template _target)
TARGET ${_target}
POST_BUILD
COMMAND ${PYTHON_EXECUTABLE}
ARGS ${SCRIPTS_DIR}/template_verifier.py
--mode=development --cache_master
COMMENT "Verifying message template"
ARGS ${SCRIPTS_DIR}/md5check.py
3f19d130400c547de36278a6b6f9b028
${SCRIPTS_DIR}/messages/message_template.msg
COMMENT "Verifying message template - See http://wiki.secondlife.com/wiki/Template_verifier.py"
)
endmacro (check_message_template)

View File

@ -1304,7 +1304,7 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask)
// handle ctrl-uparrow if we have a history enabled line editor.
case KEY_UP:
if( mHaveHistory && ( MASK_CONTROL == mask ) )
if( mHaveHistory && ((mIgnoreArrowKeys == false) || ( MASK_CONTROL == mask )) )
{
if( mCurrentHistoryLine > mLineHistory.begin() )
{
@ -1319,9 +1319,9 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask)
}
break;
// handle ctrl-downarrow if we have a history enabled line editor
// handle [ctrl]-downarrow if we have a history enabled line editor
case KEY_DOWN:
if( mHaveHistory && ( MASK_CONTROL == mask ) )
if( mHaveHistory && ((mIgnoreArrowKeys == false) || ( MASK_CONTROL == mask )) )
{
if( !mLineHistory.empty() && mCurrentHistoryLine < mLineHistory.end() - 1 )
{

View File

@ -1591,7 +1591,10 @@ void LLTextBase::setText(const LLStringExplicit &utf8str, const LLStyle::Params&
// appendText modifies mCursorPos...
appendText(text, false, input_params);
// ...so move cursor to top after appending text
startOfDoc();
if (!mTrackEnd)
{
startOfDoc();
}
onValueChange(0, getLength());
}

View File

@ -201,6 +201,7 @@ set(viewer_SOURCE_FILES
llfloaterpostprocess.cpp
llfloaterpreference.cpp
llfloaterproperties.cpp
llfloaterregiondebugconsole.cpp
llfloaterregioninfo.cpp
llfloaterreporter.cpp
llfloaterscriptdebug.cpp
@ -733,6 +734,7 @@ set(viewer_HEADER_FILES
llfloaterpostprocess.h
llfloaterpreference.h
llfloaterproperties.h
llfloaterregiondebugconsole.h
llfloaterregioninfo.h
llfloaterreporter.h
llfloaterscriptdebug.h

View File

@ -0,0 +1,227 @@
/**
* @file llfloaterregiondebugconsole.h
* @author Brad Kittenbrink <brad@lindenlab.com>
* @brief Quick and dirty console for region debug settings
*
* $LicenseInfo:firstyear=2010&license=viewergpl$
*
* Copyright (c) 2010-2010, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llfloaterregiondebugconsole.h"
#include "llagent.h"
#include "llhttpclient.h"
#include "llhttpnode.h"
#include "lllineeditor.h"
#include "lltexteditor.h"
#include "llviewerregion.h"
// Two versions of the sim console API are supported.
//
// SimConsole capability (deprecated):
// This is the initial implementation that is supported by some versions of the
// simulator. It is simple and straight forward, just POST a command and the
// body of the response has the result. This API is deprecated because it
// doesn't allow the sim to use any asynchronous API.
//
// SimConsoleAsync capability:
// This capability replaces the original SimConsole capability. It is similar
// in that the command is POSTed to the SimConsoleAsync cap, but the response
// comes in through the event poll, which gives the simulator more flexibility
// and allows it to perform complex operations without blocking any frames.
//
// We will assume the SimConsoleAsync capability is available, and fall back to
// the SimConsole cap if it is not. The simulator will only support one or the
// other.
namespace
{
// Signal used to notify the floater of responses from the asynchronous
// API.
typedef boost::signals2::signal<
void (const std::string& output)> console_reply_signal_t;
console_reply_signal_t sConsoleReplySignal;
const std::string PROMPT("\n\n> ");
const std::string UNABLE_TO_SEND_COMMAND(
"ERROR: The last command was not received by the server.");
const std::string CONSOLE_UNAVAILABLE(
"ERROR: No console available for this region/simulator.");
const std::string CONSOLE_NOT_SUPPORTED(
"This region does not support the simulator console.");
// This responder handles the initial response. Unless error() is called
// we assume that the simulator has received our request. Error will be
// called if this request times out.
class AsyncConsoleResponder : public LLHTTPClient::Responder
{
public:
/* virtual */
void error(U32 status, const std::string& reason)
{
sConsoleReplySignal(UNABLE_TO_SEND_COMMAND);
}
};
class ConsoleResponder : public LLHTTPClient::Responder
{
public:
ConsoleResponder(LLTextEditor *output) : mOutput(output)
{
}
/*virtual*/
void error(U32 status, const std::string& reason)
{
if (mOutput)
{
mOutput->appendText(
UNABLE_TO_SEND_COMMAND + PROMPT,
false);
}
}
/*virtual*/
void result(const LLSD& content)
{
if (mOutput)
{
mOutput->appendText(
content.asString() + PROMPT, false);
}
}
LLTextEditor * mOutput;
};
// This handles responses for console commands sent via the asynchronous
// API.
class ConsoleResponseNode : public LLHTTPNode
{
public:
/* virtual */
void post(
LLHTTPNode::ResponsePtr reponse,
const LLSD& context,
const LLSD& input) const
{
llinfos << "Received response from the debug console: "
<< input << llendl;
sConsoleReplySignal(input["body"].asString());
}
};
}
LLFloaterRegionDebugConsole::LLFloaterRegionDebugConsole(LLSD const & key)
: LLFloater(key), mOutput(NULL)
{
mReplySignalConnection = sConsoleReplySignal.connect(
boost::bind(
&LLFloaterRegionDebugConsole::onReplyReceived,
this,
_1));
}
LLFloaterRegionDebugConsole::~LLFloaterRegionDebugConsole()
{
mReplySignalConnection.disconnect();
}
BOOL LLFloaterRegionDebugConsole::postBuild()
{
LLLineEditor* input = getChild<LLLineEditor>("region_debug_console_input");
input->setEnableLineHistory(true);
input->setCommitCallback(boost::bind(&LLFloaterRegionDebugConsole::onInput, this, _1, _2));
input->setFocus(true);
input->setCommitOnFocusLost(false);
mOutput = getChild<LLTextEditor>("region_debug_console_output");
std::string url = gAgent.getRegion()->getCapability("SimConsoleAsync");
if (url.empty())
{
// Fall back to see if the old API is supported.
url = gAgent.getRegion()->getCapability("SimConsole");
if (url.empty())
{
mOutput->appendText(
CONSOLE_NOT_SUPPORTED + PROMPT,
false);
return TRUE;
}
}
mOutput->appendText("> ", false);
return TRUE;
}
void LLFloaterRegionDebugConsole::onInput(LLUICtrl* ctrl, const LLSD& param)
{
LLLineEditor* input = static_cast<LLLineEditor*>(ctrl);
std::string text = input->getText() + "\n";
std::string url = gAgent.getRegion()->getCapability("SimConsoleAsync");
if (url.empty())
{
// Fall back to the old API
url = gAgent.getRegion()->getCapability("SimConsole");
if (url.empty())
{
text += CONSOLE_UNAVAILABLE + PROMPT;
}
else
{
// Using SimConsole (deprecated)
LLHTTPClient::post(
url,
LLSD(input->getText()),
new ConsoleResponder(mOutput));
}
}
else
{
// Using SimConsoleAsync
LLHTTPClient::post(
url,
LLSD(input->getText()),
new AsyncConsoleResponder);
}
mOutput->appendText(text, false);
input->clear();
}
void LLFloaterRegionDebugConsole::onReplyReceived(const std::string& output)
{
mOutput->appendText(output + PROMPT, false);
}
LLHTTPRegistration<ConsoleResponseNode>
gHTTPRegistrationMessageDebugConsoleResponse(
"/message/SimConsoleResponse");

View File

@ -0,0 +1,63 @@
/**
* @file llfloaterregiondebugconsole.h
* @author Brad Kittenbrink <brad@lindenlab.com>
* @brief Quick and dirty console for region debug settings
*
* $LicenseInfo:firstyear=2010&license=viewergpl$
*
* Copyright (c) 2010-2010, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#ifndef LL_LLFLOATERREGIONDEBUGCONSOLE_H
#define LL_LLFLOATERREGIONDEBUGCONSOLE_H
#include <boost/signals2.hpp>
#include "llfloater.h"
#include "llhttpclient.h"
class LLTextEditor;
class LLFloaterRegionDebugConsole : public LLFloater, public LLHTTPClient::Responder
{
public:
LLFloaterRegionDebugConsole(LLSD const & key);
virtual ~LLFloaterRegionDebugConsole();
// virtual
BOOL postBuild();
void onInput(LLUICtrl* ctrl, const LLSD& param);
LLTextEditor * mOutput;
private:
void onReplyReceived(const std::string& output);
boost::signals2::connection mReplySignalConnection;
};
#endif // LL_LLFLOATERREGIONDEBUGCONSOLE_H

View File

@ -680,8 +680,6 @@ void LLIMFloater::updateMessages()
if (messages.size())
{
// LLUIColor chat_color = LLUIColorTable::instance().getColor("IMChatColor");
LLSD chat_args;
chat_args["use_plain_text_chat_history"] = use_plain_text_chat_history;

View File

@ -81,6 +81,7 @@
#include "llfloaterpostprocess.h"
#include "llfloaterpreference.h"
#include "llfloaterproperties.h"
#include "llfloaterregiondebugconsole.h"
#include "llfloaterregioninfo.h"
#include "llfloaterreporter.h"
#include "llfloaterscriptdebug.h"
@ -227,6 +228,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("reporter", "floater_report_abuse.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterReporter>);
LLFloaterReg::add("reset_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterResetQueue>);
LLFloaterReg::add("region_debug_console", "floater_region_debug_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRegionDebugConsole>);
LLFloaterReg::add("region_info", "floater_region_info.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRegionInfo>);
LLFloaterReg::add("script_debug", "floater_script_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebug>);

View File

@ -1400,6 +1400,8 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
capabilityNames.append("SendUserReportWithScreenshot");
capabilityNames.append("ServerReleaseNotes");
capabilityNames.append("SetDisplayName");
capabilityNames.append("SimConsole");
capabilityNames.append("SimConsoleAsync");
capabilityNames.append("StartGroupProposal");
capabilityNames.append("TextureStats");
capabilityNames.append("UntrustedSimulatorMessage");

View File

@ -399,9 +399,6 @@
<color
name="HighlightParentColor"
value="0.67 0.83 0.96 1" />
<color
name="IMChatColor"
reference="LtGray" />
<color
name="IMHistoryBgColor"
reference="Unused?" />

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
name="region_debug_console"
title="Region Debug"
layout="topleft"
min_height="300"
min_width="300"
height="400"
width="600"
default_tab_group="1">
<text_editor
left="10"
type="string"
length="1"
follows="left|top|right|bottom"
font="Monospace"
height="366"
width="576"
ignore_tab="false"
layout="topleft"
max_length="65536"
name="region_debug_console_output"
show_line_numbers="false"
word_wrap="true"
track_end="true"
read_only="true">
</text_editor>
<line_editor
border_style="line"
border_thickness="1"
tab_group="1"
follows="left|top|right"
font="SansSerif"
height="19"
layout="topleft"
bottom_delta="20"
max_length="127"
name="region_debug_console_input"
top_delta="0"
width="576" />
</floater>

View File

@ -2680,6 +2680,18 @@
function="ToggleControl"
parameter="DoubleClickTeleport" />
</menu_item_check>
<menu_item_check
label="Region Debug Console"
name="Region Debug Console"
shortcut="control|shift|`"
use_mac_ctrl="true">
<menu_item_check.on_check
function="Floater.Visible"
parameter="region_debug_console" />
<menu_item_check.on_click
function="Floater.Toggle"
parameter="region_debug_console" />
</menu_item_check>
<menu_item_separator />

View File

@ -113,22 +113,22 @@
</text>
<color_swatch
can_apply_immediately="true"
color="LtGray"
color="EmphasisColor_35"
follows="left|top"
height="24"
label_height="0"
label_width="60"
layout="topleft"
left="360"
name="im"
name="objects"
top_pad="-15"
width="44">
<color_swatch.init_callback
function="Pref.getUIColor"
parameter="IMChatColor" />
parameter="ObjectChatColor" />
<color_swatch.commit_callback
function="Pref.applyUIColor"
parameter="IMChatColor" />
parameter="ObjectChatColor" />
</color_swatch>
<text
type="string"
@ -141,7 +141,7 @@
name="text_box3"
top_delta="5"
width="95">
IM
Objects
</text>
<color_swatch
can_apply_immediately="true"
@ -206,37 +206,6 @@
width="95">
Errors
</text>
<color_swatch
can_apply_immediately="true"
color="EmphasisColor_35"
follows="left|top"
height="24"
label_height="0"
layout="topleft"
left="360"
name="objects"
top_pad="-15"
width="44" >
<color_swatch.init_callback
function="Pref.getUIColor"
parameter="ObjectChatColor" />
<color_swatch.commit_callback
function="Pref.applyUIColor"
parameter="ObjectChatColor" />
</color_swatch>
<text
type="string"
length="1"
follows="left|top"
height="10"
layout="topleft"
left_pad="5"
mouse_opaque="false"
name="text_box6"
top_delta="5"
width="95">
Objects
</text>
<color_swatch
can_apply_immediately="true"
color="LtYellow"
@ -305,7 +274,7 @@
left="30"
height="12"
name="bubble_chat"
top_pad="28"
top_pad="20"
width="120"
>
Bubble chat:
@ -336,11 +305,58 @@
height="16"
increment="0.05"
initial_value="1"
label="Opacity"
label="Opacity:"
layout="topleft"
left_pad="15"
label_width="56"
left_pad="10"
label_width="70"
name="bubble_chat_opacity"
top_delta = "6"
width="347" />
width="378" />
<text
follows="left|top"
layout="topleft"
left="30"
height="12"
name="bubble_chat"
top_pad="15"
width="120"
>
Floater Opacity:
</text>
<slider
can_edit_text="false"
control_name="ActiveFloaterTransparency"
decimal_digits="2"
follows="left|top"
height="16"
increment="0.01"
initial_value="0.8"
layout="topleft"
label_width="115"
label="Active :"
left="50"
max_val="1.00"
min_val="0.00"
name="active"
show_text="true"
top_pad="5"
width="415" />
<slider
can_edit_text="false"
control_name="InactiveFloaterTransparency"
decimal_digits="2"
follows="left|top"
height="16"
increment="0.01"
initial_value="0.5"
layout="topleft"
label_width="115"
label="Inctive :"
left="50"
max_val="1.00"
min_val="0.00"
name="active"
show_text="true"
top_pad="5"
width="415" />
</panel>

61
scripts/md5check.py Executable file
View File

@ -0,0 +1,61 @@
#!/usr/bin/python
"""\
@file md5check.py
@brief Replacement for message template compatibility verifier.
$LicenseInfo:firstyear=20i10&license=viewergpl$
Copyright (c) 2010, Linden Research, Inc.
Second Life Viewer Source Code
The source code in this file ("Source Code") is provided by Linden Lab
to you under the terms of the GNU General Public License, version 2.0
("GPL"), unless you have obtained a separate licensing agreement
("Other License"), formally executed by you and Linden Lab. Terms of
the GPL can be found in doc/GPL-license.txt in this distribution, or
online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
There are special exceptions to the terms and conditions of the GPL as
it is applied to this Source Code. View the full text of the exception
in the file doc/FLOSS-exception.txt in this software distribution, or
online at
http://secondlifegrid.net/programs/open_source/licensing/flossexception
By copying, modifying or distributing this software, you acknowledge
that you have read and understood your obligations described above,
and agree to abide by those obligations.
ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
COMPLETENESS OR PERFORMANCE.
$/LicenseInfo$
"""
import sys
import hashlib
if len(sys.argv) != 3:
print """Usage: %s --create|<hash-digest> <file>
Creates an md5sum hash digest of the specified file content
and compares it with the given hash digest.
If --create is used instead of a hash digest, it will simply
print out the hash digest of specified file content.
""" % sys.argv[0]
sys.exit(1)
if sys.argv[2] == '-':
fh = sys.stdin
filename = "<stdin>"
else:
filename = sys.argv[2]
fh = open(filename)
hexdigest = hashlib.md5(fh.read()).hexdigest()
if sys.argv[1] == '--create':
print hexdigest
elif hexdigest == sys.argv[1]:
print "md5sum check passed:", filename
else:
print "md5sum check FAILED:", filename
sys.exit(1)