Skip to content
Snippets Groups Projects
Commit 936a1e36 authored by Steven Bennetts's avatar Steven Bennetts
Browse files

merge -r 129526 skinning-19 -> viewer-2.0.0-3

Cherry pick a fix to enable IM windows.
parent 85f94009
No related branches found
No related tags found
No related merge requests found
...@@ -98,8 +98,6 @@ void LLFocusMgr::setKeyboardFocus(LLUICtrl* new_focus, BOOL lock, BOOL keystroke ...@@ -98,8 +98,6 @@ void LLFocusMgr::setKeyboardFocus(LLUICtrl* new_focus, BOOL lock, BOOL keystroke
return; return;
} }
//llinfos << "Keyboard focus handled by " << (new_focus ? new_focus->getName() : "nothing") << llendl;
mKeystrokesOnly = keystrokes_only; mKeystrokesOnly = keystrokes_only;
if( new_focus != mKeyboardFocus ) if( new_focus != mKeyboardFocus )
...@@ -107,17 +105,47 @@ void LLFocusMgr::setKeyboardFocus(LLUICtrl* new_focus, BOOL lock, BOOL keystroke ...@@ -107,17 +105,47 @@ void LLFocusMgr::setKeyboardFocus(LLUICtrl* new_focus, BOOL lock, BOOL keystroke
mLastKeyboardFocus = mKeyboardFocus; mLastKeyboardFocus = mKeyboardFocus;
mKeyboardFocus = new_focus; mKeyboardFocus = new_focus;
if( mLastKeyboardFocus ) view_handle_list_t new_focus_list;
// walk up the tree to root and add all views to the new_focus_list
for (LLView* ctrl = mKeyboardFocus; ctrl && ctrl != LLUI::getRootView(); ctrl = ctrl->getParent())
{ {
mLastKeyboardFocus->onFocusLost(); if (ctrl)
{
new_focus_list.push_front(ctrl->getHandle());
}
} }
// clear out any existing flash view_handle_list_t::iterator new_focus_iter = new_focus_list.begin();
if (new_focus) view_handle_list_t::iterator old_focus_iter = mCachedKeyboardFocusList.begin();
// compare the new focus sub-tree to the old focus sub-tree
// iterate through the lists in lockstep until we get to a non-common ancestor
while ((new_focus_iter != new_focus_list.end()) &&
(old_focus_iter != mCachedKeyboardFocusList.end()) &&
((*new_focus_iter) == (*old_focus_iter)))
{ {
mFocusWeight = 0.f; new_focus_iter++;
new_focus->onFocusReceived(); old_focus_iter++;
} }
// call onFocusLost on all remaining in the old focus list
while (old_focus_iter != mCachedKeyboardFocusList.end())
{
old_focus_iter->get()->onFocusLost();
old_focus_iter++;
}
// call onFocusReceived on all remaining in the new focus list
while (new_focus_iter != new_focus_list.end())
{
new_focus_iter->get()->onFocusReceived();
new_focus_iter++;
}
// cache the new focus list for next time
swap(mCachedKeyboardFocusList, new_focus_list);
mFocusTimer.reset(); mFocusTimer.reset();
#ifdef _DEBUG #ifdef _DEBUG
......
...@@ -102,6 +102,10 @@ class LLFocusMgr ...@@ -102,6 +102,10 @@ class LLFocusMgr
LLUICtrl* mLastKeyboardFocus; // who last had focus LLUICtrl* mLastKeyboardFocus; // who last had focus
LLUICtrl* mDefaultKeyboardFocus; LLUICtrl* mDefaultKeyboardFocus;
BOOL mKeystrokesOnly; BOOL mKeystrokesOnly;
// caching list of keyboard focus ancestors for calling onFocusReceived and onFocusLost
typedef std::list<LLHandle<LLView> > view_handle_list_t;
view_handle_list_t mCachedKeyboardFocusList;
// Top View // Top View
LLUICtrl* mTopCtrl; LLUICtrl* mTopCtrl;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment