Bug 488771. Stop nsIRollUpListener from inheriting from nsISupports. r=roc

--HG--
extra : rebase_source : 0af5c537b7be03c1407f4b658ba7802081ad3f01
This commit is contained in:
Timothy Nikkel 2009-12-22 17:49:33 -06:00
parent 5b9995e714
commit 3f8f793c9e
24 changed files with 124 additions and 87 deletions

View File

@ -300,20 +300,6 @@ NS_QUERYFRAME_HEAD(nsComboboxControlFrame)
NS_QUERYFRAME_ENTRY(nsIScrollableViewProvider)
NS_QUERYFRAME_TAIL_INHERITING(nsBlockFrame)
NS_IMPL_QUERY_INTERFACE1(nsComboboxControlFrame, nsIRollupListener)
NS_IMETHODIMP_(nsrefcnt)
nsComboboxControlFrame::AddRef()
{
return 2;
}
NS_IMETHODIMP_(nsrefcnt)
nsComboboxControlFrame::Release()
{
return 1;
}
#ifdef ACCESSIBILITY
NS_IMETHODIMP nsComboboxControlFrame::GetAccessible(nsIAccessible** aAccessible)
{
@ -427,7 +413,7 @@ nsComboboxControlFrame::ShowList(PRBool aShowList)
if (view) {
nsIWidget* widget = view->GetWidget();
if (widget)
widget->CaptureRollupEvents(this, mDroppedDown, mDroppedDown);
widget->CaptureRollupEvents(this, nsnull, mDroppedDown, mDroppedDown);
}
}
@ -1226,7 +1212,7 @@ nsComboboxControlFrame::DestroyFrom(nsIFrame* aDestructRoot)
if (view) {
nsIWidget* widget = view->GetWidget();
if (widget)
widget->CaptureRollupEvents(this, PR_FALSE, PR_TRUE);
widget->CaptureRollupEvents(this, nsnull, PR_FALSE, PR_TRUE);
}
}
}

View File

@ -98,7 +98,6 @@ public:
NS_DECL_QUERYFRAME
NS_DECL_FRAMEARENA_HELPERS
NS_DECL_ISUPPORTS_INHERITED
// nsIAnonymousContentCreator
virtual nsresult CreateAnonymousContent(nsTArray<nsIContent*>& aElements);

View File

@ -310,9 +310,13 @@ public:
friend class nsXULMenuCommandEvent;
NS_DECL_ISUPPORTS
NS_DECL_NSIROLLUPLISTENER
NS_DECL_NSITIMERCALLBACK
// nsIRollupListener
NS_IMETHOD Rollup(PRUint32 aCount, nsIContent **aContent);
NS_IMETHOD ShouldRollupOnMouseWheelEvent(PRBool *aShould);
NS_IMETHOD ShouldRollupOnMouseActivate(PRBool *aShould);
virtual PRUint32 GetSubmenuWidgetChain(nsTArray<nsIWidget*> *aWidgetChain);
virtual void AdjustPopupsOnWindowChange(void);

View File

@ -127,11 +127,10 @@ void nsMenuChainItem::Detach(nsMenuChainItem** aRoot)
}
}
NS_IMPL_ISUPPORTS5(nsXULPopupManager,
NS_IMPL_ISUPPORTS4(nsXULPopupManager,
nsIDOMKeyListener,
nsIDOMEventListener,
nsIMenuRollup,
nsIRollupListener,
nsITimerCallback)
nsXULPopupManager::nsXULPopupManager() :
@ -1391,7 +1390,7 @@ nsXULPopupManager::SetCaptureState(nsIContent* aOldPopup)
return;
if (mWidget) {
mWidget->CaptureRollupEvents(this, PR_FALSE, PR_FALSE);
mWidget->CaptureRollupEvents(this, this, PR_FALSE, PR_FALSE);
mWidget = nsnull;
}
@ -1400,7 +1399,8 @@ nsXULPopupManager::SetCaptureState(nsIContent* aOldPopup)
nsCOMPtr<nsIWidget> widget;
popup->GetWidget(getter_AddRefs(widget));
if (widget) {
widget->CaptureRollupEvents(this, PR_TRUE, popup->ConsumeOutsideClicks());
widget->CaptureRollupEvents(this, this, PR_TRUE,
popup->ConsumeOutsideClicks());
mWidget = widget;
popup->AttachedDismissalListener();
}

View File

@ -58,6 +58,7 @@ EXPORTS = \
nsINativeKeyBindings.h \
nsIDeviceContextSpec.h \
nsIMenuRollup.h \
nsIRollupListener.h \
$(NULL)
ifeq ($(MOZ_WIDGET_TOOLKIT),cocoa)
@ -97,7 +98,6 @@ XPIDLSRCS = \
nsIClipboard.idl \
nsIClipboardHelper.idl \
nsIClipboardOwner.idl \
nsIRollupListener.idl \
nsIBaseWindow.idl \
nsIBidiKeyboard.idl \
nsIScreen.idl \

View File

@ -39,34 +39,33 @@
*
* ***** END LICENSE BLOCK ***** */
#include "nsISupports.idl"
#ifndef __nsIRollupListener_h__
#define __nsIRollupListener_h__
interface nsIContent;
class nsIContent;
class nsIRollupListener {
public:
[uuid(0CA103E5-80D4-4B81-A310-BE0708F8EAA9)]
interface nsIRollupListener : nsISupports
{
/**
* Notifies the object to rollup, optionally returning the node that
* was just rolled up.
*
* aCount is the number of popups in a chain to close. If this is
* PR_UINT32_MAX, then all popups are closed.
*
* @result NS_Ok if no errors
*/
nsIContent Rollup(in unsigned long aCount);
NS_IMETHOD Rollup(PRUint32 aCount, nsIContent **aContent) = 0;
/**
* Asks the RollupListener if it should rollup on mousevents
* @result NS_Ok if no errors
*/
void ShouldRollupOnMouseWheelEvent(out PRBool aShould);
NS_IMETHOD ShouldRollupOnMouseWheelEvent(PRBool *aShould) = 0;
/**
* Asks the RollupListener if it should rollup on mouse activate, eg. X-Mouse
* @result NS_Ok if no errors
*/
void ShouldRollupOnMouseActivate(out PRBool aShould);
NS_IMETHOD ShouldRollupOnMouseActivate(PRBool *aShould) = 0;
};
#endif /* __nsIRollupListener_h__ */

View File

@ -60,6 +60,7 @@ class nsIRenderingContext;
class nsIDeviceContext;
struct nsFont;
class nsIRollupListener;
class nsIMenuRollup;
class nsGUIEvent;
class imgIContainer;
class gfxASurface;
@ -767,7 +768,8 @@ class nsIWidget : public nsISupports {
* @param aConsumeRollupEvent PR_TRUE consumes the rollup event, PR_FALSE dispatches rollup event
*
*/
NS_IMETHOD CaptureRollupEvents(nsIRollupListener * aListener, PRBool aDoCapture, PRBool aConsumeRollupEvent) = 0;
NS_IMETHOD CaptureRollupEvents(nsIRollupListener * aListener, nsIMenuRollup * aMenuRollup,
PRBool aDoCapture, PRBool aConsumeRollupEvent) = 0;
/**
* Bring this window to the user's attention. This is intended to be a more

View File

@ -92,6 +92,7 @@ static NS_DEFINE_IID(kCDragServiceCID, NS_DRAGSERVICE_CID);
// Rollup Listener - static variable defintions
static nsIRollupListener * gRollupListener = nsnull;
static nsIMenuRollup * gMenuRollup = nsnull;
static nsIWidget * gRollupWidget = nsnull;
static PRBool gRollupConsumeRollupEvent = PR_FALSE;
// Tracking last activated BWindow
@ -712,7 +713,10 @@ NS_METHOD nsWindow::CaptureMouse(PRBool aCapture)
//-------------------------------------------------------------------------
// Capture Roolup Events
//-------------------------------------------------------------------------
NS_METHOD nsWindow::CaptureRollupEvents(nsIRollupListener * aListener, PRBool aDoCapture, PRBool aConsumeRollupEvent)
NS_METHOD nsWindow::CaptureRollupEvents(nsIRollupListener * aListener,
nsIMenuRollup * aMenuRollup,
PRBool aDoCapture,
PRBool aConsumeRollupEvent)
{
if (!mEnabled)
return NS_OK;
@ -724,16 +728,18 @@ NS_METHOD nsWindow::CaptureRollupEvents(nsIRollupListener * aListener, PRBool aD
// assure that remains true.
NS_ASSERTION(!gRollupWidget, "rollup widget reassigned before release");
gRollupConsumeRollupEvent = aConsumeRollupEvent;
NS_IF_RELEASE(gRollupListener);
NS_IF_RELEASE(gRollupWidget);
gRollupListener = aListener;
NS_ADDREF(aListener);
NS_IF_RELEASE(gMenuRollup);
gMenuRollup = aMenuRollup;
NS_IF_ADDREF(aMenuRollup);
gRollupWidget = this;
NS_ADDREF(this);
}
else
{
NS_IF_RELEASE(gRollupListener);
gRollupListener == nsnull;
NS_IF_RELEASE(gMenuRollup);
NS_IF_RELEASE(gRollupWidget);
}
@ -783,11 +789,10 @@ nsWindow::DealWithPopups(uint32 methodID, nsPoint pos)
// want to rollup if the click is in a parent menu of the current submenu.
if (rollup)
{
nsCOMPtr<nsIMenuRollup> menuRollup ( do_QueryInterface(gRollupListener) );
if ( menuRollup )
if ( gMenuRollup )
{
nsAutoTArray<nsIWidget*, 5> widgetChain;
menuRollup->GetSubmenuWidgetChain(&widgetChain);
gMenuRollup->GetSubmenuWidgetChain(&widgetChain);
for ( PRUint32 i = 0; i < widgetChain.Length(); ++i )
{

View File

@ -109,6 +109,7 @@ public:
NS_IMETHOD Show(PRBool bState);
NS_IMETHOD CaptureMouse(PRBool aCapture);
NS_IMETHOD CaptureRollupEvents(nsIRollupListener *aListener,
nsIMenuRollup *aMenuRollup,
PRBool aDoCapture,
PRBool aConsumeRollupEvent);
NS_IMETHOD IsVisible(PRBool & aState);

View File

@ -360,7 +360,8 @@ public:
NS_IMETHOD SetCursor(nsCursor aCursor);
NS_IMETHOD SetCursor(imgIContainer* aCursor, PRUint32 aHotspotX, PRUint32 aHotspotY);
NS_IMETHOD CaptureRollupEvents(nsIRollupListener * aListener, PRBool aDoCapture, PRBool aConsumeRollupEvent);
NS_IMETHOD CaptureRollupEvents(nsIRollupListener * aListener, nsIMenuRollup * aMenuRollup,
PRBool aDoCapture, PRBool aConsumeRollupEvent);
NS_IMETHOD SetTitle(const nsAString& title);
NS_IMETHOD GetAttention(PRInt32 aCycleCount);

View File

@ -153,6 +153,7 @@ static void blinkRgn(RgnHandle rgn);
#endif
nsIRollupListener * gRollupListener = nsnull;
nsIMenuRollup * gMenuRollup = nsnull;
nsIWidget * gRollupWidget = nsnull;
PRUint32 gLastModifierState = 0;
@ -1891,6 +1892,7 @@ nsIntPoint nsChildView::WidgetToScreenOffset()
}
NS_IMETHODIMP nsChildView::CaptureRollupEvents(nsIRollupListener * aListener,
nsIMenuRollup * aMenuRollup,
PRBool aDoCapture,
PRBool aConsumeRollupEvent)
{
@ -2749,12 +2751,10 @@ NSEvent* gLastDragMouseDownEvent = nil;
// we don't want to rollup if the click is in a parent menu of
// the current submenu
PRUint32 popupsToRollup = PR_UINT32_MAX;
nsCOMPtr<nsIMenuRollup> menuRollup;
menuRollup = (do_QueryInterface(gRollupListener));
if (menuRollup) {
if (gMenuRollup) {
nsAutoTArray<nsIWidget*, 5> widgetChain;
menuRollup->GetSubmenuWidgetChain(&widgetChain);
PRUint32 sameTypeCount = menuRollup->GetSubmenuWidgetChain(&widgetChain);
gMenuRollup->GetSubmenuWidgetChain(&widgetChain);
PRUint32 sameTypeCount = gMenuRollup->GetSubmenuWidgetChain(&widgetChain);
for (PRUint32 i = 0; i < widgetChain.Length(); i++) {
nsIWidget* widget = widgetChain[i];
NSWindow* currWindow = (NSWindow*)widget->GetNativeData(NS_NATIVE_WINDOW);

View File

@ -245,7 +245,8 @@ public:
const nsTArray<nsIntRect>& aDestRects,
const nsTArray<Configuration>& aConfigurations);
NS_IMETHOD DispatchEvent(nsGUIEvent* event, nsEventStatus & aStatus) ;
NS_IMETHOD CaptureRollupEvents(nsIRollupListener * aListener, PRBool aDoCapture, PRBool aConsumeRollupEvent);
NS_IMETHOD CaptureRollupEvents(nsIRollupListener * aListener, nsIMenuRollup * aMenuRollup,
PRBool aDoCapture, PRBool aConsumeRollupEvent);
NS_IMETHOD GetAttention(PRInt32 aCycleCount);
virtual PRBool HasPendingInputEvent();
virtual nsTransparencyMode GetTransparencyMode();

View File

@ -66,6 +66,7 @@
#include "nsStyleConsts.h"
#include "nsNativeThemeColors.h"
#include "nsChildView.h"
#include "nsIMenuRollup.h"
#include "gfxPlatform.h"
#include "qcms.h"
@ -89,6 +90,7 @@ extern NSMenu* sApplicationMenu; // Application menu shared by all menubars
// defined in nsChildView.mm
extern nsIRollupListener * gRollupListener;
extern nsIMenuRollup * gMenuRollup;
extern nsIWidget * gRollupWidget;
extern BOOL gSomeMenuBarPainted;
@ -1344,17 +1346,21 @@ nsMenuBarX* nsCocoaWindow::GetMenuBar()
}
NS_IMETHODIMP nsCocoaWindow::CaptureRollupEvents(nsIRollupListener * aListener,
nsIMenuRollup * aMenuRollup,
PRBool aDoCapture,
PRBool aConsumeRollupEvent)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
NS_IF_RELEASE(gRollupListener);
gRollupListener = nsnull;
NS_IF_RELEASE(gMenuRollup);
NS_IF_RELEASE(gRollupWidget);
if (aDoCapture) {
gRollupListener = aListener;
NS_ADDREF(aListener);
NS_IF_RELEASE(gMenuRollup);
gMenuRollup = aMenuRollup;
NS_IF_ADDREF(aMenuRollup);
gRollupWidget = this;
NS_ADDREF(this);

View File

@ -290,7 +290,8 @@ static PRBool gGlobalsInitialized = PR_FALSE;
static PRBool gRaiseWindows = PR_TRUE;
static nsWindow *gPluginFocusWindow = NULL;
static nsCOMPtr<nsIRollupListener> gRollupListener;
static nsIRollupListener* gRollupListener;
static nsIMenuRollup* gMenuRollup;
static nsWeakPtr gRollupWindow;
static PRBool gConsumeRollupEvent;
@ -762,6 +763,7 @@ nsWindow::Destroy(void)
if (static_cast<nsIWidget *>(this) == rollupWidget.get()) {
if (gRollupListener)
gRollupListener->Rollup(nsnull, nsnull);
NS_IF_RELEASE(gMenuRollup);
gRollupWindow = nsnull;
gRollupListener = nsnull;
}
@ -2150,6 +2152,7 @@ nsWindow::CaptureMouse(PRBool aCapture)
NS_IMETHODIMP
nsWindow::CaptureRollupEvents(nsIRollupListener *aListener,
nsIMenuRollup *aMenuRollup,
PRBool aDoCapture,
PRBool aConsumeRollupEvent)
{
@ -2165,6 +2168,9 @@ nsWindow::CaptureRollupEvents(nsIRollupListener *aListener,
if (aDoCapture) {
gConsumeRollupEvent = aConsumeRollupEvent;
gRollupListener = aListener;
NS_IF_RELEASE(gMenuRollup);
gMenuRollup = aMenuRollup;
NS_IF_ADDREF(aMenuRollup);
gRollupWindow = do_GetWeakReference(static_cast<nsIWidget*>
(this));
// real grab is only done when there is no dragging
@ -2180,6 +2186,7 @@ nsWindow::CaptureRollupEvents(nsIRollupListener *aListener,
gtk_grab_remove(widget);
}
gRollupListener = nsnull;
NS_IF_RELEASE(gMenuRollup);
gRollupWindow = nsnull;
}
@ -5340,11 +5347,9 @@ check_for_rollup(GdkWindow *aWindow, gdouble aMouseX, gdouble aMouseY,
// we don't want to rollup if the clickis in a parent menu of
// the current submenu
PRUint32 popupsToRollup = PR_UINT32_MAX;
nsCOMPtr<nsIMenuRollup> menuRollup;
menuRollup = (do_QueryInterface(gRollupListener));
if (menuRollup) {
if (gMenuRollup) {
nsAutoTArray<nsIWidget*, 5> widgetChain;
PRUint32 sameTypeCount = menuRollup->GetSubmenuWidgetChain(&widgetChain);
PRUint32 sameTypeCount = gMenuRollup->GetSubmenuWidgetChain(&widgetChain);
for (PRUint32 i=0; i<widgetChain.Length(); ++i) {
nsIWidget* widget = widgetChain[i];
GdkWindow* currWindow =
@ -5377,6 +5382,7 @@ check_for_rollup(GdkWindow *aWindow, gdouble aMouseX, gdouble aMouseY,
} else {
gRollupWindow = nsnull;
gRollupListener = nsnull;
NS_IF_RELEASE(gMenuRollup);
}
return retVal;

View File

@ -189,6 +189,7 @@ public:
NS_IMETHOD EnableDragDrop(PRBool aEnable);
NS_IMETHOD CaptureMouse(PRBool aCapture);
NS_IMETHOD CaptureRollupEvents(nsIRollupListener *aListener,
nsIMenuRollup *aMenuRollup,
PRBool aDoCapture,
PRBool aConsumeRollupEvent);
NS_IMETHOD GetAttention(PRInt32 aCycleCount);

View File

@ -120,6 +120,7 @@ BOOL nsWindow::sIsRegistered = FALSE;
// Rollup Listener - global variable defintions
////////////////////////////////////////////////////
nsIRollupListener * gRollupListener = nsnull;
nsIMenuRollup * gMenuRollup = nsnull;
nsIWidget * gRollupWidget = nsnull;
PRBool gRollupConsumeRollupEvent = PR_FALSE;
////////////////////////////////////////////////////
@ -453,6 +454,7 @@ PRBool nsWindow::DispatchDragDropEvent(PRUint32 aMsg)
//-------------------------------------------------------------------------
NS_IMETHODIMP nsWindow::CaptureRollupEvents(nsIRollupListener * aListener,
nsIMenuRollup * aMenuRollup,
PRBool aDoCapture,
PRBool aConsumeRollupEvent)
{
@ -462,15 +464,16 @@ NS_IMETHODIMP nsWindow::CaptureRollupEvents(nsIRollupListener * aListener,
assure that remains true. */
NS_ASSERTION(!gRollupWidget, "rollup widget reassigned before release");
gRollupConsumeRollupEvent = aConsumeRollupEvent;
NS_IF_RELEASE(gRollupListener);
NS_IF_RELEASE(gRollupWidget);
gRollupListener = aListener;
NS_ADDREF(aListener);
NS_IF_RELEASE(gMenuRollup);
gMenuRollup = aMenuRollup;
NS_IF_ADDREF(aMenuRollup);
gRollupWidget = this;
NS_ADDREF(this);
} else {
NS_IF_RELEASE(gRollupListener);
//gRollupListener = nsnull;
gRollupListener = nsnull;
NS_IF_RELEASE(gMenuRollup);
NS_IF_RELEASE(gRollupWidget);
}
@ -539,10 +542,9 @@ nsWindow :: DealWithPopups ( ULONG inMsg, MRESULT* outResult )
// want to rollup if the click is in a parent menu of the current submenu.
PRUint32 popupsToRollup = PR_UINT32_MAX;
if (rollup) {
nsCOMPtr<nsIMenuRollup> menuRollup ( do_QueryInterface(gRollupListener) );
if ( menuRollup ) {
if ( gMenuRollup ) {
nsAutoTArray<nsIWidget*, 5> widgetChain;
PRUint32 sameTypeCount = menuRollup->GetSubmenuWidgetChain(&widgetChain);
PRUint32 sameTypeCount = gMenuRollup->GetSubmenuWidgetChain(&widgetChain);
for ( PRUint32 i = 0; i < widgetChain.Length(); ++i ) {
nsIWidget* widget = widgetChain[i];
if ( nsWindow::EventIsInsideWindow((nsWindow*)widget) ) {
@ -639,10 +641,9 @@ MRESULT EXPENTRY fnwpNSWindow( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
// If we're dealing with menus, we probably have submenus and we don't
// want to rollup if the click is in a parent menu of the current submenu.
if (rollup) {
nsCOMPtr<nsIMenuRollup> menuRollup ( do_QueryInterface(gRollupListener) );
if ( menuRollup ) {
if ( gMenuRollup ) {
nsAutoTArray<nsIWidget*, 5> widgetChain;
menuRollup->GetSubmenuWidgetChain ( &widgetChain );
gMenuRollup->GetSubmenuWidgetChain ( &widgetChain );
for ( PRUint32 i = 0; i < widgetChain.Length(); ++i ) {
nsIWidget* widget = widgetChain[i];
if ( nsWindow::EventIsInsideWindow((nsWindow*)widget) ) {
@ -972,7 +973,7 @@ NS_METHOD nsWindow::Destroy()
if (gRollupListener) {
gRollupListener->Rollup(PR_UINT32_MAX, nsnull);
}
CaptureRollupEvents(nsnull, PR_FALSE, PR_TRUE);
CaptureRollupEvents(nsnull, nsnull, PR_FALSE, PR_TRUE);
}
if (mWnd) {

View File

@ -148,7 +148,8 @@ class nsWindow : public nsBaseWidget
virtual nsIntPoint WidgetToScreenOffset();
NS_IMETHOD DispatchEvent( struct nsGUIEvent *event, nsEventStatus &aStatus);
NS_IMETHOD CaptureRollupEvents(nsIRollupListener * aListener, PRBool aDoCapture, PRBool aConsumeRollupEvent);
NS_IMETHOD CaptureRollupEvents(nsIRollupListener * aListener, nsIMenuRollup * aMenuRollup,
PRBool aDoCapture, PRBool aConsumeRollupEvent);
virtual PRBool HasPendingInputEvent();

View File

@ -92,7 +92,9 @@ public:
NS_IMETHOD SetModal(PRBool aModal);
NS_IMETHOD Show(PRBool state);
inline NS_IMETHOD CaptureRollupEvents(nsIRollupListener *aListener, PRBool aDoCapture, PRBool aConsumeRollupEvent) { return NS_OK; }
inline NS_IMETHOD CaptureRollupEvents(nsIRollupListener *aListener, nsIMenuRollup *aMenuRollup,
PRBool aDoCapture, PRBool aConsumeRollupEvent)
{ return NS_OK; }
inline NS_IMETHOD IsVisible(PRBool &aState) { aState = mShown; return NS_OK; }

View File

@ -59,6 +59,7 @@
#include "nsClipboard.h"
#include "nsIRollupListener.h"
#include "nsIMenuRollup.h"
#include "nsIServiceManager.h"
#include "nsIAppShell.h"
@ -74,6 +75,7 @@
static PhTile_t *GetWindowClipping( PtWidget_t *aWidget );
nsIRollupListener *nsWindow::gRollupListener = nsnull;
nsIMenuRollup *nsWindow::gMenuRollup = nsnull;
nsIWidget *nsWindow::gRollupWidget = nsnull;
static PtWidget_t *gMenuRegion;
@ -171,15 +173,21 @@ void nsWindow::DestroyNativeChildren(void)
}
}
NS_IMETHODIMP nsWindow::CaptureRollupEvents( nsIRollupListener * aListener, PRBool aDoCapture, PRBool aConsumeRollupEvent ) {
NS_IMETHODIMP nsWindow::CaptureRollupEvents( nsIRollupListener * aListener,
nsIMenuRollup * aMenuRollup,
PRBool aDoCapture,
PRBool aConsumeRollupEvent )
{
PtWidget_t *grabWidget;
grabWidget = mWidget;
if (aDoCapture) {
NS_IF_RELEASE(gRollupListener);
gRollupListener = nsnull;
NS_IF_RELEASE(gRollupWidget);
gRollupListener = aListener;
NS_ADDREF(aListener);
NS_IF_RELEASE(gMenuRollup);
gMenuRollup = aMenuRollup;
NS_IF_ADDREF(aMenuRollup);
gRollupWidget = this;
NS_ADDREF(this);
@ -203,8 +211,8 @@ NS_IMETHODIMP nsWindow::CaptureRollupEvents( nsIRollupListener * aListener, PRBo
}
}
else {
NS_IF_RELEASE(gRollupListener);
gRollupListener = nsnull;
NS_IF_RELEASE(gMenuRollup);
NS_IF_RELEASE(gRollupWidget);
gRollupWidget = nsnull;

View File

@ -91,6 +91,7 @@ public:
}
NS_IMETHOD CaptureRollupEvents(nsIRollupListener * aListener,
nsIMenuRollup * aMenuRollup,
PRBool aDoCapture,
PRBool aConsumeRollupEvent);
@ -155,6 +156,7 @@ private:
PRBool mIsTooSmall;
PRBool mIsDestroying;
static nsIRollupListener *gRollupListener;
static nsIMenuRollup* gMenuRollup;
static nsIWidget *gRollupWidget;
};

View File

@ -114,7 +114,8 @@ static NS_DEFINE_IID(kCDragServiceCID, NS_DRAGSERVICE_CID);
static const int WHEEL_DELTA = 120;
static PRBool gGlobalsInitialized = PR_FALSE;
static nsCOMPtr<nsIRollupListener> gRollupListener;
static nsIRollupListener* gRollupListener;
static nsIMenuRollup* gMenuRollup;
static nsWeakPtr gRollupWindow;
static PRBool gConsumeRollupEvent;
@ -250,6 +251,7 @@ nsWindow::Destroy(void)
gRollupListener->Rollup(nsnull, nsnull);
gRollupWindow = nsnull;
gRollupListener = nsnull;
NS_IF_RELEASE(gMenuRollup);
}
Show(PR_FALSE);
@ -802,6 +804,7 @@ nsWindow::CaptureMouse(PRBool aCapture)
NS_IMETHODIMP
nsWindow::CaptureRollupEvents(nsIRollupListener *aListener,
nsIMenuRollup *aMenuRollup,
PRBool aDoCapture,
PRBool aConsumeRollupEvent)
{
@ -813,10 +816,14 @@ nsWindow::CaptureRollupEvents(nsIRollupListener *aListener,
if (aDoCapture) {
gConsumeRollupEvent = aConsumeRollupEvent;
gRollupListener = aListener;
NS_IF_RELEASE(gMenuRollup);
gMenuRollup = aMenuRollup;
NS_IF_ADDREF(aMenuRollup);
gRollupWindow = do_GetWeakReference(static_cast<nsIWidget*>(this));
}
else {
gRollupListener = nsnull;
NS_IF_RELEASE(gMenuRollup);
gRollupWindow = nsnull;
}
@ -844,11 +851,9 @@ check_for_rollup(double aMouseX, double aMouseY,
// we don't want to rollup if the clickis in a parent menu of
// the current submenu
PRUint32 popupsToRollup = PR_UINT32_MAX;
nsCOMPtr<nsIMenuRollup> menuRollup;
menuRollup = (do_QueryInterface(gRollupListener));
if (menuRollup) {
if (gMenuRollup) {
nsAutoTArray<nsIWidget*, 5> widgetChain;
PRUint32 sameTypeCount = menuRollup->GetSubmenuWidgetChain(&widgetChain);
PRUint32 sameTypeCount = gMenuRollup->GetSubmenuWidgetChain(&widgetChain);
for (PRUint32 i=0; i<widgetChain.Length(); ++i) {
nsIWidget* widget = widgetChain[i];
QWidget* currWindow =
@ -874,6 +879,7 @@ check_for_rollup(double aMouseX, double aMouseY,
} else {
gRollupWindow = nsnull;
gRollupListener = nsnull;
gMenuRollup = nsnull;
}
return retVal;

View File

@ -175,6 +175,7 @@ public:
NS_IMETHOD EnableDragDrop(PRBool aEnable);
NS_IMETHOD CaptureMouse(PRBool aCapture);
NS_IMETHOD CaptureRollupEvents(nsIRollupListener *aListener,
nsIMenuRollup *aMenuRollup,
PRBool aDoCapture,
PRBool aConsumeRollupEvent);

View File

@ -256,6 +256,7 @@ UINT nsWindow::sHookTimerId = 0;
// Rollup Listener
nsIRollupListener* nsWindow::sRollupListener = nsnull;
nsIMenuRollup* nsWindow::sMenuRollup = nsnull;
nsIWidget* nsWindow::sRollupWidget = nsnull;
PRBool nsWindow::sRollupConsumeEvent = PR_FALSE;
@ -2652,6 +2653,7 @@ NS_METHOD nsWindow::CaptureMouse(PRBool aCapture)
**************************************************************/
NS_IMETHODIMP nsWindow::CaptureRollupEvents(nsIRollupListener * aListener,
nsIMenuRollup * aMenuRollup,
PRBool aDoCapture,
PRBool aConsumeRollupEvent)
{
@ -2661,10 +2663,11 @@ NS_IMETHODIMP nsWindow::CaptureRollupEvents(nsIRollupListener * aListener,
assure that remains true. */
NS_ASSERTION(!sRollupWidget, "rollup widget reassigned before release");
sRollupConsumeEvent = aConsumeRollupEvent;
NS_IF_RELEASE(sRollupListener);
NS_IF_RELEASE(sRollupWidget);
NS_IF_RELEASE(sMenuRollup);
sRollupListener = aListener;
NS_ADDREF(aListener);
sMenuRollup = aMenuRollup;
NS_IF_ADDREF(aMenuRollup);
sRollupWidget = this;
NS_ADDREF(this);
@ -2676,7 +2679,8 @@ NS_IMETHODIMP nsWindow::CaptureRollupEvents(nsIRollupListener * aListener,
#endif
} else {
NS_IF_RELEASE(sRollupListener);
sRollupListener = nsnull;
NS_IF_RELEASE(sMenuRollup);
NS_IF_RELEASE(sRollupWidget);
#ifndef WINCE
@ -5904,7 +5908,7 @@ void nsWindow::OnDestroy()
if ( this == sRollupWidget ) {
if ( sRollupListener )
sRollupListener->Rollup(nsnull, nsnull);
CaptureRollupEvents(nsnull, PR_FALSE, PR_TRUE);
CaptureRollupEvents(nsnull, nsnull, PR_FALSE, PR_TRUE);
}
// If IME is disabled, restore it.
@ -6792,10 +6796,9 @@ nsWindow::DealWithPopups(HWND inWnd, UINT inMsg, WPARAM inWParam, LPARAM inLPara
// want to rollup if the click is in a parent menu of the current submenu.
PRUint32 popupsToRollup = PR_UINT32_MAX;
if (rollup) {
nsCOMPtr<nsIMenuRollup> menuRollup ( do_QueryInterface(sRollupListener) );
if ( menuRollup ) {
if ( sMenuRollup ) {
nsAutoTArray<nsIWidget*, 5> widgetChain;
PRUint32 sameTypeCount = menuRollup->GetSubmenuWidgetChain(&widgetChain);
PRUint32 sameTypeCount = sMenuRollup->GetSubmenuWidgetChain(&widgetChain);
for ( PRUint32 i = 0; i < widgetChain.Length(); ++i ) {
nsIWidget* widget = widgetChain[i];
if ( nsWindow::EventIsInsideWindow(inMsg, (nsWindow*)widget) ) {

View File

@ -153,7 +153,8 @@ public:
NS_IMETHOD DispatchEvent(nsGUIEvent* event, nsEventStatus & aStatus);
NS_IMETHOD EnableDragDrop(PRBool aEnable);
NS_IMETHOD CaptureMouse(PRBool aCapture);
NS_IMETHOD CaptureRollupEvents(nsIRollupListener * aListener, PRBool aDoCapture, PRBool aConsumeRollupEvent);
NS_IMETHOD CaptureRollupEvents(nsIRollupListener * aListener, nsIMenuRollup * aMenuRollup,
PRBool aDoCapture, PRBool aConsumeRollupEvent);
NS_IMETHOD GetAttention(PRInt32 aCycleCount);
virtual PRBool HasPendingInputEvent();
gfxASurface *GetThebesSurface();
@ -462,6 +463,7 @@ protected:
static nsIWidget* sRollupWidget;
static PRBool sRollupConsumeEvent;
static nsIRollupListener* sRollupListener;
static nsIMenuRollup* sMenuRollup;
// Mouse Clicks - static variable definitions for figuring
// out 1 - 3 Clicks.