diff --git a/embedding/browser/powerplant/source/EmbedEventHandling.cpp b/embedding/browser/powerplant/source/EmbedEventHandling.cpp new file mode 100644 index 00000000000..5933c9ffe00 --- /dev/null +++ b/embedding/browser/powerplant/source/EmbedEventHandling.cpp @@ -0,0 +1,203 @@ +/* -*- Mode: IDL; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * 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 the Mozilla browser. + * + * The Initial Developer of the Original Code is Netscape + * Communications, Inc. Portions created by Netscape are + * Copyright (C) 1999, Mozilla. All Rights Reserved. + * + * Contributor(s): + * Conrad Carlen + */ + +#include "EmbedEventHandling.h" + +#include "nsRepeater.h" +#include "prthread.h" +#include "SIOUX.h" + +// Static Variables + +nsMacMessageSink CEmbedEventAttachment::mMessageSink; +WindowPtr CEmbedEventAttachment::mLastAlienWindowClicked; + +//***************************************************************************** +// CEmbedEventAttachment +// +// Handles events for windows popped up by Gecko which are not LWindows +// +//***************************************************************************** + +CEmbedEventAttachment::CEmbedEventAttachment() +{ +} + +CEmbedEventAttachment::~CEmbedEventAttachment() +{ +} + +void CEmbedEventAttachment::ExecuteSelf(MessageT inMessage, + void* ioParam) +{ + SetExecuteHost(true); + + EventRecord *inMacEvent; + WindowPtr macWindowP; + + // 1. Handle the msg_AdjustCursor message. PowerPlant + // sends this message to attachments which are attached + // to views but not those attached to the application. + // IMPORTANT: For this to be called, the application's + // AdjustCursor() method must be overridden to send the + // msg_AdjustCursor to its attachments. + + if (inMessage == msg_AdjustCursor) { + inMacEvent = static_cast(ioParam); + ::MacFindWindow(inMacEvent->where, &macWindowP); + if (IsAlienGeckoWindow(macWindowP)) { + mMessageSink.DispatchOSEvent(*inMacEvent, macWindowP); + SetExecuteHost(false); + } + + } else if (inMessage == msg_Event) { + inMacEvent = static_cast(ioParam); + +#ifdef DEBUG + // 2. See if the event is for the console window. + // Limit what types of events we send to it. + if ((inMacEvent->what == mouseDown || + inMacEvent->what == updateEvt || + inMacEvent->what == activateEvt || + inMacEvent->what == keyDown) && + SIOUXHandleOneEvent(inMacEvent)) + { + SetExecuteHost(false); + return; + } +#endif + + // 3. Finally, see if we have an event for a Gecko window + // which is not an LWindow. These get created by widget to + // show pop-up list boxes - grrr. The following events are + // sufficient for those. + + switch (inMacEvent->what) + { + case mouseDown: + { + SInt16 thePart = ::MacFindWindow(inMacEvent->where, &macWindowP); + if (thePart == inContent && IsAlienGeckoWindow(macWindowP)) { + mMessageSink.DispatchOSEvent(*inMacEvent, macWindowP); + mLastAlienWindowClicked = macWindowP; + SetExecuteHost(false); + } + else + mLastAlienWindowClicked = nil; + } + break; + + case mouseUp: + { + if (mLastAlienWindowClicked) { + mMessageSink.DispatchOSEvent(*inMacEvent, mLastAlienWindowClicked); + mLastAlienWindowClicked = nil; + SetExecuteHost(false); + } + } + break; + + case updateEvt: + case activateEvt: + { + macWindowP = (WindowPtr)inMacEvent->message; + if (IsAlienGeckoWindow(macWindowP)) { + mMessageSink.DispatchOSEvent(*inMacEvent, macWindowP); + SetExecuteHost(false); + } + } + break; + } + } +} + + +Boolean CEmbedEventAttachment::IsAlienGeckoWindow(WindowPtr inMacWindow) +{ + return (inMacWindow && + !LWindow::FetchWindowObject(inMacWindow) && + mMessageSink.IsRaptorWindow(inMacWindow)); +} + + +//***************************************************************************** +// CEmbedIdler +// +// +//***************************************************************************** + +CEmbedIdler::CEmbedIdler() +{ +} + + +CEmbedIdler::~CEmbedIdler() +{ +} + +void CEmbedIdler::SpendTime(const EventRecord& inMacEvent) +{ + Repeater::DoIdlers(inMacEvent); + ::PR_Sleep(PR_INTERVAL_NO_WAIT); +} + + +//***************************************************************************** +// CEmbedRepeater +// +// +//***************************************************************************** + +CEmbedRepeater::CEmbedRepeater() +{ +} + + +CEmbedRepeater::~CEmbedRepeater() +{ +} + +void CEmbedRepeater::SpendTime(const EventRecord& inMacEvent) +{ + Repeater::DoRepeaters(inMacEvent); +} + + +//***************************************************************************** +// Initialization Function - Call at application startup. +//***************************************************************************** + +void InitializeEmbedEventHandling(LApplication* theApplication) +{ + CEmbedEventAttachment *windowAttachment = new CEmbedEventAttachment; + ThrowIfNil_(windowAttachment); + theApplication->AddAttachment(windowAttachment); + + CEmbedIdler *embedIdler = new CEmbedIdler; + ThrowIfNil_(embedIdler); + embedIdler->StartIdling(); + + CEmbedRepeater *embedRepeater = new CEmbedRepeater; + ThrowIfNil_(embedRepeater); + embedRepeater->StartRepeating(); +} + \ No newline at end of file diff --git a/embedding/browser/powerplant/source/EmbedEventHandling.h b/embedding/browser/powerplant/source/EmbedEventHandling.h new file mode 100644 index 00000000000..744c6752b89 --- /dev/null +++ b/embedding/browser/powerplant/source/EmbedEventHandling.h @@ -0,0 +1,101 @@ +/* -*- Mode: IDL; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * 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 the Mozilla browser. + * + * The Initial Developer of the Original Code is Netscape + * Communications, Inc. Portions created by Netscape are + * Copyright (C) 1999, Mozilla. All Rights Reserved. + * + * Contributor(s): + * Conrad Carlen + */ + +#ifndef __EmbedEventHandling__ +#define __EmbedEventHandling__ + +#include "LAttachment.h" +#include "LPeriodical.h" + +#include "nsMacMessageSink.h" + +//***************************************************************************** +// class CEmbedEventAttachment +// +// Handles events for windows popped up by Gecko which are not LWindows +// +//***************************************************************************** + +class CEmbedEventAttachment : public LAttachment +{ +public: + + enum { class_ID = FOUR_CHAR_CODE('GAWA') }; + + CEmbedEventAttachment(); + virtual ~CEmbedEventAttachment(); + + // LAttachment + virtual void ExecuteSelf(MessageT inMessage, + void* ioParam); + +protected: + Boolean IsAlienGeckoWindow(WindowPtr inMacWindow); + + static nsMacMessageSink mMessageSink; + static WindowPtr mLastAlienWindowClicked; +}; + + +//***************************************************************************** +// class CEmbedIdler +// +// LPeriodical idler which calls Gecko's idling +// +//***************************************************************************** + +class CEmbedIdler : public LPeriodical +{ +public: + CEmbedIdler(); + virtual ~CEmbedIdler(); + + // LPeriodical + virtual void SpendTime(const EventRecord& inMacEvent); +}; + + +//***************************************************************************** +// class CEmbedRepeater +// +// LPeriodical repeater which calls Gecko's repeaters +// +//***************************************************************************** + +class CEmbedRepeater : public LPeriodical +{ +public: + CEmbedRepeater(); + virtual ~CEmbedRepeater(); + + // LPeriodical + virtual void SpendTime(const EventRecord& inMacEvent); +}; + + +//***************************************************************************** +// Initialization Function - Call at application startup. +//***************************************************************************** + +void InitializeEmbedEventHandling(LApplication* theApplication); + +#endif // __EmbedEventHandling__