From 3bca20a8d94a8c9f53d9ab4503fd72842200ce27 Mon Sep 17 00:00:00 2001 From: "bnesse%netscape.com" Date: Tue, 19 Mar 2002 22:10:45 +0000 Subject: [PATCH] Fix for bug 126578. Initialize the event record on OS X without using the system's EventAvail function to eliminate excess window erases and redraws. r=sdagley, sr=beard, a=asa. git-svn-id: svn://10.0.0.236/trunk@116891 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/layout/generic/nsObjectFrame.cpp | 75 ++++++----- .../layout/html/base/src/nsObjectFrame.cpp | 75 ++++++----- .../plugin/base/src/nsPluginViewer.cpp | 121 ++++++++++-------- 3 files changed, 145 insertions(+), 126 deletions(-) diff --git a/mozilla/layout/generic/nsObjectFrame.cpp b/mozilla/layout/generic/nsObjectFrame.cpp index a3ebd50098f..2b463215b5c 100644 --- a/mozilla/layout/generic/nsObjectFrame.cpp +++ b/mozilla/layout/generic/nsObjectFrame.cpp @@ -2864,42 +2864,47 @@ nsresult nsPluginInstanceOwner::EnsureCachedAttrParamArrays() #ifdef XP_MAC #if TARGET_CARBON -inline Boolean OSEventAvail(EventMask mask, EventRecord* event) { return EventAvail(mask, event); } +static void InitializeEventRecord(EventRecord* event) +{ + memset(event, 0, sizeof(EventRecord)); + GetGlobalMouse(&event->where); + event->when = TickCount(); + event->modifiers = GetCurrentKeyModifiers(); +} +#else +inline void InitializeEventRecord(EventRecord* event) { ::OSEventAvail(0, event); } #endif void nsPluginInstanceOwner::GUItoMacEvent(const nsGUIEvent& anEvent, EventRecord& aMacEvent) { - ::OSEventAvail(0, &aMacEvent); - - switch (anEvent.message) { - case NS_FOCUS_EVENT_START: // this is the same as NS_FOCUS_CONTENT - aMacEvent.what = nsPluginEventType_GetFocusEvent; - if (mOwner && mOwner->mPresContext) - { - nsCOMPtr content; - mOwner->GetContent(getter_AddRefs(content)); - if (content) - content->SetFocus(mOwner->mPresContext); + InitializeEventRecord(&aMacEvent); + switch (anEvent.message) { + case NS_FOCUS_EVENT_START: // this is the same as NS_FOCUS_CONTENT + aMacEvent.what = nsPluginEventType_GetFocusEvent; + if (mOwner && mOwner->mPresContext) { + nsCOMPtr content; + mOwner->GetContent(getter_AddRefs(content)); + if (content) + content->SetFocus(mOwner->mPresContext); + } + break; + case NS_BLUR_CONTENT: + aMacEvent.what = nsPluginEventType_LoseFocusEvent; + if (mOwner && mOwner->mPresContext) { + nsCOMPtr content; + mOwner->GetContent(getter_AddRefs(content)); + if (content) + content->RemoveFocus(mOwner->mPresContext); + } + break; + case NS_MOUSE_MOVE: + case NS_MOUSE_ENTER: + aMacEvent.what = nsPluginEventType_AdjustCursorEvent; + break; + default: + aMacEvent.what = nullEvent; + break; } - break; - case NS_BLUR_CONTENT: - aMacEvent.what = nsPluginEventType_LoseFocusEvent; - if (mOwner && mOwner->mPresContext) - { - nsCOMPtr content; - mOwner->GetContent(getter_AddRefs(content)); - if (content) - content->RemoveFocus(mOwner->mPresContext); - } - break; - case NS_MOUSE_MOVE: - case NS_MOUSE_ENTER: - aMacEvent.what = nsPluginEventType_AdjustCursorEvent; - break; - default: - aMacEvent.what = nullEvent; - break; - } } #endif @@ -2909,7 +2914,7 @@ nsresult nsPluginInstanceOwner::ScrollPositionWillChange(nsIScrollableView* aScr #ifdef XP_MAC if (mInstance != NULL) { EventRecord scrollEvent; - ::OSEventAvail(0, &scrollEvent); + InitializeEventRecord(&scrollEvent); scrollEvent.what = nsPluginEventType_ScrollingBeginsEvent; nsPluginPort* pluginPort = GetPluginPort(); @@ -2927,7 +2932,7 @@ nsresult nsPluginInstanceOwner::ScrollPositionDidChange(nsIScrollableView* aScro #ifdef XP_MAC if (mInstance != NULL) { EventRecord scrollEvent; - ::OSEventAvail(0, &scrollEvent); + InitializeEventRecord(&scrollEvent); scrollEvent.what = nsPluginEventType_ScrollingEndsEvent; nsPluginPort* pluginPort = GetPluginPort(); @@ -3355,7 +3360,7 @@ void nsPluginInstanceOwner::Paint(const nsRect& aDirtyRect, PRUint32 ndc) FixUpPluginWindow(); EventRecord updateEvent; - ::OSEventAvail(0, &updateEvent); + InitializeEventRecord(&updateEvent); updateEvent.what = updateEvt; updateEvent.message = UInt32(pluginPort->port); @@ -3399,7 +3404,7 @@ NS_IMETHODIMP_(void) nsPluginInstanceOwner::Notify(nsITimer* /* timer */) FixUpPluginWindow(); if (mInstance != NULL) { EventRecord idleEvent; - ::OSEventAvail(0, &idleEvent); + InitializeEventRecord(&idleEvent); idleEvent.what = nullEvent; nsPluginPort* pluginPort = GetPluginPort(); diff --git a/mozilla/layout/html/base/src/nsObjectFrame.cpp b/mozilla/layout/html/base/src/nsObjectFrame.cpp index a3ebd50098f..2b463215b5c 100644 --- a/mozilla/layout/html/base/src/nsObjectFrame.cpp +++ b/mozilla/layout/html/base/src/nsObjectFrame.cpp @@ -2864,42 +2864,47 @@ nsresult nsPluginInstanceOwner::EnsureCachedAttrParamArrays() #ifdef XP_MAC #if TARGET_CARBON -inline Boolean OSEventAvail(EventMask mask, EventRecord* event) { return EventAvail(mask, event); } +static void InitializeEventRecord(EventRecord* event) +{ + memset(event, 0, sizeof(EventRecord)); + GetGlobalMouse(&event->where); + event->when = TickCount(); + event->modifiers = GetCurrentKeyModifiers(); +} +#else +inline void InitializeEventRecord(EventRecord* event) { ::OSEventAvail(0, event); } #endif void nsPluginInstanceOwner::GUItoMacEvent(const nsGUIEvent& anEvent, EventRecord& aMacEvent) { - ::OSEventAvail(0, &aMacEvent); - - switch (anEvent.message) { - case NS_FOCUS_EVENT_START: // this is the same as NS_FOCUS_CONTENT - aMacEvent.what = nsPluginEventType_GetFocusEvent; - if (mOwner && mOwner->mPresContext) - { - nsCOMPtr content; - mOwner->GetContent(getter_AddRefs(content)); - if (content) - content->SetFocus(mOwner->mPresContext); + InitializeEventRecord(&aMacEvent); + switch (anEvent.message) { + case NS_FOCUS_EVENT_START: // this is the same as NS_FOCUS_CONTENT + aMacEvent.what = nsPluginEventType_GetFocusEvent; + if (mOwner && mOwner->mPresContext) { + nsCOMPtr content; + mOwner->GetContent(getter_AddRefs(content)); + if (content) + content->SetFocus(mOwner->mPresContext); + } + break; + case NS_BLUR_CONTENT: + aMacEvent.what = nsPluginEventType_LoseFocusEvent; + if (mOwner && mOwner->mPresContext) { + nsCOMPtr content; + mOwner->GetContent(getter_AddRefs(content)); + if (content) + content->RemoveFocus(mOwner->mPresContext); + } + break; + case NS_MOUSE_MOVE: + case NS_MOUSE_ENTER: + aMacEvent.what = nsPluginEventType_AdjustCursorEvent; + break; + default: + aMacEvent.what = nullEvent; + break; } - break; - case NS_BLUR_CONTENT: - aMacEvent.what = nsPluginEventType_LoseFocusEvent; - if (mOwner && mOwner->mPresContext) - { - nsCOMPtr content; - mOwner->GetContent(getter_AddRefs(content)); - if (content) - content->RemoveFocus(mOwner->mPresContext); - } - break; - case NS_MOUSE_MOVE: - case NS_MOUSE_ENTER: - aMacEvent.what = nsPluginEventType_AdjustCursorEvent; - break; - default: - aMacEvent.what = nullEvent; - break; - } } #endif @@ -2909,7 +2914,7 @@ nsresult nsPluginInstanceOwner::ScrollPositionWillChange(nsIScrollableView* aScr #ifdef XP_MAC if (mInstance != NULL) { EventRecord scrollEvent; - ::OSEventAvail(0, &scrollEvent); + InitializeEventRecord(&scrollEvent); scrollEvent.what = nsPluginEventType_ScrollingBeginsEvent; nsPluginPort* pluginPort = GetPluginPort(); @@ -2927,7 +2932,7 @@ nsresult nsPluginInstanceOwner::ScrollPositionDidChange(nsIScrollableView* aScro #ifdef XP_MAC if (mInstance != NULL) { EventRecord scrollEvent; - ::OSEventAvail(0, &scrollEvent); + InitializeEventRecord(&scrollEvent); scrollEvent.what = nsPluginEventType_ScrollingEndsEvent; nsPluginPort* pluginPort = GetPluginPort(); @@ -3355,7 +3360,7 @@ void nsPluginInstanceOwner::Paint(const nsRect& aDirtyRect, PRUint32 ndc) FixUpPluginWindow(); EventRecord updateEvent; - ::OSEventAvail(0, &updateEvent); + InitializeEventRecord(&updateEvent); updateEvent.what = updateEvt; updateEvent.message = UInt32(pluginPort->port); @@ -3399,7 +3404,7 @@ NS_IMETHODIMP_(void) nsPluginInstanceOwner::Notify(nsITimer* /* timer */) FixUpPluginWindow(); if (mInstance != NULL) { EventRecord idleEvent; - ::OSEventAvail(0, &idleEvent); + InitializeEventRecord(&idleEvent); idleEvent.what = nullEvent; nsPluginPort* pluginPort = GetPluginPort(); diff --git a/mozilla/modules/plugin/base/src/nsPluginViewer.cpp b/mozilla/modules/plugin/base/src/nsPluginViewer.cpp index ba04faa432c..234aaf45887 100644 --- a/mozilla/modules/plugin/base/src/nsPluginViewer.cpp +++ b/mozilla/modules/plugin/base/src/nsPluginViewer.cpp @@ -1227,37 +1227,45 @@ NS_IMETHODIMP pluginInstanceOwner :: Init(PluginViewerImpl *aViewer, nsIWidget * #ifdef XP_MAC #if TARGET_CARBON -inline Boolean OSEventAvail(EventMask mask, EventRecord* event) { return EventAvail(mask, event); } +static void InitializeEventRecord(EventRecord* event) +{ + memset(event, 0, sizeof(EventRecord)); + GetGlobalMouse(&event->where); + event->when = TickCount(); + event->modifiers = GetCurrentKeyModifiers(); +} +#else +inline void InitializeEventRecord(EventRecord* event) { ::OSEventAvail(0, event); } #endif void pluginInstanceOwner::GUItoMacEvent(const nsGUIEvent& anEvent, EventRecord& aMacEvent) { - ::OSEventAvail(0, &aMacEvent); - switch (anEvent.message) { - case NS_GOTFOCUS: - case NS_FOCUS_EVENT_START: - aMacEvent.what = nsPluginEventType_GetFocusEvent; - break; - case NS_LOSTFOCUS: - case NS_MOUSE_EXIT: - aMacEvent.what = nsPluginEventType_LoseFocusEvent; - break; - case NS_MOUSE_MOVE: - case NS_MOUSE_ENTER: - mWindow->SetFocus(); - aMacEvent.what = nsPluginEventType_AdjustCursorEvent; - break; - case NS_PAINT: - aMacEvent.what = updateEvt; - break; - case NS_KEY_DOWN: - case NS_KEY_PRESS: - break; - - default: - aMacEvent.what = nullEvent; - break; - } + InitializeEventRecord(&aMacEvent); + switch (anEvent.message) { + case NS_GOTFOCUS: + case NS_FOCUS_EVENT_START: + aMacEvent.what = nsPluginEventType_GetFocusEvent; + break; + case NS_LOSTFOCUS: + case NS_MOUSE_EXIT: + aMacEvent.what = nsPluginEventType_LoseFocusEvent; + break; + case NS_MOUSE_MOVE: + case NS_MOUSE_ENTER: + mWindow->SetFocus(); + aMacEvent.what = nsPluginEventType_AdjustCursorEvent; + break; + case NS_PAINT: + aMacEvent.what = updateEvt; + break; + case NS_KEY_DOWN: + case NS_KEY_PRESS: + break; + + default: + aMacEvent.what = nullEvent; + break; + } } #endif @@ -1277,39 +1285,38 @@ nsEventStatus pluginInstanceOwner::ProcessEvent(const nsGUIEvent& anEvent) GUItoMacEvent(anEvent, macEvent); event = &macEvent; if (event->what == updateEvt) { - nsPluginPort* pluginPort = GetPluginPort(); + nsPluginPort* pluginPort = GetPluginPort(); // Add in child windows absolute position to get make the dirty rect // relative to the top-level window. nscoord absWidgetX = 0; nscoord absWidgetY = 0; - nsRect widgetClip(0,0,0,0); - GetWidgetPosAndClip(mWindow,absWidgetX,absWidgetY,widgetClip); - //mViewer->GetBounds(widgetClip); - //absWidgetX = widgetClip.x; - //absWidgetY = widgetClip.y; - + nsRect widgetClip(0,0,0,0); + GetWidgetPosAndClip(mWindow,absWidgetX,absWidgetY,widgetClip); + //mViewer->GetBounds(widgetClip); + //absWidgetX = widgetClip.x; + //absWidgetY = widgetClip.y; + // set the port - mPluginWindow.x = absWidgetX; - mPluginWindow.y = absWidgetY; + mPluginWindow.x = absWidgetX; + mPluginWindow.y = absWidgetY; - // fix up the clipping region - mPluginWindow.clipRect.top = widgetClip.y; - mPluginWindow.clipRect.left = widgetClip.x; - mPluginWindow.clipRect.bottom = mPluginWindow.clipRect.top + widgetClip.height; - mPluginWindow.clipRect.right = mPluginWindow.clipRect.left + widgetClip.width; + // fix up the clipping region + mPluginWindow.clipRect.top = widgetClip.y; + mPluginWindow.clipRect.left = widgetClip.x; + mPluginWindow.clipRect.bottom = mPluginWindow.clipRect.top + widgetClip.height; + mPluginWindow.clipRect.right = mPluginWindow.clipRect.left + widgetClip.width; - EventRecord updateEvent; - ::OSEventAvail(0, &updateEvent); - updateEvent.what = updateEvt; - updateEvent.message = UInt32(pluginPort->port); + EventRecord updateEvent; + InitializeEventRecord(&updateEvent); + updateEvent.what = updateEvt; + updateEvent.message = UInt32(pluginPort->port); - nsPluginEvent pluginEvent = { &updateEvent, nsPluginPlatformWindowRef(pluginPort->port) }; - PRBool eventHandled = PR_FALSE; - mInstance->HandleEvent(&pluginEvent, &eventHandled); - } - - return nsEventStatus_eConsumeNoDefault; + nsPluginEvent pluginEvent = { &updateEvent, nsPluginPlatformWindowRef(pluginPort->port) }; + PRBool eventHandled = PR_FALSE; + mInstance->HandleEvent(&pluginEvent, &eventHandled); + } + return nsEventStatus_eConsumeNoDefault; } //nsPluginPort* port = (nsPluginPort*)mWidget->GetNativeData(NS_NATIVE_PLUGIN_PORT); @@ -1325,10 +1332,12 @@ nsEventStatus pluginInstanceOwner::ProcessEvent(const nsGUIEvent& anEvent) //~~~ #ifdef XP_WIN nsPluginEvent * pPluginEvent = (nsPluginEvent *)anEvent.nativeMsg; - PRBool eventHandled = PR_FALSE; - mInstance->HandleEvent(pPluginEvent, &eventHandled); - if (eventHandled) - rv = nsEventStatus_eConsumeNoDefault; + if (pPluginEvent) { + PRBool eventHandled = PR_FALSE; + mInstance->HandleEvent(pPluginEvent, &eventHandled); + if (eventHandled) + rv = nsEventStatus_eConsumeNoDefault; + } #endif return rv; @@ -1346,7 +1355,7 @@ NS_IMETHODIMP_(void) pluginInstanceOwner::Notify(nsITimer* /* timer */) FixUpPluginWindow(); if (mInstance != NULL) { EventRecord idleEvent; - ::OSEventAvail(0, &idleEvent); + InitializeEventRecord(&idleEvent); idleEvent.what = nullEvent; nsPluginPort* pluginPort = GetPluginPort();