From bceabf4c0d5b9a3810fba52d3c8f9f562aaade59 Mon Sep 17 00:00:00 2001 From: "mark%moxienet.com" Date: Thu, 25 May 2006 17:42:40 +0000 Subject: [PATCH] 54488 Scrollbars in inactive windows should also be inactive. r=josh --- widget/src/mac/nsMacControl.cpp | 175 +++++++++++++++++++++----------- widget/src/mac/nsMacControl.h | 122 ---------------------- 2 files changed, 115 insertions(+), 182 deletions(-) diff --git a/widget/src/mac/nsMacControl.cpp b/widget/src/mac/nsMacControl.cpp index dbd51cb34cf..fc33f038761 100644 --- a/widget/src/mac/nsMacControl.cpp +++ b/widget/src/mac/nsMacControl.cpp @@ -77,12 +77,6 @@ static NS_DEFINE_CID(kCharsetConverterManagerCID, NS_ICHARSETCONVERTERMANAGER_CI nsIUnicodeEncoder * nsMacControl::mUnicodeEncoder = nsnull; nsIUnicodeDecoder * nsMacControl::mUnicodeDecoder = nsnull; -static pascal OSStatus MacHandleControlEvent(EventHandlerCallRef aHandlerCallRef, EventRef aEvent, void* aUserData) -{ - nsMacControl* macControl = NS_REINTERPRET_CAST(nsMacControl*, aUserData); - return macControl->HandleControlEvent(aHandlerCallRef, aEvent); -} - #pragma mark - //------------------------------------------------------------------------- @@ -220,12 +214,7 @@ PRBool nsMacControl::OnPaint(nsPaintEvent &aEvent) } // update hilite - PRInt16 curHilite = GetControlHiliteState(); - if (curHilite != mLastHilite) - { - mLastHilite = curHilite; - ::HiliteControl(mControl, curHilite); - } + SetupControlHiliteState(); ::SetControlVisibility(mControl, isVisible, false); @@ -364,14 +353,24 @@ void nsMacControl::GetRectForMacControl(nsRect &outRect) //------------------------------------------------------------------------- ControlPartCode nsMacControl::GetControlHiliteState() { - // update hilite - PRInt16 curHilite; - if (mEnabled) - curHilite = (mWidgetArmed && mMouseInButton ? 1 : 0); - else - curHilite = kControlInactivePart; + // update hilite + PRInt16 curHilite; + if (!mEnabled || !::IsWindowActive(mWindowPtr)) + curHilite = kControlInactivePart; + else + curHilite = (mWidgetArmed && mMouseInButton ? 1 : 0); - return curHilite; + return curHilite; +} + +void +nsMacControl::SetupControlHiliteState() +{ + PRInt16 curHilite = GetControlHiliteState(); + if (curHilite != mLastHilite) { + mLastHilite = curHilite; + ::HiliteControl(mControl, curHilite); + } } //------------------------------------------------------------------------- @@ -381,31 +380,35 @@ ControlPartCode nsMacControl::GetControlHiliteState() nsresult nsMacControl::CreateOrReplaceMacControl(short inControlType) { - nsRect controlRect; - GetRectForMacControl(controlRect); - Rect macRect; - nsRectToMacRect(controlRect, macRect); + nsresult rv = NS_ERROR_NULL_POINTER; + nsRect controlRect; + GetRectForMacControl(controlRect); + Rect macRect; + nsRectToMacRect(controlRect, macRect); - if (nsnull != mWindowPtr) - { - ClearControl(); + ClearControl(); - StartDraw(); - mControl = ::NewControl(mWindowPtr, &macRect, "\p", mVisible, mValue, mMin, mMax, inControlType, nil); - EndDraw(); + if (mWindowPtr) { + mControl = ::NewControl(mWindowPtr, &macRect, "\p", PR_FALSE, + mValue, mMin, mMax, inControlType, nsnull); - if (mControl) - InstallEventHandlerOnControl(); - - // need to reset the font now - // XXX to do: transfer the text in the old control over too - if (mControl && mFontMetrics) - { - SetupMacControlFont(); - } - } + if (mControl) { + InstallEventHandlerOnControl(); + SetupControlHiliteState(); - return (mControl) ? NS_OK : NS_ERROR_NULL_POINTER; + // need to reset the font now + // XXX to do: transfer the text in the old control over too + if (mFontMetrics) + SetupMacControlFont(); + + if (mVisible) + ::ShowControl(mControl); + + rv = NS_OK; + } + } + + return rv; } //------------------------------------------------------------------------- @@ -599,24 +602,45 @@ void nsMacControl::GetFileSystemCharset(nsCString & fileSystemCharset) // // //------------------------------------------------------------------------- -DEFINE_ONE_SHOT_HANDLER_GETTER(MacHandleControlEvent) - -static const EventTypeSpec kControlEventList[] = -{ - // Installing a kEventControlDraw handler causes harmless but ugly visual - // imperfections in scrollbar tracks on Mac OS X 10.4.0 - 10.4.2. This is - // fixed in 10.4.3. Bug 300058. - { kEventClassControl, kEventControlDraw } -}; OSStatus nsMacControl::InstallEventHandlerOnControl() { - return ::InstallControlEventHandler(mControl, - GetMacHandleControlEventUPP(), - GetEventTypeCount(kControlEventList), - kControlEventList, - (void*)this, - &mControlEventHandler); + const EventTypeSpec kControlEventList[] = { + // Installing a kEventControlDraw handler causes harmless but ugly visual + // imperfections in scrollbar tracks on Mac OS X 10.4.0 - 10.4.2. This is + // fixed in 10.4.3. Bug 300058. + { kEventClassControl, kEventControlDraw }, + }; + + static EventHandlerUPP sControlEventHandlerUPP; + if (!sControlEventHandlerUPP) + sControlEventHandlerUPP = ::NewEventHandlerUPP(ControlEventHandler); + + OSStatus err = + ::InstallControlEventHandler(mControl, + sControlEventHandlerUPP, + GetEventTypeCount(kControlEventList), + kControlEventList, + (void*)this, + &mControlEventHandler); + NS_ENSURE_TRUE(err == noErr, err); + + const EventTypeSpec kWindowEventList[] = { + { kEventClassWindow, kEventWindowActivated }, + { kEventClassWindow, kEventWindowDeactivated }, + }; + + static EventHandlerUPP sWindowEventHandlerUPP; + if (!sWindowEventHandlerUPP) + sWindowEventHandlerUPP = ::NewEventHandlerUPP(WindowEventHandler); + + err = ::InstallWindowEventHandler(mWindowPtr, + sWindowEventHandlerUPP, + GetEventTypeCount(kWindowEventList), + kWindowEventList, + (void*)this, + &mWindowEventHandler); + return err; } //------------------------------------------------------------------------- @@ -629,6 +653,11 @@ void nsMacControl::RemoveEventHandlerFromControl() ::RemoveEventHandler(mControlEventHandler); mControlEventHandler = nsnull; } + + if (mWindowEventHandler) { + ::RemoveEventHandler(mWindowEventHandler); + mWindowEventHandler = nsnull; + } } //------------------------------------------------------------------------- @@ -636,12 +665,18 @@ void nsMacControl::RemoveEventHandlerFromControl() // At present, this handles only { kEventClassControl, kEventControlDraw }. // //------------------------------------------------------------------------- -OSStatus nsMacControl::HandleControlEvent(EventHandlerCallRef aHandlerCallRef, EventRef aEvent) +// static +pascal OSStatus +nsMacControl::ControlEventHandler(EventHandlerCallRef aHandlerCallRef, + EventRef aEvent, + void* aUserData) { - PRBool wasDrawing = IsDrawing(); + nsMacControl* self = NS_STATIC_CAST(nsMacControl*, aUserData); + + PRBool wasDrawing = self->IsDrawing(); if (wasDrawing) { - if (!IsQDStateOK()) { + if (!self->IsQDStateOK()) { // If you're here, you must be drawing the control inside |TrackControl|. // The converse is not necessarily true. // @@ -662,13 +697,13 @@ OSStatus nsMacControl::HandleControlEvent(EventHandlerCallRef aHandlerCallRef, E } } else { - StartDraw(); + self->StartDraw(); } OSStatus err = ::CallNextEventHandler(aHandlerCallRef, aEvent); if (!wasDrawing) { - EndDraw(); + self->EndDraw(); } return err; @@ -704,3 +739,23 @@ PRBool nsMacControl::IsQDStateOK() return PR_TRUE; } + +//------------------------------------------------------------------------- +// +// At present, this handles only +// { kEventClassWindow, kEventWindowActivated }, +// { kEventClassWindow, kEventWindowDeactivated } +// +//------------------------------------------------------------------------- +// static +pascal OSStatus +nsMacControl::WindowEventHandler(EventHandlerCallRef aHandlerCallRef, + EventRef aEvent, + void* aUserData) +{ + nsMacControl* self = NS_STATIC_CAST(nsMacControl*, aUserData); + + self->SetupControlHiliteState(); + + return ::CallNextEventHandler(aHandlerCallRef, aEvent); +} diff --git a/widget/src/mac/nsMacControl.h b/widget/src/mac/nsMacControl.h index 7cda0d7444d..e69de29bb2d 100644 --- a/widget/src/mac/nsMacControl.h +++ b/widget/src/mac/nsMacControl.h @@ -1,122 +0,0 @@ -/* -*- Mode: 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 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef nsMacControl_h__ -#define nsMacControl_h__ - -#include "nsIServiceManager.h" -#include "nsICharsetConverterManager.h" -#include "nsChildWindow.h" -#include - -class nsMacControl : public nsChildWindow -{ -private: - typedef nsChildWindow Inherited; - -public: - nsMacControl(); - virtual ~nsMacControl(); - - NS_IMETHOD Create(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext = nsnull, - nsIAppShell *aAppShell = nsnull, - nsIToolkit *aToolkit = nsnull, - nsWidgetInitData *aInitData = nsnull); - NS_IMETHOD Destroy(); - - virtual void SetControlType(short type) {mControlType = type;} - short GetControlType() {return mControlType;} - - // event handling - virtual PRBool OnPaint(nsPaintEvent & aEvent); - virtual PRBool DispatchMouseEvent(nsMouseEvent &aEvent); - OSStatus HandleControlEvent(EventHandlerCallRef aHandlerCallRef, EventRef aEvent); - - // nsIWidget interface - NS_IMETHOD Enable(PRBool bState); - NS_IMETHOD Show(PRBool aState); - NS_IMETHODIMP SetFont(const nsFont &aFont); - - // Mac string utilities - // (they really should be elsewhere but, well, only the Mac controls use them) - static void StringToStr255(const nsAString& aText, Str255& aStr255); - static void Str255ToString(const Str255& aStr255, nsString& aText); - -protected: - - nsresult CreateOrReplaceMacControl(short inControlType); - - void ClearControl(); - - virtual void GetRectForMacControl(nsRect &outRect); - virtual ControlPartCode GetControlHiliteState(); - - void SetupMacControlFont(); - void ControlChanged(PRInt32 aNewValue); - void NSStringSetControlTitle(ControlHandle theControl, nsString title); - void SetupMacControlFontForScript(short theScript); - static void GetFileSystemCharset(nsCString & fileSystemCharset); - - OSStatus InstallEventHandlerOnControl(); - void RemoveEventHandlerFromControl(); - - PRBool IsQDStateOK(); - - nsString mLabel; - PRBool mWidgetArmed; - PRBool mMouseInButton; - - PRInt32 mValue; - PRInt32 mMin; - PRInt32 mMax; - ControlHandle mControl; - short mControlType; - EventHandlerRef mControlEventHandler; - - nsString mLastLabel; - nsRect mLastBounds; - PRInt32 mLastValue; - PRInt16 mLastHilite; - - static nsIUnicodeEncoder* mUnicodeEncoder; - static nsIUnicodeDecoder* mUnicodeDecoder; -}; - -#endif // nsMacControl_h__