зеркало из https://github.com/mozilla/pjs.git
bug 307204, implement support for transparent windows in XUL for Mac OS X. r=josh, sr=roc, approval1.9=damons
This commit is contained in:
Родитель
689db72371
Коммит
fa19e7bfb0
|
@ -3299,13 +3299,13 @@ nsCSSRendering::PaintBackground(nsPresContext* aPresContext,
|
|||
nsIView* rootView;
|
||||
vm->GetRootView(rootView);
|
||||
if (!rootView->GetParent()) {
|
||||
PRBool widgetIsTranslucent = PR_FALSE;
|
||||
PRBool widgetIsTransparent = PR_FALSE;
|
||||
|
||||
if (rootView->HasWidget()) {
|
||||
rootView->GetWidget()->GetWindowTranslucency(widgetIsTranslucent);
|
||||
rootView->GetWidget()->GetHasTransparentBackground(widgetIsTransparent);
|
||||
}
|
||||
|
||||
if (!widgetIsTranslucent) {
|
||||
if (!widgetIsTransparent) {
|
||||
// Ensure that we always paint a color for the root (in case there's
|
||||
// no background at all or a partly transparent image).
|
||||
canvasColor.mBackgroundFlags &= ~NS_STYLE_BG_COLOR_TRANSPARENT;
|
||||
|
|
|
@ -5286,9 +5286,9 @@ PresShell::Paint(nsIView* aView,
|
|||
mViewManager->GetDefaultBackgroundColor(&backgroundColor);
|
||||
for (nsIView *view = aView; view; view = view->GetParent()) {
|
||||
if (view->HasWidget()) {
|
||||
PRBool widgetIsTranslucent;
|
||||
view->GetWidget()->GetWindowTranslucency(widgetIsTranslucent);
|
||||
if (widgetIsTranslucent) {
|
||||
PRBool widgetIsTransparent;
|
||||
view->GetWidget()->GetHasTransparentBackground(widgetIsTransparent);
|
||||
if (widgetIsTransparent) {
|
||||
backgroundColor = NS_RGBA(0,0,0,0);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -458,7 +458,7 @@ SyncFrameViewGeometryDependentProperties(nsPresContext* aPresContext,
|
|||
// don't proceed unless this is the root view
|
||||
// (sometimes the non-root-view is a canvas)
|
||||
if (aView->HasWidget() && aView == rootView) {
|
||||
aView->GetWidget()->SetWindowTranslucency(nsLayoutUtils::FrameHasTransparency(aFrame));
|
||||
aView->GetWidget()->SetHasTransparentBackground(nsLayoutUtils::FrameHasTransparency(aFrame));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -244,7 +244,7 @@ nsMenuPopupFrame::CreateWidgetForView(nsIView* aView)
|
|||
aView->CreateWidget(kCChildCID, &widgetData, nsnull, PR_TRUE, PR_TRUE,
|
||||
eContentTypeInherit, parentWidget);
|
||||
#endif
|
||||
aView->GetWidget()->SetWindowTranslucency(viewHasTransparentContent);
|
||||
aView->GetWidget()->SetHasTransparentBackground(viewHasTransparentContent);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -1028,11 +1028,11 @@ NS_IMETHODIMP nsViewManager::DispatchEvent(nsGUIEvent *aEvent, nsEventStatus *aS
|
|||
nsRefPtr<nsViewManager> rootVM = RootViewManager();
|
||||
|
||||
nsIWidget *widget = mRootView->GetWidget();
|
||||
PRBool translucentWindow = PR_FALSE;
|
||||
PRBool transparentWindow = PR_FALSE;
|
||||
if (widget)
|
||||
widget->GetWindowTranslucency(translucentWindow);
|
||||
widget->GetHasTransparentBackground(transparentWindow);
|
||||
|
||||
if (rootVM->mScrollCnt == 0 && !translucentWindow) {
|
||||
if (rootVM->mScrollCnt == 0 && !transparentWindow) {
|
||||
nsIViewObserver* observer = GetViewObserver();
|
||||
if (observer) {
|
||||
// Do an update view batch. Make sure not to do it DEFERRED,
|
||||
|
|
|
@ -95,13 +95,13 @@ typedef nsEventStatus (*PR_CALLBACK EVENT_CALLBACK)(nsGUIEvent *event);
|
|||
#define NS_NATIVE_PLUGIN_PORT_CG 101
|
||||
#endif
|
||||
|
||||
// d7d1aae8-fcb9-4fe7-be62-b20ffc53f1f9
|
||||
// a6593177-ba36-400e-8812-a0d36b3af17b
|
||||
#define NS_IWIDGET_IID \
|
||||
{ 0xd7d1aae8, 0xfcb9, 0x4fe7, \
|
||||
{ 0xbe, 0x62, 0xb2, 0x0f, 0xfc, 0x53, 0xf1, 0xf9 } }
|
||||
{ 0xa6593177, 0xba36, 0x400e, \
|
||||
{ 0x88, 0x12, 0xa0, 0xd3, 0x6b, 0x3a, 0xf1, 0x7b } }
|
||||
|
||||
// Hide the native window systems real window type so as to avoid
|
||||
// including native window system types and api's. This is necessary
|
||||
// including native window system types and APIs. This is necessary
|
||||
// to ensure cross-platform code.
|
||||
typedef void* nsNativeWidget;
|
||||
|
||||
|
@ -669,29 +669,18 @@ class nsIWidget : public nsISupports {
|
|||
* If the window is resized then the alpha channel values for
|
||||
* all pixels are reset to 1.
|
||||
* Pixel RGB color values are already premultiplied with alpha channel values.
|
||||
* @param aTranslucent true if the window may have translucent
|
||||
* @param aTransparent true if the window may have translucent
|
||||
* or transparent pixels
|
||||
*/
|
||||
NS_IMETHOD SetWindowTranslucency(PRBool aTranslucent) = 0;
|
||||
NS_IMETHOD SetHasTransparentBackground(PRBool aTransparent) = 0;
|
||||
|
||||
/**
|
||||
* Get the translucency of the top-level window that contains this
|
||||
* widget.
|
||||
* @param aTranslucent true if the window may have translucent or
|
||||
* @param aTransparent true if the window may have translucent or
|
||||
* transparent pixels
|
||||
*/
|
||||
NS_IMETHOD GetWindowTranslucency(PRBool& aTranslucent) = 0;
|
||||
|
||||
/**
|
||||
* Update the alpha channel for some pixels of the top-level window
|
||||
* that contains this widget.
|
||||
* The window must have been made translucent using SetWindowTranslucency.
|
||||
* Pixel RGB color values are already premultiplied with alpha channel values.
|
||||
* @param aRect the rect to update
|
||||
* @param aAlphas the alpha values, in w x h array, row-major order,
|
||||
* in units of 1/255. nsBlender::GetAlphas is a good way to compute this array.
|
||||
*/
|
||||
NS_IMETHOD UpdateTranslucentWindowAlpha(const nsRect& aRect, PRUint8* aAlphas) = 0;
|
||||
NS_IMETHOD GetHasTransparentBackground(PRBool& aTransparent) = 0;
|
||||
|
||||
/**
|
||||
* Hide window chrome (borders, buttons) for this widget.
|
||||
|
|
|
@ -111,6 +111,10 @@ union nsPluginPort;
|
|||
NSMutableArray* mPendingDirtyRects;
|
||||
BOOL mPendingFullDisplay;
|
||||
|
||||
// All views are always opaque (non-transparent). The only exception is when we're
|
||||
// the content view in a transparent XUL window.
|
||||
BOOL mIsTransparent;
|
||||
|
||||
// Holds our drag service across multiple drag calls. The reference to the
|
||||
// service is obtained when the mouse enters the view and is released when
|
||||
// the mouse exits or there is a drop. This prevents us from having to
|
||||
|
@ -127,6 +131,7 @@ union nsPluginPort;
|
|||
|
||||
// Stop NSView hierarchy being changed during [ChildView drawRect:]
|
||||
- (void)delayedTearDown;
|
||||
- (void)setTransparent:(BOOL)transparent;
|
||||
@end
|
||||
|
||||
|
||||
|
@ -292,12 +297,13 @@ public:
|
|||
NS_IMETHOD StartDrawPlugin();
|
||||
NS_IMETHOD EndDrawPlugin();
|
||||
|
||||
NS_IMETHOD GetHasTransparentBackground(PRBool& aTransparent);
|
||||
NS_IMETHOD SetHasTransparentBackground(PRBool aTransparent);
|
||||
|
||||
// Mac specific methods
|
||||
virtual PRBool PointInWidget(Point aThePoint);
|
||||
|
||||
virtual PRBool DispatchWindowEvent(nsGUIEvent& event);
|
||||
virtual void AcceptFocusOnClick(PRBool aBool) { mAcceptFocusOnClick = aBool;};
|
||||
PRBool AcceptFocusOnClick() { return mAcceptFocusOnClick;};
|
||||
|
||||
void LiveResizeStarted();
|
||||
void LiveResizeEnded();
|
||||
|
@ -345,8 +351,7 @@ protected:
|
|||
PRPackedBool mVisible;
|
||||
|
||||
PRPackedBool mDrawing;
|
||||
|
||||
PRPackedBool mAcceptFocusOnClick;
|
||||
|
||||
PRPackedBool mLiveResizeInProgress;
|
||||
PRPackedBool mIsPluginView; // true if this is a plugin view
|
||||
PRPackedBool mPluginDrawing;
|
||||
|
|
|
@ -46,7 +46,6 @@
|
|||
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsToolkit.h"
|
||||
#include "prmem.h"
|
||||
#include "nsCRT.h"
|
||||
#include "nsplugindefs.h"
|
||||
#include "nsThreadUtils.h"
|
||||
|
@ -343,7 +342,6 @@ nsChildView::nsChildView() : nsBaseWidget()
|
|||
, mDestructorCalled(PR_FALSE)
|
||||
, mVisible(PR_FALSE)
|
||||
, mDrawing(PR_FALSE)
|
||||
, mAcceptFocusOnClick(PR_TRUE)
|
||||
, mLiveResizeInProgress(PR_FALSE)
|
||||
, mIsPluginView(PR_FALSE)
|
||||
, mPluginDrawing(PR_FALSE)
|
||||
|
@ -655,8 +653,34 @@ void* nsChildView::GetNativeData(PRUint32 aDataType)
|
|||
|
||||
#pragma mark -
|
||||
|
||||
NS_IMETHODIMP nsChildView::GetHasTransparentBackground(PRBool& aTransparent)
|
||||
{
|
||||
aTransparent = ![mView isOpaque];
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
// This is called by nsContainerFrame on the root widget for all window types
|
||||
// except popup windows (when nsCocoaWindow::SetHasTransparentBackground is used instead).
|
||||
NS_IMETHODIMP nsChildView::SetHasTransparentBackground(PRBool aTransparent)
|
||||
{
|
||||
BOOL currentTransparency = ![[mView nativeWindow] isOpaque];
|
||||
if (aTransparent != currentTransparency) {
|
||||
// Find out if this is a window we created by seeing if the delegate is WindowDelegate. If it is,
|
||||
// tell the nsCocoaWindow to set its background to transparent.
|
||||
id windowDelegate = [[mView nativeWindow] delegate];
|
||||
if (windowDelegate && [windowDelegate isKindOfClass:[WindowDelegate class]]) {
|
||||
nsCocoaWindow *widget = [(WindowDelegate *)windowDelegate geckoWidget];
|
||||
if (widget) {
|
||||
widget->MakeBackgroundTransparent(aTransparent);
|
||||
[mView setTransparent:aTransparent];
|
||||
}
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
// Return PR_TRUE if the whether the component is visible, PR_FALSE otherwise
|
||||
NS_IMETHODIMP nsChildView::IsVisible(PRBool& outState)
|
||||
{
|
||||
if (!mVisible) {
|
||||
|
@ -2042,10 +2066,15 @@ NSEvent* gLastDragEvent = nil;
|
|||
}
|
||||
|
||||
|
||||
- (void)setTransparent:(BOOL)transparent
|
||||
{
|
||||
mIsTransparent = transparent;
|
||||
}
|
||||
|
||||
|
||||
- (BOOL)isOpaque
|
||||
{
|
||||
// this will be NO when we can do transparent windows/views
|
||||
return YES;
|
||||
return !mIsTransparent;
|
||||
}
|
||||
|
||||
|
||||
|
@ -2171,11 +2200,6 @@ NSEvent* gLastDragEvent = nil;
|
|||
PRBool isVisible;
|
||||
if (!mGeckoChild || NS_FAILED(mGeckoChild->IsVisible(isVisible)) || !isVisible)
|
||||
return;
|
||||
|
||||
// Workaround for the fact that NSQuickDrawViews can't be opaque; see if the rect
|
||||
// being drawn is covered by a subview, and, if so, just bail.
|
||||
if ([self isRectObscuredBySubview:aRect])
|
||||
return;
|
||||
|
||||
CGContextRef cgContext = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
|
||||
|
||||
|
@ -2262,22 +2286,6 @@ NSEvent* gLastDragEvent = nil;
|
|||
}
|
||||
|
||||
|
||||
- (BOOL)isRectObscuredBySubview:(NSRect)inRect
|
||||
{
|
||||
unsigned int numSubviews = [[self subviews] count];
|
||||
for (unsigned int i = 0; i < numSubviews; i++) {
|
||||
NSView* view = (NSView*)[[self subviews] objectAtIndex:i];
|
||||
if (![view isHidden]) {
|
||||
NSRect subviewFrame = [view frame];
|
||||
if (NSContainsRect(subviewFrame, inRect))
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
|
||||
// Allows us to turn off setting up the clip region
|
||||
// before each drawRect. We already clip within gecko.
|
||||
- (BOOL)wantsDefaultClipping
|
||||
|
|
|
@ -237,6 +237,8 @@ public:
|
|||
NS_IMETHOD DispatchEvent(nsGUIEvent* event, nsEventStatus & aStatus) ;
|
||||
NS_IMETHOD CaptureRollupEvents(nsIRollupListener * aListener, PRBool aDoCapture, PRBool aConsumeRollupEvent);
|
||||
NS_IMETHOD GetAttention(PRInt32 aCycleCount);
|
||||
NS_IMETHOD GetHasTransparentBackground(PRBool& aTransparent);
|
||||
NS_IMETHOD SetHasTransparentBackground(PRBool aTransparent);
|
||||
NS_IMETHOD SetWindowTitlebarColor(nscolor aColor);
|
||||
|
||||
virtual gfxASurface* GetThebesSurface();
|
||||
|
@ -251,6 +253,8 @@ public:
|
|||
|
||||
// nsIKBStateControl interface
|
||||
NS_IMETHOD ResetInputState();
|
||||
|
||||
void MakeBackgroundTransparent(PRBool aTransparent);
|
||||
|
||||
NS_IMETHOD BeginSecureKeyboardInput();
|
||||
NS_IMETHOD EndSecureKeyboardInput();
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* -*- Mode: Objective-C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
|
@ -67,6 +67,8 @@ extern BOOL gSomeMenuBarPainted;
|
|||
|
||||
#define NS_APPSHELLSERVICE_CONTRACTID "@mozilla.org/appshell/appShellService;1"
|
||||
|
||||
#define POPUP_DEFAULT_TRANSPARENCY 0.95
|
||||
|
||||
NS_IMPL_ISUPPORTS_INHERITED1(nsCocoaWindow, Inherited, nsPIWidgetCocoa)
|
||||
|
||||
|
||||
|
@ -372,10 +374,10 @@ nsresult nsCocoaWindow::StandardCreate(nsIWidget *aParent,
|
|||
|
||||
// Create the window
|
||||
mWindow = [[windowClass alloc] initWithContentRect:rect styleMask:features
|
||||
backing:NSBackingStoreBuffered defer:NO];
|
||||
backing:NSBackingStoreBuffered defer:YES];
|
||||
|
||||
if (mWindowType == eWindowType_popup) {
|
||||
[mWindow setAlphaValue:0.95];
|
||||
[mWindow setAlphaValue:POPUP_DEFAULT_TRANSPARENCY];
|
||||
[mWindow setLevel:NSPopUpMenuWindowLevel];
|
||||
[mWindow setHasShadow:YES];
|
||||
|
||||
|
@ -698,6 +700,48 @@ NS_IMETHODIMP nsCocoaWindow::Show(PRBool bState)
|
|||
}
|
||||
|
||||
|
||||
void nsCocoaWindow::MakeBackgroundTransparent(PRBool aTransparent)
|
||||
{
|
||||
BOOL currentTransparency = ![mWindow isOpaque];
|
||||
if (aTransparent != currentTransparency) {
|
||||
// Popups have an alpha value we need to toggle.
|
||||
if (mWindowType == eWindowType_popup) {
|
||||
[mWindow setAlphaValue:(aTransparent ? 1.0 : POPUP_DEFAULT_TRANSPARENCY)];
|
||||
}
|
||||
[mWindow setOpaque:!aTransparent];
|
||||
[mWindow setBackgroundColor:(aTransparent ? [NSColor clearColor] : [NSColor whiteColor])];
|
||||
[mWindow setHasShadow:!aTransparent];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP nsCocoaWindow::GetHasTransparentBackground(PRBool& aTransparent)
|
||||
{
|
||||
aTransparent = ![mWindow isOpaque];
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
// This is called from nsMenuPopupFrame when making a popup transparent.
|
||||
// For other window types, nsChildView::SetHasTransparentBackground is used.
|
||||
NS_IMETHODIMP nsCocoaWindow::SetHasTransparentBackground(PRBool aTransparent)
|
||||
{
|
||||
BOOL currentTransparency = ![mWindow isOpaque];
|
||||
if (aTransparent != currentTransparency) {
|
||||
// Take care of window transparency
|
||||
MakeBackgroundTransparent(aTransparent);
|
||||
// Make sure our content view is also transparent
|
||||
if (mPopupContentView) {
|
||||
ChildView *childView = (ChildView*)mPopupContentView->GetNativeData(NS_NATIVE_WIDGET);
|
||||
if (childView) {
|
||||
[childView setTransparent:aTransparent];
|
||||
}
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
NS_METHOD nsCocoaWindow::AddMouseListener(nsIMouseListener * aListener)
|
||||
{
|
||||
nsBaseWidget::AddMouseListener(aListener);
|
||||
|
|
|
@ -347,7 +347,7 @@ nsWindow::nsWindow()
|
|||
mRootAccessible = nsnull;
|
||||
#endif
|
||||
|
||||
mIsTranslucent = PR_FALSE;
|
||||
mIsTransparent = PR_FALSE;
|
||||
mTransparencyBitmap = nsnull;
|
||||
|
||||
mTransparencyBitmapWidth = 0;
|
||||
|
@ -1663,7 +1663,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent)
|
|||
}
|
||||
|
||||
PRBool translucent;
|
||||
GetWindowTranslucency(translucent);
|
||||
GetHasTransparentBackground(translucent);
|
||||
nsIntRect boundsRect;
|
||||
GdkPixmap* bufferPixmap = nsnull;
|
||||
nsRefPtr<gfxXlibSurface> bufferPixmapSurface;
|
||||
|
@ -3465,7 +3465,7 @@ nsWindow::EnsureGrabs(void)
|
|||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsWindow::SetWindowTranslucency(PRBool aTranslucent)
|
||||
nsWindow::SetHasTransparentBackground(PRBool aTransparent)
|
||||
{
|
||||
if (!mShell) {
|
||||
// Pass the request to the toplevel window
|
||||
|
@ -3478,13 +3478,13 @@ nsWindow::SetWindowTranslucency(PRBool aTranslucent)
|
|||
if (!topWindow)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
return topWindow->SetWindowTranslucency(aTranslucent);
|
||||
return topWindow->SetHasTransparentBackground(aTransparent);
|
||||
}
|
||||
|
||||
if (mIsTranslucent == aTranslucent)
|
||||
if (mIsTransparent == aTransparent)
|
||||
return NS_OK;
|
||||
|
||||
if (!aTranslucent) {
|
||||
if (!aTransparent) {
|
||||
if (mTransparencyBitmap) {
|
||||
delete[] mTransparencyBitmap;
|
||||
mTransparencyBitmap = nsnull;
|
||||
|
@ -3495,32 +3495,32 @@ nsWindow::SetWindowTranslucency(PRBool aTranslucent)
|
|||
} // else the new default alpha values are "all 1", so we don't
|
||||
// need to change anything yet
|
||||
|
||||
mIsTranslucent = aTranslucent;
|
||||
mIsTransparent = aTransparent;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsWindow::GetWindowTranslucency(PRBool& aTranslucent)
|
||||
nsWindow::GetHasTransparentBackground(PRBool& aTransparent)
|
||||
{
|
||||
if (!mShell) {
|
||||
// Pass the request to the toplevel window
|
||||
GtkWidget *topWidget = nsnull;
|
||||
GetToplevelWidget(&topWidget);
|
||||
if (!topWidget) {
|
||||
aTranslucent = PR_FALSE;
|
||||
aTransparent = PR_FALSE;
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
nsWindow *topWindow = get_window_for_gtk_widget(topWidget);
|
||||
if (!topWindow) {
|
||||
aTranslucent = PR_FALSE;
|
||||
aTransparent = PR_FALSE;
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
return topWindow->GetWindowTranslucency(aTranslucent);
|
||||
return topWindow->GetHasTransparentBackground(aTransparent);
|
||||
}
|
||||
|
||||
aTranslucent = mIsTranslucent;
|
||||
aTransparent = mIsTransparent;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -3648,7 +3648,7 @@ nsWindow::UpdateTranslucentWindowAlphaInternal(const nsRect& aRect,
|
|||
return topWindow->UpdateTranslucentWindowAlphaInternal(aRect, aAlphas, aStride);
|
||||
}
|
||||
|
||||
NS_ASSERTION(mIsTranslucent, "Window is not transparent");
|
||||
NS_ASSERTION(mIsTransparent, "Window is not transparent");
|
||||
|
||||
if (mTransparencyBitmap == nsnull) {
|
||||
PRInt32 size = ((mBounds.width+7)/8)*mBounds.height;
|
||||
|
@ -3679,12 +3679,6 @@ nsWindow::UpdateTranslucentWindowAlphaInternal(const nsRect& aRect,
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsWindow::UpdateTranslucentWindowAlpha(const nsRect& aRect, PRUint8* aAlphas)
|
||||
{
|
||||
return UpdateTranslucentWindowAlphaInternal(aRect, aAlphas, aRect.width);
|
||||
}
|
||||
|
||||
void
|
||||
nsWindow::GrabPointer(void)
|
||||
{
|
||||
|
|
|
@ -343,11 +343,10 @@ public:
|
|||
|
||||
void ResizeTransparencyBitmap(PRInt32 aNewWidth, PRInt32 aNewHeight);
|
||||
void ApplyTransparencyBitmap();
|
||||
NS_IMETHOD SetWindowTranslucency(PRBool aTransparent);
|
||||
NS_IMETHOD GetWindowTranslucency(PRBool& aTransparent);
|
||||
NS_IMETHOD SetHasTransparentBackground(PRBool aTransparent);
|
||||
NS_IMETHOD GetHasTransparentBackground(PRBool& aTransparent);
|
||||
nsresult UpdateTranslucentWindowAlphaInternal(const nsRect& aRect,
|
||||
PRUint8* aAlphas, PRInt32 aStride);
|
||||
NS_IMETHOD UpdateTranslucentWindowAlpha(const nsRect& aRect, PRUint8* aAlphas);
|
||||
|
||||
gfxASurface *GetThebesSurface();
|
||||
|
||||
|
@ -399,7 +398,7 @@ private:
|
|||
static GdkCursor *gsGtkCursorCache[eCursorCount];
|
||||
|
||||
// Transparency
|
||||
PRBool mIsTranslucent;
|
||||
PRBool mIsTransparent;
|
||||
// This bitmap tracks which pixels are transparent. We don't support
|
||||
// full translucency at this time; each pixel is either fully opaque
|
||||
// or fully transparent.
|
||||
|
|
|
@ -737,9 +737,9 @@ nsWindow::nsWindow() : nsBaseWidget()
|
|||
mIsVisible = PR_FALSE;
|
||||
mHas3DBorder = PR_FALSE;
|
||||
#ifdef MOZ_XUL
|
||||
mIsTranslucent = PR_FALSE;
|
||||
mIsTopTranslucent = PR_FALSE;
|
||||
mTranslucentSurface = nsnull;
|
||||
mIsTransparent = PR_FALSE;
|
||||
mIsTopTransparent = PR_FALSE;
|
||||
mTransparentSurface = nsnull;
|
||||
mMemoryDC = NULL;
|
||||
mMemoryBitmap = NULL;
|
||||
mMemoryBits = NULL;
|
||||
|
@ -1559,7 +1559,7 @@ NS_METHOD nsWindow::Destroy()
|
|||
::DestroyIcon(icon);
|
||||
|
||||
#ifdef MOZ_XUL
|
||||
if (mIsTranslucent)
|
||||
if (mIsTransparent)
|
||||
{
|
||||
SetupTranslucentWindowMemoryBitmap(PR_FALSE);
|
||||
|
||||
|
@ -1775,7 +1775,7 @@ NS_METHOD nsWindow::Show(PRBool bState)
|
|||
}
|
||||
|
||||
#ifdef MOZ_XUL
|
||||
if (!mIsVisible && bState && mIsTopTranslucent)
|
||||
if (!mIsVisible && bState && mIsTopTransparent)
|
||||
Invalidate(PR_FALSE);
|
||||
#endif
|
||||
|
||||
|
@ -2093,7 +2093,7 @@ NS_METHOD nsWindow::Resize(PRInt32 aWidth, PRInt32 aHeight, PRBool aRepaint)
|
|||
NS_ASSERTION((aHeight >=0 ), "Negative height passed to nsWindow::Resize");
|
||||
|
||||
#ifdef MOZ_XUL
|
||||
if (mIsTranslucent)
|
||||
if (mIsTransparent)
|
||||
ResizeTranslucentWindow(aWidth, aHeight);
|
||||
#endif
|
||||
|
||||
|
@ -2143,7 +2143,7 @@ NS_METHOD nsWindow::Resize(PRInt32 aX, PRInt32 aY, PRInt32 aWidth, PRInt32 aHeig
|
|||
NS_ASSERTION((aHeight >=0 ), "Negative height passed to nsWindow::Resize");
|
||||
|
||||
#ifdef MOZ_XUL
|
||||
if (mIsTranslucent)
|
||||
if (mIsTransparent)
|
||||
ResizeTranslucentWindow(aWidth, aHeight);
|
||||
#endif
|
||||
|
||||
|
@ -2874,7 +2874,7 @@ void* nsWindow::GetNativeData(PRUint32 aDataType)
|
|||
case NS_NATIVE_GRAPHIC:
|
||||
// XXX: This is sleezy!! Remember to Release the DC after using it!
|
||||
#ifdef MOZ_XUL
|
||||
return (void*)(mIsTranslucent) ?
|
||||
return (void*)(mIsTransparent) ?
|
||||
mMemoryDC : ::GetDC(mWnd);
|
||||
#else
|
||||
return (void*)::GetDC(mWnd);
|
||||
|
@ -2894,7 +2894,7 @@ void nsWindow::FreeNativeData(void * data, PRUint32 aDataType)
|
|||
{
|
||||
case NS_NATIVE_GRAPHIC:
|
||||
#ifdef MOZ_XUL
|
||||
if (!mIsTranslucent)
|
||||
if (!mIsTransparent)
|
||||
::ReleaseDC(mWnd, (HDC)data);
|
||||
#else
|
||||
::ReleaseDC(mWnd, (HDC)data);
|
||||
|
@ -4704,7 +4704,7 @@ PRBool nsWindow::ProcessMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT
|
|||
|
||||
|
||||
#ifdef MOZ_XUL
|
||||
if (mIsTranslucent)
|
||||
if (mIsTransparent)
|
||||
ResizeTranslucentWindow(newWidth, newHeight);
|
||||
#endif
|
||||
|
||||
|
@ -5569,7 +5569,7 @@ PRBool nsWindow::OnPaint(HDC aDC)
|
|||
nsEventStatus eventStatus = nsEventStatus_eIgnore;
|
||||
|
||||
#ifdef MOZ_XUL
|
||||
if (!aDC && mIsTranslucent)
|
||||
if (!aDC && mIsTransparent)
|
||||
{
|
||||
// For layered translucent windows all drawing should go to memory DC and no
|
||||
// WM_PAINT messages are normally generated. To support asynchronous painting
|
||||
|
@ -5603,7 +5603,7 @@ PRBool nsWindow::OnPaint(HDC aDC)
|
|||
RECT paintRect;
|
||||
|
||||
#ifdef MOZ_XUL
|
||||
if (aDC || mIsTranslucent) {
|
||||
if (aDC || mIsTransparent) {
|
||||
#else
|
||||
if (aDC) {
|
||||
#endif
|
||||
|
@ -5641,8 +5641,8 @@ PRBool nsWindow::OnPaint(HDC aDC)
|
|||
|
||||
#ifdef MOZ_XUL
|
||||
nsRefPtr<gfxASurface> targetSurface;
|
||||
if (mIsTranslucent) {
|
||||
targetSurface = mTranslucentSurface;
|
||||
if (mIsTransparent) {
|
||||
targetSurface = mTransparentSurface;
|
||||
} else {
|
||||
targetSurface = new gfxWindowsSurface(hDC);
|
||||
}
|
||||
|
@ -5653,7 +5653,7 @@ PRBool nsWindow::OnPaint(HDC aDC)
|
|||
nsRefPtr<gfxContext> thebesContext = new gfxContext(targetSurface);
|
||||
|
||||
#ifdef MOZ_XUL
|
||||
if (mIsTranslucent) {
|
||||
if (mIsTransparent) {
|
||||
// If we're rendering with translucency, we're going to be
|
||||
// rendering the whole window; make sure we clear it first
|
||||
thebesContext->SetOperator(gfxContext::OPERATOR_CLEAR);
|
||||
|
@ -5683,7 +5683,7 @@ PRBool nsWindow::OnPaint(HDC aDC)
|
|||
event.renderingContext = nsnull;
|
||||
|
||||
#ifdef MOZ_XUL
|
||||
if (mIsTranslucent) {
|
||||
if (mIsTransparent) {
|
||||
// Data from offscreen drawing surface was copied to memory bitmap of transparent
|
||||
// bitmap. Now it can be read from memory bitmap to apply alpha channel and after
|
||||
// that displayed on the screen.
|
||||
|
@ -7889,28 +7889,28 @@ void nsWindow::ResizeTranslucentWindow(PRInt32 aNewWidth, PRInt32 aNewHeight, PR
|
|||
if (!force && aNewWidth == mBounds.width && aNewHeight == mBounds.height)
|
||||
return;
|
||||
|
||||
mTranslucentSurface = new gfxWindowsSurface(gfxIntSize(aNewWidth, aNewHeight), gfxASurface::ImageFormatARGB32);
|
||||
mMemoryDC = mTranslucentSurface->GetDC();
|
||||
mTransparentSurface = new gfxWindowsSurface(gfxIntSize(aNewWidth, aNewHeight), gfxASurface::ImageFormatARGB32);
|
||||
mMemoryDC = mTransparentSurface->GetDC();
|
||||
mMemoryBitmap = NULL;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsWindow::GetWindowTranslucency(PRBool& aTranslucent)
|
||||
NS_IMETHODIMP nsWindow::GetHasTransparentBackground(PRBool& aTransparent)
|
||||
{
|
||||
aTranslucent = GetTopLevelWindow()->GetWindowTranslucencyInner();
|
||||
aTransparent = GetTopLevelWindow()->GetWindowTranslucencyInner();
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsWindow::SetWindowTranslucency(PRBool aTranslucent)
|
||||
NS_IMETHODIMP nsWindow::SetHasTransparentBackground(PRBool aTransparent)
|
||||
{
|
||||
nsresult rv = GetTopLevelWindow()->SetWindowTranslucencyInner(aTranslucent);
|
||||
nsresult rv = GetTopLevelWindow()->SetWindowTranslucencyInner(aTransparent);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult nsWindow::SetWindowTranslucencyInner(PRBool aTranslucent)
|
||||
nsresult nsWindow::SetWindowTranslucencyInner(PRBool aTransparent)
|
||||
{
|
||||
if (aTranslucent == mIsTranslucent)
|
||||
if (aTransparent == mIsTransparent)
|
||||
return NS_OK;
|
||||
|
||||
HWND hWnd = GetTopLevelHWND(mWnd, PR_TRUE);
|
||||
|
@ -7924,7 +7924,7 @@ nsresult nsWindow::SetWindowTranslucencyInner(PRBool aTranslucent)
|
|||
|
||||
LONG style, exStyle;
|
||||
|
||||
if (aTranslucent)
|
||||
if (aTransparent)
|
||||
{
|
||||
style = ::GetWindowLongW(hWnd, GWL_STYLE) &
|
||||
~(WS_CAPTION | WS_THICKFRAME | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX);
|
||||
|
@ -7940,14 +7940,14 @@ nsresult nsWindow::SetWindowTranslucencyInner(PRBool aTranslucent)
|
|||
::SetWindowLongW(hWnd, GWL_STYLE, style);
|
||||
::SetWindowLongW(hWnd, GWL_EXSTYLE, exStyle);
|
||||
|
||||
mIsTranslucent = aTranslucent;
|
||||
topWindow->mIsTopTranslucent = aTranslucent;
|
||||
mIsTransparent = aTransparent;
|
||||
topWindow->mIsTopTransparent = aTransparent;
|
||||
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
rv = SetupTranslucentWindowMemoryBitmap(aTranslucent);
|
||||
rv = SetupTranslucentWindowMemoryBitmap(aTransparent);
|
||||
|
||||
if (aTranslucent)
|
||||
if (aTransparent)
|
||||
{
|
||||
if (!mBounds.IsEmpty())
|
||||
{
|
||||
|
@ -7969,12 +7969,12 @@ nsresult nsWindow::SetWindowTranslucencyInner(PRBool aTranslucent)
|
|||
return rv;
|
||||
}
|
||||
|
||||
nsresult nsWindow::SetupTranslucentWindowMemoryBitmap(PRBool aTranslucent)
|
||||
nsresult nsWindow::SetupTranslucentWindowMemoryBitmap(PRBool aTransparent)
|
||||
{
|
||||
if (aTranslucent) {
|
||||
if (aTransparent) {
|
||||
ResizeTranslucentWindow(mBounds.width, mBounds.height, PR_TRUE);
|
||||
} else {
|
||||
mTranslucentSurface = nsnull;
|
||||
mTransparentSurface = nsnull;
|
||||
mMemoryDC = NULL;
|
||||
mMemoryBitmap = NULL;
|
||||
}
|
||||
|
|
|
@ -209,14 +209,14 @@ public:
|
|||
gfxASurface *GetThebesSurface();
|
||||
|
||||
#ifdef MOZ_XUL
|
||||
NS_IMETHOD SetWindowTranslucency(PRBool aTransparent);
|
||||
NS_IMETHOD GetWindowTranslucency(PRBool& aTransparent);
|
||||
NS_IMETHOD SetHasTransparentBackground(PRBool aTransparent);
|
||||
NS_IMETHOD GetHasTransparentBackground(PRBool& aTransparent);
|
||||
private:
|
||||
nsresult SetWindowTranslucencyInner(PRBool aTransparent);
|
||||
PRBool GetWindowTranslucencyInner() { return mIsTranslucent; }
|
||||
PRBool GetWindowTranslucencyInner() { return mIsTransparent; }
|
||||
void ResizeTranslucentWindow(PRInt32 aNewWidth, PRInt32 aNewHeight, PRBool force = PR_FALSE);
|
||||
nsresult UpdateTranslucentWindow();
|
||||
nsresult SetupTranslucentWindowMemoryBitmap(PRBool aTranslucent);
|
||||
nsresult SetupTranslucentWindowMemoryBitmap(PRBool aTransparent);
|
||||
public:
|
||||
#endif
|
||||
|
||||
|
@ -408,14 +408,14 @@ protected:
|
|||
|
||||
#ifdef MOZ_XUL
|
||||
// use layered windows to support full 256 level alpha translucency
|
||||
nsRefPtr<gfxWindowsSurface> mTranslucentSurface;
|
||||
nsRefPtr<gfxWindowsSurface> mTransparentSurface;
|
||||
|
||||
HDC mMemoryDC;
|
||||
HBITMAP mMemoryBitmap;
|
||||
PRUint8* mMemoryBits;
|
||||
PRUint8* mAlphaMask;
|
||||
PRPackedBool mIsTranslucent;
|
||||
PRPackedBool mIsTopTranslucent; // Topmost window itself or any of it's child windows has tranlucency enabled
|
||||
PRPackedBool mIsTransparent;
|
||||
PRPackedBool mIsTopTransparent; // Topmost window itself or any of it's child windows has tranlucency enabled
|
||||
#endif
|
||||
PRPackedBool mHasAeroGlass;
|
||||
PRPackedBool mIsTopWidgetWindow;
|
||||
|
|
|
@ -534,20 +534,15 @@ NS_IMETHODIMP nsBaseWidget::SetWindowType(nsWindowType aWindowType)
|
|||
//
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
NS_IMETHODIMP nsBaseWidget::SetWindowTranslucency(PRBool aTranslucent) {
|
||||
NS_IMETHODIMP nsBaseWidget::SetHasTransparentBackground(PRBool aTransparent) {
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsBaseWidget::GetWindowTranslucency(PRBool& aTranslucent) {
|
||||
aTranslucent = PR_FALSE;
|
||||
NS_IMETHODIMP nsBaseWidget::GetHasTransparentBackground(PRBool& aTransparent) {
|
||||
aTransparent = PR_FALSE;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsBaseWidget::UpdateTranslucentWindowAlpha(const nsRect& aRect, PRUint8* aAlphas) {
|
||||
NS_ASSERTION(PR_FALSE, "Window is not translucent");
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
//
|
||||
// Hide window borders/decorations for this widget
|
||||
|
|
|
@ -103,9 +103,8 @@ public:
|
|||
PRUint32 aHotspotX, PRUint32 aHotspotY);
|
||||
NS_IMETHOD GetWindowType(nsWindowType& aWindowType);
|
||||
NS_IMETHOD SetWindowType(nsWindowType aWindowType);
|
||||
NS_IMETHOD SetWindowTranslucency(PRBool aTranslucent);
|
||||
NS_IMETHOD GetWindowTranslucency(PRBool& aTranslucent);
|
||||
NS_IMETHOD UpdateTranslucentWindowAlpha(const nsRect& aRect, PRUint8* aAlphas);
|
||||
NS_IMETHOD SetHasTransparentBackground(PRBool aTransparent);
|
||||
NS_IMETHOD GetHasTransparentBackground(PRBool& aTransparent);
|
||||
NS_IMETHOD HideWindowChrome(PRBool aShouldHide);
|
||||
NS_IMETHOD MakeFullScreen(PRBool aFullScreen);
|
||||
nsresult MakeFullScreenInternal(PRBool aFullScreen);
|
||||
|
|
Загрузка…
Ссылка в новой задаче