Bug 743975 - remove the view wrapper,r=tn
This commit is contained in:
@@ -16,196 +16,6 @@
|
||||
#include "nsXULPopupManager.h"
|
||||
#include "nsIWidgetListener.h"
|
||||
|
||||
#define VIEW_WRAPPER_IID \
|
||||
{ 0xbf4e1841, 0xe9ec, 0x47f2, \
|
||||
{ 0xb4, 0x77, 0x0f, 0xf6, 0x0f, 0x5a, 0xac, 0xbd } }
|
||||
|
||||
static bool
|
||||
IsPopupWidget(nsIWidget* aWidget)
|
||||
{
|
||||
nsWindowType type;
|
||||
aWidget->GetWindowType(type);
|
||||
return (type == eWindowType_popup);
|
||||
}
|
||||
|
||||
/**
|
||||
* nsISupports-derived helper class that allows to store and get a view
|
||||
*/
|
||||
class ViewWrapper MOZ_FINAL : public nsIInterfaceRequestor,
|
||||
public nsIWidgetListener
|
||||
{
|
||||
public:
|
||||
NS_DECLARE_STATIC_IID_ACCESSOR(VIEW_WRAPPER_IID)
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_NSIINTERFACEREQUESTOR
|
||||
|
||||
ViewWrapper(nsView* aView) : mView(aView) {}
|
||||
|
||||
nsView* GetView() { return mView; }
|
||||
private:
|
||||
nsView* mView;
|
||||
|
||||
public:
|
||||
|
||||
virtual nsIPresShell* GetPresShell()
|
||||
{
|
||||
return mView->GetViewManager()->GetPresShell();
|
||||
}
|
||||
|
||||
bool WindowMoved(nsIWidget* aWidget, PRInt32 x, PRInt32 y)
|
||||
{
|
||||
nsXULPopupManager* pm = nsXULPopupManager::GetInstance();
|
||||
if (pm && IsPopupWidget(aWidget)) {
|
||||
pm->PopupMoved(mView->GetFrame(), nsIntPoint(x, y));
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool WindowResized(nsIWidget* aWidget, PRInt32 aWidth, PRInt32 aHeight)
|
||||
{
|
||||
nsIViewManager* viewManager = mView->GetViewManager();
|
||||
|
||||
// The root view may not be set if this is the resize associated with
|
||||
// window creation
|
||||
if (mView == viewManager->GetRootView()) {
|
||||
nsRefPtr<nsDeviceContext> devContext;
|
||||
viewManager->GetDeviceContext(*getter_AddRefs(devContext));
|
||||
PRInt32 p2a = devContext->AppUnitsPerDevPixel();
|
||||
viewManager->SetWindowDimensions(NSIntPixelsToAppUnits(aWidth, p2a),
|
||||
NSIntPixelsToAppUnits(aHeight, p2a));
|
||||
return true;
|
||||
}
|
||||
else if (IsPopupWidget(aWidget)) {
|
||||
nsXULPopupManager* pm = nsXULPopupManager::GetInstance();
|
||||
if (pm) {
|
||||
pm->PopupResized(mView->GetFrame(), nsIntSize(aWidth, aHeight));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool RequestWindowClose(nsIWidget* aWidget)
|
||||
{
|
||||
nsIFrame* frame = mView->GetFrame();
|
||||
if (frame && IsPopupWidget(aWidget) &&
|
||||
frame->GetType() == nsGkAtoms::menuPopupFrame) {
|
||||
nsXULPopupManager* pm = nsXULPopupManager::GetInstance();
|
||||
if (pm) {
|
||||
pm->HidePopup(frame->GetContent(), false, true, false);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void WillPaintWindow(nsIWidget* aWidget, bool aWillSendPaint)
|
||||
{
|
||||
mView->GetViewManager()->WillPaintWindow(aWidget, aWillSendPaint);
|
||||
}
|
||||
|
||||
bool PaintWindow(nsIWidget* aWidget, nsIntRegion aRegion, bool aSentWillPaint, bool aWillSendDidPaint)
|
||||
{
|
||||
nsCOMPtr<nsViewManager> vm = mView->GetViewManager();
|
||||
return vm->PaintWindow(aWidget, aRegion, aSentWillPaint, aWillSendDidPaint);
|
||||
}
|
||||
|
||||
void DidPaintWindow()
|
||||
{
|
||||
mView->GetViewManager()->DidPaintWindow();
|
||||
}
|
||||
};
|
||||
|
||||
NS_DEFINE_STATIC_IID_ACCESSOR(ViewWrapper, VIEW_WRAPPER_IID)
|
||||
|
||||
NS_IMPL_ADDREF(ViewWrapper)
|
||||
NS_IMPL_RELEASE(ViewWrapper)
|
||||
#ifndef DEBUG
|
||||
NS_IMPL_QUERY_INTERFACE2(ViewWrapper, ViewWrapper, nsIInterfaceRequestor)
|
||||
|
||||
#else
|
||||
NS_IMETHODIMP ViewWrapper::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aInstancePtr);
|
||||
|
||||
NS_ASSERTION(!aIID.Equals(NS_GET_IID(nsIView)),
|
||||
"Someone expects a viewwrapper to be a view!");
|
||||
|
||||
*aInstancePtr = nullptr;
|
||||
|
||||
if (aIID.Equals(NS_GET_IID(nsISupports))) {
|
||||
*aInstancePtr = static_cast<nsISupports*>(this);
|
||||
}
|
||||
else if (aIID.Equals(NS_GET_IID(ViewWrapper))) {
|
||||
*aInstancePtr = this;
|
||||
}
|
||||
else if (aIID.Equals(NS_GET_IID(nsIInterfaceRequestor))) {
|
||||
*aInstancePtr = this;
|
||||
}
|
||||
|
||||
|
||||
if (*aInstancePtr) {
|
||||
AddRef();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
return NS_NOINTERFACE;
|
||||
}
|
||||
#endif
|
||||
|
||||
NS_IMETHODIMP ViewWrapper::GetInterface(REFNSIID aIID, void** aInstancePtr)
|
||||
{
|
||||
if (aIID.Equals(NS_GET_IID(nsIView))) {
|
||||
*aInstancePtr = mView;
|
||||
return NS_OK;
|
||||
}
|
||||
return QueryInterface(aIID, aInstancePtr);
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a widget, returns the stored ViewWrapper on it, or NULL if no
|
||||
* ViewWrapper is there.
|
||||
*/
|
||||
static ViewWrapper* GetWrapperFor(nsIWidget* aWidget)
|
||||
{
|
||||
return aWidget ? static_cast<ViewWrapper *>(aWidget->GetWidgetListener()) : nullptr;
|
||||
}
|
||||
|
||||
// Attached widget event helpers
|
||||
static ViewWrapper* GetAttachedWrapperFor(nsIWidget* aWidget)
|
||||
{
|
||||
NS_PRECONDITION(nullptr != aWidget, "null widget ptr");
|
||||
return aWidget->GetAttachedViewPtr();
|
||||
}
|
||||
|
||||
static nsView* GetAttachedViewFor(nsIWidget* aWidget)
|
||||
{
|
||||
NS_PRECONDITION(nullptr != aWidget, "null widget ptr");
|
||||
|
||||
ViewWrapper* wrapper = GetAttachedWrapperFor(aWidget);
|
||||
if (!wrapper)
|
||||
return nullptr;
|
||||
return wrapper->GetView();
|
||||
}
|
||||
|
||||
nsEventStatus ViewWrapper::HandleEvent(nsGUIEvent* aEvent, bool aUseAttachedEvents)
|
||||
{
|
||||
NS_PRECONDITION(nullptr != aEvent->widget, "null widget ptr");
|
||||
|
||||
nsEventStatus result = nsEventStatus_eIgnore;
|
||||
nsIView* view = aUseAttachedEvents ? GetAttachedViewFor(aEvent->widget) :
|
||||
nsView::GetViewFor(aEvent->widget);
|
||||
if (view) {
|
||||
nsCOMPtr<nsIViewManager> vm = view->GetViewManager();
|
||||
vm->DispatchEvent(aEvent, view, &result);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
nsView::nsView(nsViewManager* aViewManager, nsViewVisibility aVisibility)
|
||||
{
|
||||
MOZ_COUNT_CTOR(nsView);
|
||||
@@ -285,19 +95,12 @@ void nsView::DestroyWidget()
|
||||
{
|
||||
if (mWindow)
|
||||
{
|
||||
// Release memory for the view wrapper
|
||||
ViewWrapper* wrapper = GetWrapperFor(mWindow);
|
||||
NS_IF_RELEASE(wrapper);
|
||||
|
||||
// If we are not attached to a base window, we're going to tear down our
|
||||
// widget here. However, if we're attached to somebody elses widget, we
|
||||
// want to leave the widget alone: don't reset the client data or call
|
||||
// Destroy. Just clear our event view ptr and free our reference to it.
|
||||
if (mWidgetIsTopLevel) {
|
||||
ViewWrapper* wrapper = GetAttachedWrapperFor(mWindow);
|
||||
NS_IF_RELEASE(wrapper);
|
||||
|
||||
mWindow->SetAttachedViewPtr(nullptr);
|
||||
mWindow->SetAttachedWidgetListener(nullptr);
|
||||
}
|
||||
else {
|
||||
mWindow->SetWidgetListener(nullptr);
|
||||
@@ -331,17 +134,15 @@ nsIView* nsIView::GetViewFor(nsIWidget* aWidget)
|
||||
{
|
||||
NS_PRECONDITION(nullptr != aWidget, "null widget ptr");
|
||||
|
||||
ViewWrapper* wrapper = GetWrapperFor(aWidget);
|
||||
|
||||
if (!wrapper) {
|
||||
wrapper = GetAttachedWrapperFor(aWidget);
|
||||
nsIWidgetListener* listener = aWidget->GetWidgetListener();
|
||||
if (listener) {
|
||||
nsIView* view = listener->GetView();
|
||||
if (view)
|
||||
return view;
|
||||
}
|
||||
|
||||
if (wrapper) {
|
||||
return wrapper->GetView();
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
listener = aWidget->GetAttachedWidgetListener();
|
||||
return listener ? listener->GetView() : nullptr;
|
||||
}
|
||||
|
||||
void nsIView::Destroy()
|
||||
@@ -826,9 +627,7 @@ nsView::InitializeWindow(bool aEnableDragDrop, bool aResetVisibility)
|
||||
{
|
||||
NS_ABORT_IF_FALSE(mWindow, "Must have a window to initialize");
|
||||
|
||||
ViewWrapper* wrapper = new ViewWrapper(this);
|
||||
NS_ADDREF(wrapper); // Will be released in ~nsView
|
||||
mWindow->SetWidgetListener(wrapper);
|
||||
mWindow->SetWidgetListener(this);
|
||||
|
||||
if (aEnableDragDrop) {
|
||||
mWindow->EnableDragDrop(true);
|
||||
@@ -850,10 +649,13 @@ nsresult nsIView::AttachToTopLevelWidget(nsIWidget* aWidget)
|
||||
NS_PRECONDITION(nullptr != aWidget, "null widget ptr");
|
||||
/// XXXjimm This is a temporary workaround to an issue w/document
|
||||
// viewer (bug 513162).
|
||||
nsIView *oldView = GetAttachedViewFor(aWidget);
|
||||
nsIWidgetListener* listener = aWidget->GetAttachedWidgetListener();
|
||||
if (listener) {
|
||||
nsIView *oldView = listener->GetView();
|
||||
if (oldView) {
|
||||
oldView->DetachFromTopLevelWidget();
|
||||
}
|
||||
}
|
||||
|
||||
nsRefPtr<nsDeviceContext> dx;
|
||||
mViewManager->GetDeviceContext(*getter_AddRefs(dx));
|
||||
@@ -867,9 +669,7 @@ nsresult nsIView::AttachToTopLevelWidget(nsIWidget* aWidget)
|
||||
mWindow = aWidget;
|
||||
NS_ADDREF(mWindow);
|
||||
|
||||
ViewWrapper* wrapper = new ViewWrapper(Impl());
|
||||
NS_ADDREF(wrapper);
|
||||
mWindow->SetAttachedViewPtr(wrapper);
|
||||
mWindow->SetAttachedWidgetListener(Impl());
|
||||
mWindow->EnableDragDrop(true);
|
||||
mWidgetIsTopLevel = true;
|
||||
|
||||
@@ -887,11 +687,7 @@ nsresult nsIView::DetachFromTopLevelWidget()
|
||||
NS_PRECONDITION(mWidgetIsTopLevel, "Not attached currently!");
|
||||
NS_PRECONDITION(mWindow, "null mWindow for DetachFromTopLevelWidget!");
|
||||
|
||||
// Release memory for the view wrapper
|
||||
ViewWrapper* wrapper = GetAttachedWrapperFor(mWindow);
|
||||
NS_IF_RELEASE(wrapper);
|
||||
|
||||
mWindow->SetAttachedViewPtr(nullptr);
|
||||
mWindow->SetAttachedWidgetListener(nullptr);
|
||||
NS_RELEASE(mWindow);
|
||||
|
||||
mWidgetIsTopLevel = false;
|
||||
@@ -916,8 +712,6 @@ void nsView::AssertNoWindow()
|
||||
// XXX: it would be nice to make this a strong assert
|
||||
if (NS_UNLIKELY(mWindow)) {
|
||||
NS_ERROR("We already have a window for this view? BAD");
|
||||
ViewWrapper* wrapper = GetWrapperFor(mWindow);
|
||||
NS_IF_RELEASE(wrapper);
|
||||
mWindow->SetWidgetListener(nullptr);
|
||||
mWindow->Destroy();
|
||||
NS_RELEASE(mWindow);
|
||||
@@ -933,18 +727,13 @@ void nsIView::AttachWidgetEventHandler(nsIWidget* aWidget)
|
||||
NS_ASSERTION(!aWidget->GetWidgetListener(), "Already have a widget listener");
|
||||
#endif
|
||||
|
||||
ViewWrapper* wrapper = new ViewWrapper(Impl());
|
||||
if (!wrapper)
|
||||
return;
|
||||
NS_ADDREF(wrapper); // Will be released in DetachWidgetEventHandler
|
||||
aWidget->SetWidgetListener(wrapper);
|
||||
aWidget->SetWidgetListener(Impl());
|
||||
}
|
||||
|
||||
void nsIView::DetachWidgetEventHandler(nsIWidget* aWidget)
|
||||
{
|
||||
ViewWrapper* wrapper = GetWrapperFor(aWidget);
|
||||
NS_ASSERTION(!wrapper || wrapper->GetView() == this, "Wrong view");
|
||||
NS_IF_RELEASE(wrapper);
|
||||
NS_ASSERTION(!aWidget->GetWidgetListener() ||
|
||||
aWidget->GetWidgetListener()->GetView() == this, "Wrong view");
|
||||
aWidget->SetWidgetListener(nullptr);
|
||||
}
|
||||
|
||||
@@ -1165,3 +954,110 @@ nsIView::ConvertFromParentCoords(nsPoint aPt) const
|
||||
aPt -= GetPosition();
|
||||
return aPt;
|
||||
}
|
||||
|
||||
static bool
|
||||
IsPopupWidget(nsIWidget* aWidget)
|
||||
{
|
||||
nsWindowType type;
|
||||
aWidget->GetWindowType(type);
|
||||
return (type == eWindowType_popup);
|
||||
}
|
||||
|
||||
nsIPresShell*
|
||||
nsView::GetPresShell()
|
||||
{
|
||||
return GetViewManager()->GetPresShell();
|
||||
}
|
||||
|
||||
bool
|
||||
nsView::WindowMoved(nsIWidget* aWidget, PRInt32 x, PRInt32 y)
|
||||
{
|
||||
nsXULPopupManager* pm = nsXULPopupManager::GetInstance();
|
||||
if (pm && IsPopupWidget(aWidget)) {
|
||||
pm->PopupMoved(mFrame, nsIntPoint(x, y));
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
nsView::WindowResized(nsIWidget* aWidget, PRInt32 aWidth, PRInt32 aHeight)
|
||||
{
|
||||
// The root view may not be set if this is the resize associated with
|
||||
// window creation
|
||||
if (this == mViewManager->GetRootView()) {
|
||||
nsRefPtr<nsDeviceContext> devContext;
|
||||
mViewManager->GetDeviceContext(*getter_AddRefs(devContext));
|
||||
PRInt32 p2a = devContext->AppUnitsPerDevPixel();
|
||||
mViewManager->SetWindowDimensions(NSIntPixelsToAppUnits(aWidth, p2a),
|
||||
NSIntPixelsToAppUnits(aHeight, p2a));
|
||||
return true;
|
||||
}
|
||||
else if (IsPopupWidget(aWidget)) {
|
||||
nsXULPopupManager* pm = nsXULPopupManager::GetInstance();
|
||||
if (pm) {
|
||||
pm->PopupResized(mFrame, nsIntSize(aWidth, aHeight));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
nsView::RequestWindowClose(nsIWidget* aWidget)
|
||||
{
|
||||
if (mFrame && IsPopupWidget(aWidget) &&
|
||||
mFrame->GetType() == nsGkAtoms::menuPopupFrame) {
|
||||
nsXULPopupManager* pm = nsXULPopupManager::GetInstance();
|
||||
if (pm) {
|
||||
pm->HidePopup(mFrame->GetContent(), false, true, false);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
nsView::WillPaintWindow(nsIWidget* aWidget, bool aWillSendDidPaint)
|
||||
{
|
||||
mViewManager->WillPaintWindow(aWidget, aWillSendDidPaint);
|
||||
}
|
||||
|
||||
bool
|
||||
nsView::PaintWindow(nsIWidget* aWidget, nsIntRegion aRegion, bool aSentWillPaint, bool aWillSendDidPaint)
|
||||
{
|
||||
nsCOMPtr<nsViewManager> vm = mViewManager;
|
||||
return vm->PaintWindow(aWidget, aRegion, aSentWillPaint, aWillSendDidPaint);
|
||||
}
|
||||
|
||||
void
|
||||
nsView::DidPaintWindow()
|
||||
{
|
||||
mViewManager->DidPaintWindow();
|
||||
}
|
||||
|
||||
nsEventStatus
|
||||
nsView::HandleEvent(nsGUIEvent* aEvent, bool aUseAttachedEvents)
|
||||
{
|
||||
NS_PRECONDITION(nullptr != aEvent->widget, "null widget ptr");
|
||||
|
||||
nsEventStatus result = nsEventStatus_eIgnore;
|
||||
nsIView* view;
|
||||
if (aUseAttachedEvents) {
|
||||
nsIWidgetListener* listener = aEvent->widget->GetAttachedWidgetListener();
|
||||
view = listener ? listener->GetView() : nullptr;
|
||||
}
|
||||
else {
|
||||
view = GetViewFor(aEvent->widget);
|
||||
}
|
||||
|
||||
if (view) {
|
||||
nsCOMPtr<nsIViewManager> vm = view->GetViewManager();
|
||||
vm->DispatchEvent(aEvent, view, &result);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include "nsCRT.h"
|
||||
#include "nsIFactory.h"
|
||||
#include "nsEvent.h"
|
||||
#include "nsIWidgetListener.h"
|
||||
#include <stdio.h>
|
||||
|
||||
//mmptemp
|
||||
@@ -19,7 +20,8 @@
|
||||
class nsIViewManager;
|
||||
class nsViewManager;
|
||||
|
||||
class nsView : public nsIView
|
||||
class nsView : public nsIView,
|
||||
public nsIWidgetListener
|
||||
{
|
||||
public:
|
||||
nsView(nsViewManager* aViewManager = nullptr,
|
||||
@@ -155,6 +157,17 @@ public:
|
||||
// released if it points to any view in this view hierarchy.
|
||||
void InvalidateHierarchy(nsViewManager *aViewManagerParent);
|
||||
|
||||
// nsIWidgetListener
|
||||
virtual nsIPresShell* GetPresShell();
|
||||
virtual nsIView* GetView() { return this; }
|
||||
bool WindowMoved(nsIWidget* aWidget, PRInt32 x, PRInt32 y);
|
||||
bool WindowResized(nsIWidget* aWidget, PRInt32 aWidth, PRInt32 aHeight);
|
||||
bool RequestWindowClose(nsIWidget* aWidget);
|
||||
void WillPaintWindow(nsIWidget* aWidget, bool aWillSendDidPaint);
|
||||
bool PaintWindow(nsIWidget* aWidget, nsIntRegion aRegion, bool aSentDidPaint, bool aWillSendDidPaint);
|
||||
void DidPaintWindow();
|
||||
nsEventStatus HandleEvent(nsGUIEvent* aEvent, bool aUseAttachedEvents);
|
||||
|
||||
virtual ~nsView();
|
||||
|
||||
nsPoint GetOffsetTo(const nsView* aOther) const;
|
||||
|
||||
@@ -3489,8 +3489,8 @@ NS_IMETHODIMP nsWindow::DispatchEvent(nsGUIEvent* event, nsEventStatus & aStatus
|
||||
// to the underlying base window and the view. Added when we combined the
|
||||
// base chrome window with the main content child for nc client area (title
|
||||
// bar) rendering.
|
||||
if (mViewWrapperPtr) {
|
||||
aStatus = mViewWrapperPtr->HandleEvent(event, mUseAttachedEvents);
|
||||
if (mAttachedWidgetListener) {
|
||||
aStatus = mAttachedWidgetListener->HandleEvent(event, mUseAttachedEvents);
|
||||
}
|
||||
else if (mWidgetListener) {
|
||||
aStatus = mWidgetListener->HandleEvent(event, mUseAttachedEvents);
|
||||
@@ -6934,6 +6934,7 @@ void nsWindow::OnDestroy()
|
||||
|
||||
// Prevent the widget from sending additional events.
|
||||
mWidgetListener = nullptr;
|
||||
mAttachedWidgetListener = nullptr;
|
||||
|
||||
// Free our subclass and clear |this| stored in the window props. We will no longer
|
||||
// receive events from Windows after this point.
|
||||
@@ -7024,8 +7025,8 @@ bool nsWindow::OnResize(nsIntRect &aWindowRect)
|
||||
#endif
|
||||
|
||||
// If there is an attached view, inform it as well as the normal widget listener.
|
||||
if (mViewWrapperPtr) {
|
||||
mViewWrapperPtr->WindowResized(this, aWindowRect.width, aWindowRect.height);
|
||||
if (mAttachedWidgetListener) {
|
||||
mAttachedWidgetListener->WindowResized(this, aWindowRect.width, aWindowRect.height);
|
||||
}
|
||||
|
||||
return mWidgetListener ?
|
||||
|
||||
@@ -235,7 +235,7 @@ bool nsWindow::OnPaint(HDC aDC, PRUint32 aNestingLevel)
|
||||
return true;
|
||||
}
|
||||
|
||||
nsIWidgetListener* listener = mViewWrapperPtr ? mViewWrapperPtr : mWidgetListener;
|
||||
nsIWidgetListener* listener = mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
|
||||
if (listener) {
|
||||
listener->WillPaintWindow(this, true);
|
||||
}
|
||||
|
||||
@@ -182,11 +182,8 @@ PuppetWidget::Resize(PRInt32 aWidth,
|
||||
InvalidateRegion(this, dirty);
|
||||
}
|
||||
|
||||
// XXXndeakin this isn't the right widget listener to use. It should use
|
||||
// the view wrapper pointer but that won't compile. This will be fixed up
|
||||
// in a later patch.
|
||||
if (!oldBounds.IsEqualEdges(mBounds) && mWidgetListener) {
|
||||
mWidgetListener->WindowResized(this, mBounds.width, mBounds.height);
|
||||
if (!oldBounds.IsEqualEdges(mBounds) && mAttachedWidgetListener) {
|
||||
mAttachedWidgetListener->WindowResized(this, mBounds.width, mBounds.height);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
@@ -250,7 +247,7 @@ PuppetWidget::DispatchEvent(nsGUIEvent* event, nsEventStatus& aStatus)
|
||||
|
||||
aStatus = nsEventStatus_eIgnore;
|
||||
|
||||
NS_ABORT_IF_FALSE(mViewWrapperPtr, "No listener!");
|
||||
NS_ABORT_IF_FALSE(mAttachedWidgetListener, "No listener!");
|
||||
|
||||
if (event->message == NS_COMPOSITION_START) {
|
||||
mIMEComposing = true;
|
||||
@@ -273,7 +270,7 @@ PuppetWidget::DispatchEvent(nsGUIEvent* event, nsEventStatus& aStatus)
|
||||
break;
|
||||
}
|
||||
|
||||
aStatus = mViewWrapperPtr->HandleEvent(event, mUseAttachedEvents);
|
||||
aStatus = mAttachedWidgetListener->HandleEvent(event, mUseAttachedEvents);
|
||||
|
||||
if (event->message == NS_COMPOSITION_END) {
|
||||
mIMEComposing = false;
|
||||
@@ -482,7 +479,7 @@ PuppetWidget::Paint()
|
||||
{
|
||||
NS_ABORT_IF_FALSE(!mDirtyRegion.IsEmpty(), "paint event logic messed up");
|
||||
|
||||
if (!mWidgetListener)
|
||||
if (!mAttachedWidgetListener)
|
||||
return NS_OK;
|
||||
|
||||
nsIntRegion region = mDirtyRegion;
|
||||
@@ -498,19 +495,19 @@ PuppetWidget::Paint()
|
||||
#endif
|
||||
|
||||
if (mozilla::layers::LAYERS_D3D10 == mLayerManager->GetBackendType()) {
|
||||
mWidgetListener->PaintWindow(this, region, false, true);
|
||||
mAttachedWidgetListener->PaintWindow(this, region, false, true);
|
||||
} else {
|
||||
nsRefPtr<gfxContext> ctx = new gfxContext(mSurface);
|
||||
ctx->Rectangle(gfxRect(0,0,0,0));
|
||||
ctx->Clip();
|
||||
AutoLayerManagerSetup setupLayerManager(this, ctx,
|
||||
BUFFER_NONE);
|
||||
mWidgetListener->PaintWindow(this, region, false, true);
|
||||
mAttachedWidgetListener->PaintWindow(this, region, false, true);
|
||||
mTabChild->NotifyPainted();
|
||||
}
|
||||
}
|
||||
|
||||
mWidgetListener->DidPaintWindow();
|
||||
mAttachedWidgetListener->DidPaintWindow();
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@@ -85,7 +85,7 @@ nsAutoRollup::~nsAutoRollup()
|
||||
|
||||
nsBaseWidget::nsBaseWidget()
|
||||
: mWidgetListener(nullptr)
|
||||
, mViewWrapperPtr(nullptr)
|
||||
, mAttachedWidgetListener(nullptr)
|
||||
, mContext(nullptr)
|
||||
, mCursor(eCursor_standard)
|
||||
, mWindowType(eWindowType_child)
|
||||
@@ -294,15 +294,14 @@ nsBaseWidget::AttachViewToTopLevel(bool aUseAttachedEvents,
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
ViewWrapper* nsBaseWidget::GetAttachedViewPtr()
|
||||
nsIWidgetListener* nsBaseWidget::GetAttachedWidgetListener()
|
||||
{
|
||||
return mViewWrapperPtr;
|
||||
return mAttachedWidgetListener;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsBaseWidget::SetAttachedViewPtr(ViewWrapper* aViewWrapper)
|
||||
void nsBaseWidget::SetAttachedWidgetListener(nsIWidgetListener* aListener)
|
||||
{
|
||||
mViewWrapperPtr = aViewWrapper;
|
||||
return NS_OK;
|
||||
mAttachedWidgetListener = aListener;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
@@ -157,8 +157,8 @@ public:
|
||||
nsWidgetInitData *aInitData = nullptr,
|
||||
bool aForceUseIWidgetParent = false);
|
||||
NS_IMETHOD AttachViewToTopLevel(bool aUseAttachedEvents, nsDeviceContext *aContext);
|
||||
virtual ViewWrapper* GetAttachedViewPtr();
|
||||
NS_IMETHOD SetAttachedViewPtr(ViewWrapper* aViewWrapper);
|
||||
virtual nsIWidgetListener* GetAttachedWidgetListener();
|
||||
virtual void SetAttachedWidgetListener(nsIWidgetListener* aListener);
|
||||
NS_IMETHOD RegisterTouchWindow();
|
||||
NS_IMETHOD UnregisterTouchWindow();
|
||||
|
||||
@@ -329,7 +329,7 @@ protected:
|
||||
void DestroyCompositor();
|
||||
|
||||
nsIWidgetListener* mWidgetListener;
|
||||
ViewWrapper* mViewWrapperPtr;
|
||||
nsIWidgetListener* mAttachedWidgetListener;
|
||||
nsDeviceContext* mContext;
|
||||
nsRefPtr<LayerManager> mLayerManager;
|
||||
nsRefPtr<LayerManager> mBasicLayerManager;
|
||||
|
||||
Reference in New Issue
Block a user