diff options
| author | Monroe Linden <monroe@lindenlab.com> | 2010-12-02 14:33:42 -0800 | 
|---|---|---|
| committer | Monroe Linden <monroe@lindenlab.com> | 2010-12-02 14:33:42 -0800 | 
| commit | 1e050c2ed87ae2093623fa4c66a69aeee1fb980c (patch) | |
| tree | ff9bf66608dc3b9c4459daa68ec99a3065182aac /indra/newview | |
| parent | 36954908632d6f5366f6517023676c1bcd71aa17 (diff) | |
| parent | d276950c8d4d53f9d5d6497d5a4a4582c499938a (diff) | |
merge
Diffstat (limited to 'indra/newview')
86 files changed, 2020 insertions, 1248 deletions
| diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 679637caf6..2dd32b7aa4 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1325,7 +1325,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 diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml index 1b8393330d..294d85eac1 100644 --- a/indra/newview/app_settings/cmd_line.xml +++ b/indra/newview/app_settings/cmd_line.xml @@ -392,6 +392,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>      <key>disablecrashlogger</key>      <map>        <key>desc</key> @@ -399,6 +406,5 @@        <key>map-to</key>        <string>DisableCrashLogger</string>      </map> -    </map>  </llsd> diff --git a/indra/newview/app_settings/ignorable_dialogs.xml b/indra/newview/app_settings/ignorable_dialogs.xml index 9ddf007ce7..89fd4e5935 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> @@ -56,6 +67,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/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/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/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 7dbb375a20..525254ab80 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> @@ -607,6 +608,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> @@ -2556,7 +2568,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> @@ -2578,6 +2601,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> @@ -2589,6 +2623,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> @@ -2732,6 +2777,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> @@ -2875,6 +2942,39 @@        <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>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> @@ -3568,72 +3668,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> @@ -3645,61 +3679,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> @@ -3892,7 +3871,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> @@ -3942,6 +3921,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> @@ -3980,7 +3970,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> @@ -4614,6 +4604,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> @@ -5241,61 +5242,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> @@ -6568,6 +6514,28 @@        <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> +      <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> @@ -7825,17 +7793,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> @@ -8351,6 +8308,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>RenderTransparentWater</key>  	<map>  	  <key>Comment</key> @@ -8538,6 +8506,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> @@ -8626,6 +8605,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> @@ -11597,6 +11587,28 @@        <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> +      <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> @@ -11905,6 +11917,17 @@        <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>        <key>Comment</key> @@ -12202,6 +12225,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> @@ -12308,6 +12332,17 @@        <key>Type</key>        <string>F32</string>        <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> diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 7c953cd2dc..15f8e7bf4d 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -2041,7 +2041,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/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 4e0bfb2e22..80734b0d41 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -2947,3 +2947,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; diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index b6f52e3e15..8471e4ca25 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -823,16 +823,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) @@ -1310,6 +1316,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 @@ -1449,17 +1470,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 @@ -2196,7 +2207,7 @@ bool LLAppViewer::initConfiguration()  	if (clp.hasOption("nonotifications"))  	{ -		gSavedSettings.setBOOL("IgnoreAllNotifications", TRUE); +		gSavedSettings.getControl("IgnoreAllNotifications")->setValue(true, false);  	}  	if (clp.hasOption("debugsession")) @@ -2243,8 +2254,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"); @@ -2499,7 +2510,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; @@ -2994,6 +3005,23 @@ void LLAppViewer::forceQuit()  	LLApp::setQuitting();   } +//TODO: remove +void LLAppViewer::fastQuit(S32 error_code) +{ +	// 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()  {  	llinfos << "requestQuit" << llendl; @@ -3002,6 +3030,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; @@ -3066,12 +3101,12 @@ void LLAppViewer::earlyExit(const std::string& name, const LLSD& substitutions)  	LLNotificationsUtil::add(name, substitutions, LLSD(), finish_early_exit);  } -void LLAppViewer::forceExit(S32 arg) +// case where we need the viewer to exit without any need for notifications +void LLAppViewer::earlyExitNoNotify()  { -    removeMarkerFile(); -     -    // *FIX:Mani - This kind of exit hardly seems appropriate. -    exit(arg); +   	llwarns << "app_early_exit with no notification: " << llendl; +	gDoDisconnect = TRUE; +	finish_early_exit( LLSD(), LLSD() );  }  void LLAppViewer::abortQuit() @@ -3667,6 +3702,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 gracefully +			LLAppViewer::instance()->requestQuit(); +		} +	} +  	// Must wait until both have avatar object and mute list, so poll  	// here.  	request_initial_instant_messages(); @@ -4103,7 +4150,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; diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index aa4256a2bd..7c946b04a5 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -65,12 +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(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 forceExit(S32 arg); // exit() immediately (after some cleanup). +	void earlyExitNoNotify(); // Do not display error dialog then forcibly quit.      void abortQuit();  // Called to abort a quit request.      bool quitRequested() { return mQuitRequested; } diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 6ccb5aaf54..35e4548483 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)  { +	if (mCanDrag) +	{  	S32 screenX, screenY;  	localPointToScreen(x, y, &screenX, &screenY);  	// pass hover to bottomtray  	LLBottomTray::getInstance()->onDraggableButtonHover(screenX, screenY); -	return FALSE; +		return TRUE; +	} +	else +	{ +		return LLButton::handleHover(x, y, mask); +	}  }  //virtual  BOOL LLBottomtrayButton::handleMouseUp(S32 x, S32 y, MASK mask)  { +	if (mCanDrag) +	{  	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; +	} +	return LLButton::handleMouseUp(x, y, mask);  }  //virtual  BOOL LLBottomtrayButton::handleMouseDown(S32 x, S32 y, MASK mask)  { +	if (mCanDrag) +	{  	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; +	} +	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() @@ -218,9 +227,6 @@ LLBottomTray::LLBottomTray(const LLSD&)  	//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(); @@ -513,6 +519,9 @@ void LLBottomTray::toggleCameraControls()  BOOL LLBottomTray::postBuild()  { +	LLHints::registerHintTarget("bottom_tray", LLView::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)); 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  diff --git a/indra/newview/llcommandlineparser.cpp b/indra/newview/llcommandlineparser.cpp index f31ff14df6..65c61c4a8b 100644 --- a/indra/newview/llcommandlineparser.cpp +++ b/indra/newview/llcommandlineparser.cpp @@ -345,7 +345,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/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; 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 diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index b08c113923..4c17199895 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -100,9 +100,16 @@ 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"));  } +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)  { @@ -113,7 +120,15 @@ void LLFirstUse::notUsingSidePanel(bool enable)  // static  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("target", "bottom_tray").with("direction", "top").with("hint_image", "arrow_keys.png").with("down_arrow", "")); +} + +// 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 3b7ff6383b..81659988e6 100644 --- a/indra/newview/llfirstuse.h +++ b/indra/newview/llfirstuse.h @@ -87,8 +87,10 @@ 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);  	static void newInventory(bool enable = true);  	static void receiveLindens(bool enable = true);  	static void setDisplayName(bool enable = true); diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index ad24c6534a..039ae83b5e 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"); @@ -73,6 +75,8 @@ protected:  	void	onZoomPlusHeldDown();  	void	onZoomMinusHeldDown();  	void	onSliderValueChanged(); +	void	onCameraTrack(); +	void	onCameraRotate();  	F32		getOrbitRate(F32 time);  private: @@ -162,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() @@ -198,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 ) @@ -294,6 +312,8 @@ LLFloaterCamera* LLFloaterCamera::findInstance()  void LLFloaterCamera::onOpen(const LLSD& key)  { +	LLFirstUse::viewPopup(); +  	LLButton *anchor_panel = LLBottomTray::getInstance()->getChild<LLButton>("camera_btn");  	setDockControl(new LLDockControl( @@ -336,6 +356,7 @@ LLFloaterCamera::LLFloaterCamera(const LLSD& val)  	mCurrMode(CAMERA_CTRL_MODE_PAN),  	mPrevMode(CAMERA_CTRL_MODE_PAN)  { +	LLHints::registerHintTarget("view_popup", LLView::getHandle());  }  // virtual 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/llhints.cpp b/indra/newview/llhints.cpp index 3f0deb98cd..c4dcaf11f9 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"), @@ -166,7 +169,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/llhudtext.cpp b/indra/newview/llhudtext.cpp index f7e5103d88..24a876c59a 100644 --- a/indra/newview/llhudtext.cpp +++ b/indra/newview/llhudtext.cpp @@ -194,9 +194,6 @@ void LLHUDText::renderText()  	mRadius = (width_vec + height_vec).magVec() * 0.5f; -	LLCoordGL screen_pos; -	LLViewerCamera::getInstance()->projectPosAgentToScreen(mPositionAgent, screen_pos, FALSE); -  	LLVector2 screen_offset;  	screen_offset = mPositionOffset; diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index f5f59d5973..ce305dcd89 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -2107,7 +2107,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();  } @@ -2115,7 +2115,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();  } @@ -2123,20 +2123,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)  	{ @@ -2153,8 +2154,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)  			{ @@ -2218,10 +2219,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);  				} @@ -2238,7 +2239,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);  			}  		} @@ -2645,16 +2646,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 )  	{ @@ -2662,6 +2666,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 )  	{ @@ -2685,23 +2690,21 @@ 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)  	{ -		// is the inviter a friend? -		if (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL) +		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)) +			)  		{ -			// 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; -			} +			// silently decline the call +			LLIncomingCallDialog::processCallResponse(1, payload); +			return;  		}  	} diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 3f72d66bfb..e765a8da2f 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -542,6 +542,7 @@ public:  	static void onReject(void* user_data);  	static void onStartIM(void* user_data); +	static void processCallResponse(S32 response, const LLSD& payload);  private:  	void setCallerName(const std::string& ui_title,  		const std::string& ui_label, @@ -551,7 +552,6 @@ private:  		const std::string& call_type);  	/*virtual*/ void onLifetimeExpired(); -	void processCallResponse(S32 response);  };  class LLOutgoingCallDialog : public LLCallDialog 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 diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index 83a8134580..97de7d7ff9 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -186,6 +186,7 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia  	request_params["version"] = LLVersionInfo::getVersionAndChannel(); // Includes channel name  	request_params["channel"] = LLVersionInfo::getChannel();  	request_params["id0"] = mSerialNumber; +	request_params["host_id"] = gSavedSettings.getString("HostID");  	mRequestData.clear();  	mRequestData["method"] = "login_to_simulator"; 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; diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index d38bb5aa4a..ad1df3c0bb 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,10 +738,18 @@ 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; +	S32 x = 0; +	if (movement_btn) +	{ +		// Align centers of the button and the panel. +		x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2; +	} +	else +	{ +		x = tray->calcScreenRect().getCenterX() - getRect().getWidth()/2; +	}  	setOrigin(x, 0);  } 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/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; diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index d2ad78f140..f098183c4b 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -382,7 +382,10 @@ void LLNearbyChatScreenChannel::showToastsBottom()  		return;  	LLRect	toast_rect;	 -	S32		bottom = getRect().mBottom; +	updateBottom(); +	S32 channel_bottom = getRect().mBottom; + +	S32		bottom = channel_bottom;  	S32		margin = gSavedSettings.getS32("ToastGap");  	//sort active toasts @@ -514,6 +517,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") ) ) @@ -573,13 +584,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/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index cf567fb208..2e4be78be1 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); @@ -181,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"); @@ -761,7 +762,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/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)  		{ diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index c524fd7059..2c4be10a4d 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -348,8 +348,6 @@ BOOL LLPanelPlaces::postBuild()  void LLPanelPlaces::onOpen(const LLSD& key)  { -	LLFirstUse::notUsingDestinationGuide(false); -  	if (!mPlaceProfile || !mLandmarkInfo)  		return; diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index b04971f980..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  			{ @@ -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/llpopupview.cpp b/indra/newview/llpopupview.cpp index 499b6a8f5f..9fbb67a63a 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)); @@ -137,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/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/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) 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/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index 61f4897ed0..033faa004c 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_bottom = 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 @@ -511,6 +521,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) @@ -850,13 +862,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 a1fdd6e32c..38eb1cd86f 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; diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 2905e369f1..7d20365aa6 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -159,8 +159,6 @@ LLSideTrayTab::LLSideTrayTab(const Params& p)  	mDescription(p.description),  	mMainPanel(NULL)  { -	// Necessary for focus movement among child controls -	setFocusRoot(TRUE);  }  LLSideTrayTab::~LLSideTrayTab() @@ -914,7 +912,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/llstartup.cpp b/indra/newview/llstartup.cpp index 80cf7e3cd0..d945af0776 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -233,6 +233,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()); @@ -706,7 +708,15 @@ bool idle_startup()  	if (STATE_LOGIN_SHOW == LLStartUp::getStartupState())  	{  		LL_DEBUGS("AppInit") << "Initializing Window" << LL_ENDL; -		 + +		// 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(); +		} +  		gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW);  		timeout_count = 0; @@ -784,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. @@ -810,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())                                                                                   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 d992d808c7..562b9219b4 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -81,9 +81,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)  { @@ -211,12 +213,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 @@ -225,15 +243,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())  			{ @@ -393,7 +402,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) @@ -413,7 +422,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. @@ -423,10 +435,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: @@ -474,10 +489,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"); @@ -518,7 +539,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;  	} @@ -571,7 +592,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: @@ -1228,15 +1251,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);  } 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 diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp index c3dd17def9..983108391f 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  @@ -155,7 +157,7 @@ void LLTracker::drawHUDArrow()  // static   void LLTracker::render3D()  { -	if (!gFloaterWorldMap) +	if (!gFloaterWorldMap || !gSavedSettings.getBOOL("RenderTrackerBeacon"))  	{  		return;  	} diff --git a/indra/newview/lltransientfloatermgr.cpp b/indra/newview/lltransientfloatermgr.cpp index 6deab96b45..c648a6a28a 100644 --- a/indra/newview/lltransientfloatermgr.cpp +++ b/indra/newview/lltransientfloatermgr.cpp @@ -38,8 +38,8 @@ LLTransientFloaterMgr::LLTransientFloaterMgr()  {  	if(gViewerWindow)  	{ -		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*>())); diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index d7e15e7d6c..1aa9fd8a45 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,52 +556,50 @@ 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); -} - -LLViewerKeyboard::LLViewerKeyboard() : -	mNamedFunctionCount(0) +#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); +#undef REGISTER_KEYBOARD_ACTION + +LLViewerKeyboard::LLViewerKeyboard()  {  	for (S32 i = 0; i < MODE_COUNT; i++)  	{ @@ -613,16 +617,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") @@ -695,8 +689,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 @@ -719,13 +714,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) @@ -755,7 +748,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]) @@ -764,6 +756,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)  { @@ -912,18 +959,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 2fa5d5dfa6..925244e89b 100644 --- a/indra/newview/llviewerkeyboard.h +++ b/indra/newview/llviewerkeyboard.h @@ -55,26 +55,51 @@ 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); -	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];  	// Hold all the ugly stuff torn out to make LLKeyboard non-viewer-specific here  	S32				mBindingCount[MODE_COUNT]; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 03490034d8..e18b4ec414 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -45,7 +45,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" @@ -191,6 +191,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); @@ -841,6 +843,35 @@ class LLAdvancedCheckFeature : public view_listener_t  }  }; +void LLDestinationAndAvatarShow(const LLSD& value) +{ +	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"); + +	switch(panel_idx) +	{ +	case 0: +		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); +		destinations->setVisible(false); +		avatar_picker->setVisible(false); +		break; +	} +}; +  //////////////////  // INFO DISPLAY // @@ -4294,6 +4325,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); @@ -8046,6 +8104,7 @@ void initialize_menus()  	view_listener_t::addMenu(new LLAvatarVisibleDebug(), "Avatar.VisibleDebug");  	view_listener_t::addMenu(new LLAvatarInviteToGroup(), "Avatar.InviteToGroup");  	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)); @@ -8073,6 +8132,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)); @@ -8132,4 +8192,6 @@ void initialize_menus()  	view_listener_t::addMenu(new LLEditableSelectedMono(), "EditableSelectedMono");  	view_listener_t::addMenu(new LLToggleUIHints(), "ToggleUIHints"); + +	commit.add("DestinationAndAvatar.show", boost::bind(&LLDestinationAndAvatarShow, _2));  } diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 5cbd5ffa0b..b7f72a2e4c 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -3347,6 +3347,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); @@ -6686,6 +6688,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**); diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 11de377410..fccd1156d3 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. @@ -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) diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 6160510c0e..0c05a301e6 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1494,57 +1494,56 @@ void LLViewerFetchedTexture::setKnownDrawSize(S32 width, S32 height)  //virtual  void LLViewerFetchedTexture::processTextureStats()  { -	static LLCachedControl<bool> textures_fullres(gSavedSettings,"TextureLoadFullRes"); -  	if(mFullyLoaded) -	{ -		if(needsToSaveRawImage())//needs to reload +	{		 +		if(mDesiredDiscardLevel > mMinDesiredDiscardLevel)//need to load more  		{ +			mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ;  			mFullyLoaded = FALSE ;  		} -		else -		{ -			return ; -		} -	} - -	//updateVirtualSize() ;	 -	 -	if (textures_fullres) -	{ -		mDesiredDiscardLevel = 0; -	} -	else if(!mFullWidth || !mFullHeight) -	{ -		mDesiredDiscardLevel = 	llmin(getMaxDiscardLevel(), (S32)mLoadedCallbackDesiredDiscardLevel) ;  	}  	else -	{	 -		if(!mKnownDrawWidth || !mKnownDrawHeight || mFullWidth <= mKnownDrawWidth || mFullHeight <= mKnownDrawHeight) +	{ +		updateVirtualSize() ; +		 +		static LLCachedControl<bool> textures_fullres(gSavedSettings,"TextureLoadFullRes"); +		 +		if (textures_fullres)  		{ -			if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT) +			mDesiredDiscardLevel = 0; +		} +		else if(!mFullWidth || !mFullHeight) +		{ +			mDesiredDiscardLevel = 	llmin(getMaxDiscardLevel(), (S32)mLoadedCallbackDesiredDiscardLevel) ; +		} +		else +		{	 +			if(!mKnownDrawWidth || !mKnownDrawHeight || mFullWidth <= mKnownDrawWidth || mFullHeight <= mKnownDrawHeight)  			{ -				mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048 +				if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT) +				{ +					mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048 +				} +				else +				{ +					mDesiredDiscardLevel = 0; +				}  			} -			else +			else if(mKnownDrawSizeChanged)//known draw size is set +			{			 +				mDesiredDiscardLevel = (S8)llmin(log((F32)mFullWidth / mKnownDrawWidth) / log_2,  +													 log((F32)mFullHeight / mKnownDrawHeight) / log_2) ; +				mDesiredDiscardLevel = 	llclamp(mDesiredDiscardLevel, (S8)0, (S8)getMaxDiscardLevel()) ; +				mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ; +			} +			mKnownDrawSizeChanged = FALSE ; +		 +			if(getDiscardLevel() >= 0 && (getDiscardLevel() <= mDesiredDiscardLevel))  			{ -				mDesiredDiscardLevel = 0; +				mFullyLoaded = TRUE ;  			}  		} -		else if(mKnownDrawSizeChanged)//known draw size is set -		{			 -			mDesiredDiscardLevel = (S8)llmin(log((F32)mFullWidth / mKnownDrawWidth) / log_2,  -												 log((F32)mFullHeight / mKnownDrawHeight) / log_2) ; -			mDesiredDiscardLevel = 	llclamp(mDesiredDiscardLevel, (S8)0, (S8)getMaxDiscardLevel()) ; -			mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ; -		} -		mKnownDrawSizeChanged = FALSE ; -	 -		if(getDiscardLevel() >= 0 && (getDiscardLevel() <= mDesiredDiscardLevel)) -		{ -			mFullyLoaded = TRUE ; -		} -	}	 +	}  	if(mForceToSaveRawImage && mDesiredSavedRawDiscardLevel >= 0) //force to refetch the texture.  	{ diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 275dfaa996..10126219f8 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -1531,42 +1531,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, @@ -1576,19 +1579,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")) diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index a7790243ed..c812fcf2da 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1367,6 +1367,15 @@ LLViewerWindow::LLViewerWindow(  		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)  	{ @@ -1378,7 +1387,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 @@ -1545,8 +1554,9 @@ 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(); +	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"); @@ -1680,7 +1690,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();  		} @@ -1709,6 +1719,20 @@ void LLViewerWindow::initWorldUI()  	buttons_panel->setShape(buttons_panel_container->getLocalRect());  	buttons_panel->setFollowsAll();  	buttons_panel_container->addChild(buttons_panel); + +	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"), "text/html"); +	} + +	if (avatar_picker) +	{ +		avatar_picker->navigateTo(gSavedSettings.getString("AvatarPickerURL"), "text/html"); +	} +  }  // Destroy the UI @@ -2480,6 +2504,10 @@ void LLViewerWindow::updateUI()  		{  			LLFirstUse::notUsingDestinationGuide();  		} +		if (gLoggedInTime.getElapsedTimeF32() > gSavedSettings.getF32("AvatarPickerHintTimeout")) +		{ +			LLFirstUse::notUsingAvatarPicker(); +		}  		if (gLoggedInTime.getElapsedTimeF32() > gSavedSettings.getF32("SidePanelHintTimeout"))  		{  			LLFirstUse::notUsingSidePanel(); @@ -2975,18 +3003,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(); @@ -2995,7 +3025,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);  			} @@ -4281,17 +4311,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]); diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 47fb7c4883..b8fd944321 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); @@ -447,6 +448,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/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 7ae1f672e8..75fd9934c0 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2333,8 +2333,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 )  	{		  		//---------------------------------------------------------------- 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 019629084f..08e242af8e 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -46,7 +46,6 @@  #include "llviewernetwork.h"		// for gGridChoice  #include "llbase64.h"  #include "llviewercontrol.h" -#include "llkeyboard.h"  #include "llappviewer.h"	// for gDisconnected, gDisableVoice  // Viewer includes @@ -326,14 +325,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), @@ -435,10 +428,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"); @@ -950,7 +939,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; @@ -1535,7 +1524,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; @@ -1576,35 +1565,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. @@ -1626,7 +1586,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(); @@ -2749,19 +2709,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";  	} @@ -5238,40 +5196,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) @@ -5320,48 +5251,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)  { @@ -5402,44 +5291,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) @@ -7015,8 +6866,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());  	} @@ -7030,7 +6881,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 3ba517bf36..471545de56 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; 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)); diff --git a/indra/newview/res/toolbuy.cur b/indra/newview/res/toolbuy.curBinary files differ index a1bc278116..65bbf01d45 100644 --- a/indra/newview/res/toolbuy.cur +++ b/indra/newview/res/toolbuy.cur diff --git a/indra/newview/res/toolopen.cur b/indra/newview/res/toolopen.curBinary files differ index a72cdfe4c0..22ecbd5228 100644 --- a/indra/newview/res/toolopen.cur +++ b/indra/newview/res/toolopen.cur diff --git a/indra/newview/res/toolsit.cur b/indra/newview/res/toolsit.curBinary files differ index 6327bdb281..d26b6f8638 100644 --- a/indra/newview/res/toolsit.cur +++ b/indra/newview/res/toolsit.cur diff --git a/indra/newview/skins/default/textures/arrow_keys.png b/indra/newview/skins/default/textures/arrow_keys.pngBinary files differ new file mode 100644 index 0000000000..f19af59251 --- /dev/null +++ b/indra/newview/skins/default/textures/arrow_keys.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index b2658d2525..a51a096482 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -371,8 +371,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.pngBinary files differ index edf11ac1f5..3f0e4eba28 100644 --- a/indra/newview/skins/default/textures/widgets/ProgressBar.png +++ b/indra/newview/skins/default/textures/widgets/ProgressBar.png diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index 520a604bde..d9991fcae9 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" @@ -120,7 +126,7 @@                        user_resize="false"                        visible="false"                        width="333"/> -      </layout_stack> +      </layout_stack>              <panel follows="all"                      height="500"                      left="0" 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..d32066a5a5 --- /dev/null +++ b/indra/newview/skins/default/xui/en/notification_visibility.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" ?> +<notification_visibility> +  <hide name="HintMoveArrows"/> +	<show/>  +</notification_visibility> + diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 60b876d163..c1fad9050b 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" @@ -1604,6 +1605,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 @@ -1616,42 +1618,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 @@ -2070,7 +2079,7 @@ Would you be my friend?        <button         default="true"         index="0" -       name="Offer" +       name="OK"         text="OK"/>        <button         index="1" @@ -2092,7 +2101,7 @@ Would you be my friend?        <button         default="true"         index="0" -       name="Offer" +       name="OK"         text="OK"/>        <button         index="1" @@ -2115,7 +2124,7 @@ Would you be my friend?        <button         default="true"         index="0" -       name="Offer" +       name="OK"         text="OK"/>        <button         index="1" @@ -2419,6 +2428,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> @@ -2427,6 +2437,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> @@ -2435,6 +2446,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. @@ -2444,6 +2456,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"> @@ -2471,6 +2484,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. @@ -3138,6 +3152,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"> @@ -3159,6 +3174,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"> @@ -3180,6 +3196,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"> @@ -3201,6 +3218,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"> @@ -3572,6 +3590,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. @@ -3584,6 +3603,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? @@ -3601,6 +3621,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> @@ -3608,6 +3629,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. @@ -4524,6 +4546,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] @@ -4907,24 +4930,6 @@ Please select at least one type of content to search (General, Moderate, or Adul    <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"     persist="true"     type="notify"> @@ -5093,6 +5098,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> @@ -5145,6 +5151,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. @@ -5163,6 +5170,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. @@ -5173,6 +5181,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> @@ -5181,6 +5190,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> @@ -5189,6 +5199,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> @@ -5197,6 +5208,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> @@ -5205,6 +5217,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> @@ -5213,6 +5226,7 @@ You must be age-verified to enter this parcel.  	name="NoDestRegion"     persist="true"  	type="notify"> +   <tag>fail</tag>  No destination region found.    </notification> @@ -5221,6 +5235,7 @@ No destination region found.  	name="NotAllowedInDest"     persist="true"  	type="notify"> +   <tag>fail</tag>  You are not allowed into the destination.    </notification> @@ -5229,6 +5244,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> @@ -5237,6 +5253,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> @@ -5245,6 +5262,7 @@ You have been redirected to a telehub.  	name="CouldntTPCloser"     persist="true"  	type="notify"> +   <tag>fail</tag>  Could not teleport closer to destination.    </notification> @@ -5261,6 +5279,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> @@ -5270,6 +5289,7 @@ Please try again in a few moments.  	name="GeneralFailure"     persist="true"  	type="notify"> +   <tag>fail</tag>  General failure.    </notification> @@ -5278,6 +5298,7 @@ General failure.  	name="RoutedWrongRegion"     persist="true"  	type="notify"> +   <tag>fail</tag>  Routed to wrong region. Please try again.    </notification> @@ -5286,6 +5307,7 @@ Routed to wrong region. Please try again.  	name="NoValidAgentID"     persist="true"  	type="notify"> +   <tag>fail</tag>  No valid agent id.    </notification> @@ -5294,6 +5316,7 @@ No valid agent id.  	name="NoValidSession"     persist="true"  	type="notify"> +   <tag>fail</tag>  No valid session id.    </notification> @@ -5302,6 +5325,7 @@ No valid session id.  	name="NoValidCircuit"     persist="true"  	type="notify"> +   <tag>fail</tag>  No valid circuit code.    </notification> @@ -5310,6 +5334,7 @@ No valid circuit code.  	name="NoValidTimestamp"     persist="true"  	type="notify"> +   <tag>fail</tag>  No valid timestamp.    </notification> @@ -5318,6 +5343,7 @@ No valid timestamp.  	name="NoPendingConnection"     persist="true"  	type="notify"> +   <tag>fail</tag>  Unable to create pending connection.    </notification> @@ -5326,6 +5352,7 @@ Unable to create pending connection.  	name="InternalUsherError"     persist="true"  	type="notify"> +   <tag>fail</tag>  Internal error attempting to connect agent usher.    </notification> @@ -5334,6 +5361,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> @@ -5342,6 +5370,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> @@ -5350,6 +5379,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> @@ -5358,6 +5388,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> @@ -5734,6 +5765,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> @@ -6153,6 +6185,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> @@ -6160,6 +6193,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> @@ -6167,6 +6201,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> @@ -6212,6 +6247,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> @@ -6411,13 +6447,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 @@ -6430,13 +6462,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 @@ -6518,6 +6546,14 @@ Mute everyone?    </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"      type="hint" @@ -6542,6 +6578,22 @@ Mute everyone?    </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. Reset your view by pressing Escape or walking. +  </notification> + +  <notification    name="HintInventory"    label="Inventory"    type="hint" 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_hint_image.xml b/indra/newview/skins/default/xui/en/panel_hint_image.xml new file mode 100644 index 0000000000..00b6e42497 --- /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="140" + 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="120" +        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> diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index b181ca3bba..e37895fbba 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/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" 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" +  /> | 
