From d7a2ddc0c065847c91ae593f9987ad32bf13a74e Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Thu, 5 Nov 2009 13:51:26 -0800
Subject: [PATCH] EXT-2262 Arrow keys should move cursor in chat entry field.
 See Communications Spec for design.  Arrow keys still move you if text chat
 field is empty.  Also fixed ctrl-up/ctrl-down for recently chatted lines.
 Reviewed with Richard.

---
 indra/newview/app_settings/settings.xml       |  4 +-
 indra/newview/llviewerwindow.cpp              | 39 +++++++++----------
 .../xui/en/panel_preferences_advanced.xml     |  2 +-
 3 files changed, 22 insertions(+), 23 deletions(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 7254fff664a..02fd05458b6 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -133,7 +133,7 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
-    <key>ArrowKeysMoveAvatar</key>
+    <key>ArrowKeysAlwaysMove</key>
     <map>
       <key>Comment</key>
       <string>While cursor is in chat entry box, arrow keys still control your avatar</string>
@@ -142,7 +142,7 @@
       <key>Type</key>
       <string>Boolean</string>
       <key>Value</key>
-      <integer>1</integer>
+      <integer>0</integer>
     </map>
     <key>AskedAboutCrashReports</key>
     <map>
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index b574a9c110d..765f4e4476c 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -2113,31 +2113,30 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
 		// arrow keys move avatar while chatting hack
 		if (chat_editor && chat_editor->hasFocus())
 		{
-			if (chat_editor->getText().empty() || gSavedSettings.getBOOL("ArrowKeysMoveAvatar"))
+			// let Control-Up and Control-Down through for chat line history
+			if (!(key == KEY_UP && mask == MASK_CONTROL)
+				&& !(key == KEY_DOWN && mask == MASK_CONTROL))
 			{
-				switch(key)
+				// If text field is empty, there's no point in trying to move
+				// cursor with arrow keys, so allow movement
+				if (chat_editor->getText().empty() 
+					|| gSavedSettings.getBOOL("ArrowKeysAlwaysMove"))
 				{
-				case KEY_LEFT:
-				case KEY_RIGHT:
-				case KEY_UP:
-					// let CTRL UP through for chat line history
-					if( MASK_CONTROL == mask )
+					switch(key)
 					{
+					case KEY_LEFT:
+					case KEY_RIGHT:
+					case KEY_UP:
+					case KEY_DOWN:
+					case KEY_PAGE_UP:
+					case KEY_PAGE_DOWN:
+					case KEY_HOME:
+						// when chatbar is empty or ArrowKeysAlwaysMove set,
+						// pass arrow keys on to avatar...
+						return FALSE;
+					default:
 						break;
 					}
-				case KEY_DOWN:
-					// let CTRL DOWN through for chat line history
-					if( MASK_CONTROL == mask )
-					{
-						break;
-					}
-				case KEY_PAGE_UP:
-				case KEY_PAGE_DOWN:
-				case KEY_HOME:
-					// when chatbar is empty or ArrowKeysMoveAvatar set, pass arrow keys on to avatar...
-					return FALSE;
-				default:
-					break;
 				}
 			}
 		}
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index f98f3a08503..613decad8d3 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -212,7 +212,7 @@ Avatars:
      width="256"
      top_pad="0"/>
     <check_box
-     control_name="ArrowKeysMoveAvatar"
+     control_name="ArrowKeysAlwaysMove"
      follows="left|top"
      height="20"
      label="Arrow keys always move me"
-- 
GitLab