зеркало из https://github.com/mozilla/gecko-dev.git
More hacks..errr...tricks to speed up XP menus.
This commit is contained in:
Родитель
2140346ebb
Коммит
bd9b9bc524
|
@ -359,6 +359,9 @@ NS_IMETHODIMP nsMenuBarFrame::SetCurrentMenuItem(nsIFrame* aMenuItem)
|
||||||
if (aMenuItem) {
|
if (aMenuItem) {
|
||||||
nsMenuFrame* newFrame = (nsMenuFrame*)aMenuItem;
|
nsMenuFrame* newFrame = (nsMenuFrame*)aMenuItem;
|
||||||
newFrame->SelectMenu(PR_TRUE);
|
newFrame->SelectMenu(PR_TRUE);
|
||||||
|
|
||||||
|
newFrame->MarkAsGenerated(); // Have the menu building. Get it ready to be shown.
|
||||||
|
|
||||||
if (wasOpen)
|
if (wasOpen)
|
||||||
newFrame->OpenMenu(PR_TRUE);
|
newFrame->OpenMenu(PR_TRUE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -285,9 +285,9 @@ nsMenuFrame::HandleEvent(nsIPresContext& aPresContext,
|
||||||
// If we're a menu (and not a menu item),
|
// If we're a menu (and not a menu item),
|
||||||
// kick off the timer.
|
// kick off the timer.
|
||||||
if (!isMenuBar && IsMenu() && !mMenuOpen && !mOpenTimer) {
|
if (!isMenuBar && IsMenu() && !mMenuOpen && !mOpenTimer) {
|
||||||
// We're a menu, we're closed, and no timer has been kicked off.
|
// We're a menu, we're built, we're closed, and no timer has been kicked off.
|
||||||
NS_NewTimer(getter_AddRefs(mOpenTimer));
|
NS_NewTimer(getter_AddRefs(mOpenTimer));
|
||||||
mOpenTimer->Init(this, 125); // 125 ms delay
|
mOpenTimer->Init(this, 250); // 250 ms delay
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
@ -317,14 +317,27 @@ nsMenuFrame::SelectMenu(PRBool aActivateFlag)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
PRBool nsMenuFrame::IsGenerated()
|
||||||
nsMenuFrame::OpenMenu(PRBool aActivateFlag)
|
|
||||||
{
|
{
|
||||||
gEatMouseMove = PR_TRUE;
|
nsCOMPtr<nsIContent> child;
|
||||||
|
GetMenuChildrenElement(getter_AddRefs(child));
|
||||||
|
|
||||||
|
// Generate the menu if it hasn't been generated already. This
|
||||||
|
// takes it from display: none to display: block and gives us
|
||||||
|
// a menu forevermore.
|
||||||
|
if (child) {
|
||||||
|
nsCOMPtr<nsIAtom> generated = dont_AddRef(NS_NewAtom("menugenerated"));
|
||||||
|
nsString genVal;
|
||||||
|
child->GetAttribute(kNameSpaceID_None, generated, genVal);
|
||||||
|
if (genVal == "")
|
||||||
|
return PR_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if (!mIsMenu)
|
return PR_TRUE;
|
||||||
return;
|
}
|
||||||
|
|
||||||
|
void nsMenuFrame::MarkAsGenerated()
|
||||||
|
{
|
||||||
nsCOMPtr<nsIContent> child;
|
nsCOMPtr<nsIContent> child;
|
||||||
GetMenuChildrenElement(getter_AddRefs(child));
|
GetMenuChildrenElement(getter_AddRefs(child));
|
||||||
|
|
||||||
|
@ -338,10 +351,24 @@ nsMenuFrame::OpenMenu(PRBool aActivateFlag)
|
||||||
if (genVal == "")
|
if (genVal == "")
|
||||||
child->SetAttribute(kNameSpaceID_None, generated, "true", PR_TRUE);
|
child->SetAttribute(kNameSpaceID_None, generated, "true", PR_TRUE);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsMenuFrame::OpenMenu(PRBool aActivateFlag)
|
||||||
|
{
|
||||||
|
gEatMouseMove = PR_TRUE;
|
||||||
|
|
||||||
|
if (!mIsMenu)
|
||||||
|
return;
|
||||||
|
|
||||||
|
MarkAsGenerated();
|
||||||
|
|
||||||
nsIFrame* frame = mPopupFrames.FirstChild();
|
nsIFrame* frame = mPopupFrames.FirstChild();
|
||||||
nsMenuPopupFrame* menuPopup = (nsMenuPopupFrame*)frame;
|
nsMenuPopupFrame* menuPopup = (nsMenuPopupFrame*)frame;
|
||||||
|
|
||||||
|
nsCOMPtr<nsIContent> child;
|
||||||
|
GetMenuChildrenElement(getter_AddRefs(child));
|
||||||
|
|
||||||
if (aActivateFlag) {
|
if (aActivateFlag) {
|
||||||
// Execute the oncreate handler
|
// Execute the oncreate handler
|
||||||
if (!OnCreate())
|
if (!OnCreate())
|
||||||
|
|
|
@ -127,6 +127,9 @@ public:
|
||||||
|
|
||||||
PRBool IsDisabled();
|
PRBool IsDisabled();
|
||||||
|
|
||||||
|
void MarkAsGenerated();
|
||||||
|
PRBool IsGenerated();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void GetMenuChildrenElement(nsIContent** aResult);
|
void GetMenuChildrenElement(nsIContent** aResult);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче