diff --git a/indra/llui/llfocusmgr.cpp b/indra/llui/llfocusmgr.cpp index 1f16d12adda1e5eb177439df6dd615e87fd5fb30..7fbfd80d8da65665cdf294d0bad93e6986a8a2e0 100644 --- a/indra/llui/llfocusmgr.cpp +++ b/indra/llui/llfocusmgr.cpp @@ -315,6 +315,20 @@ void LLFocusMgr::removeKeyboardFocusWithoutCallback( const LLFocusableElement* f } } +bool LLFocusMgr::keyboardFocusHasMenus() const +{ + LLView* focus_view = dynamic_cast<LLView*>(mKeyboardFocus); + while( focus_view ) + { + if(focus_view->hasMenus()) + { + return true; + } + + focus_view = focus_view->getParent(); + } + return false; +} void LLFocusMgr::setMouseCapture( LLMouseHandler* new_captor ) { diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h index eef82a3b5ab4bc706eebf7c3b7a5a56b21404a11..e09bad0187d6bef170f551ee61f7cec5515bf533 100644 --- a/indra/llui/llfocusmgr.h +++ b/indra/llui/llfocusmgr.h @@ -118,6 +118,8 @@ class LLFocusMgr void unlockFocus(); BOOL focusLocked() const { return mLockedView != NULL; } + bool keyboardFocusHasMenus() const; + private: LLUICtrl* mLockedView; diff --git a/indra/llui/llview.h b/indra/llui/llview.h index f7175112bff5805219bf047f7ceedc8796adb251..62683491efbd3bae7eeeab5db9081cb212db00e2 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -277,6 +277,11 @@ class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElem BOOL focusNextRoot(); BOOL focusPrevRoot(); + // Normally we want the app menus to get priority on modified keys + // However, if this item claims to have menus then we want to give + // it first chance at handling them. (eg. the script editor) + virtual bool hasMenus() const { return false; }; + // delete all children. Override this function if you need to // perform any extra clean up such as cached pointers to selected // children, etc. diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index ef4f0d9c2041913270b1eaf03143233052b9f5c4..3207da4e00fc2f2e2c68551779537ecc8f1b27d4 100644 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -87,6 +87,8 @@ class LLScriptEdCore : public LLPanel static void onBtnInsertSample(void*); static void onBtnInsertFunction(LLUICtrl*, void*); + virtual bool hasMenus() const { return true; } + private: void onBtnHelp(); void onBtnDynamicHelp(); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 0a3a8993eca187e88be6316fcb31e0bb1caf6982..5a069547e4f0d4382baa045b621ef817478e8687 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2134,10 +2134,20 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) return TRUE; } + LLFocusableElement* keyboard_focus = gFocusMgr.getKeyboardFocus(); + // give menus a chance to handle modified (Ctrl, Alt) shortcut keys before current focus // as long as focus isn't locked if (mask & (MASK_CONTROL | MASK_ALT) && !gFocusMgr.focusLocked()) { + // Check the current floater's menu first, if it has one. + if (gFocusMgr.keyboardFocusHasMenus() + && keyboard_focus + && keyboard_focus->handleKey(key,mask,FALSE)) + { + return TRUE; + } + if ((gMenuBarView && gMenuBarView->handleAcceleratorKey(key, mask)) ||(gLoginMenuBarView && gLoginMenuBarView->handleAcceleratorKey(key, mask))) { @@ -2173,7 +2183,6 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) } // Traverses up the hierarchy - LLFocusableElement* keyboard_focus = gFocusMgr.getKeyboardFocus(); if( keyboard_focus ) { LLLineEditor* chat_editor = LLBottomTray::instanceExists() ? LLBottomTray::getInstance()->getNearbyChatBar()->getChatBox() : NULL;