зеркало из https://github.com/mozilla/gecko-dev.git
Not part of the build.
This commit is contained in:
Родитель
64c93b9006
Коммит
f3c9c31da4
|
@ -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 <ccarlen@netscape.com>
|
||||
*/
|
||||
|
||||
#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<EventRecord*>(ioParam);
|
||||
::MacFindWindow(inMacEvent->where, &macWindowP);
|
||||
if (IsAlienGeckoWindow(macWindowP)) {
|
||||
mMessageSink.DispatchOSEvent(*inMacEvent, macWindowP);
|
||||
SetExecuteHost(false);
|
||||
}
|
||||
|
||||
} else if (inMessage == msg_Event) {
|
||||
inMacEvent = static_cast<EventRecord*>(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();
|
||||
}
|
||||
|
|
@ -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 <ccarlen@netscape.com>
|
||||
*/
|
||||
|
||||
#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__
|
Загрузка…
Ссылка в новой задаче