mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Back out both patches for bug 647216 due to regression documented in bug 806244.
This commit is contained in:
parent
52160f6a8f
commit
bceb631bc5
@ -511,12 +511,11 @@ nsDOMWindowUtils::SendMouseEvent(const nsAString& aType,
|
||||
int32_t aModifiers,
|
||||
bool aIgnoreRootScrollFrame,
|
||||
float aPressure,
|
||||
unsigned short aInputSourceArg,
|
||||
bool *aPreventDefault)
|
||||
unsigned short aInputSourceArg)
|
||||
{
|
||||
return SendMouseEventCommon(aType, aX, aY, aButton, aClickCount, aModifiers,
|
||||
aIgnoreRootScrollFrame, aPressure,
|
||||
aInputSourceArg, false, aPreventDefault);
|
||||
aInputSourceArg, false);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
@ -533,7 +532,7 @@ nsDOMWindowUtils::SendMouseEventToWindow(const nsAString& aType,
|
||||
SAMPLE_LABEL("nsDOMWindowUtils", "SendMouseEventToWindow");
|
||||
return SendMouseEventCommon(aType, aX, aY, aButton, aClickCount, aModifiers,
|
||||
aIgnoreRootScrollFrame, aPressure,
|
||||
aInputSourceArg, true, nullptr);
|
||||
aInputSourceArg, true);
|
||||
}
|
||||
|
||||
static nsIntPoint
|
||||
@ -556,8 +555,7 @@ nsDOMWindowUtils::SendMouseEventCommon(const nsAString& aType,
|
||||
bool aIgnoreRootScrollFrame,
|
||||
float aPressure,
|
||||
unsigned short aInputSourceArg,
|
||||
bool aToWindow,
|
||||
bool *aPreventDefault)
|
||||
bool aToWindow)
|
||||
{
|
||||
if (!nsContentUtils::IsCallerChrome()) {
|
||||
return NS_ERROR_DOM_SECURITY_ERR;
|
||||
@ -584,9 +582,7 @@ nsDOMWindowUtils::SendMouseEventCommon(const nsAString& aType,
|
||||
else if (aType.EqualsLiteral("contextmenu")) {
|
||||
msg = NS_CONTEXTMENU;
|
||||
contextMenuKey = (aButton == 0);
|
||||
} else if (aType.EqualsLiteral("MozMouseHittest"))
|
||||
msg = NS_MOUSE_MOZHITTEST;
|
||||
else
|
||||
} else
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
if (aInputSourceArg == nsIDOMMouseEvent::MOZ_SOURCE_UNKNOWN) {
|
||||
@ -627,10 +623,7 @@ nsDOMWindowUtils::SendMouseEventCommon(const nsAString& aType,
|
||||
status = nsEventStatus_eIgnore;
|
||||
return presShell->HandleEvent(view->GetFrame(), &event, false, &status);
|
||||
}
|
||||
nsresult rv = widget->DispatchEvent(&event, status);
|
||||
*aPreventDefault = (status == nsEventStatus_eConsumeNoDefault);
|
||||
|
||||
return rv;
|
||||
return widget->DispatchEvent(&event, status);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -44,8 +44,7 @@ protected:
|
||||
bool aIgnoreRootScrollFrame,
|
||||
float aPressure,
|
||||
unsigned short aInputSourceArg,
|
||||
bool aToWindow,
|
||||
bool *aPreventDefault);
|
||||
bool aToWindow);
|
||||
|
||||
static mozilla::widget::Modifiers GetWidgetModifiers(int32_t aModifiers);
|
||||
};
|
||||
|
@ -40,7 +40,7 @@ interface nsIDOMTouch;
|
||||
interface nsIDOMClientRect;
|
||||
interface nsIURI;
|
||||
|
||||
[scriptable, uuid(b3a3589d-cc9d-4123-9b21-51c66e88b436)]
|
||||
[scriptable, uuid(C98B7275-93C4-4EAD-B7CF-573D872C1071)]
|
||||
interface nsIDOMWindowUtils : nsISupports {
|
||||
|
||||
/**
|
||||
@ -204,8 +204,7 @@ interface nsIDOMWindowUtils : nsISupports {
|
||||
const long MODIFIER_OS = 0x0400;
|
||||
|
||||
/** Synthesize a mouse event. The event types supported are:
|
||||
* mousedown, mouseup, mousemove, mouseover, mouseout, contextmenu,
|
||||
* MozMouseHitTest
|
||||
* mousedown, mouseup, mousemove, mouseover, mouseout, contextmenu
|
||||
*
|
||||
* Events are sent in coordinates offset by aX and aY from the window.
|
||||
*
|
||||
@ -237,18 +236,16 @@ interface nsIDOMWindowUtils : nsISupports {
|
||||
* @param aPressure touch input pressure: 0.0 -> 1.0
|
||||
* @param aInputSourceArg input source, see nsIDOMMouseEvent for values,
|
||||
* defaults to mouse input.
|
||||
*
|
||||
* returns true if the page called prevent default on this event
|
||||
*/
|
||||
boolean sendMouseEvent(in AString aType,
|
||||
in float aX,
|
||||
in float aY,
|
||||
in long aButton,
|
||||
in long aClickCount,
|
||||
in long aModifiers,
|
||||
[optional] in boolean aIgnoreRootScrollFrame,
|
||||
[optional] in float aPressure,
|
||||
[optional] in unsigned short aInputSourceArg);
|
||||
void sendMouseEvent(in AString aType,
|
||||
in float aX,
|
||||
in float aY,
|
||||
in long aButton,
|
||||
in long aClickCount,
|
||||
in long aModifiers,
|
||||
[optional] in boolean aIgnoreRootScrollFrame,
|
||||
[optional] in float aPressure,
|
||||
[optional] in unsigned short aInputSourceArg);
|
||||
|
||||
/** Synthesize a touch event. The event types supported are:
|
||||
* touchstart, touchend, touchmove, and touchcancel
|
||||
|
@ -1276,9 +1276,8 @@ TabChild::RecvMouseEvent(const nsString& aType,
|
||||
{
|
||||
nsCOMPtr<nsIDOMWindowUtils> utils(GetDOMWindowUtils());
|
||||
NS_ENSURE_TRUE(utils, true);
|
||||
bool ignored = false;
|
||||
utils->SendMouseEvent(aType, aX, aY, aButton, aClickCount, aModifiers,
|
||||
aIgnoreRootScrollFrame, 0, 0, &ignored);
|
||||
aIgnoreRootScrollFrame, 0, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -206,13 +206,11 @@ function _parseModifiers(aEvent)
|
||||
* a mousedown followed by a mouse up is performed.
|
||||
*
|
||||
* aWindow is optional, and defaults to the current window object.
|
||||
*
|
||||
* Returns whether the event had preventDefault() called on it.
|
||||
*/
|
||||
function synthesizeMouse(aTarget, aOffsetX, aOffsetY, aEvent, aWindow)
|
||||
{
|
||||
var rect = aTarget.getBoundingClientRect();
|
||||
return synthesizeMouseAtPoint(rect.left + aOffsetX, rect.top + aOffsetY,
|
||||
synthesizeMouseAtPoint(rect.left + aOffsetX, rect.top + aOffsetY,
|
||||
aEvent, aWindow);
|
||||
}
|
||||
function synthesizeTouch(aTarget, aOffsetX, aOffsetY, aEvent, aWindow)
|
||||
@ -236,7 +234,6 @@ function synthesizeTouch(aTarget, aOffsetX, aOffsetY, aEvent, aWindow)
|
||||
function synthesizeMouseAtPoint(left, top, aEvent, aWindow)
|
||||
{
|
||||
var utils = _getDOMWindowUtils(aWindow);
|
||||
var defaultPrevented = false;
|
||||
|
||||
if (utils) {
|
||||
var button = aEvent.button || 0;
|
||||
@ -244,15 +241,13 @@ function synthesizeMouseAtPoint(left, top, aEvent, aWindow)
|
||||
var modifiers = _parseModifiers(aEvent);
|
||||
|
||||
if (("type" in aEvent) && aEvent.type) {
|
||||
defaultPrevented = utils.sendMouseEvent(aEvent.type, left, top, button, clickCount, modifiers);
|
||||
utils.sendMouseEvent(aEvent.type, left, top, button, clickCount, modifiers);
|
||||
}
|
||||
else {
|
||||
utils.sendMouseEvent("mousedown", left, top, button, clickCount, modifiers);
|
||||
utils.sendMouseEvent("mouseup", left, top, button, clickCount, modifiers);
|
||||
}
|
||||
}
|
||||
|
||||
return defaultPrevented;
|
||||
}
|
||||
function synthesizeTouchAtPoint(left, top, aEvent, aWindow)
|
||||
{
|
||||
|
@ -2,18 +2,12 @@
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#ifdef XP_WIN
|
||||
#define USE_HITTEST
|
||||
#elifdef MOZ_WIDGET_COCOA
|
||||
#define USE_HITTEST
|
||||
#endif
|
||||
|
||||
this.EXPORTED_SYMBOLS = [ "WindowDraggingElement" ];
|
||||
|
||||
this.WindowDraggingElement = function WindowDraggingElement(elem) {
|
||||
this._elem = elem;
|
||||
this._window = elem.ownerDocument.defaultView;
|
||||
#ifdef USE_HITTEST
|
||||
#ifdef XP_WIN
|
||||
if (!this.isPanel())
|
||||
this._elem.addEventListener("MozMouseHittest", this, false);
|
||||
else
|
||||
@ -60,7 +54,7 @@ WindowDraggingElement.prototype = {
|
||||
},
|
||||
handleEvent: function(aEvent) {
|
||||
let isPanel = this.isPanel();
|
||||
#ifdef USE_HITTEST
|
||||
#ifdef XP_WIN
|
||||
if (!isPanel) {
|
||||
if (this.shouldDrag(aEvent))
|
||||
aEvent.preventDefault();
|
||||
|
@ -52,6 +52,7 @@
|
||||
<statusbar id="statusbar">
|
||||
<statusbarpanel>
|
||||
<label id="statuslabel" value="Status"/>
|
||||
<label id="statuslabelnodrag" value="No Drag" onmousedown="event.preventDefault()"/>
|
||||
</statusbarpanel>
|
||||
</statusbar>
|
||||
|
||||
@ -105,18 +106,26 @@ function test_titlebar()
|
||||
var titlebar = document.getElementById("titlebar");
|
||||
var label = document.getElementById("label");
|
||||
|
||||
// On Mac, the window can also be moved with the statusbar, but this works
|
||||
// via the MozMouseHittest event, not via mouse events.
|
||||
// on Mac, the window can also be moved with the statusbar
|
||||
if (navigator.platform.indexOf("Mac") >= 0) {
|
||||
var preventDefaulted;
|
||||
|
||||
var statuslabel = document.getElementById("statuslabel");
|
||||
preventDefaulted = synthesizeMouse(statuslabel, 2, 2, { type: "MozMouseHittest" });
|
||||
SimpleTest.ok(preventDefaulted, "MozMouseHittest should have been defaultPrevented over statusbar");
|
||||
var statuslabelnodrag = document.getElementById("statuslabelnodrag");
|
||||
|
||||
var button = document.getElementById("button");
|
||||
preventDefaulted = synthesizeMouse(button, 2, 2, { type: "MozMouseHittest" });
|
||||
SimpleTest.ok(!preventDefaulted, "MozMouseHittest should NOT have been defaultPrevented over button");
|
||||
origoldx = window.screenX;
|
||||
origoldy = window.screenY;
|
||||
|
||||
synthesizeMouse(statuslabel, 2, 2, { type: "mousedown" });
|
||||
synthesizeMouse(statuslabel, 22, 22, { type: "mousemove" });
|
||||
SimpleTest.is(window.screenX, origoldx + 20, "move window with statusbar horizontal");
|
||||
SimpleTest.is(window.screenY, origoldy + 20, "move window with statusbar vertical");
|
||||
synthesizeMouse(statuslabel, 22, 22, { type: "mouseup" });
|
||||
|
||||
// event was cancelled so the drag should not have occurred
|
||||
synthesizeMouse(statuslabelnodrag, 2, 2, { type: "mousedown" });
|
||||
synthesizeMouse(statuslabelnodrag, 22, 22, { type: "mousemove" });
|
||||
SimpleTest.is(window.screenX, origoldx + 20, "move window with statusbar cancelled mousedown horizontal");
|
||||
SimpleTest.is(window.screenY, origoldy + 20, "move window with statusbar cancelled mousedown vertical");
|
||||
synthesizeMouse(statuslabelnodrag, 22, 22, { type: "mouseup" });
|
||||
}
|
||||
|
||||
origoldx = window.screenX;
|
||||
|
@ -183,10 +183,6 @@ typedef NSInteger NSEventGestureAxis;
|
||||
- (NSEventPhase)momentumPhase;
|
||||
@end
|
||||
|
||||
@protocol EventRedirection
|
||||
- (NSView*)targetView;
|
||||
@end
|
||||
|
||||
@interface ChildView : NSView<
|
||||
#ifdef ACCESSIBILITY
|
||||
mozAccessible,
|
||||
@ -271,8 +267,6 @@ typedef NSInteger NSEventGestureAxis;
|
||||
// class initialization
|
||||
+ (void)initialize;
|
||||
|
||||
+ (void)registerViewForDraggedTypes:(NSView*)aView;
|
||||
|
||||
// these are sent to the first responder when the window key status changes
|
||||
- (void)viewsWindowDidBecomeKey;
|
||||
- (void)viewsWindowDidResignKey;
|
||||
@ -282,8 +276,6 @@ typedef NSInteger NSEventGestureAxis;
|
||||
|
||||
- (void)sendFocusEvent:(uint32_t)eventType;
|
||||
|
||||
- (void)updateWindowDraggableStateOnMouseMove:(NSEvent*)theEvent;
|
||||
|
||||
- (void)handleMouseMoved:(NSEvent*)aEvent;
|
||||
|
||||
- (void)drawRect:(NSRect)aRect inTitlebarContext:(CGContextRef)aContext;
|
||||
|
@ -1912,20 +1912,6 @@ NSEvent* gLastDragMouseDownEvent = nil;
|
||||
}
|
||||
}
|
||||
|
||||
+ (void)registerViewForDraggedTypes:(NSView*)aView
|
||||
{
|
||||
[aView registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType,
|
||||
NSStringPboardType,
|
||||
NSHTMLPboardType,
|
||||
NSURLPboardType,
|
||||
NSFilesPromisePboardType,
|
||||
kWildcardPboardType,
|
||||
kCorePboardType_url,
|
||||
kCorePboardType_urld,
|
||||
kCorePboardType_urln,
|
||||
nil]];
|
||||
}
|
||||
|
||||
// initWithFrame:geckoChild:
|
||||
- (id)initWithFrame:(NSRect)inFrame geckoChild:(nsChildView*)inChild
|
||||
{
|
||||
@ -1973,8 +1959,17 @@ NSEvent* gLastDragMouseDownEvent = nil;
|
||||
}
|
||||
|
||||
// register for things we'll take from other applications
|
||||
[ChildView registerViewForDraggedTypes:self];
|
||||
|
||||
PR_LOG(sCocoaLog, PR_LOG_ALWAYS, ("ChildView initWithFrame: registering drag types\n"));
|
||||
[self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType,
|
||||
NSStringPboardType,
|
||||
NSHTMLPboardType,
|
||||
NSURLPboardType,
|
||||
NSFilesPromisePboardType,
|
||||
kWildcardPboardType,
|
||||
kCorePboardType_url,
|
||||
kCorePboardType_urld,
|
||||
kCorePboardType_urln,
|
||||
nil]];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(windowBecameMain:)
|
||||
name:NSWindowDidBecomeMainNotification
|
||||
@ -2344,7 +2339,7 @@ NSEvent* gLastDragMouseDownEvent = nil;
|
||||
|
||||
- (BOOL)mouseDownCanMoveWindow
|
||||
{
|
||||
return [[self window] isMovableByWindowBackground];
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)lockFocus
|
||||
@ -3290,25 +3285,6 @@ NSEvent* gLastDragMouseDownEvent = nil;
|
||||
mGeckoChild->DispatchEvent(&event, status);
|
||||
}
|
||||
|
||||
- (void)updateWindowDraggableStateOnMouseMove:(NSEvent*)theEvent
|
||||
{
|
||||
if (!theEvent || !mGeckoChild) {
|
||||
return;
|
||||
}
|
||||
|
||||
nsCocoaWindow* windowWidget = mGeckoChild->GetXULWindowWidget();
|
||||
if (!windowWidget) {
|
||||
return;
|
||||
}
|
||||
|
||||
// We assume later on that sending a hit test event won't cause widget destruction.
|
||||
nsMouseEvent hitTestEvent(true, NS_MOUSE_MOZHITTEST, mGeckoChild, nsMouseEvent::eReal);
|
||||
[self convertCocoaMouseEvent:theEvent toGeckoEvent:&hitTestEvent];
|
||||
bool result = mGeckoChild->DispatchWindowEvent(hitTestEvent);
|
||||
|
||||
[windowWidget->GetCocoaWindow() setMovableByWindowBackground:result];
|
||||
}
|
||||
|
||||
- (void)handleMouseMoved:(NSEvent*)theEvent
|
||||
{
|
||||
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
|
||||
@ -4833,11 +4809,6 @@ ChildViewMouseTracker::ViewForEvent(NSEvent* aEvent)
|
||||
|
||||
NSPoint windowEventLocation = nsCocoaUtils::EventLocationForWindow(aEvent, window);
|
||||
NSView* view = [[[window contentView] superview] hitTest:windowEventLocation];
|
||||
|
||||
while([view conformsToProtocol:@protocol(EventRedirection)]) {
|
||||
view = [(id<EventRedirection>)view targetView];
|
||||
}
|
||||
|
||||
if (![view isKindOfClass:[ChildView class]])
|
||||
return nil;
|
||||
|
||||
@ -4936,7 +4907,7 @@ ChildViewMouseTracker::WindowAcceptsEvent(NSWindow* aWindow, NSEvent* aEvent,
|
||||
NSWindow *ourWindow = [self window];
|
||||
NSView *contentView = [ourWindow contentView];
|
||||
if ([ourWindow isKindOfClass:[ToolbarWindow class]] && (self == contentView))
|
||||
return [ourWindow isMovableByWindowBackground];
|
||||
return NO;
|
||||
return [self nsChildView_NSView_mouseDownCanMoveWindow];
|
||||
}
|
||||
|
||||
|
@ -18,7 +18,6 @@
|
||||
class nsCocoaWindow;
|
||||
class nsChildView;
|
||||
class nsMenuBarX;
|
||||
@class ChildView;
|
||||
|
||||
// Value copied from BITMAP_MAX_AREA, used in nsNativeThemeCocoa.mm
|
||||
#define CUIDRAW_MAX_AREA 500000
|
||||
@ -177,7 +176,6 @@ typedef struct _nsCocoaWindowList {
|
||||
TitlebarAndBackgroundColor *mColor;
|
||||
float mUnifiedToolbarHeight;
|
||||
NSColor *mBackgroundColor;
|
||||
NSView *mTitlebarView; // strong
|
||||
}
|
||||
// Pass nil here to get the default appearance.
|
||||
- (void)setTitlebarColor:(NSColor*)aColor forActiveWindow:(BOOL)aActive;
|
||||
@ -188,7 +186,6 @@ typedef struct _nsCocoaWindowList {
|
||||
- (void)setTitlebarNeedsDisplayInRect:(NSRect)aRect sync:(BOOL)aSync;
|
||||
- (void)setTitlebarNeedsDisplayInRect:(NSRect)aRect;
|
||||
- (void)setDrawsContentsIntoWindowFrame:(BOOL)aState;
|
||||
- (ChildView*)mainChildView;
|
||||
@end
|
||||
|
||||
class nsCocoaWindow : public nsBaseWidget, public nsPIWidgetCocoa
|
||||
|
@ -447,10 +447,6 @@ nsresult nsCocoaWindow::CreateNativeWindow(const NSRect &aRect,
|
||||
[mWindow setContentMinSize:NSMakeSize(60, 60)];
|
||||
[mWindow disableCursorRects];
|
||||
|
||||
// Make sure the window starts out not draggable by the background.
|
||||
// We will turn it on as necessary.
|
||||
[mWindow setMovableByWindowBackground:NO];
|
||||
|
||||
[[WindowDataMap sharedWindowDataMap] ensureDataForWindow:mWindow];
|
||||
mWindowMadeHere = true;
|
||||
|
||||
@ -2587,94 +2583,7 @@ static const NSString* kStateShowsToolbarButton = @"showsToolbarButton";
|
||||
|
||||
@end
|
||||
|
||||
@interface TitlebarMouseHandlingView : NSView<EventRedirection>
|
||||
{
|
||||
ToolbarWindow* mWindow; // weak
|
||||
BOOL mProcessingRightMouseDown;
|
||||
}
|
||||
|
||||
- (id)initWithWindow:(ToolbarWindow*)aWindow;
|
||||
@end
|
||||
|
||||
@implementation TitlebarMouseHandlingView
|
||||
|
||||
- (id)initWithWindow:(ToolbarWindow*)aWindow
|
||||
{
|
||||
if ((self = [super initWithFrame:[aWindow titlebarRect]])) {
|
||||
mWindow = aWindow;
|
||||
[self setAutoresizingMask:(NSViewWidthSizable | NSViewMinYMargin)];
|
||||
[ChildView registerViewForDraggedTypes:self];
|
||||
mProcessingRightMouseDown = NO;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (NSView*)targetView
|
||||
{
|
||||
return [mWindow mainChildView];
|
||||
}
|
||||
|
||||
- (BOOL)mouseDownCanMoveWindow
|
||||
{
|
||||
return [mWindow isMovableByWindowBackground];
|
||||
}
|
||||
|
||||
// We redirect many types of events to the window's mainChildView simply by
|
||||
// passing the event object to the respective handler method. We don't need any
|
||||
// coordinate transformations because event coordinates are relative to the
|
||||
// window.
|
||||
// We only need to handle event types whose target NSView is determined by the
|
||||
// event's position. We don't need to handle key events and NSMouseMoved events
|
||||
// because those are only sent to the window's first responder. This view
|
||||
// doesn't override acceptsFirstResponder, so it will never receive those kinds
|
||||
// of events.
|
||||
|
||||
- (void)mouseMoved:(NSEvent*)aEvent { [[self targetView] mouseMoved:aEvent]; }
|
||||
- (void)mouseDown:(NSEvent*)aEvent { [[self targetView] mouseDown:aEvent]; }
|
||||
- (void)mouseUp:(NSEvent*)aEvent { [[self targetView] mouseUp:aEvent]; }
|
||||
- (void)mouseDragged:(NSEvent*)aEvent { [[self targetView] mouseDragged:aEvent]; }
|
||||
- (void)rightMouseDown:(NSEvent*)aEvent
|
||||
{
|
||||
// To avoid recursion...
|
||||
if (mProcessingRightMouseDown)
|
||||
return;
|
||||
mProcessingRightMouseDown = YES;
|
||||
[[self targetView] rightMouseDown:aEvent];
|
||||
mProcessingRightMouseDown = NO;
|
||||
}
|
||||
- (void)rightMouseUp:(NSEvent*)aEvent { [[self targetView] rightMouseUp:aEvent]; }
|
||||
- (void)rightMouseDragged:(NSEvent*)aEvent { [[self targetView] rightMouseDragged:aEvent]; }
|
||||
- (void)otherMouseDown:(NSEvent*)aEvent { [[self targetView] otherMouseDown:aEvent]; }
|
||||
- (void)otherMouseUp:(NSEvent*)aEvent { [[self targetView] otherMouseUp:aEvent]; }
|
||||
- (void)otherMouseDragged:(NSEvent*)aEvent { [[self targetView] otherMouseDragged:aEvent]; }
|
||||
- (void)scrollWheel:(NSEvent*)aEvent { [[self targetView] scrollWheel:aEvent]; }
|
||||
- (void)swipeWithEvent:(NSEvent*)aEvent { [[self targetView] swipeWithEvent:aEvent]; }
|
||||
- (void)beginGestureWithEvent:(NSEvent*)aEvent { [[self targetView] beginGestureWithEvent:aEvent]; }
|
||||
- (void)magnifyWithEvent:(NSEvent*)aEvent { [[self targetView] magnifyWithEvent:aEvent]; }
|
||||
- (void)rotateWithEvent:(NSEvent*)aEvent { [[self targetView] rotateWithEvent:aEvent]; }
|
||||
- (void)endGestureWithEvent:(NSEvent*)aEvent { [[self targetView] endGestureWithEvent:aEvent]; }
|
||||
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
|
||||
{ return [[self targetView] draggingEntered:sender]; }
|
||||
- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender
|
||||
{ return [[self targetView] draggingUpdated:sender]; }
|
||||
- (void)draggingExited:(id <NSDraggingInfo>)sender
|
||||
{ [[self targetView] draggingExited:sender]; }
|
||||
- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
|
||||
{ return [[self targetView] performDragOperation:sender]; }
|
||||
- (void)draggedImage:(NSImage *)anImage endedAt:(NSPoint)aPoint operation:(NSDragOperation)operation
|
||||
{ [[self targetView] draggedImage:anImage endedAt:aPoint operation:operation]; }
|
||||
- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal
|
||||
{ return [[self targetView] draggingSourceOperationMaskForLocal:isLocal]; }
|
||||
- (NSArray *)namesOfPromisedFilesDroppedAtDestination:(NSURL*)dropDestination
|
||||
{ return [[self targetView] namesOfPromisedFilesDroppedAtDestination:dropDestination]; }
|
||||
- (NSMenu*)menuForEvent:(NSEvent*)aEvent
|
||||
{ return [[self targetView] menuForEvent:aEvent]; }
|
||||
|
||||
@end
|
||||
|
||||
// This class allows us to exercise control over the window's title bar. This
|
||||
// allows for a "unified toolbar" look, and for extending the content area into
|
||||
// the title bar. It works like this:
|
||||
// This class allows us to have a "unified toolbar" style window. It works like this:
|
||||
// 1) We set the window's style to textured.
|
||||
// 2) Because of this, the background color applies to the entire window, including
|
||||
// the titlebar area. For normal textured windows, the default pattern is a
|
||||
@ -2708,11 +2617,6 @@ static const NSString* kStateShowsToolbarButton = @"showsToolbarButton";
|
||||
// to the containing window - the other direction doesn't work. That's why the
|
||||
// toolbar height is cached in the ToolbarWindow but nsNativeThemeCocoa can simply
|
||||
// query the window for its titlebar height when drawing the toolbar.
|
||||
@interface ToolbarWindow(Private)
|
||||
- (void)installTitlebarMouseHandlingView;
|
||||
- (void)uninstallTitlebarMouseHandlingView;
|
||||
@end;
|
||||
|
||||
@implementation ToolbarWindow
|
||||
|
||||
- (id)initWithContentRect:(NSRect)aContentRect styleMask:(NSUInteger)aStyle backing:(NSBackingStoreType)aBufferingType defer:(BOOL)aFlag
|
||||
@ -2747,7 +2651,6 @@ static const NSString* kStateShowsToolbarButton = @"showsToolbarButton";
|
||||
|
||||
[mColor release];
|
||||
[mBackgroundColor release];
|
||||
[mTitlebarView release];
|
||||
[super dealloc];
|
||||
|
||||
NS_OBJC_END_TRY_ABORT_BLOCK;
|
||||
@ -2827,48 +2730,11 @@ static const NSString* kStateShowsToolbarButton = @"showsToolbarButton";
|
||||
[self setTitlebarNeedsDisplayInRect:[self titlebarRect] sync:needSyncRedraw];
|
||||
}
|
||||
|
||||
// Extending the content area into the title bar works by redirection of both
|
||||
// drawing and mouse events.
|
||||
// The window's NSView hierarchy looks like this:
|
||||
// - border view ([[window contentView] superview])
|
||||
// - transparent title bar event redirection view
|
||||
// - window controls (traffic light buttons)
|
||||
// - content view ([window contentView], default NSView provided by the window)
|
||||
// - our main Gecko ChildView ([window mainChildView]), which has an
|
||||
// OpenGL context attached to it when accelerated
|
||||
// - possibly more ChildViews for plugins
|
||||
//
|
||||
// When the window is in title bar extension mode, the mainChildView covers the
|
||||
// whole window but is only visible in the content area of the window, because
|
||||
// it's a subview of the window's contentView and thus clipped to its dimensions.
|
||||
// This clipping is a good thing because it avoids a few problems. For example,
|
||||
// if the mainChildView weren't clipped and thus visible in the titlebar, we'd
|
||||
// have have to do the rounded corner masking and the drawing of the highlight
|
||||
// line ourselves.
|
||||
// This would be especially hard in combination with OpenGL acceleration since
|
||||
// rounded corners would require making the OpenGL context transparent, which
|
||||
// would bring another set of challenges with it. Having the window controls
|
||||
// draw on top of an OpenGL context could be hard, too.
|
||||
//
|
||||
// So title bar drawing happens in the border view. The border view's drawRect
|
||||
// method is not under our control, but we can get it to call into our code
|
||||
// using some tricks, see the TitlebarAndBackgroundColor class below.
|
||||
// Specifically, we have it call the TitlebarDrawCallback function, which
|
||||
// draws the contents of mainChildView into the provided CGContext.
|
||||
// (Even if the ChildView uses OpenGL for rendering, drawing in the title bar
|
||||
// will happen non-accelerated in that CGContext.)
|
||||
//
|
||||
// Mouse event redirection happens via a TitlebarMouseHandlingView which we
|
||||
// install below.
|
||||
- (void)setDrawsContentsIntoWindowFrame:(BOOL)aState
|
||||
{
|
||||
BOOL stateChanged = ([self drawsContentsIntoWindowFrame] != aState);
|
||||
[super setDrawsContentsIntoWindowFrame:aState];
|
||||
if (stateChanged && [[self delegate] isKindOfClass:[WindowDelegate class]]) {
|
||||
// Here we extend / shrink our mainChildView. We do that by firing a resize
|
||||
// event which will cause the ChildView to be resized to the rect returned
|
||||
// by nsCocoaWindow::GetClientBounds. GetClientBounds bases its return
|
||||
// value on what we return from drawsContentsIntoWindowFrame.
|
||||
WindowDelegate *windowDelegate = (WindowDelegate *)[self delegate];
|
||||
nsCocoaWindow *geckoWindow = [windowDelegate geckoWidget];
|
||||
if (geckoWindow) {
|
||||
@ -2883,35 +2749,10 @@ static const NSString* kStateShowsToolbarButton = @"showsToolbarButton";
|
||||
// we'll send a mouse move event with the correct new position.
|
||||
ChildViewMouseTracker::ResendLastMouseMoveEvent();
|
||||
|
||||
if (aState) {
|
||||
[self installTitlebarMouseHandlingView];
|
||||
} else {
|
||||
[self uninstallTitlebarMouseHandlingView];
|
||||
}
|
||||
[self setTitlebarNeedsDisplayInRect:[self titlebarRect]];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)installTitlebarMouseHandlingView
|
||||
{
|
||||
mTitlebarView = [[TitlebarMouseHandlingView alloc] initWithWindow:self];
|
||||
[[[self contentView] superview] addSubview:mTitlebarView positioned:NSWindowBelow relativeTo:nil];
|
||||
}
|
||||
|
||||
- (void)uninstallTitlebarMouseHandlingView
|
||||
{
|
||||
[mTitlebarView removeFromSuperview];
|
||||
[mTitlebarView release];
|
||||
mTitlebarView = nil;
|
||||
}
|
||||
|
||||
- (ChildView*)mainChildView
|
||||
{
|
||||
NSView* view = [[[self contentView] subviews] lastObject];
|
||||
if (view && [view isKindOfClass:[ChildView class]])
|
||||
return (ChildView*)view;
|
||||
return nil;
|
||||
}
|
||||
|
||||
// Returning YES here makes the setShowsToolbarButton method work even though
|
||||
// the window doesn't contain an NSToolbar.
|
||||
- (BOOL)_hasToolbar
|
||||
@ -2980,9 +2821,6 @@ static const NSString* kStateShowsToolbarButton = @"showsToolbarButton";
|
||||
if (delegate && [delegate isKindOfClass:[WindowDelegate class]]) {
|
||||
nsCocoaWindow *widget = [(WindowDelegate *)delegate geckoWidget];
|
||||
if (widget) {
|
||||
if (type == NSMouseMoved) {
|
||||
[[self mainChildView] updateWindowDraggableStateOnMouseMove:anEvent];
|
||||
}
|
||||
if (gGeckoAppModalWindowList && (widget != gGeckoAppModalWindowList->window))
|
||||
return;
|
||||
if (widget->HasModalDescendents())
|
||||
@ -3048,8 +2886,8 @@ TitlebarDrawCallback(void* aInfo, CGContextRef aContext)
|
||||
NSRect titlebarRect = [window titlebarRect];
|
||||
|
||||
if ([window drawsContentsIntoWindowFrame]) {
|
||||
ChildView* view = [window mainChildView];
|
||||
if (!view)
|
||||
NSView* view = [[[window contentView] subviews] lastObject];
|
||||
if (!view || ![view isKindOfClass:[ChildView class]])
|
||||
return;
|
||||
|
||||
// Gecko drawing assumes flippedness, but the current context isn't flipped
|
||||
@ -3060,7 +2898,7 @@ TitlebarDrawCallback(void* aInfo, CGContextRef aContext)
|
||||
CGContextTranslateCTM(aContext, 0.0f, -[window frame].size.height);
|
||||
|
||||
NSRect flippedTitlebarRect = { NSZeroPoint, titlebarRect.size };
|
||||
[view drawRect:flippedTitlebarRect inTitlebarContext:aContext];
|
||||
[(ChildView*)view drawRect:flippedTitlebarRect inTitlebarContext:aContext];
|
||||
} else {
|
||||
BOOL isMain = [window isMainWindow];
|
||||
NSColor *titlebarColor = [window titlebarColorForActiveWindow:isMain];
|
||||
|
Loading…
Reference in New Issue
Block a user