From 266b3843b75fb9b8da7d2b3c824224a1b94697a5 Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Tue, 21 Sep 2010 16:41:06 -0700 Subject: EXP-94 Disable local file system access --- indra/newview/app_settings/settings.xml | 11 ++++ indra/newview/llfilepicker.cpp | 96 +++++++++++++++++++++++++++++++++ indra/newview/llfilepicker.h | 4 ++ 3 files changed, 111 insertions(+) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index feb5ebc16d..b28a02551e 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -4537,6 +4537,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>LocalFileSystemBrowsingEnabled</key> + <map> + <key>Comment</key> + <string>Enable/disable access to the local file system via the file picker</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>LoginSRVTimeout</key> <map> <key>Comment</key> diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index c14be89641..f0840774bd 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -33,6 +33,7 @@ #include "lldir.h" #include "llframetimer.h" #include "lltrans.h" +#include "llviewercontrol.h" #include "llwindow.h" // beforeDialog() #if LL_SDL @@ -104,6 +105,20 @@ LLFilePicker::~LLFilePicker() // nothing } +// utility function to check if access to local file system via file browser +// is enabled and if not, tidy up and indicate we're not allowed to do this. +bool LLFilePicker::check_local_file_access_enabled() +{ + // if local file browsing is turned off, return without opening dialog + bool local_file_system_browsing_enabled = gSavedSettings.getBOOL("LocalFileSystemBrowsingEnabled"); + if ( ! local_file_system_browsing_enabled ) + { + mFiles.clear(); + return false; + } + + return true; +} const std::string LLFilePicker::getFirstFile() { @@ -203,6 +218,12 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter) } BOOL success = FALSE; + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + // don't provide default file selection mFilesW[0] = '\0'; @@ -241,6 +262,12 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter) } BOOL success = FALSE; + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + // don't provide default file selection mFilesW[0] = '\0'; @@ -304,6 +331,12 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename) } BOOL success = FALSE; + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + mOFN.lpstrFile = mFilesW; if (!filename.empty()) { @@ -581,6 +614,12 @@ OSStatus LLFilePicker::doNavChooseDialog(ELoadFilter filter) NavDialogRef navRef = NULL; NavReplyRecord navReply; + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + memset(&navReply, 0, sizeof(navReply)); // NOTE: we are passing the address of a local variable here. @@ -809,6 +848,12 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter) BOOL success = FALSE; + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + OSStatus error = noErr; reset(); @@ -845,6 +890,12 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter) BOOL success = FALSE; + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + OSStatus error = noErr; reset(); @@ -876,6 +927,12 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename) BOOL success = FALSE; OSStatus error = noErr; + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + reset(); mNavOptions.optionFlags &= ~kNavAllowMultipleFiles; @@ -1100,6 +1157,12 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename { BOOL rtn = FALSE; + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + gViewerWindow->mWindow->beforeDialog(); reset(); @@ -1189,6 +1252,12 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter ) { BOOL rtn = FALSE; + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + gViewerWindow->mWindow->beforeDialog(); reset(); @@ -1233,6 +1302,12 @@ BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter ) { BOOL rtn = FALSE; + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + gViewerWindow->mWindow->beforeDialog(); reset(); @@ -1263,6 +1338,13 @@ BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter ) BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename ) { + // if local file browsing is turned off, return without opening dialog + // (Even though this is a stub, I think we still should not return anything at all) + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + reset(); llinfos << "getSaveFile suggested filename is [" << filename @@ -1277,6 +1359,13 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename BOOL LLFilePicker::getOpenFile( ELoadFilter filter ) { + // if local file browsing is turned off, return without opening dialog + // (Even though this is a stub, I think we still should not return anything at all) + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + reset(); // HACK: Static filenames for 'open' until we implement filepicker @@ -1295,6 +1384,13 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter ) BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter ) { + // if local file browsing is turned off, return without opening dialog + // (Even though this is a stub, I think we still should not return anything at all) + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + reset(); return FALSE; } diff --git a/indra/newview/llfilepicker.h b/indra/newview/llfilepicker.h index 5819ac4fd8..596bfa3e69 100644 --- a/indra/newview/llfilepicker.h +++ b/indra/newview/llfilepicker.h @@ -140,6 +140,10 @@ private: //FILENAME_BUFFER_SIZE = 65536 FILENAME_BUFFER_SIZE = 65000 }; + + // utility function to check if access to local file system via file browser + // is enabled and if not, tidy up and indicate we're not allowed to do this. + bool check_local_file_access_enabled(); #if LL_WINDOWS OPENFILENAMEW mOFN; // for open and save dialogs -- cgit v1.2.3 From 7648bb425ae106ce0268c7ff535b054de6f6a318 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 22 Sep 2010 12:25:40 -0700 Subject: EXP-111 WIP Automatically provide default responses to all notifications --- indra/newview/app_settings/settings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index feb5ebc16d..143574264d 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -3914,7 +3914,7 @@ <key>Comment</key> <string>Ignore all notifications so we never need user input on them.</string> <key>Persist</key> - <integer>0</integer> + <integer>1</integer> <key>Type</key> <string>Boolean</string> <key>Value</key> -- cgit v1.2.3 From f8a17515f592a1d759ca2c79f80b2ed032af2ebe Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 22 Sep 2010 12:27:26 -0700 Subject: EXP-109 WIP strip down main_view.xml made menu keyboard access only work when menus are visible dummy widgets are now added with a parent view that is invisible popupview can now be default-built --- indra/llui/llmenugl.cpp | 5 ++++- indra/llui/llview.cpp | 22 ++++++------------- indra/llui/llview.h | 14 +++++------- indra/newview/llpopupview.cpp | 3 ++- indra/newview/llpopupview.h | 2 +- indra/newview/llviewerwindow.cpp | 2 +- indra/newview/skins/minimal/xui/en/main_view.xml | 27 ++++++++++++++++++++++++ 7 files changed, 46 insertions(+), 29 deletions(-) create mode 100644 indra/newview/skins/minimal/xui/en/main_view.xml (limited to 'indra') diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 900a814238..e179f63ee5 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -3066,7 +3066,10 @@ BOOL LLMenuBarGL::handleAcceleratorKey(KEY key, MASK mask) mAltKeyTrigger = FALSE; } - if(!result && (key == KEY_F10 && mask == MASK_CONTROL) && !gKeyboard->getKeyRepeated(key)) + if(!result + && (key == KEY_F10 && mask == MASK_CONTROL) + && !gKeyboard->getKeyRepeated(key) + && isInVisibleChain()) { if (getHighlightedItem()) { diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 3fa86bf0ca..6ac009956d 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -163,8 +163,6 @@ LLView::~LLView() if (mDefaultWidgets) { - std::for_each(mDefaultWidgets->begin(), mDefaultWidgets->end(), - DeletePairedPointer()); delete mDefaultWidgets; mDefaultWidgets = NULL; } @@ -1682,18 +1680,7 @@ BOOL LLView::hasChild(const std::string& childname, BOOL recurse) const //----------------------------------------------------------------------------- LLView* LLView::getChildView(const std::string& name, BOOL recurse) const { - LLView* child = findChildView(name, recurse); - if (!child) - { - child = getDefaultWidget<LLView>(name); - if (!child) - { - LLView::Params view_params; - view_params.name = name; - child = LLUICtrlFactory::create<LLView>(view_params); - } - } - return child; + return getChild<LLView>(name, recurse); } static LLFastTimer::DeclareTimer FTM_FIND_VIEWS("Find Widgets"); @@ -2804,11 +2791,14 @@ LLView::root_to_view_iterator_t LLView::endRootToView() // only create maps on demand, as they incur heap allocation/deallocation cost // when a view is constructed/deconstructed -LLView::default_widget_map_t& LLView::getDefaultWidgetMap() const +LLView& LLView::getDefaultWidgetContainer() const { if (!mDefaultWidgets) { - mDefaultWidgets = new default_widget_map_t(); + LLView::Params p; + p.name = "default widget container"; + p.visible = false; // ensures default widgets can't steal focus, etc. + mDefaultWidgets = new LLView(p); } return *mDefaultWidgets; } diff --git a/indra/llui/llview.h b/indra/llui/llview.h index 6bcee98f26..e6e0a41962 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -461,12 +461,8 @@ public: template <class T> T* getDefaultWidget(const std::string& name) const { - default_widget_map_t::const_iterator found_it = getDefaultWidgetMap().find(name); - if (found_it == getDefaultWidgetMap().end()) - { - return NULL; - } - return dynamic_cast<T*>(found_it->second); + LLView* widgetp = getDefaultWidgetContainer().findChildView(name); + return dynamic_cast<T*>(widgetp); } ////////////////////////////////////////////// @@ -580,9 +576,9 @@ private: typedef std::map<std::string, LLView*> default_widget_map_t; // allocate this map no demand, as it is rarely needed - mutable default_widget_map_t* mDefaultWidgets; + mutable LLView* mDefaultWidgets; - default_widget_map_t& getDefaultWidgetMap() const; + LLView& getDefaultWidgetContainer() const; public: // Depth in view hierarchy during rendering @@ -649,7 +645,7 @@ template <class T> T* LLView::getChild(const std::string& name, BOOL recurse) co return NULL; } - getDefaultWidgetMap()[name] = result; + getDefaultWidgetContainer().addChild(result); } } return result; diff --git a/indra/newview/llpopupview.cpp b/indra/newview/llpopupview.cpp index 499b6a8f5f..18035c42f4 100644 --- a/indra/newview/llpopupview.cpp +++ b/indra/newview/llpopupview.cpp @@ -40,7 +40,8 @@ bool view_visible(LLView* viewp) } -LLPopupView::LLPopupView() +LLPopupView::LLPopupView(const LLPopupView::Params& p) +: LLPanel(p) { // register ourself as handler of UI popups LLUI::setPopupFuncs(boost::bind(&LLPopupView::addPopup, this, _1), boost::bind(&LLPopupView::removePopup, this, _1), boost::bind(&LLPopupView::clearPopups, this)); diff --git a/indra/newview/llpopupview.h b/indra/newview/llpopupview.h index fec4afd79c..b378f61984 100644 --- a/indra/newview/llpopupview.h +++ b/indra/newview/llpopupview.h @@ -32,7 +32,7 @@ class LLPopupView : public LLPanel { public: - LLPopupView(); + LLPopupView(const Params& p = LLPanel::Params()); ~LLPopupView(); /*virtual*/ void draw(); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 7f8b7fba9f..19f51b2bbe 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1524,7 +1524,7 @@ void LLViewerWindow::initBase() mWorldViewPlaceholder = main_view->getChildView("world_view_rect")->getHandle(); mNonSideTrayView = main_view->getChildView("non_side_tray_view")->getHandle(); mFloaterViewHolder = main_view->getChildView("floater_view_holder")->getHandle(); - mPopupView = main_view->findChild<LLPopupView>("popup_holder"); + mPopupView = main_view->getChild<LLPopupView>("popup_holder"); mHintHolder = main_view->getChild<LLView>("hint_holder")->getHandle(); // Constrain floaters to inside the menu and status bar regions. diff --git a/indra/newview/skins/minimal/xui/en/main_view.xml b/indra/newview/skins/minimal/xui/en/main_view.xml new file mode 100644 index 0000000000..c793b1b813 --- /dev/null +++ b/indra/newview/skins/minimal/xui/en/main_view.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + follows="left|right|top|bottom" + height="768" + layout="topleft" + left="0" + mouse_opaque="false" + tab_stop="false" + name="main_view" + width="1024"> + <view top="0" + follows="all" + height="768" + left="0" + mouse_opaque="false" + name="world_view_rect" + width="1024"/> + <panel top="0" + follows="all" + height="768" + mouse_opaque="true" + name="progress_view" + filename="panel_progress.xml" + class="progress_view" + width="1024" + visible="false"/> +</panel> -- cgit v1.2.3 From aa7d505882f07cffea8b7cd145296f3c114c3f50 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 22 Sep 2010 12:27:48 -0700 Subject: EXP-108 FIX Create new "minimal" UI skin --- indra/newview/llappviewer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 333c92e50d..1fd3632b85 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2182,8 +2182,8 @@ bool LLAppViewer::initConfiguration() if(skinfolder && LLStringUtil::null != skinfolder->getValue().asString()) { // hack to force the skin to default. - //gDirUtilp->setSkinFolder(skinfolder->getValue().asString()); - gDirUtilp->setSkinFolder("default"); + gDirUtilp->setSkinFolder(skinfolder->getValue().asString()); + //gDirUtilp->setSkinFolder("default"); } mYieldTime = gSavedSettings.getS32("YieldTime"); -- cgit v1.2.3 From 18404624e0c9c2544b0ebba2b9758a606d2fe574 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 22 Sep 2010 15:02:23 -0700 Subject: support older use of "IgnoreAllNotifications" by command line option "nonotifications" such that value isn't saved --- indra/newview/llappviewer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 1fd3632b85..02a8c3e674 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2135,7 +2135,7 @@ bool LLAppViewer::initConfiguration() if (clp.hasOption("nonotifications")) { - gSavedSettings.setBOOL("IgnoreAllNotifications", TRUE); + gSavedSettings.getControl("IgnoreAllNotifications")->setValue(true, false); } if (clp.hasOption("debugsession")) -- cgit v1.2.3 From 636c86782b9c8a37996aaf01868f713214c54584 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 22 Sep 2010 16:12:04 -0700 Subject: cleaned up notifications.xml and made global notifications toggle not use or modify saved responses --- indra/llui/llnotifications.cpp | 28 ++++++++++---- indra/newview/app_settings/cmd_line.xml | 2 +- .../newview/skins/default/xui/en/notifications.xml | 44 +++++----------------- 3 files changed, 30 insertions(+), 44 deletions(-) (limited to 'indra') diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index ab9bd12b85..d86b0183fc 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -133,12 +133,6 @@ private: bool filterIgnoredNotifications(LLNotificationPtr notification) { - // filter everything if we are to ignore ALL - if(LLNotifications::instance().getIgnoreAllNotifications()) - { - return false; - } - LLNotificationFormPtr form = notification->getForm(); // Check to see if the user wants to ignore this alert return !notification->getForm()->getIgnored(); @@ -173,6 +167,20 @@ bool handleIgnoredNotification(const LLSD& payload) return false; } +bool defaultResponse(const LLSD& payload) +{ + if (payload["sigtype"].asString() == "add") + { + LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID()); + if (pNotif) + { + // supply default response + pNotif->respond(pNotif->getResponseTemplate(LLNotification::WITH_DEFAULT_BUTTON)); + } + } + return false; +} + namespace LLNotificationFilters { // a sample filter @@ -1187,9 +1195,11 @@ void LLNotifications::createDefaultChannels() { // now construct the various channels AFTER loading the notifications, // because the history channel is going to rewrite the stored notifications file - LLNotificationChannel::buildChannel("Expiration", "", + LLNotificationChannel::buildChannel("Enabled", "", + !boost::bind(&LLNotifications::getIgnoreAllNotifications, this)); + LLNotificationChannel::buildChannel("Expiration", "Enabled", boost::bind(&LLNotifications::expirationFilter, this, _1)); - LLNotificationChannel::buildChannel("Unexpired", "", + LLNotificationChannel::buildChannel("Unexpired", "Enabled", !boost::bind(&LLNotifications::expirationFilter, this, _1)); // use negated bind LLNotificationChannel::buildChannel("Unique", "Unexpired", boost::bind(&LLNotifications::uniqueFilter, this, _1)); @@ -1203,6 +1213,8 @@ void LLNotifications::createDefaultChannels() new LLPersistentNotificationChannel(); // connect action methods to these channels + LLNotifications::instance().getChannel("Enabled")-> + connectFailedFilter(&defaultResponse); LLNotifications::instance().getChannel("Expiration")-> connectChanged(boost::bind(&LLNotifications::expirationHandler, this, _1)); // uniqueHandler slot should be added as first slot of the signal due to diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml index 00d69f805e..962c4e9d36 100644 --- a/indra/newview/app_settings/cmd_line.xml +++ b/indra/newview/app_settings/cmd_line.xml @@ -149,7 +149,7 @@ <key>nonotifications</key> <map> <key>desc</key> - <string>User will not get any notifications. NOTE: All notifications that occur will get added to ignore file for future runs.</string> + <string>User will not get any notifications.</string> <key>map-to</key> <string>IgnoreAllNotifications</string> </map> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index e1aecda151..5966db9d51 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -2069,7 +2069,7 @@ Would you be my friend? <button default="true" index="0" - name="Offer" + name="OK" text="OK"/> <button index="1" @@ -2091,7 +2091,7 @@ Would you be my friend? <button default="true" index="0" - name="Offer" + name="OK" text="OK"/> <button index="1" @@ -2114,7 +2114,7 @@ Would you be my friend? <button default="true" index="0" - name="Offer" + name="OK" text="OK"/> <button index="1" @@ -4810,24 +4810,6 @@ Some terms in your search query were excluded due to content restrictions as cla Please select at least one type of content to search (General, Moderate, or Adult). </notification> - <notification - icon="notify.tga" - name="GroupVote" - type="notify"> -[NAME] has proposed to vote on: -[MESSAGE] - <form name="form"> - <button - index="0" - name="VoteNow" - text="Vote Now"/> - <button - index="1" - name="Later" - text="Later"/> - </form> - </notification> - <notification icon="notify.tga" name="SystemMessage" @@ -6313,13 +6295,9 @@ Avatar '[NAME]' left appearance mode. type="alertmodal"> We're having trouble connecting using [PROTOCOL] [HOSTID]. Please check your network and firewall setup. - <form name="form"> - <button - default="true" - index="0" - name="OK" - text="OK"/> - </form> + <usetemplate + name="okbutton" + yestext="OK"/> </notification> <notification @@ -6332,13 +6310,9 @@ We're having trouble connecting to your voice server: Voice communications will not be available. Please check your network and firewall setup. - <form name="form"> - <button - default="true" - index="0" - name="OK" - text="OK"/> - </form> + <usetemplate + name="okbutton" + yestext="OK"/> </notification> <notification -- cgit v1.2.3 From 91bb305e26b7a73c5eb607d8c5ea5cdc642adb5c Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Wed, 22 Sep 2010 16:25:47 -0700 Subject: Temporary changes to allow the viewer to build against an older version of llqtwebkit. NOTE: once updated builds of llqtwebkit are available on all platforms, this changeset should be backed out. --- indra/media_plugins/webkit/media_plugin_webkit.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'indra') diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index bd1a44a930..c47052bae9 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -304,7 +304,11 @@ private: LLQtWebKit::getInstance()->enableJavascript( mJavascriptEnabled ); // create single browser window +#if LLQTWEBKIT_API_VERSION < 2 + mBrowserWindowId = LLQtWebKit::getInstance()->createBrowserWindow( mWidth, mHeight); +#else mBrowserWindowId = LLQtWebKit::getInstance()->createBrowserWindow( mWidth, mHeight, mTarget); +#endif // tell LLQtWebKit about the size of the browser window LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight ); @@ -505,9 +509,14 @@ private: void onClickLinkHref(const EventType& event) { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_href"); +#if LLQTWEBKIT_API_VERSION < 2 + message.setValue("uri", event.getStringValue()); + message.setValue("target", event.getStringValue2()); +#else message.setValue("uri", event.getEventUri()); message.setValue("target", event.getStringValue()); message.setValue("uuid", event.getStringValue2()); +#endif sendMessage(message); } @@ -516,7 +525,11 @@ private: void onClickLinkNoFollow(const EventType& event) { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_nofollow"); +#if LLQTWEBKIT_API_VERSION < 2 + message.setValue("uri", event.getStringValue()); +#else message.setValue("uri", event.getEventUri()); +#endif sendMessage(message); } @@ -538,7 +551,9 @@ private: void onWindowCloseRequested(const EventType& event) { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "close_request"); +#if LLQTWEBKIT_API_VERSION >= 2 message.setValue("uuid", event.getStringValue()); +#endif sendMessage(message); } @@ -1199,6 +1214,7 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) } } } +#if LLQTWEBKIT_API_VERSION >= 2 else if(message_name == "proxy_window_opened") { std::string target = message_in.getValue("target"); @@ -1210,6 +1226,7 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) std::string uuid = message_in.getValue("uuid"); LLQtWebKit::getInstance()->proxyWindowClosed(mBrowserWindowId, uuid); } +#endif else { // std::cerr << "MediaPluginWebKit::receiveMessage: unknown media_browser message: " << message_string << std::endl; -- cgit v1.2.3 From 7cb13e2d9c727efaed3b693c86b0ab6b5edb0388 Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Wed, 22 Sep 2010 16:44:26 -0700 Subject: Backed out changeset a2468fb913fe (pushed it to the wrong repo by mistake). --- indra/media_plugins/webkit/media_plugin_webkit.cpp | 17 ----------------- 1 file changed, 17 deletions(-) (limited to 'indra') diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index c47052bae9..bd1a44a930 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -304,11 +304,7 @@ private: LLQtWebKit::getInstance()->enableJavascript( mJavascriptEnabled ); // create single browser window -#if LLQTWEBKIT_API_VERSION < 2 - mBrowserWindowId = LLQtWebKit::getInstance()->createBrowserWindow( mWidth, mHeight); -#else mBrowserWindowId = LLQtWebKit::getInstance()->createBrowserWindow( mWidth, mHeight, mTarget); -#endif // tell LLQtWebKit about the size of the browser window LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight ); @@ -509,14 +505,9 @@ private: void onClickLinkHref(const EventType& event) { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_href"); -#if LLQTWEBKIT_API_VERSION < 2 - message.setValue("uri", event.getStringValue()); - message.setValue("target", event.getStringValue2()); -#else message.setValue("uri", event.getEventUri()); message.setValue("target", event.getStringValue()); message.setValue("uuid", event.getStringValue2()); -#endif sendMessage(message); } @@ -525,11 +516,7 @@ private: void onClickLinkNoFollow(const EventType& event) { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_nofollow"); -#if LLQTWEBKIT_API_VERSION < 2 - message.setValue("uri", event.getStringValue()); -#else message.setValue("uri", event.getEventUri()); -#endif sendMessage(message); } @@ -551,9 +538,7 @@ private: void onWindowCloseRequested(const EventType& event) { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "close_request"); -#if LLQTWEBKIT_API_VERSION >= 2 message.setValue("uuid", event.getStringValue()); -#endif sendMessage(message); } @@ -1214,7 +1199,6 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) } } } -#if LLQTWEBKIT_API_VERSION >= 2 else if(message_name == "proxy_window_opened") { std::string target = message_in.getValue("target"); @@ -1226,7 +1210,6 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) std::string uuid = message_in.getValue("uuid"); LLQtWebKit::getInstance()->proxyWindowClosed(mBrowserWindowId, uuid); } -#endif else { // std::cerr << "MediaPluginWebKit::receiveMessage: unknown media_browser message: " << message_string << std::endl; -- cgit v1.2.3 From 57b8571a8acd559b7a92c2d5ffbfe96b0c4b5b98 Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Fri, 24 Sep 2010 16:17:12 -0700 Subject: Added the VoiceDisableMic debug setting to completely disable the ability to open the mic. Also hoisted PTT key handling from LLVivoxVoiceClient up to LLVoiceClient. This cleans up LLVoiceModuleInterface a bit and makes the PTT logic more centralized. Reviewed by Richard. --- indra/newview/app_settings/settings.xml | 11 ++ indra/newview/llvoiceclient.cpp | 138 ++++++++++++++++++++----- indra/newview/llvoiceclient.h | 34 +++--- indra/newview/llvoicevivox.cpp | 177 +++----------------------------- indra/newview/llvoicevivox.h | 32 +----- 5 files changed, 159 insertions(+), 233 deletions(-) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 9000a9e530..a83291b530 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -11366,6 +11366,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>VoiceDisableMic</key> + <map> + <key>Comment</key> + <string>Completely disable the ability to open the mic.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>VoiceEffectExpiryWarningTime</key> <map> <key>Comment</key> diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index 6c44f639ec..730f022c50 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -35,6 +35,7 @@ #include "llnotificationsutil.h" #include "llsdserialize.h" #include "llui.h" +#include "llkeyboard.h" const F32 LLVoiceClient::OVERDRIVEN_POWER_LEVEL = 0.7f; @@ -113,8 +114,18 @@ LLVoiceClient::LLVoiceClient() mVoiceModule(NULL), m_servicePump(NULL), mVoiceEffectEnabled(LLCachedControl<bool>(gSavedSettings, "VoiceMorphingEnabled")), - mVoiceEffectDefault(LLCachedControl<std::string>(gSavedPerAccountSettings, "VoiceEffectDefault")) + mVoiceEffectDefault(LLCachedControl<std::string>(gSavedPerAccountSettings, "VoiceEffectDefault")), + mPTTDirty(true), + mPTT(true), + mUsePTT(true), + mPTTIsMiddleMouse(false), + mPTTKey(0), + mPTTIsToggle(false), + mUserPTTState(false), + mMuteMic(false), + mDisableMic(false) { + updateSettings(); } //--------------------------------------------------- @@ -173,6 +184,14 @@ const LLVoiceVersionInfo LLVoiceClient::getVersion() void LLVoiceClient::updateSettings() { + setUsePTT(gSavedSettings.getBOOL("PTTCurrentlyEnabled")); + std::string keyString = gSavedSettings.getString("PushToTalkButton"); + setPTTKey(keyString); + setPTTIsToggle(gSavedSettings.getBOOL("PushToTalkToggle")); + mDisableMic = gSavedSettings.getBOOL("VoiceDisableMic"); + + updateMicMuteLogic(); + if (mVoiceModule) mVoiceModule->updateSettings(); } @@ -481,6 +500,26 @@ void LLVoiceClient::setVoiceEnabled(bool enabled) if (mVoiceModule) mVoiceModule->setVoiceEnabled(enabled); } +void LLVoiceClient::updateMicMuteLogic() +{ + // If not configured to use PTT, the mic should be open (otherwise the user will be unable to speak). + bool new_mic_mute = false; + + if(mUsePTT) + { + // If configured to use PTT, track the user state. + new_mic_mute = !mUserPTTState; + } + + if(mMuteMic || mDisableMic) + { + // Either of these always overrides any other PTT setting. + new_mic_mute = true; + } + + if (mVoiceModule) mVoiceModule->setMuteMic(new_mic_mute); +} + void LLVoiceClient::setLipSyncEnabled(BOOL enabled) { if (mVoiceModule) mVoiceModule->setLipSyncEnabled(enabled); @@ -500,7 +539,8 @@ BOOL LLVoiceClient::lipSyncEnabled() void LLVoiceClient::setMuteMic(bool muted) { - if (mVoiceModule) mVoiceModule->setMuteMic(muted); + mMuteMic = muted; + updateMicMuteLogic(); } @@ -509,64 +549,116 @@ void LLVoiceClient::setMuteMic(bool muted) void LLVoiceClient::setUserPTTState(bool ptt) { - if (mVoiceModule) mVoiceModule->setUserPTTState(ptt); + mUserPTTState = ptt; + updateMicMuteLogic(); } bool LLVoiceClient::getUserPTTState() { - if (mVoiceModule) - { - return mVoiceModule->getUserPTTState(); - } - else - { - return false; - } + return mUserPTTState; } void LLVoiceClient::setUsePTT(bool usePTT) { - if (mVoiceModule) mVoiceModule->setUsePTT(usePTT); + if(usePTT && !mUsePTT) + { + // When the user turns on PTT, reset the current state. + mUserPTTState = false; + } + mUsePTT = usePTT; + + updateMicMuteLogic(); } void LLVoiceClient::setPTTIsToggle(bool PTTIsToggle) { - if (mVoiceModule) mVoiceModule->setPTTIsToggle(PTTIsToggle); + if(!PTTIsToggle && mPTTIsToggle) + { + // When the user turns off toggle, reset the current state. + mUserPTTState = false; + } + + mPTTIsToggle = PTTIsToggle; + + updateMicMuteLogic(); } bool LLVoiceClient::getPTTIsToggle() { - if (mVoiceModule) + return mPTTIsToggle; +} + +void LLVoiceClient::setPTTKey(std::string &key) +{ + if(key == "MiddleMouse") { - return mVoiceModule->getPTTIsToggle(); + mPTTIsMiddleMouse = true; } - else { - return false; + else + { + mPTTIsMiddleMouse = false; + if(!LLKeyboard::keyFromString(key, &mPTTKey)) + { + // If the call failed, don't match any key. + key = KEY_NONE; + } } - } void LLVoiceClient::inputUserControlState(bool down) { - if (mVoiceModule) mVoiceModule->inputUserControlState(down); + if(mPTTIsToggle) + { + if(down) // toggle open-mic state on 'down' + { + toggleUserPTTState(); + } + } + else // set open-mic state as an absolute + { + setUserPTTState(down); + } } void LLVoiceClient::toggleUserPTTState(void) { - if (mVoiceModule) mVoiceModule->toggleUserPTTState(); + setUserPTTState(!getUserPTTState()); } void LLVoiceClient::keyDown(KEY key, MASK mask) { - if (mVoiceModule) mVoiceModule->keyDown(key, mask); + if (gKeyboard->getKeyRepeated(key)) + { + // ignore auto-repeat keys + return; + } + + if(!mPTTIsMiddleMouse) + { + bool down = (mPTTKey != KEY_NONE) + && gKeyboard->getKeyDown(mPTTKey); + inputUserControlState(down); + } + } void LLVoiceClient::keyUp(KEY key, MASK mask) { - if (mVoiceModule) mVoiceModule->keyUp(key, mask); + if(!mPTTIsMiddleMouse) + { + bool down = (mPTTKey != KEY_NONE) + && gKeyboard->getKeyDown(mPTTKey); + inputUserControlState(down); + } } void LLVoiceClient::middleMouseState(bool down) { - if (mVoiceModule) mVoiceModule->middleMouseState(down); + if(mPTTIsMiddleMouse) + { + if(mPTTIsMiddleMouse) + { + inputUserControlState(down); + } + } } diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h index 24d7d7163e..c9aeea35a9 100644 --- a/indra/newview/llvoiceclient.h +++ b/indra/newview/llvoiceclient.h @@ -191,25 +191,9 @@ public: virtual void setVoiceEnabled(bool enabled)=0; virtual void setLipSyncEnabled(BOOL enabled)=0; virtual BOOL lipSyncEnabled()=0; - virtual void setMuteMic(bool muted)=0; // Use this to mute the local mic (for when the client is minimized, etc), ignoring user PTT state. + virtual void setMuteMic(bool muted)=0; // Set the mute state of the local mic. //@} - - //////////////////////// - /// @name PTT - //@{ - virtual void setUserPTTState(bool ptt)=0; - virtual bool getUserPTTState()=0; - virtual void setUsePTT(bool usePTT)=0; - virtual void setPTTIsToggle(bool PTTIsToggle)=0; - virtual bool getPTTIsToggle()=0; - virtual void toggleUserPTTState(void)=0; - virtual void inputUserControlState(bool down)=0; // interpret any sort of up-down mic-open control input according to ptt-toggle prefs - - virtual void keyDown(KEY key, MASK mask)=0; - virtual void keyUp(KEY key, MASK mask)=0; - virtual void middleMouseState(bool down)=0; - //@} - + ////////////////////////// /// @name nearby speaker accessors //@{ @@ -406,6 +390,9 @@ public: void setUsePTT(bool usePTT); void setPTTIsToggle(bool PTTIsToggle); bool getPTTIsToggle(); + void setPTTKey(std::string &key); + + void updateMicMuteLogic(); BOOL lipSyncEnabled(); @@ -471,6 +458,17 @@ protected: LLCachedControl<bool> mVoiceEffectEnabled; LLCachedControl<std::string> mVoiceEffectDefault; + + bool mPTTDirty; + bool mPTT; + + bool mUsePTT; + bool mPTTIsMiddleMouse; + KEY mPTTKey; + bool mPTTIsToggle; + bool mUserPTTState; + bool mMuteMic; + bool mDisableMic; }; /** diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index e674fec053..3cdbe04fae 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -44,7 +44,6 @@ #include "llviewernetwork.h" // for gGridChoice #include "llbase64.h" #include "llviewercontrol.h" -#include "llkeyboard.h" #include "llappviewer.h" // for gDisconnected, gDisableVoice #include "llmutelist.h" // to check for muted avatars #include "llagent.h" @@ -322,14 +321,8 @@ LLVivoxVoiceClient::LLVivoxVoiceClient() : mRenderDeviceDirty(false), mSpatialCoordsDirty(false), - mPTTDirty(true), - mPTT(true), - mUsePTT(true), - mPTTIsMiddleMouse(false), - mPTTKey(0), - mPTTIsToggle(false), - mUserPTTState(false), mMuteMic(false), + mMuteMicDirty(false), mFriendsListDirty(true), mEarLocation(0), @@ -431,10 +424,6 @@ const LLVoiceVersionInfo& LLVivoxVoiceClient::getVersion() void LLVivoxVoiceClient::updateSettings() { setVoiceEnabled(gSavedSettings.getBOOL("EnableVoiceChat")); - setUsePTT(gSavedSettings.getBOOL("PTTCurrentlyEnabled")); - std::string keyString = gSavedSettings.getString("PushToTalkButton"); - setPTTKey(keyString); - setPTTIsToggle(gSavedSettings.getBOOL("PushToTalkToggle")); setEarLocation(gSavedSettings.getS32("VoiceEarLocation")); std::string inputDevice = gSavedSettings.getString("VoiceInputAudioDevice"); @@ -946,7 +935,7 @@ void LLVivoxVoiceClient::stateMachine() setState(stateDaemonLaunched); // Dirty the states we'll need to sync with the daemon when it comes up. - mPTTDirty = true; + mMuteMicDirty = true; mMicVolumeDirty = true; mSpeakerVolumeDirty = true; mSpeakerMuteDirty = true; @@ -1531,7 +1520,7 @@ void LLVivoxVoiceClient::stateMachine() if(mAudioSession && mAudioSession->mVoiceEnabled) { // Dirty state that may need to be sync'ed with the daemon. - mPTTDirty = true; + mMuteMicDirty = true; mSpeakerVolumeDirty = true; mSpatialCoordsDirty = true; @@ -1572,35 +1561,6 @@ void LLVivoxVoiceClient::stateMachine() } else { - - // Figure out whether the PTT state needs to change - { - bool newPTT; - if(mUsePTT) - { - // If configured to use PTT, track the user state. - newPTT = mUserPTTState; - } - else - { - // If not configured to use PTT, it should always be true (otherwise the user will be unable to speak). - newPTT = true; - } - - if(mMuteMic) - { - // This always overrides any other PTT setting. - newPTT = false; - } - - // Dirty if state changed. - if(newPTT != mPTT) - { - mPTT = newPTT; - mPTTDirty = true; - } - } - if(!inSpatialChannel()) { // When in a non-spatial channel, never send positional updates. @@ -1622,7 +1582,7 @@ void LLVivoxVoiceClient::stateMachine() // Send an update only if the ptt or mute state has changed (which shouldn't be able to happen that often // -- the user can only click so fast) or every 10hz, whichever is sooner. // Sending for every volume update causes an excessive flood of messages whenever a volume slider is dragged. - if((mAudioSession && mAudioSession->mMuteDirty) || mPTTDirty || mUpdateTimer.hasExpired()) + if((mAudioSession && mAudioSession->mMuteDirty) || mMuteMicDirty || mUpdateTimer.hasExpired()) { mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS); sendPositionalUpdate(); @@ -2745,19 +2705,17 @@ void LLVivoxVoiceClient::buildLocalAudioUpdates(std::ostringstream &stream) buildSetRenderDevice(stream); - if(mPTTDirty) + if(mMuteMicDirty) { - mPTTDirty = false; + mMuteMicDirty = false; // Send a local mute command. - // NOTE that the state of "PTT" is the inverse of "local mute". - // (i.e. when PTT is true, we send a mute command with "false", and vice versa) - LL_DEBUGS("Voice") << "Sending MuteLocalMic command with parameter " << (mPTT?"false":"true") << LL_ENDL; + LL_DEBUGS("Voice") << "Sending MuteLocalMic command with parameter " << (mMuteMic?"true":"false") << LL_ENDL; stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">" << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" - << "<Value>" << (mPTT?"false":"true") << "</Value>" + << "<Value>" << (mMuteMic?"true":"false") << "</Value>" << "</Request>\n\n\n"; } @@ -5230,40 +5188,13 @@ void LLVivoxVoiceClient::leaveChannel(void) void LLVivoxVoiceClient::setMuteMic(bool muted) { - mMuteMic = muted; -} - -void LLVivoxVoiceClient::setUserPTTState(bool ptt) -{ - mUserPTTState = ptt; -} - -bool LLVivoxVoiceClient::getUserPTTState() -{ - return mUserPTTState; -} - -void LLVivoxVoiceClient::inputUserControlState(bool down) -{ - if(mPTTIsToggle) + if(mMuteMic != muted) { - if(down) // toggle open-mic state on 'down' - { - toggleUserPTTState(); - } - } - else // set open-mic state as an absolute - { - setUserPTTState(down); + mMuteMic = muted; + mMuteMicDirty = true; } } - -void LLVivoxVoiceClient::toggleUserPTTState(void) -{ - mUserPTTState = !mUserPTTState; -} - void LLVivoxVoiceClient::setVoiceEnabled(bool enabled) { if (enabled != mVoiceEnabled) @@ -5312,48 +5243,6 @@ BOOL LLVivoxVoiceClient::lipSyncEnabled() } } -void LLVivoxVoiceClient::setUsePTT(bool usePTT) -{ - if(usePTT && !mUsePTT) - { - // When the user turns on PTT, reset the current state. - mUserPTTState = false; - } - mUsePTT = usePTT; -} - -void LLVivoxVoiceClient::setPTTIsToggle(bool PTTIsToggle) -{ - if(!PTTIsToggle && mPTTIsToggle) - { - // When the user turns off toggle, reset the current state. - mUserPTTState = false; - } - - mPTTIsToggle = PTTIsToggle; -} - -bool LLVivoxVoiceClient::getPTTIsToggle() -{ - return mPTTIsToggle; -} - -void LLVivoxVoiceClient::setPTTKey(std::string &key) -{ - if(key == "MiddleMouse") - { - mPTTIsMiddleMouse = true; - } - else - { - mPTTIsMiddleMouse = false; - if(!LLKeyboard::keyFromString(key, &mPTTKey)) - { - // If the call failed, don't match any key. - key = KEY_NONE; - } - } -} void LLVivoxVoiceClient::setEarLocation(S32 loc) { @@ -5394,44 +5283,6 @@ void LLVivoxVoiceClient::setMicGain(F32 volume) } } -void LLVivoxVoiceClient::keyDown(KEY key, MASK mask) -{ - if (gKeyboard->getKeyRepeated(key)) - { - // ignore auto-repeat keys - return; - } - - if(!mPTTIsMiddleMouse) - { - bool down = (mPTTKey != KEY_NONE) - && gKeyboard->getKeyDown(mPTTKey); - inputUserControlState(down); - } - - -} -void LLVivoxVoiceClient::keyUp(KEY key, MASK mask) -{ - if(!mPTTIsMiddleMouse) - { - bool down = (mPTTKey != KEY_NONE) - && gKeyboard->getKeyDown(mPTTKey); - inputUserControlState(down); - } - -} -void LLVivoxVoiceClient::middleMouseState(bool down) -{ - if(mPTTIsMiddleMouse) - { - if(mPTTIsMiddleMouse) - { - inputUserControlState(down); - } - } -} - ///////////////////////////// // Accessors for data related to nearby speakers BOOL LLVivoxVoiceClient::getVoiceEnabled(const LLUUID& id) @@ -7005,8 +6856,8 @@ void LLVivoxVoiceClient::captureBufferRecordStartSendMessage() << "<Value>false</Value>" << "</Request>\n\n\n"; - // Dirty the PTT state so that it will get reset when we finishing previewing - mPTTDirty = true; + // Dirty the mute mic state so that it will get reset when we finishing previewing + mMuteMicDirty = true; writeString(stream.str()); } @@ -7020,7 +6871,7 @@ void LLVivoxVoiceClient::captureBufferRecordStopSendMessage() LL_DEBUGS("Voice") << "Stopping audio capture to buffer." << LL_ENDL; - // Mute the mic. PTT state was dirtied at recording start, so will be reset when finished previewing. + // Mute the mic. Mic mute state was dirtied at recording start, so will be reset when finished previewing. stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">" << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" << "<Value>true</Value>" diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h index 08f2f75a39..04ac35ff82 100644 --- a/indra/newview/llvoicevivox.h +++ b/indra/newview/llvoicevivox.h @@ -173,25 +173,9 @@ public: virtual void setVoiceEnabled(bool enabled); virtual BOOL lipSyncEnabled(); virtual void setLipSyncEnabled(BOOL enabled); - virtual void setMuteMic(bool muted); // Use this to mute the local mic (for when the client is minimized, etc), ignoring user PTT state. + virtual void setMuteMic(bool muted); // Set the mute state of the local mic. //@} - - //////////////////////// - /// @name PTT - //@{ - virtual void setUserPTTState(bool ptt); - virtual bool getUserPTTState(); - virtual void setUsePTT(bool usePTT); - virtual void setPTTIsToggle(bool PTTIsToggle); - virtual bool getPTTIsToggle(); - virtual void inputUserControlState(bool down); // interpret any sort of up-down mic-open control input according to ptt-toggle prefs - virtual void toggleUserPTTState(void); - - virtual void keyDown(KEY key, MASK mask); - virtual void keyUp(KEY key, MASK mask); - virtual void middleMouseState(bool down); - //@} - + ////////////////////////// /// @name nearby speaker accessors //@{ @@ -534,9 +518,6 @@ protected: // Use this to determine whether to show a "no speech" icon in the menu bar. - // PTT - void setPTTKey(std::string &key); - ///////////////////////////// // Recording controls void recordingLoopStart(int seconds = 3600, int deltaFramesPerControlFrame = 200); @@ -800,15 +781,8 @@ private: LLVector3 mAvatarVelocity; LLMatrix3 mAvatarRot; - bool mPTTDirty; - bool mPTT; - - bool mUsePTT; - bool mPTTIsMiddleMouse; - KEY mPTTKey; - bool mPTTIsToggle; - bool mUserPTTState; bool mMuteMic; + bool mMuteMicDirty; // Set to true when the friends list is known to have changed. bool mFriendsListDirty; -- cgit v1.2.3 From 08017d0af830e925ed73dd39e89d2a24d474b499 Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Mon, 27 Sep 2010 16:33:17 -0700 Subject: Addenum to EXP-94 Disable local file system access - also handle dir picker selection too --- indra/newview/lldirpicker.cpp | 40 +++++++++++++++++++++++++++++++++++++++- indra/newview/lldirpicker.h | 1 + 2 files changed, 40 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/lldirpicker.cpp b/indra/newview/lldirpicker.cpp index 53101f0ce2..dd243397a1 100644 --- a/indra/newview/lldirpicker.cpp +++ b/indra/newview/lldirpicker.cpp @@ -35,6 +35,7 @@ #include "llframetimer.h" #include "lltrans.h" #include "llwindow.h" // beforeDialog() +#include "llviewercontrol.h" #if LL_LINUX || LL_SOLARIS # include "llfilepicker.h" @@ -53,6 +54,23 @@ LLDirPicker LLDirPicker::sInstance; // // Implementation // + +// utility function to check if access to local file system via file browser +// is enabled and if not, tidy up and indicate we're not allowed to do this. +bool LLDirPicker::check_local_file_access_enabled() +{ + // if local file browsing is turned off, return without opening dialog + bool local_file_system_browsing_enabled = gSavedSettings.getBOOL("LocalFileSystemBrowsingEnabled"); + if ( ! local_file_system_browsing_enabled ) + { + mDir.clear(); // Windows + mFileName = NULL; // Mac/Linux + return false; + } + + return true; +} + #if LL_WINDOWS LLDirPicker::LLDirPicker() : @@ -72,6 +90,13 @@ BOOL LLDirPicker::getDir(std::string* filename) { return FALSE; } + + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + BOOL success = FALSE; // Modal, so pause agent @@ -231,7 +256,13 @@ BOOL LLDirPicker::getDir(std::string* filename) if( mLocked ) return FALSE; BOOL success = FALSE; OSStatus error = noErr; - + + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + mFileName = filename; // mNavOptions.saveFileName @@ -289,6 +320,13 @@ void LLDirPicker::reset() BOOL LLDirPicker::getDir(std::string* filename) { reset(); + + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + if (mFilePicker) { GtkWindow* picker = mFilePicker->buildFilePicker(false, true, diff --git a/indra/newview/lldirpicker.h b/indra/newview/lldirpicker.h index a360293fff..2188b7edd0 100644 --- a/indra/newview/lldirpicker.h +++ b/indra/newview/lldirpicker.h @@ -75,6 +75,7 @@ private: }; void buildDirname( void ); + bool check_local_file_access_enabled(); #if LL_DARWIN NavDialogCreationOptions mNavOptions; -- cgit v1.2.3 From c4cfd1df44c1a6784f7780b03267203400804c48 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 28 Sep 2010 14:21:54 -0700 Subject: don't show empty context menus --- indra/llui/llmenugl.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'indra') diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index b1f4b362d5..87f01cf44f 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -3803,6 +3803,11 @@ void LLContextMenu::setVisible(BOOL visible) // Takes cursor position in screen space? void LLContextMenu::show(S32 x, S32 y) { + if (getChildList()->empty()) + { + // nothing to show, so abort + return; + } // Save click point for detecting cursor moves before mouse-up. // Must be in local coords to compare with mouseUp events. // If the mouse doesn't move, the menu will stay open ala the Mac. -- cgit v1.2.3 From abc18951c6b639bcbacae2dd83a13ef8e02de85d Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 28 Sep 2010 14:23:32 -0700 Subject: fix for crash when background image not specified for line editor --- indra/llui/lllineeditor.cpp | 2 ++ indra/llui/llui.cpp | 18 ++++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) (limited to 'indra') diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index a1fc977ce1..16e86a8eac 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -1491,6 +1491,8 @@ void LLLineEditor::drawBackground() { image = mBgImage; } + + if (!image) return; F32 alpha = getDrawContext().mAlpha; // optionally draw programmatic border diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index ff9af21e54..1f86855a1e 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -1596,23 +1596,25 @@ void LLUI::initClass(const settings_map_t& settings, sWindow = NULL; // set later in startup LLFontGL::sShadowColor = LLUIColorTable::instance().getColor("ColorDropShadow"); + LLUICtrl::CommitCallbackRegistry::Registrar& reg = LLUICtrl::CommitCallbackRegistry::defaultRegistrar(); + // Callbacks for associating controls with floater visibilty: - LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Floater.Toggle", boost::bind(&LLFloaterReg::toggleFloaterInstance, _2)); - LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Floater.Show", boost::bind(&LLFloaterReg::showFloaterInstance, _2)); - LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Floater.Hide", boost::bind(&LLFloaterReg::hideFloaterInstance, _2)); - LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Floater.InitToVisibilityControl", boost::bind(&LLFloaterReg::initUICtrlToFloaterVisibilityControl, _1, _2)); + reg.add("Floater.Toggle", boost::bind(&LLFloaterReg::toggleFloaterInstance, _2)); + reg.add("Floater.Show", boost::bind(&LLFloaterReg::showFloaterInstance, _2)); + reg.add("Floater.Hide", boost::bind(&LLFloaterReg::hideFloaterInstance, _2)); + reg.add("Floater.InitToVisibilityControl", boost::bind(&LLFloaterReg::initUICtrlToFloaterVisibilityControl, _1, _2)); // Button initialization callback for toggle buttons - LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Button.SetFloaterToggle", boost::bind(&LLButton::setFloaterToggle, _1, _2)); + reg.add("Button.SetFloaterToggle", boost::bind(&LLButton::setFloaterToggle, _1, _2)); // Button initialization callback for toggle buttons on dockale floaters - LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Button.SetDockableFloaterToggle", boost::bind(&LLButton::setDockableFloaterToggle, _1, _2)); + reg.add("Button.SetDockableFloaterToggle", boost::bind(&LLButton::setDockableFloaterToggle, _1, _2)); // Display the help topic for the current context - LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Button.ShowHelp", boost::bind(&LLButton::showHelp, _1, _2)); + reg.add("Button.ShowHelp", boost::bind(&LLButton::showHelp, _1, _2)); // Currently unused, but kept for reference: - LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Button.ToggleFloater", boost::bind(&LLButton::toggleFloaterAndSetToggleState, _1, _2)); + reg.add("Button.ToggleFloater", boost::bind(&LLButton::toggleFloaterAndSetToggleState, _1, _2)); // Used by menus along with Floater.Toggle to display visibility as a checkmark LLUICtrl::EnableCallbackRegistry::defaultRegistrar().add("Floater.Visible", boost::bind(&LLFloaterReg::floaterInstanceVisible, _2)); -- cgit v1.2.3 From 594a115c92a84c90d1dbcc393b2ee7a189644f5f Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 28 Sep 2010 14:55:49 -0700 Subject: removed minimal skin in favor of user folder approach --- indra/newview/skins/minimal/xui/en/main_view.xml | 27 ------------------------ 1 file changed, 27 deletions(-) delete mode 100644 indra/newview/skins/minimal/xui/en/main_view.xml (limited to 'indra') diff --git a/indra/newview/skins/minimal/xui/en/main_view.xml b/indra/newview/skins/minimal/xui/en/main_view.xml deleted file mode 100644 index c793b1b813..0000000000 --- a/indra/newview/skins/minimal/xui/en/main_view.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - follows="left|right|top|bottom" - height="768" - layout="topleft" - left="0" - mouse_opaque="false" - tab_stop="false" - name="main_view" - width="1024"> - <view top="0" - follows="all" - height="768" - left="0" - mouse_opaque="false" - name="world_view_rect" - width="1024"/> - <panel top="0" - follows="all" - height="768" - mouse_opaque="true" - name="progress_view" - filename="panel_progress.xml" - class="progress_view" - width="1024" - visible="false"/> -</panel> -- cgit v1.2.3 From ff071bbdce6478f8cd666ecf75658ca6e24f1140 Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Tue, 28 Sep 2010 16:49:22 -0700 Subject: Added a mechanism for preventing classes of notifications from being displayed, controlled by the notification_visibility.xml file in the viewer skin. Reviewed by Richard. --- indra/llui/CMakeLists.txt | 1 + indra/llui/llnotifications.cpp | 75 ++++++++++++++++++++- indra/llui/llnotifications.h | 17 ++++- indra/llui/llnotificationvisibilityrule.h | 76 ++++++++++++++++++++++ indra/newview/llfloaternotificationsconsole.cpp | 1 + .../default/xui/en/notification_visibility.xml | 5 ++ 6 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 indra/llui/llnotificationvisibilityrule.h create mode 100644 indra/newview/skins/default/xui/en/notification_visibility.xml (limited to 'indra') diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index e98201ea63..864f3f699e 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -159,6 +159,7 @@ set(llui_HEADER_FILES llnotificationslistener.h llnotificationsutil.h llnotificationtemplate.h + llnotificationvisibilityrule.h llpanel.h llprogressbar.h llradiogroup.h diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index 9a3933093c..46af9323e1 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -28,6 +28,7 @@ #include "llnotifications.h" #include "llnotificationtemplate.h" +#include "llnotificationvisibilityrule.h" #include "llinstantmessage.h" #include "llxmlnode.h" @@ -414,6 +415,13 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par mForm = LLNotificationFormPtr(new LLNotificationForm(p.name, p.form_ref.form)); } +LLNotificationVisibilityRule::LLNotificationVisibilityRule(const LLNotificationVisibilityRule::Params &p) +: mVisible(p.visible), + mType(p.type), + mTag(p.tag) +{ +} + LLNotification::LLNotification(const LLNotification::Params& p) : mTimestamp(p.time_stamp), mSubstitutions(p.substitutions), @@ -1188,6 +1196,7 @@ LLNotificationChannelPtr LLNotifications::getChannel(const std::string& channelN void LLNotifications::initSingleton() { loadTemplates(); + loadVisibilityRules(); createDefaultChannels(); } @@ -1205,7 +1214,9 @@ void LLNotifications::createDefaultChannels() boost::bind(&LLNotifications::uniqueFilter, this, _1)); LLNotificationChannel::buildChannel("Ignore", "Unique", filterIgnoredNotifications); - LLNotificationChannel::buildChannel("Visible", "Ignore", + LLNotificationChannel::buildChannel("VisibilityRules", "Ignore", + boost::bind(&LLNotifications::isVisibleByRules, this, _1)); + LLNotificationChannel::buildChannel("Visible", "VisibilityRules", &LLNotificationFilters::includeEverything); // create special persistent notification channel @@ -1226,6 +1237,8 @@ void LLNotifications::createDefaultChannels() // connectFailedFilter(boost::bind(&LLNotifications::failedUniquenessTest, this, _1)); LLNotifications::instance().getChannel("Ignore")-> connectFailedFilter(&handleIgnoredNotification); + LLNotifications::instance().getChannel("VisibilityRules")-> + connectFailedFilter(&handleIgnoredNotification); } bool LLNotifications::addTemplate(const std::string &name, @@ -1404,6 +1417,36 @@ bool LLNotifications::loadTemplates() return true; } +bool LLNotifications::loadVisibilityRules() +{ + const std::string xml_filename = "notification_visibility.xml"; + std::string full_filename = gDirUtilp->findSkinnedFilename(LLUI::getXUIPaths().front(), xml_filename); + + LLXMLNodePtr root; + BOOL success = LLUICtrlFactory::getLayeredXMLNode(xml_filename, root); + + if (!success || root.isNull() || !root->hasName( "notification_visibility" )) + { + llerrs << "Problem reading UI Notification Visibility Rules file: " << full_filename << llendl; + return false; + } + + LLNotificationVisibilityRule::Rules params; + LLXUIParser parser; + parser.readXUI(root, params, full_filename); + + mVisibilityRules.clear(); + + for(LLInitParam::ParamIterator<LLNotificationVisibilityRule::Params>::iterator it = params.rules.begin(), end_it = params.rules.end(); + it != end_it; + ++it) + { + mVisibilityRules.push_back(LLNotificationVisibilityRulePtr(new LLNotificationVisibilityRule(*it))); + } + + return true; +} + // Add a simple notification (from XUI) void LLNotifications::addFromCallback(const LLSD& name) { @@ -1553,6 +1596,36 @@ bool LLNotifications::getIgnoreAllNotifications() { return mIgnoreAllNotifications; } + +bool LLNotifications::isVisibleByRules(LLNotificationPtr n) +{ + VisibilityRuleList::iterator it; + + for(it = mVisibilityRules.begin(); it != mVisibilityRules.end(); it++) + { + // An empty type or tag string will match any notification, so only do the comparison when the string is non-empty in the rule. + + if(!(*it)->mType.empty()) + { + if((*it)->mType != n->getType()) + { + // Type doesn't match, so skip this rule. + continue; + } + } + + if(!(*it)->mTag.empty()) + { + // TODO: check this notification's tag(s) against it->mTag and continue if no match is found. + } + + // If we got here, the rule matches. Don't evaluate subsequent rules. + return (*it)->mVisible; + } + + // Default for cases with no rules or incomplete rules is to show all notifications. + return true; +} // --- // END OF LLNotifications implementation diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index 4fe1687f0e..75c67151ca 100644 --- a/indra/llui/llnotifications.h +++ b/indra/llui/llnotifications.h @@ -268,6 +268,11 @@ struct LLNotificationTemplate; // with smart pointers typedef boost::shared_ptr<LLNotificationTemplate> LLNotificationTemplatePtr; + +struct LLNotificationVisibilityRule; + +typedef boost::shared_ptr<LLNotificationVisibilityRule> LLNotificationVisibilityRulePtr; + /** * @class LLNotification * @brief The object that expresses the details of a notification @@ -856,6 +861,10 @@ public: // load notification descriptions from file; // OK to call more than once because it will reload bool loadTemplates(); + + // load visibility rules from file; + // OK to call more than once because it will reload + bool loadVisibilityRules(); // Add a simple notification (from XUI) void addFromCallback(const LLSD& name); @@ -902,6 +911,8 @@ public: // test for existence bool templateExists(const std::string& name); + typedef std::list<LLNotificationVisibilityRulePtr> VisibilityRuleList; + void forceResponse(const LLNotification::Params& params, S32 option); void createDefaultChannels(); @@ -916,7 +927,9 @@ public: void setIgnoreAllNotifications(bool ignore); bool getIgnoreAllNotifications(); - + + bool isVisibleByRules(LLNotificationPtr pNotification); + private: // we're a singleton, so we don't have a public constructor LLNotifications(); @@ -935,6 +948,8 @@ private: // put your template in bool addTemplate(const std::string& name, LLNotificationTemplatePtr theTemplate); TemplateMap mTemplates; + + VisibilityRuleList mVisibilityRules; std::string mFileName; diff --git a/indra/llui/llnotificationvisibilityrule.h b/indra/llui/llnotificationvisibilityrule.h new file mode 100644 index 0000000000..a98591c9d6 --- /dev/null +++ b/indra/llui/llnotificationvisibilityrule.h @@ -0,0 +1,76 @@ +/** +* @file llnotificationvisibility.h +* @brief Rules for +* @author Monroe +* +* $LicenseInfo:firstyear=2010&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2010, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +* $/LicenseInfo$ +*/ + +#ifndef LL_LLNOTIFICATION_VISIBILITY_RULE_H +#define LL_LLNOTIFICATION_VISIBILITY_RULE_H + +#include "llinitparam.h" +//#include "llnotifications.h" + + + +// This is the class of object read from the XML file (notification_visibility.xml, +// from the appropriate local language directory). +struct LLNotificationVisibilityRule +{ + struct Params : public LLInitParam::Block<Params> + { + Mandatory<bool> visible; + Optional<std::string> type; + Optional<std::string> tag; + + Params() + : visible("visible"), + type("type"), + tag("tag") + {} + }; + + + struct Rules : public LLInitParam::Block<Rules> + { + Multiple<Params> rules; + + Rules() + : rules("rule") + {} + }; + + LLNotificationVisibilityRule(const Params& p); + + // If true, this rule makes matching notifications visible. Otherwise, it makes them invisible. + bool mVisible; + + // String to match against the notification's "type". An empty string matches all notifications. + std::string mType; + + // String to match against the notification's tag(s). An empty string matches all notifications. + std::string mTag; +}; + +#endif //LL_LLNOTIFICATION_VISIBILITY_RULE_H + diff --git a/indra/newview/llfloaternotificationsconsole.cpp b/indra/newview/llfloaternotificationsconsole.cpp index 42dc60f9e0..29af81d64c 100644 --- a/indra/newview/llfloaternotificationsconsole.cpp +++ b/indra/newview/llfloaternotificationsconsole.cpp @@ -174,6 +174,7 @@ BOOL LLFloaterNotificationConsole::postBuild() // these are in the order of processing addChannel("Unexpired"); addChannel("Ignore"); + addChannel("VisibilityRules"); addChannel("Visible", true); // all the ones below attach to the Visible channel addChannel("Persistent"); diff --git a/indra/newview/skins/default/xui/en/notification_visibility.xml b/indra/newview/skins/default/xui/en/notification_visibility.xml new file mode 100644 index 0000000000..cb36890fe6 --- /dev/null +++ b/indra/newview/skins/default/xui/en/notification_visibility.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" ?> +<notification_visibility> + <rule visible="true"/> +</notification_visibility> + -- cgit v1.2.3 From 95ecad54c6f037910a5a22f7ef30026cf628fe80 Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Tue, 28 Sep 2010 16:52:56 -0700 Subject: EXP-112 Enable fullscreen mode (with mode switch, not resize to desktop) as per 1.x viewer. --- indra/llwindow/llwindowwin32.cpp | 22 +++++++++++++++++++++- indra/newview/app_settings/cmd_line.xml | 8 ++++++++ indra/newview/app_settings/settings.xml | 11 +++++++++++ indra/newview/llappviewer.cpp | 2 +- indra/newview/llviewerwindow.cpp | 11 ++++++++++- 5 files changed, 51 insertions(+), 3 deletions(-) (limited to 'indra') diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 87075c7318..ab089081e6 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -544,7 +544,27 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks, if (closest_refresh == 0) { LL_WARNS("Window") << "Couldn't find display mode " << width << " by " << height << " at " << BITS_PER_PIXEL << " bits per pixel" << LL_ENDL; - success = FALSE; + //success = FALSE; + + if (!EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dev_mode)) + { + success = FALSE; + } + else + { + if (dev_mode.dmBitsPerPel == BITS_PER_PIXEL) + { + LL_WARNS("Window") << "Current BBP is OK falling back to that" << LL_ENDL; + window_rect.right=width=dev_mode.dmPelsWidth; + window_rect.bottom=height=dev_mode.dmPelsHeight; + success = TRUE; + } + else + { + LL_WARNS("Window") << "Current BBP is BAD" << LL_ENDL; + success = FALSE; + } + } } // If we found a good resolution, use it. diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml index 962c4e9d36..aa2f1c41d2 100644 --- a/indra/newview/app_settings/cmd_line.xml +++ b/indra/newview/app_settings/cmd_line.xml @@ -391,5 +391,13 @@ <string>CrashOnStartup</string> </map> + <key>fullscreen</key> + <map> + <key>desc</key> + <string>Force full screen mode</string> + <key>map-to</key> + <string>WindowFullScreen</string> + </map> + </map> </llsd> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index a83291b530..9c19d2c638 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -11684,6 +11684,17 @@ <string>Boolean</string> <key>Value</key> <integer>1</integer> + </map> + <key>WindowFullScreen</key> + <map> + <key>Comment</key> + <string>SL viewer window full screen</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> </map> <key>WindowHeight</key> <map> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 02a8c3e674..956f67df86 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2386,7 +2386,7 @@ bool LLAppViewer::initWindow() VIEWER_WINDOW_CLASSNAME, gSavedSettings.getS32("WindowX"), gSavedSettings.getS32("WindowY"), gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"), - FALSE, ignorePixelDepth); + gSavedSettings.getBOOL("WindowFullScreen"), ignorePixelDepth); // Need to load feature table before cheking to start watchdog. const S32 NEVER_SUBMIT_REPORT = 2; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index fb43b51deb..ea32adf5b6 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1349,8 +1349,17 @@ LLViewerWindow::LLViewerWindow( if (!LLAppViewer::instance()->restoreErrorTrap()) { LL_WARNS("Window") << " Someone took over my signal/exception handler (post createWindow)!" << LL_ENDL; - } + } + + LLCoordScreen scr; + mWindow->getSize(&scr); + if(fullscreen && ( scr.mX!=width || scr.mY!=height)) + { + llwarns << "Fullscreen has forced us in to a different resolution now using "<<scr.mX<<" x "<<scr.mY<<llendl; + gSavedSettings.setS32("FullScreenWidth",scr.mX); + gSavedSettings.setS32("FullScreenHeight",scr.mY); + } if (NULL == mWindow) { -- cgit v1.2.3 From b2ebf4c245fa4b5024c6c2bee46c426ad58cb14c Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Tue, 28 Sep 2010 17:10:40 -0700 Subject: Add XML validation in LLNotifications when loading notifications.xml and notification_visibility.xml. Reviewed by Richard. --- indra/llui/llnotifications.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'indra') diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index 46af9323e1..6e1f574935 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -1367,6 +1367,12 @@ bool LLNotifications::loadTemplates() LLNotificationTemplate::Notifications params; LLXUIParser parser; parser.readXUI(root, params, full_filename); + + if(!params.validateBlock()) + { + llerrs << "Problem reading UI Notifications file: " << full_filename << llendl; + return false; + } mTemplates.clear(); @@ -1435,6 +1441,12 @@ bool LLNotifications::loadVisibilityRules() LLXUIParser parser; parser.readXUI(root, params, full_filename); + if(!params.validateBlock()) + { + llerrs << "Problem reading UI Notification Visibility Rules file: " << full_filename << llendl; + return false; + } + mVisibilityRules.clear(); for(LLInitParam::ParamIterator<LLNotificationVisibilityRule::Params>::iterator it = params.rules.begin(), end_it = params.rules.end(); -- cgit v1.2.3 From ee50f389fd5d1b4cd07a33a3f769a0a88e45ed2b Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 28 Sep 2010 17:11:27 -0700 Subject: made menus work with empty contents --- indra/llui/llmenugl.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'indra') diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 87f01cf44f..67993988fe 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -2596,6 +2596,7 @@ LLMenuItemGL* LLMenuGL::getHighlightedItem() LLMenuItemGL* LLMenuGL::highlightNextItem(LLMenuItemGL* cur_item, BOOL skip_disabled) { + if (mItems.empty()) return NULL; // highlighting first item on a torn off menu is the // same as giving focus to it if (!cur_item && getTornOff()) @@ -2674,6 +2675,8 @@ LLMenuItemGL* LLMenuGL::highlightNextItem(LLMenuItemGL* cur_item, BOOL skip_disa LLMenuItemGL* LLMenuGL::highlightPrevItem(LLMenuItemGL* cur_item, BOOL skip_disabled) { + if (mItems.empty()) return NULL; + // highlighting first item on a torn off menu is the // same as giving focus to it if (!cur_item && getTornOff()) @@ -2986,6 +2989,11 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y) const S32 CURSOR_HEIGHT = 22; // Approximate "normal" cursor size const S32 CURSOR_WIDTH = 12; + if(menu->getChildList()->empty()) + { + return; + } + // Save click point for detecting cursor moves before mouse-up. // Must be in local coords to compare with mouseUp events. // If the mouse doesn't move, the menu will stay open ala the Mac. -- cgit v1.2.3 From 67be46c78a28864360a0ca5ba66d6044a1b9b38d Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 28 Sep 2010 17:12:50 -0700 Subject: made mIsFocusRoot a XUI param --- indra/llui/llpanel.cpp | 2 +- indra/llui/llview.cpp | 3 ++- indra/llui/llview.h | 3 ++- indra/newview/llnavigationbar.cpp | 3 --- indra/newview/llpanellogin.cpp | 2 -- indra/newview/llsidetray.cpp | 2 -- indra/newview/skins/default/xui/en/panel_bottomtray.xml | 1 + indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml | 1 + indra/newview/skins/default/xui/en/panel_login.xml | 1 + indra/newview/skins/default/xui/en/panel_navigation_bar.xml | 1 + indra/newview/skins/default/xui/en/widgets/sidetray_tab.xml | 4 ++++ 11 files changed, 13 insertions(+), 10 deletions(-) create mode 100644 indra/newview/skins/default/xui/en/widgets/sidetray_tab.xml (limited to 'indra') diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp index c8e56630f1..d0aba2733f 100644 --- a/indra/llui/llpanel.cpp +++ b/indra/llui/llpanel.cpp @@ -434,7 +434,7 @@ void LLPanel::initFromParams(const LLPanel::Params& p) //and LLView::initFromParams will use them to set visible and enabled setVisible(p.visible); setEnabled(p.enabled); - + setFocusRoot(p.focus_root); setSoundFlags(p.sound_flags); // control_name, tab_stop, focus_lost_callback, initial_value, rect, enabled, visible diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 6ac009956d..267640a226 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -102,6 +102,7 @@ LLView::Params::Params() left_pad("left_pad"), left_delta("left_delta", S32_MAX), from_xui("from_xui", false), + focus_root("focus_root", false), needs_translate("translate"), xmlns("xmlns"), xmlns_xsi("xmlns:xsi"), @@ -117,7 +118,7 @@ LLView::LLView(const LLView::Params& p) mParentView(NULL), mReshapeFlags(FOLLOWS_NONE), mFromXUI(p.from_xui), - mIsFocusRoot(FALSE), + mIsFocusRoot(p.focus_root), mLastVisible(FALSE), mNextInsertionOrdinal(0), mHoverCursor(getCursorFromString(p.hover_cursor)), diff --git a/indra/llui/llview.h b/indra/llui/llview.h index e6e0a41962..654e99563e 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -116,7 +116,8 @@ public: visible, mouse_opaque, use_bounding_rect, - from_xui; + from_xui, + focus_root; Optional<S32> tab_group, default_tab_group; diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index 58849393b4..e4f83ce6b9 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -276,9 +276,6 @@ LLNavigationBar::LLNavigationBar() // set a listener function for LoginComplete event LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLNavigationBar::handleLoginComplete, this)); - - // Necessary for focus movement among child controls - setFocusRoot(TRUE); } LLNavigationBar::~LLNavigationBar() diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 7c93d8a1f9..2f3e0875b8 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -163,8 +163,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, mHtmlAvailable( TRUE ), mListener(new LLPanelLoginListener(this)) { - setFocusRoot(TRUE); - setBackgroundVisible(FALSE); setBackgroundOpaque(TRUE); diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 521e5005e8..53d8a5c19e 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -155,8 +155,6 @@ LLSideTrayTab::LLSideTrayTab(const Params& p) mDescription(p.description), mMainPanel(NULL) { - // Necessary for focus movement among child controls - setFocusRoot(TRUE); } LLSideTrayTab::~LLSideTrayTab() diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 63068a069f..013a8090f7 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -5,6 +5,7 @@ bg_opaque_color="DkGray" chrome="true" follows="left|bottom|right" + focus_root="true" height="33" layout="topleft" left="0" diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml index efb1da4c05..b5e1a5f16d 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml @@ -10,6 +10,7 @@ layout="topleft" left="0" name="bottom_tray_lite" + focus_root="true" tab_stop="true" top="28" chrome="true" diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index 891616b838..321e6c4cda 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -5,6 +5,7 @@ height="600" layout="topleft" left="0" name="panel_login" +focus_root="true" top="600" width="996"> <panel.string diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index 082d51ed3c..8a7bd53054 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -4,6 +4,7 @@ background_visible="true" bg_opaque_color="MouseGray" follows="left|top|right" + focus_root="true" height="60" layout="topleft" name="navigation_bar" diff --git a/indra/newview/skins/default/xui/en/widgets/sidetray_tab.xml b/indra/newview/skins/default/xui/en/widgets/sidetray_tab.xml new file mode 100644 index 0000000000..aa8461d367 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/sidetray_tab.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<sidetray_tab + focus_root="true" + /> -- cgit v1.2.3 From 6c1f89ea6e0d63c59da4e3a33c9252371032b58b Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 28 Sep 2010 17:13:08 -0700 Subject: added settings to toggle grab and alt-zoom ability --- indra/newview/app_settings/settings.xml | 22 ++++++++++++++++++++++ indra/newview/lltool.cpp | 8 ++++++-- indra/newview/lltoolpie.cpp | 16 +++++++++------- 3 files changed, 37 insertions(+), 9 deletions(-) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index a83291b530..13fed89867 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -2820,6 +2820,28 @@ <key>Value</key> <integer>1</integer> </map> + <key>EnableGrab</key> + <map> + <key>Comment</key> + <string>Use Ctrl+mouse to grab and manipulate objects</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>EnableAltZoom</key> + <map> + <key>Comment</key> + <string>Use Alt+mouse to look at and zoom in on objects</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>EnableRippleWater</key> <map> <key>Comment</key> diff --git a/indra/newview/lltool.cpp b/indra/newview/lltool.cpp index 282d4e19c6..2d8ce95347 100644 --- a/indra/newview/lltool.cpp +++ b/indra/newview/lltool.cpp @@ -33,6 +33,7 @@ #include "llview.h" #include "llviewerwindow.h" +#include "llviewercontrol.h" #include "lltoolcomp.h" #include "lltoolfocus.h" #include "llfocusmgr.h" @@ -190,9 +191,12 @@ LLTool* LLTool::getOverrideTool(MASK mask) { return NULL; } - if (mask & MASK_ALT) + if (gSavedSettings.getBOOL("EnableAltZoom")) { - return LLToolCamera::getInstance(); + if (mask & MASK_ALT) + { + return LLToolCamera::getInstance(); + } } return NULL; } diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 864de018e0..2ee3e4ffed 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -1210,15 +1210,17 @@ void LLToolPie::handleDeselect() LLTool* LLToolPie::getOverrideTool(MASK mask) { - if (mask == MASK_CONTROL) + if (gSavedSettings.getBOOL("EnableGrab")) { - return LLToolGrab::getInstance(); - } - else if (mask == (MASK_CONTROL | MASK_SHIFT)) - { - return LLToolGrab::getInstance(); + if (mask == MASK_CONTROL) + { + return LLToolGrab::getInstance(); + } + else if (mask == (MASK_CONTROL | MASK_SHIFT)) + { + return LLToolGrab::getInstance(); + } } - return LLTool::getOverrideTool(mask); } -- cgit v1.2.3 From ebb492089498450d858126bce35fecf09e62324d Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 28 Sep 2010 17:13:24 -0700 Subject: added xui param to turn off drag-and-drop reordering of bottom tray buttons --- indra/newview/llbottomtray.cpp | 52 +++++++++++++++++++++++------------------- indra/newview/llbottomtray.h | 9 ++++++-- 2 files changed, 35 insertions(+), 26 deletions(-) (limited to 'indra') diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 33d006578d..b5fa198bae 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -65,31 +65,42 @@ LLDefaultChildRegistry::Register<LLBottomtrayButton> bottomtray_button("bottomtr // virtual BOOL LLBottomtrayButton::handleHover(S32 x, S32 y, MASK mask) { - S32 screenX, screenY; - localPointToScreen(x, y, &screenX, &screenY); - // pass hover to bottomtray - LLBottomTray::getInstance()->onDraggableButtonHover(screenX, screenY); - return FALSE; + if (mCanDrag) + { + S32 screenX, screenY; + localPointToScreen(x, y, &screenX, &screenY); + // pass hover to bottomtray + LLBottomTray::getInstance()->onDraggableButtonHover(screenX, screenY); + return TRUE; + } + else + { + return LLButton::handleHover(x, y, mask); + } } //virtual BOOL LLBottomtrayButton::handleMouseUp(S32 x, S32 y, MASK mask) { - S32 screenX, screenY; - localPointToScreen(x, y, &screenX, &screenY); - // pass mouse up to bottomtray - LLBottomTray::getInstance()->onDraggableButtonMouseUp(this, screenX, screenY); - LLButton::handleMouseUp(x, y, mask); - return FALSE; + if (mCanDrag) + { + S32 screenX, screenY; + localPointToScreen(x, y, &screenX, &screenY); + // pass mouse up to bottomtray + LLBottomTray::getInstance()->onDraggableButtonMouseUp(this, screenX, screenY); + } + return LLButton::handleMouseUp(x, y, mask); } //virtual BOOL LLBottomtrayButton::handleMouseDown(S32 x, S32 y, MASK mask) { - S32 screenX, screenY; - localPointToScreen(x, y, &screenX, &screenY); - // pass mouse up to bottomtray - LLBottomTray::getInstance()->onDraggableButtonMouseDown(this, screenX, screenY); - LLButton::handleMouseDown(x, y, mask); - return FALSE; + if (mCanDrag) + { + S32 screenX, screenY; + localPointToScreen(x, y, &screenX, &screenY); + // pass mouse up to bottomtray + LLBottomTray::getInstance()->onDraggableButtonMouseDown(this, screenX, screenY); + } + return LLButton::handleMouseDown(x, y, mask); } static void update_build_button_enable_state() @@ -150,8 +161,6 @@ public: { mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL); buildFromFile("panel_bottomtray_lite.xml"); - // Necessary for focus movement among child controls - setFocusRoot(TRUE); } BOOL postBuild() @@ -211,16 +220,11 @@ LLBottomTray::LLBottomTray(const LLSD&) buildFromFile("panel_bottomtray.xml"); - LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2)); - //this is to fix a crash that occurs because LLBottomTray is a singleton //and thus is deleted at the end of the viewers lifetime, but to be cleanly //destroyed LLBottomTray requires some subsystems that are long gone //LLUI::getRootView()->addChild(this); - // Necessary for focus movement among child controls - setFocusRoot(TRUE); - { mBottomTrayLite = new LLBottomTrayLite(); mBottomTrayLite->setFollowsAll(); diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index 8d8a42c553..dc98170049 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -54,7 +54,9 @@ class LLBottomtrayButton : public LLButton public: struct Params : public LLInitParam::Block<Params, LLButton::Params> { - Params(){} + Optional<bool> can_drag; + Params() + : can_drag("can_drag", true){} }; /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask); @@ -62,11 +64,14 @@ public: protected: LLBottomtrayButton(const Params& p) - : LLButton(p) + : LLButton(p), + mCanDrag(p.can_drag) { } friend class LLUICtrlFactory; + + bool mCanDrag; }; class LLBottomTray -- cgit v1.2.3 From 51ad14db881a68722530d54b5ac799a49f11264b Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 28 Sep 2010 17:13:50 -0700 Subject: moved callback registration to class that implements it --- indra/newview/llfloatercamera.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'indra') diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index ad24c6534a..b4e211a38e 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -336,6 +336,9 @@ LLFloaterCamera::LLFloaterCamera(const LLSD& val) mCurrMode(CAMERA_CTRL_MODE_PAN), mPrevMode(CAMERA_CTRL_MODE_PAN) { + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + registrar.add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2)); + } // virtual -- cgit v1.2.3 From 3bab3fc66183f124d173b4ec192c03a9205788d9 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 29 Sep 2010 15:02:32 -0700 Subject: fix for crash on exit also made handle subtyping work --- indra/llui/llhandle.h | 2 +- indra/llui/lllineeditor.h | 2 +- indra/llui/llmenugl.cpp | 24 +++++++++++------------- indra/llui/llmenugl.h | 7 +++++-- 4 files changed, 18 insertions(+), 17 deletions(-) (limited to 'indra') diff --git a/indra/llui/llhandle.h b/indra/llui/llhandle.h index a43f095d67..a198a26c22 100644 --- a/indra/llui/llhandle.h +++ b/indra/llui/llhandle.h @@ -99,9 +99,9 @@ public: { return lhs.mTombStone > rhs.mTombStone; } -protected: protected: + template<typename T> friend class LLHandle; LLPointer<LLTombStone<T> > mTombStone; private: diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 76d0187712..66fe8304e2 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -326,7 +326,7 @@ protected: std::vector<S32> mPreeditPositions; LLPreeditor::standouts_t mPreeditStandouts; - LLHandle<LLView> mContextMenuHandle; + LLHandle<LLContextMenu> mContextMenuHandle; private: // Instances that by default point to the statics but can be overidden in XML. diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 67993988fe..64f84bae7c 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -3694,9 +3694,7 @@ public: LLContextMenuBranch(const Params&); virtual ~LLContextMenuBranch() - { - delete mBranch; - } + {} // called to rebuild the draw label virtual void buildDrawLabel( void ); @@ -3704,21 +3702,21 @@ public: // onCommit() - do the primary funcationality of the menu item. virtual void onCommit( void ); - LLContextMenu* getBranch() { return mBranch; } + LLContextMenu* getBranch() { return mBranch.get(); } void setHighlight( BOOL highlight ); protected: void showSubMenu(); - LLContextMenu* mBranch; + LLHandle<LLContextMenu> mBranch; }; LLContextMenuBranch::LLContextMenuBranch(const LLContextMenuBranch::Params& p) : LLMenuItemGL(p), - mBranch( p.branch ) + mBranch( p.branch()->getHandle() ) { - mBranch->hide(); - mBranch->setParentMenuItem(this); + mBranch.get()->hide(); + mBranch.get()->setParentMenuItem(this); } // called to rebuild the draw label @@ -3727,12 +3725,12 @@ void LLContextMenuBranch::buildDrawLabel( void ) { // default enablement is this -- if any of the subitems are // enabled, this item is enabled. JC - U32 sub_count = mBranch->getItemCount(); + U32 sub_count = mBranch.get()->getItemCount(); U32 i; BOOL any_enabled = FALSE; for (i = 0; i < sub_count; i++) { - LLMenuItemGL* item = mBranch->getItem(i); + LLMenuItemGL* item = mBranch.get()->getItem(i); item->buildDrawLabel(); if (item->getEnabled() && !item->getDrawTextDisabled() ) { @@ -3754,13 +3752,13 @@ void LLContextMenuBranch::buildDrawLabel( void ) void LLContextMenuBranch::showSubMenu() { - LLMenuItemGL* menu_item = mBranch->getParentMenuItem(); + LLMenuItemGL* menu_item = mBranch.get()->getParentMenuItem(); if (menu_item != NULL && menu_item->getVisible()) { S32 center_x; S32 center_y; localPointToScreen(getRect().getWidth(), getRect().getHeight() , ¢er_x, ¢er_y); - mBranch->show(center_x, center_y); + mBranch.get()->show(center_x, center_y); } } @@ -3780,7 +3778,7 @@ void LLContextMenuBranch::setHighlight( BOOL highlight ) } else { - mBranch->hide(); + mBranch.get()->hide(); } } diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index 19b738312e..bb17bf4102 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -670,9 +670,12 @@ public: BOOL appendContextSubMenu(LLContextMenu *menu); + LLHandle<LLContextMenu> getHandle() { mHandle.bind(this); return mHandle; } + protected: - BOOL mHoveredAnyItem; - LLMenuItemGL* mHoverItem; + BOOL mHoveredAnyItem; + LLMenuItemGL* mHoverItem; + LLRootHandle<LLContextMenu> mHandle; }; -- cgit v1.2.3 From 2fd5b397ad886d7f8a8792382374cd8c678abc0d Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 29 Sep 2010 15:11:39 -0700 Subject: turn off get more and view all options in gesture combo list --- indra/newview/llnearbychatbar.cpp | 30 +++++++++++++++++++----------- indra/newview/llnearbychatbar.h | 4 ++++ 2 files changed, 23 insertions(+), 11 deletions(-) (limited to 'indra') diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 932ad75f29..836ae9a0cf 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -94,15 +94,19 @@ public: LLGestureComboList::Params::Params() : combo_button("combo_button"), - combo_list("combo_list") + combo_list("combo_list"), + get_more("get_more", true), + view_all("view_all", true) { } LLGestureComboList::LLGestureComboList(const LLGestureComboList::Params& p) -: LLUICtrl(p) - , mLabel(p.label) - , mViewAllItemIndex(0) - , mGetMoreItemIndex(0) +: LLUICtrl(p), + mLabel(p.label), + mViewAllItemIndex(-1), + mGetMoreItemIndex(-1), + mShowViewAll(p.view_all), + mShowGetMore(p.get_more) { LLBottomtrayButton::Params button_params = p.combo_button; button_params.follows.flags(FOLLOWS_LEFT|FOLLOWS_BOTTOM|FOLLOWS_RIGHT); @@ -286,12 +290,16 @@ void LLGestureComboList::refreshGestures() sortByName(); // store indices for Get More and View All items (idx is the index followed by the last added Gesture) - mGetMoreItemIndex = idx; - mViewAllItemIndex = idx + 1; - - // add Get More and View All items at the bottom - mList->addSimpleElement(LLTrans::getString("GetMoreGestures"), ADD_BOTTOM, LLSD(mGetMoreItemIndex)); - mList->addSimpleElement(LLTrans::getString("ViewAllGestures"), ADD_BOTTOM, LLSD(mViewAllItemIndex)); + if (mShowGetMore) + { + mGetMoreItemIndex = idx; + mList->addSimpleElement(LLTrans::getString("GetMoreGestures"), ADD_BOTTOM, LLSD(mGetMoreItemIndex)); + } + if (mShowViewAll) + { + mViewAllItemIndex = idx + 1; + mList->addSimpleElement(LLTrans::getString("ViewAllGestures"), ADD_BOTTOM, LLSD(mViewAllItemIndex)); + } // Insert label after sorting, at top, with separator below it mList->addSeparator(ADD_TOP); diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h index cc905736fd..033d1dd5a2 100644 --- a/indra/newview/llnearbychatbar.h +++ b/indra/newview/llnearbychatbar.h @@ -46,6 +46,8 @@ public: { Optional<LLBottomtrayButton::Params> combo_button; Optional<LLScrollListCtrl::Params> combo_list; + Optional<bool> get_more, + view_all; Params(); }; @@ -56,6 +58,8 @@ protected: LLGestureComboList(const Params&); std::vector<LLMultiGesture*> mGestures; std::string mLabel; + bool mShowViewAll; + bool mShowGetMore; LLSD::Integer mViewAllItemIndex; LLSD::Integer mGetMoreItemIndex; -- cgit v1.2.3 From 68b4d9164ccf2b3bb643f153be4d3b2821c4d9d9 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 29 Sep 2010 15:50:12 -0700 Subject: removed unworkable subclassing support from LLHandle<T> --- indra/llui/llhandle.h | 8 -------- 1 file changed, 8 deletions(-) (limited to 'indra') diff --git a/indra/llui/llhandle.h b/indra/llui/llhandle.h index a198a26c22..8c000eee48 100644 --- a/indra/llui/llhandle.h +++ b/indra/llui/llhandle.h @@ -61,13 +61,6 @@ public: return *this; } - template<typename Subclass> - LLHandle<T>& operator =(const LLHandle<Subclass>& other) - { - mTombStone = other.mTombStone; - return *this; - } - bool isDead() const { return mTombStone->getTarget() == NULL; @@ -101,7 +94,6 @@ public: } protected: - template<typename T> friend class LLHandle; LLPointer<LLTombStone<T> > mTombStone; private: -- cgit v1.2.3 From af4b2247005268dbf92f8bc6994c7048b1035454 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 29 Sep 2010 16:24:31 -0700 Subject: final fix for llcontextmenugl crash on exit --- indra/newview/lllistcontextmenu.cpp | 28 +++++++++++++--------------- indra/newview/lllistcontextmenu.h | 3 +-- 2 files changed, 14 insertions(+), 17 deletions(-) (limited to 'indra') diff --git a/indra/newview/lllistcontextmenu.cpp b/indra/newview/lllistcontextmenu.cpp index ea744072d2..6421ab42bf 100644 --- a/indra/newview/lllistcontextmenu.cpp +++ b/indra/newview/lllistcontextmenu.cpp @@ -36,7 +36,6 @@ #include "llviewermenu.h" // for LLViewerMenuHolderGL LLListContextMenu::LLListContextMenu() -: mMenu(NULL) { } @@ -51,23 +50,22 @@ LLListContextMenu::~LLListContextMenu() // of mMenu has already been deleted except of using LLHandle. EXT-4762. if (!mMenuHandle.isDead()) { - mMenu->die(); - mMenu = NULL; + mMenuHandle.get()->die(); } } void LLListContextMenu::show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y) { - if (mMenu) + LLContextMenu* menup = mMenuHandle.get(); + if (menup) { //preventing parent (menu holder) from deleting already "dead" context menus on exit - LLView* parent = mMenu->getParent(); + LLView* parent = menup->getParent(); if (parent) { - parent->removeChild(mMenu); + parent->removeChild(menup); } - delete mMenu; - mMenu = NULL; + delete menup; mUUIDs.clear(); } @@ -79,23 +77,23 @@ void LLListContextMenu::show(LLView* spawning_view, const uuid_vec_t& uuids, S32 mUUIDs.resize(uuids.size()); std::copy(uuids.begin(), uuids.end(), mUUIDs.begin()); - mMenu = createMenu(); - if (!mMenu) + menup = createMenu(); + if (!menup) { llwarns << "Context menu creation failed" << llendl; return; } - mMenuHandle = mMenu->getHandle(); - mMenu->show(x, y); - LLMenuGL::showPopup(spawning_view, mMenu, x, y); + mMenuHandle = menup->getHandle(); + menup->show(x, y); + LLMenuGL::showPopup(spawning_view, menup, x, y); } void LLListContextMenu::hide() { - if(mMenu) + if(mMenuHandle.get()) { - mMenu->hide(); + mMenuHandle.get()->hide(); } } diff --git a/indra/newview/lllistcontextmenu.h b/indra/newview/lllistcontextmenu.h index 5dedc30b0c..fabd68ee20 100644 --- a/indra/newview/lllistcontextmenu.h +++ b/indra/newview/lllistcontextmenu.h @@ -71,8 +71,7 @@ protected: static void handleMultiple(functor_t functor, const uuid_vec_t& ids); uuid_vec_t mUUIDs; - LLContextMenu* mMenu; - LLHandle<LLView> mMenuHandle; + LLHandle<LLContextMenu> mMenuHandle; }; #endif // LL_LLLISTCONTEXTMENU_H -- cgit v1.2.3 From 27f6b2ea7d9339f9ecfd3f7bbbde356cfe007848 Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Wed, 29 Sep 2010 16:51:21 -0700 Subject: Change non-visible notifications to return empty response instead of default. This is part of EXP-111. Reviewed by Richard. --- indra/llui/llnotifications.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index 6e1f574935..98718e4de7 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -182,6 +182,20 @@ bool defaultResponse(const LLSD& payload) return false; } +bool emptyResponse(const LLSD& payload) +{ + if (payload["sigtype"].asString() == "add") + { + LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID()); + if (pNotif) + { + // supply empty response + pNotif->respond(pNotif->getResponseTemplate(LLNotification::WITHOUT_DEFAULT_BUTTON)); + } + } + return false; +} + namespace LLNotificationFilters { // a sample filter @@ -1238,7 +1252,7 @@ void LLNotifications::createDefaultChannels() LLNotifications::instance().getChannel("Ignore")-> connectFailedFilter(&handleIgnoredNotification); LLNotifications::instance().getChannel("VisibilityRules")-> - connectFailedFilter(&handleIgnoredNotification); + connectFailedFilter(&emptyResponse); } bool LLNotifications::addTemplate(const std::string &name, -- cgit v1.2.3 From 6eb02995646e8c8dc91b68afde3e7f9b35aefac2 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 29 Sep 2010 17:39:44 -0700 Subject: login panel now properly nested in main_view.xml, no more z order hackery --- indra/newview/llpanellogin.cpp | 9 ++++++--- indra/newview/llviewerwindow.cpp | 1 + indra/newview/llviewerwindow.h | 2 ++ indra/newview/skins/default/xui/en/main_view.xml | 6 ++++++ 4 files changed, 15 insertions(+), 3 deletions(-) (limited to 'indra') diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 2f3e0875b8..f348692e3d 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -179,8 +179,11 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, mPasswordModified = FALSE; LLPanelLogin::sInstance = this; - // add to front so we are the bottom-most child - gViewerWindow->getRootView()->addChildInBack(this); + LLView* login_holder = gViewerWindow->getLoginPanelHolder(); + if (login_holder) + { + login_holder->addChild(this); + } // Logo mLogoImage = LLUI::getUIImage("startup_logo"); @@ -737,7 +740,7 @@ void LLPanelLogin::closePanel() { if (sInstance) { - gViewerWindow->getRootView()->removeChild( LLPanelLogin::sInstance ); + LLPanelLogin::sInstance->getParent()->removeChild( LLPanelLogin::sInstance ); delete sInstance; sInstance = NULL; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index ea32adf5b6..63d178457d 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1535,6 +1535,7 @@ void LLViewerWindow::initBase() mFloaterViewHolder = main_view->getChildView("floater_view_holder")->getHandle(); mPopupView = main_view->getChild<LLPopupView>("popup_holder"); mHintHolder = main_view->getChild<LLView>("hint_holder")->getHandle(); + mLoginPanelHolder = main_view->getChild<LLView>("login_panel_holder")->getHandle(); // Constrain floaters to inside the menu and status bar regions. gFloaterView = main_view->getChild<LLFloaterView>("Floater View"); diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 633c3a41d2..c944317933 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -288,6 +288,7 @@ public: LLView* getNonSideTrayView() { return mNonSideTrayView.get(); } LLView* getFloaterViewHolder() { return mFloaterViewHolder.get(); } LLView* getHintHolder() { return mHintHolder.get(); } + LLView* getLoginPanelHolder() { return mLoginPanelHolder.get(); } BOOL handleKey(KEY key, MASK mask); void handleScrollWheel (S32 clicks); @@ -448,6 +449,7 @@ protected: LLHandle<LLView> mNonSideTrayView; // parent of world view + bottom bar, etc...everything but the side tray LLHandle<LLView> mFloaterViewHolder; // container for floater_view LLHandle<LLView> mHintHolder; // container for hints + LLHandle<LLView> mLoginPanelHolder; // container for login panel LLPopupView* mPopupView; // container for transient popups class LLDebugText* mDebugText; // Internal class for debug text diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index 8d9ebf6e06..a4f8b35c89 100644 --- a/indra/newview/skins/default/xui/en/main_view.xml +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -206,6 +206,12 @@ name="hint_holder" mouse_opaque="false" follows="all"/> + <panel top="0" + follows="all" + height="768" + mouse_opaque="true" + name="login_panel_holder" + width="1024"/> <panel top="0" follows="all" height="768" -- cgit v1.2.3 From 900d23ffe1faad8dab66761de7f125a616b6156f Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 29 Sep 2010 21:47:54 -0700 Subject: fix for clicks not working once logged in --- indra/newview/skins/default/xui/en/main_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index a4f8b35c89..71ca33a2d0 100644 --- a/indra/newview/skins/default/xui/en/main_view.xml +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -209,7 +209,7 @@ <panel top="0" follows="all" height="768" - mouse_opaque="true" + mouse_opaque="false" name="login_panel_holder" width="1024"/> <panel top="0" -- cgit v1.2.3 From 7934dd649ec0a06965cb540fa5e95adfc2ab3090 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 29 Sep 2010 21:52:45 -0700 Subject: added show inspector menu callbacks --- indra/newview/llviewermenu.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'indra') diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index d4af5048c3..07b6a9e642 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -190,6 +190,8 @@ BOOL is_selection_buy_not_take(); S32 selection_price(); BOOL enable_take(); void handle_take(); +void handle_object_show_inspector(); +void handle_avatar_show_inspector(); bool confirm_take(const LLSD& notification, const LLSD& response); void handle_buy_object(LLSaleInfo sale_info); @@ -4368,6 +4370,33 @@ void handle_take() } } +void handle_object_show_inspector() +{ + LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); + LLViewerObject* objectp = selection->getFirstRootObject(TRUE); + if (!objectp) + { + return; + } + + LLSD params; + params["object_id"] = objectp->getID(); + LLFloaterReg::showInstance("inspect_object", params); +} + +void handle_avatar_show_inspector() +{ + LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); + if(avatar) + { + LLSD params; + params["avatar_id"] = avatar->getID(); + LLFloaterReg::showInstance("inspect_avatar", params); + } +} + + + bool confirm_take(const LLSD& notification, const LLSD& response) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); @@ -8158,6 +8187,7 @@ void initialize_menus() view_listener_t::addMenu(new LLAvatarInviteToGroup(), "Avatar.InviteToGroup"); view_listener_t::addMenu(new LLAvatarGiveCard(), "Avatar.GiveCard"); commit.add("Avatar.Eject", boost::bind(&handle_avatar_eject, LLSD())); + commit.add("Avatar.ShowInspector", boost::bind(&handle_avatar_show_inspector)); view_listener_t::addMenu(new LLAvatarSendIM(), "Avatar.SendIM"); view_listener_t::addMenu(new LLAvatarCall(), "Avatar.Call"); enable.add("Avatar.EnableCall", boost::bind(&LLAvatarActions::canCall)); @@ -8185,6 +8215,7 @@ void initialize_menus() commit.add("Object.Inspect", boost::bind(&handle_object_inspect)); commit.add("Object.Open", boost::bind(&handle_object_open)); commit.add("Object.Take", boost::bind(&handle_take)); + commit.add("Object.ShowInspector", boost::bind(&handle_object_show_inspector)); enable.add("Object.EnableOpen", boost::bind(&enable_object_open)); enable.add("Object.EnableTouch", boost::bind(&enable_object_touch, _1)); enable.add("Object.EnableDelete", boost::bind(&enable_object_delete)); -- cgit v1.2.3 From cd2b9b45faa6dfd7a4c4e72fbe5395de8ad8f98d Mon Sep 17 00:00:00 2001 From: Monroe Williams <monroe@pobox.com> Date: Thu, 30 Sep 2010 12:18:49 -0700 Subject: Cancel hidden notifications instead of using empty responses. This is more work on EXP-111. Reviewed by Richard. --- indra/llui/llnotifications.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index 98718e4de7..dd56f03237 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -196,6 +196,17 @@ bool emptyResponse(const LLSD& payload) return false; } +bool cancelNotification(const LLSD& payload) +{ + if (payload["sigtype"].asString() == "add") + { + // cancel this notification + LLNotifications::instance().cancel(LLNotifications::instance().find(payload["id"].asUUID())); + } + return false; +} + + namespace LLNotificationFilters { // a sample filter @@ -1252,7 +1263,7 @@ void LLNotifications::createDefaultChannels() LLNotifications::instance().getChannel("Ignore")-> connectFailedFilter(&handleIgnoredNotification); LLNotifications::instance().getChannel("VisibilityRules")-> - connectFailedFilter(&emptyResponse); + connectFailedFilter(&cancelNotification); } bool LLNotifications::addTemplate(const std::string &name, -- cgit v1.2.3 From 2b6d3b851fc6210e7cf6272ac0bc9f8645ca5644 Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Thu, 30 Sep 2010 14:48:36 -0700 Subject: Adding tags mechanism to notification visibility rules. Also started adding the tag 'fail' to entries in notifications.xml that are failures the user should always be told about. Reviewed by Richard. --- indra/llui/llnotifications.cpp | 34 +++++++++++++++++++++- indra/llui/llnotifications.h | 2 ++ indra/llui/llnotificationtemplate.h | 12 ++++++++ .../newview/skins/default/xui/en/notifications.xml | 23 +++++++++++++++ 4 files changed, 70 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index dd56f03237..289020fa3f 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -437,6 +437,14 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par mUniqueContext.push_back(it->key); } + for(LLInitParam::ParamIterator<LLNotificationTemplate::Tag>::const_iterator it = p.tags.begin(), + end_it = p.tags.end(); + it != end_it; + ++it) + { + mTags.push_back(it->value); + } + mForm = LLNotificationFormPtr(new LLNotificationForm(p.name, p.form_ref.form)); } @@ -716,6 +724,25 @@ bool LLNotification::hasUniquenessConstraints() const return (mTemplatep ? mTemplatep->mUnique : false); } +bool LLNotification::matchesTag(const std::string& tag) +{ + bool result = false; + + if(mTemplatep) + { + std::list<std::string>::iterator it; + for(it = mTemplatep->mTags.begin(); it != mTemplatep->mTags.end(); it++) + { + if((*it) == tag) + { + result = true; + break; + } + } + } + + return result; +} void LLNotification::setIgnored(bool ignore) { @@ -1653,7 +1680,12 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n) if(!(*it)->mTag.empty()) { - // TODO: check this notification's tag(s) against it->mTag and continue if no match is found. + // check this notification's tag(s) against it->mTag and continue if no match is found. + if(!n->matchesTag((*it)->mTag)) + { + // This rule's non-empty tag didn't match one of the notification's tags. Skip this rule. + continue; + } } // If we got here, the rule matches. Don't evaluate subsequent rules. diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index 75c67151ca..98ff035170 100644 --- a/indra/llui/llnotifications.h +++ b/indra/llui/llnotifications.h @@ -580,6 +580,8 @@ public: std::string summarize() const; bool hasUniquenessConstraints() const; + + bool matchesTag(const std::string& tag); virtual ~LLNotification() {} }; diff --git a/indra/llui/llnotificationtemplate.h b/indra/llui/llnotificationtemplate.h index 6bc0d2aaff..dfc2b10eb5 100644 --- a/indra/llui/llnotificationtemplate.h +++ b/indra/llui/llnotificationtemplate.h @@ -156,6 +156,15 @@ struct LLNotificationTemplate {} }; + struct Tag : public LLInitParam::Block<Tag> + { + Mandatory<std::string> value; + + Tag() + : value("value") + {} + }; + struct Params : public LLInitParam::Block<Params> { Mandatory<std::string> name; @@ -173,6 +182,7 @@ struct LLNotificationTemplate Optional<FormRef> form_ref; Optional<ENotificationPriority, NotificationPriorityValues> priority; + Multiple<Tag> tags; Params() @@ -276,6 +286,8 @@ struct LLNotificationTemplate // this is loaded as a name, but looked up to get the UUID upon template load. // If null, it wasn't specified. LLUUID mSoundEffect; + // List of tags that rules can match against. + std::list<std::string> mTags; }; #endif //LL_LLNOTIFICATION_TEMPLATE_H diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 5966db9d51..e36109caed 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -5046,6 +5046,7 @@ You can only claim public land in the Region you're in. name="RegionTPAccessBlocked" persist="true" type="notify"> + <tag>fail</tag> You aren't allowed in that Region due to your maturity Rating. You may need to validate your age and/or install the latest Viewer. Please go to the Knowledge Base for details on accessing areas with this maturity Rating. @@ -5056,6 +5057,7 @@ Please go to the Knowledge Base for details on accessing areas with this maturit name="URBannedFromRegion" persist="true" type="notify"> + <tag>fail</tag> You are banned from the region. </notification> @@ -5064,6 +5066,7 @@ You are banned from the region. name="NoTeenGridAccess" persist="true" type="notify"> + <tag>fail</tag> Your account cannot connect to this teen grid region. </notification> @@ -5072,6 +5075,7 @@ Your account cannot connect to this teen grid region. name="ImproperPaymentStatus" persist="true" type="notify"> + <tag>fail</tag> You do not have proper payment status to enter this region. </notification> @@ -5080,6 +5084,7 @@ You do not have proper payment status to enter this region. name="MustGetAgeRgion" persist="true" type="notify"> + <tag>fail</tag> You must be age-verified to enter this region. </notification> @@ -5088,6 +5093,7 @@ You must be age-verified to enter this region. name="MustGetAgeParcel" persist="true" type="notify"> + <tag>fail</tag> You must be age-verified to enter this parcel. </notification> @@ -5096,6 +5102,7 @@ You must be age-verified to enter this parcel. name="NoDestRegion" persist="true" type="notify"> + <tag>fail</tag> No destination region found. </notification> @@ -5104,6 +5111,7 @@ No destination region found. name="NotAllowedInDest" persist="true" type="notify"> + <tag>fail</tag> You are not allowed into the destination. </notification> @@ -5112,6 +5120,7 @@ You are not allowed into the destination. name="RegionParcelBan" persist="true" type="notify"> + <tag>fail</tag> Cannot region cross into banned parcel. Try another way. </notification> @@ -5128,6 +5137,7 @@ You have been redirected to a telehub. name="CouldntTPCloser" persist="true" type="notify"> + <tag>fail</tag> Could not teleport closer to destination. </notification> @@ -5144,6 +5154,7 @@ Teleport cancelled. name="FullRegionTryAgain" persist="true" type="notify"> + <tag>fail</tag> The region you are attempting to enter is currently full. Please try again in a few moments. </notification> @@ -5153,6 +5164,7 @@ Please try again in a few moments. name="GeneralFailure" persist="true" type="notify"> + <tag>fail</tag> General failure. </notification> @@ -5161,6 +5173,7 @@ General failure. name="RoutedWrongRegion" persist="true" type="notify"> + <tag>fail</tag> Routed to wrong region. Please try again. </notification> @@ -5169,6 +5182,7 @@ Routed to wrong region. Please try again. name="NoValidAgentID" persist="true" type="notify"> + <tag>fail</tag> No valid agent id. </notification> @@ -5177,6 +5191,7 @@ No valid agent id. name="NoValidSession" persist="true" type="notify"> + <tag>fail</tag> No valid session id. </notification> @@ -5185,6 +5200,7 @@ No valid session id. name="NoValidCircuit" persist="true" type="notify"> + <tag>fail</tag> No valid circuit code. </notification> @@ -5193,6 +5209,7 @@ No valid circuit code. name="NoValidTimestamp" persist="true" type="notify"> + <tag>fail</tag> No valid timestamp. </notification> @@ -5201,6 +5218,7 @@ No valid timestamp. name="NoPendingConnection" persist="true" type="notify"> + <tag>fail</tag> Unable to create pending connection. </notification> @@ -5209,6 +5227,7 @@ Unable to create pending connection. name="InternalUsherError" persist="true" type="notify"> + <tag>fail</tag> Internal error attempting to connect agent usher. </notification> @@ -5217,6 +5236,7 @@ Internal error attempting to connect agent usher. name="NoGoodTPDestination" persist="true" type="notify"> + <tag>fail</tag> Unable to find a good teleport destination in this region. </notification> @@ -5225,6 +5245,7 @@ Unable to find a good teleport destination in this region. name="InternalErrorRegionResolver" persist="true" type="notify"> + <tag>fail</tag> Internal error attempting to activate region resolver. </notification> @@ -5233,6 +5254,7 @@ Internal error attempting to activate region resolver. name="NoValidLanding" persist="true" type="notify"> + <tag>fail</tag> A valid landing point could not be found. </notification> @@ -5241,6 +5263,7 @@ A valid landing point could not be found. name="NoValidParcel" persist="true" type="notify"> + <tag>fail</tag> No valid parcel could be found. </notification> -- cgit v1.2.3 From c02f8c7eba89483b915864f9f914cac2cdfc8464 Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Thu, 30 Sep 2010 15:03:29 -0700 Subject: Added "win" tag to selected notifications. --- indra/newview/skins/default/xui/en/notifications.xml | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'indra') diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index e36109caed..7dd7cefa5d 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -3118,6 +3118,7 @@ You have reached your maximum number of groups. Please leave some group before j icon="alert.tga" name="KickUser" type="alert"> + <tag>win</tag> Kick this Resident with what message? <form name="form"> <input name="message" type="text"> @@ -3139,6 +3140,7 @@ An administrator has logged you off. icon="alert.tga" name="KickAllUsers" type="alert"> + <tag>win</tag> Kick everyone currently on the grid with what message? <form name="form"> <input name="message" type="text"> @@ -3160,6 +3162,7 @@ An administrator has logged you off. icon="alert.tga" name="FreezeUser" type="alert"> + <tag>win</tag> Freeze this Resident with what message? <form name="form"> <input name="message" type="text"> @@ -3181,6 +3184,7 @@ You have been frozen. You cannot move or chat. An administrator will contact you icon="alert.tga" name="UnFreezeUser" type="alert"> + <tag>win</tag> Unfreeze this Resident with what message? <form name="form"> <input name="message" type="text"> @@ -5640,6 +5644,7 @@ Grant this request? name="FirstBalanceIncrease" persist="true" type="notify"> + <tag>win</tag> You just received L$[AMOUNT]. Your L$ balance is shown in the upper-right. </notification> @@ -6118,6 +6123,7 @@ The SLurl you clicked on is not supported. name="BlockedSLURL" priority="high" type="notifytip"> + <tag>win</tag> A SLurl was received from an untrusted browser and has been blocked for your security. </notification> -- cgit v1.2.3 From 6b2f40b772f99d1f7c0b2e3779e612a076aa8f86 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 30 Sep 2010 15:17:32 -0700 Subject: fix for preferences window not visible on login --- indra/newview/skins/default/xui/en/main_view.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'indra') diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index 71ca33a2d0..7c588fd10c 100644 --- a/indra/newview/skins/default/xui/en/main_view.xml +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -8,6 +8,12 @@ tab_stop="false" name="main_view" width="1024"> + <panel top="0" + follows="all" + height="768" + mouse_opaque="false" + name="login_panel_holder" + width="1024"/> <layout_stack border_size="0" follows="all" mouse_opaque="false" @@ -121,7 +127,7 @@ user_resize="false" visible="false" width="333"/> - </layout_stack> + </layout_stack> <panel follows="all" height="500" left="0" @@ -206,12 +212,6 @@ name="hint_holder" mouse_opaque="false" follows="all"/> - <panel top="0" - follows="all" - height="768" - mouse_opaque="false" - name="login_panel_holder" - width="1024"/> <panel top="0" follows="all" height="768" -- cgit v1.2.3 From 5cfb82892fec41d121b7c55a9fcea46d2d395897 Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Thu, 30 Sep 2010 16:11:08 -0700 Subject: Code changes for "EXP-126 Create destination guide popup at bottom of screen" --- indra/newview/llviewermenu.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'indra') diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 07b6a9e642..0ff5181cc5 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -844,6 +844,25 @@ class LLAdvancedCheckFeature : public view_listener_t } }; +void LLDestinationGuideToggle() +{ + LLView* destination_guide = gViewerWindow->getRootView()->getChildView("destination_guide_container"); + if ( destination_guide ) + { + if ( destination_guide->getVisible() ) + { + destination_guide->setVisible( FALSE ); + } + else + { + destination_guide->setVisible( true ); + } + } + else + { + llwarns << "ERROR: unable to find destination guide container" << llendl; + } +}; ////////////////// // INFO DISPLAY // @@ -8275,4 +8294,6 @@ void initialize_menus() view_listener_t::addMenu(new LLEditableSelectedMono(), "EditableSelectedMono"); view_listener_t::addMenu(new LLToggleUIHints(), "ToggleUIHints"); + + commit.add("DestinationGuide.toggle", boost::bind(&LLDestinationGuideToggle)); } -- cgit v1.2.3 From 364ca4e55fd99ad0da15cd6fa176c2009f52b729 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 30 Sep 2010 16:13:56 -0700 Subject: added macro for easier static registration --- indra/llxuixml/llregistry.h | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'indra') diff --git a/indra/llxuixml/llregistry.h b/indra/llxuixml/llregistry.h index eee9933739..80e654854a 100644 --- a/indra/llxuixml/llregistry.h +++ b/indra/llxuixml/llregistry.h @@ -343,4 +343,9 @@ private: ScopedRegistrar* mStaticScope; }; +// helper macro for doing static registration +#define GLUED_TOKEN(x, y) x ## y +#define GLUE_TOKENS(x, y) GLUED_TOKEN(x, y) +#define LLREGISTER_STATIC(REGISTRY, KEY, VALUE) static REGISTRY::StaticRegistrar GLUE_TOKENS(reg, __COUNTER__)(KEY, VALUE); + #endif -- cgit v1.2.3 From e7834520c725de122f2e62387e2563723735ab4e Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 30 Sep 2010 16:43:16 -0700 Subject: fixed line ending --- indra/llxuixml/llregistry.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/llxuixml/llregistry.h b/indra/llxuixml/llregistry.h index 80e654854a..546cf38eb5 100644 --- a/indra/llxuixml/llregistry.h +++ b/indra/llxuixml/llregistry.h @@ -343,8 +343,8 @@ private: ScopedRegistrar* mStaticScope; }; -// helper macro for doing static registration -#define GLUED_TOKEN(x, y) x ## y +// helper macro for doing static registration +#define GLUED_TOKEN(x, y) x ## y #define GLUE_TOKENS(x, y) GLUED_TOKEN(x, y) #define LLREGISTER_STATIC(REGISTRY, KEY, VALUE) static REGISTRY::StaticRegistrar GLUE_TOKENS(reg, __COUNTER__)(KEY, VALUE); -- cgit v1.2.3 From 7f003fa20df6ed60532271084696076ee61128de Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 30 Sep 2010 16:43:44 -0700 Subject: converted keys.ini to keys.xml and use LLInitParam parsing --- indra/newview/app_settings/keys.xml | 350 ++++++++++++++++++++++++++++++++++++ indra/newview/llappviewer.cpp | 20 ++- indra/newview/llviewerkeyboard.cpp | 145 ++++++++++----- indra/newview/llviewerkeyboard.h | 34 +++- 4 files changed, 497 insertions(+), 52 deletions(-) create mode 100644 indra/newview/app_settings/keys.xml (limited to 'indra') diff --git a/indra/newview/app_settings/keys.xml b/indra/newview/app_settings/keys.xml new file mode 100644 index 0000000000..d085475c6c --- /dev/null +++ b/indra/newview/app_settings/keys.xml @@ -0,0 +1,350 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<keys> + <first_person> + <binding key="A" mask="NONE" command="slide_left"/> + <binding key="D" mask="NONE" command="slide_right"/> + <binding key="W" mask="NONE" command="push_forward"/> + <binding key="S" mask="NONE" command="push_backward"/> + <binding key="E" mask="NONE" command="jump"/> + <binding key="C" mask="NONE" command="push_down"/> + <binding key="F" mask="NONE" command="toggle_fly"/> + + <binding key="LEFT" mask="NONE" command="slide_left"/> + <binding key="RIGHT" mask="NONE" command="slide_right"/> + <binding key="UP" mask="NONE" command="push_forward"/> + <binding key="DOWN" mask="NONE" command="push_backward"/> + <binding key="PGUP" mask="NONE" command="jump"/> + <binding key="PGDN" mask="NONE" command="push_down"/> + <binding key="HOME" mask="NONE" command="toggle_fly"/> + + <binding key="PAD_LEFT" mask="NONE" command="slide_left"/> + <binding key="PAD_RIGHT" mask="NONE" command="slide_right"/> + <binding key="PAD_UP" mask="NONE" command="push_forward"/> + <binding key="PAD_DOWN" mask="NONE" command="push_backward"/> + <binding key="PAD_PGUP" mask="NONE" command="jump"/> + <binding key="PAD_PGDN" mask="NONE" command="push_down"/> + <binding key="PAD_HOME" mask="NONE" command="toggle_fly"/> + <binding key="PAD_CENTER" mask="NONE" command="stop_moving"/> + <binding key="PAD_ENTER" mask="NONE" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/> + + <binding key="A" mask="SHIFT" command="slide_left"/> + <binding key="D" mask="SHIFT" command="slide_right"/> + <binding key="W" mask="SHIFT" command="push_forward"/> + <binding key="S" mask="SHIFT" command="push_backward"/> + <binding key="E" mask="SHIFT" command="jump"/> + <binding key="C" mask="SHIFT" command="push_down"/> + <binding key="F" mask="SHIFT" command="toggle_fly"/> + + <binding key="SPACE" mask="NONE" command="stop_moving"/> + <binding key="ENTER" mask="NONE" command="start_chat"/> + <binding key="DIVIDE" mask="NONE" command="start_gesture"/> + + <binding key="LEFT" mask="SHIFT" command="slide_left"/> + <binding key="RIGHT" mask="SHIFT" command="slide_right"/> + <binding key="UP" mask="SHIFT" command="push_forward"/> + <binding key="DOWN" mask="SHIFT" command="push_backward"/> + <binding key="PGUP" mask="SHIFT" command="jump"/> + <binding key="PGDN" mask="SHIFT" command="push_down"/> + + <binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/> + <binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/> + <binding key="PAD_UP" mask="SHIFT" command="push_forward"/> + <binding key="PAD_DOWN" mask="SHIFT" command="push_backward"/> + <binding key="PAD_PGUP" mask="SHIFT" command="jump"/> + <binding key="PAD_PGDN" mask="SHIFT" command="push_down"/> + <binding key="PAD_HOME" mask="SHIFT" command="toggle_fly"/> + <binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/> + </first_person> + <third_person> + <binding key="A" mask="NONE" command="turn_left"/> + <binding key="D" mask="NONE" command="turn_right"/> + <binding key="A" mask="SHIFT" command="slide_left"/> + <binding key="D" mask="SHIFT" command="slide_right"/> + <binding key="W" mask="NONE" command="push_forward"/> + <binding key="S" mask="NONE" command="push_backward"/> + <binding key="W" mask="SHIFT" command="push_forward"/> + <binding key="S" mask="SHIFT" command="push_backward"/> + <binding key="E" mask="NONE" command="jump"/> + <binding key="C" mask="NONE" command="push_down"/> + <binding key="E" mask="SHIFT" command="jump"/> + <binding key="C" mask="SHIFT" command="push_down"/> + + <binding key="F" mask="NONE" command="toggle_fly"/> + <binding key="F" mask="SHIFT" command="toggle_fly"/> + + <binding key="SPACE" mask="NONE" command="stop_moving"/> + <binding key="ENTER" mask="NONE" command="start_chat"/> + <binding key="DIVIDE" mask="NONE" command="start_gesture"/> + + <binding key="LEFT" mask="NONE" command="turn_left"/> + <binding key="LEFT" mask="SHIFT" command="slide_left"/> + <binding key="RIGHT" mask="NONE" command="turn_right"/> + <binding key="RIGHT" mask="SHIFT" command="slide_right"/> + <binding key="UP" mask="NONE" command="push_forward"/> + <binding key="DOWN" mask="NONE" command="push_backward"/> + <binding key="UP" mask="SHIFT" command="push_forward"/> + <binding key="DOWN" mask="SHIFT" command="push_backward"/> + <binding key="PGUP" mask="NONE" command="jump"/> + <binding key="PGDN" mask="NONE" command="push_down"/> + <binding key="PGUP" mask="SHIFT" command="jump"/> + <binding key="PGDN" mask="SHIFT" command="push_down"/> + <binding key="HOME" mask="SHIFT" command="toggle_fly"/> + <binding key="HOME" mask="NONE" command="toggle_fly"/> + + <binding key="PAD_LEFT" mask="NONE" command="turn_left"/> + <binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/> + <binding key="PAD_RIGHT" mask="NONE" command="turn_right"/> + <binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/> + <binding key="PAD_UP" mask="NONE" command="push_forward"/> + <binding key="PAD_DOWN" mask="NONE" command="push_backward"/> + <binding key="PAD_UP" mask="SHIFT" command="push_forward"/> + <binding key="PAD_DOWN" mask="SHIFT" command="push_backward"/> + <binding key="PAD_PGUP" mask="NONE" command="jump"/> + <binding key="PAD_PGDN" mask="NONE" command="push_down"/> + <binding key="PAD_PGUP" mask="SHIFT" command="jump"/> + <binding key="PAD_PGDN" mask="SHIFT" command="push_down"/> + <binding key="PAD_HOME" mask="NONE" command="toggle_fly"/> + <binding key="PAD_HOME" mask="SHIFT" command="toggle_fly"/> + <binding key="PAD_CENTER" mask="NONE" command="stop_moving"/> + <binding key="PAD_CENTER" mask="SHIFT" command="stop_moving"/> + <binding key="PAD_ENTER" mask="NONE" command="start_chat"/> + <binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/> + <binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/> + + <!--Camera controls in third person on Alt--> + <binding key="LEFT" mask="ALT" command="spin_around_cw"/> + <binding key="RIGHT" mask="ALT" command="spin_around_ccw"/> + <binding key="UP" mask="ALT" command="move_forward"/> + <binding key="DOWN" mask="ALT" command="move_backward"/> + <binding key="PGUP" mask="ALT" command="spin_over"/> + <binding key="PGDN" mask="ALT" command="spin_under"/> + + <binding key="A" mask="ALT" command="spin_around_cw"/> + <binding key="D" mask="ALT" command="spin_around_ccw"/> + <binding key="W" mask="ALT" command="move_forward"/> + <binding key="S" mask="ALT" command="move_backward"/> + <binding key="E" mask="ALT" command="spin_over"/> + <binding key="C" mask="ALT" command="spin_under"/> + + <binding key="PAD_LEFT" mask="ALT" command="spin_around_cw"/> + <binding key="PAD_RIGHT" mask="ALT" command="spin_around_ccw"/> + <binding key="PAD_UP" mask="ALT" command="move_forward"/> + <binding key="PAD_DOWN" mask="ALT" command="move_backward"/> + <binding key="PAD_PGUP" mask="ALT" command="spin_over"/> + <binding key="PAD_PGDN" mask="ALT" command="spin_under"/> + <binding key="PAD_ENTER" mask="ALT" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="ALT" command="start_gesture"/> + + <!--mimic alt zoom behavior with keyboard only--> + <binding key="A" mask="CTL_ALT" command="spin_around_cw"/> + <binding key="D" mask="CTL_ALT" command="spin_around_ccw"/> + <binding key="W" mask="CTL_ALT" command="spin_over"/> + <binding key="S" mask="CTL_ALT" command="spin_under"/> + <binding key="E" mask="CTL_ALT" command="spin_over"/> + <binding key="C" mask="CTL_ALT" command="spin_under"/> + + <binding key="LEFT" mask="CTL_ALT" command="spin_around_cw"/> + <binding key="RIGHT" mask="CTL_ALT" command="spin_around_ccw"/> + <binding key="UP" mask="CTL_ALT" command="spin_over"/> + <binding key="DOWN" mask="CTL_ALT" command="spin_under"/> + <binding key="PGUP" mask="CTL_ALT" command="spin_over"/> + <binding key="PGDN" mask="CTL_ALT" command="spin_under"/> + + <binding key="PAD_LEFT" mask="CTL_ALT" command="spin_around_cw"/> + <binding key="PAD_RIGHT" mask="CTL_ALT" command="spin_around_ccw"/> + <binding key="PAD_UP" mask="CTL_ALT" command="spin_over"/> + <binding key="PAD_DOWN" mask="CTL_ALT" command="spin_under"/> + <binding key="PAD_PGUP" mask="CTL_ALT" command="spin_over"/> + <binding key="PAD_PGDN" mask="CTL_ALT" command="spin_under"/> + <binding key="PAD_ENTER" mask="CTL_ALT" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="CTL_ALT" command="start_gesture"/> + + <!--Therefore pan on Alt-Shift--> + <binding key="A" mask="CTL_ALT_SHIFT" command="pan_left"/> + <binding key="D" mask="CTL_ALT_SHIFT" command="pan_right"/> + <binding key="W" mask="CTL_ALT_SHIFT" command="pan_up"/> + <binding key="S" mask="CTL_ALT_SHIFT" command="pan_down"/> + + <binding key="LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/> + <binding key="RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/> + <binding key="UP" mask="CTL_ALT_SHIFT" command="pan_up"/> + <binding key="DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/> + + <binding key="PAD_LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/> + <binding key="PAD_RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/> + <binding key="PAD_UP" mask="CTL_ALT_SHIFT" command="pan_up"/> + <binding key="PAD_DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/> + <binding key="PAD_ENTER" mask="CTL_ALT_SHIFT" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="CTL_ALT_SHIFT" command="start_gesture"/> + </third_person> + + # Basic editing camera control + <edit> + <binding key="A" mask="NONE" command="spin_around_cw"/> + <binding key="D" mask="NONE" command="spin_around_ccw"/> + <binding key="W" mask="NONE" command="move_forward"/> + <binding key="S" mask="NONE" command="move_backward"/> + <binding key="E" mask="NONE" command="spin_over"/> + <binding key="C" mask="NONE" command="spin_under"/> + <binding key="ENTER" mask="NONE" command="start_chat"/> + <binding key="DIVIDE" mask="NONE" command="start_gesture"/> + <binding key="PAD_ENTER" mask="NONE" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/> + + <binding key="LEFT" mask="NONE" command="spin_around_cw"/> + <binding key="RIGHT" mask="NONE" command="spin_around_ccw"/> + <binding key="UP" mask="NONE" command="move_forward"/> + <binding key="DOWN" mask="NONE" command="move_backward"/> + <binding key="PGUP" mask="NONE" command="spin_over"/> + <binding key="PGDN" mask="NONE" command="spin_under"/> + + <binding key="A" mask="SHIFT" command="pan_left"/> + <binding key="D" mask="SHIFT" command="pan_right"/> + <binding key="W" mask="SHIFT" command="pan_up"/> + <binding key="S" mask="SHIFT" command="pan_down"/> + + <binding key="LEFT" mask="SHIFT" command="pan_left"/> + <binding key="RIGHT" mask="SHIFT" command="pan_right"/> + <binding key="UP" mask="SHIFT" command="pan_up"/> + <binding key="DOWN" mask="SHIFT" command="pan_down"/> + + <!--Walking works with ALT held down.--> + <binding key="A" mask="ALT" command="slide_left"/> + <binding key="D" mask="ALT" command="slide_right"/> + <binding key="W" mask="ALT" command="push_forward"/> + <binding key="S" mask="ALT" command="push_backward"/> + <binding key="E" mask="ALT" command="jump"/> + <binding key="C" mask="ALT" command="push_down"/> + + <binding key="LEFT" mask="ALT" command="slide_left"/> + <binding key="RIGHT" mask="ALT" command="slide_right"/> + <binding key="UP" mask="ALT" command="push_forward"/> + <binding key="DOWN" mask="ALT" command="push_backward"/> + <binding key="PGUP" mask="ALT" command="jump"/> + <binding key="PGDN" mask="ALT" command="push_down"/> + <binding key="HOME" mask="ALT" command="toggle_fly"/> + + <binding key="PAD_LEFT" mask="ALT" command="slide_left"/> + <binding key="PAD_RIGHT" mask="ALT" command="slide_right"/> + <binding key="PAD_UP" mask="ALT" command="push_forward"/> + <binding key="PAD_DOWN" mask="ALT" command="push_backward"/> + <binding key="PAD_PGUP" mask="ALT" command="jump"/> + <binding key="PAD_PGDN" mask="ALT" command="push_down"/> + <binding key="PAD_ENTER" mask="ALT" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="ALT" command="start_gesture"/> + </edit> + <sitting> + <binding key="A" mask="ALT" command="spin_around_cw"/> + <binding key="D" mask="ALT" command="spin_around_ccw"/> + <binding key="W" mask="ALT" command="move_forward"/> + <binding key="S" mask="ALT" command="move_backward"/> + <binding key="E" mask="ALT" command="spin_over_sitting"/> + <binding key="C" mask="ALT" command="spin_under_sitting"/> + + <binding key="LEFT" mask="ALT" command="spin_around_cw"/> + <binding key="RIGHT" mask="ALT" command="spin_around_ccw"/> + <binding key="UP" mask="ALT" command="move_forward"/> + <binding key="DOWN" mask="ALT" command="move_backward"/> + <binding key="PGUP" mask="ALT" command="spin_over"/> + <binding key="PGDN" mask="ALT" command="spin_under"/> + + <binding key="A" mask="CTL_ALT" command="spin_around_cw"/> + <binding key="D" mask="CTL_ALT" command="spin_around_ccw"/> + <binding key="W" mask="CTL_ALT" command="spin_over"/> + <binding key="S" mask="CTL_ALT" command="spin_under"/> + <binding key="E" mask="CTL_ALT" command="spin_over"/> + <binding key="C" mask="CTL_ALT" command="spin_under"/> + + <binding key="LEFT" mask="CTL_ALT" command="spin_around_cw"/> + <binding key="RIGHT" mask="CTL_ALT" command="spin_around_ccw"/> + <binding key="UP" mask="CTL_ALT" command="spin_over"/> + <binding key="DOWN" mask="CTL_ALT" command="spin_under"/> + <binding key="PGUP" mask="CTL_ALT" command="spin_over"/> + <binding key="PGDN" mask="CTL_ALT" command="spin_under"/> + + + <binding key="A" mask="NONE" command="spin_around_cw_sitting"/> + <binding key="D" mask="NONE" command="spin_around_ccw_sitting"/> + <binding key="W" mask="NONE" command="move_forward_sitting"/> + <binding key="S" mask="NONE" command="move_backward_sitting"/> + <binding key="E" mask="NONE" command="spin_over_sitting"/> + <binding key="C" mask="NONE" command="spin_under_sitting"/> + + <binding key="LEFT" mask="NONE" command="spin_around_cw_sitting"/> + <binding key="RIGHT" mask="NONE" command="spin_around_ccw_sitting"/> + <binding key="UP" mask="NONE" command="move_forward_sitting"/> + <binding key="DOWN" mask="NONE" command="move_backward_sitting"/> + <binding key="PGUP" mask="NONE" command="spin_over_sitting"/> + <binding key="PGDN" mask="NONE" command="spin_under_sitting"/> + + <binding key="PAD_LEFT" mask="NONE" command="spin_around_cw_sitting"/> + <binding key="PAD_RIGHT" mask="NONE" command="spin_around_ccw_sitting"/> + <binding key="PAD_UP" mask="NONE" command="move_forward_sitting"/> + <binding key="PAD_DOWN" mask="NONE" command="move_backward_sitting"/> + <binding key="PAD_PGUP" mask="NONE" command="spin_over_sitting"/> + <binding key="PAD_PGDN" mask="NONE" command="spin_under_sitting"/> + <binding key="PAD_CENTER" mask="NONE" command="stop_moving"/> + <binding key="PAD_ENTER" mask="NONE" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/> + + <!--these are for passing controls when sitting on vehicles--> + <binding key="A" mask="SHIFT" command="slide_left"/> + <binding key="D" mask="SHIFT" command="slide_right"/> + <binding key="LEFT" mask="SHIFT" command="slide_left"/> + <binding key="RIGHT" mask="SHIFT" command="slide_right"/> + + <binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/> + <binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/> + <binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/> + + <!--pan on Alt-Shift--> + <binding key="A" mask="CTL_ALT_SHIFT" command="pan_left"/> + <binding key="D" mask="CTL_ALT_SHIFT" command="pan_right"/> + <binding key="W" mask="CTL_ALT_SHIFT" command="pan_up"/> + <binding key="S" mask="CTL_ALT_SHIFT" command="pan_down"/> + + <binding key="LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/> + <binding key="RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/> + <binding key="UP" mask="CTL_ALT_SHIFT" command="pan_up"/> + <binding key="DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/> + + <binding key="PAD_LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/> + <binding key="PAD_RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/> + <binding key="PAD_UP" mask="CTL_ALT_SHIFT" command="pan_up"/> + <binding key="PAD_DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/> + <binding key="PAD_ENTER" mask="CTL_ALT_SHIFT" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="CTL_ALT_SHIFT" command="start_gesture"/> + + <binding key="ENTER" mask="NONE" command="start_chat"/> + <binding key="DIVIDE" mask="NONE" command="start_gesture"/> + </sitting> + <edit_avatar> + <!--Avatar editing camera controls--> + <binding key="A" mask="NONE" command="edit_avatar_spin_cw"/> + <binding key="D" mask="NONE" command="edit_avatar_spin_ccw"/> + <binding key="W" mask="NONE" command="edit_avatar_move_forward"/> + <binding key="S" mask="NONE" command="edit_avatar_move_backward"/> + <binding key="E" mask="NONE" command="edit_avatar_spin_over"/> + <binding key="C" mask="NONE" command="edit_avatar_spin_under"/> + <binding key="LEFT" mask="NONE" command="edit_avatar_spin_cw"/> + <binding key="RIGHT" mask="NONE" command="edit_avatar_spin_ccw"/> + <binding key="UP" mask="NONE" command="edit_avatar_move_forward"/> + <binding key="DOWN" mask="NONE" command="edit_avatar_move_backward"/> + <binding key="PGUP" mask="NONE" command="edit_avatar_spin_over"/> + <binding key="PGDN" mask="NONE" command="edit_avatar_spin_under"/> + <binding key="ENTER" mask="NONE" command="start_chat"/> + <binding key="DIVIDE" mask="NONE" command="start_gesture"/> + <binding key="PAD_LEFT" mask="NONE" command="edit_avatar_spin_cw"/> + <binding key="PAD_RIGHT" mask="NONE" command="edit_avatar_spin_ccw"/> + <binding key="PAD_UP" mask="NONE" command="edit_avatar_move_forward"/> + <binding key="PAD_DOWN" mask="NONE" command="edit_avatar_move_backward"/> + <binding key="PAD_PGUP" mask="NONE" command="edit_avatar_spin_over"/> + <binding key="PAD_PGDN" mask="NONE" command="edit_avatar_spin_under"/> + <binding key="PAD_ENTER" mask="NONE" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/> + </edit_avatar> +</keys> \ No newline at end of file diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 956f67df86..a9bdabe794 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -820,16 +820,22 @@ bool LLAppViewer::init() gGLManager.getGLInfo(gDebugInfo); gGLManager.printGLInfoString(); - //load key settings - bind_keyboard_functions(); - // Load Default bindings - if (!gViewerKeyboard.loadBindings(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"keys.ini"))) + std::string key_bindings_file = gDirUtilp->findFile("keys.xml", + gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, ""), + gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")); + + + if (!gViewerKeyboard.loadBindingsXML(key_bindings_file)) { - LL_ERRS("InitInfo") << "Unable to open keys.ini" << LL_ENDL; + std::string key_bindings_file = gDirUtilp->findFile("keys.ini", + gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, ""), + gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")); + if (!gViewerKeyboard.loadBindings(key_bindings_file)) + { + LL_ERRS("InitInfo") << "Unable to open keys.ini" << LL_ENDL; + } } - // Load Custom bindings (override defaults) - gViewerKeyboard.loadBindings(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"custom_keys.ini")); // If we don't have the right GL requirements, exit. if (!gGLManager.mHasRequirements && !gNoRender) diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index d7e15e7d6c..570f372950 100644 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -40,6 +40,7 @@ #include "llviewerwindow.h" #include "llvoavatarself.h" #include "llfloatercamera.h" +#include "llinitparam.h" // // Constants @@ -53,6 +54,11 @@ const S32 NUDGE_FRAMES = 2; const F32 ORBIT_NUDGE_RATE = 0.05f; // fraction of normal speed const F32 YAW_NUDGE_RATE = 0.05f; // fraction of normal speed +struct LLKeyboardActionRegistry +: public LLRegistrySingleton<std::string, boost::function<void (EKeystate keystate)>, LLKeyboardActionRegistry> +{ +}; + LLViewerKeyboard gViewerKeyboard; void agent_jump( EKeystate s ) @@ -550,49 +556,47 @@ void start_gesture( EKeystate s ) } } -void bind_keyboard_functions() -{ - gViewerKeyboard.bindNamedFunction("jump", agent_jump); - gViewerKeyboard.bindNamedFunction("push_down", agent_push_down); - gViewerKeyboard.bindNamedFunction("push_forward", agent_push_forward); - gViewerKeyboard.bindNamedFunction("push_backward", agent_push_backward); - gViewerKeyboard.bindNamedFunction("look_up", agent_look_up); - gViewerKeyboard.bindNamedFunction("look_down", agent_look_down); - gViewerKeyboard.bindNamedFunction("toggle_fly", agent_toggle_fly); - gViewerKeyboard.bindNamedFunction("turn_left", agent_turn_left); - gViewerKeyboard.bindNamedFunction("turn_right", agent_turn_right); - gViewerKeyboard.bindNamedFunction("slide_left", agent_slide_left); - gViewerKeyboard.bindNamedFunction("slide_right", agent_slide_right); - gViewerKeyboard.bindNamedFunction("spin_around_ccw", camera_spin_around_ccw); - gViewerKeyboard.bindNamedFunction("spin_around_cw", camera_spin_around_cw); - gViewerKeyboard.bindNamedFunction("spin_around_ccw_sitting", camera_spin_around_ccw_sitting); - gViewerKeyboard.bindNamedFunction("spin_around_cw_sitting", camera_spin_around_cw_sitting); - gViewerKeyboard.bindNamedFunction("spin_over", camera_spin_over); - gViewerKeyboard.bindNamedFunction("spin_under", camera_spin_under); - gViewerKeyboard.bindNamedFunction("spin_over_sitting", camera_spin_over_sitting); - gViewerKeyboard.bindNamedFunction("spin_under_sitting", camera_spin_under_sitting); - gViewerKeyboard.bindNamedFunction("move_forward", camera_move_forward); - gViewerKeyboard.bindNamedFunction("move_backward", camera_move_backward); - gViewerKeyboard.bindNamedFunction("move_forward_sitting", camera_move_forward_sitting); - gViewerKeyboard.bindNamedFunction("move_backward_sitting", camera_move_backward_sitting); - gViewerKeyboard.bindNamedFunction("pan_up", camera_pan_up); - gViewerKeyboard.bindNamedFunction("pan_down", camera_pan_down); - gViewerKeyboard.bindNamedFunction("pan_left", camera_pan_left); - gViewerKeyboard.bindNamedFunction("pan_right", camera_pan_right); - gViewerKeyboard.bindNamedFunction("pan_in", camera_pan_in); - gViewerKeyboard.bindNamedFunction("pan_out", camera_pan_out); - gViewerKeyboard.bindNamedFunction("move_forward_fast", camera_move_forward_fast); - gViewerKeyboard.bindNamedFunction("move_backward_fast", camera_move_backward_fast); - gViewerKeyboard.bindNamedFunction("edit_avatar_spin_ccw", edit_avatar_spin_ccw); - gViewerKeyboard.bindNamedFunction("edit_avatar_spin_cw", edit_avatar_spin_cw); - gViewerKeyboard.bindNamedFunction("edit_avatar_spin_over", edit_avatar_spin_over); - gViewerKeyboard.bindNamedFunction("edit_avatar_spin_under", edit_avatar_spin_under); - gViewerKeyboard.bindNamedFunction("edit_avatar_move_forward", edit_avatar_move_forward); - gViewerKeyboard.bindNamedFunction("edit_avatar_move_backward", edit_avatar_move_backward); - gViewerKeyboard.bindNamedFunction("stop_moving", stop_moving); - gViewerKeyboard.bindNamedFunction("start_chat", start_chat); - gViewerKeyboard.bindNamedFunction("start_gesture", start_gesture); -} +#define REGISTER_KEYBOARD_ACTION(KEY, ACTION) LLREGISTER_STATIC(LLKeyboardActionRegistry, KEY, ACTION); +REGISTER_KEYBOARD_ACTION("jump", agent_jump); +REGISTER_KEYBOARD_ACTION("push_down", agent_push_down); +REGISTER_KEYBOARD_ACTION("push_forward", agent_push_forward); +REGISTER_KEYBOARD_ACTION("push_backward", agent_push_backward); +REGISTER_KEYBOARD_ACTION("look_up", agent_look_up); +REGISTER_KEYBOARD_ACTION("look_down", agent_look_down); +REGISTER_KEYBOARD_ACTION("toggle_fly", agent_toggle_fly); +REGISTER_KEYBOARD_ACTION("turn_left", agent_turn_left); +REGISTER_KEYBOARD_ACTION("turn_right", agent_turn_right); +REGISTER_KEYBOARD_ACTION("slide_left", agent_slide_left); +REGISTER_KEYBOARD_ACTION("slide_right", agent_slide_right); +REGISTER_KEYBOARD_ACTION("spin_around_ccw", camera_spin_around_ccw); +REGISTER_KEYBOARD_ACTION("spin_around_cw", camera_spin_around_cw); +REGISTER_KEYBOARD_ACTION("spin_around_ccw_sitting", camera_spin_around_ccw_sitting); +REGISTER_KEYBOARD_ACTION("spin_around_cw_sitting", camera_spin_around_cw_sitting); +REGISTER_KEYBOARD_ACTION("spin_over", camera_spin_over); +REGISTER_KEYBOARD_ACTION("spin_under", camera_spin_under); +REGISTER_KEYBOARD_ACTION("spin_over_sitting", camera_spin_over_sitting); +REGISTER_KEYBOARD_ACTION("spin_under_sitting", camera_spin_under_sitting); +REGISTER_KEYBOARD_ACTION("move_forward", camera_move_forward); +REGISTER_KEYBOARD_ACTION("move_backward", camera_move_backward); +REGISTER_KEYBOARD_ACTION("move_forward_sitting", camera_move_forward_sitting); +REGISTER_KEYBOARD_ACTION("move_backward_sitting", camera_move_backward_sitting); +REGISTER_KEYBOARD_ACTION("pan_up", camera_pan_up); +REGISTER_KEYBOARD_ACTION("pan_down", camera_pan_down); +REGISTER_KEYBOARD_ACTION("pan_left", camera_pan_left); +REGISTER_KEYBOARD_ACTION("pan_right", camera_pan_right); +REGISTER_KEYBOARD_ACTION("pan_in", camera_pan_in); +REGISTER_KEYBOARD_ACTION("pan_out", camera_pan_out); +REGISTER_KEYBOARD_ACTION("move_forward_fast", camera_move_forward_fast); +REGISTER_KEYBOARD_ACTION("move_backward_fast", camera_move_backward_fast); +REGISTER_KEYBOARD_ACTION("edit_avatar_spin_ccw", edit_avatar_spin_ccw); +REGISTER_KEYBOARD_ACTION("edit_avatar_spin_cw", edit_avatar_spin_cw); +REGISTER_KEYBOARD_ACTION("edit_avatar_spin_over", edit_avatar_spin_over); +REGISTER_KEYBOARD_ACTION("edit_avatar_spin_under", edit_avatar_spin_under); +REGISTER_KEYBOARD_ACTION("edit_avatar_move_forward", edit_avatar_move_forward); +REGISTER_KEYBOARD_ACTION("edit_avatar_move_backward", edit_avatar_move_backward); +REGISTER_KEYBOARD_ACTION("stop_moving", stop_moving); +REGISTER_KEYBOARD_ACTION("start_chat", start_chat); +REGISTER_KEYBOARD_ACTION("start_gesture", start_gesture); LLViewerKeyboard::LLViewerKeyboard() : mNamedFunctionCount(0) @@ -764,6 +768,61 @@ BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, c return TRUE; } +LLViewerKeyboard::KeyBinding::KeyBinding() +: key("key"), + mask("mask"), + command("command") +{} + +LLViewerKeyboard::KeyMode::KeyMode(EKeyboardMode _mode) +: bindings("binding"), + mode(_mode) +{} + +LLViewerKeyboard::Keys::Keys() +: first_person("first_person", KeyMode(MODE_FIRST_PERSON)), + third_person("third_person", KeyMode(MODE_THIRD_PERSON)), + edit("edit", KeyMode(MODE_EDIT)), + sitting("sitting", KeyMode(MODE_SITTING)), + edit_avatar("edit_avatar", KeyMode(MODE_EDIT_AVATAR)) +{} + +S32 LLViewerKeyboard::loadBindingsXML(const std::string& filename) +{ + S32 binding_count = 0; + Keys keys; + LLSimpleXUIParser parser; + + if (parser.readXUI(filename, keys) + && keys.validateBlock()) + { + binding_count += loadBindingMode(keys.first_person); + binding_count += loadBindingMode(keys.third_person); + binding_count += loadBindingMode(keys.edit); + binding_count += loadBindingMode(keys.sitting); + binding_count += loadBindingMode(keys.edit_avatar); + } + return binding_count; +} + +S32 LLViewerKeyboard::loadBindingMode(const LLViewerKeyboard::KeyMode& keymode) +{ + S32 binding_count = 0; + for (LLInitParam::ParamIterator<KeyBinding>::const_iterator it = keymode.bindings.begin(), + end_it = keymode.bindings.end(); + it != end_it; + ++it) + { + KEY key; + MASK mask; + LLKeyboard::keyFromString(it->key, &key); + LLKeyboard::maskFromString(it->mask, &mask); + bindKey(keymode.mode, key, mask, it->command); + binding_count++; + } + + return binding_count; +} S32 LLViewerKeyboard::loadBindings(const std::string& filename) { diff --git a/indra/newview/llviewerkeyboard.h b/indra/newview/llviewerkeyboard.h index 2fa5d5dfa6..6e758cc7b3 100644 --- a/indra/newview/llviewerkeyboard.h +++ b/indra/newview/llviewerkeyboard.h @@ -55,10 +55,36 @@ typedef enum e_keyboard_mode void bind_keyboard_functions(); - class LLViewerKeyboard { public: + struct KeyBinding : public LLInitParam::Block<KeyBinding> + { + Mandatory<std::string> key, + mask, + command; + + KeyBinding(); + }; + + struct KeyMode : public LLInitParam::Block<KeyMode> + { + Multiple<KeyBinding> bindings; + EKeyboardMode mode; + KeyMode(EKeyboardMode mode); + }; + + struct Keys : public LLInitParam::Block<Keys> + { + Optional<KeyMode> first_person, + third_person, + edit, + sitting, + edit_avatar; + + Keys(); + }; + LLViewerKeyboard(); BOOL handleKey(KEY key, MASK mask, BOOL repeated); @@ -66,13 +92,17 @@ public: void bindNamedFunction(const std::string& name, LLKeyFunc func); S32 loadBindings(const std::string& filename); // returns number bound, 0 on error + S32 loadBindingsXML(const std::string& filename); // returns number bound, 0 on error EKeyboardMode getMode(); BOOL modeFromString(const std::string& string, S32 *mode); // False on failure void scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level); -protected: + +private: + S32 loadBindingMode(const LLViewerKeyboard::KeyMode& keymode); BOOL bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name); + S32 mNamedFunctionCount; LLNamedFunction mNamedFunctions[MAX_NAMED_FUNCTIONS]; -- cgit v1.2.3 From a5e0c51de9acdbffa385c1fc6c8d6e7a18c9908a Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 30 Sep 2010 20:07:50 -0700 Subject: custom skylight key bindings --- indra/newview/app_settings/keys.ini | 357 ------------------------------------ indra/newview/llviewerkeyboard.cpp | 35 ++-- indra/newview/llviewerkeyboard.h | 5 - 3 files changed, 11 insertions(+), 386 deletions(-) delete mode 100644 indra/newview/app_settings/keys.ini (limited to 'indra') diff --git a/indra/newview/app_settings/keys.ini b/indra/newview/app_settings/keys.ini deleted file mode 100644 index b79e5bf508..0000000000 --- a/indra/newview/app_settings/keys.ini +++ /dev/null @@ -1,357 +0,0 @@ -# keys.ini -# -# keyboard binding initialization -# -# comments must have # in the first column -# blank lines OK -# -# Format: -# mode key mask function -# -# mode must be one of FIRST_PERSON, THIRD_PERSON, EDIT, EDIT_AVATAR, or CONVERSATION -# key must be upper case, or SPACE, HOME, END, PGUP, PGDN, LEFT, RIGHT, UP, DOWN, -# or one of ,.;'[] -# mask must be NONE, SHIFT, ALT, ALT_SHIFT. -# Control is reserved for user commands. -# function must be a function named in llkeyboard.cpp - -FIRST_PERSON A NONE slide_left -FIRST_PERSON D NONE slide_right -FIRST_PERSON W NONE push_forward -FIRST_PERSON S NONE push_backward -FIRST_PERSON E NONE jump -FIRST_PERSON C NONE push_down -FIRST_PERSON F NONE toggle_fly - -FIRST_PERSON LEFT NONE slide_left -FIRST_PERSON RIGHT NONE slide_right -FIRST_PERSON UP NONE push_forward -FIRST_PERSON DOWN NONE push_backward -FIRST_PERSON PGUP NONE jump -FIRST_PERSON PGDN NONE push_down -FIRST_PERSON HOME NONE toggle_fly - -FIRST_PERSON PAD_LEFT NONE slide_left -FIRST_PERSON PAD_RIGHT NONE slide_right -FIRST_PERSON PAD_UP NONE push_forward -FIRST_PERSON PAD_DOWN NONE push_backward -FIRST_PERSON PAD_PGUP NONE jump -FIRST_PERSON PAD_PGDN NONE push_down -FIRST_PERSON PAD_HOME NONE toggle_fly -FIRST_PERSON PAD_CENTER NONE stop_moving -FIRST_PERSON PAD_ENTER NONE start_chat -FIRST_PERSON PAD_DIVIDE NONE start_gesture - -FIRST_PERSON A SHIFT slide_left -FIRST_PERSON D SHIFT slide_right -FIRST_PERSON W SHIFT push_forward -FIRST_PERSON S SHIFT push_backward -FIRST_PERSON E SHIFT jump -FIRST_PERSON C SHIFT push_down -FIRST_PERSON F SHIFT toggle_fly - -FIRST_PERSON SPACE NONE stop_moving -FIRST_PERSON ENTER NONE start_chat -FIRST_PERSON DIVIDE NONE start_gesture - -FIRST_PERSON LEFT SHIFT slide_left -FIRST_PERSON RIGHT SHIFT slide_right -FIRST_PERSON UP SHIFT push_forward -FIRST_PERSON DOWN SHIFT push_backward -FIRST_PERSON PGUP SHIFT jump -FIRST_PERSON PGDN SHIFT push_down - -FIRST_PERSON PAD_LEFT SHIFT slide_left -FIRST_PERSON PAD_RIGHT SHIFT slide_right -FIRST_PERSON PAD_UP SHIFT push_forward -FIRST_PERSON PAD_DOWN SHIFT push_backward -FIRST_PERSON PAD_PGUP SHIFT jump -FIRST_PERSON PAD_PGDN SHIFT push_down -FIRST_PERSON PAD_HOME SHIFT toggle_fly -FIRST_PERSON PAD_ENTER SHIFT start_chat -FIRST_PERSON PAD_DIVIDE SHIFT start_gesture - -THIRD_PERSON A NONE turn_left -THIRD_PERSON D NONE turn_right -THIRD_PERSON A SHIFT slide_left -THIRD_PERSON D SHIFT slide_right -THIRD_PERSON W NONE push_forward -THIRD_PERSON S NONE push_backward -THIRD_PERSON W SHIFT push_forward -THIRD_PERSON S SHIFT push_backward -THIRD_PERSON E NONE jump -THIRD_PERSON C NONE push_down -THIRD_PERSON E SHIFT jump -THIRD_PERSON C SHIFT push_down - -THIRD_PERSON F NONE toggle_fly -THIRD_PERSON F SHIFT toggle_fly - -THIRD_PERSON SPACE NONE stop_moving -THIRD_PERSON ENTER NONE start_chat -THIRD_PERSON DIVIDE NONE start_gesture - -THIRD_PERSON LEFT NONE turn_left -THIRD_PERSON LEFT SHIFT slide_left -THIRD_PERSON RIGHT NONE turn_right -THIRD_PERSON RIGHT SHIFT slide_right -THIRD_PERSON UP NONE push_forward -THIRD_PERSON DOWN NONE push_backward -THIRD_PERSON UP SHIFT push_forward -THIRD_PERSON DOWN SHIFT push_backward -THIRD_PERSON PGUP NONE jump -THIRD_PERSON PGDN NONE push_down -THIRD_PERSON PGUP SHIFT jump -THIRD_PERSON PGDN SHIFT push_down -THIRD_PERSON HOME SHIFT toggle_fly -THIRD_PERSON HOME NONE toggle_fly - -THIRD_PERSON PAD_LEFT NONE turn_left -THIRD_PERSON PAD_LEFT SHIFT slide_left -THIRD_PERSON PAD_RIGHT NONE turn_right -THIRD_PERSON PAD_RIGHT SHIFT slide_right -THIRD_PERSON PAD_UP NONE push_forward -THIRD_PERSON PAD_DOWN NONE push_backward -THIRD_PERSON PAD_UP SHIFT push_forward -THIRD_PERSON PAD_DOWN SHIFT push_backward -THIRD_PERSON PAD_PGUP NONE jump -THIRD_PERSON PAD_PGDN NONE push_down -THIRD_PERSON PAD_PGUP SHIFT jump -THIRD_PERSON PAD_PGDN SHIFT push_down -THIRD_PERSON PAD_HOME NONE toggle_fly -THIRD_PERSON PAD_HOME SHIFT toggle_fly -THIRD_PERSON PAD_CENTER NONE stop_moving -THIRD_PERSON PAD_CENTER SHIFT stop_moving -THIRD_PERSON PAD_ENTER NONE start_chat -THIRD_PERSON PAD_ENTER SHIFT start_chat -THIRD_PERSON PAD_DIVIDE NONE start_gesture -THIRD_PERSON PAD_DIVIDE SHIFT start_gesture - -# Camera controls in third person on Alt -THIRD_PERSON LEFT ALT spin_around_cw -THIRD_PERSON RIGHT ALT spin_around_ccw -THIRD_PERSON UP ALT move_forward -THIRD_PERSON DOWN ALT move_backward -THIRD_PERSON PGUP ALT spin_over -THIRD_PERSON PGDN ALT spin_under - -THIRD_PERSON A ALT spin_around_cw -THIRD_PERSON D ALT spin_around_ccw -THIRD_PERSON W ALT move_forward -THIRD_PERSON S ALT move_backward -THIRD_PERSON E ALT spin_over -THIRD_PERSON C ALT spin_under - -THIRD_PERSON PAD_LEFT ALT spin_around_cw -THIRD_PERSON PAD_RIGHT ALT spin_around_ccw -THIRD_PERSON PAD_UP ALT move_forward -THIRD_PERSON PAD_DOWN ALT move_backward -THIRD_PERSON PAD_PGUP ALT spin_over -THIRD_PERSON PAD_PGDN ALT spin_under -THIRD_PERSON PAD_ENTER ALT start_chat -THIRD_PERSON PAD_DIVIDE ALT start_gesture - -# mimic alt zoom behavior with keyboard only -THIRD_PERSON A CTL_ALT spin_around_cw -THIRD_PERSON D CTL_ALT spin_around_ccw -THIRD_PERSON W CTL_ALT spin_over -THIRD_PERSON S CTL_ALT spin_under -THIRD_PERSON E CTL_ALT spin_over -THIRD_PERSON C CTL_ALT spin_under - -THIRD_PERSON LEFT CTL_ALT spin_around_cw -THIRD_PERSON RIGHT CTL_ALT spin_around_ccw -THIRD_PERSON UP CTL_ALT spin_over -THIRD_PERSON DOWN CTL_ALT spin_under -THIRD_PERSON PGUP CTL_ALT spin_over -THIRD_PERSON PGDN CTL_ALT spin_under - -THIRD_PERSON PAD_LEFT CTL_ALT spin_around_cw -THIRD_PERSON PAD_RIGHT CTL_ALT spin_around_ccw -THIRD_PERSON PAD_UP CTL_ALT spin_over -THIRD_PERSON PAD_DOWN CTL_ALT spin_under -THIRD_PERSON PAD_PGUP CTL_ALT spin_over -THIRD_PERSON PAD_PGDN CTL_ALT spin_under -THIRD_PERSON PAD_ENTER CTL_ALT start_chat -THIRD_PERSON PAD_DIVIDE CTL_ALT start_gesture - -# Therefore pan on Alt-Shift -THIRD_PERSON A CTL_ALT_SHIFT pan_left -THIRD_PERSON D CTL_ALT_SHIFT pan_right -THIRD_PERSON W CTL_ALT_SHIFT pan_up -THIRD_PERSON S CTL_ALT_SHIFT pan_down - -THIRD_PERSON LEFT CTL_ALT_SHIFT pan_left -THIRD_PERSON RIGHT CTL_ALT_SHIFT pan_right -THIRD_PERSON UP CTL_ALT_SHIFT pan_up -THIRD_PERSON DOWN CTL_ALT_SHIFT pan_down - -THIRD_PERSON PAD_LEFT CTL_ALT_SHIFT pan_left -THIRD_PERSON PAD_RIGHT CTL_ALT_SHIFT pan_right -THIRD_PERSON PAD_UP CTL_ALT_SHIFT pan_up -THIRD_PERSON PAD_DOWN CTL_ALT_SHIFT pan_down -THIRD_PERSON PAD_ENTER CTL_ALT_SHIFT start_chat -THIRD_PERSON PAD_DIVIDE CTL_ALT_SHIFT start_gesture - -# Basic editing camera control -EDIT A NONE spin_around_cw -EDIT D NONE spin_around_ccw -EDIT W NONE move_forward -EDIT S NONE move_backward -EDIT E NONE spin_over -EDIT C NONE spin_under -EDIT ENTER NONE start_chat -EDIT DIVIDE NONE start_gesture -EDIT PAD_ENTER NONE start_chat -EDIT PAD_DIVIDE NONE start_gesture - -EDIT LEFT NONE spin_around_cw -EDIT RIGHT NONE spin_around_ccw -EDIT UP NONE move_forward -EDIT DOWN NONE move_backward -EDIT PGUP NONE spin_over -EDIT PGDN NONE spin_under - -EDIT A SHIFT pan_left -EDIT D SHIFT pan_right -EDIT W SHIFT pan_up -EDIT S SHIFT pan_down - -EDIT LEFT SHIFT pan_left -EDIT RIGHT SHIFT pan_right -EDIT UP SHIFT pan_up -EDIT DOWN SHIFT pan_down - -# Walking works with ALT held down. -EDIT A ALT slide_left -EDIT D ALT slide_right -EDIT W ALT push_forward -EDIT S ALT push_backward -EDIT E ALT jump -EDIT C ALT push_down - -EDIT LEFT ALT slide_left -EDIT RIGHT ALT slide_right -EDIT UP ALT push_forward -EDIT DOWN ALT push_backward -EDIT PGUP ALT jump -EDIT PGDN ALT push_down -EDIT HOME ALT toggle_fly - -EDIT PAD_LEFT ALT slide_left -EDIT PAD_RIGHT ALT slide_right -EDIT PAD_UP ALT push_forward -EDIT PAD_DOWN ALT push_backward -EDIT PAD_PGUP ALT jump -EDIT PAD_PGDN ALT push_down -EDIT PAD_ENTER ALT start_chat -EDIT PAD_DIVIDE ALT start_gesture - -SITTING A ALT spin_around_cw -SITTING D ALT spin_around_ccw -SITTING W ALT move_forward -SITTING S ALT move_backward -SITTING E ALT spin_over_sitting -SITTING C ALT spin_under_sitting - -SITTING LEFT ALT spin_around_cw -SITTING RIGHT ALT spin_around_ccw -SITTING UP ALT move_forward -SITTING DOWN ALT move_backward -SITTING PGUP ALT spin_over -SITTING PGDN ALT spin_under - -SITTING A CTL_ALT spin_around_cw -SITTING D CTL_ALT spin_around_ccw -SITTING W CTL_ALT spin_over -SITTING S CTL_ALT spin_under -SITTING E CTL_ALT spin_over -SITTING C CTL_ALT spin_under - -SITTING LEFT CTL_ALT spin_around_cw -SITTING RIGHT CTL_ALT spin_around_ccw -SITTING UP CTL_ALT spin_over -SITTING DOWN CTL_ALT spin_under -SITTING PGUP CTL_ALT spin_over -SITTING PGDN CTL_ALT spin_under - - -SITTING A NONE spin_around_cw_sitting -SITTING D NONE spin_around_ccw_sitting -SITTING W NONE move_forward_sitting -SITTING S NONE move_backward_sitting -SITTING E NONE spin_over_sitting -SITTING C NONE spin_under_sitting - -SITTING LEFT NONE spin_around_cw_sitting -SITTING RIGHT NONE spin_around_ccw_sitting -SITTING UP NONE move_forward_sitting -SITTING DOWN NONE move_backward_sitting -SITTING PGUP NONE spin_over_sitting -SITTING PGDN NONE spin_under_sitting - -SITTING PAD_LEFT NONE spin_around_cw_sitting -SITTING PAD_RIGHT NONE spin_around_ccw_sitting -SITTING PAD_UP NONE move_forward_sitting -SITTING PAD_DOWN NONE move_backward_sitting -SITTING PAD_PGUP NONE spin_over_sitting -SITTING PAD_PGDN NONE spin_under_sitting -SITTING PAD_CENTER NONE stop_moving -SITTING PAD_ENTER NONE start_chat -SITTING PAD_DIVIDE NONE start_gesture - -# these are for passing controls when sitting on vehicles -SITTING A SHIFT slide_left -SITTING D SHIFT slide_right -SITTING LEFT SHIFT slide_left -SITTING RIGHT SHIFT slide_right - -SITTING PAD_LEFT SHIFT slide_left -SITTING PAD_RIGHT SHIFT slide_right -SITTING PAD_ENTER SHIFT start_chat -SITTING PAD_DIVIDE SHIFT start_gesture - -# pan on Alt-Shift -SITTING A CTL_ALT_SHIFT pan_left -SITTING D CTL_ALT_SHIFT pan_right -SITTING W CTL_ALT_SHIFT pan_up -SITTING S CTL_ALT_SHIFT pan_down - -SITTING LEFT CTL_ALT_SHIFT pan_left -SITTING RIGHT CTL_ALT_SHIFT pan_right -SITTING UP CTL_ALT_SHIFT pan_up -SITTING DOWN CTL_ALT_SHIFT pan_down - -SITTING PAD_LEFT CTL_ALT_SHIFT pan_left -SITTING PAD_RIGHT CTL_ALT_SHIFT pan_right -SITTING PAD_UP CTL_ALT_SHIFT pan_up -SITTING PAD_DOWN CTL_ALT_SHIFT pan_down -SITTING PAD_ENTER CTL_ALT_SHIFT start_chat -SITTING PAD_DIVIDE CTL_ALT_SHIFT start_gesture - -SITTING ENTER NONE start_chat -SITTING DIVIDE NONE start_gesture - -# Avatar editing camera controls -EDIT_AVATAR A NONE edit_avatar_spin_cw -EDIT_AVATAR D NONE edit_avatar_spin_ccw -EDIT_AVATAR W NONE edit_avatar_move_forward -EDIT_AVATAR S NONE edit_avatar_move_backward -EDIT_AVATAR E NONE edit_avatar_spin_over -EDIT_AVATAR C NONE edit_avatar_spin_under -EDIT_AVATAR LEFT NONE edit_avatar_spin_cw -EDIT_AVATAR RIGHT NONE edit_avatar_spin_ccw -EDIT_AVATAR UP NONE edit_avatar_move_forward -EDIT_AVATAR DOWN NONE edit_avatar_move_backward -EDIT_AVATAR PGUP NONE edit_avatar_spin_over -EDIT_AVATAR PGDN NONE edit_avatar_spin_under -EDIT_AVATAR ENTER NONE start_chat -EDIT_AVATAR DIVIDE NONE start_gesture -EDIT_AVATAR PAD_LEFT NONE edit_avatar_spin_cw -EDIT_AVATAR PAD_RIGHT NONE edit_avatar_spin_ccw -EDIT_AVATAR PAD_UP NONE edit_avatar_move_forward -EDIT_AVATAR PAD_DOWN NONE edit_avatar_move_backward -EDIT_AVATAR PAD_PGUP NONE edit_avatar_spin_over -EDIT_AVATAR PAD_PGDN NONE edit_avatar_spin_under -EDIT_AVATAR PAD_ENTER NONE start_chat -EDIT_AVATAR PAD_DIVIDE NONE start_gesture diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index 570f372950..4e60c47f07 100644 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -598,8 +598,7 @@ REGISTER_KEYBOARD_ACTION("stop_moving", stop_moving); REGISTER_KEYBOARD_ACTION("start_chat", start_chat); REGISTER_KEYBOARD_ACTION("start_gesture", start_gesture); -LLViewerKeyboard::LLViewerKeyboard() : - mNamedFunctionCount(0) +LLViewerKeyboard::LLViewerKeyboard() { for (S32 i = 0; i < MODE_COUNT; i++) { @@ -617,16 +616,6 @@ LLViewerKeyboard::LLViewerKeyboard() : } } - -void LLViewerKeyboard::bindNamedFunction(const std::string& name, LLKeyFunc func) -{ - S32 i = mNamedFunctionCount; - mNamedFunctions[i].mName = name; - mNamedFunctions[i].mFunction = func; - mNamedFunctionCount++; -} - - BOOL LLViewerKeyboard::modeFromString(const std::string& string, S32 *mode) { if (string == "FIRST_PERSON") @@ -699,8 +688,9 @@ BOOL LLViewerKeyboard::handleKey(KEY translated_key, MASK translated_mask, BOOL BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name) { - S32 i,index; - void (*function)(EKeystate keystate) = NULL; + S32 index; + typedef boost::function<void(EKeystate)> function_t; + function_t function = NULL; std::string name; // Allow remapping of F2-F12 @@ -723,13 +713,11 @@ BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, c } // Not remapped, look for a function - for (i = 0; i < mNamedFunctionCount; i++) + + function_t* result = LLKeyboardActionRegistry::getValue(function_name); + if (result) { - if (function_name == mNamedFunctions[i].mName) - { - function = mNamedFunctions[i].mFunction; - name = mNamedFunctions[i].mName; - } + function = *result; } if (!function) @@ -759,7 +747,6 @@ BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, c mBindings[mode][index].mKey = key; mBindings[mode][index].mMask = mask; -// mBindings[mode][index].mName = name; mBindings[mode][index].mFunction = function; if (index == mBindingCount[mode]) @@ -971,18 +958,18 @@ void LLViewerKeyboard::scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_lev if (key_down && !repeat) { // ...key went down this frame, call function - (*binding[i].mFunction)( KEYSTATE_DOWN ); + binding[i].mFunction( KEYSTATE_DOWN ); } else if (key_up) { // ...key went down this frame, call function - (*binding[i].mFunction)( KEYSTATE_UP ); + binding[i].mFunction( KEYSTATE_UP ); } else if (key_level) { // ...key held down from previous frame // Not windows, just call the function. - (*binding[i].mFunction)( KEYSTATE_LEVEL ); + binding[i].mFunction( KEYSTATE_LEVEL ); }//if }//if }//for diff --git a/indra/newview/llviewerkeyboard.h b/indra/newview/llviewerkeyboard.h index 6e758cc7b3..925244e89b 100644 --- a/indra/newview/llviewerkeyboard.h +++ b/indra/newview/llviewerkeyboard.h @@ -89,8 +89,6 @@ public: BOOL handleKey(KEY key, MASK mask, BOOL repeated); - void bindNamedFunction(const std::string& name, LLKeyFunc func); - S32 loadBindings(const std::string& filename); // returns number bound, 0 on error S32 loadBindingsXML(const std::string& filename); // returns number bound, 0 on error EKeyboardMode getMode(); @@ -103,9 +101,6 @@ private: S32 loadBindingMode(const LLViewerKeyboard::KeyMode& keymode); BOOL bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name); - S32 mNamedFunctionCount; - LLNamedFunction mNamedFunctions[MAX_NAMED_FUNCTIONS]; - // Hold all the ugly stuff torn out to make LLKeyboard non-viewer-specific here S32 mBindingCount[MODE_COUNT]; LLKeyBinding mBindings[MODE_COUNT][MAX_KEY_BINDINGS]; -- cgit v1.2.3 From 293071284ce8578edc313d3b0dd57ecfc5c7760d Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 30 Sep 2010 20:08:24 -0700 Subject: custom skylight key bindings --- indra/llwindow/llkeyboard.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/llwindow/llkeyboard.h b/indra/llwindow/llkeyboard.h index be16f31abc..ba472cfde5 100644 --- a/indra/llwindow/llkeyboard.h +++ b/indra/llwindow/llkeyboard.h @@ -40,7 +40,7 @@ enum EKeystate KEYSTATE_UP }; -typedef void (*LLKeyFunc)(EKeystate keystate); +typedef boost::function<void(EKeystate keystate)> LLKeyFunc; typedef std::string (LLKeyStringTranslatorFunc)(const char *label); enum EKeyboardInsertMode -- cgit v1.2.3 From 1f7ff277d4e0d050f221e76c143f5101fb02d75f Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 30 Sep 2010 20:08:53 -0700 Subject: EXP-128 FIX Stand button displays partially offscreen --- indra/newview/llmoveview.cpp | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) (limited to 'indra') diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index 6658e1d7e8..35c74d290b 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -448,17 +448,20 @@ void LLFloaterMove::updatePosition() LLBottomTray* tray = LLBottomTray::getInstance(); if (!tray) return; - LLButton* movement_btn = tray->getChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME); + LLButton* movement_btn = tray->findChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME); - //align centers of a button and a floater - S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2; - - S32 y = 0; - if (!mModeActionsPanel->getVisible()) + if (movement_btn) { - y = mModeActionsPanel->getRect().getHeight(); + //align centers of a button and a floater + S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2; + + S32 y = 0; + if (!mModeActionsPanel->getVisible()) + { + y = mModeActionsPanel->getRect().getHeight(); + } + setOrigin(x, y); } - setOrigin(x, y); } //static @@ -735,11 +738,14 @@ void LLPanelStandStopFlying::updatePosition() LLBottomTray* tray = LLBottomTray::getInstance(); if (!tray || mAttached) return; - LLButton* movement_btn = tray->getChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME); + LLButton* movement_btn = tray->findChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME); - // Align centers of the button and the panel. - S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2; - setOrigin(x, 0); + if (movement_btn) + { + // Align centers of the button and the panel. + S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2; + setOrigin(x, 0); + } } -- cgit v1.2.3 From 93faa08da9d8ebab516191f4b446e86d3c2800a2 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 30 Sep 2010 20:19:24 -0700 Subject: EXP-128 FIX Stand button displays partially offscreen --- indra/newview/llmoveview.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index 35c74d290b..f6b85de4b8 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -740,12 +740,17 @@ void LLPanelStandStopFlying::updatePosition() LLButton* movement_btn = tray->findChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME); + S32 x = 0; if (movement_btn) { // Align centers of the button and the panel. - S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2; - setOrigin(x, 0); + x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2; + } + else + { + x = tray->calcScreenRect().getCenterX() - getRect().getWidth()/2; } + setOrigin(x, 0); } -- cgit v1.2.3 From d6ca1ef033a8c2f32ec9322b30eb28de305e612f Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Fri, 1 Oct 2010 10:17:58 -0700 Subject: Keys.xml replaces keys.ini - fix for CMake --- indra/newview/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 1f4302d870..074fa6397d 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1314,7 +1314,7 @@ set(viewer_APPSETTINGS_FILES app_settings/grass.xml app_settings/high_graphics.xml app_settings/ignorable_dialogs.xml - app_settings/keys.ini + app_settings/keys.xml app_settings/keywords.ini app_settings/logcontrol.xml app_settings/low_graphics.xml -- cgit v1.2.3 From e6493c7abea645b6d8394b3f03b59a59378ad986 Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Fri, 1 Oct 2010 14:00:27 -0700 Subject: Updated keys in notifications.xml to match current spec. --- .../newview/skins/default/xui/en/notifications.xml | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'indra') diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 7dd7cefa5d..cf5a6ad255 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -441,6 +441,7 @@ Please invite members within 48 hours. icon="alertmodal.tga" name="LandBuyPass" type="alertmodal"> + <tag>fail</tag> For L$[COST] you can enter this land ('[PARCEL_NAME]') for [TIME] hours. Buy a pass? <usetemplate name="okcancelbuttons" @@ -1589,6 +1590,7 @@ If you continue to get this message, please check the [SUPPORT_SITE]. icon="alertmodal.tga" name="blocked_tport" type="alertmodal"> + <tag>fail</tag> Sorry, teleport is currently blocked. Try again in a moment. If you still cannot teleport, please log out and log back in to resolve the problem. </notification> <notification @@ -1601,42 +1603,49 @@ Sorry, but system was unable to locate landmark destination. icon="alertmodal.tga" name="timeout_tport" type="alertmodal"> + <tag>fail</tag> Sorry, but system was unable to complete the teleport connection. Try again in a moment. </notification> <notification icon="alertmodal.tga" name="noaccess_tport" type="alertmodal"> + <tag>fail</tag> Sorry, you do not have access to that teleport destination. </notification> <notification icon="alertmodal.tga" name="missing_attach_tport" type="alertmodal"> + <tag>fail</tag> Your attachments have not arrived yet. Try waiting for a few more seconds or log out and back in again before attempting to teleport. </notification> <notification icon="alertmodal.tga" name="too_many_uploads_tport" type="alertmodal"> + <tag>fail</tag> The asset queue in this region is currently clogged so your teleport request will not be able to succeed in a timely manner. Please try again in a few minutes or go to a less busy area. </notification> <notification icon="alertmodal.tga" name="expired_tport" type="alertmodal"> + <tag>fail</tag> Sorry, but the system was unable to complete your teleport request in a timely fashion. Please try again in a few minutes. </notification> <notification icon="alertmodal.tga" name="expired_region_handoff" type="alertmodal"> + <tag>fail</tag> Sorry, but the system was unable to complete your region crossing in a timely fashion. Please try again in a few minutes. </notification> <notification icon="alertmodal.tga" name="no_host" type="alertmodal"> + <tag>fail</tag> Unable to find teleport destination. The destination may be temporarily unavailable or no longer exists. Please try again in a few minutes. </notification> <notification @@ -2418,6 +2427,7 @@ Display settings have been set to recommended levels based on your system config icon="alertmodal.tga" name="AvatarMovedDesired" type="alertmodal"> + <tag>fail</tag> Your desired location is not currently available. You have been moved into a nearby region. </notification> @@ -2426,6 +2436,7 @@ You have been moved into a nearby region. icon="alertmodal.tga" name="AvatarMovedLast" type="alertmodal"> + <tag>fail</tag> Your last location is not currently available. You have been moved into a nearby region. </notification> @@ -2434,6 +2445,7 @@ You have been moved into a nearby region. icon="alertmodal.tga" name="AvatarMovedHome" type="alertmodal"> + <tag>fail</tag> Your home location is not currently available. You have been moved into a nearby region. You may want to set a new home location. @@ -2443,6 +2455,7 @@ You may want to set a new home location. icon="alertmodal.tga" name="ClothingLoading" type="alertmodal"> + <tag>fail</tag> Your clothing is still downloading. You can use [SECOND_LIFE] normally and other people will see you correctly. <form name="form"> @@ -2470,6 +2483,7 @@ Return to [http://join.secondlife.com secondlife.com] to create a new account? icon="alertmodal.tga" name="LoginPacketNeverReceived" type="alertmodal"> + <tag>fail</tag> We're having trouble connecting. There may be a problem with your Internet connection or the [SECOND_LIFE_GRID]. You can either check your Internet connection and try again in a few minutes, click Help to view the [SUPPORT_SITE], or click Teleport to attempt to teleport home. @@ -3474,6 +3488,7 @@ Are you sure you want to change the Estate Covenant? icon="alertmodal.tga" name="RegionEntryAccessBlocked" type="alertmodal"> + <tag>fail</tag> You are not allowed in that Region due to your maturity Rating. This may be a result of a lack of information validating your age. Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating. @@ -3486,6 +3501,7 @@ Please verify you have the latest Viewer installed, and go to the Knowledge Base icon="alertmodal.tga" name="RegionEntryAccessBlocked_KB" type="alertmodal"> + <tag>fail</tag> You are not allowed in that region due to your maturity Rating. Go to the Knowledge Base for more information about maturity Ratings? @@ -3503,6 +3519,7 @@ Go to the Knowledge Base for more information about maturity Ratings? icon="notifytip.tga" name="RegionEntryAccessBlocked_Notify" type="notifytip"> + <tag>fail</tag> You are not allowed in that region due to your maturity Rating. </notification> @@ -3510,6 +3527,7 @@ You are not allowed in that region due to your maturity Rating. icon="alertmodal.tga" name="RegionEntryAccessBlocked_Change" type="alertmodal"> + <tag>fail</tag> You are not allowed in that Region due to your maturity Rating preference. To enter the desired region, please change your maturity Rating preference. This will allow you to search for and access [REGIONMATURITY] content. To undo any changes, go to Me > Preferences > General. @@ -4426,6 +4444,7 @@ Would you like to automatically wear the clothing you are about to create? icon="alertmodal.tga" name="NotAgeVerified" type="alertmodal"> + <tag>fail</tag> You must be age-verified to visit this area. Do you want to go to the [SECOND_LIFE] website and verify your age? [_URL] @@ -4980,6 +4999,7 @@ You can be hurt here. If you die, you will be teleported to your home location. persist="true" type="notify" unique="true"> + <tag>fail</tag> This area has flying disabled. You can't fly here. </notification> @@ -5032,6 +5052,7 @@ This region is not running any scripts. name="NoOutsideScripts" persist="true" type="notify"> + <tag>fail</tag> This land has outside scripts disabled. No scripts will work here except those belonging to the land owner. @@ -5133,6 +5154,7 @@ Cannot region cross into banned parcel. Try another way. name="TelehubRedirect" persist="true" type="notify"> + <tag>fail</tag> You have been redirected to a telehub. </notification> @@ -6064,6 +6086,7 @@ New Voice Morphs are available! icon="notifytip.tga" name="Cannot enter parcel: not a group member" type="notifytip"> + <tag>fail</tag> Only members of a certain group can visit this area. </notification> @@ -6071,6 +6094,7 @@ Only members of a certain group can visit this area. icon="notifytip.tga" name="Cannot enter parcel: banned" type="notifytip"> + <tag>fail</tag> Cannot enter parcel, you have been banned. </notification> @@ -6078,6 +6102,7 @@ Cannot enter parcel, you have been banned. icon="notifytip.tga" name="Cannot enter parcel: not on access list" type="notifytip"> + <tag>fail</tag> Cannot enter parcel, you are not on the access list. </notification> -- cgit v1.2.3 From 94fbf6805435f98c09a132c807fe3a13aa882b54 Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Fri, 1 Oct 2010 16:15:35 -0700 Subject: Fix for build issue on the mac. --- indra/llxuixml/llregistry.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/llxuixml/llregistry.h b/indra/llxuixml/llregistry.h index 546cf38eb5..36ce6a97b7 100644 --- a/indra/llxuixml/llregistry.h +++ b/indra/llxuixml/llregistry.h @@ -346,6 +346,6 @@ private: // helper macro for doing static registration #define GLUED_TOKEN(x, y) x ## y #define GLUE_TOKENS(x, y) GLUED_TOKEN(x, y) -#define LLREGISTER_STATIC(REGISTRY, KEY, VALUE) static REGISTRY::StaticRegistrar GLUE_TOKENS(reg, __COUNTER__)(KEY, VALUE); +#define LLREGISTER_STATIC(REGISTRY, KEY, VALUE) static REGISTRY::StaticRegistrar GLUE_TOKENS(reg, __LINE__)(KEY, VALUE); #endif -- cgit v1.2.3 From a82a270b80a6bb9ed1a6bd1f70a42f4234197c36 Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Fri, 1 Oct 2010 17:43:27 -0700 Subject: More precise control of notifications using notification_visibility.xml. Added a "name" property that lets a rule match a specific notification. Added a "response" property that lets a rule specify a response when it matches. Reviewed by Richard. --- indra/llui/llnotifications.cpp | 84 +++++++++++++++++++++---------- indra/llui/llnotificationvisibilityrule.h | 13 ++++- 2 files changed, 70 insertions(+), 27 deletions(-) (limited to 'indra') diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index 289020fa3f..5b2e7590b1 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -182,28 +182,11 @@ bool defaultResponse(const LLSD& payload) return false; } -bool emptyResponse(const LLSD& payload) +bool visibilityRuleMached(const LLSD& payload) { - if (payload["sigtype"].asString() == "add") - { - LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID()); - if (pNotif) - { - // supply empty response - pNotif->respond(pNotif->getResponseTemplate(LLNotification::WITHOUT_DEFAULT_BUTTON)); - } - } - return false; -} - -bool cancelNotification(const LLSD& payload) -{ - if (payload["sigtype"].asString() == "add") - { - // cancel this notification - LLNotifications::instance().cancel(LLNotifications::instance().find(payload["id"].asUUID())); - } - return false; + // This is needed because LLNotifications::isVisibleByRules may have cancelled the notification. + // Returning true here makes LLNotificationChannelBase::updateItem do an early out, which prevents things from happening in the wrong order. + return true; } @@ -450,8 +433,10 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par LLNotificationVisibilityRule::LLNotificationVisibilityRule(const LLNotificationVisibilityRule::Params &p) : mVisible(p.visible), + mResponse(p.response), mType(p.type), - mTag(p.tag) + mTag(p.tag), + mName(p.name) { } @@ -1290,7 +1275,7 @@ void LLNotifications::createDefaultChannels() LLNotifications::instance().getChannel("Ignore")-> connectFailedFilter(&handleIgnoredNotification); LLNotifications::instance().getChannel("VisibilityRules")-> - connectFailedFilter(&cancelNotification); + connectFailedFilter(&visibilityRuleMached); } bool LLNotifications::addTemplate(const std::string &name, @@ -1663,6 +1648,12 @@ bool LLNotifications::getIgnoreAllNotifications() bool LLNotifications::isVisibleByRules(LLNotificationPtr n) { + if(n->isRespondedTo()) + { + // This avoids infinite recursion in the case where the filter calls respond() + return true; + } + VisibilityRuleList::iterator it; for(it = mVisibilityRules.begin(); it != mVisibilityRules.end(); it++) @@ -1687,15 +1678,56 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n) continue; } } + + if(!(*it)->mName.empty()) + { + lldebugs << "rule name = " << (*it)->mName << ", notification name = " << n->getName() << llendl; + + // check this notification's name against the notification's name and continue if no match is found. + if((*it)->mName != n->getName()) + { + // This rule's non-empty name didn't match the notification. Skip this rule. + continue; + } + } // If we got here, the rule matches. Don't evaluate subsequent rules. - return (*it)->mVisible; + if(!(*it)->mVisible) + { + // This notification is being hidden. + + if((*it)->mResponse.empty()) + { + // Response property is empty. Cancel this notification. + lldebugs << "cancelling notification " << n->getName() << llendl; + + n->cancel(); + } + else + { + // Response property is not empty. Return the specified response. + LLSD response = n->getResponseTemplate(LLNotification::WITHOUT_DEFAULT_BUTTON); + // TODO: verify that the response template has an item with the correct name + response[(*it)->mResponse] = true; + + lldebugs << "responding to notification " << n->getName() << " with response = " << response << llendl; + + n->respond(response); + } + + return false; + } + + // If we got here, exit the loop and return true. + break; } - // Default for cases with no rules or incomplete rules is to show all notifications. + lldebugs << "allowing notification " << n->getName() << llendl; + return true; } - + + // --- // END OF LLNotifications implementation // ========================================================= diff --git a/indra/llui/llnotificationvisibilityrule.h b/indra/llui/llnotificationvisibilityrule.h index a98591c9d6..58a7eb6176 100644 --- a/indra/llui/llnotificationvisibilityrule.h +++ b/indra/llui/llnotificationvisibilityrule.h @@ -40,13 +40,17 @@ struct LLNotificationVisibilityRule struct Params : public LLInitParam::Block<Params> { Mandatory<bool> visible; + Optional<std::string> response; Optional<std::string> type; Optional<std::string> tag; + Optional<std::string> name; Params() : visible("visible"), + response("response"), type("type"), - tag("tag") + tag("tag"), + name("name") {} }; @@ -65,11 +69,18 @@ struct LLNotificationVisibilityRule // If true, this rule makes matching notifications visible. Otherwise, it makes them invisible. bool mVisible; + // Which response to give when making a notification invisible. An empty string means the notification should be cancelled instead of responded to. + std::string mResponse; + // String to match against the notification's "type". An empty string matches all notifications. std::string mType; // String to match against the notification's tag(s). An empty string matches all notifications. std::string mTag; + + // String to match against the notification's name. An empty string matches all notifications. + std::string mName; + }; #endif //LL_LLNOTIFICATION_VISIBILITY_RULE_H -- cgit v1.2.3 From 033c45f99024dd8197a94936443f67f3e76d40bb Mon Sep 17 00:00:00 2001 From: Richard Nelson <none@none> Date: Mon, 4 Oct 2010 11:21:15 -0700 Subject: EXP-142 FIXED Disable mouselook in Skylight --- indra/newview/app_settings/settings.xml | 11 +++++++++++ indra/newview/llagentcamera.cpp | 2 +- indra/newview/llviewerkeyboard.cpp | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 18a064c7ba..b24de89103 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -2842,6 +2842,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>EnableMouselook</key> + <map> + <key>Comment</key> + <string>Allow first person perspective and mouse control of camera</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>EnableRippleWater</key> <map> <key>Comment</key> diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 68e408d3e4..e7fee26dc5 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -2038,7 +2038,7 @@ void LLAgentCamera::resetCamera() //----------------------------------------------------------------------------- void LLAgentCamera::changeCameraToMouselook(BOOL animate) { - if (LLViewerJoystick::getInstance()->getOverrideCamera()) + if (!gSavedSettings.getBOOL("EnableMouselook") || LLViewerJoystick::getInstance()->getOverrideCamera()) { return; } diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index 4e60c47f07..1aa9fd8a45 100644 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -597,6 +597,7 @@ REGISTER_KEYBOARD_ACTION("edit_avatar_move_backward", edit_avatar_move_backward) REGISTER_KEYBOARD_ACTION("stop_moving", stop_moving); REGISTER_KEYBOARD_ACTION("start_chat", start_chat); REGISTER_KEYBOARD_ACTION("start_gesture", start_gesture); +#undef REGISTER_KEYBOARD_ACTION LLViewerKeyboard::LLViewerKeyboard() { -- cgit v1.2.3 From 6e471d395fdec324164469e54613ae9bf30e1e9f Mon Sep 17 00:00:00 2001 From: Richard Nelson <none@none> Date: Mon, 4 Oct 2010 16:38:03 -0700 Subject: removed dead code --- indra/newview/llhudtext.cpp | 3 --- 1 file changed, 3 deletions(-) (limited to 'indra') diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp index 96638018c4..99a0da8b01 100644 --- a/indra/newview/llhudtext.cpp +++ b/indra/newview/llhudtext.cpp @@ -326,9 +326,6 @@ void LLHUDText::renderText(BOOL for_select) mRadius = (width_vec + height_vec).magVec() * 0.5f; - LLCoordGL screen_pos; - LLViewerCamera::getInstance()->projectPosAgentToScreen(mPositionAgent, screen_pos, FALSE); - LLVector2 screen_offset; if (!mUseBubble) { -- cgit v1.2.3 From 69215ae757452fd0f7cdc399e2104104bd06f8cf Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Mon, 4 Oct 2010 18:21:08 -0700 Subject: Fix for EXP-140 -- After logging into Skylight Viewer - User is required to click on Viewer window before using movement keys / flying In LLMenuHolderGL::handleKey(), in the highlightNextItem() case, don't return true if highlightNextItem() did nothing. Reviewed by Richard. --- indra/llui/llmenugl.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 64f84bae7c..7db8b97180 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -3460,8 +3460,10 @@ BOOL LLMenuHolderGL::handleKey(KEY key, MASK mask, BOOL called_from_parent) else { //highlight first enabled one - pMenu->highlightNextItem(NULL); - handled = true; + if(pMenu->highlightNextItem(NULL)) + { + handled = true; + } } } } -- cgit v1.2.3 From 5e0e86869dcb0c365c486776f8dacba14a029d1e Mon Sep 17 00:00:00 2001 From: Richard Nelson <none@none> Date: Mon, 4 Oct 2010 18:38:38 -0700 Subject: EXP-138 WIP Chat and IM notices not aligned with Bottom bar in Skylight Viewer --- indra/newview/llnearbychathandler.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index 47d32e57fb..f06f4eab28 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -336,7 +336,12 @@ void LLNearbyChatScreenChannel::showToastsBottom() return; LLRect toast_rect; - S32 bottom = getRect().mBottom; + S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin"); + LLRect cur_rect = getRect(); + cur_rect.translate(0, channel_bottom - cur_rect.mBottom); + setRect(cur_rect); + + S32 bottom = channel_bottom; S32 margin = gSavedSettings.getS32("ToastGap"); //sort active toasts -- cgit v1.2.3 From 52d3f86438925d5d9509d93b162ea8915e1caad7 Mon Sep 17 00:00:00 2001 From: Richard Nelson <none@none> Date: Mon, 4 Oct 2010 18:39:09 -0700 Subject: fixed merging of textures.xml between current skin and base now possible to define new textures in current skin --- indra/newview/llviewertexturelist.cpp | 74 ++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 35 deletions(-) (limited to 'indra') diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index bbf7c8e60e..06c218ad94 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -1513,42 +1513,45 @@ bool LLUIImageList::initFromFile() return false; } - std::vector<std::string> paths; - // path to current selected skin - paths.push_back(gDirUtilp->getSkinDir() - + gDirUtilp->getDirDelimiter() - + "textures" - + gDirUtilp->getDirDelimiter() - + "textures.xml"); - // path to user overrides on current skin - paths.push_back(gDirUtilp->getUserSkinDir() - + gDirUtilp->getDirDelimiter() - + "textures" - + gDirUtilp->getDirDelimiter() - + "textures.xml"); - - // apply skinned xml files incrementally - for(std::vector<std::string>::iterator path_it = paths.begin(); - path_it != paths.end(); - ++path_it) - { - // don't reapply base file to itself - if (!path_it->empty() && (*path_it) != base_file_path) - { - LLXMLNodePtr update_root; - if (LLXMLNode::parseFile(*path_it, update_root, NULL)) - { - LLXMLNode::updateNode(root, update_root); - } - } - } - UIImageDeclarations images; LLXUIParser parser; parser.readXUI(root, images, base_file_path); + // add components defined in current skin + std::string skin_update_path = gDirUtilp->getSkinDir() + + gDirUtilp->getDirDelimiter() + + "textures" + + gDirUtilp->getDirDelimiter() + + "textures.xml"; + LLXMLNodePtr update_root; + if (skin_update_path != base_file_path + && LLXMLNode::parseFile(skin_update_path, update_root, NULL)) + { + parser.readXUI(update_root, images, skin_update_path); + } + + // add components defined in user override of current skin + skin_update_path = gDirUtilp->getUserSkinDir() + + gDirUtilp->getDirDelimiter() + + "textures" + + gDirUtilp->getDirDelimiter() + + "textures.xml"; + if (skin_update_path != base_file_path + && LLXMLNode::parseFile(skin_update_path, update_root, NULL)) + { + parser.readXUI(update_root, images, skin_update_path); + } + if (!images.validateBlock()) return false; + std::map<std::string, UIImageDeclaration> merged_declarations; + for (LLInitParam::ParamIterator<UIImageDeclaration>::const_iterator image_it = images.textures.begin(); + image_it != images.textures.end(); + ++image_it) + { + merged_declarations[image_it->name].overwriteFrom(*image_it); + } + enum e_decode_pass { PASS_DECODE_NOW, @@ -1558,19 +1561,20 @@ bool LLUIImageList::initFromFile() for (S32 cur_pass = PASS_DECODE_NOW; cur_pass < NUM_PASSES; cur_pass++) { - for (LLInitParam::ParamIterator<UIImageDeclaration>::const_iterator image_it = images.textures.begin(); - image_it != images.textures.end(); + for (std::map<std::string, UIImageDeclaration>::const_iterator image_it = merged_declarations.begin(); + image_it != merged_declarations.end(); ++image_it) { - std::string file_name = image_it->file_name.isProvided() ? image_it->file_name() : image_it->name(); + const UIImageDeclaration& image = image_it->second; + std::string file_name = image.file_name.isProvided() ? image.file_name() : image.name(); // load high priority textures on first pass (to kick off decode) - enum e_decode_pass decode_pass = image_it->preload ? PASS_DECODE_NOW : PASS_DECODE_LATER; + enum e_decode_pass decode_pass = image.preload ? PASS_DECODE_NOW : PASS_DECODE_LATER; if (decode_pass != cur_pass) { continue; } - preloadUIImage(image_it->name, file_name, image_it->use_mips, image_it->scale); + preloadUIImage(image.name, file_name, image.use_mips, image.scale); } if (cur_pass == PASS_DECODE_NOW && !gSavedSettings.getBOOL("NoPreload")) -- cgit v1.2.3 From 3081f89744ab527af4c843bdf898654d4ba87b57 Mon Sep 17 00:00:00 2001 From: Richard Nelson <none@none> Date: Mon, 4 Oct 2010 19:07:28 -0700 Subject: EXP-138 FIXED Chat and IM notices not aligned with Bottom bar in Skylight Viewer --- indra/newview/llnearbychathandler.cpp | 6 ++---- indra/newview/llscreenchannel.cpp | 22 ++++++++++++++-------- indra/newview/llscreenchannel.h | 2 ++ 3 files changed, 18 insertions(+), 12 deletions(-) (limited to 'indra') diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index f06f4eab28..adb79fd4fd 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -336,10 +336,8 @@ void LLNearbyChatScreenChannel::showToastsBottom() return; LLRect toast_rect; - S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin"); - LLRect cur_rect = getRect(); - cur_rect.translate(0, channel_bottom - cur_rect.mBottom); - setRect(cur_rect); + updateBottom(); + S32 channel_bottom = getRect().mBottom; S32 bottom = channel_bottom; S32 margin = gSavedSettings.getS32("ToastGap"); diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index 5c923a0409..b90ff80294 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -136,12 +136,22 @@ void LLScreenChannelBase::init(S32 channel_left, S32 channel_right) side_bar->getCollapseSignal().connect(boost::bind(&LLScreenChannelBase::resetPositionAndSize, this, _2)); } + // top and bottom set by updateBottom() + setRect(LLRect(channel_left, 0, channel_right, 0)); + updateBottom(); + setVisible(TRUE); +} + +void LLScreenChannelBase::updateBottom() +{ S32 channel_top = gViewerWindow->getWorldViewRectScaled().getHeight(); S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin"); + S32 channel_left = getRect().mLeft; + S32 channel_right = getRect().mRight; setRect(LLRect(channel_left, channel_top, channel_right, channel_bottom)); - setVisible(TRUE); } + //-------------------------------------------------------------------------- ////////////////////// // LLScreenChannel @@ -512,6 +522,8 @@ void LLScreenChannel::showToastsBottom() S32 toast_margin = 0; std::vector<ToastElem>::reverse_iterator it; + updateBottom(); + LLDockableFloater* floater = dynamic_cast<LLDockableFloater*>(LLDockableFloater::getInstanceHandle().get()); for(it = mToastList.rbegin(); it != mToastList.rend(); ++it) @@ -866,13 +878,7 @@ void LLScreenChannel::updateShowToastsState() return; } - S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");; - LLRect this_rect = getRect(); - - if(channel_bottom != this_rect.mBottom) - { - setRect(LLRect(this_rect.mLeft, this_rect.mTop, this_rect.mRight, channel_bottom)); - } + updateBottom(); } //-------------------------------------------------------------------------- diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h index 6cf6d97550..62f822458b 100644 --- a/indra/newview/llscreenchannel.h +++ b/indra/newview/llscreenchannel.h @@ -111,6 +111,8 @@ public: LLUUID getChannelID() { return mID; } protected: + void updateBottom(); + // Channel's flags bool mControlHovering; LLToast* mHoveredToast; -- cgit v1.2.3 From ff81c6c529ce2c7216ee2cd5aa60b7a232792fec Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 5 Oct 2010 14:31:07 -0700 Subject: changed format of notification_visibility rules to be cleaner --- indra/llui/llnotifications.cpp | 45 +++++++++++++--------- indra/llui/llnotificationvisibilityrule.h | 45 +++++++++++++++------- .../default/xui/en/notification_visibility.xml | 2 +- 3 files changed, 59 insertions(+), 33 deletions(-) (limited to 'indra') diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index 92fa6ada54..c41c19216c 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -431,13 +431,30 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par mForm = LLNotificationFormPtr(new LLNotificationForm(p.name, p.form_ref.form)); } -LLNotificationVisibilityRule::LLNotificationVisibilityRule(const LLNotificationVisibilityRule::Params &p) -: mVisible(p.visible), - mResponse(p.response), - mType(p.type), - mTag(p.tag), - mName(p.name) +LLNotificationVisibilityRule::LLNotificationVisibilityRule(const LLNotificationVisibilityRule::Rule &p) { + if (p.show.isChosen()) + { + mType = p.show.type; + mTag = p.show.tag; + mName = p.show.name; + mVisible = true; + } + else if (p.hide.isChosen()) + { + mType = p.hide.type; + mTag = p.hide.tag; + mName = p.hide.name; + mVisible = false; + } + else if (p.respond.isChosen()) + { + mType = p.respond.type; + mTag = p.respond.tag; + mName = p.respond.name; + mVisible = false; + mResponse = p.respond.response; + } } LLNotification::LLNotification(const LLNotification::Params& p) : @@ -1465,18 +1482,9 @@ bool LLNotifications::loadVisibilityRules() const std::string xml_filename = "notification_visibility.xml"; std::string full_filename = gDirUtilp->findSkinnedFilename(LLUI::getXUIPaths().front(), xml_filename); - LLXMLNodePtr root; - BOOL success = LLUICtrlFactory::getLayeredXMLNode(xml_filename, root); - - if (!success || root.isNull() || !root->hasName( "notification_visibility" )) - { - llerrs << "Problem reading UI Notification Visibility Rules file: " << full_filename << llendl; - return false; - } - LLNotificationVisibilityRule::Rules params; - LLXUIParser parser; - parser.readXUI(root, params, full_filename); + LLSimpleXUIParser parser; + parser.readXUI(full_filename, params); if(!params.validateBlock()) { @@ -1486,7 +1494,8 @@ bool LLNotifications::loadVisibilityRules() mVisibilityRules.clear(); - for(LLInitParam::ParamIterator<LLNotificationVisibilityRule::Params>::iterator it = params.rules.begin(), end_it = params.rules.end(); + for(LLInitParam::ParamIterator<LLNotificationVisibilityRule::Rule>::iterator it = params.rules.begin(), + end_it = params.rules.end(); it != end_it; ++it) { diff --git a/indra/llui/llnotificationvisibilityrule.h b/indra/llui/llnotificationvisibilityrule.h index 58a7eb6176..78bdec2a8f 100644 --- a/indra/llui/llnotificationvisibilityrule.h +++ b/indra/llui/llnotificationvisibilityrule.h @@ -37,34 +37,51 @@ // from the appropriate local language directory). struct LLNotificationVisibilityRule { - struct Params : public LLInitParam::Block<Params> + struct Filter : public LLInitParam::Block<Filter> { - Mandatory<bool> visible; - Optional<std::string> response; - Optional<std::string> type; - Optional<std::string> tag; - Optional<std::string> name; - - Params() - : visible("visible"), - response("response"), - type("type"), + Optional<std::string> type, + tag, + name; + + Filter() + : type("type"), tag("tag"), name("name") {} }; + struct Respond : public LLInitParam::Block<Respond, Filter> + { + Mandatory<std::string> response; + + Respond() + : response("response") + {} + }; + + struct Rule : public LLInitParam::Choice<Rule> + { + Alternative<Filter> show; + Alternative<Filter> hide; + Alternative<Respond> respond; + + Rule() + : show("show"), + hide("hide"), + respond("respond") + {} + }; struct Rules : public LLInitParam::Block<Rules> { - Multiple<Params> rules; + Multiple<Rule> rules; Rules() - : rules("rule") + : rules("") {} }; - LLNotificationVisibilityRule(const Params& p); + LLNotificationVisibilityRule(const Rule& p); // If true, this rule makes matching notifications visible. Otherwise, it makes them invisible. bool mVisible; diff --git a/indra/newview/skins/default/xui/en/notification_visibility.xml b/indra/newview/skins/default/xui/en/notification_visibility.xml index cb36890fe6..ea32a83b83 100644 --- a/indra/newview/skins/default/xui/en/notification_visibility.xml +++ b/indra/newview/skins/default/xui/en/notification_visibility.xml @@ -1,5 +1,5 @@ <?xml version="1.0" ?> <notification_visibility> - <rule visible="true"/> + <show/> </notification_visibility> -- cgit v1.2.3 From 7a387f25250cc8cfc3b62c4ae845d1a67f4990b3 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 5 Oct 2010 14:31:25 -0700 Subject: tighter packing of boolean params by shuffling member variables --- indra/llxuixml/llinitparam.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h index 8cb5bd80fc..ad9b584632 100644 --- a/indra/llxuixml/llinitparam.h +++ b/indra/llxuixml/llinitparam.h @@ -303,8 +303,8 @@ namespace LLInitParam private: friend class BaseBlock; - bool mIsProvided; U16 mEnclosingBlockOffset; + bool mIsProvided; }; // various callbacks and constraints associated with an individual param -- cgit v1.2.3 From b285fd4d0abf9113fc416c30ac115db06c9f2ebf Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Tue, 5 Oct 2010 16:42:24 -0700 Subject: Fix for EXP-131 "Call dialog shown in locked position when a Resident calls a Skylight visitor" Added the setting VoiceCallsRejectAll, which causes the viewer to silently reject all incoming voice calls. Reviewed by Callum. --- indra/newview/app_settings/settings.xml | 11 +++++++++++ indra/newview/llimview.cpp | 21 ++++++++++----------- 2 files changed, 21 insertions(+), 11 deletions(-) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 04d1137ac8..09f74e5508 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -11410,6 +11410,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>VoiceCallsRejectAll</key> + <map> + <key>Comment</key> + <string>Silently reject all incoming voice calls.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>VoiceDisableMic</key> <map> <key>Comment</key> diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 01e1c3caa0..6b4e1f7289 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -2571,17 +2571,16 @@ void LLIMMgr::inviteToSession( if (type == IM_SESSION_P2P_INVITE || ad_hoc_invite) { - // is the inviter a friend? - if (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL) - { - // if not, and we are ignoring voice invites from non-friends - // then silently decline - if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly")) - { - // invite not from a friend, so decline - LLNotifications::instance().forceResponse(LLNotification::Params("VoiceInviteP2P").payload(payload), 1); - return; - } + + if ( // if we're rejecting all incoming call requests + gSavedSettings.getBOOL("VoiceCallsRejectAll") + // or we're rejecting non-friend voice calls and this isn't a friend + || (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL)) + ) + { + // silently decline the call + LLNotifications::instance().forceResponse(LLNotification::Params("VoiceInviteP2P").payload(payload), 1); + return; } } -- cgit v1.2.3 From f5b3fc596d029d3ac2f953ee94ea3ae131d00940 Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Wed, 6 Oct 2010 15:34:32 -0700 Subject: Add support for debug setting to disable link highlight & follow in URLs that appear in XUI widgets --- indra/llui/llurlentry.cpp | 10 ++++++++++ indra/llui/llurlentry.h | 2 +- indra/llui/tests/llurlentry_test.cpp | 9 +++++++++ indra/newview/app_settings/settings.xml | 11 +++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 5680ab8bd4..13c729ace9 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -27,6 +27,7 @@ #include "linden_common.h" #include "llurlentry.h" +#include "lluictrl.h" #include "lluri.h" #include "llurlmatch.h" #include "llurlregistry.h" @@ -146,6 +147,15 @@ void LLUrlEntryBase::callObservers(const std::string &id, const std::string &lab } } +/// is this a match for a URL that should not be hyperlinked? +bool LLUrlEntryBase::isLinkDisabled() const +{ + // this allows us to have a global setting to turn off text hyperlink highlighting/action + bool globally_disabled = LLUI::sSettingGroups["config"]->getBOOL("DisableTextHyperlinkActions"); + + return mDisabledLink || globally_disabled; +} + static std::string getStringAfterToken(const std::string str, const std::string token) { size_t pos = str.find(token); diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index e25eaa7555..623856c320 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -86,7 +86,7 @@ public: virtual std::string getLocation(const std::string &url) const { return ""; } /// is this a match for a URL that should not be hyperlinked? - bool isLinkDisabled() const { return mDisabledLink; } + bool isLinkDisabled() const; /// Should this link text be underlined only when mouse is hovered over it? virtual bool underlineOnHoverOnly(const std::string &string) const { return false; } diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp index 95affe4460..4c2b3a8d59 100644 --- a/indra/llui/tests/llurlentry_test.cpp +++ b/indra/llui/tests/llurlentry_test.cpp @@ -27,12 +27,21 @@ #include "linden_common.h" #include "../llurlentry.h" +#include "../lluictrl.h" #include "llurlentry_stub.cpp" #include "lltut.h" #include "../lluicolortable.h" #include <boost/regex.hpp> +typedef std::map<std::string, LLControlGroup*> settings_map_t; +settings_map_t LLUI::sSettingGroups; + +BOOL LLControlGroup::getBOOL(const std::string& name) +{ + return false; +} + LLUIColor LLUIColorTable::getColor(const std::string& name, const LLColor4& default_color) const { return LLUIColor(); diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 09f74e5508..345a1f3576 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -2556,6 +2556,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>DisableTextHyperlinkActions</key> + <map> + <key>Comment</key> + <string>Disable highlighting and linking of URLs in XUI text boxes</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>DisableVerticalSync</key> <map> <key>Comment</key> -- cgit v1.2.3 From f974a019b19a68fee219eb1b4e80d6dc5c5df92e Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Wed, 6 Oct 2010 16:50:04 -0700 Subject: Added DisableExternalBrowser setting. Reviewed by Callum. --- indra/newview/app_settings/settings.xml | 11 +++++++++++ indra/newview/llweb.cpp | 7 +++++++ 2 files changed, 18 insertions(+) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 345a1f3576..204097769a 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -2545,6 +2545,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>DisableExternalBrowser</key> + <map> + <key>Comment</key> + <string>Disable opening an external browser.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>DisableRendering</key> <map> <key>Comment</key> diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp index 73a37a6993..6028a8fbea 100644 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -116,6 +116,13 @@ void LLWeb::loadURLExternal(const std::string& url, bool async, const std::strin // Act like the proxy window was closed, since we won't be able to track targeted windows in the external browser. LLViewerMedia::proxyWindowClosed(uuid); + if(gSavedSettings.getBOOL("DisableExternalBrowser")) + { + // Don't open an external browser under any circumstances. + llwarns << "Blocked attempt to open external browser." << llendl; + return; + } + LLSD payload; payload["url"] = url; LLNotificationsUtil::add( "WebLaunchExternalTarget", LLSD(), payload, boost::bind(on_load_url_external_response, _1, _2, async)); -- cgit v1.2.3 From 5647e745989d6c3e4387ec990a35c4308dd6b929 Mon Sep 17 00:00:00 2001 From: Richard Nelson <none@none> Date: Wed, 6 Oct 2010 16:56:38 -0700 Subject: added param block support for empty/undefined elements in XML/LLSD respectively. This way <foo/> or LLSD["foo"]; both define a default constructed value for the parameter named foo, useful in the Multiple<T> case --- indra/llui/llsdparam.cpp | 27 ++++++++++++++++++ indra/llui/llsdparam.h | 2 ++ indra/llxuixml/llinitparam.cpp | 7 +++++ indra/llxuixml/llinitparam.h | 3 ++ indra/llxuixml/llxuiparser.cpp | 63 +++++++++++++++++++++++++++++++++++++++--- indra/llxuixml/llxuiparser.h | 6 +++- 6 files changed, 103 insertions(+), 5 deletions(-) (limited to 'indra') diff --git a/indra/llui/llsdparam.cpp b/indra/llui/llsdparam.cpp index f97f80ab6c..fae20a473e 100644 --- a/indra/llui/llsdparam.cpp +++ b/indra/llui/llsdparam.cpp @@ -45,6 +45,7 @@ LLParamSDParser::LLParamSDParser() if (sReadFuncs.empty()) { + registerParserFuncs<LLInitParam::NoValue>(readNoValue, &LLParamSDParser::writeNoValue); registerParserFuncs<S32>(readS32, &LLParamSDParser::writeTypedValue<S32>); registerParserFuncs<U32>(readU32, &LLParamSDParser::writeU32Param); registerParserFuncs<F32>(readF32, &LLParamSDParser::writeTypedValue<F32>); @@ -71,6 +72,18 @@ bool LLParamSDParser::writeU32Param(LLParamSDParser::parser_t& parser, const voi return true; } +bool LLParamSDParser::writeNoValue(LLParamSDParser::parser_t& parser, const void* val_ptr, const parser_t::name_stack_t& name_stack) +{ + LLParamSDParser& sdparser = static_cast<LLParamSDParser&>(parser); + if (!sdparser.mWriteRootSD) return false; + + LLSD* sd_to_write = sdparser.getSDWriteNode(name_stack); + if (!sd_to_write) return false; + + return true; +} + + void LLParamSDParser::readSD(const LLSD& sd, LLInitParam::BaseBlock& block, bool silent) { mCurReadSD = NULL; @@ -87,6 +100,8 @@ void LLParamSDParser::writeSD(LLSD& sd, const LLInitParam::BaseBlock& block) block.serializeBlock(*this); } +const LLSD NO_VALUE_MARKER; + void LLParamSDParser::readSDValues(const LLSD& sd, LLInitParam::BaseBlock& block) { if (sd.isMap()) @@ -110,6 +125,11 @@ void LLParamSDParser::readSDValues(const LLSD& sd, LLInitParam::BaseBlock& block readSDValues(*it, block); } } + else if (sd.isUndefined()) + { + mCurReadSD = &NO_VALUE_MARKER; + block.submitValue(mNameStack, *this); + } else { mCurReadSD = &sd; @@ -206,6 +226,13 @@ LLSD* LLParamSDParser::getSDWriteNode(const parser_t::name_stack_t& name_stack) return sd_to_write; } +bool LLParamSDParser::readNoValue(Parser& parser, void* val_ptr) +{ + LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + return self.mCurReadSD == &NO_VALUE_MARKER; +} + + bool LLParamSDParser::readS32(Parser& parser, void* val_ptr) { LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); diff --git a/indra/llui/llsdparam.h b/indra/llui/llsdparam.h index 97e8b58e49..69dab2b411 100644 --- a/indra/llui/llsdparam.h +++ b/indra/llui/llsdparam.h @@ -63,7 +63,9 @@ private: LLSD* getSDWriteNode(const parser_t::name_stack_t& name_stack); static bool writeU32Param(Parser& parser, const void* value_ptr, const parser_t::name_stack_t& name_stack); + static bool writeNoValue(Parser& parser, const void* value_ptr, const parser_t::name_stack_t& name_stack); + static bool readNoValue(Parser& parser, void* val_ptr); static bool readS32(Parser& parser, void* val_ptr); static bool readU32(Parser& parser, void* val_ptr); static bool readF32(Parser& parser, void* val_ptr); diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp index 2c92539387..7ffcd91879 100644 --- a/indra/llxuixml/llinitparam.cpp +++ b/indra/llxuixml/llinitparam.cpp @@ -312,6 +312,13 @@ namespace LLInitParam } } + // if no match, and no names left on stack, this is just an existence assertion of this block + // verify by calling readValue with NoValue type, an inherently unparseable type + if (!names_left) + { + return p.readValue(NoValue()); + } + return false; } diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h index ad9b584632..66ef8e65cd 100644 --- a/indra/llxuixml/llinitparam.h +++ b/indra/llxuixml/llinitparam.h @@ -278,6 +278,9 @@ namespace LLInitParam S32 mParseGeneration; }; + // used to indicate no matching value to a given name when parsing + struct NoValue{}; + class BaseBlock; class Param diff --git a/indra/llxuixml/llxuiparser.cpp b/indra/llxuixml/llxuiparser.cpp index e1ad9a5c71..723a20f382 100644 --- a/indra/llxuixml/llxuiparser.cpp +++ b/indra/llxuixml/llxuiparser.cpp @@ -382,6 +382,7 @@ LLXUIParser::LLXUIParser() { if (sXUIReadFuncs.empty()) { + registerParserFuncs<LLInitParam::NoValue>(readNoValue, writeNoValue); registerParserFuncs<bool>(readBoolValue, writeBoolValue); registerParserFuncs<std::string>(readStringValue, writeStringValue); registerParserFuncs<U8>(readU8Value, writeU8Value); @@ -400,6 +401,7 @@ LLXUIParser::LLXUIParser() } static LLFastTimer::DeclareTimer FTM_PARSE_XUI("XUI Parsing"); +const LLXMLNodePtr DUMMY_NODE = new LLXMLNode(); void LLXUIParser::readXUI(LLXMLNodePtr node, LLInitParam::BaseBlock& block, const std::string& filename, bool silent) { @@ -426,6 +428,17 @@ bool LLXUIParser::readXUIImpl(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block) boost::char_separator<char> sep("."); bool values_parsed = false; + bool silent = mCurReadDepth > 0; + + if (nodep->getFirstChild().isNull() + && nodep->mAttributes.empty() + && nodep->getSanitizedValue().empty()) + { + // empty node, just parse as NoValue + mCurReadNode = DUMMY_NODE; + return block.submitValue(mNameStack, *this, silent); + } + // submit attributes for current node values_parsed |= readAttributes(nodep, block); @@ -438,7 +451,6 @@ bool LLXUIParser::readXUIImpl(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block) mNameStack.push_back(std::make_pair(std::string("value"), newParseGeneration())); // child nodes are not necessarily valid parameters (could be a child widget) // so don't complain once we've recursed - bool silent = mCurReadDepth > 0; if (!block.submitValue(mNameStack, *this, true)) { mNameStack.pop_back(); @@ -543,6 +555,7 @@ bool LLXUIParser::readAttributes(LLXMLNodePtr nodep, LLInitParam::BaseBlock& blo boost::char_separator<char> sep("."); bool any_parsed = false; + bool silent = mCurReadDepth > 0; for(LLXMLAttribList::const_iterator attribute_it = nodep->mAttributes.begin(); attribute_it != nodep->mAttributes.end(); @@ -561,7 +574,6 @@ bool LLXUIParser::readAttributes(LLXMLNodePtr nodep, LLInitParam::BaseBlock& blo } // child nodes are not necessarily valid attributes, so don't complain once we've recursed - bool silent = mCurReadDepth > 0; any_parsed |= block.submitValue(mNameStack, *this, silent); while(num_tokens_pushed-- > 0) @@ -628,6 +640,19 @@ LLXMLNodePtr LLXUIParser::getNode(const name_stack_t& stack) return (out_node == mWriteRootNode ? LLXMLNodePtr(NULL) : out_node); } +bool LLXUIParser::readNoValue(Parser& parser, void* val_ptr) +{ + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + return self.mCurReadNode == DUMMY_NODE; +} + +bool LLXUIParser::writeNoValue(Parser& parser, const void* val_ptr, const name_stack_t& stack) +{ + // just create node + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + LLXMLNodePtr node = self.getNode(stack); + return node.notNull(); +} bool LLXUIParser::readBoolValue(Parser& parser, void* val_ptr) { @@ -1043,6 +1068,8 @@ static LLInitParam::Parser::parser_read_func_map_t sSimpleXUIReadFuncs; static LLInitParam::Parser::parser_write_func_map_t sSimpleXUIWriteFuncs; static LLInitParam::Parser::parser_inspect_func_map_t sSimpleXUIInspectFuncs; +const char* NO_VALUE_MARKER = "no_value"; + LLSimpleXUIParser::LLSimpleXUIParser(LLSimpleXUIParser::element_start_callback_t element_cb) : Parser(sSimpleXUIReadFuncs, sSimpleXUIWriteFuncs, sSimpleXUIInspectFuncs), mLastWriteGeneration(-1), @@ -1051,6 +1078,7 @@ LLSimpleXUIParser::LLSimpleXUIParser(LLSimpleXUIParser::element_start_callback_t { if (sSimpleXUIReadFuncs.empty()) { + registerParserFuncs<LLInitParam::NoValue>(readNoValue); registerParserFuncs<bool>(readBoolValue); registerParserFuncs<std::string>(readStringValue); registerParserFuncs<U8>(readU8Value); @@ -1114,6 +1142,8 @@ bool LLSimpleXUIParser::readXUI(const std::string& filename, LLInitParam::BaseBl return false; } + mEmptyLeafNode.push_back(false); + if( !XML_ParseBuffer(mParser, bytes_read, TRUE ) ) { LL_WARNS("ReadXUI") << "Error while parsing file " << filename << LL_ENDL; @@ -1121,6 +1151,8 @@ bool LLSimpleXUIParser::readXUI(const std::string& filename, LLInitParam::BaseBl return false; } + mEmptyLeafNode.pop_back(); + XML_ParserFree( mParser ); return true; } @@ -1205,8 +1237,14 @@ void LLSimpleXUIParser::startElement(const char *name, const char **atts) } } + // parent node is not empty + mEmptyLeafNode.back() = false; + // we are empty if we have no attributes + mEmptyLeafNode.push_back(atts[0] == NULL); + mTokenSizeStack.push_back(num_tokens_pushed); readAttributes(atts); + } bool LLSimpleXUIParser::readAttributes(const char **atts) @@ -1240,7 +1278,7 @@ bool LLSimpleXUIParser::readAttributes(const char **atts) return any_parsed; } -void LLSimpleXUIParser::processText() +bool LLSimpleXUIParser::processText() { if (!mTextContents.empty()) { @@ -1253,12 +1291,22 @@ void LLSimpleXUIParser::processText() mNameStack.pop_back(); } mTextContents.clear(); + return true; } + return false; } void LLSimpleXUIParser::endElement(const char *name) { - processText(); + bool has_text = processText(); + + // no text, attributes, or children + if (!has_text && mEmptyLeafNode.back()) + { + // submit this as a valueless name (even though there might be text contents we haven't seen yet) + mCurAttributeValueBegin = NO_VALUE_MARKER; + mOutputStack.back().first->submitValue(mNameStack, *this, mParseSilently); + } if (--mOutputStack.back().second == 0) { @@ -1276,6 +1324,7 @@ void LLSimpleXUIParser::endElement(const char *name) mNameStack.pop_back(); } mScope.pop_back(); + mEmptyLeafNode.pop_back(); } void LLSimpleXUIParser::characterData(const char *s, int len) @@ -1322,6 +1371,12 @@ void LLSimpleXUIParser::parserError(const std::string& message) #endif } +bool LLSimpleXUIParser::readNoValue(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); + return self.mCurAttributeValueBegin == NO_VALUE_MARKER; +} + bool LLSimpleXUIParser::readBoolValue(Parser& parser, void* val_ptr) { LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); diff --git a/indra/llxuixml/llxuiparser.h b/indra/llxuixml/llxuiparser.h index 5c613b0c69..7a748d8aea 100644 --- a/indra/llxuixml/llxuiparser.h +++ b/indra/llxuixml/llxuiparser.h @@ -116,6 +116,7 @@ private: bool readAttributes(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block); //reader helper functions + static bool readNoValue(Parser& parser, void* val_ptr); static bool readBoolValue(Parser& parser, void* val_ptr); static bool readStringValue(Parser& parser, void* val_ptr); static bool readU8Value(Parser& parser, void* val_ptr); @@ -132,6 +133,7 @@ private: static bool readSDValue(Parser& parser, void* val_ptr); //writer helper functions + static bool writeNoValue(Parser& parser, const void* val_ptr, const name_stack_t&); static bool writeBoolValue(Parser& parser, const void* val_ptr, const name_stack_t&); static bool writeStringValue(Parser& parser, const void* val_ptr, const name_stack_t&); static bool writeU8Value(Parser& parser, const void* val_ptr, const name_stack_t&); @@ -194,6 +196,7 @@ public: private: //reader helper functions + static bool readNoValue(Parser&, void* val_ptr); static bool readBoolValue(Parser&, void* val_ptr); static bool readStringValue(Parser&, void* val_ptr); static bool readU8Value(Parser&, void* val_ptr); @@ -218,7 +221,7 @@ private: void endElement(const char *name); void characterData(const char *s, int len); bool readAttributes(const char **atts); - void processText(); + bool processText(); Parser::name_stack_t mNameStack; struct XML_ParserStruct* mParser; @@ -230,6 +233,7 @@ private: const char* mCurAttributeValueBegin; std::vector<S32> mTokenSizeStack; std::vector<std::string> mScope; + std::vector<bool> mEmptyLeafNode; element_start_callback_t mElementCB; std::vector<std::pair<LLInitParam::BaseBlock*, S32> > mOutputStack; -- cgit v1.2.3 From a21be75f605822310d819dcb5c35157676b4f740 Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Wed, 6 Oct 2010 17:07:14 -0700 Subject: Fix for a compile error. Reviwed by Richard. --- indra/llxuixml/llinitparam.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp index 7ffcd91879..bf2de9360a 100644 --- a/indra/llxuixml/llinitparam.cpp +++ b/indra/llxuixml/llinitparam.cpp @@ -316,7 +316,8 @@ namespace LLInitParam // verify by calling readValue with NoValue type, an inherently unparseable type if (!names_left) { - return p.readValue(NoValue()); + NoValue no_value; + return p.readValue(no_value); } return false; -- cgit v1.2.3 From 0e05afdac5c8864080748f2c2c30b0743fd80d1a Mon Sep 17 00:00:00 2001 From: Richard Nelson <none@none> Date: Wed, 6 Oct 2010 19:41:55 -0700 Subject: allow passing LLSD arguments on command line --- indra/llxml/llcontrol.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'indra') diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp index f9a39826f5..2822b767e5 100644 --- a/indra/llxml/llcontrol.cpp +++ b/indra/llxml/llcontrol.cpp @@ -170,6 +170,19 @@ LLSD LLControlVariable::getComparableValue(const LLSD& value) storable_value = false; } } + else if (TYPE_LLSD == type() && value.isString()) + { + LLPointer<LLSDNotationParser> parser = new LLSDNotationParser; + LLSD result; + if (parser->parse(std::stringstream(value.asString()), result, LLSDSerialize::SIZE_UNLIMITED) != LLSDParser::PARSE_FAILURE) + { + storable_value = result; + } + else + { + storable_value = value; + } + } else { storable_value = value; -- cgit v1.2.3 From 01b28ddf5ddc7118bc8b2047d899aee0293a8721 Mon Sep 17 00:00:00 2001 From: Richard Nelson <none@none> Date: Wed, 6 Oct 2010 20:10:36 -0700 Subject: EXP-156 WIP Implement custom Skylight hints --- indra/newview/app_settings/ignorable_dialogs.xml | 11 ++++ indra/newview/app_settings/settings.xml | 2 +- indra/newview/llbottomtray.cpp | 1 + indra/newview/llfirstuse.cpp | 11 +++- indra/newview/llfirstuse.h | 1 + indra/newview/llfloatercamera.cpp | 5 ++ indra/newview/llhints.cpp | 15 ++++- indra/newview/llnearbychathandler.cpp | 16 ++--- indra/newview/llpanelplaces.cpp | 2 - indra/newview/llpopupview.cpp | 70 ++++++++++++++++----- indra/newview/llrootview.h | 22 ------- indra/newview/llsidetray.cpp | 1 - indra/newview/lltransientfloatermgr.cpp | 4 +- indra/newview/llviewermenu.cpp | 3 +- .../newview/skins/default/textures/arrow_keys.png | Bin 0 -> 6558 bytes .../newview/skins/default/xui/en/notifications.xml | 16 +++++ .../skins/default/xui/en/panel_hint_image.xml | 39 ++++++++++++ 17 files changed, 163 insertions(+), 56 deletions(-) create mode 100644 indra/newview/skins/default/textures/arrow_keys.png create mode 100644 indra/newview/skins/default/xui/en/panel_hint_image.xml (limited to 'indra') diff --git a/indra/newview/app_settings/ignorable_dialogs.xml b/indra/newview/app_settings/ignorable_dialogs.xml index 0720ccee49..f800d836fa 100644 --- a/indra/newview/app_settings/ignorable_dialogs.xml +++ b/indra/newview/app_settings/ignorable_dialogs.xml @@ -45,6 +45,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>FirstViewPopup</key> + <map> + <key>Comment</key> + <string>Shows hint when resident opens view popup</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>FirstReceiveLindens</key> <map> <key>Comment</key> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 204097769a..d5cfc11c2c 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -12176,7 +12176,7 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <real>600.0</real> + <real>1200.0</real> </map> <key>SidePanelHintTimeout</key> <map> diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index e47009c540..d869850b7c 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -517,6 +517,7 @@ void LLBottomTray::toggleCameraControls() BOOL LLBottomTray::postBuild() { + LLHints::registerHintTarget("dest_guide_btn", getChild<LLUICtrl>("destinations_btn")->getHandle()); LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("NearbyChatBar.Action", boost::bind(&LLBottomTray::onContextMenuItemClicked, this, _2)); LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("NearbyChatBar.EnableMenuItem", boost::bind(&LLBottomTray::onContextMenuItemEnabled, this, _2)); diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index dd08706f4f..4d6302596b 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -100,7 +100,7 @@ void LLFirstUse::useSandbox() void LLFirstUse::notUsingDestinationGuide(bool enable) { // not doing this yet - //firstUseNotification("FirstNotUseDestinationGuide", enable, "HintDestinationGuide", LLSD(), LLSD().with("target", "dest_guide_btn").with("direction", "left")); + firstUseNotification("FirstNotUseDestinationGuide", enable, "HintDestinationGuide", LLSD(), LLSD().with("target", "dest_guide_btn").with("direction", "top")); } // static @@ -113,7 +113,14 @@ void LLFirstUse::notUsingSidePanel(bool enable) // static void LLFirstUse::notMoving(bool enable) { - firstUseNotification("FirstNotMoving", enable, "HintMove", LLSD(), LLSD().with("target", "move_btn").with("direction", "top")); + //firstUseNotification("FirstNotMoving", enable, "HintMove", LLSD(), LLSD().with("target", "move_btn").with("direction", "top")); + firstUseNotification("FirstNotMoving", enable, "HintMoveArrows", LLSD(), LLSD().with("hint_image", "arrow_keys.png")); +} + +// static +void LLFirstUse::viewPopup(bool enable) +{ + firstUseNotification("FirstViewPopup", enable, "HintView", LLSD(), LLSD().with("target", "view_popup").with("direction", "right")); } // static diff --git a/indra/newview/llfirstuse.h b/indra/newview/llfirstuse.h index 275f134400..3886df4ee9 100644 --- a/indra/newview/llfirstuse.h +++ b/indra/newview/llfirstuse.h @@ -89,6 +89,7 @@ public: static void notUsingDestinationGuide(bool enable = true); static void notUsingSidePanel(bool enable = true); static void notMoving(bool enable = true); + static void viewPopup(bool enable = true); static void newInventory(bool enable = true); static void receiveLindens(bool enable = true); static void useSandbox(); diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index b4e211a38e..be65396b0f 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -40,6 +40,8 @@ #include "lltoolmgr.h" #include "lltoolfocus.h" #include "llslider.h" +#include "llfirstuse.h" +#include "llhints.h" static LLDefaultChildRegistry::Register<LLPanelCameraItem> r("panel_camera_item"); @@ -294,6 +296,8 @@ LLFloaterCamera* LLFloaterCamera::findInstance() void LLFloaterCamera::onOpen(const LLSD& key) { + LLFirstUse::viewPopup(); + LLButton *anchor_panel = LLBottomTray::getInstance()->getChild<LLButton>("camera_btn"); setDockControl(new LLDockControl( @@ -339,6 +343,7 @@ LLFloaterCamera::LLFloaterCamera(const LLSD& val) LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; registrar.add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2)); + LLHints::registerHintTarget("view_popup", LLView::getHandle()); } // virtual diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp index d837ed8205..5ffc4ace59 100644 --- a/indra/newview/llhints.cpp +++ b/indra/newview/llhints.cpp @@ -33,6 +33,7 @@ #include "lltextbox.h" #include "llviewerwindow.h" #include "llviewercontrol.h" +#include "lliconctrl.h" #include "llsdparam.h" class LLHintPopup : public LLPanel @@ -80,7 +81,8 @@ public: up_arrow, right_arrow, down_arrow, - lower_left_arrow; + lower_left_arrow, + hint_image; Optional<S32> left_arrow_offset, up_arrow_offset, @@ -96,6 +98,7 @@ public: right_arrow("right_arrow"), down_arrow("down_arrow"), lower_left_arrow("lower_left_arrow"), + hint_image("hint_image"), left_arrow_offset("left_arrow_offset"), up_arrow_offset("up_arrow_offset"), right_arrow_offset("right_arrow_offset"), @@ -159,7 +162,15 @@ LLHintPopup::LLHintPopup(const LLHintPopup::Params& p) mDirection = p.target_params.direction; mTarget = p.target_params.target; } - buildFromFile( "panel_hint.xml", NULL, p); + if (p.hint_image.isProvided()) + { + buildFromFile("panel_hint_image.xml", NULL, p); + getChild<LLIconCtrl>("hint_image")->setImage(p.hint_image()); + } + else + { + buildFromFile( "panel_hint.xml", NULL, p); + } } BOOL LLHintPopup::postBuild() diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index adb79fd4fd..7ee9aac0de 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -471,6 +471,14 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args) } nearby_chat->addMessage(chat_msg, true, args); + + if(chat_msg.mSourceType == CHAT_SOURCE_AGENT + && chat_msg.mFromID.notNull() + && chat_msg.mFromID != gAgentID) + { + LLFirstUse::otherAvatarChatFirst(); + } + if( nearby_chat->getVisible() || ( chat_msg.mSourceType == CHAT_SOURCE_AGENT && gSavedSettings.getBOOL("UseChatBubbles") ) ) @@ -530,13 +538,7 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args) notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ; channel->addNotification(notification); } - - if(chat_msg.mSourceType == CHAT_SOURCE_AGENT - && chat_msg.mFromID.notNull() - && chat_msg.mFromID != gAgentID) - { - LLFirstUse::otherAvatarChatFirst(); - } + } void LLNearbyChatHandler::onDeleteToast(LLToast* toast) diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index f0e60386b6..8884228f23 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -347,8 +347,6 @@ BOOL LLPanelPlaces::postBuild() void LLPanelPlaces::onOpen(const LLSD& key) { - LLFirstUse::notUsingDestinationGuide(false); - if (!mPlaceProfile || !mLandmarkInfo) return; diff --git a/indra/newview/llpopupview.cpp b/indra/newview/llpopupview.cpp index 18035c42f4..9fbb67a63a 100644 --- a/indra/newview/llpopupview.cpp +++ b/indra/newview/llpopupview.cpp @@ -138,64 +138,102 @@ BOOL LLPopupView::handleMouseEvent(boost::function<BOOL(LLView*, S32, S32)> func BOOL LLPopupView::handleMouseDown(S32 x, S32 y, MASK mask) { - if (!handleMouseEvent(boost::bind(&LLMouseHandler::handleMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true)) + BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true); + if (!handled) { - return FALSE; + handled = LLPanel::handleMouseDown(x, y, mask); } - return TRUE; + return handled; } BOOL LLPopupView::handleMouseUp(S32 x, S32 y, MASK mask) { - return handleMouseEvent(boost::bind(&LLMouseHandler::handleMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); + BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); + if (!handled) + { + handled = LLPanel::handleMouseUp(x, y, mask); + } + return handled; } BOOL LLPopupView::handleMiddleMouseDown(S32 x, S32 y, MASK mask) { - if (!handleMouseEvent(boost::bind(&LLMouseHandler::handleMiddleMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true)) + BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleMiddleMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true); + if (!handled) { - return FALSE; + handled = LLPanel::handleMiddleMouseDown(x, y, mask); } - return TRUE; + return handled; } BOOL LLPopupView::handleMiddleMouseUp(S32 x, S32 y, MASK mask) { - return handleMouseEvent(boost::bind(&LLMouseHandler::handleMiddleMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); + BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleMiddleMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); + if (!handled) + { + handled = LLPanel::handleMiddleMouseUp(x, y, mask); + } + return handled; } BOOL LLPopupView::handleRightMouseDown(S32 x, S32 y, MASK mask) { - if (!handleMouseEvent(boost::bind(&LLMouseHandler::handleRightMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true)) + BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleRightMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true); + if (!handled) { - return FALSE; + handled = LLPanel::handleRightMouseDown(x, y, mask); } - return TRUE; + return handled; } BOOL LLPopupView::handleRightMouseUp(S32 x, S32 y, MASK mask) { - return handleMouseEvent(boost::bind(&LLMouseHandler::handleRightMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); + BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleRightMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); + if (!handled) + { + handled = LLPanel::handleRightMouseUp(x, y, mask); + } + return handled; } BOOL LLPopupView::handleDoubleClick(S32 x, S32 y, MASK mask) { - return handleMouseEvent(boost::bind(&LLMouseHandler::handleDoubleClick, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); + BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleDoubleClick, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); + if (!handled) + { + handled = LLPanel::handleDoubleClick(x, y, mask); + } + return handled; } BOOL LLPopupView::handleHover(S32 x, S32 y, MASK mask) { - return handleMouseEvent(boost::bind(&LLMouseHandler::handleHover, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); + BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleHover, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); + if (!handled) + { + handled = LLPanel::handleHover(x, y, mask); + } + return handled; } BOOL LLPopupView::handleScrollWheel(S32 x, S32 y, S32 clicks) { - return handleMouseEvent(boost::bind(&LLMouseHandler::handleScrollWheel, _1, _2, _3, clicks), view_visible_and_enabled, x, y, false); + BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleScrollWheel, _1, _2, _3, clicks), view_visible_and_enabled, x, y, false); + if (!handled) + { + handled = LLPanel::handleScrollWheel(x, y, clicks); + } + return handled; } BOOL LLPopupView::handleToolTip(S32 x, S32 y, MASK mask) { - return handleMouseEvent(boost::bind(&LLMouseHandler::handleToolTip, _1, _2, _3, mask), view_visible, x, y, false); + BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleToolTip, _1, _2, _3, mask), view_visible, x, y, false); + if (!handled) + { + handled = LLPanel::handleToolTip(x, y, mask); + } + return handled; } void LLPopupView::addPopup(LLView* popup) diff --git a/indra/newview/llrootview.h b/indra/newview/llrootview.h index 4b1ba15a0b..5223a314f3 100644 --- a/indra/newview/llrootview.h +++ b/indra/newview/llrootview.h @@ -42,27 +42,5 @@ public: LLRootView(const Params& p) : LLView(p) {} - - // added to provide possibility to handle mouse click event inside all application - // window without creating any floater - typedef boost::signals2::signal<void(S32 x, S32 y, MASK mask)> - mouse_signal_t; - - private: - mouse_signal_t mMouseDownSignal; - - public: - /*virtual*/ - BOOL handleMouseDown(S32 x, S32 y, MASK mask) - { - mMouseDownSignal(x, y, mask); - return LLView::handleMouseDown(x, y, mask); - } - - boost::signals2::connection addMouseDownCallback( - const mouse_signal_t::slot_type& cb) - { - return mMouseDownSignal.connect(cb); - } }; #endif //LL_LLROOTVIEW_H diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 53d8a5c19e..9cb6df6c30 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -878,7 +878,6 @@ void LLSideTray::createButtons () } } LLHints::registerHintTarget("inventory_btn", mTabButtons["sidebar_inventory"]->getHandle()); - LLHints::registerHintTarget("dest_guide_btn", mTabButtons["sidebar_places"]->getHandle()); } void LLSideTray::processTriState () diff --git a/indra/newview/lltransientfloatermgr.cpp b/indra/newview/lltransientfloatermgr.cpp index 78dd602f39..01e41925c9 100644 --- a/indra/newview/lltransientfloatermgr.cpp +++ b/indra/newview/lltransientfloatermgr.cpp @@ -36,8 +36,8 @@ LLTransientFloaterMgr::LLTransientFloaterMgr() { - gViewerWindow->getRootView()->addMouseDownCallback(boost::bind( - &LLTransientFloaterMgr::leftMouseClickCallback, this, _1, _2, _3)); + gViewerWindow->getRootView()->getChild<LLUICtrl>("popup_holder")->setMouseDownCallback(boost::bind( + &LLTransientFloaterMgr::leftMouseClickCallback, this, _2, _3, _4)); mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(GLOBAL, std::set<LLView*>())); mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(DOCKED, std::set<LLView*>())); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 0ff5181cc5..0454d4a249 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -44,7 +44,7 @@ #include "llconsole.h" #include "lldebugview.h" #include "llfilepicker.h" -//#include "llfirstuse.h" +#include "llfirstuse.h" #include "llfloaterbuy.h" #include "llfloaterbuycontents.h" #include "llbuycurrencyhtml.h" @@ -855,6 +855,7 @@ void LLDestinationGuideToggle() } else { + LLFirstUse::notUsingDestinationGuide(false); destination_guide->setVisible( true ); } } diff --git a/indra/newview/skins/default/textures/arrow_keys.png b/indra/newview/skins/default/textures/arrow_keys.png new file mode 100644 index 0000000000..f19af59251 Binary files /dev/null and b/indra/newview/skins/default/textures/arrow_keys.png differ diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index cf5a6ad255..6db1ae9bc0 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6463,6 +6463,22 @@ Mute everyone? To walk or run, open the Move Panel and use the directional arrows to navigate. You can also use the directional keys on your keyboard. </notification> + <notification + name="HintMoveArrows" + label="Move" + type="hint" + unique="true"> + To walk, use the directional keys on your keyboard. You can run by pressing the Up arrow twice. + </notification> + + <notification + name="HintView" + label="View" + type="hint" + unique="true"> + To change your camera view, use the Orbit and Pan controls below. Reset your view by pressing Escape or walking. + </notification> + <notification name="HintInventory" label="Inventory" diff --git a/indra/newview/skins/default/xui/en/panel_hint_image.xml b/indra/newview/skins/default/xui/en/panel_hint_image.xml new file mode 100644 index 0000000000..31a310c07b --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_hint_image.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + width="205" + height="200" + layout="topleft"> + <text name="hint_title" + font="SansSerifMedium" + left="8" + right="180" + top="8" + bottom="20" + follows="left|right|top" + text_color="Black" + wrap="false"/> + <icon name="hint_image" + left="42" + top="25" + width="115" + height="86" + image_name="arrow_keys.png" + /> + <text name="hint_text" + left="8" + right="197" + top_pad="5" + bottom="92" + follows="all" + text_color="Black" + wrap="true"/> + <button right="197" + top="8" + width="16" + height="16" + name="close" + follows="right|top" + image_color="DkGray" + image_unselected="Icon_Close_Foreground" + image_selected="Icon_Close_Press"/> +</panel> -- cgit v1.2.3 From 0fa63baf3781430d835b859094b7d2b35ae3b32b Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 7 Oct 2010 11:30:55 -0700 Subject: fix for gcc --- indra/llxml/llcontrol.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp index 2822b767e5..85d369b8cd 100644 --- a/indra/llxml/llcontrol.cpp +++ b/indra/llxml/llcontrol.cpp @@ -174,7 +174,8 @@ LLSD LLControlVariable::getComparableValue(const LLSD& value) { LLPointer<LLSDNotationParser> parser = new LLSDNotationParser; LLSD result; - if (parser->parse(std::stringstream(value.asString()), result, LLSDSerialize::SIZE_UNLIMITED) != LLSDParser::PARSE_FAILURE) + std::stringstream value_stream(value.asString()); + if (parser->parse(value_stream, result, LLSDSerialize::SIZE_UNLIMITED) != LLSDParser::PARSE_FAILURE) { storable_value = result; } -- cgit v1.2.3 From dd2eff8da2b2508d5fc46492147e015d2455f957 Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Thu, 7 Oct 2010 12:08:03 -0700 Subject: EXP-167: Quit On Login Page Activated - viewer code /default setting --- indra/newview/app_settings/settings.xml | 11 +++++++++++ indra/newview/llappviewer.cpp | 8 ++++++++ indra/newview/llappviewer.h | 1 + indra/newview/llstartup.cpp | 10 +++++++++- 4 files changed, 29 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index d5cfc11c2c..142378b540 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -6535,6 +6535,17 @@ <key>Value</key> <real>0.0</real> </map> + <key>QuitOnLoginActivated</key> + <map> + <key>Comment</key> + <string>Quit if login page is activated (used when auto login is on and users must not be able to login manually)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>RadioLandBrushAction</key> <map> <key>Comment</key> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index a9bdabe794..e6661e4c9a 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2951,6 +2951,14 @@ void LLAppViewer::earlyExit(const std::string& name, const LLSD& substitutions) LLNotificationsUtil::add(name, substitutions, LLSD(), finish_early_exit); } +// case where we need the viewer to exit without any need for notifications +void LLAppViewer::earlyExitNoNotify() +{ + llwarns << "app_early_exit with no notification: " << llendl; + gDoDisconnect = TRUE; + finish_early_exit( LLSD(), LLSD() ); +} + void LLAppViewer::forceExit(S32 arg) { removeMarkerFile(); diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 56d88f07c8..b0f8c1dc3d 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -70,6 +70,7 @@ public: void userQuit(); // The users asks to quit. Confirm, then requestQuit() void earlyExit(const std::string& name, const LLSD& substitutions = LLSD()); // Display an error dialog and forcibly quit. + void LLAppViewer::earlyExitNoNotify(); // Do not display error dialog then forcibly quit. void forceExit(S32 arg); // exit() immediately (after some cleanup). void abortQuit(); // Called to abort a quit request. diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index c56cacd12b..1a42500ec4 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -706,7 +706,15 @@ bool idle_startup() if (STATE_LOGIN_SHOW == LLStartUp::getStartupState()) { LL_DEBUGS("AppInit") << "Initializing Window" << LL_ENDL; - + + // if auto login is on and setting to quit if the login page is activated + // is enabled, then go ahead and exit + if ( gSavedSettings.getBOOL("AutoLogin") && gSavedSettings.getBOOL("QuitOnLoginActivated") ) + { + // no requirement for notification here - just exit + LLAppViewer::instance()->earlyExitNoNotify(); + } + gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW); timeout_count = 0; -- cgit v1.2.3 From c154e4b794489ff876b60b9ccfcb72ec1836cea2 Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Thu, 7 Oct 2010 14:07:31 -0700 Subject: Made VoiceCallsRejectAll apply to group voice invites as well as p2p and ad-hoc invites. Fixed some code in LLIMMgr that had the incoming call dialog confused with a notification. Reviewed by Richard. --- indra/newview/llimview.cpp | 40 ++++++++++++++++++++++------------------ indra/newview/llimview.h | 2 +- 2 files changed, 23 insertions(+), 19 deletions(-) (limited to 'indra') diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 6b4e1f7289..87a43a48dd 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1990,7 +1990,7 @@ void LLIncomingCallDialog::onOpen(const LLSD& key) void LLIncomingCallDialog::onAccept(void* user_data) { LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data; - self->processCallResponse(0); + processCallResponse(0, self->mPayload); self->closeFloater(); } @@ -1998,7 +1998,7 @@ void LLIncomingCallDialog::onAccept(void* user_data) void LLIncomingCallDialog::onReject(void* user_data) { LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data; - self->processCallResponse(1); + processCallResponse(1, self->mPayload); self->closeFloater(); } @@ -2006,20 +2006,21 @@ void LLIncomingCallDialog::onReject(void* user_data) void LLIncomingCallDialog::onStartIM(void* user_data) { LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data; - self->processCallResponse(2); + processCallResponse(2, self->mPayload); self->closeFloater(); } -void LLIncomingCallDialog::processCallResponse(S32 response) +// static +void LLIncomingCallDialog::processCallResponse(S32 response, const LLSD &payload) { if (!gIMMgr || gDisconnected) return; - LLUUID session_id = mPayload["session_id"].asUUID(); - LLUUID caller_id = mPayload["caller_id"].asUUID(); - std::string session_name = mPayload["session_name"].asString(); - EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger(); - LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)mPayload["inv_type"].asInteger(); + LLUUID session_id = payload["session_id"].asUUID(); + LLUUID caller_id = payload["caller_id"].asUUID(); + std::string session_name = payload["session_name"].asString(); + EInstantMessage type = (EInstantMessage)payload["type"].asInteger(); + LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)payload["inv_type"].asInteger(); bool voice = true; switch(response) { @@ -2036,8 +2037,8 @@ void LLIncomingCallDialog::processCallResponse(S32 response) session_id = gIMMgr->addP2PSession( session_name, caller_id, - mPayload["session_handle"].asString(), - mPayload["session_uri"].asString()); + payload["session_handle"].asString(), + payload["session_uri"].asString()); if (voice) { @@ -2098,10 +2099,10 @@ void LLIncomingCallDialog::processCallResponse(S32 response) inv_type)); // send notification message to the corresponding chat - if (mPayload["notify_box_type"].asString() == "VoiceInviteGroup" || mPayload["notify_box_type"].asString() == "VoiceInviteAdHoc") + if (payload["notify_box_type"].asString() == "VoiceInviteGroup" || payload["notify_box_type"].asString() == "VoiceInviteAdHoc") { LLStringUtil::format_map_t string_args; - string_args["[NAME]"] = mPayload["caller_name"].asString(); + string_args["[NAME]"] = payload["caller_name"].asString(); std::string message = LLTrans::getString("name_started_call", string_args); LLIMModel::getInstance()->addMessageSilently(session_id, SYSTEM_FROM, LLUUID::null, message); } @@ -2118,7 +2119,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response) { if(LLVoiceClient::getInstance()) { - std::string s = mPayload["session_handle"].asString(); + std::string s = payload["session_handle"].asString(); LLVoiceClient::getInstance()->declineInvite(s); } } @@ -2525,16 +2526,19 @@ void LLIMMgr::inviteToSession( std::string question_type = "VoiceInviteQuestionDefault"; BOOL ad_hoc_invite = FALSE; + BOOL voice_invite = FALSE; if(type == IM_SESSION_P2P_INVITE) { //P2P is different...they only have voice invitations notify_box_type = "VoiceInviteP2P"; + voice_invite = TRUE; } else if ( gAgent.isInGroup(session_id) ) { //only really old school groups have voice invitations notify_box_type = "VoiceInviteGroup"; question_type = "VoiceInviteQuestionGroup"; + voice_invite = TRUE; } else if ( inv_type == INVITATION_TYPE_VOICE ) { @@ -2542,6 +2546,7 @@ void LLIMMgr::inviteToSession( //and a voice ad-hoc notify_box_type = "VoiceInviteAdHoc"; ad_hoc_invite = TRUE; + voice_invite = TRUE; } else if ( inv_type == INVITATION_TYPE_IMMEDIATE ) { @@ -2565,13 +2570,12 @@ void LLIMMgr::inviteToSession( if (channelp && channelp->callStarted()) { // you have already started a call to the other user, so just accept the invite - LLNotifications::instance().forceResponse(LLNotification::Params("VoiceInviteP2P").payload(payload), 0); + LLIncomingCallDialog::processCallResponse(0, payload); return; } - if (type == IM_SESSION_P2P_INVITE || ad_hoc_invite) + if (voice_invite) { - if ( // if we're rejecting all incoming call requests gSavedSettings.getBOOL("VoiceCallsRejectAll") // or we're rejecting non-friend voice calls and this isn't a friend @@ -2579,7 +2583,7 @@ void LLIMMgr::inviteToSession( ) { // silently decline the call - LLNotifications::instance().forceResponse(LLNotification::Params("VoiceInviteP2P").payload(payload), 1); + LLIncomingCallDialog::processCallResponse(1, payload); return; } } diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index f7a4406f00..352936347d 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -538,9 +538,9 @@ public: static void onReject(void* user_data); static void onStartIM(void* user_data); + static void processCallResponse(S32 response, const LLSD& payload); private: /*virtual*/ void onLifetimeExpired(); - void processCallResponse(S32 response); }; class LLOutgoingCallDialog : public LLCallDialog -- cgit v1.2.3 From 49392504d95abbb2518479baa969c2963bd73adf Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 7 Oct 2010 15:01:07 -0700 Subject: enabled alternate move hint in skylight skin only --- indra/newview/llfirstuse.cpp | 3 ++- indra/newview/skins/default/xui/en/notification_visibility.xml | 1 + indra/newview/skins/default/xui/en/panel_hint_image.xml | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) (limited to 'indra') diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index 4d6302596b..b757f25d5e 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -113,7 +113,8 @@ void LLFirstUse::notUsingSidePanel(bool enable) // static void LLFirstUse::notMoving(bool enable) { - //firstUseNotification("FirstNotMoving", enable, "HintMove", LLSD(), LLSD().with("target", "move_btn").with("direction", "top")); + // fire off 2 notifications and rely on filtering to select the relevant one + firstUseNotification("FirstNotMoving", enable, "HintMove", LLSD(), LLSD().with("target", "move_btn").with("direction", "top")); firstUseNotification("FirstNotMoving", enable, "HintMoveArrows", LLSD(), LLSD().with("hint_image", "arrow_keys.png")); } diff --git a/indra/newview/skins/default/xui/en/notification_visibility.xml b/indra/newview/skins/default/xui/en/notification_visibility.xml index ea32a83b83..d32066a5a5 100644 --- a/indra/newview/skins/default/xui/en/notification_visibility.xml +++ b/indra/newview/skins/default/xui/en/notification_visibility.xml @@ -1,5 +1,6 @@ <?xml version="1.0" ?> <notification_visibility> + <hide name="HintMoveArrows"/> <show/> </notification_visibility> diff --git a/indra/newview/skins/default/xui/en/panel_hint_image.xml b/indra/newview/skins/default/xui/en/panel_hint_image.xml index 31a310c07b..00b6e42497 100644 --- a/indra/newview/skins/default/xui/en/panel_hint_image.xml +++ b/indra/newview/skins/default/xui/en/panel_hint_image.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel width="205" - height="200" + height="140" layout="topleft"> <text name="hint_title" font="SansSerifMedium" @@ -23,7 +23,7 @@ left="8" right="197" top_pad="5" - bottom="92" + bottom="120" follows="all" text_color="Black" wrap="true"/> -- cgit v1.2.3 From 2292360d8a001e05c8b95a1dc3db1c00dfec94f5 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 7 Oct 2010 15:26:33 -0700 Subject: removed word "below" from View Hint --- indra/newview/skins/default/xui/en/notifications.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 6db1ae9bc0..834fe6f966 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6476,7 +6476,7 @@ Mute everyone? label="View" type="hint" unique="true"> - To change your camera view, use the Orbit and Pan controls below. Reset your view by pressing Escape or walking. + To change your camera view, use the Orbit and Pan controls. Reset your view by pressing Escape or walking. </notification> <notification -- cgit v1.2.3 From d8e40a49ed6b57c5f2b0325803a11cf04b987652 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 7 Oct 2010 15:35:17 -0700 Subject: EXP-156 FIXED custom Skylight hints moved move hint down to bottom of screen made destination hint go away on teleport --- indra/newview/llbottomtray.cpp | 1 + indra/newview/llfirstuse.cpp | 2 +- indra/newview/llviewermessage.cpp | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index d869850b7c..fd11045f56 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -517,6 +517,7 @@ void LLBottomTray::toggleCameraControls() BOOL LLBottomTray::postBuild() { + LLHints::registerHintTarget("bottom_tray", LLView::getHandle()); LLHints::registerHintTarget("dest_guide_btn", getChild<LLUICtrl>("destinations_btn")->getHandle()); LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("NearbyChatBar.Action", boost::bind(&LLBottomTray::onContextMenuItemClicked, this, _2)); diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index b757f25d5e..5d6197c688 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -115,7 +115,7 @@ void LLFirstUse::notMoving(bool enable) { // fire off 2 notifications and rely on filtering to select the relevant one firstUseNotification("FirstNotMoving", enable, "HintMove", LLSD(), LLSD().with("target", "move_btn").with("direction", "top")); - firstUseNotification("FirstNotMoving", enable, "HintMoveArrows", LLSD(), LLSD().with("hint_image", "arrow_keys.png")); + firstUseNotification("FirstNotMoving", enable, "HintMoveArrows", LLSD(), LLSD().with("target", "bottom_tray").with("direction", "top").with("hint_image", "arrow_keys.png").with("down_arrow", "")); } // static diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 26b7e0fb6d..79a3bc5776 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -3201,6 +3201,8 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) // then this info is news to us. void process_teleport_start(LLMessageSystem *msg, void**) { + // on teleport, don't tell them about destination guide anymore + LLFirstUse::notUsingDestinationGuide(false); U32 teleport_flags = 0x0; msg->getU32("Info", "TeleportFlags", teleport_flags); -- cgit v1.2.3 From 1ae67f66d1d0203069cec62421d1d71d67a3334f Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Thu, 7 Oct 2010 15:44:35 -0700 Subject: Fixed a problem that prevented notification tags from being parsed. Added some lldebugs to the LLNotificationTemplate constructor and LLNotifications::isVisibleByRules() that may be useful in debugging notification issues in the future. --- indra/llui/llnotifications.cpp | 17 +++++++++++++---- indra/llui/llnotificationtemplate.h | 3 ++- 2 files changed, 15 insertions(+), 5 deletions(-) (limited to 'indra') diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index c41c19216c..916ca24d13 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -419,12 +419,15 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par { mUniqueContext.push_back(it->key); } - + + lldebugs << "notification \"" << mName << "\": tag count is " << p.tags.size() << llendl; + for(LLInitParam::ParamIterator<LLNotificationTemplate::Tag>::const_iterator it = p.tags.begin(), end_it = p.tags.end(); it != end_it; ++it) { + lldebugs << " tag \"" << std::string(it->value) << "\"" << llendl; mTags.push_back(it->value); } @@ -1667,7 +1670,15 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n) for(it = mVisibilityRules.begin(); it != mVisibilityRules.end(); it++) { - // An empty type or tag string will match any notification, so only do the comparison when the string is non-empty in the rule. + // An empty type/tag/name string will match any notification, so only do the comparison when the string is non-empty in the rule. + + lldebugs + << "notification \"" << n->getName() << "\" " + << "testing against " << ((*it)->mVisible?"show":"hide") << " rule, " + << "name = \"" << (*it)->mName << "\" " + << "tag = \"" << (*it)->mTag << "\" " + << "type = \"" << (*it)->mType << "\" " + << llendl; if(!(*it)->mType.empty()) { @@ -1690,8 +1701,6 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n) if(!(*it)->mName.empty()) { - lldebugs << "rule name = " << (*it)->mName << ", notification name = " << n->getName() << llendl; - // check this notification's name against the notification's name and continue if no match is found. if((*it)->mName != n->getName()) { diff --git a/indra/llui/llnotificationtemplate.h b/indra/llui/llnotificationtemplate.h index dfc2b10eb5..5a6ab40a2e 100644 --- a/indra/llui/llnotificationtemplate.h +++ b/indra/llui/llnotificationtemplate.h @@ -199,7 +199,8 @@ struct LLNotificationTemplate expire_option("expireOption", -1), url("url"), unique("unique"), - form_ref("") + form_ref(""), + tags("tag") {} }; -- cgit v1.2.3 From 6c0e9432d027dfb363baf4eaff79a835e3e75b37 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 8 Oct 2010 12:18:16 -0700 Subject: potential fix for linux build --- indra/llui/llsdparam.cpp | 2 +- indra/llxuixml/llinitparam.cpp | 4 ++-- indra/llxuixml/llinitparam.h | 2 +- indra/llxuixml/llxuiparser.cpp | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) (limited to 'indra') diff --git a/indra/llui/llsdparam.cpp b/indra/llui/llsdparam.cpp index fae20a473e..9ad13054cb 100644 --- a/indra/llui/llsdparam.cpp +++ b/indra/llui/llsdparam.cpp @@ -45,7 +45,7 @@ LLParamSDParser::LLParamSDParser() if (sReadFuncs.empty()) { - registerParserFuncs<LLInitParam::NoValue>(readNoValue, &LLParamSDParser::writeNoValue); + registerParserFuncs<LLInitParam::NoParamValue>(readNoValue, &LLParamSDParser::writeNoValue); registerParserFuncs<S32>(readS32, &LLParamSDParser::writeTypedValue<S32>); registerParserFuncs<U32>(readU32, &LLParamSDParser::writeU32Param); registerParserFuncs<F32>(readF32, &LLParamSDParser::writeTypedValue<F32>); diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp index bf2de9360a..fcdbaa4309 100644 --- a/indra/llxuixml/llinitparam.cpp +++ b/indra/llxuixml/llinitparam.cpp @@ -313,10 +313,10 @@ namespace LLInitParam } // if no match, and no names left on stack, this is just an existence assertion of this block - // verify by calling readValue with NoValue type, an inherently unparseable type + // verify by calling readValue with NoParamValue type, an inherently unparseable type if (!names_left) { - NoValue no_value; + NoParamValue no_value; return p.readValue(no_value); } diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h index 66ef8e65cd..1f9045754a 100644 --- a/indra/llxuixml/llinitparam.h +++ b/indra/llxuixml/llinitparam.h @@ -279,7 +279,7 @@ namespace LLInitParam }; // used to indicate no matching value to a given name when parsing - struct NoValue{}; + struct NoParamValue{}; class BaseBlock; diff --git a/indra/llxuixml/llxuiparser.cpp b/indra/llxuixml/llxuiparser.cpp index 723a20f382..b321eaf7a6 100644 --- a/indra/llxuixml/llxuiparser.cpp +++ b/indra/llxuixml/llxuiparser.cpp @@ -382,7 +382,7 @@ LLXUIParser::LLXUIParser() { if (sXUIReadFuncs.empty()) { - registerParserFuncs<LLInitParam::NoValue>(readNoValue, writeNoValue); + registerParserFuncs<LLInitParam::NoParamValue>(readNoValue, writeNoValue); registerParserFuncs<bool>(readBoolValue, writeBoolValue); registerParserFuncs<std::string>(readStringValue, writeStringValue); registerParserFuncs<U8>(readU8Value, writeU8Value); @@ -1078,7 +1078,7 @@ LLSimpleXUIParser::LLSimpleXUIParser(LLSimpleXUIParser::element_start_callback_t { if (sSimpleXUIReadFuncs.empty()) { - registerParserFuncs<LLInitParam::NoValue>(readNoValue); + registerParserFuncs<LLInitParam::NoParamValue>(readNoValue); registerParserFuncs<bool>(readBoolValue); registerParserFuncs<std::string>(readStringValue); registerParserFuncs<U8>(readU8Value); -- cgit v1.2.3 From bd4afcfba29a763d2253b59a86ec48228a1c6fa8 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 8 Oct 2010 14:27:42 -0700 Subject: EXP-137 FIXED Nametag text and borders do not align in Skylight Viewer fix for prim media and hud text incorrect positioning when destination guide is open --- indra/newview/llpanelprimmediacontrols.cpp | 8 ++++---- indra/newview/llviewerwindow.cpp | 13 ++----------- 2 files changed, 6 insertions(+), 15 deletions(-) (limited to 'indra') diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index b04971f980..de2428feed 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -620,12 +620,12 @@ void LLPanelPrimMediaControls::updateShape() // convert screenspace bbox to pixels (in screen coords) LLRect window_rect = gViewerWindow->getWorldViewRectScaled(); LLCoordGL screen_min; - screen_min.mX = llround((F32)window_rect.getWidth() * (min.mV[VX] + 1.f) * 0.5f); - screen_min.mY = llround((F32)window_rect.getHeight() * (min.mV[VY] + 1.f) * 0.5f); + screen_min.mX = llround((F32)window_rect.mLeft + (F32)window_rect.getWidth() * (min.mV[VX] + 1.f) * 0.5f); + screen_min.mY = llround((F32)window_rect.mBottom + (F32)window_rect.getHeight() * (min.mV[VY] + 1.f) * 0.5f); LLCoordGL screen_max; - screen_max.mX = llround((F32)window_rect.getWidth() * (max.mV[VX] + 1.f) * 0.5f); - screen_max.mY = llround((F32)window_rect.getHeight() * (max.mV[VY] + 1.f) * 0.5f); + screen_max.mX = llround((F32)window_rect.mLeft + (F32)window_rect.getWidth() * (max.mV[VX] + 1.f) * 0.5f); + screen_max.mY = llround((F32)window_rect.mBottom + (F32)window_rect.getHeight() * (max.mV[VY] + 1.f) * 0.5f); // grow panel so that screenspace bounding box fits inside "media_region" element of panel LLRect media_panel_rect; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index c6ed3f8979..b49d342126 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -4262,17 +4262,8 @@ void LLViewerWindow::setup3DRender() void LLViewerWindow::setup3DViewport(S32 x_offset, S32 y_offset) { - if (LLRenderTarget::getCurrentBoundTarget() != NULL) - { - // don't use translation component of mWorldViewRectRaw, as we are already in a properly sized render target - gGLViewport[0] = x_offset; - gGLViewport[1] = y_offset; - } - else - { - gGLViewport[0] = mWorldViewRectRaw.mLeft + x_offset; - gGLViewport[1] = mWorldViewRectRaw.mBottom + y_offset; - } + gGLViewport[0] = mWorldViewRectRaw.mLeft + x_offset; + gGLViewport[1] = mWorldViewRectRaw.mBottom + y_offset; gGLViewport[2] = mWorldViewRectRaw.getWidth(); gGLViewport[3] = mWorldViewRectRaw.getHeight(); glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]); -- cgit v1.2.3 From 688c2a73cdf982a4fe5ee0bfea0a52135fc461ef Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 8 Oct 2010 15:56:34 -0700 Subject: made progressbar derive from lluictrl and take percentage as llsd value --- indra/llui/llprogressbar.cpp | 6 +++--- indra/llui/llprogressbar.h | 8 ++++---- indra/newview/llpanelprimmediacontrols.cpp | 2 +- indra/newview/llprogressview.cpp | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) (limited to 'indra') diff --git a/indra/llui/llprogressbar.cpp b/indra/llui/llprogressbar.cpp index aaa328754d..ead22686bc 100644 --- a/indra/llui/llprogressbar.cpp +++ b/indra/llui/llprogressbar.cpp @@ -50,7 +50,7 @@ LLProgressBar::Params::Params() LLProgressBar::LLProgressBar(const LLProgressBar::Params& p) -: LLView(p), +: LLUICtrl(p), mImageBar(p.image_bar), mImageFill(p.image_fill), mColorBackground(p.color_bg()), @@ -80,7 +80,7 @@ void LLProgressBar::draw() mImageFill->draw(progress_rect, bar_color); } -void LLProgressBar::setPercent(const F32 percent) +void LLProgressBar::setValue(const LLSD& value) { - mPercentDone = llclamp(percent, 0.f, 100.f); + mPercentDone = llclamp((F32)value.asReal(), 0.f, 100.f); } diff --git a/indra/llui/llprogressbar.h b/indra/llui/llprogressbar.h index 13297f7493..3f308e7496 100644 --- a/indra/llui/llprogressbar.h +++ b/indra/llui/llprogressbar.h @@ -27,14 +27,14 @@ #ifndef LL_LLPROGRESSBAR_H #define LL_LLPROGRESSBAR_H -#include "llview.h" +#include "lluictrl.h" #include "llframetimer.h" class LLProgressBar - : public LLView + : public LLUICtrl { public: - struct Params : public LLInitParam::Block<Params, LLView::Params> + struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> { Optional<LLUIImage*> image_bar, image_fill; @@ -47,7 +47,7 @@ public: LLProgressBar(const Params&); virtual ~LLProgressBar(); - void setPercent(const F32 percent); + void setValue(const LLSD& value); /*virtual*/ void draw(); diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index de2428feed..614700fb0a 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -519,7 +519,7 @@ void LLPanelPrimMediaControls::updateShape() if(LLPluginClassMediaOwner::MEDIA_LOADING == media_plugin->getStatus()) { mMediaProgressPanel->setVisible(true); - mMediaProgressBar->setPercent(media_plugin->getProgressPercent()); + mMediaProgressBar->setValue(media_plugin->getProgressPercent()); } else { diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index e9504cbba0..db02d76139 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -207,7 +207,7 @@ void LLProgressView::setText(const std::string& text) void LLProgressView::setPercent(const F32 percent) { - mProgressBar->setPercent(percent); + mProgressBar->setValue(percent); } void LLProgressView::setMessage(const std::string& msg) -- cgit v1.2.3 From 78f0e65d63950dab8e72be6db0df22064271cfa2 Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Fri, 8 Oct 2010 16:18:47 -0700 Subject: EXP-170 Able to buy objects in Skylight viewer (viewer code and default settings changes) Note: this also adds a setting to turn off 'Pay' too. --- indra/newview/app_settings/settings.xml | 22 ++++++++++ indra/newview/lltoolpie.cpp | 73 ++++++++++++++++++++++----------- indra/newview/lltoolpie.h | 5 ++- 3 files changed, 73 insertions(+), 27 deletions(-) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 142378b540..f9d930a13a 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -2699,6 +2699,28 @@ <key>Value</key> <integer>1</integer> </map> + <key>ClickActionBuyEnabled</key> + <map> + <key>Comment</key> + <string>Enable click to buy actions in tool pie menu</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>ClickActionPayEnabled</key> + <map> + <key>Comment</key> + <string>Enable click to pay actions in tool pie menu</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>DoubleClickAutoPilot</key> <map> <key>Comment</key> diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 2ee3e4ffed..583d3c707b 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -80,9 +80,11 @@ LLToolPie::LLToolPie() : LLTool(std::string("Pie")), mGrabMouseButtonDown( FALSE ), mMouseOutsideSlop( FALSE ), - mClickAction(0) -{ } - + mClickAction(0), + mClickActionBuyEnabled( gSavedSettings.getBOOL("ClickActionBuyEnabled") ), + mClickActionPayEnabled( gSavedSettings.getBOOL("ClickActionPayEnabled") ) +{ +} BOOL LLToolPie::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktype, BOOL down) { @@ -210,12 +212,28 @@ BOOL LLToolPie::pickLeftMouseDownCallback() } // else nothing (fall through to touch) } case CLICK_ACTION_PAY: - if ((object && object->flagTakesMoney()) - || (parent && parent->flagTakesMoney())) + if ( mClickActionPayEnabled ) + { + if ((object && object->flagTakesMoney()) + || (parent && parent->flagTakesMoney())) + { + // pay event goes to object actually clicked on + mClickActionObject = object; + mLeftClickSelection = LLToolSelect::handleObjectSelection(mPick, FALSE, TRUE); + if (LLSelectMgr::getInstance()->selectGetAllValid()) + { + // call this right away, since we have all the info we need to continue the action + selectionPropertiesReceived(); + } + return TRUE; + } + } + break; + case CLICK_ACTION_BUY: + if ( mClickActionBuyEnabled ) { - // pay event goes to object actually clicked on - mClickActionObject = object; - mLeftClickSelection = LLToolSelect::handleObjectSelection(mPick, FALSE, TRUE); + mClickActionObject = parent; + mLeftClickSelection = LLToolSelect::handleObjectSelection(mPick, FALSE, TRUE, TRUE); if (LLSelectMgr::getInstance()->selectGetAllValid()) { // call this right away, since we have all the info we need to continue the action @@ -224,15 +242,6 @@ BOOL LLToolPie::pickLeftMouseDownCallback() return TRUE; } break; - case CLICK_ACTION_BUY: - mClickActionObject = parent; - mLeftClickSelection = LLToolSelect::handleObjectSelection(mPick, FALSE, TRUE, TRUE); - if (LLSelectMgr::getInstance()->selectGetAllValid()) - { - // call this right away, since we have all the info we need to continue the action - selectionPropertiesReceived(); - } - return TRUE; case CLICK_ACTION_OPEN: if (parent && parent->allowOpen()) { @@ -392,7 +401,7 @@ U8 final_click_action(LLViewerObject* obj) return click_action; } -ECursorType cursor_from_object(LLViewerObject* object) +ECursorType LLToolPie::cursorFromObject(LLViewerObject* object) { LLViewerObject* parent = NULL; if (object) @@ -412,7 +421,10 @@ ECursorType cursor_from_object(LLViewerObject* object) } break; case CLICK_ACTION_BUY: - cursor = UI_CURSOR_TOOLBUY; + if ( mClickActionBuyEnabled ) + { + cursor = UI_CURSOR_TOOLBUY; + } break; case CLICK_ACTION_OPEN: // Open always opens the parent. @@ -422,10 +434,13 @@ ECursorType cursor_from_object(LLViewerObject* object) } break; case CLICK_ACTION_PAY: - if ((object && object->flagTakesMoney()) - || (parent && parent->flagTakesMoney())) + if ( mClickActionPayEnabled ) { - cursor = UI_CURSOR_TOOLBUY; + if ((object && object->flagTakesMoney()) + || (parent && parent->flagTakesMoney())) + { + cursor = UI_CURSOR_TOOLBUY; + } } break; case CLICK_ACTION_ZOOM: @@ -473,10 +488,16 @@ void LLToolPie::selectionPropertiesReceived() switch (click_action) { case CLICK_ACTION_BUY: - handle_buy(); + if ( LLToolPie::getInstance()->mClickActionBuyEnabled ) + { + handle_buy(); + } break; case CLICK_ACTION_PAY: - handle_give_money_dialog(); + if ( LLToolPie::getInstance()->mClickActionPayEnabled ) + { + handle_give_money_dialog(); + } break; case CLICK_ACTION_OPEN: LLFloaterReg::showInstance("openobject"); @@ -517,7 +538,7 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask) else if (click_action_object && useClickAction(mask, click_action_object, click_action_object->getRootEdit())) { show_highlight = true; - ECursorType cursor = cursor_from_object(click_action_object); + ECursorType cursor = cursorFromObject(click_action_object); gViewerWindow->setCursor(cursor); lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; } @@ -570,7 +591,9 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask) { switch(click_action) { + // NOTE: mClickActionBuyEnabled flag enables/disables BUY action but setting cursor to default is okay case CLICK_ACTION_BUY: + // NOTE: mClickActionPayEnabled flag enables/disables PAY action but setting cursor to default is okay case CLICK_ACTION_PAY: case CLICK_ACTION_OPEN: case CLICK_ACTION_ZOOM: diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h index 65cb3e36a7..77200a1da4 100644 --- a/indra/newview/lltoolpie.h +++ b/indra/newview/lltoolpie.h @@ -80,6 +80,7 @@ private: BOOL useClickAction (MASK mask, LLViewerObject* object,LLViewerObject* parent); void showVisualContextMenuEffect(); + ECursorType cursorFromObject(LLViewerObject* object); bool handleMediaClick(const LLPickInfo& info); bool handleMediaHover(const LLPickInfo& info); @@ -96,8 +97,8 @@ private: LLPointer<LLViewerObject> mClickActionObject; U8 mClickAction; LLSafeHandle<LLObjectSelection> mLeftClickSelection; - + BOOL mClickActionBuyEnabled; + BOOL mClickActionPayEnabled; }; - #endif -- cgit v1.2.3 From f65bd3c1f18675910c9d49db217a1926bd04494e Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Fri, 8 Oct 2010 16:41:33 -0700 Subject: Fix for Reopened EXP-167 Add option to quit instead of going back to login screen. --- indra/newview/llstartup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 1a42500ec4..d9234425b8 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -709,7 +709,7 @@ bool idle_startup() // if auto login is on and setting to quit if the login page is activated // is enabled, then go ahead and exit - if ( gSavedSettings.getBOOL("AutoLogin") && gSavedSettings.getBOOL("QuitOnLoginActivated") ) + if ( show_connect_box && gSavedSettings.getBOOL("AutoLogin") && gSavedSettings.getBOOL("QuitOnLoginActivated") ) { // no requirement for notification here - just exit LLAppViewer::instance()->earlyExitNoNotify(); -- cgit v1.2.3 From 77d1fa974ad6cc9be0b84e574b455693bfa7f702 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 8 Oct 2010 17:37:38 -0700 Subject: added "FastQuit" option for forceful termination, default is off --- indra/newview/app_settings/settings.xml | 11 +++++++++++ indra/newview/llappviewer.cpp | 14 ++++++++++++++ indra/newview/llappviewer.h | 1 + indra/newview/llappviewerwin32.cpp | 6 ++++++ 4 files changed, 32 insertions(+) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 142378b540..bc06078928 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -2962,6 +2962,17 @@ <string>Boolean</string> <key>Value</key> <integer>0</integer> + </map> + <key>FastQuit</key> + <map> + <key>Comment</key> + <string>Quits as quickly as possible, only sending logout request before forcefully terminating. Use with care, as this might result in data corruption or loss.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> </map> <key>FeatureManagerHTTPTable</key> <map> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index e6661e4c9a..91fae709df 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2879,8 +2879,22 @@ void LLAppViewer::forceQuit() LLApp::setQuitting(); } +void LLAppViewer::fastQuit() +{ + if (LLStartUp::getStartupState() >= STATE_STARTED) + { + sendLogoutRequest(); + } + _exit(isError()); +} + void LLAppViewer::requestQuit() { + if (gSavedSettings.getBOOL("FastQuit")) + { + fastQuit(); + } + llinfos << "requestQuit" << llendl; LLViewerRegion* region = gAgent.getRegion(); diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index b0f8c1dc3d..62ebd0712e 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -66,6 +66,7 @@ public: // Application control void forceQuit(); // Puts the viewer into 'shutting down without error' mode. + void fastQuit(); // Shuts down the viewer immediately after sending a logout message void requestQuit(); // Request a quit. A kinder, gentler quit. void userQuit(); // The users asks to quit. Confirm, then requestQuit() void earlyExit(const std::string& name, diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index d328567a0e..2c6f014d17 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -175,6 +175,12 @@ int APIENTRY WINMAIN(HINSTANCE hInstance, viewer_app_ptr->mainLoop(); } + if (gSavedSettings.getBOOL("FastQuit")) + { + viewer_app_ptr->fastQuit(); + } + + if (!LLApp::isError()) { // -- cgit v1.2.3 From 67ac18dbe0e76a3b94f09768ee61b78585c0f2a0 Mon Sep 17 00:00:00 2001 From: Richard Nelson <none@none> Date: Mon, 11 Oct 2010 12:27:51 -0700 Subject: fix for linux build --- indra/newview/llappviewer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 62ebd0712e..0e7dbb738b 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -71,7 +71,7 @@ public: void userQuit(); // The users asks to quit. Confirm, then requestQuit() void earlyExit(const std::string& name, const LLSD& substitutions = LLSD()); // Display an error dialog and forcibly quit. - void LLAppViewer::earlyExitNoNotify(); // Do not display error dialog then forcibly quit. + void earlyExitNoNotify(); // Do not display error dialog then forcibly quit. void forceExit(S32 arg); // exit() immediately (after some cleanup). void abortQuit(); // Called to abort a quit request. -- cgit v1.2.3 From 092e595b25e3e0cd27c480d864bfd894aaf3c987 Mon Sep 17 00:00:00 2001 From: Richard Nelson <none@none> Date: Mon, 11 Oct 2010 12:31:00 -0700 Subject: EXP-172 FIXED Property lines flash on and off when right clicking on land in Skylight viewer --- indra/newview/app_settings/settings.xml | 11 +++++++++++ indra/newview/llviewerparcelmgr.cpp | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 1c7e391ccb..f3dea5b88b 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8505,6 +8505,17 @@ <key>Value</key> <integer>512</integer> </map> + <key>RenderParcelSelection</key> + <map> + <key>Comment</key> + <string>Display selected parcel outline</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>RotateRight</key> <map> <key>Comment</key> diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 660bb93562..3c9e351ca1 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -850,7 +850,7 @@ LLParcel* LLViewerParcelMgr::getCollisionParcel() const void LLViewerParcelMgr::render() { - if (mSelected && mRenderSelection) + if (mSelected && mRenderSelection && gSavedSettings.getBOOL("RenderParcelSelection")) { // Rendering is done in agent-coordinates, so need to supply // an appropriate offset to the render code. -- cgit v1.2.3 From 7c256e5a13dc32af12aa5c9f90a1be040e4e64e2 Mon Sep 17 00:00:00 2001 From: Richard Nelson <none@none> Date: Mon, 11 Oct 2010 15:48:36 -0700 Subject: EXP-166 FIXED Front an Side Preset Views not accessible in Skylight viewer --- indra/newview/llbottomtray.cpp | 2 ++ indra/newview/llfloatercamera.cpp | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) (limited to 'indra') diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index fd11045f56..758bc7be64 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -220,6 +220,8 @@ LLBottomTray::LLBottomTray(const LLSD&) buildFromFile("panel_bottomtray.xml"); + LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2)); + //this is to fix a crash that occurs because LLBottomTray is a singleton //and thus is deleted at the end of the viewers lifetime, but to be cleanly //destroyed LLBottomTray requires some subsystems that are long gone diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index be65396b0f..620e100bdf 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -340,9 +340,6 @@ LLFloaterCamera::LLFloaterCamera(const LLSD& val) mCurrMode(CAMERA_CTRL_MODE_PAN), mPrevMode(CAMERA_CTRL_MODE_PAN) { - LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; - registrar.add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2)); - LLHints::registerHintTarget("view_popup", LLView::getHandle()); } -- cgit v1.2.3 From b10744dbee7ffa64180f5558cac874e126045fc8 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Mon, 11 Oct 2010 16:33:23 -0700 Subject: fix for default notification form valus not appearing --- indra/llui/llnotifications.cpp | 3 ++- indra/llui/llnotifications.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index 916ca24d13..133d12ff22 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -80,7 +80,8 @@ LLNotificationForm::FormButton::FormButton() LLNotificationForm::FormInput::FormInput() : type("type"), - width("width", 0) + width("width", 0), + value("value") {} LLNotificationForm::FormElement::FormElement() diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index 5298549b58..3b50d0b2b6 100644 --- a/indra/llui/llnotifications.h +++ b/indra/llui/llnotifications.h @@ -194,6 +194,7 @@ public: { Mandatory<std::string> type; Optional<S32> width; + Optional<std::string> value; FormInput(); }; -- cgit v1.2.3 From 34ca69949fa1bc67caa8cd0f8ed85d924303567a Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Mon, 11 Oct 2010 16:36:59 -0700 Subject: Reworked fix for EXP-167 Add option to quit instead of going back to login screen --- indra/newview/llstartup.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'indra') diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index d9234425b8..9d66a7cd8a 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -232,6 +232,8 @@ static LLHost gFirstSim; static std::string gFirstSimSeedCap; static LLVector3 gAgentStartLookAt(1.0f, 0.f, 0.f); static std::string gAgentStartLocation = "safe"; +static bool mLoginStatePastUI = false; + boost::scoped_ptr<LLEventPump> LLStartUp::sStateWatcher(new LLEventStream("StartupState")); boost::scoped_ptr<LLStartupListener> LLStartUp::sListener(new LLStartupListener()); @@ -707,9 +709,9 @@ bool idle_startup() { LL_DEBUGS("AppInit") << "Initializing Window" << LL_ENDL; - // if auto login is on and setting to quit if the login page is activated - // is enabled, then go ahead and exit - if ( show_connect_box && gSavedSettings.getBOOL("AutoLogin") && gSavedSettings.getBOOL("QuitOnLoginActivated") ) + // if we've gone backwards in the login state machine, to this state where we show the UI + // AND the debug setting to exit in this case is true, then go ahead and bail quickly + if ( mLoginStatePastUI && gSavedSettings.getBOOL("QuitOnLoginActivated") ) { // no requirement for notification here - just exit LLAppViewer::instance()->earlyExitNoNotify(); @@ -792,6 +794,11 @@ bool idle_startup() if (STATE_LOGIN_WAIT == LLStartUp::getStartupState()) { + // when we get to this state, we've already been past the login UI + // (possiblely automatically) - flag this so we can test in the + // STATE_LOGIN_SHOW state if we've gone backwards + mLoginStatePastUI = true; + // Don't do anything. Wait for the login view to call the login_callback, // which will push us to the next state. @@ -818,6 +825,11 @@ bool idle_startup() gKeyboard->resetKeys(); } + // when we get to this state, we've already been past the login UI + // (possiblely automatically) - flag this so we can test in the + // STATE_LOGIN_SHOW state if we've gone backwards + mLoginStatePastUI = true; + // save the credentials std::string userid = "unknown"; if(gUserCredential.notNull()) -- cgit v1.2.3 From 6c7c124f4359b3147cd7441a2fca92a067026e11 Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Tue, 12 Oct 2010 12:08:36 -0700 Subject: Viewer changes for EXP-202 Close View hint when user interacts with the View tools - pan or zoom --- indra/newview/llfloatercamera.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'indra') diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index 620e100bdf..039ae83b5e 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -75,6 +75,8 @@ protected: void onZoomPlusHeldDown(); void onZoomMinusHeldDown(); void onSliderValueChanged(); + void onCameraTrack(); + void onCameraRotate(); F32 getOrbitRate(F32 time); private: @@ -164,6 +166,8 @@ LLPanelCameraZoom::LLPanelCameraZoom() mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this)); mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this)); mCommitCallbackRegistrar.add("Slider.value_changed", boost::bind(&LLPanelCameraZoom::onSliderValueChanged, this)); + mCommitCallbackRegistrar.add("Camera.track", boost::bind(&LLPanelCameraZoom::onCameraTrack, this)); + mCommitCallbackRegistrar.add("Camera.rotate", boost::bind(&LLPanelCameraZoom::onCameraRotate, this)); } BOOL LLPanelCameraZoom::postBuild() @@ -200,6 +204,18 @@ void LLPanelCameraZoom::onZoomMinusHeldDown() gAgentCamera.setOrbitOutKey(getOrbitRate(time)); } +void LLPanelCameraZoom::onCameraTrack() +{ + // EXP-202 when camera panning activated, remove the hint + LLFirstUse::viewPopup( false ); +} + +void LLPanelCameraZoom::onCameraRotate() +{ + // EXP-202 when camera rotation activated, remove the hint + LLFirstUse::viewPopup( false ); +} + F32 LLPanelCameraZoom::getOrbitRate(F32 time) { if( time < NUDGE_TIME ) -- cgit v1.2.3 From 19be4a4d4230e5d73f50209d399c9aab7daebb4e Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 12 Oct 2010 18:47:44 -0700 Subject: EXP-188 FIXED Object Inspector flashes on and off for an item that is for sale --- indra/newview/llviewerwindow.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'indra') diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index b49d342126..1c0bec3047 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2948,18 +2948,20 @@ void LLViewerWindow::updateKeyboardFocus() LLUICtrl* parent = cur_focus->getParentUICtrl(); const LLUICtrl* focus_root = cur_focus->findRootMostFocusRoot(); + bool new_focus_found = false; while(parent) { - if (parent->isCtrl() && - (parent->hasTabStop() || parent == focus_root) && - !parent->getIsChrome() && - parent->isInVisibleChain() && - parent->isInEnabledChain()) + if (parent->isCtrl() + && (parent->hasTabStop() || parent == focus_root) + && !parent->getIsChrome() + && parent->isInVisibleChain() + && parent->isInEnabledChain()) { if (!parent->focusFirstItem()) { parent->setFocus(TRUE); } + new_focus_found = true; break; } parent = parent->getParentUICtrl(); @@ -2968,7 +2970,7 @@ void LLViewerWindow::updateKeyboardFocus() // if we didn't find a better place to put focus, just release it // hasFocus() will return true if and only if we didn't touch focus since we // are only moving focus higher in the hierarchy - if (cur_focus->hasFocus()) + if (!new_focus_found) { cur_focus->setFocus(FALSE); } -- cgit v1.2.3 From 867570132f3ff2dc102561e0d0950b0134dd3e53 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 12 Oct 2010 18:47:56 -0700 Subject: removed some unused settings --- indra/newview/app_settings/settings.xml | 187 -------------------------------- 1 file changed, 187 deletions(-) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f3dea5b88b..85cfabb23c 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -3590,72 +3590,6 @@ <key>Value</key> <real>0.5</real> </map> - <key>FontMonospace</key> - <map> - <key>Comment</key> - <string>Name of monospace font that definitely exists (Truetype file name)</string> - <key>Persist</key> - <integer>0</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string>DejaVuSansMono.ttf</string> - </map> - <key>FontSansSerif</key> - <map> - <key>Comment</key> - <string>Name of primary sans-serif font that definitely exists (Truetype file name)</string> - <key>Persist</key> - <integer>0</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string>MtBkLfRg.ttf</string> - </map> - <key>FontSansSerifBundledFallback</key> - <map> - <key>Comment</key> - <string>Name of secondary sans-serif font that definitely exists (Truetype file name)</string> - <key>Persist</key> - <integer>0</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string>DejaVuSansCondensed.ttf</string> - </map> - <key>FontSansSerifBold</key> - <map> - <key>Comment</key> - <string>Name of bold font (Truetype file name)</string> - <key>Persist</key> - <integer>0</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string>MtBdLfRg.ttf</string> - </map> - <key>FontSansSerifFallback</key> - <map> - <key>Comment</key> - <string>Name of sans-serif font (Truetype file name)</string> - <key>Persist</key> - <integer>0</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string /> - </map> - <key>FontSansSerifFallbackScale</key> - <map> - <key>Comment</key> - <string>Scale of fallback font relative to huge font (fraction of huge font size)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>F32</string> - <key>Value</key> - <real>1.0</real> - </map> <key>FontScreenDPI</key> <map> <key>Comment</key> @@ -3667,61 +3601,6 @@ <key>Value</key> <real>96.0</real> </map> - <key>FontSizeHuge</key> - <map> - <key>Comment</key> - <string>Size of huge font (points, or 1/72 of an inch)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>F32</string> - <key>Value</key> - <real>16.0</real> - </map> - <key>FontSizeLarge</key> - <map> - <key>Comment</key> - <string>Size of large font (points, or 1/72 of an inch)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>F32</string> - <key>Value</key> - <real>12.0</real> - </map> - <key>FontSizeMedium</key> - <map> - <key>Comment</key> - <string>Size of medium font (points, or 1/72 of an inch)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>F32</string> - <key>Value</key> - <real>10.0</real> - </map> - <key>FontSizeMonospace</key> - <map> - <key>Comment</key> - <string>Size of monospaced font (points, or 1/72 of an inch)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>F32</string> - <key>Value</key> - <real>8.1</real> - </map> - <key>FontSizeSmall</key> - <map> - <key>Comment</key> - <string>Size of small font (points, or 1/72 of an inch)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>F32</string> - <key>Value</key> - <real>9.0</real> - </map> <key>ForceAssetFail</key> <map> <key>Comment</key> @@ -5252,61 +5131,6 @@ <key>Value</key> <real>60.0</real> </map> - <key>MeanCollisionBump</key> - <map> - <key>Comment</key> - <string>You have experienced an abuse of being bumped by an object or avatar</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> - <key>MeanCollisionPhysical</key> - <map> - <key>Comment</key> - <string>You have experienced an abuse from a physical object</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> - <key>MeanCollisionPushObject</key> - <map> - <key>Comment</key> - <string>You have experienced an abuse of being pushed by a scripted object</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> - <key>MeanCollisionScripted</key> - <map> - <key>Comment</key> - <string>You have experienced an abuse from a scripted object</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> - <key>MeanCollisionSelected</key> - <map> - <key>Comment</key> - <string>You have experienced an abuse of being pushed via a selected object</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> <key>MediaControlFadeTime</key> <map> <key>Comment</key> @@ -7836,17 +7660,6 @@ <key>Value</key> <integer>1</integer> </map> - <key>RenderFastUI</key> - <map> - <key>Comment</key> - <string>[NOT USED]</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> <key>RenderFlexTimeFactor</key> <map> <key>Comment</key> -- cgit v1.2.3 From 0732b48be9c6378c31515ed92d29101e3743c8c9 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 13 Oct 2010 11:57:38 -0700 Subject: improved fastquit logic which should reliably disconnect viewer from sim --- indra/newview/llappviewer.cpp | 54 +++++++++++++++++++++------------------- indra/newview/llappviewer.h | 4 +-- indra/newview/llviewerwindow.cpp | 2 +- 3 files changed, 32 insertions(+), 28 deletions(-) (limited to 'indra') diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 91fae709df..a245639fac 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1284,6 +1284,21 @@ bool LLAppViewer::mainLoop() return true; } +void LLAppViewer::flushVFSIO() +{ + while (1) + { + S32 pending = LLVFSThread::updateClass(0); + pending += LLLFSThread::updateClass(0); + if (!pending) + { + break; + } + llinfos << "Waiting for pending IO to finish: " << pending << llendflush; + ms_sleep(100); + } +} + bool LLAppViewer::cleanup() { // workaround for DEV-35406 crash on shutdown @@ -1419,17 +1434,7 @@ bool LLAppViewer::cleanup() llinfos << "Cache files removed" << llendflush; // Wait for any pending VFS IO - while (1) - { - S32 pending = LLVFSThread::updateClass(0); - pending += LLLFSThread::updateClass(0); - if (!pending) - { - break; - } - llinfos << "Waiting for pending IO to finish: " << pending << llendflush; - ms_sleep(100); - } + flushVFSIO(); llinfos << "Shutting down Views" << llendflush; // Destroy the UI @@ -2879,13 +2884,20 @@ void LLAppViewer::forceQuit() LLApp::setQuitting(); } -void LLAppViewer::fastQuit() +void LLAppViewer::fastQuit(S32 error_code) { - if (LLStartUp::getStartupState() >= STATE_STARTED) - { - sendLogoutRequest(); - } - _exit(isError()); + // finish pending transfers + flushVFSIO(); + // let sim know we're logging out + sendLogoutRequest(); + // flush network buffers by shutting down messaging system + end_messaging_system(); + // figure out the error code + S32 final_error_code = error_code ? error_code : (S32)isError(); + // this isn't a crash + removeMarkerFile(); + // get outta here + _exit(final_error_code); } void LLAppViewer::requestQuit() @@ -2973,14 +2985,6 @@ void LLAppViewer::earlyExitNoNotify() finish_early_exit( LLSD(), LLSD() ); } -void LLAppViewer::forceExit(S32 arg) -{ - removeMarkerFile(); - - // *FIX:Mani - This kind of exit hardly seems appropriate. - exit(arg); -} - void LLAppViewer::abortQuit() { llinfos << "abortQuit()" << llendl; diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 0e7dbb738b..b2374a3426 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -65,14 +65,14 @@ public: virtual bool mainLoop(); // Override for the application main loop. Needs to at least gracefully notice the QUITTING state and exit. // Application control + void flushVFSIO(); // waits for vfs transfers to complete void forceQuit(); // Puts the viewer into 'shutting down without error' mode. - void fastQuit(); // Shuts down the viewer immediately after sending a logout message + void fastQuit(S32 error_code = 0); // Shuts down the viewer immediately after sending a logout message void requestQuit(); // Request a quit. A kinder, gentler quit. void userQuit(); // The users asks to quit. Confirm, then requestQuit() void earlyExit(const std::string& name, const LLSD& substitutions = LLSD()); // Display an error dialog and forcibly quit. void earlyExitNoNotify(); // Do not display error dialog then forcibly quit. - void forceExit(S32 arg); // exit() immediately (after some cleanup). void abortQuit(); // Called to abort a quit request. bool quitRequested() { return mQuitRequested; } diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 1c0bec3047..d2dab8f40c 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1371,7 +1371,7 @@ LLViewerWindow::LLViewerWindow( LL_WARNS("Window") << "Unable to create window, be sure screen is set at 32-bit color in Control Panels->Display->Settings" << LL_ENDL; #endif - LLAppViewer::instance()->forceExit(1); + LLAppViewer::instance()->fastQuit(1); } // Get the real window rect the window was created with (since there are various OS-dependent reasons why -- cgit v1.2.3 From aac0d48d7d97730c95cfb541e303167a8e28d369 Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Wed, 13 Oct 2010 18:02:05 -0700 Subject: Fix for EXP-220 -- Remove voice dot for skylight user Reviewed by Richard. --- indra/newview/llvoavatar.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index c31714de5a..7d8c1405ec 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2326,8 +2326,19 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled) { - // disable voice visualizer when in mouselook - mVoiceVisualizer->setVoiceEnabled( voice_enabled && !(isSelf() && gAgentCamera.cameraMouselook()) ); + bool render_visualizer = voice_enabled; + + // Don't render the user's own voice visualizer when in mouselook, or when opening the mic is disabled. + if(isSelf()) + { + if(gAgentCamera.cameraMouselook() || gSavedSettings.getBOOL("VoiceDisableMic")) + { + render_visualizer = false; + } + } + + mVoiceVisualizer->setVoiceEnabled(render_visualizer); + if ( voice_enabled ) { //---------------------------------------------------------------- -- cgit v1.2.3 From 9737f2b73f75f0320079abe598bb3107d8e3668d Mon Sep 17 00:00:00 2001 From: Xiaohong Bao <bao@lindenlab.com> Date: Wed, 13 Oct 2010 19:21:41 -0600 Subject: fix for EXP-195: Custom login progress screen blurry when first presented to user as the image fully loads --- indra/newview/llviewertexture.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 5c262838ae..1757b6f953 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1130,7 +1130,7 @@ void LLViewerFetchedTexture::init(bool firstinit) // does not contain this image. mIsMissingAsset = FALSE; - mLoadedCallbackDesiredDiscardLevel = 0; + mLoadedCallbackDesiredDiscardLevel = S8_MAX; mPauseLoadedCallBacks = TRUE ; mNeedsCreateTexture = FALSE; @@ -1503,7 +1503,7 @@ void LLViewerFetchedTexture::processTextureStats() } else if(!mFullWidth || !mFullHeight) { - mDesiredDiscardLevel = getMaxDiscardLevel() ; + mDesiredDiscardLevel = llmin(getMaxDiscardLevel(), (S32)mLoadedCallbackDesiredDiscardLevel) ; } else { -- cgit v1.2.3 From 73b39c9b46ed25ae03b8225758c15325e50fdfe2 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 13 Oct 2010 18:41:35 -0700 Subject: made destination guide url configurable on command line --- indra/newview/app_settings/settings.xml | 13 ++++++++++++- indra/newview/llcommandlineparser.cpp | 5 ++++- indra/newview/llviewerwindow.cpp | 7 +++++++ 3 files changed, 23 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 85cfabb23c..5c54b88927 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -2523,7 +2523,18 @@ <key>Value</key> <integer>10</integer> </map> - <key>DisableCameraConstraints</key> + <key>DestinationGuideURL</key> + <map> + <key>Comment</key> + <string>Destination guide contents</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://www.secondlife.com</string> + </map> + <key>DisableCameraConstraints</key> <map> <key>Comment</key> <string>Disable the normal bounds put on the camera by avatar position</string> diff --git a/indra/newview/llcommandlineparser.cpp b/indra/newview/llcommandlineparser.cpp index ee8646aad0..0b59f8bd4b 100644 --- a/indra/newview/llcommandlineparser.cpp +++ b/indra/newview/llcommandlineparser.cpp @@ -341,7 +341,10 @@ bool LLCommandLineParser::parseCommandLine(int argc, char **argv) bool LLCommandLineParser::parseCommandLineString(const std::string& str) { // Split the string content into tokens - boost::escaped_list_separator<char> sep("\\", "\r\n ", "\"'"); + const char* escape_chars = "\\"; + const char* separator_chars = "\r\n "; + const char* quote_chars = "\"'"; + boost::escaped_list_separator<char> sep(escape_chars, separator_chars, quote_chars); boost::tokenizer< boost::escaped_list_separator<char> > tok(str, sep); std::vector<std::string> tokens; // std::copy(tok.begin(), tok.end(), std::back_inserter(tokens)); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index d2dab8f40c..b1d8e2f353 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1698,6 +1698,13 @@ void LLViewerWindow::initWorldUI() buttons_panel->setShape(buttons_panel_container->getLocalRect()); buttons_panel->setFollowsAll(); buttons_panel_container->addChild(buttons_panel); + + LLView* destination_guide = gViewerWindow->getRootView()->getChild<LLView>("destination_guide_container"); + LLMediaCtrl* destinations = destination_guide->findChild<LLMediaCtrl>("destination_guide_contents"); + if (destinations) + { + destinations->navigateTo(gSavedSettings.getString("DestinationGuideURL")); + } } // Destroy the UI -- cgit v1.2.3 From 8b9b7fed7367eeb7b055f7b2a44a37539634045e Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 14 Oct 2010 13:31:54 -0700 Subject: removed fastquit --- indra/newview/app_settings/settings.xml | 11 ----------- indra/newview/llappviewer.cpp | 6 +----- indra/newview/llappviewerwin32.cpp | 6 ------ 3 files changed, 1 insertion(+), 22 deletions(-) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 5c54b88927..f8bd6fa3b9 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -2995,17 +2995,6 @@ <string>Boolean</string> <key>Value</key> <integer>0</integer> - </map> - <key>FastQuit</key> - <map> - <key>Comment</key> - <string>Quits as quickly as possible, only sending logout request before forcefully terminating. Use with care, as this might result in data corruption or loss.</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> </map> <key>FeatureManagerHTTPTable</key> <map> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index a245639fac..39c3181cdc 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2884,6 +2884,7 @@ void LLAppViewer::forceQuit() LLApp::setQuitting(); } +//TODO: remove void LLAppViewer::fastQuit(S32 error_code) { // finish pending transfers @@ -2902,11 +2903,6 @@ void LLAppViewer::fastQuit(S32 error_code) void LLAppViewer::requestQuit() { - if (gSavedSettings.getBOOL("FastQuit")) - { - fastQuit(); - } - llinfos << "requestQuit" << llendl; LLViewerRegion* region = gAgent.getRegion(); diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 2c6f014d17..d328567a0e 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -175,12 +175,6 @@ int APIENTRY WINMAIN(HINSTANCE hInstance, viewer_app_ptr->mainLoop(); } - if (gSavedSettings.getBOOL("FastQuit")) - { - viewer_app_ptr->fastQuit(); - } - - if (!LLApp::isError()) { // -- cgit v1.2.3 From eea2b8f9d3fe909befd43ca8db7878855ddd661d Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Thu, 14 Oct 2010 15:18:00 -0700 Subject: EXP-225 FIX Add debug setting to quit the viewer after N seconds of AFK behavior. Viewer specific setting for this feature including default value in settings file --- indra/newview/app_settings/settings.xml | 11 +++++++++++ indra/newview/llappviewer.cpp | 12 ++++++++++++ 2 files changed, 23 insertions(+) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 5c54b88927..7538b152c1 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -6403,6 +6403,17 @@ <key>Value</key> <real>0.0</real> </map> + <key>QuitAfterSecondsOfAFK</key> + <map> + <key>Comment</key> + <string>The duration allowed after being AFK before quitting.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>0.0</real> + </map> <key>QuitOnLoginActivated</key> <map> <key>Comment</key> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index a245639fac..ba3c6a5916 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3569,6 +3569,18 @@ void LLAppViewer::idle() } } + // debug setting to quit after N seconds of being AFK - 0 to never do this + F32 qas_afk = gSavedSettings.getF32("QuitAfterSecondsOfAFK"); + if (qas_afk > 0.f) + { + // idle time is more than setting + if ( gAwayTriggerTimer.getElapsedTimeF32() > qas_afk ) + { + // go ahead and just quit + LLAppViewer::instance()->forceQuit(); + } + } + // Must wait until both have avatar object and mute list, so poll // here. request_initial_instant_messages(); -- cgit v1.2.3 From 7df167129955f2f44b2048f1e8e89c685f2b7485 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 15 Oct 2010 14:05:11 -0700 Subject: EXP-229 FIXED Double clicking x on UI hint crashes Skylight Viewer --- indra/newview/llhints.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp index 5ffc4ace59..8edc42e15c 100644 --- a/indra/newview/llhints.cpp +++ b/indra/newview/llhints.cpp @@ -112,7 +112,14 @@ public: /*virtual*/ BOOL postBuild(); - void onClickClose() { hide(); LLNotifications::instance().cancel(mNotification); } + void onClickClose() + { + if (!mHidden) + { + hide(); + LLNotifications::instance().cancel(mNotification); + } + } void draw(); void hide() { if(!mHidden) {mHidden = true; mFadeTimer.reset();} } -- cgit v1.2.3 From 6dcf769ca5c8bef9a170451094f022ac3791f1d9 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 15 Oct 2010 14:05:27 -0700 Subject: added schema to settings.xml --- indra/newview/app_settings/llsd.xsd | 131 ++++++++++++++++++++++++++++++++ indra/newview/app_settings/settings.xml | 3 +- 2 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 indra/newview/app_settings/llsd.xsd (limited to 'indra') diff --git a/indra/newview/app_settings/llsd.xsd b/indra/newview/app_settings/llsd.xsd new file mode 100644 index 0000000000..34612d9faa --- /dev/null +++ b/indra/newview/app_settings/llsd.xsd @@ -0,0 +1,131 @@ +<?xml version="1.0"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <!-- LLSD document has exactly one value --> + <xsd:element name="llsd"> + <xsd:complexType> + <xsd:group ref="llsd-value" /> + </xsd:complexType> + </xsd:element> + + <!-- Value is one of undef, boolean, integer, real, + uuid, string, date, binary, array, or map --> + <xsd:group name="llsd-value"> + <xsd:choice> + <xsd:element ref="undef"/> + <xsd:element ref="boolean"/> + <xsd:element ref="integer"/> + <xsd:element ref="real"/> + <xsd:element ref="uuid"/> + <xsd:element ref="string"/> + <xsd:element ref="date"/> + <xsd:element ref="uri"/> + <xsd:element ref="binary"/> + <xsd:element ref="array"/> + <xsd:element ref="map"/> + </xsd:choice> + </xsd:group> + + <!-- Undefined is an empty eleemnt --> + <xsd:element name="undef"> + <xsd:simpleType> + <xsd:restriction base="xsd:string"> + <xsd:length value="0" /> + </xsd:restriction> + </xsd:simpleType> + </xsd:element> + + <!-- Boolean is true or false --> + <xsd:element name="boolean"> + <xsd:simpleType> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="true" /> + <xsd:enumeration value="false" /> + + <!-- In practice, these other serializations are seen: --> + <xsd:enumeration value="" /> + <xsd:enumeration value="1" /> + <xsd:enumeration value="0" /> + </xsd:restriction> + </xsd:simpleType> + </xsd:element> + + <!-- Integer is restricted to 32-bit signed values --> + <xsd:element name="integer"> + <xsd:simpleType> + <xsd:restriction base="xsd:int" /> + </xsd:simpleType> + </xsd:element> + + <!-- Real is an IEEE 754 "double" value, including Infinities and NaN --> + <xsd:element name="real"> + <xsd:simpleType> + <!-- TODO: xsd:double uses "INF", "-INF", and "NaN", + whereas LLSD prefers "Infinity", "-Infinity" and "NaN" --> + <xsd:restriction base="xsd:double" /> + </xsd:simpleType> + </xsd:element> + + <!-- UUID per RFC 4122 --> + <xsd:element name="uuid"> + <xsd:simpleType> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|" /> + </xsd:restriction> + </xsd:simpleType> + </xsd:element> + + <!-- String is any sequence of Unicode characters --> + <xsd:element name="string"> + <xsd:simpleType> + <xsd:restriction base="xsd:string" /> + </xsd:simpleType> + </xsd:element> + + <!-- Date is ISO 8601 in UTC --> + <xsd:element name="date"> + <xsd:simpleType> + <xsd:restriction base="xsd:dateTime"> + <!-- Restrict to UTC (Z) times --> + <xsd:pattern value="[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]+)?Z" /> + </xsd:restriction> + </xsd:simpleType> + </xsd:element> + + <!-- URI per RFC 3986 --> + <xsd:element name="uri"> + <xsd:simpleType> + <xsd:restriction base="xsd:anyURI" /> + </xsd:simpleType> + </xsd:element> + + <!-- Binary data is base64 encoded --> + <xsd:element name="binary"> + <xsd:simpleType> + <!-- TODO: Require encoding attribute? --> + <xsd:restriction base="xsd:base64Binary" /> + </xsd:simpleType> + </xsd:element> + + <!-- Array is a sequence of zero or more values --> + <xsd:element name="array"> + <xsd:complexType> + <xsd:group minOccurs="0" maxOccurs="unbounded" ref="llsd-value" /> + </xsd:complexType> + </xsd:element> + + <!-- Map is a sequence of zero or more key/value pairs --> + <xsd:element name="map"> + <xsd:complexType> + <xsd:sequence minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="key"> + <xsd:simpleType> + <xsd:restriction base="xsd:string" /> + </xsd:simpleType> + </xsd:element> + <xsd:group ref="llsd-value" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + +</xsd:schema> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 36ac7ecf99..37e1db20ff 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" ?> -<llsd> +<llsd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="llsd.xsd"> <map> <key>CrashHostUrl</key> <map> -- cgit v1.2.3 From 98563df257729ce36dff363134136f0b549f8313 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 15 Oct 2010 14:11:24 -0700 Subject: switch ui string args to auto_ptr to do automatic cleanup --- indra/llui/lluistring.cpp | 4 ++-- indra/llui/lluistring.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'indra') diff --git a/indra/llui/lluistring.cpp b/indra/llui/lluistring.cpp index ac69d3bf85..d805e37c09 100644 --- a/indra/llui/lluistring.cpp +++ b/indra/llui/lluistring.cpp @@ -129,7 +129,7 @@ void LLUIString::updateResult() const mResult = mOrig; // get the defailt args + local args - if (!mArgs || mArgs->empty()) + if (!mArgs.get() || mArgs->empty()) { LLStringUtil::format(mResult, LLTrans::getDefaultArgs()); } @@ -150,7 +150,7 @@ void LLUIString::updateWResult() const LLStringUtil::format_map_t& LLUIString::getArgs() { - if (!mArgs) + if (!mArgs.get()) { mArgs = new LLStringUtil::format_map_t; } diff --git a/indra/llui/lluistring.h b/indra/llui/lluistring.h index eff2467bf0..d7be3b1800 100644 --- a/indra/llui/lluistring.h +++ b/indra/llui/lluistring.h @@ -80,7 +80,7 @@ public: S32 length() const { return getUpdatedWResult().size(); } void clear(); - void clearArgs() { if (mArgs) mArgs->clear(); } + void clearArgs() { if (mArgs.get()) mArgs->clear(); } // These utility functions are included for text editing. // They do not affect mOrig and do not perform argument substitution @@ -104,7 +104,7 @@ private: std::string mOrig; mutable std::string mResult; mutable LLWString mWResult; // for displaying - LLStringUtil::format_map_t* mArgs; + std::auto_ptr<LLStringUtil::format_map_t> mArgs; // controls lazy evaluation mutable bool mNeedsResult; -- cgit v1.2.3 From c4ec141cc0e2de055d6eff10727fd33ae6767d98 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 15 Oct 2010 14:33:10 -0700 Subject: fixed build --- indra/llui/llscrolllistctrl.cpp | 42 +++++++++++++++++++++-------------------- indra/llui/llscrolllistctrl.h | 2 +- 2 files changed, 23 insertions(+), 21 deletions(-) (limited to 'indra') diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 7df7c13dc0..40e66b7add 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -322,6 +322,7 @@ LLScrollListCtrl::~LLScrollListCtrl() delete mSortCallback; std::for_each(mItemList.begin(), mItemList.end(), DeletePointer()); + std::for_each(mColumns.begin(), mColumns.end(), DeletePairedPointer()); } @@ -2370,10 +2371,10 @@ void LLScrollListCtrl::onScrollChange( S32 new_pos, LLScrollbar* scrollbar ) void LLScrollListCtrl::sortByColumn(const std::string& name, BOOL ascending) { - std::map<std::string, LLScrollListColumn>::iterator itor = mColumns.find(name); + column_map_t::iterator itor = mColumns.find(name); if (itor != mColumns.end()) { - sortByColumnIndex((*itor).second.mIndex, ascending); + sortByColumnIndex((*itor).second->mIndex, ascending); } } @@ -2419,11 +2420,11 @@ void LLScrollListCtrl::dirtyColumns() // just in case someone indexes into it immediately mColumnsIndexed.resize(mColumns.size()); - std::map<std::string, LLScrollListColumn>::iterator column_itor; + column_map_t::iterator column_itor; for (column_itor = mColumns.begin(); column_itor != mColumns.end(); ++column_itor) { - LLScrollListColumn *column = &column_itor->second; - mColumnsIndexed[column_itor->second.mIndex] = column; + LLScrollListColumn *column = column_itor->second; + mColumnsIndexed[column_itor->second->mIndex] = column; } } @@ -2581,8 +2582,8 @@ void LLScrollListCtrl::addColumn(const LLScrollListColumn::Params& column_params if (mColumns.find(name) == mColumns.end()) { // Add column - mColumns[name] = LLScrollListColumn(column_params, this); - LLScrollListColumn* new_column = &mColumns[name]; + mColumns[name] = new LLScrollListColumn(column_params, this); + LLScrollListColumn* new_column = mColumns[name]; new_column->mIndex = mColumns.size()-1; // Add button @@ -2604,14 +2605,14 @@ void LLScrollListCtrl::addColumn(const LLScrollListColumn::Params& column_params S32 top = mItemListRect.mTop; S32 left = mItemListRect.mLeft; - for (std::map<std::string, LLScrollListColumn>::iterator itor = mColumns.begin(); + for (column_map_t::iterator itor = mColumns.begin(); itor != mColumns.end(); ++itor) { - if (itor->second.mIndex < new_column->mIndex && - itor->second.getWidth() > 0) + if (itor->second->mIndex < new_column->mIndex && + itor->second->getWidth() > 0) { - left += itor->second.getWidth() + mColumnPadding; + left += itor->second->getWidth() + mColumnPadding; } } @@ -2667,8 +2668,8 @@ void LLScrollListCtrl::onClickColumn(void *userdata) if (column->mSortingColumn != column->mName && parent->mColumns.find(column->mSortingColumn) != parent->mColumns.end()) { - LLScrollListColumn& info_redir = parent->mColumns[column->mSortingColumn]; - column_index = info_redir.mIndex; + LLScrollListColumn* info_redir = parent->mColumns[column->mSortingColumn]; + column_index = info_redir->mIndex; } // if this column is the primary sort key, reverse the direction @@ -2701,16 +2702,17 @@ BOOL LLScrollListCtrl::hasSortOrder() const void LLScrollListCtrl::clearColumns() { - std::map<std::string, LLScrollListColumn>::iterator itor; + column_map_t::iterator itor; for (itor = mColumns.begin(); itor != mColumns.end(); ++itor) { - LLScrollColumnHeader *header = itor->second.mHeader; + LLScrollColumnHeader *header = itor->second->mHeader; if (header) { removeChild(header); delete header; } } + std::for_each(mColumns.begin(), mColumns.end(), DeletePairedPointer()); mColumns.clear(); mSortColumns.clear(); mTotalStaticColumnWidth = 0; @@ -2744,7 +2746,7 @@ LLScrollListColumn* LLScrollListCtrl::getColumn(const std::string& name) column_map_t::iterator column_itor = mColumns.find(name); if (column_itor != mColumns.end()) { - return &column_itor->second; + return column_itor->second; } return NULL; } @@ -2805,7 +2807,7 @@ LLScrollListItem* LLScrollListCtrl::addRow(LLScrollListItem *new_item, const LLS new_column.width.pixel_width = cell_p.width; } addColumn(new_column); - columnp = &mColumns[column]; + columnp = mColumns[column]; new_item->setNumColumns(mColumns.size()); } @@ -2842,7 +2844,7 @@ LLScrollListItem* LLScrollListCtrl::addRow(LLScrollListItem *new_item, const LLS LLScrollListCell* cell = LLScrollListCell::create(LLScrollListCell::Params().value(item_p.value)); if (cell) { - LLScrollListColumn* columnp = &(mColumns.begin()->second); + LLScrollListColumn* columnp = mColumns.begin()->second; new_item->setColumn(0, cell); if (columnp->mHeader @@ -2857,10 +2859,10 @@ LLScrollListItem* LLScrollListCtrl::addRow(LLScrollListItem *new_item, const LLS // add dummy cells for missing columns for (column_map_t::iterator column_it = mColumns.begin(); column_it != mColumns.end(); ++column_it) { - S32 column_idx = column_it->second.mIndex; + S32 column_idx = column_it->second->mIndex; if (new_item->getColumn(column_idx) == NULL) { - LLScrollListColumn* column_ptr = &column_it->second; + LLScrollListColumn* column_ptr = column_it->second; LLScrollListCell::Params cell_p; cell_p.width = column_ptr->getWidth(); diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h index 8a2f893ba2..09ab89960d 100644 --- a/indra/llui/llscrolllistctrl.h +++ b/indra/llui/llscrolllistctrl.h @@ -491,7 +491,7 @@ private: mutable bool mSorted; - typedef std::map<std::string, LLScrollListColumn> column_map_t; + typedef std::map<std::string, LLScrollListColumn*> column_map_t; column_map_t mColumns; BOOL mDirty; -- cgit v1.2.3 From 6357806dd0d4f70822ba6aa453efbe3a54dc32af Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 15 Oct 2010 14:37:00 -0700 Subject: another attempt at lluistring cleanup --- indra/llui/lluistring.cpp | 4 ++-- indra/llui/lluistring.h | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) (limited to 'indra') diff --git a/indra/llui/lluistring.cpp b/indra/llui/lluistring.cpp index d805e37c09..ac69d3bf85 100644 --- a/indra/llui/lluistring.cpp +++ b/indra/llui/lluistring.cpp @@ -129,7 +129,7 @@ void LLUIString::updateResult() const mResult = mOrig; // get the defailt args + local args - if (!mArgs.get() || mArgs->empty()) + if (!mArgs || mArgs->empty()) { LLStringUtil::format(mResult, LLTrans::getDefaultArgs()); } @@ -150,7 +150,7 @@ void LLUIString::updateWResult() const LLStringUtil::format_map_t& LLUIString::getArgs() { - if (!mArgs.get()) + if (!mArgs) { mArgs = new LLStringUtil::format_map_t; } diff --git a/indra/llui/lluistring.h b/indra/llui/lluistring.h index d7be3b1800..86457a8b25 100644 --- a/indra/llui/lluistring.h +++ b/indra/llui/lluistring.h @@ -61,6 +61,7 @@ public: LLUIString() : mArgs(NULL), mNeedsResult(false), mNeedsWResult(false) {} LLUIString(const std::string& instring, const LLStringUtil::format_map_t& args); LLUIString(const std::string& instring) : mArgs(NULL) { assign(instring); } + ~LLUIString() { delete mArgs; } void assign(const std::string& instring); LLUIString& operator=(const std::string& s) { assign(s); return *this; } @@ -80,7 +81,7 @@ public: S32 length() const { return getUpdatedWResult().size(); } void clear(); - void clearArgs() { if (mArgs.get()) mArgs->clear(); } + void clearArgs() { if (mArgs) mArgs->clear(); } // These utility functions are included for text editing. // They do not affect mOrig and do not perform argument substitution @@ -104,7 +105,7 @@ private: std::string mOrig; mutable std::string mResult; mutable LLWString mWResult; // for displaying - std::auto_ptr<LLStringUtil::format_map_t> mArgs; + LLStringUtil::format_map_t* mArgs; // controls lazy evaluation mutable bool mNeedsResult; -- cgit v1.2.3 From a5bf17539846834d3e30eb16cae66b313b2dd060 Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Fri, 15 Oct 2010 14:57:29 -0700 Subject: EXP-225 FIX Add debug setting to quit the viewer after N seconds of AFK behavior. This change makes the logout process less aggressive so zombie sessions do not get left behind --- indra/newview/llappviewer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 61599ad435..ca2503c447 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3572,8 +3572,8 @@ void LLAppViewer::idle() // idle time is more than setting if ( gAwayTriggerTimer.getElapsedTimeF32() > qas_afk ) { - // go ahead and just quit - LLAppViewer::instance()->forceQuit(); + // go ahead and just quit gracefully + LLAppViewer::instance()->requestQuit(); } } -- cgit v1.2.3 From 1aea5210165a3e7d0467b5107de4a94d5b5c3be4 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 15 Oct 2010 16:29:45 -0700 Subject: fix for dead space at top of screen where media hud is not clickable --- indra/newview/llviewerwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index b1d8e2f353..9f272fc845 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1669,7 +1669,7 @@ void LLViewerWindow::initWorldUI() { LLRect hud_rect = full_window; hud_rect.mBottom += 50; - if (gMenuBarView) + if (gMenuBarView && gMenuBarView->isInVisibleChain()) { hud_rect.mTop -= gMenuBarView->getRect().getHeight(); } -- cgit v1.2.3 From 5080a19afae4cc04196c643f755f35431d37e3a0 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Mon, 18 Oct 2010 16:55:20 -0700 Subject: EXP-230 FIX "elp" text flashes on and off in upper left corner of skylight viewe --- indra/llui/llmenugl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 7db8b97180..8e142aed41 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -1462,7 +1462,7 @@ BOOL LLMenuItemBranchDownGL::handleAcceleratorKey(KEY key, MASK mask) { BOOL branch_visible = getBranch()->getVisible(); BOOL handled = getBranch()->handleAcceleratorKey(key, mask); - if (handled && !branch_visible && getVisible()) + if (handled && !branch_visible && isInVisibleChain()) { // flash this menu entry because we triggered an invisible menu item LLMenuHolderGL::setActivatedItem(this); -- cgit v1.2.3 From 97101982de2b434582a795e7d81c32010bed9c13 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Mon, 18 Oct 2010 17:24:49 -0700 Subject: EXP-250 FIX Option to disable beacons --- indra/newview/app_settings/settings.xml | 11 +++++++++++ indra/newview/lltracker.cpp | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 37e1db20ff..f316909990 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8154,6 +8154,17 @@ <key>Value</key> <real>1.0</real> </map> + <key>RenderTrackerBeacon</key> + <map> + <key>Comment</key> + <string>Display tracking arrow and beacon to target avatar/teleport destination</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>RenderTreeLODFactor</key> <map> <key>Comment</key> diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp index 8391c0f832..7ce19b528a 100644 --- a/indra/newview/lltracker.cpp +++ b/indra/newview/lltracker.cpp @@ -155,7 +155,7 @@ void LLTracker::drawHUDArrow() // static void LLTracker::render3D() { - if (!gFloaterWorldMap) + if (!gFloaterWorldMap || !gSavedSettings.getBOOL("RenderTrackerBeacon")) { return; } -- cgit v1.2.3 From 548f2e92ffd8e971c379860c77d76f1b26313ee5 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Mon, 18 Oct 2010 17:34:30 -0700 Subject: EXP-250 FIX Option to disable beacons hud arrow also controlled by RenderTrackerBeacon setting --- indra/newview/app_settings/settings.xml | 4 ++-- indra/newview/lltracker.cpp | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f316909990..7788d6b2a0 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8155,9 +8155,9 @@ <real>1.0</real> </map> <key>RenderTrackerBeacon</key> - <map> + <map> <key>Comment</key> - <string>Display tracking arrow and beacon to target avatar/teleport destination</string> + <string>Display tracking arrow and beacon to target avatar, teleport destination</string> <key>Persist</key> <integer>1</integer> <key>Type</key> diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp index 7ce19b528a..61ea4bb0e6 100644 --- a/indra/newview/lltracker.cpp +++ b/indra/newview/lltracker.cpp @@ -109,6 +109,8 @@ void LLTracker::stopTracking(void* userdata) // static virtual void LLTracker::drawHUDArrow() { + if (!gSavedSettings.getBOOL("RenderTrackerBeacon")) return; + static LLUIColor map_track_color = LLUIColorTable::instance().getColor("MapTrackColor", LLColor4::white); /* tracking autopilot destination has been disabled -- cgit v1.2.3 From a2009170c92ecb56cf304447dbedfeef74272c0d Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Tue, 19 Oct 2010 14:06:23 -0700 Subject: EXP-258 FIX Help url is overwritten by login.cgi Settings have to be persistent otherwise the layering mechanism doesn't work --- indra/newview/app_settings/settings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 7788d6b2a0..f53c060c1f 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -3794,7 +3794,7 @@ <key>Comment</key> <string>URL pattern for help page; arguments will be encoded; see llviewerhelp.cpp:buildHelpURL for arguments</string> <key>Persist</key> - <integer>0</integer> + <integer>1</integer> <key>Type</key> <string>String</string> <key>Value</key> -- cgit v1.2.3 From 2a2256e8b06dfcefa10f32bf2c6775df19dfc782 Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Tue, 19 Oct 2010 16:44:09 -0700 Subject: Fix for EXP-201 -- "Clean shutdown" Reviewed by Brad and Mani. --- indra/newview/llappviewer.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index ca2503c447..d658ad5c0e 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2909,6 +2909,13 @@ void LLAppViewer::requestQuit() if( (LLStartUp::getStartupState() < STATE_STARTED) || !region ) { + // If we have a region, make some attempt to send a logout request first. + // This prevents the halfway-logged-in avatar from hanging around inworld for a couple minutes. + if(region) + { + sendLogoutRequest(); + } + // Quit immediately forceQuit(); return; @@ -4012,7 +4019,10 @@ void LLAppViewer::sendLogoutRequest() gLogoutMaxTime = LOGOUT_REQUEST_TIME; mLogoutRequestSent = TRUE; - LLVoiceClient::getInstance()->leaveChannel(); + if(LLVoiceClient::instanceExists()) + { + LLVoiceClient::getInstance()->leaveChannel(); + } //Set internal status variables and marker files gLogoutInProgress = TRUE; -- cgit v1.2.3 From a0e3c4380d3cbfbb5e0589d081a7068c1525ebce Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Thu, 21 Oct 2010 16:55:15 -0700 Subject: EXP-271 FIX Implement slapp functionality for changing avatars --- indra/newview/llappearancemgr.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'indra') diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index ed5e8ceee3..8737e97b47 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -2943,3 +2943,32 @@ void wear_multiple(const uuid_vec_t& ids, bool replace) } } +// SLapp for easy-wearing of a stock (library) avatar +// +class LLWearFolderHandler : public LLCommandHandler +{ +public: + // not allowed from outside the app + LLWearFolderHandler() : LLCommandHandler("wear_folder", UNTRUSTED_BLOCK) { } + + bool handle(const LLSD& tokens, const LLSD& query_map, + LLMediaCtrl* web) + { + LLPointer<LLInventoryCategory> category = new LLInventoryCategory(query_map["folder_id"], + LLUUID::null, + LLFolderType::FT_CLOTHING, + "Quick Appearance"); + LLSD::UUID folder_uuid = query_map["folder_id"].asUUID(); + if ( gInventory.getCategory( folder_uuid ) != NULL ) + { + LLAppearanceMgr::getInstance()->wearInventoryCategory(category, true, false); + + // *TODOw: This may not be necessary if initial outfit is chosen already -- josh + gAgent.setGenderChosen(TRUE); + } + + return true; + } +}; + +LLWearFolderHandler gWearFolderHandler; -- cgit v1.2.3 From f241e2327c3e28ed0692ec4f3a1a11ebf563b8bf Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 21 Oct 2010 17:13:09 -0700 Subject: made layout stack open/close time configurable --- indra/llui/lllayoutstack.cpp | 17 +++++++++-------- indra/llui/lllayoutstack.h | 4 ++++ 2 files changed, 13 insertions(+), 8 deletions(-) (limited to 'indra') diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp index 940c7e7e18..ac30fce392 100644 --- a/indra/llui/lllayoutstack.cpp +++ b/indra/llui/lllayoutstack.cpp @@ -97,6 +97,8 @@ LLLayoutStack::Params::Params() : orientation("orientation"), animate("animate", true), clip("clip", true), + open_time_constant("open_time_constant", 0.02f), + close_time_constant("close_time_constant", 0.03f), border_size("border_size", LLCachedControl<S32>(*LLUI::sSettingGroups["config"], "UIResizeBarHeight", 0)) { name="stack"; @@ -110,7 +112,9 @@ LLLayoutStack::LLLayoutStack(const LLLayoutStack::Params& p) mOrientation((p.orientation() == "vertical") ? VERTICAL : HORIZONTAL), mAnimate(p.animate), mAnimatedThisFrame(false), - mClip(p.clip) + mClip(p.clip), + mOpenTimeConstant(p.open_time_constant), + mCloseTimeConstant(p.close_time_constant) {} LLLayoutStack::~LLLayoutStack() @@ -303,9 +307,6 @@ void LLLayoutStack::updateLayout(BOOL force_resize) S32 total_width = 0; S32 total_height = 0; - const F32 ANIM_OPEN_TIME = 0.02f; - const F32 ANIM_CLOSE_TIME = 0.03f; - e_panel_list_t::iterator panel_it; for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it) { @@ -316,7 +317,7 @@ void LLLayoutStack::updateLayout(BOOL force_resize) { if (!mAnimatedThisFrame) { - (*panel_it)->mVisibleAmt = lerp((*panel_it)->mVisibleAmt, 1.f, LLCriticalDamp::getInterpolant(ANIM_OPEN_TIME)); + (*panel_it)->mVisibleAmt = lerp((*panel_it)->mVisibleAmt, 1.f, LLCriticalDamp::getInterpolant(mOpenTimeConstant)); if ((*panel_it)->mVisibleAmt > 0.99f) { (*panel_it)->mVisibleAmt = 1.f; @@ -334,7 +335,7 @@ void LLLayoutStack::updateLayout(BOOL force_resize) { if (!mAnimatedThisFrame) { - (*panel_it)->mVisibleAmt = lerp((*panel_it)->mVisibleAmt, 0.f, LLCriticalDamp::getInterpolant(ANIM_CLOSE_TIME)); + (*panel_it)->mVisibleAmt = lerp((*panel_it)->mVisibleAmt, 0.f, LLCriticalDamp::getInterpolant(mCloseTimeConstant)); if ((*panel_it)->mVisibleAmt < 0.001f) { (*panel_it)->mVisibleAmt = 0.f; @@ -349,11 +350,11 @@ void LLLayoutStack::updateLayout(BOOL force_resize) if ((*panel_it)->mCollapsed) { - (*panel_it)->mCollapseAmt = lerp((*panel_it)->mCollapseAmt, 1.f, LLCriticalDamp::getInterpolant(ANIM_CLOSE_TIME)); + (*panel_it)->mCollapseAmt = lerp((*panel_it)->mCollapseAmt, 1.f, LLCriticalDamp::getInterpolant(mCloseTimeConstant)); } else { - (*panel_it)->mCollapseAmt = lerp((*panel_it)->mCollapseAmt, 0.f, LLCriticalDamp::getInterpolant(ANIM_CLOSE_TIME)); + (*panel_it)->mCollapseAmt = lerp((*panel_it)->mCollapseAmt, 0.f, LLCriticalDamp::getInterpolant(mCloseTimeConstant)); } if (mOrientation == HORIZONTAL) diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h index e19ef403ef..2fc6164d7a 100644 --- a/indra/llui/lllayoutstack.h +++ b/indra/llui/lllayoutstack.h @@ -46,6 +46,8 @@ public: Optional<S32> border_size; Optional<bool> animate, clip; + Optional<F32> open_time_constant, + close_time_constant; Params(); }; @@ -137,6 +139,8 @@ private: bool mAnimatedThisFrame; bool mAnimate; bool mClip; + F32 mOpenTimeConstant; + F32 mCloseTimeConstant; }; // end class LLLayoutStack class LLLayoutPanel : public LLPanel -- cgit v1.2.3 From e638204dc2d8b409f17f7cdf8938deb97d137dbc Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 21 Oct 2010 17:14:14 -0700 Subject: EXP-273 WIP added avatar picker popup and hint --- indra/newview/app_settings/ignorable_dialogs.xml | 11 +++++++ indra/newview/app_settings/settings.xml | 11 +++++++ indra/newview/llbottomtray.cpp | 1 + indra/newview/llfirstuse.cpp | 7 +++++ indra/newview/llfirstuse.h | 1 + indra/newview/llviewermenu.cpp | 36 +++++++++++++++------- indra/newview/llviewerwindow.cpp | 4 +++ .../newview/skins/default/xui/en/notifications.xml | 8 +++++ 8 files changed, 68 insertions(+), 11 deletions(-) (limited to 'indra') diff --git a/indra/newview/app_settings/ignorable_dialogs.xml b/indra/newview/app_settings/ignorable_dialogs.xml index f800d836fa..505d852587 100644 --- a/indra/newview/app_settings/ignorable_dialogs.xml +++ b/indra/newview/app_settings/ignorable_dialogs.xml @@ -23,6 +23,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>FirstNotUseAvatarPicker</key> + <map> + <key>Comment</key> + <string>Shows hint when resident doesn't activate avatar picker</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>FirstNotUseSidePanel</key> <map> <key>Comment</key> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f53c060c1f..f23b57e62c 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -12069,6 +12069,17 @@ <key>Value</key> <real>1200.0</real> </map> + <key>AvatarPickerHintTimeout</key> + <map> + <key>Comment</key> + <string>Number of seconds to wait before telling resident about avatar picker.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>600.0</real> + </map> <key>SidePanelHintTimeout</key> <map> <key>Comment</key> diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 758bc7be64..1ba2a69289 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -521,6 +521,7 @@ BOOL LLBottomTray::postBuild() { LLHints::registerHintTarget("bottom_tray", LLView::getHandle()); LLHints::registerHintTarget("dest_guide_btn", getChild<LLUICtrl>("destinations_btn")->getHandle()); + LLHints::registerHintTarget("avatar_picker_btn", getChild<LLUICtrl>("avatar_picker_btn")->getHandle()); LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("NearbyChatBar.Action", boost::bind(&LLBottomTray::onContextMenuItemClicked, this, _2)); LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("NearbyChatBar.EnableMenuItem", boost::bind(&LLBottomTray::onContextMenuItemEnabled, this, _2)); diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index 5d6197c688..e12a8c2528 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -103,6 +103,13 @@ void LLFirstUse::notUsingDestinationGuide(bool enable) firstUseNotification("FirstNotUseDestinationGuide", enable, "HintDestinationGuide", LLSD(), LLSD().with("target", "dest_guide_btn").with("direction", "top")); } +void LLFirstUse::notUsingAvatarPicker(bool enable) +{ + // not doing this yet + firstUseNotification("FirstNotUseAvatarPicker", enable, "HintAvatarPicker", LLSD(), LLSD().with("target", "avatar_picker_btn").with("direction", "top")); +} + + // static void LLFirstUse::notUsingSidePanel(bool enable) { diff --git a/indra/newview/llfirstuse.h b/indra/newview/llfirstuse.h index 3886df4ee9..04783544b9 100644 --- a/indra/newview/llfirstuse.h +++ b/indra/newview/llfirstuse.h @@ -87,6 +87,7 @@ public: static void otherAvatarChatFirst(bool enable = true); static void sit(bool enable = true); static void notUsingDestinationGuide(bool enable = true); + static void notUsingAvatarPicker(bool enable = true); static void notUsingSidePanel(bool enable = true); static void notMoving(bool enable = true); static void viewPopup(bool enable = true); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 0454d4a249..ca9cc8e987 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -847,24 +847,37 @@ class LLAdvancedCheckFeature : public view_listener_t void LLDestinationGuideToggle() { LLView* destination_guide = gViewerWindow->getRootView()->getChildView("destination_guide_container"); - if ( destination_guide ) + LLView* avatar_picker = gViewerWindow->getRootView()->getChildView("avatar_picker_container"); + + if ( destination_guide->getVisible() ) { - if ( destination_guide->getVisible() ) - { - destination_guide->setVisible( FALSE ); - } - else - { - LLFirstUse::notUsingDestinationGuide(false); - destination_guide->setVisible( true ); - } + destination_guide->setVisible( FALSE ); + } + else + { + LLFirstUse::notUsingDestinationGuide(false); + destination_guide->setVisible( true ); + avatar_picker->setVisible( false ); + } +}; + +void LLAvatarPickerToggle() +{ + LLView* avatar_picker = gViewerWindow->getRootView()->getChildView("avatar_picker_container"); + LLView* destination_guide = gViewerWindow->getRootView()->getChildView("destination_guide_container"); + if ( avatar_picker->getVisible() ) + { + avatar_picker->setVisible( false ); } else { - llwarns << "ERROR: unable to find destination guide container" << llendl; + LLFirstUse::notUsingAvatarPicker(false); + avatar_picker->setVisible( true ); + destination_guide->setVisible( false ); } }; + ////////////////// // INFO DISPLAY // ////////////////// @@ -8297,4 +8310,5 @@ void initialize_menus() view_listener_t::addMenu(new LLToggleUIHints(), "ToggleUIHints"); commit.add("DestinationGuide.toggle", boost::bind(&LLDestinationGuideToggle)); + commit.add("AvatarPicker.toggle", boost::bind(&LLAvatarPickerToggle)); } diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 9f272fc845..62e8f4223e 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2460,6 +2460,10 @@ void LLViewerWindow::updateUI() { LLFirstUse::notUsingDestinationGuide(); } + if (gLoggedInTime.getElapsedTimeF32() > gSavedSettings.getF32("AvatarPickerHintTimeout")) + { + LLFirstUse::notUsingAvatarPicker(); + } if (gLoggedInTime.getElapsedTimeF32() > gSavedSettings.getF32("SidePanelHintTimeout")) { LLFirstUse::notUsingSidePanel(); diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 834fe6f966..b32a33b59a 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6447,6 +6447,14 @@ Mute everyone? The Destination Guide contains thousands of new places to discover. Select a location and choose Teleport to start exploring. </notification> + <notification + name="HintAvatarPicker" + label="Change your Look" + type="hint" + unique="true"> + Would you like to try a new look? Click the button below to see more Avatars. + </notification> + <notification name="HintSidePanel" label="Side Panel" -- cgit v1.2.3 From 20e9dbf40b0c3e4ef9674adbaca255723a412959 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 22 Oct 2010 18:37:40 -0700 Subject: EXP-273 FIXED Add button/tray for avatar picker made "toggleable" radio group --- indra/llui/llcheckboxctrl.cpp | 57 ++++++++-------------- indra/llui/llradiogroup.cpp | 44 ++++++++--------- indra/llui/llradiogroup.h | 12 ++--- indra/newview/app_settings/settings.xml | 11 +++++ indra/newview/llviewermenu.cpp | 51 +++++++++---------- indra/newview/llviewerwindow.cpp | 13 +++-- .../skins/default/xui/en/widgets/button.xml | 2 +- .../skins/default/xui/en/widgets/check_box.xml | 8 +++ 8 files changed, 99 insertions(+), 99 deletions(-) (limited to 'indra') diff --git a/indra/llui/llcheckboxctrl.cpp b/indra/llui/llcheckboxctrl.cpp index bbd8db2645..58ace3c548 100644 --- a/indra/llui/llcheckboxctrl.cpp +++ b/indra/llui/llcheckboxctrl.cpp @@ -88,27 +88,19 @@ LLCheckBoxCtrl::LLCheckBoxCtrl(const LLCheckBoxCtrl::Params& p) tbparams.font(p.font); } mLabel = LLUICtrlFactory::create<LLTextBox> (tbparams); + mLabel->reshapeToFitText(); addChild(mLabel); - S32 text_width = mLabel->getTextBoundingRect().getWidth(); - S32 text_height = llround(mFont->getLineHeight()); - LLRect label_rect; - label_rect.setOriginAndSize( - llcheckboxctrl_hpad + llcheckboxctrl_btn_size + llcheckboxctrl_spacing, - llcheckboxctrl_vpad + 1, // padding to get better alignment - text_width + llcheckboxctrl_hpad, - text_height ); - mLabel->setShape(label_rect); - + LLRect label_rect = mLabel->getRect(); // Button // Note: button cover the label by extending all the way to the right. - LLRect btn_rect; + LLRect btn_rect = p.check_button.rect(); btn_rect.setOriginAndSize( - llcheckboxctrl_hpad, - llcheckboxctrl_vpad, - llcheckboxctrl_btn_size + llcheckboxctrl_spacing + text_width + llcheckboxctrl_hpad, - llmax( text_height, llcheckboxctrl_btn_size() ) + llcheckboxctrl_vpad); + btn_rect.mLeft, + btn_rect.mBottom, + llmax(btn_rect.mRight, label_rect.mRight - btn_rect.mLeft), + llmax( label_rect.getHeight(), btn_rect.mTop)); std::string active_true_id, active_false_id; std::string inactive_true_id, inactive_false_id; @@ -174,31 +166,20 @@ void LLCheckBoxCtrl::clear() void LLCheckBoxCtrl::reshape(S32 width, S32 height, BOOL called_from_parent) { - //stretch or shrink bounding rectangle of label when rebuilding UI at new scale - static LLUICachedControl<S32> llcheckboxctrl_spacing ("UICheckboxctrlSpacing", 0); - static LLUICachedControl<S32> llcheckboxctrl_hpad ("UICheckboxctrlHPad", 0); - static LLUICachedControl<S32> llcheckboxctrl_vpad ("UICheckboxctrlVPad", 0); - static LLUICachedControl<S32> llcheckboxctrl_btn_size ("UICheckboxctrlBtnSize", 0); - S32 text_width = mLabel->getTextBoundingRect().getWidth(); - S32 text_height = llround(mFont->getLineHeight()); - LLRect label_rect; - label_rect.setOriginAndSize( - llcheckboxctrl_hpad + llcheckboxctrl_btn_size + llcheckboxctrl_spacing, - llcheckboxctrl_vpad, - text_width, - text_height ); - mLabel->setShape(label_rect); - - LLRect btn_rect; + mLabel->reshapeToFitText(); + + LLRect label_rect = mLabel->getRect(); + + // Button + // Note: button cover the label by extending all the way to the right. + LLRect btn_rect = mButton->getRect(); btn_rect.setOriginAndSize( - llcheckboxctrl_hpad, - llcheckboxctrl_vpad, - llcheckboxctrl_btn_size + llcheckboxctrl_spacing + text_width, - llmax( text_height, llcheckboxctrl_btn_size() ) ); - mButton->setShape( btn_rect ); - - LLUICtrl::reshape(width, height, called_from_parent); + btn_rect.mLeft, + btn_rect.mBottom, + llmax(btn_rect.mRight, label_rect.mRight - btn_rect.mLeft), + llmax( label_rect.getHeight(), btn_rect.mTop)); + mButton->setShape(btn_rect); } //virtual diff --git a/indra/llui/llradiogroup.cpp b/indra/llui/llradiogroup.cpp index cc348fdc63..6e9586369f 100644 --- a/indra/llui/llradiogroup.cpp +++ b/indra/llui/llradiogroup.cpp @@ -69,7 +69,7 @@ protected: static LLWidgetNameRegistry::StaticRegistrar register_radio_item(&typeid(LLRadioGroup::ItemParams), "radio_item"); LLRadioGroup::Params::Params() -: has_border("draw_border"), +: allow_deselect("allow_deselect"), items("item") { addSynonym(items, "radio_item"); @@ -85,18 +85,8 @@ LLRadioGroup::LLRadioGroup(const LLRadioGroup::Params& p) : LLUICtrl(p), mFont(p.font.isProvided() ? p.font() : LLFontGL::getFontSansSerifSmall()), mSelectedIndex(-1), - mHasBorder(p.has_border) -{ - if (mHasBorder) - { - LLViewBorder::Params params; - params.name("radio group border"); - params.rect(LLRect(0, getRect().getHeight(), getRect().getWidth(), 0)); - params.bevel_style(LLViewBorder::BEVEL_NONE); - LLViewBorder * vb = LLUICtrlFactory::create<LLViewBorder> (params); - addChild (vb); - } -} + mAllowDeselect(p.allow_deselect) +{} void LLRadioGroup::initFromParams(const Params& p) { @@ -184,7 +174,7 @@ void LLRadioGroup::setIndexEnabled(S32 index, BOOL enabled) BOOL LLRadioGroup::setSelectedIndex(S32 index, BOOL from_event) { - if (index < 0 || (S32)mRadioButtons.size() <= index ) + if ((S32)mRadioButtons.size() <= index ) { return FALSE; } @@ -202,13 +192,16 @@ BOOL LLRadioGroup::setSelectedIndex(S32 index, BOOL from_event) mSelectedIndex = index; - LLRadioCtrl* radio_item = mRadioButtons[mSelectedIndex]; - radio_item->setTabStop(true); - radio_item->setValue( TRUE ); - - if (hasFocus()) + if (mSelectedIndex >= 0) { - mRadioButtons[mSelectedIndex]->focusFirstItem(FALSE, FALSE); + LLRadioCtrl* radio_item = mRadioButtons[mSelectedIndex]; + radio_item->setTabStop(true); + radio_item->setValue( TRUE ); + + if (hasFocus()) + { + radio_item->focusFirstItem(FALSE, FALSE); + } } if (!from_event) @@ -307,8 +300,15 @@ void LLRadioGroup::onClickButton(LLUICtrl* ctrl) LLRadioCtrl* radio = *iter; if (radio == clicked_radio) { - // llinfos << "clicked button " << index << llendl; - setSelectedIndex(index); + if (index == mSelectedIndex && mAllowDeselect) + { + // don't select anything + setSelectedIndex(-1); + } + else + { + setSelectedIndex(index); + } // BUG: Calls click callback even if button didn't actually change onCommit(); diff --git a/indra/llui/llradiogroup.h b/indra/llui/llradiogroup.h index 0588900600..8bd5698538 100644 --- a/indra/llui/llradiogroup.h +++ b/indra/llui/llradiogroup.h @@ -49,7 +49,7 @@ public: struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> { - Optional<bool> has_border; + Optional<bool> allow_deselect; Multiple<ItemParams, AtLeast<1> > items; Params(); }; @@ -73,7 +73,6 @@ public: void setIndexEnabled(S32 index, BOOL enabled); // return the index value of the selected item S32 getSelectedIndex() const { return mSelectedIndex; } - // set the index value programatically BOOL setSelectedIndex(S32 index, BOOL from_event = FALSE); @@ -103,12 +102,13 @@ public: /*virtual*/ BOOL operateOnAll(EOperation op); private: - const LLFontGL* mFont; - S32 mSelectedIndex; + const LLFontGL* mFont; + S32 mSelectedIndex; + typedef std::vector<class LLRadioCtrl*> button_list_t; - button_list_t mRadioButtons; + button_list_t mRadioButtons; - BOOL mHasBorder; + bool mAllowDeselect; // user can click on an already selected option to deselect it }; #endif diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f23b57e62c..a06e1ff384 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -586,6 +586,17 @@ <key>Value</key> <integer>2</integer> </map> + <key>AvatarPickerURL</key> + <map> + <key>Comment</key> + <string>Avatar picker contents</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://interest.secondlife.com/viewer/avatar</string> + </map> <key>AvatarBakedTextureUploadTimeout</key> <map> <key>Comment</key> diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index ca9cc8e987..391f6b0b2a 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -844,36 +844,30 @@ class LLAdvancedCheckFeature : public view_listener_t } }; -void LLDestinationGuideToggle() +void LLDestinationAndAvatarShow(const LLSD& value) { - LLView* destination_guide = gViewerWindow->getRootView()->getChildView("destination_guide_container"); - LLView* avatar_picker = gViewerWindow->getRootView()->getChildView("avatar_picker_container"); + S32 panel_idx = value.isDefined() ? value.asInteger() : -1; + LLView* container = gViewerWindow->getRootView()->getChildView("avatar_picker_and_destination_guide_container"); + LLMediaCtrl* destinations = container->findChild<LLMediaCtrl>("destination_guide_contents"); + LLMediaCtrl* avatar_picker = container->findChild<LLMediaCtrl>("avatar_picker_contents"); - if ( destination_guide->getVisible() ) + switch(panel_idx) { - destination_guide->setVisible( FALSE ); - } - else - { - LLFirstUse::notUsingDestinationGuide(false); - destination_guide->setVisible( true ); - avatar_picker->setVisible( false ); - } -}; - -void LLAvatarPickerToggle() -{ - LLView* avatar_picker = gViewerWindow->getRootView()->getChildView("avatar_picker_container"); - LLView* destination_guide = gViewerWindow->getRootView()->getChildView("destination_guide_container"); - if ( avatar_picker->getVisible() ) - { - avatar_picker->setVisible( false ); - } - else - { - LLFirstUse::notUsingAvatarPicker(false); - avatar_picker->setVisible( true ); - destination_guide->setVisible( false ); + case 0: + container->setVisible(true); + destinations->setVisible(true); + avatar_picker->setVisible(false); + break; + case 1: + container->setVisible(true); + destinations->setVisible(false); + avatar_picker->setVisible(true); + break; + default: + container->setVisible(false); + destinations->setVisible(false); + avatar_picker->setVisible(false); + break; } }; @@ -8309,6 +8303,5 @@ void initialize_menus() view_listener_t::addMenu(new LLToggleUIHints(), "ToggleUIHints"); - commit.add("DestinationGuide.toggle", boost::bind(&LLDestinationGuideToggle)); - commit.add("AvatarPicker.toggle", boost::bind(&LLAvatarPickerToggle)); + commit.add("DestinationAndAvatar.show", boost::bind(&LLDestinationAndAvatarShow, _2)); } diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 62e8f4223e..774cf05220 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1699,12 +1699,19 @@ void LLViewerWindow::initWorldUI() buttons_panel->setFollowsAll(); buttons_panel_container->addChild(buttons_panel); - LLView* destination_guide = gViewerWindow->getRootView()->getChild<LLView>("destination_guide_container"); - LLMediaCtrl* destinations = destination_guide->findChild<LLMediaCtrl>("destination_guide_contents"); + LLView* avatar_picker_destination_guide_container = gViewerWindow->getRootView()->getChild<LLView>("avatar_picker_and_destination_guide_container"); + LLMediaCtrl* destinations = avatar_picker_destination_guide_container->findChild<LLMediaCtrl>("destination_guide_contents"); + LLMediaCtrl* avatar_picker = avatar_picker_destination_guide_container->findChild<LLMediaCtrl>("avatar_picker_contents"); if (destinations) { - destinations->navigateTo(gSavedSettings.getString("DestinationGuideURL")); + destinations->navigateTo(gSavedSettings.getString("DestinationGuideURL"), "text/html"); } + + if (avatar_picker) + { + avatar_picker->navigateTo(gSavedSettings.getString("AvatarPickerURL"), "text/html"); + } + } // Destroy the UI diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml index 2d0a1728d5..3585a013a4 100644 --- a/indra/newview/skins/default/xui/en/widgets/button.xml +++ b/indra/newview/skins/default/xui/en/widgets/button.xml @@ -19,7 +19,7 @@ image_color="ButtonImageColor" image_color_disabled="ButtonImageColor" flash_color="ButtonFlashBgColor" - font="SansSerifSmall" + font="SansSerifSmall" hover_glow_amount="0.15" halign="center" pad_bottom="3" diff --git a/indra/newview/skins/default/xui/en/widgets/check_box.xml b/indra/newview/skins/default/xui/en/widgets/check_box.xml index 7a60bee338..cca64fad2a 100644 --- a/indra/newview/skins/default/xui/en/widgets/check_box.xml +++ b/indra/newview/skins/default/xui/en/widgets/check_box.xml @@ -2,9 +2,17 @@ <check_box font="SansSerifSmall" follows="left|top"> <check_box.label_text name="checkbox label" + left="20" + bottom="3" + width="0" + height="0" text_color="LabelTextColor" text_readonly_color="LabelDisabledColor"/> <check_box.check_button name="CheckboxCtrl Button" + left="2" + bottom="2" + width="13" + height="13" commit_on_return="false" label="" is_toggle="true" -- cgit v1.2.3 From 7a975354a28fa700486759cea3fd5a9445ac46b7 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Mon, 25 Oct 2010 12:35:40 -0700 Subject: EXP-297 FIX Gray Bar shown on top of Skylight Viewer login screen during login on Gaikai --- indra/llui/lluicolortable.cpp | 6 ++++++ indra/llvfs/lldir.cpp | 6 +----- indra/llvfs/lldir_win32.cpp | 8 -------- 3 files changed, 7 insertions(+), 13 deletions(-) (limited to 'indra') diff --git a/indra/llui/lluicolortable.cpp b/indra/llui/lluicolortable.cpp index 0641f6d175..9455d09cc0 100644 --- a/indra/llui/lluicolortable.cpp +++ b/indra/llui/lluicolortable.cpp @@ -215,6 +215,12 @@ bool LLUIColorTable::loadFromSettings() result |= loadFromFilename(current_filename, mLoadedColors); } + current_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SKIN, "colors.xml"); + if(current_filename != default_filename) + { + result |= loadFromFilename(current_filename, mLoadedColors); + } + std::string user_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "colors.xml"); loadFromFilename(user_filename, mUserSetColors); diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index 938fb008c9..590a416282 100644 --- a/indra/llvfs/lldir.cpp +++ b/indra/llvfs/lldir.cpp @@ -382,11 +382,7 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd break; case LL_PATH_USER_SKIN: - prefix = getOSUserAppDir(); - prefix += mDirDelimiter; - prefix += "user_settings"; - prefix += mDirDelimiter; - prefix += "skins"; + prefix = getUserSkinDir(); break; case LL_PATH_SKINS: diff --git a/indra/llvfs/lldir_win32.cpp b/indra/llvfs/lldir_win32.cpp index 52d864e26f..616723c45c 100644 --- a/indra/llvfs/lldir_win32.cpp +++ b/indra/llvfs/lldir_win32.cpp @@ -206,14 +206,6 @@ void LLDir_Win32::initAppDirs(const std::string &app_name, } } - res = LLFile::mkdir(getExpandedFilename(LL_PATH_USER_SKIN,"")); - if (res == -1) - { - if (errno != EEXIST) - { - llwarns << "Couldn't create LL_PATH_SKINS dir " << getExpandedFilename(LL_PATH_USER_SKIN,"") << llendl; - } - } mCAFile = getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem"); } -- cgit v1.2.3 From b0d19b513de958bf5ad73278524b9deed431d166 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Mon, 25 Oct 2010 18:30:04 -0700 Subject: fixed progress bar overlapping progress bar track --- indra/newview/skins/default/textures/textures.xml | 4 ++-- .../skins/default/textures/widgets/ProgressBar.png | Bin 220 -> 316 bytes 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 925e2b5b04..58716dcfe7 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -368,8 +368,8 @@ with the same filename but different name <texture name="Play_Off" file_name="icons/Play_Off.png" preload="false" /> <texture name="Play_Over" file_name="icons/Play_Over.png" preload="false" /> <texture name="Play_Press" file_name="icons/Play_Press.png" preload="false" /> - - <texture name="ProgressBar" file_name="widgets/ProgressBar.png" preload="true" scale.left="4" scale.top="10" scale.right="48" scale.bottom="2" /> + + <texture name="ProgressBar" file_name="widgets/ProgressBar.png" preload="true" scale.left="4" scale.top="11" scale.right="48" scale.bottom="3" /> <texture name="ProgressTrack" file_name="widgets/ProgressTrack.png" preload="true" scale.left="4" scale.top="13" scale.right="148" scale.bottom="2" /> <texture name="PushButton_Disabled" file_name="widgets/PushButton_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> diff --git a/indra/newview/skins/default/textures/widgets/ProgressBar.png b/indra/newview/skins/default/textures/widgets/ProgressBar.png index edf11ac1f5..3f0e4eba28 100644 Binary files a/indra/newview/skins/default/textures/widgets/ProgressBar.png and b/indra/newview/skins/default/textures/widgets/ProgressBar.png differ -- cgit v1.2.3 From c47365480ccd6daf09c5e6f1f0672f5e0c42fadc Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Mon, 25 Oct 2010 18:33:06 -0700 Subject: EXP-322 FIXED Able spawn World map in Skylight Viewer with llMapDestination function --- indra/newview/app_settings/settings.xml | 11 +++++++++++ indra/newview/llviewermessage.cpp | 12 ++---------- indra/newview/llviewermessage.h | 1 - 3 files changed, 13 insertions(+), 11 deletions(-) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index a06e1ff384..92aa6db3f8 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8451,6 +8451,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>ScriptsCanShowUI</key> + <map> + <key>Comment</key> + <string>Allow LSL calls (such as LLMapDestination) to spawn viewer UI</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>SecondLifeEnterprise</key> <map> <key>Comment</key> diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 79a3bc5776..f8e51a578a 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -5280,16 +5280,6 @@ void process_alert_core(const std::string& message, BOOL modal) mean_collision_list_t gMeanCollisionList; time_t gLastDisplayedTime = 0; -void handle_show_mean_events(void *) -{ - if (gNoRender) - { - return; - } - LLFloaterReg::showInstance("bumps"); - //LLFloaterBump::showInstance(); -} - void mean_name_callback(const LLUUID &id, const std::string& first, const std::string& last, BOOL always_false) { if (gNoRender) @@ -6411,6 +6401,8 @@ void process_initiate_download(LLMessageSystem* msg, void**) void process_script_teleport_request(LLMessageSystem* msg, void**) { + if (!gSavedSettings.getBOOL("ScriptsCanShowUI")) return; + std::string object_name; std::string sim_name; LLVector3 pos; diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h index 6ff893f543..b4a9b8e677 100644 --- a/indra/newview/llviewermessage.h +++ b/indra/newview/llviewermessage.h @@ -117,7 +117,6 @@ void process_alert_core(const std::string& message, BOOL modal); typedef std::list<LLMeanCollisionData*> mean_collision_list_t; extern mean_collision_list_t gMeanCollisionList; -void handle_show_mean_events(void *); void process_mean_collision_alert_message(LLMessageSystem* msg, void**); void process_frozen_message(LLMessageSystem* msg, void**); -- cgit v1.2.3 From ff6147d6bdb3559e4dd36ccc0961ea4c46f6cd76 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 26 Oct 2010 10:23:20 -0700 Subject: fixed checkboxes growing larger over time --- indra/llui/llcheckboxctrl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/llui/llcheckboxctrl.cpp b/indra/llui/llcheckboxctrl.cpp index 58ace3c548..4fe444c1a4 100644 --- a/indra/llui/llcheckboxctrl.cpp +++ b/indra/llui/llcheckboxctrl.cpp @@ -177,8 +177,8 @@ void LLCheckBoxCtrl::reshape(S32 width, S32 height, BOOL called_from_parent) btn_rect.setOriginAndSize( btn_rect.mLeft, btn_rect.mBottom, - llmax(btn_rect.mRight, label_rect.mRight - btn_rect.mLeft), - llmax( label_rect.getHeight(), btn_rect.mTop)); + llmax(btn_rect.getWidth(), label_rect.mRight - btn_rect.mLeft), + llmax(label_rect.mTop - btn_rect.mBottom, btn_rect.getHeight())); mButton->setShape(btn_rect); } -- cgit v1.2.3 From 4df678e33461e960cbe49bdb1cb23afe799b6cdb Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 26 Oct 2010 11:24:32 -0700 Subject: EXP-331 FIXED Avatar and Destination Guild UI Hints not showing --- indra/newview/llbottomtray.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 1ba2a69289..5dfb9bda3c 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -520,8 +520,8 @@ void LLBottomTray::toggleCameraControls() BOOL LLBottomTray::postBuild() { LLHints::registerHintTarget("bottom_tray", LLView::getHandle()); - LLHints::registerHintTarget("dest_guide_btn", getChild<LLUICtrl>("destinations_btn")->getHandle()); - LLHints::registerHintTarget("avatar_picker_btn", getChild<LLUICtrl>("avatar_picker_btn")->getHandle()); + LLHints::registerHintTarget("dest_guide_btn", getChild<LLUICtrl>("destination_btn")->getHandle()); + LLHints::registerHintTarget("avatar_picker_btn", getChild<LLUICtrl>("avatar_btn")->getHandle()); LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("NearbyChatBar.Action", boost::bind(&LLBottomTray::onContextMenuItemClicked, this, _2)); LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("NearbyChatBar.EnableMenuItem", boost::bind(&LLBottomTray::onContextMenuItemEnabled, this, _2)); -- cgit v1.2.3 From 85e1a9bf928f493587bb270cb39d9afd7e379a3a Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 26 Oct 2010 12:38:18 -0700 Subject: EXP-299 WIP Pass end-user IP and MAC from Gaikai to login.cgi --- indra/newview/app_settings/settings.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 92aa6db3f8..1d58766b37 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -3855,6 +3855,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>HostID</key> + <map> + <key>Comment</key> + <string>Machine identifier for hosted Second Life instances</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string /> + </map> <key>HtmlHelpLastPage</key> <map> <key>Comment</key> @@ -11983,6 +11994,7 @@ <key>Comment</key> <string>Maximum texture width for user uploaded textures</string> <key>Persist</key> + <integer>1</integer> <key>Type</key> <string>S32</string> <key>Value</key> -- cgit v1.2.3 From 67f73e5a9f124cc9a5426ed9e6d455ba65b030b5 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 26 Oct 2010 12:52:51 -0700 Subject: EXP-299 FIXED Pass end-user IP and MAC from Gaikai to login.cgi --- indra/newview/lllogininstance.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'indra') diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index 3def135fb4..05b339e173 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -183,6 +183,7 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia request_params["version"] = gCurrentVersion; // Includes channel name request_params["channel"] = gSavedSettings.getString("VersionChannelName"); request_params["id0"] = mSerialNumber; + request_params["host_id"] = gSavedSettings.getString("HostID"); mRequestData.clear(); mRequestData["method"] = "login_to_simulator"; -- cgit v1.2.3 From 7a74e2c0cb93be6481205a4747824fd2e7dd6640 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 26 Oct 2010 16:36:58 -0700 Subject: fix for destination guide and avatar picker hints not disappearing when opening destination guide/avatar picker respectively --- indra/newview/llviewermenu.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'indra') diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 391f6b0b2a..5ad71263c3 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -857,11 +857,13 @@ void LLDestinationAndAvatarShow(const LLSD& value) container->setVisible(true); destinations->setVisible(true); avatar_picker->setVisible(false); + LLFirstUse::notUsingDestinationGuide(false); break; case 1: container->setVisible(true); destinations->setVisible(false); avatar_picker->setVisible(true); + LLFirstUse::notUsingAvatarPicker(false); break; default: container->setVisible(false); -- cgit v1.2.3 From de11ebefe905f011b4e8f38f8f9ed8832bdb87e8 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Fri, 29 Oct 2010 16:50:09 -0700 Subject: EXP-359 WIP Disable MOAP fixed AudioStreamingMusic and AudioStreamingMedia so they are independent this way we can keep audio on but disable html content --- indra/newview/llviewerparcelmgr.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 3c9e351ca1..a2f6f67b4d 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -1784,8 +1784,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use void optionally_start_music(const std::string& music_url) { - if (gSavedSettings.getBOOL("AudioStreamingMusic") && - gSavedSettings.getBOOL("AudioStreamingMedia")) + if (gSavedSettings.getBOOL("AudioStreamingMusic")) { // only play music when you enter a new parcel if the UI control for this // was not *explicitly* stopped by the user. (part of SL-4878) -- cgit v1.2.3 From 38a182f62fcdd3c8e684459bf29a434bf36dbce2 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Mon, 1 Nov 2010 13:45:55 -0700 Subject: EXP-371 Chat/IM bubble notifications not aligned with bottom bar --- indra/newview/llscreenchannel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index b90ff80294..5a36393f28 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -145,7 +145,7 @@ void LLScreenChannelBase::init(S32 channel_left, S32 channel_right) void LLScreenChannelBase::updateBottom() { S32 channel_top = gViewerWindow->getWorldViewRectScaled().getHeight(); - S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin"); + S32 channel_bottom = gSavedSettings.getS32("ChannelBottomPanelMargin"); S32 channel_left = getRect().mLeft; S32 channel_right = getRect().mRight; setRect(LLRect(channel_left, channel_top, channel_right, channel_bottom)); -- cgit v1.2.3 From f1830e905c553bff42a9035bc4bee9c40d707617 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Mon, 1 Nov 2010 16:29:49 -0700 Subject: removed extra space that resulted in strange line wrapping --- indra/newview/skins/default/xui/en/notifications.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index b32a33b59a..5a609e201d 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6452,7 +6452,7 @@ Mute everyone? label="Change your Look" type="hint" unique="true"> - Would you like to try a new look? Click the button below to see more Avatars. + Would you like to try a new look? Click the button below to see more Avatars. </notification> <notification -- cgit v1.2.3 From 5085fbfbdda90c396f1eb52b2a27212531ac87bc Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Tue, 2 Nov 2010 16:57:55 -0700 Subject: made focus_on_click a param for LLMediaCtrl --- indra/newview/llmediactrl.cpp | 13 +++---------- indra/newview/llmediactrl.h | 3 ++- 2 files changed, 5 insertions(+), 11 deletions(-) (limited to 'indra') diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index e84c9152b1..0f66713ab0 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -70,7 +70,8 @@ LLMediaCtrl::Params::Params() caret_color("caret_color"), initial_mime_type("initial_mime_type"), media_id("media_id"), - trusted_content("trusted_content", false) + trusted_content("trusted_content", false), + focus_on_click("focus_on_click", true) { tab_stop(false); } @@ -86,7 +87,7 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : mIgnoreUIScale( true ), mAlwaysRefresh( false ), mMediaSource( 0 ), - mTakeFocusOnClick( true ), + mTakeFocusOnClick( p.focus_on_click ), mCurrentNavUrl( "" ), mStretchToFill( true ), mMaintainAspectRatio ( true ), @@ -206,14 +207,6 @@ BOOL LLMediaCtrl::handleMouseUp( S32 x, S32 y, MASK mask ) if (mMediaSource) { mMediaSource->mouseUp(x, y, mask); - - // *HACK: LLMediaImplLLMozLib automatically takes focus on mouseup, - // in addition to the onFocusReceived() call below. Undo this. JC - if (!mTakeFocusOnClick) - { - mMediaSource->focus(false); - gViewerWindow->focusClient(); - } } gFocusMgr.setMouseCapture( NULL ); diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 65dfbbff78..96bb0c1df5 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -53,7 +53,8 @@ public: ignore_ui_scale, hide_loading, decouple_texture_size, - trusted_content; + trusted_content, + focus_on_click; Optional<S32> texture_width, texture_height; -- cgit v1.2.3 From 4bdac3f152862b257b9babe9b5a43329c9f544f9 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Thu, 4 Nov 2010 11:37:41 -0700 Subject: fixed hotspots on one-click action cursors --- indra/newview/res/toolbuy.cur | Bin 4286 -> 4286 bytes indra/newview/res/toolopen.cur | Bin 4286 -> 4286 bytes indra/newview/res/toolsit.cur | Bin 4286 -> 4286 bytes 3 files changed, 0 insertions(+), 0 deletions(-) (limited to 'indra') diff --git a/indra/newview/res/toolbuy.cur b/indra/newview/res/toolbuy.cur index a1bc278116..65bbf01d45 100644 Binary files a/indra/newview/res/toolbuy.cur and b/indra/newview/res/toolbuy.cur differ diff --git a/indra/newview/res/toolopen.cur b/indra/newview/res/toolopen.cur index a72cdfe4c0..22ecbd5228 100644 Binary files a/indra/newview/res/toolopen.cur and b/indra/newview/res/toolopen.cur differ diff --git a/indra/newview/res/toolsit.cur b/indra/newview/res/toolsit.cur index 6327bdb281..d26b6f8638 100644 Binary files a/indra/newview/res/toolsit.cur and b/indra/newview/res/toolsit.cur differ -- cgit v1.2.3 From b3541777921142572f735c4b028e4fba91ae80a0 Mon Sep 17 00:00:00 2001 From: Tofu Buzzard <no-email> Date: Mon, 15 Nov 2010 16:48:10 +0000 Subject: VWR-23839 Pulseaudio support is crashing web media on some new Linux distros --- indra/cmake/PulseAudio.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/cmake/PulseAudio.cmake b/indra/cmake/PulseAudio.cmake index e918de0198..360a971058 100644 --- a/indra/cmake/PulseAudio.cmake +++ b/indra/cmake/PulseAudio.cmake @@ -1,7 +1,7 @@ # -*- cmake -*- include(Prebuilt) -set(PULSEAUDIO ON CACHE BOOL "Build with PulseAudio support, if available.") +set(PULSEAUDIO OFF CACHE BOOL "Build with PulseAudio support, if available.") if (PULSEAUDIO) if (STANDALONE) -- cgit v1.2.3 From d276950c8d4d53f9d5d6497d5a4a4582c499938a Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Mon, 15 Nov 2010 17:03:52 -0800 Subject: build fixes --- indra/llui/lluistring.h | 2 -- indra/llui/llurlentry.cpp | 2 +- indra/llui/llurlentry.h | 2 ++ indra/newview/llpaneloutfitedit.cpp | 10 ++-------- 4 files changed, 5 insertions(+), 11 deletions(-) (limited to 'indra') diff --git a/indra/llui/lluistring.h b/indra/llui/lluistring.h index 35f177238d..cb40c85582 100644 --- a/indra/llui/lluistring.h +++ b/indra/llui/lluistring.h @@ -63,8 +63,6 @@ public: LLUIString(const std::string& instring) : mArgs(NULL) { assign(instring); } ~LLUIString() { delete mArgs; } - ~LLUIString() { delete mArgs; } - void assign(const std::string& instring); LLUIString& operator=(const std::string& s) { assign(s); return *this; } diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index ebd0f912b8..13bfeb5e2d 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -174,7 +174,7 @@ bool LLUrlEntryBase::isLinkDisabled() const // this allows us to have a global setting to turn off text hyperlink highlighting/action bool globally_disabled = LLUI::sSettingGroups["config"]->getBOOL("DisableTextHyperlinkActions"); - return mDisabledLink || globally_disabled; + return globally_disabled; } static std::string getStringAfterToken(const std::string str, const std::string token) diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index 1a16056041..43a667c390 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -94,6 +94,8 @@ public: virtual LLUUID getID(const std::string &string) const { return LLUUID::null; } + bool isLinkDisabled() const; + protected: std::string getIDStringFromUrl(const std::string &url) const; std::string escapeUrl(const std::string &url) const; diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index ce9b1c66d7..c10c21683b 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -186,14 +186,8 @@ private: // Populate the menu with items like "New Skin", "New Pants", etc. static void populateCreateWearableSubmenus(LLMenuGL* menu) { - LLView* menu_clothes = gMenuHolder->findChildView("COF.Gear.New_Clothes", FALSE); - LLView* menu_bp = gMenuHolder->findChildView("COF.Geear.New_Body_Parts", FALSE); - - if (!menu_clothes || !menu_bp) - { - llassert(menu_clothes && menu_bp); - return; - } + LLView* menu_clothes = gMenuHolder->getChildView("COF.Gear.New_Clothes", FALSE); + LLView* menu_bp = gMenuHolder->getChildView("COF.Geear.New_Body_Parts", FALSE); for (U8 i = LLWearableType::WT_SHAPE; i != (U8) LLWearableType::WT_COUNT; ++i) { -- cgit v1.2.3 From c28b476a6806a426593e6798ea537f13ca354fc8 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 8 Dec 2010 15:26:36 -0800 Subject: EXP-448 FIX Notification not found error for NofileExtension given when uploading file with no file extension during Bulk Upload --- indra/newview/llviewermenufile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 048691696b..b7be3bc5b3 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -505,7 +505,7 @@ void upload_new_resource(const std::string& src_filename, std::string name, "No file extension for the file: '%s'\nPlease make sure the file has a correct file extension", short_name.c_str()); args["FILE"] = short_name; - upload_error(error_message, "NofileExtension", filename, args); + upload_error(error_message, "NoFileExtension", filename, args); return; } else if( exten == "bmp") -- cgit v1.2.3 From e7cd5f7e614e9884398d505a47376188c693d685 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 8 Dec 2010 16:40:56 -0800 Subject: EXP-445 FIXED Skylight view hint shown in main viewer skin and not dismissed when using orbit pan zoom tools. --- indra/newview/skins/default/xui/en/notification_visibility.xml | 1 + 1 file changed, 1 insertion(+) (limited to 'indra') diff --git a/indra/newview/skins/default/xui/en/notification_visibility.xml b/indra/newview/skins/default/xui/en/notification_visibility.xml index d32066a5a5..e1973f926f 100644 --- a/indra/newview/skins/default/xui/en/notification_visibility.xml +++ b/indra/newview/skins/default/xui/en/notification_visibility.xml @@ -1,6 +1,7 @@ <?xml version="1.0" ?> <notification_visibility> <hide name="HintMoveArrows"/> + <hide name="HintView"/> <show/> </notification_visibility> -- cgit v1.2.3 From e17eea11a8befd5c09a0975a1b7b7ec6bb667368 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 8 Dec 2010 16:53:37 -0800 Subject: EXP-445 FIXED Skylight view hint shown in main viewer skin and not dismissed when using orbit pan zoom tools. better fix that uses tag to isolate all skin specific notifications --- indra/newview/skins/default/xui/en/notification_visibility.xml | 3 +-- indra/newview/skins/default/xui/en/notifications.xml | 4 +++- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'indra') diff --git a/indra/newview/skins/default/xui/en/notification_visibility.xml b/indra/newview/skins/default/xui/en/notification_visibility.xml index e1973f926f..db292100d7 100644 --- a/indra/newview/skins/default/xui/en/notification_visibility.xml +++ b/indra/newview/skins/default/xui/en/notification_visibility.xml @@ -1,7 +1,6 @@ <?xml version="1.0" ?> <notification_visibility> - <hide name="HintMoveArrows"/> - <hide name="HintView"/> + <hide tag="custom_skin"/> <show/> </notification_visibility> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index c1fad9050b..b1fd579c6f 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6583,14 +6583,16 @@ Mute everyone? type="hint" unique="true"> To walk, use the directional keys on your keyboard. You can run by pressing the Up arrow twice. + <tag>custom_skin</tag> </notification> - + <notification name="HintView" label="View" type="hint" unique="true"> To change your camera view, use the Orbit and Pan controls. Reset your view by pressing Escape or walking. + <tag>custom_skin</tag> </notification> <notification -- cgit v1.2.3 From cf6147f7c092e6ca10697dea341099c5e281df00 Mon Sep 17 00:00:00 2001 From: Richard Linden <none@none> Date: Wed, 8 Dec 2010 17:28:27 -0800 Subject: EXP-465 FIX Viewer window does not fill screen on Mac and Linux using --fullscreen disabled fullscreen mode for merge to viewer-development --- indra/newview/app_settings/cmd_line.xml | 7 ------- indra/newview/llappviewer.cpp | 3 +++ 2 files changed, 3 insertions(+), 7 deletions(-) (limited to 'indra') diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml index 294d85eac1..e4ac455e7c 100644 --- a/indra/newview/app_settings/cmd_line.xml +++ b/indra/newview/app_settings/cmd_line.xml @@ -392,13 +392,6 @@ <string>CrashOnStartup</string> </map> - <key>fullscreen</key> - <map> - <key>desc</key> - <string>Force full screen mode</string> - <key>map-to</key> - <string>WindowFullScreen</string> - </map> <key>disablecrashlogger</key> <map> <key>desc</key> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index cd53fb8970..b460885a53 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -505,6 +505,9 @@ static void settings_modify() gSavedSettings.setBOOL("VectorizeEnable", FALSE ); gSavedSettings.setU32("VectorizeProcessor", 0 ); gSavedSettings.setBOOL("VectorizeSkin", FALSE); + + // disable fullscreen mode, unsupported + gSavedSettings.setBOOL("WindowFullScreen", FALSE); #endif } -- cgit v1.2.3 From ee538257d316696382d12ea222294a4b8786dc84 Mon Sep 17 00:00:00 2001 From: Paul Guslisty <pguslisty@productengine.com> Date: Fri, 10 Dec 2010 13:01:01 +0200 Subject: STORM-622 FIXED Texture picker screws up when multiple textures are opened. Reason: In viewer 2 ability was added to set aspect ratio while previewing textures. It was achieved by resizing the floater containing a texture, instead of proportionally resize the texture. The problem happened when multifloater was opened with texture preview floaters and for some floaters textures were not loaded yet. After texture was loaded, the floater (in multifloater) which contained just loaded texture resized to fit with the new texture's size and texture preview floaters screwed up from the multifloater. Solution: Proportionally resizing a texture inside the floater instead of the floater itself. Also two issues was fixed: 1. when floater resized the texture streched in the floater and lost its proportions. 2. When docking texture floater to the multifloater, multifloater resized to fit with docked floater and other texture lost their proportions. --- indra/newview/llpreview.cpp | 3 +- indra/newview/llpreviewtexture.cpp | 77 ++------------------------------------ 2 files changed, 6 insertions(+), 74 deletions(-) (limited to 'indra') diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp index 69542764d2..a90f23d637 100644 --- a/indra/newview/llpreview.cpp +++ b/indra/newview/llpreview.cpp @@ -454,12 +454,13 @@ LLMultiPreview::LLMultiPreview() { // start with a rect in the top-left corner ; will get resized LLRect rect; - rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 200, 200); + rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 200, 400); setRect(rect); } setTitle(LLTrans::getString("MultiPreviewTitle")); buildTabContainer(); setCanResize(TRUE); + mAutoResize = FALSE; } void LLMultiPreview::onOpen(const LLSD& key) diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index fd6b326ef1..7657cccd4e 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -318,7 +318,7 @@ void LLPreviewTexture::reshape(S32 width, S32 height, BOOL called_from_parent) } } - mClientRect.setLeftTopAndSize(client_rect.getCenterX() - (client_width / 2), client_rect.getCenterY() + (client_height / 2), client_width, client_height); + mClientRect.setLeftTopAndSize(client_rect.getCenterX() - (client_width / 2), client_rect.getCenterY() + (client_height / 2), client_width, client_height); } @@ -400,7 +400,6 @@ void LLPreviewTexture::updateDimensions() { return; } - mUpdateDimensions = FALSE; @@ -408,80 +407,12 @@ void LLPreviewTexture::updateDimensions() getChild<LLUICtrl>("dimensions")->setTextArg("[HEIGHT]", llformat("%d", mImage->getFullHeight())); - LLRect dim_rect(getChildView("dimensions")->getRect()); - - S32 horiz_pad = 2 * (LLPANEL_BORDER_WIDTH + PREVIEW_PAD) + PREVIEW_RESIZE_HANDLE_SIZE; - - // add space for dimensions and aspect ratio - S32 info_height = dim_rect.mTop + CLIENT_RECT_VPAD; - - S32 screen_width = gFloaterView->getSnapRect().getWidth(); - S32 screen_height = gFloaterView->getSnapRect().getHeight(); - - S32 max_image_width = screen_width - 2*horiz_pad; - S32 max_image_height = screen_height - (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD) - - (PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height); - - S32 client_width = llmin(max_image_width,mImage->getFullWidth()); - S32 client_height = llmin(max_image_height,mImage->getFullHeight()); - - if (mAspectRatio > 0.f) - { - if(mAspectRatio > 1.f) - { - client_height = llceil((F32)client_width / mAspectRatio); - if(client_height > max_image_height) - { - client_height = max_image_height; - client_width = llceil((F32)client_height * mAspectRatio); - } - } - else//mAspectRatio < 1.f - { - client_width = llceil((F32)client_height * mAspectRatio); - if(client_width > max_image_width) - { - client_width = max_image_width; - client_height = llceil((F32)client_width / mAspectRatio); - } - } - } - else - { - - if(client_height > max_image_height) - { - F32 ratio = (F32)max_image_height/client_height; - client_height = max_image_height; - client_width = llceil((F32)client_height * ratio); - } - - if(client_width > max_image_width) - { - F32 ratio = (F32)max_image_width/client_width; - client_width = max_image_width; - client_height = llceil((F32)client_width * ratio); - } - } - - //now back to whole floater - S32 floater_width = llmax(getMinWidth(),client_width + 2*horiz_pad); - S32 floater_height = llmax(getMinHeight(),client_height + (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD) - + (PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height)); - //reshape floater - reshape( floater_width, floater_height ); - gFloaterView->adjustToFitScreen(this, FALSE); + reshape(getRect().getWidth(), getRect().getHeight()); - //setup image rect... - LLRect client_rect(horiz_pad, getRect().getHeight(), getRect().getWidth() - horiz_pad, 0); - client_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD); - client_rect.mBottom += PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height ; - - mClientRect.setLeftTopAndSize(client_rect.getCenterX() - (client_width / 2), client_rect.getCenterY() + (client_height / 2), client_width, client_height); + gFloaterView->adjustToFitScreen(this, FALSE); - // Hide the aspect ratio label if the window is too narrow - // Assumes the label should be to the right of the dimensions + LLRect dim_rect(getChildView("dimensions")->getRect()); LLRect aspect_label_rect(getChildView("aspect_ratio")->getRect()); getChildView("aspect_ratio")->setVisible( dim_rect.mRight < aspect_label_rect.mLeft); } -- cgit v1.2.3 From a42b6acd6ae677a4347771baa49d75dc560269a3 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Fri, 10 Dec 2010 16:30:45 +0200 Subject: STORM-431 FIXED Hot keys did't work with autocompletion in search field. --- indra/newview/llsearchcombobox.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'indra') diff --git a/indra/newview/llsearchcombobox.cpp b/indra/newview/llsearchcombobox.cpp index db531b5695..6558c9a7fa 100644 --- a/indra/newview/llsearchcombobox.cpp +++ b/indra/newview/llsearchcombobox.cpp @@ -131,6 +131,9 @@ void LLSearchComboBox::focusTextEntry() if (mTextEntry) { gFocusMgr.setKeyboardFocus(mTextEntry); + + // Let the editor handle editing hotkeys (STORM-431). + LLEditMenuHandler::gEditMenuHandler = mTextEntry; } } -- cgit v1.2.3 From 18a18f5985c76adaed040b4bdcba15cc251dbeb5 Mon Sep 17 00:00:00 2001 From: Seth ProductEngine <slitovchuk@productengine.com> Date: Fri, 10 Dec 2010 19:13:25 +0200 Subject: STORM-693 FIXED Preview thumbnails in the Edit Wearable and Edit Body Parts panels now follow opacity settings for inactive floater. When the floater is active the thumbnails are opaque. The behavior is similar to texture control's. --- indra/newview/llscrollingpanelparam.cpp | 8 ++++++-- indra/newview/lltoolmorph.cpp | 4 ++-- indra/newview/lltoolmorph.h | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) (limited to 'indra') diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp index 05b273cd29..f8c20dada0 100644 --- a/indra/newview/llscrollingpanelparam.cpp +++ b/indra/newview/llscrollingpanelparam.cpp @@ -165,12 +165,16 @@ void LLScrollingPanelParam::draw() getChildView("max param text")->setVisible( FALSE ); LLPanel::draw(); + // If we're in a focused floater, don't apply the floater's alpha to visual param hint, + // making its behavior similar to texture controls'. + F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency(); + // Draw the hints over the "less" and "more" buttons. gGL.pushUIMatrix(); { const LLRect& r = mHintMin->getRect(); gGL.translateUI((F32)r.mLeft, (F32)r.mBottom, 0.f); - mHintMin->draw(); + mHintMin->draw(alpha); } gGL.popUIMatrix(); @@ -178,7 +182,7 @@ void LLScrollingPanelParam::draw() { const LLRect& r = mHintMax->getRect(); gGL.translateUI((F32)r.mLeft, (F32)r.mBottom, 0.f); - mHintMax->draw(); + mHintMax->draw(alpha); } gGL.popUIMatrix(); diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp index ca80a1db79..964b17d3a6 100644 --- a/indra/newview/lltoolmorph.cpp +++ b/indra/newview/lltoolmorph.cpp @@ -244,13 +244,13 @@ BOOL LLVisualParamHint::render() //----------------------------------------------------------------------------- // draw() //----------------------------------------------------------------------------- -void LLVisualParamHint::draw() +void LLVisualParamHint::draw(F32 alpha) { if (!mIsVisible) return; gGL.getTexUnit(0)->bind(this); - gGL.color4f(1.f, 1.f, 1.f, 1.f); + gGL.color4f(1.f, 1.f, 1.f, alpha); LLGLSUIDefault gls_ui; gGL.begin(LLRender::QUADS); diff --git a/indra/newview/lltoolmorph.h b/indra/newview/lltoolmorph.h index 59201233ae..a6889be151 100644 --- a/indra/newview/lltoolmorph.h +++ b/indra/newview/lltoolmorph.h @@ -68,7 +68,7 @@ public: BOOL render(); void requestUpdate( S32 delay_frames ) {mNeedsUpdate = TRUE; mDelayFrames = delay_frames; } void setUpdateDelayFrames( S32 delay_frames ) { mDelayFrames = delay_frames; } - void draw(); + void draw(F32 alpha); LLViewerVisualParam* getVisualParam() { return mVisualParam; } F32 getVisualParamWeight() { return mVisualParamWeight; } -- cgit v1.2.3 From 1d686283a467808eda2d7bd8a2c109d4924151f2 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Sat, 11 Dec 2010 17:24:39 +0200 Subject: STORM-391 WIP Removed unused methods. --- indra/newview/llscreenchannel.cpp | 5 ----- indra/newview/llscreenchannel.h | 3 --- 2 files changed, 8 deletions(-) (limited to 'indra') diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index 9e0e10d66f..64e75a6cb2 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -605,10 +605,6 @@ void LLScreenChannel::showToastsBottom() mHiddenToastsNum++; } } - else - { - closeOverflowToastPanel(); - } } //-------------------------------------------------------------------------- @@ -731,7 +727,6 @@ void LLNotificationsUI::LLScreenChannel::startToastTimer(LLToast* toast) //-------------------------------------------------------------------------- void LLScreenChannel::hideToastsFromScreen() { - closeOverflowToastPanel(); for(std::vector<ToastElem>::iterator it = mToastList.begin(); it != mToastList.end(); it++) (*it).toast->setVisible(FALSE); } diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h index 023a65d872..c536a21779 100644 --- a/indra/newview/llscreenchannel.h +++ b/indra/newview/llscreenchannel.h @@ -81,9 +81,6 @@ public: // show all toasts in a channel virtual void redrawToasts() {}; - virtual void closeOverflowToastPanel() {}; - virtual void hideOverflowToastPanel() {}; - // Channel's behavior-functions // set whether a channel will control hovering inside itself or not -- cgit v1.2.3 From 0d764afb9c0ba5dd3aeed67370f8d5c7d9b7cf45 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Sat, 11 Dec 2010 18:02:59 +0200 Subject: STORM-391 FIXED Dismiss toasts that don't fit on screen. Make sure older toasts don't appear after newer ones fade out. --- indra/newview/llscreenchannel.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'indra') diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index 64e75a6cb2..0eeb89792b 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -595,14 +595,13 @@ void LLScreenChannel::showToastsBottom() } } + // Dismiss toasts we don't have space for (STORM-391). if(it != mToastList.rend()) { mHiddenToastsNum = 0; for(; it != mToastList.rend(); it++) { - (*it).toast->stopTimer(); - (*it).toast->setVisible(FALSE); - mHiddenToastsNum++; + (*it).toast->hide(); } } } -- cgit v1.2.3 From 872e4dcdde979981d35889152dbee827775c4b7c Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Sat, 11 Dec 2010 18:54:33 +0200 Subject: STORM-766 ADDITIONAL FIX Made day cycle image in the advanced sky editor honor floater opacity settings. --- indra/newview/skins/default/xui/en/floater_windlight_options.xml | 1 + 1 file changed, 1 insertion(+) (limited to 'indra') diff --git a/indra/newview/skins/default/xui/en/floater_windlight_options.xml b/indra/newview/skins/default/xui/en/floater_windlight_options.xml index 85a5be369c..249ad95c41 100644 --- a/indra/newview/skins/default/xui/en/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/en/floater_windlight_options.xml @@ -594,6 +594,7 @@ left_delta="14" top_pad="10" name="SkyDayCycle" + use_draw_context_alpha="false" width="148" /> <slider control_name="WLSunAngle" -- cgit v1.2.3 From 37cd8ad2a27188538c29fdcce58cf8ec6185231c Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine <vsavchuk@productengine.com> Date: Mon, 13 Dec 2010 13:38:46 +0200 Subject: STORM-781 FIXED Added support for editing multiple scripts within inventory of the same object using external editor. The bug was caused by using the object ID as temporary file name for editing script, which of course didn't work for multiple scripts in the same object inventory. The fix is to use MD5("object id" + "script inventory item id") for the file name. --- indra/newview/llpreviewscript.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 330e809c53..d0ebf047e8 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -2034,7 +2034,17 @@ bool LLLiveLSLEditor::writeToFile(const std::string& filename) std::string LLLiveLSLEditor::getTmpFileName() { - return std::string(LLFile::tmpdir()) + "sl_script_" + mObjectUUID.asString() + ".lsl"; + // Take script inventory item id (within the object inventory) + // to consideration so that it's possible to edit multiple scripts + // in the same object inventory simultaneously (STORM-781). + std::string script_id = mObjectUUID.asString() + "_" + mItemUUID.asString(); + + // Use MD5 sum to make the file name shorter and not exceed maximum path length. + char script_id_hash_str[33]; /* Flawfinder: ignore */ + LLMD5 script_id_hash((const U8 *)script_id.c_str()); + script_id_hash.hex_digest(script_id_hash_str); + + return std::string(LLFile::tmpdir()) + "sl_script_" + script_id_hash_str + ".lsl"; } void LLLiveLSLEditor::uploadAssetViaCaps(const std::string& url, -- cgit v1.2.3 From a702b34394e4b38b27338eb6d68d22b498984118 Mon Sep 17 00:00:00 2001 From: Paul Guslisty <pguslisty@productengine.com> Date: Tue, 14 Dec 2010 17:11:08 +0200 Subject: STORM-352 FIXED Vertical scrollbar isn't reshaped in resident profile panel after decreasing panel height - Set height of scroll container the same as bounding panel's height --- indra/newview/skins/default/xui/en/panel_profile.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index 7caf425058..61e3bb354f 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -59,7 +59,7 @@ left="0" name="profile_scroll" opaque="true" - height="527" + height="400" width="317" top="0"> <panel -- cgit v1.2.3