OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "chrome/browser/ui/cocoa/info_bubble_window.h" | 5 #import "chrome/browser/ui/cocoa/info_bubble_window.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/mac/foundation_util.h" |
9 #include "base/memory/scoped_nsobject.h" | 10 #include "base/memory/scoped_nsobject.h" |
10 #include "content/public/browser/notification_observer.h" | 11 #include "content/public/browser/notification_observer.h" |
11 #include "content/public/browser/notification_registrar.h" | 12 #include "content/public/browser/notification_registrar.h" |
12 #include "content/public/browser/notification_service.h" | 13 #include "content/public/browser/notification_service.h" |
13 #include "content/public/browser/notification_types.h" | 14 #include "content/public/browser/notification_types.h" |
14 #import "third_party/GTM/AppKit/GTMNSAnimation+Duration.h" | 15 #import "third_party/GTM/AppKit/GTMNSAnimation+Duration.h" |
15 | 16 |
16 namespace { | 17 namespace { |
17 const CGFloat kOrderInSlideOffset = 10; | 18 const CGFloat kOrderInSlideOffset = 10; |
18 const NSTimeInterval kOrderInAnimationDuration = 0.075; | 19 const NSTimeInterval kOrderInAnimationDuration = 0.075; |
19 const NSTimeInterval kOrderOutAnimationDuration = 0.15; | 20 const NSTimeInterval kOrderOutAnimationDuration = 0.15; |
20 // The minimum representable time interval. This can be used as the value | 21 // The minimum representable time interval. This can be used as the value |
21 // passed to +[NSAnimationContext setDuration:] to stop an in-progress | 22 // passed to +[NSAnimationContext setDuration:] to stop an in-progress |
22 // animation as quickly as possible. | 23 // animation as quickly as possible. |
23 const NSTimeInterval kMinimumTimeInterval = | 24 const NSTimeInterval kMinimumTimeInterval = |
24 std::numeric_limits<NSTimeInterval>::min(); | 25 std::numeric_limits<NSTimeInterval>::min(); |
25 } | 26 } // namespace |
26 | 27 |
27 @interface InfoBubbleWindow(Private) | 28 // Forward declare private window server functions used to style the window. |
| 29 extern "C" { |
| 30 typedef int CGSConnection; |
| 31 typedef int CGSWindow; |
| 32 typedef void* CGSWindowFilterRef; |
| 33 |
| 34 CGSConnection _CGSDefaultConnection(); |
| 35 CGError CGSNewCIFilterByName(CGSConnection cid, |
| 36 CFStringRef filterName, |
| 37 CGSWindowFilterRef *outFilter); |
| 38 CGError CGSAddWindowFilter(CGSConnection cid, |
| 39 CGSWindow wid, |
| 40 CGSWindowFilterRef filter, |
| 41 int flags); |
| 42 CGError CGSReleaseCIFilter(CGSConnection cid, CGSWindowFilterRef filter); |
| 43 CGError CGSSetCIFilterValuesFromDictionary( |
| 44 CGSConnection cid, CGSWindowFilterRef filter, CFDictionaryRef filterValues); |
| 45 } // extern "C" |
| 46 |
| 47 @interface InfoBubbleWindow (Private) |
28 - (void)appIsTerminating; | 48 - (void)appIsTerminating; |
29 - (void)finishCloseAfterAnimation; | 49 - (void)finishCloseAfterAnimation; |
30 @end | 50 @end |
31 | 51 |
32 // A helper class to proxy app notifications to the window. | 52 // A helper class to proxy app notifications to the window. |
33 class AppNotificationBridge : public content::NotificationObserver { | 53 class AppNotificationBridge : public content::NotificationObserver { |
34 public: | 54 public: |
35 explicit AppNotificationBridge(InfoBubbleWindow* owner) : owner_(owner) { | 55 explicit AppNotificationBridge(InfoBubbleWindow* owner) : owner_(owner) { |
36 registrar_.Add(this, content::NOTIFICATION_APP_TERMINATING, | 56 registrar_.Add(this, content::NOTIFICATION_APP_TERMINATING, |
37 content::NotificationService::AllSources()); | 57 content::NotificationService::AllSources()); |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
195 // Order self appropriately assuming that its alpha is zero as set up | 215 // Order self appropriately assuming that its alpha is zero as set up |
196 // in the designated initializer. | 216 // in the designated initializer. |
197 [super orderWindow:orderingMode relativeTo:otherWindowNumber]; | 217 [super orderWindow:orderingMode relativeTo:otherWindowNumber]; |
198 | 218 |
199 // Set up frame so it can be adjust down by a few pixels. | 219 // Set up frame so it can be adjust down by a few pixels. |
200 NSRect frame = [self frame]; | 220 NSRect frame = [self frame]; |
201 NSPoint newOrigin = frame.origin; | 221 NSPoint newOrigin = frame.origin; |
202 newOrigin.y += kOrderInSlideOffset; | 222 newOrigin.y += kOrderInSlideOffset; |
203 [self setFrameOrigin:newOrigin]; | 223 [self setFrameOrigin:newOrigin]; |
204 | 224 |
| 225 // Add a gaussian blur to the window. |
| 226 CGSConnection cgsConnection = _CGSDefaultConnection(); |
| 227 CGSWindowFilterRef filter; |
| 228 if (CGSNewCIFilterByName(cgsConnection, CFSTR("CIGaussianBlur"), |
| 229 &filter) == kCGErrorSuccess) { |
| 230 NSDictionary* blurOptions = |
| 231 [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:1.5] |
| 232 forKey:@"inputRadius"]; |
| 233 |
| 234 if (CGSSetCIFilterValuesFromDictionary(cgsConnection, filter, |
| 235 base::mac::NSToCFCast(blurOptions)) == kCGErrorSuccess) { |
| 236 CGSAddWindowFilter(cgsConnection, [self windowNumber], filter, 1); |
| 237 } |
| 238 |
| 239 CGSReleaseCIFilter(cgsConnection, filter); |
| 240 } |
| 241 |
205 // Apply animations to show and move self. | 242 // Apply animations to show and move self. |
206 [NSAnimationContext beginGrouping]; | 243 [NSAnimationContext beginGrouping]; |
207 // The star currently triggers on mouse down, not mouse up. | 244 // The star currently triggers on mouse down, not mouse up. |
208 [[NSAnimationContext currentContext] | 245 [[NSAnimationContext currentContext] |
209 gtm_setDuration:kOrderInAnimationDuration | 246 gtm_setDuration:kOrderInAnimationDuration |
210 eventMask:NSLeftMouseUpMask|NSLeftMouseDownMask]; | 247 eventMask:NSLeftMouseUpMask|NSLeftMouseDownMask]; |
211 [[self animator] setAlphaValue:1.0]; | 248 [[self animator] setAlphaValue:1.0]; |
212 [[self animator] setFrame:frame display:YES]; | 249 [[self animator] setFrame:frame display:YES]; |
213 [NSAnimationContext endGrouping]; | 250 [NSAnimationContext endGrouping]; |
214 } else { | 251 } else { |
215 [super orderWindow:orderingMode relativeTo:otherWindowNumber]; | 252 [super orderWindow:orderingMode relativeTo:otherWindowNumber]; |
216 } | 253 } |
217 } | 254 } |
218 | 255 |
219 // If the window is currently animating a close, block all UI events to the | 256 // If the window is currently animating a close, block all UI events to the |
220 // window. | 257 // window. |
221 - (void)sendEvent:(NSEvent*)theEvent { | 258 - (void)sendEvent:(NSEvent*)theEvent { |
222 if (!closing_) | 259 if (!closing_) |
223 [super sendEvent:theEvent]; | 260 [super sendEvent:theEvent]; |
224 } | 261 } |
225 | 262 |
226 - (BOOL)isClosing { | 263 - (BOOL)isClosing { |
227 return closing_; | 264 return closing_; |
228 } | 265 } |
229 | 266 |
230 @end | 267 @end |
OLD | NEW |