mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1261752. Part 3. r=mats a=ritu
This commit is contained in:
parent
9d6c5fedee
commit
0dbe2411a9
@ -1473,7 +1473,11 @@ nsComboboxControlFrame::Rollup(uint32_t aCount, bool aFlush,
|
||||
// The popup's visibility doesn't update until the minimize animation has
|
||||
// finished, so call UpdateWidgetGeometry to update it right away.
|
||||
nsViewManager* viewManager = mDropdownFrame->GetView()->GetViewManager();
|
||||
viewManager->UpdateWidgetGeometry();
|
||||
viewManager->UpdateWidgetGeometry(); // might destroy us
|
||||
}
|
||||
|
||||
if (!weakFrame.IsAlive()) {
|
||||
return consume;
|
||||
}
|
||||
|
||||
if (aLastRolledUp) {
|
||||
|
@ -693,15 +693,16 @@ void nsViewManager::InvalidateViews(nsView *aView)
|
||||
|
||||
void nsViewManager::WillPaintWindow(nsIWidget* aWidget)
|
||||
{
|
||||
if (aWidget) {
|
||||
nsView* view = nsView::GetViewFor(aWidget);
|
||||
LayerManager *manager = aWidget->GetLayerManager();
|
||||
RefPtr<nsIWidget> widget(aWidget);
|
||||
if (widget) {
|
||||
nsView* view = nsView::GetViewFor(widget);
|
||||
LayerManager* manager = widget->GetLayerManager();
|
||||
if (view &&
|
||||
(view->ForcedRepaint() || !manager->NeedsWidgetInvalidation())) {
|
||||
ProcessPendingUpdates();
|
||||
// Re-get the view pointer here since the ProcessPendingUpdates might have
|
||||
// destroyed it during CallWillPaintOnObservers.
|
||||
view = nsView::GetViewFor(aWidget);
|
||||
view = nsView::GetViewFor(widget);
|
||||
if (view) {
|
||||
view->SetForcedRepaint(false);
|
||||
}
|
||||
|
@ -1048,6 +1048,8 @@ PuppetWidget::Paint()
|
||||
mDirtyRegion.SetEmpty();
|
||||
mPaintTask.Revoke();
|
||||
|
||||
RefPtr<PuppetWidget> strongThis(this);
|
||||
|
||||
GetCurrentWidgetListener()->WillPaintWindow(this);
|
||||
|
||||
if (GetCurrentWidgetListener()) {
|
||||
|
@ -4001,6 +4001,8 @@ NSEvent* gLastDragMouseDownEvent = nil;
|
||||
|
||||
- (void)viewWillDraw
|
||||
{
|
||||
nsAutoRetainCocoaObject kungFuDeathGrip(self);
|
||||
|
||||
if (mGeckoChild) {
|
||||
// The OS normally *will* draw our NSWindow, no matter what we do here.
|
||||
// But Gecko can delete our parent widget(s) (along with mGeckoChild)
|
||||
|
@ -104,7 +104,7 @@ nsWindow::DoDraw(void)
|
||||
return;
|
||||
}
|
||||
|
||||
nsWindow *targetWindow = (nsWindow *)windows[0];
|
||||
RefPtr<nsWindow> targetWindow = (nsWindow *)windows[0];
|
||||
while (targetWindow->GetLastChild()) {
|
||||
targetWindow = (nsWindow *)targetWindow->GetLastChild();
|
||||
}
|
||||
@ -114,15 +114,15 @@ nsWindow::DoDraw(void)
|
||||
listener->WillPaintWindow(targetWindow);
|
||||
}
|
||||
|
||||
LayerManager* lm = targetWindow->GetLayerManager();
|
||||
if (mozilla::layers::LayersBackend::LAYERS_CLIENT == lm->GetBackendType()) {
|
||||
// No need to do anything, the compositor will handle drawing
|
||||
} else {
|
||||
NS_RUNTIMEABORT("Unexpected layer manager type");
|
||||
}
|
||||
|
||||
listener = targetWindow->GetWidgetListener();
|
||||
if (listener) {
|
||||
LayerManager* lm = targetWindow->GetLayerManager();
|
||||
if (mozilla::layers::LayersBackend::LAYERS_CLIENT == lm->GetBackendType()) {
|
||||
// No need to do anything, the compositor will handle drawing
|
||||
} else {
|
||||
NS_RUNTIMEABORT("Unexpected layer manager type");
|
||||
}
|
||||
|
||||
listener->DidPaintWindow();
|
||||
}
|
||||
}
|
||||
|
@ -556,6 +556,12 @@ nsWindow::MaybeDispatchResized()
|
||||
}
|
||||
}
|
||||
|
||||
nsIWidgetListener*
|
||||
nsWindow::GetListener()
|
||||
{
|
||||
return mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsWindow::DispatchEvent(WidgetGUIEvent* aEvent, nsEventStatus& aStatus)
|
||||
{
|
||||
@ -564,8 +570,7 @@ nsWindow::DispatchEvent(WidgetGUIEvent* aEvent, nsEventStatus& aStatus)
|
||||
nsAutoCString("something"), 0);
|
||||
#endif
|
||||
aStatus = nsEventStatus_eIgnore;
|
||||
nsIWidgetListener* listener =
|
||||
mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
|
||||
nsIWidgetListener* listener = GetListener();
|
||||
if (listener) {
|
||||
aStatus = listener->HandleEvent(aEvent, mUseAttachedEvents);
|
||||
}
|
||||
@ -2122,8 +2127,7 @@ nsWindow::OnExposeEvent(cairo_t *cr)
|
||||
if (!mGdkWindow || mIsFullyObscured || !mHasMappedToplevel)
|
||||
return FALSE;
|
||||
|
||||
nsIWidgetListener *listener =
|
||||
mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
|
||||
nsIWidgetListener *listener = GetListener();
|
||||
if (!listener)
|
||||
return FALSE;
|
||||
|
||||
@ -2152,6 +2156,8 @@ nsWindow::OnExposeEvent(cairo_t *cr)
|
||||
clientLayers->SendInvalidRegion(region.ToUnknownRegion());
|
||||
}
|
||||
|
||||
RefPtr<nsWindow> strongThis(this);
|
||||
|
||||
// Dispatch WillPaintWindow notification to allow scripts etc. to run
|
||||
// before we paint
|
||||
{
|
||||
@ -2164,8 +2170,7 @@ nsWindow::OnExposeEvent(cairo_t *cr)
|
||||
|
||||
// Re-get the listener since the will paint notification might have
|
||||
// killed it.
|
||||
listener =
|
||||
mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
|
||||
listener = GetListener();
|
||||
if (!listener)
|
||||
return FALSE;
|
||||
}
|
||||
@ -2226,6 +2231,13 @@ nsWindow::OnExposeEvent(cairo_t *cr)
|
||||
// If this widget uses OMTC...
|
||||
if (GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_CLIENT) {
|
||||
listener->PaintWindow(this, region);
|
||||
|
||||
// Re-get the listener since the will paint notification might have
|
||||
// killed it.
|
||||
listener = GetListener();
|
||||
if (!listener)
|
||||
return TRUE;
|
||||
|
||||
listener->DidPaintWindow();
|
||||
return TRUE;
|
||||
}
|
||||
@ -2292,6 +2304,13 @@ nsWindow::OnExposeEvent(cairo_t *cr)
|
||||
}
|
||||
AutoLayerManagerSetup setupLayerManager(this, ctx, layerBuffering);
|
||||
painted = listener->PaintWindow(this, region);
|
||||
|
||||
// Re-get the listener since the will paint notification might have
|
||||
// killed it.
|
||||
listener = GetListener();
|
||||
if (!listener)
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -424,6 +424,7 @@ private:
|
||||
GdkWindow** aWindow, gint* aButton,
|
||||
gint* aRootX, gint* aRootY);
|
||||
void ClearCachedResources();
|
||||
nsIWidgetListener* GetListener();
|
||||
|
||||
GtkWidget *mShell;
|
||||
MozContainer *mContainer;
|
||||
|
@ -857,18 +857,28 @@ nsWindow::SetTitle(const nsAString& aTitle)
|
||||
|
||||
// EVENTS
|
||||
|
||||
nsIWidgetListener*
|
||||
nsWindow::GetPaintListener()
|
||||
{
|
||||
return mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
|
||||
}
|
||||
|
||||
void
|
||||
nsWindow::OnPaint()
|
||||
{
|
||||
LOGDRAW(("nsWindow::%s [%p]\n", __FUNCTION__, (void *)this));
|
||||
nsIWidgetListener* listener =
|
||||
mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
|
||||
nsIWidgetListener* listener = GetPaintListener();
|
||||
if (!listener) {
|
||||
return;
|
||||
}
|
||||
|
||||
listener->WillPaintWindow(this);
|
||||
|
||||
nsIWidgetListener* listener = GetPaintListener();
|
||||
if (!listener) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (GetLayerManager()->GetBackendType()) {
|
||||
case mozilla::layers::LayersBackend::LAYERS_CLIENT: {
|
||||
LayoutDeviceIntRegion region(
|
||||
@ -880,6 +890,11 @@ nsWindow::OnPaint()
|
||||
NS_ERROR("Invalid layer manager");
|
||||
}
|
||||
|
||||
nsIWidgetListener* listener = GetPaintListener();
|
||||
if (!listener) {
|
||||
return;
|
||||
}
|
||||
|
||||
listener->DidPaintWindow();
|
||||
}
|
||||
|
||||
|
@ -254,6 +254,7 @@ private:
|
||||
bool needDispatch;
|
||||
} MozCachedMoveEvent;
|
||||
|
||||
nsIWidgetListener* GetPaintListener();
|
||||
bool CheckForRollup(double aMouseX, double aMouseY, bool aIsWheel);
|
||||
void* SetupPluginPort(void);
|
||||
nsresult SetWindowIconList(const nsTArray<nsCString> &aIconList);
|
||||
|
@ -290,6 +290,8 @@ bool nsWindow::OnPaint(HDC aDC, uint32_t aNestingLevel)
|
||||
clientLayerManager->SendInvalidRegion(region);
|
||||
}
|
||||
|
||||
RefPtr<nsWindow> strongThis(this);
|
||||
|
||||
nsIWidgetListener* listener = GetPaintListener();
|
||||
if (listener) {
|
||||
listener->WillPaintWindow(this);
|
||||
|
Loading…
Reference in New Issue
Block a user