| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #include "webkit/glue/webcursor.h" | 5 #include "webkit/glue/webcursor.h" |
| 6 | 6 |
| 7 #import <AppKit/AppKit.h> | 7 #import <AppKit/AppKit.h> |
| 8 #include <Carbon/Carbon.h> | 8 #include <Carbon/Carbon.h> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/mac/mac_util.h" | 11 #include "base/mac/mac_util.h" |
| 12 #include "base/mac/scoped_cftyperef.h" | 12 #include "base/mac/scoped_cftyperef.h" |
| 13 #include "base/memory/scoped_nsobject.h" | 13 #include "base/memory/scoped_nsobject.h" |
| 14 #include "grit/webkit_resources.h" |
| 14 #include "skia/ext/skia_utils_mac.h" | 15 #include "skia/ext/skia_utils_mac.h" |
| 15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h" | 16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h" |
| 16 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebImage.h" | 17 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebImage.h" |
| 17 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebSize.h" | 18 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebSize.h" |
| 18 #include "ui/gfx/mac/nsimage_cache.h" | 19 #include "ui/base/resource/resource_bundle.h" |
| 19 | 20 |
| 20 using WebKit::WebCursorInfo; | 21 using WebKit::WebCursorInfo; |
| 21 using WebKit::WebImage; | 22 using WebKit::WebImage; |
| 22 using WebKit::WebSize; | 23 using WebKit::WebSize; |
| 23 | 24 |
| 24 // Declare symbols that are part of the 10.7 SDK. | 25 // Declare symbols that are part of the 10.7 SDK. |
| 25 #if !defined(MAC_OS_X_VERSION_10_7) || \ | 26 #if !defined(MAC_OS_X_VERSION_10_7) || \ |
| 26 MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 | 27 MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 |
| 27 | 28 |
| 28 @interface NSCursor (LionSDKDeclarations) | 29 @interface NSCursor (LionSDKDeclarations) |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 } | 108 } |
| 108 | 109 |
| 109 - (CrCoreCursorType)_coreCursorType { | 110 - (CrCoreCursorType)_coreCursorType { |
| 110 return type_; | 111 return type_; |
| 111 } | 112 } |
| 112 | 113 |
| 113 @end | 114 @end |
| 114 | 115 |
| 115 namespace { | 116 namespace { |
| 116 | 117 |
| 117 // Loads a cursor from the image cache. | 118 NSCursor* LoadCursor(int resource_id, int hotspot_x, int hotspot_y) { |
| 118 NSCursor* LoadCursor(const char* name, int hotspot_x, int hotspot_y) { | 119 NSImage* cursor_image = |
| 119 NSString* file_name = [NSString stringWithUTF8String:name]; | 120 ResourceBundle::GetSharedInstance().GetNativeImageNamed(resource_id); |
| 120 DCHECK(file_name); | |
| 121 // TODO: This image fetch can (and probably should) be serviced by the | |
| 122 // resource resource bundle instead of going through the image cache. | |
| 123 NSImage* cursor_image = gfx::GetCachedImageWithName(file_name); | |
| 124 DCHECK(cursor_image); | 121 DCHECK(cursor_image); |
| 125 return [[[NSCursor alloc] initWithImage:cursor_image | 122 return [[[NSCursor alloc] initWithImage:cursor_image |
| 126 hotSpot:NSMakePoint(hotspot_x, | 123 hotSpot:NSMakePoint(hotspot_x, |
| 127 hotspot_y)] autorelease]; | 124 hotspot_y)] autorelease]; |
| 128 } | 125 } |
| 129 | 126 |
| 130 // Gets a specified cursor from CoreCursor, falling back to loading it from the | 127 // Gets a specified cursor from CoreCursor, falling back to loading it from the |
| 131 // image cache if CoreCursor cannot provide it. | 128 // image cache if CoreCursor cannot provide it. |
| 132 NSCursor* GetCoreCursorWithFallback(CrCoreCursorType type, | 129 NSCursor* GetCoreCursorWithFallback(CrCoreCursorType type, |
| 133 const char* name, | 130 int resource_id, |
| 134 int hotspot_x, | 131 int hotspot_x, |
| 135 int hotspot_y) { | 132 int hotspot_y) { |
| 136 if (base::mac::IsOSLionOrLater()) { | 133 if (base::mac::IsOSLionOrLater()) { |
| 137 NSCursor* cursor = [CrCoreCursor cursorWithType:type]; | 134 NSCursor* cursor = [CrCoreCursor cursorWithType:type]; |
| 138 if (cursor) | 135 if (cursor) |
| 139 return cursor; | 136 return cursor; |
| 140 } | 137 } |
| 141 | 138 |
| 142 return LoadCursor(name, hotspot_x, hotspot_y); | 139 return LoadCursor(resource_id, hotspot_x, hotspot_y); |
| 143 } | 140 } |
| 144 | 141 |
| 145 // TODO(avi): When Skia becomes default, fold this function into the remaining | 142 // TODO(avi): When Skia becomes default, fold this function into the remaining |
| 146 // caller, InitFromCursor(). | 143 // caller, InitFromCursor(). |
| 147 CGImageRef CreateCGImageFromCustomData(const std::vector<char>& custom_data, | 144 CGImageRef CreateCGImageFromCustomData(const std::vector<char>& custom_data, |
| 148 const gfx::Size& custom_size) { | 145 const gfx::Size& custom_size) { |
| 149 // If the data is missing, leave the backing transparent. | 146 // If the data is missing, leave the backing transparent. |
| 150 void* data = NULL; | 147 void* data = NULL; |
| 151 if (!custom_data.empty()) { | 148 if (!custom_data.empty()) { |
| 152 // This is safe since we're not going to draw into the context we're | 149 // This is safe since we're not going to draw into the context we're |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 case WebCursorInfo::TypePointer: | 217 case WebCursorInfo::TypePointer: |
| 221 return [NSCursor arrowCursor]; | 218 return [NSCursor arrowCursor]; |
| 222 case WebCursorInfo::TypeCross: | 219 case WebCursorInfo::TypeCross: |
| 223 return [NSCursor crosshairCursor]; | 220 return [NSCursor crosshairCursor]; |
| 224 case WebCursorInfo::TypeHand: | 221 case WebCursorInfo::TypeHand: |
| 225 // If >= 10.7, the pointingHandCursor has a shadow so use it. Otherwise | 222 // If >= 10.7, the pointingHandCursor has a shadow so use it. Otherwise |
| 226 // use the custom one. | 223 // use the custom one. |
| 227 if (base::mac::IsOSLionOrLater()) | 224 if (base::mac::IsOSLionOrLater()) |
| 228 return [NSCursor pointingHandCursor]; | 225 return [NSCursor pointingHandCursor]; |
| 229 else | 226 else |
| 230 return LoadCursor("linkCursor", 6, 1); | 227 return LoadCursor(IDR_LINK_CURSOR, 6, 1); |
| 231 case WebCursorInfo::TypeIBeam: | 228 case WebCursorInfo::TypeIBeam: |
| 232 return [NSCursor IBeamCursor]; | 229 return [NSCursor IBeamCursor]; |
| 233 case WebCursorInfo::TypeWait: | 230 case WebCursorInfo::TypeWait: |
| 234 return GetCoreCursorWithFallback(kBusyButClickableCursor, | 231 return GetCoreCursorWithFallback(kBusyButClickableCursor, |
| 235 "waitCursor", 7, 7); | 232 IDR_WAIT_CURSOR, 7, 7); |
| 236 case WebCursorInfo::TypeHelp: | 233 case WebCursorInfo::TypeHelp: |
| 237 return GetCoreCursorWithFallback(kHelpCursor, | 234 return GetCoreCursorWithFallback(kHelpCursor, |
| 238 "helpCursor", 8, 8); | 235 IDR_HELP_CURSOR, 8, 8); |
| 239 case WebCursorInfo::TypeEastResize: | 236 case WebCursorInfo::TypeEastResize: |
| 240 case WebCursorInfo::TypeEastPanning: | 237 case WebCursorInfo::TypeEastPanning: |
| 241 return GetCoreCursorWithFallback(kResizeEastCursor, | 238 return GetCoreCursorWithFallback(kResizeEastCursor, |
| 242 "eastResizeCursor", 14, 7); | 239 IDR_EAST_RESIZE_CURSOR, 14, 7); |
| 243 case WebCursorInfo::TypeNorthResize: | 240 case WebCursorInfo::TypeNorthResize: |
| 244 case WebCursorInfo::TypeNorthPanning: | 241 case WebCursorInfo::TypeNorthPanning: |
| 245 return GetCoreCursorWithFallback(kResizeNorthCursor, | 242 return GetCoreCursorWithFallback(kResizeNorthCursor, |
| 246 "northResizeCursor", 7, 1); | 243 IDR_NORTH_RESIZE_CURSOR, 7, 1); |
| 247 case WebCursorInfo::TypeNorthEastResize: | 244 case WebCursorInfo::TypeNorthEastResize: |
| 248 case WebCursorInfo::TypeNorthEastPanning: | 245 case WebCursorInfo::TypeNorthEastPanning: |
| 249 return GetCoreCursorWithFallback(kResizeNortheastCursor, | 246 return GetCoreCursorWithFallback(kResizeNortheastCursor, |
| 250 "northEastResizeCursor", 14, 1); | 247 IDR_NORTHEAST_RESIZE_CURSOR, 14, 1); |
| 251 case WebCursorInfo::TypeNorthWestResize: | 248 case WebCursorInfo::TypeNorthWestResize: |
| 252 case WebCursorInfo::TypeNorthWestPanning: | 249 case WebCursorInfo::TypeNorthWestPanning: |
| 253 return GetCoreCursorWithFallback(kResizeNorthwestCursor, | 250 return GetCoreCursorWithFallback(kResizeNorthwestCursor, |
| 254 "northWestResizeCursor", 0, 0); | 251 IDR_NORTHWEST_RESIZE_CURSOR, 0, 0); |
| 255 case WebCursorInfo::TypeSouthResize: | 252 case WebCursorInfo::TypeSouthResize: |
| 256 case WebCursorInfo::TypeSouthPanning: | 253 case WebCursorInfo::TypeSouthPanning: |
| 257 return GetCoreCursorWithFallback(kResizeSouthCursor, | 254 return GetCoreCursorWithFallback(kResizeSouthCursor, |
| 258 "southResizeCursor", 7, 14); | 255 IDR_SOUTH_RESIZE_CURSOR, 7, 14); |
| 259 case WebCursorInfo::TypeSouthEastResize: | 256 case WebCursorInfo::TypeSouthEastResize: |
| 260 case WebCursorInfo::TypeSouthEastPanning: | 257 case WebCursorInfo::TypeSouthEastPanning: |
| 261 return GetCoreCursorWithFallback(kResizeSoutheastCursor, | 258 return GetCoreCursorWithFallback(kResizeSoutheastCursor, |
| 262 "southEastResizeCursor", 14, 14); | 259 IDR_SOUTHEAST_RESIZE_CURSOR, 14, 14); |
| 263 case WebCursorInfo::TypeSouthWestResize: | 260 case WebCursorInfo::TypeSouthWestResize: |
| 264 case WebCursorInfo::TypeSouthWestPanning: | 261 case WebCursorInfo::TypeSouthWestPanning: |
| 265 return GetCoreCursorWithFallback(kResizeSouthwestCursor, | 262 return GetCoreCursorWithFallback(kResizeSouthwestCursor, |
| 266 "southWestResizeCursor", 1, 14); | 263 IDR_SOUTHWEST_RESIZE_CURSOR, 1, 14); |
| 267 case WebCursorInfo::TypeWestResize: | 264 case WebCursorInfo::TypeWestResize: |
| 268 case WebCursorInfo::TypeWestPanning: | 265 case WebCursorInfo::TypeWestPanning: |
| 269 return GetCoreCursorWithFallback(kResizeWestCursor, | 266 return GetCoreCursorWithFallback(kResizeWestCursor, |
| 270 "westResizeCursor", 1, 7); | 267 IDR_WEST_RESIZE_CURSOR, 1, 7); |
| 271 case WebCursorInfo::TypeNorthSouthResize: | 268 case WebCursorInfo::TypeNorthSouthResize: |
| 272 return GetCoreCursorWithFallback(kResizeNorthSouthCursor, | 269 return GetCoreCursorWithFallback(kResizeNorthSouthCursor, |
| 273 "northSouthResizeCursor", 7, 7); | 270 IDR_NORTHSOUTH_RESIZE_CURSOR, 7, 7); |
| 274 case WebCursorInfo::TypeEastWestResize: | 271 case WebCursorInfo::TypeEastWestResize: |
| 275 return GetCoreCursorWithFallback(kResizeEastWestCursor, | 272 return GetCoreCursorWithFallback(kResizeEastWestCursor, |
| 276 "eastWestResizeCursor", 7, 7); | 273 IDR_EASTWEST_RESIZE_CURSOR, 7, 7); |
| 277 case WebCursorInfo::TypeNorthEastSouthWestResize: | 274 case WebCursorInfo::TypeNorthEastSouthWestResize: |
| 278 return GetCoreCursorWithFallback(kResizeNortheastSouthwestCursor, | 275 return GetCoreCursorWithFallback(kResizeNortheastSouthwestCursor, |
| 279 "northEastSouthWestResizeCursor", 7, 7); | 276 IDR_NORTHEASTSOUTHWEST_RESIZE_CURSOR, |
| 277 7, 7); |
| 280 case WebCursorInfo::TypeNorthWestSouthEastResize: | 278 case WebCursorInfo::TypeNorthWestSouthEastResize: |
| 281 return GetCoreCursorWithFallback(kResizeNorthwestSoutheastCursor, | 279 return GetCoreCursorWithFallback(kResizeNorthwestSoutheastCursor, |
| 282 "northWestSouthEastResizeCursor", 7, 7); | 280 IDR_NORTHWESTSOUTHEAST_RESIZE_CURSOR, |
| 281 7, 7); |
| 283 case WebCursorInfo::TypeColumnResize: | 282 case WebCursorInfo::TypeColumnResize: |
| 284 return [NSCursor resizeLeftRightCursor]; | 283 return [NSCursor resizeLeftRightCursor]; |
| 285 case WebCursorInfo::TypeRowResize: | 284 case WebCursorInfo::TypeRowResize: |
| 286 return [NSCursor resizeUpDownCursor]; | 285 return [NSCursor resizeUpDownCursor]; |
| 287 case WebCursorInfo::TypeMiddlePanning: | 286 case WebCursorInfo::TypeMiddlePanning: |
| 288 case WebCursorInfo::TypeMove: | 287 case WebCursorInfo::TypeMove: |
| 289 return GetCoreCursorWithFallback(kMoveCursor, | 288 return GetCoreCursorWithFallback(kMoveCursor, |
| 290 "moveCursor", 7, 7); | 289 IDR_MOVE_CURSOR, 7, 7); |
| 291 case WebCursorInfo::TypeVerticalText: | 290 case WebCursorInfo::TypeVerticalText: |
| 292 // IBeamCursorForVerticalLayout is >= 10.7. | 291 // IBeamCursorForVerticalLayout is >= 10.7. |
| 293 if ([NSCursor respondsToSelector:@selector(IBeamCursorForVerticalLayout)]) | 292 if ([NSCursor respondsToSelector:@selector(IBeamCursorForVerticalLayout)]) |
| 294 return [NSCursor IBeamCursorForVerticalLayout]; | 293 return [NSCursor IBeamCursorForVerticalLayout]; |
| 295 else | 294 else |
| 296 return LoadCursor("verticalTextCursor", 7, 7); | 295 return LoadCursor(IDR_VERTICALTEXT_CURSOR, 7, 7); |
| 297 case WebCursorInfo::TypeCell: | 296 case WebCursorInfo::TypeCell: |
| 298 return GetCoreCursorWithFallback(kCellCursor, | 297 return GetCoreCursorWithFallback(kCellCursor, |
| 299 "cellCursor", 7, 7); | 298 IDR_CELL_CURSOR, 7, 7); |
| 300 case WebCursorInfo::TypeContextMenu: | 299 case WebCursorInfo::TypeContextMenu: |
| 301 // contextualMenuCursor is >= 10.6. | 300 // contextualMenuCursor is >= 10.6. |
| 302 if ([NSCursor respondsToSelector:@selector(contextualMenuCursor)]) | 301 if ([NSCursor respondsToSelector:@selector(contextualMenuCursor)]) |
| 303 return [NSCursor contextualMenuCursor]; | 302 return [NSCursor contextualMenuCursor]; |
| 304 else | 303 else |
| 305 return LoadCursor("contextMenuCursor", 3, 2); | 304 return LoadCursor(IDR_CONTEXTMENU_CURSOR, 3, 2); |
| 306 case WebCursorInfo::TypeAlias: | 305 case WebCursorInfo::TypeAlias: |
| 307 return GetCoreCursorWithFallback(kMakeAliasCursor, | 306 return GetCoreCursorWithFallback(kMakeAliasCursor, |
| 308 "aliasCursor", 11, 3); | 307 IDR_ALIAS_CURSOR, 11, 3); |
| 309 case WebCursorInfo::TypeProgress: | 308 case WebCursorInfo::TypeProgress: |
| 310 return GetCoreCursorWithFallback(kBusyButClickableCursor, | 309 return GetCoreCursorWithFallback(kBusyButClickableCursor, |
| 311 "progressCursor", 3, 2); | 310 IDR_PROGRESS_CURSOR, 3, 2); |
| 312 case WebCursorInfo::TypeNoDrop: | 311 case WebCursorInfo::TypeNoDrop: |
| 313 case WebCursorInfo::TypeNotAllowed: | 312 case WebCursorInfo::TypeNotAllowed: |
| 314 // Docs say that operationNotAllowedCursor is >= 10.6, and it's not in the | 313 // Docs say that operationNotAllowedCursor is >= 10.6, and it's not in the |
| 315 // 10.5 SDK, but later SDKs note that it really is available on 10.5. | 314 // 10.5 SDK, but later SDKs note that it really is available on 10.5. |
| 316 return [NSCursor operationNotAllowedCursor]; | 315 return [NSCursor operationNotAllowedCursor]; |
| 317 case WebCursorInfo::TypeCopy: | 316 case WebCursorInfo::TypeCopy: |
| 318 // dragCopyCursor is >= 10.6. | 317 // dragCopyCursor is >= 10.6. |
| 319 if ([NSCursor respondsToSelector:@selector(dragCopyCursor)]) | 318 if ([NSCursor respondsToSelector:@selector(dragCopyCursor)]) |
| 320 return [NSCursor dragCopyCursor]; | 319 return [NSCursor dragCopyCursor]; |
| 321 else | 320 else |
| 322 return LoadCursor("copyCursor", 3, 2); | 321 return LoadCursor(IDR_COPY_CURSOR, 3, 2); |
| 323 case WebCursorInfo::TypeNone: | 322 case WebCursorInfo::TypeNone: |
| 324 return LoadCursor("noneCursor", 7, 7); | 323 return LoadCursor(IDR_NONE_CURSOR, 7, 7); |
| 325 case WebCursorInfo::TypeZoomIn: | 324 case WebCursorInfo::TypeZoomIn: |
| 326 return GetCoreCursorWithFallback(kZoomInCursor, | 325 return GetCoreCursorWithFallback(kZoomInCursor, |
| 327 "zoomInCursor", 7, 7); | 326 IDR_ZOOMIN_CURSOR, 7, 7); |
| 328 case WebCursorInfo::TypeZoomOut: | 327 case WebCursorInfo::TypeZoomOut: |
| 329 return GetCoreCursorWithFallback(kZoomOutCursor, | 328 return GetCoreCursorWithFallback(kZoomOutCursor, |
| 330 "zoomOutCursor", 7, 7); | 329 IDR_ZOOMOUT_CURSOR, 7, 7); |
| 331 case WebCursorInfo::TypeGrab: | 330 case WebCursorInfo::TypeGrab: |
| 332 return [NSCursor openHandCursor]; | 331 return [NSCursor openHandCursor]; |
| 333 case WebCursorInfo::TypeGrabbing: | 332 case WebCursorInfo::TypeGrabbing: |
| 334 return [NSCursor closedHandCursor]; | 333 return [NSCursor closedHandCursor]; |
| 335 case WebCursorInfo::TypeCustom: | 334 case WebCursorInfo::TypeCustom: |
| 336 return CreateCustomCursor(custom_data_, custom_size_, hotspot_); | 335 return CreateCustomCursor(custom_data_, custom_size_, hotspot_); |
| 337 } | 336 } |
| 338 NOTREACHED(); | 337 NOTREACHED(); |
| 339 return nil; | 338 return nil; |
| 340 } | 339 } |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 535 return true; | 534 return true; |
| 536 } | 535 } |
| 537 | 536 |
| 538 void WebCursor::CleanupPlatformData() { | 537 void WebCursor::CleanupPlatformData() { |
| 539 return; | 538 return; |
| 540 } | 539 } |
| 541 | 540 |
| 542 void WebCursor::CopyPlatformData(const WebCursor& other) { | 541 void WebCursor::CopyPlatformData(const WebCursor& other) { |
| 543 return; | 542 return; |
| 544 } | 543 } |
| OLD | NEW |