Bug 743975 - remove the view wrapper,r=tn
This commit is contained in:
@@ -16,196 +16,6 @@
|
|||||||
#include "nsXULPopupManager.h"
|
#include "nsXULPopupManager.h"
|
||||||
#include "nsIWidgetListener.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)
|
nsView::nsView(nsViewManager* aViewManager, nsViewVisibility aVisibility)
|
||||||
{
|
{
|
||||||
MOZ_COUNT_CTOR(nsView);
|
MOZ_COUNT_CTOR(nsView);
|
||||||
@@ -285,19 +95,12 @@ void nsView::DestroyWidget()
|
|||||||
{
|
{
|
||||||
if (mWindow)
|
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
|
// 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
|
// 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
|
// 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.
|
// Destroy. Just clear our event view ptr and free our reference to it.
|
||||||
if (mWidgetIsTopLevel) {
|
if (mWidgetIsTopLevel) {
|
||||||
ViewWrapper* wrapper = GetAttachedWrapperFor(mWindow);
|
mWindow->SetAttachedWidgetListener(nullptr);
|
||||||
NS_IF_RELEASE(wrapper);
|
|
||||||
|
|
||||||
mWindow->SetAttachedViewPtr(nullptr);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
mWindow->SetWidgetListener(nullptr);
|
mWindow->SetWidgetListener(nullptr);
|
||||||
@@ -331,17 +134,15 @@ nsIView* nsIView::GetViewFor(nsIWidget* aWidget)
|
|||||||
{
|
{
|
||||||
NS_PRECONDITION(nullptr != aWidget, "null widget ptr");
|
NS_PRECONDITION(nullptr != aWidget, "null widget ptr");
|
||||||
|
|
||||||
ViewWrapper* wrapper = GetWrapperFor(aWidget);
|
nsIWidgetListener* listener = aWidget->GetWidgetListener();
|
||||||
|
if (listener) {
|
||||||
if (!wrapper) {
|
nsIView* view = listener->GetView();
|
||||||
wrapper = GetAttachedWrapperFor(aWidget);
|
if (view)
|
||||||
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wrapper) {
|
listener = aWidget->GetAttachedWidgetListener();
|
||||||
return wrapper->GetView();
|
return listener ? listener->GetView() : nullptr;
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void nsIView::Destroy()
|
void nsIView::Destroy()
|
||||||
@@ -826,9 +627,7 @@ nsView::InitializeWindow(bool aEnableDragDrop, bool aResetVisibility)
|
|||||||
{
|
{
|
||||||
NS_ABORT_IF_FALSE(mWindow, "Must have a window to initialize");
|
NS_ABORT_IF_FALSE(mWindow, "Must have a window to initialize");
|
||||||
|
|
||||||
ViewWrapper* wrapper = new ViewWrapper(this);
|
mWindow->SetWidgetListener(this);
|
||||||
NS_ADDREF(wrapper); // Will be released in ~nsView
|
|
||||||
mWindow->SetWidgetListener(wrapper);
|
|
||||||
|
|
||||||
if (aEnableDragDrop) {
|
if (aEnableDragDrop) {
|
||||||
mWindow->EnableDragDrop(true);
|
mWindow->EnableDragDrop(true);
|
||||||
@@ -850,10 +649,13 @@ nsresult nsIView::AttachToTopLevelWidget(nsIWidget* aWidget)
|
|||||||
NS_PRECONDITION(nullptr != aWidget, "null widget ptr");
|
NS_PRECONDITION(nullptr != aWidget, "null widget ptr");
|
||||||
/// XXXjimm This is a temporary workaround to an issue w/document
|
/// XXXjimm This is a temporary workaround to an issue w/document
|
||||||
// viewer (bug 513162).
|
// viewer (bug 513162).
|
||||||
nsIView *oldView = GetAttachedViewFor(aWidget);
|
nsIWidgetListener* listener = aWidget->GetAttachedWidgetListener();
|
||||||
|
if (listener) {
|
||||||
|
nsIView *oldView = listener->GetView();
|
||||||
if (oldView) {
|
if (oldView) {
|
||||||
oldView->DetachFromTopLevelWidget();
|
oldView->DetachFromTopLevelWidget();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
nsRefPtr<nsDeviceContext> dx;
|
nsRefPtr<nsDeviceContext> dx;
|
||||||
mViewManager->GetDeviceContext(*getter_AddRefs(dx));
|
mViewManager->GetDeviceContext(*getter_AddRefs(dx));
|
||||||
@@ -867,9 +669,7 @@ nsresult nsIView::AttachToTopLevelWidget(nsIWidget* aWidget)
|
|||||||
mWindow = aWidget;
|
mWindow = aWidget;
|
||||||
NS_ADDREF(mWindow);
|
NS_ADDREF(mWindow);
|
||||||
|
|
||||||
ViewWrapper* wrapper = new ViewWrapper(Impl());
|
mWindow->SetAttachedWidgetListener(Impl());
|
||||||
NS_ADDREF(wrapper);
|
|
||||||
mWindow->SetAttachedViewPtr(wrapper);
|
|
||||||
mWindow->EnableDragDrop(true);
|
mWindow->EnableDragDrop(true);
|
||||||
mWidgetIsTopLevel = true;
|
mWidgetIsTopLevel = true;
|
||||||
|
|
||||||
@@ -887,11 +687,7 @@ nsresult nsIView::DetachFromTopLevelWidget()
|
|||||||
NS_PRECONDITION(mWidgetIsTopLevel, "Not attached currently!");
|
NS_PRECONDITION(mWidgetIsTopLevel, "Not attached currently!");
|
||||||
NS_PRECONDITION(mWindow, "null mWindow for DetachFromTopLevelWidget!");
|
NS_PRECONDITION(mWindow, "null mWindow for DetachFromTopLevelWidget!");
|
||||||
|
|
||||||
// Release memory for the view wrapper
|
mWindow->SetAttachedWidgetListener(nullptr);
|
||||||
ViewWrapper* wrapper = GetAttachedWrapperFor(mWindow);
|
|
||||||
NS_IF_RELEASE(wrapper);
|
|
||||||
|
|
||||||
mWindow->SetAttachedViewPtr(nullptr);
|
|
||||||
NS_RELEASE(mWindow);
|
NS_RELEASE(mWindow);
|
||||||
|
|
||||||
mWidgetIsTopLevel = false;
|
mWidgetIsTopLevel = false;
|
||||||
@@ -916,8 +712,6 @@ void nsView::AssertNoWindow()
|
|||||||
// XXX: it would be nice to make this a strong assert
|
// XXX: it would be nice to make this a strong assert
|
||||||
if (NS_UNLIKELY(mWindow)) {
|
if (NS_UNLIKELY(mWindow)) {
|
||||||
NS_ERROR("We already have a window for this view? BAD");
|
NS_ERROR("We already have a window for this view? BAD");
|
||||||
ViewWrapper* wrapper = GetWrapperFor(mWindow);
|
|
||||||
NS_IF_RELEASE(wrapper);
|
|
||||||
mWindow->SetWidgetListener(nullptr);
|
mWindow->SetWidgetListener(nullptr);
|
||||||
mWindow->Destroy();
|
mWindow->Destroy();
|
||||||
NS_RELEASE(mWindow);
|
NS_RELEASE(mWindow);
|
||||||
@@ -933,18 +727,13 @@ void nsIView::AttachWidgetEventHandler(nsIWidget* aWidget)
|
|||||||
NS_ASSERTION(!aWidget->GetWidgetListener(), "Already have a widget listener");
|
NS_ASSERTION(!aWidget->GetWidgetListener(), "Already have a widget listener");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ViewWrapper* wrapper = new ViewWrapper(Impl());
|
aWidget->SetWidgetListener(Impl());
|
||||||
if (!wrapper)
|
|
||||||
return;
|
|
||||||
NS_ADDREF(wrapper); // Will be released in DetachWidgetEventHandler
|
|
||||||
aWidget->SetWidgetListener(wrapper);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void nsIView::DetachWidgetEventHandler(nsIWidget* aWidget)
|
void nsIView::DetachWidgetEventHandler(nsIWidget* aWidget)
|
||||||
{
|
{
|
||||||
ViewWrapper* wrapper = GetWrapperFor(aWidget);
|
NS_ASSERTION(!aWidget->GetWidgetListener() ||
|
||||||
NS_ASSERTION(!wrapper || wrapper->GetView() == this, "Wrong view");
|
aWidget->GetWidgetListener()->GetView() == this, "Wrong view");
|
||||||
NS_IF_RELEASE(wrapper);
|
|
||||||
aWidget->SetWidgetListener(nullptr);
|
aWidget->SetWidgetListener(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1165,3 +954,110 @@ nsIView::ConvertFromParentCoords(nsPoint aPt) const
|
|||||||
aPt -= GetPosition();
|
aPt -= GetPosition();
|
||||||
return aPt;
|
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 "nsCRT.h"
|
||||||
#include "nsIFactory.h"
|
#include "nsIFactory.h"
|
||||||
#include "nsEvent.h"
|
#include "nsEvent.h"
|
||||||
|
#include "nsIWidgetListener.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
//mmptemp
|
//mmptemp
|
||||||
@@ -19,7 +20,8 @@
|
|||||||
class nsIViewManager;
|
class nsIViewManager;
|
||||||
class nsViewManager;
|
class nsViewManager;
|
||||||
|
|
||||||
class nsView : public nsIView
|
class nsView : public nsIView,
|
||||||
|
public nsIWidgetListener
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
nsView(nsViewManager* aViewManager = nullptr,
|
nsView(nsViewManager* aViewManager = nullptr,
|
||||||
@@ -155,6 +157,17 @@ public:
|
|||||||
// released if it points to any view in this view hierarchy.
|
// released if it points to any view in this view hierarchy.
|
||||||
void InvalidateHierarchy(nsViewManager *aViewManagerParent);
|
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();
|
virtual ~nsView();
|
||||||
|
|
||||||
nsPoint GetOffsetTo(const nsView* aOther) const;
|
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
|
// 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
|
// base chrome window with the main content child for nc client area (title
|
||||||
// bar) rendering.
|
// bar) rendering.
|
||||||
if (mViewWrapperPtr) {
|
if (mAttachedWidgetListener) {
|
||||||
aStatus = mViewWrapperPtr->HandleEvent(event, mUseAttachedEvents);
|
aStatus = mAttachedWidgetListener->HandleEvent(event, mUseAttachedEvents);
|
||||||
}
|
}
|
||||||
else if (mWidgetListener) {
|
else if (mWidgetListener) {
|
||||||
aStatus = mWidgetListener->HandleEvent(event, mUseAttachedEvents);
|
aStatus = mWidgetListener->HandleEvent(event, mUseAttachedEvents);
|
||||||
@@ -6934,6 +6934,7 @@ void nsWindow::OnDestroy()
|
|||||||
|
|
||||||
// Prevent the widget from sending additional events.
|
// Prevent the widget from sending additional events.
|
||||||
mWidgetListener = nullptr;
|
mWidgetListener = nullptr;
|
||||||
|
mAttachedWidgetListener = nullptr;
|
||||||
|
|
||||||
// Free our subclass and clear |this| stored in the window props. We will no longer
|
// Free our subclass and clear |this| stored in the window props. We will no longer
|
||||||
// receive events from Windows after this point.
|
// receive events from Windows after this point.
|
||||||
@@ -7024,8 +7025,8 @@ bool nsWindow::OnResize(nsIntRect &aWindowRect)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// If there is an attached view, inform it as well as the normal widget listener.
|
// If there is an attached view, inform it as well as the normal widget listener.
|
||||||
if (mViewWrapperPtr) {
|
if (mAttachedWidgetListener) {
|
||||||
mViewWrapperPtr->WindowResized(this, aWindowRect.width, aWindowRect.height);
|
mAttachedWidgetListener->WindowResized(this, aWindowRect.width, aWindowRect.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
return mWidgetListener ?
|
return mWidgetListener ?
|
||||||
|
|||||||
@@ -235,7 +235,7 @@ bool nsWindow::OnPaint(HDC aDC, PRUint32 aNestingLevel)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsIWidgetListener* listener = mViewWrapperPtr ? mViewWrapperPtr : mWidgetListener;
|
nsIWidgetListener* listener = mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
|
||||||
if (listener) {
|
if (listener) {
|
||||||
listener->WillPaintWindow(this, true);
|
listener->WillPaintWindow(this, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -182,11 +182,8 @@ PuppetWidget::Resize(PRInt32 aWidth,
|
|||||||
InvalidateRegion(this, dirty);
|
InvalidateRegion(this, dirty);
|
||||||
}
|
}
|
||||||
|
|
||||||
// XXXndeakin this isn't the right widget listener to use. It should use
|
if (!oldBounds.IsEqualEdges(mBounds) && mAttachedWidgetListener) {
|
||||||
// the view wrapper pointer but that won't compile. This will be fixed up
|
mAttachedWidgetListener->WindowResized(this, mBounds.width, mBounds.height);
|
||||||
// in a later patch.
|
|
||||||
if (!oldBounds.IsEqualEdges(mBounds) && mWidgetListener) {
|
|
||||||
mWidgetListener->WindowResized(this, mBounds.width, mBounds.height);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
@@ -250,7 +247,7 @@ PuppetWidget::DispatchEvent(nsGUIEvent* event, nsEventStatus& aStatus)
|
|||||||
|
|
||||||
aStatus = nsEventStatus_eIgnore;
|
aStatus = nsEventStatus_eIgnore;
|
||||||
|
|
||||||
NS_ABORT_IF_FALSE(mViewWrapperPtr, "No listener!");
|
NS_ABORT_IF_FALSE(mAttachedWidgetListener, "No listener!");
|
||||||
|
|
||||||
if (event->message == NS_COMPOSITION_START) {
|
if (event->message == NS_COMPOSITION_START) {
|
||||||
mIMEComposing = true;
|
mIMEComposing = true;
|
||||||
@@ -273,7 +270,7 @@ PuppetWidget::DispatchEvent(nsGUIEvent* event, nsEventStatus& aStatus)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
aStatus = mViewWrapperPtr->HandleEvent(event, mUseAttachedEvents);
|
aStatus = mAttachedWidgetListener->HandleEvent(event, mUseAttachedEvents);
|
||||||
|
|
||||||
if (event->message == NS_COMPOSITION_END) {
|
if (event->message == NS_COMPOSITION_END) {
|
||||||
mIMEComposing = false;
|
mIMEComposing = false;
|
||||||
@@ -482,7 +479,7 @@ PuppetWidget::Paint()
|
|||||||
{
|
{
|
||||||
NS_ABORT_IF_FALSE(!mDirtyRegion.IsEmpty(), "paint event logic messed up");
|
NS_ABORT_IF_FALSE(!mDirtyRegion.IsEmpty(), "paint event logic messed up");
|
||||||
|
|
||||||
if (!mWidgetListener)
|
if (!mAttachedWidgetListener)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
||||||
nsIntRegion region = mDirtyRegion;
|
nsIntRegion region = mDirtyRegion;
|
||||||
@@ -498,19 +495,19 @@ PuppetWidget::Paint()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (mozilla::layers::LAYERS_D3D10 == mLayerManager->GetBackendType()) {
|
if (mozilla::layers::LAYERS_D3D10 == mLayerManager->GetBackendType()) {
|
||||||
mWidgetListener->PaintWindow(this, region, false, true);
|
mAttachedWidgetListener->PaintWindow(this, region, false, true);
|
||||||
} else {
|
} else {
|
||||||
nsRefPtr<gfxContext> ctx = new gfxContext(mSurface);
|
nsRefPtr<gfxContext> ctx = new gfxContext(mSurface);
|
||||||
ctx->Rectangle(gfxRect(0,0,0,0));
|
ctx->Rectangle(gfxRect(0,0,0,0));
|
||||||
ctx->Clip();
|
ctx->Clip();
|
||||||
AutoLayerManagerSetup setupLayerManager(this, ctx,
|
AutoLayerManagerSetup setupLayerManager(this, ctx,
|
||||||
BUFFER_NONE);
|
BUFFER_NONE);
|
||||||
mWidgetListener->PaintWindow(this, region, false, true);
|
mAttachedWidgetListener->PaintWindow(this, region, false, true);
|
||||||
mTabChild->NotifyPainted();
|
mTabChild->NotifyPainted();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mWidgetListener->DidPaintWindow();
|
mAttachedWidgetListener->DidPaintWindow();
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ nsAutoRollup::~nsAutoRollup()
|
|||||||
|
|
||||||
nsBaseWidget::nsBaseWidget()
|
nsBaseWidget::nsBaseWidget()
|
||||||
: mWidgetListener(nullptr)
|
: mWidgetListener(nullptr)
|
||||||
, mViewWrapperPtr(nullptr)
|
, mAttachedWidgetListener(nullptr)
|
||||||
, mContext(nullptr)
|
, mContext(nullptr)
|
||||||
, mCursor(eCursor_standard)
|
, mCursor(eCursor_standard)
|
||||||
, mWindowType(eWindowType_child)
|
, mWindowType(eWindowType_child)
|
||||||
@@ -294,15 +294,14 @@ nsBaseWidget::AttachViewToTopLevel(bool aUseAttachedEvents,
|
|||||||
return NS_OK;
|
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;
|
mAttachedWidgetListener = aListener;
|
||||||
return NS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -157,8 +157,8 @@ public:
|
|||||||
nsWidgetInitData *aInitData = nullptr,
|
nsWidgetInitData *aInitData = nullptr,
|
||||||
bool aForceUseIWidgetParent = false);
|
bool aForceUseIWidgetParent = false);
|
||||||
NS_IMETHOD AttachViewToTopLevel(bool aUseAttachedEvents, nsDeviceContext *aContext);
|
NS_IMETHOD AttachViewToTopLevel(bool aUseAttachedEvents, nsDeviceContext *aContext);
|
||||||
virtual ViewWrapper* GetAttachedViewPtr();
|
virtual nsIWidgetListener* GetAttachedWidgetListener();
|
||||||
NS_IMETHOD SetAttachedViewPtr(ViewWrapper* aViewWrapper);
|
virtual void SetAttachedWidgetListener(nsIWidgetListener* aListener);
|
||||||
NS_IMETHOD RegisterTouchWindow();
|
NS_IMETHOD RegisterTouchWindow();
|
||||||
NS_IMETHOD UnregisterTouchWindow();
|
NS_IMETHOD UnregisterTouchWindow();
|
||||||
|
|
||||||
@@ -329,7 +329,7 @@ protected:
|
|||||||
void DestroyCompositor();
|
void DestroyCompositor();
|
||||||
|
|
||||||
nsIWidgetListener* mWidgetListener;
|
nsIWidgetListener* mWidgetListener;
|
||||||
ViewWrapper* mViewWrapperPtr;
|
nsIWidgetListener* mAttachedWidgetListener;
|
||||||
nsDeviceContext* mContext;
|
nsDeviceContext* mContext;
|
||||||
nsRefPtr<LayerManager> mLayerManager;
|
nsRefPtr<LayerManager> mLayerManager;
|
||||||
nsRefPtr<LayerManager> mBasicLayerManager;
|
nsRefPtr<LayerManager> mBasicLayerManager;
|
||||||
|
|||||||
Reference in New Issue
Block a user