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 #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/scoped_cftyperef.h" | 12 #include "base/mac/scoped_cftyperef.h" |
12 #include "base/memory/scoped_nsobject.h" | 13 #include "base/memory/scoped_nsobject.h" |
13 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h" | 14 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h" |
14 #include "third_party/WebKit/Source/WebKit/chromium/public/WebImage.h" | 15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebImage.h" |
15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h" | 16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h" |
16 #include "ui/gfx/mac/nsimage_cache.h" | 17 #include "ui/gfx/mac/nsimage_cache.h" |
17 | 18 |
18 #if WEBKIT_USING_SKIA | 19 #if WEBKIT_USING_SKIA |
19 #include "skia/ext/skia_utils_mac.h" | 20 #include "skia/ext/skia_utils_mac.h" |
20 #endif | 21 #endif |
21 | 22 |
22 using WebKit::WebCursorInfo; | 23 using WebKit::WebCursorInfo; |
23 using WebKit::WebImage; | 24 using WebKit::WebImage; |
24 using WebKit::WebSize; | 25 using WebKit::WebSize; |
25 | 26 |
27 // Forward-declare symbols that are part of the 10.6 SDK. | |
Mark Mentovai
2011/08/15 16:00:08
Nit: These are declarations, not really anything e
Avi (use Gerrit)
2011/08/15 16:09:34
Done.
| |
28 #if !defined(MAC_OS_X_VERSION_10_6) || \ | |
29 MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6 | |
30 | |
31 @interface NSCursor (SnowLeopardSDKDeclarations) | |
32 + (NSCursor *)contextualMenuCursor; | |
Mark Mentovai
2011/08/15 16:00:08
Nit: This file uses NSCursor* style, no space.
Avi (use Gerrit)
2011/08/15 16:09:34
Done.
| |
33 + (NSCursor *)dragCopyCursor; | |
34 + (NSCursor *)operationNotAllowedCursor; | |
35 @end | |
36 | |
37 #endif // MAC_OS_X_VERSION_10_6 | |
38 | |
39 // Forward-declare symbols that are part of the 10.7 SDK. | |
40 #if !defined(MAC_OS_X_VERSION_10_7) || \ | |
41 MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 | |
42 | |
43 @interface NSCursor (LionSDKDeclarations) | |
44 + (NSCursor *)IBeamCursorForVerticalLayout; | |
45 @end | |
46 | |
47 #endif // MAC_OS_X_VERSION_10_7 | |
48 | |
26 namespace { | 49 namespace { |
27 | 50 |
28 // TODO: This image fetch can (and probably should) be serviced by the resource | 51 // TODO: This image fetch can (and probably should) be serviced by the resource |
29 // resource bundle instead of going through the image cache. | 52 // resource bundle instead of going through the image cache. |
30 NSCursor* LoadCursor(const char* name, int x, int y) { | 53 NSCursor* LoadCursor(const char* name, int x, int y) { |
31 NSString* file_name = [NSString stringWithUTF8String:name]; | 54 NSString* file_name = [NSString stringWithUTF8String:name]; |
32 DCHECK(file_name); | 55 DCHECK(file_name); |
33 NSImage* cursor_image = gfx::GetCachedImageWithName(file_name); | 56 NSImage* cursor_image = gfx::GetCachedImageWithName(file_name); |
34 DCHECK(cursor_image); | 57 DCHECK(cursor_image); |
35 return [[[NSCursor alloc] initWithImage:cursor_image | 58 return [[[NSCursor alloc] initWithImage:cursor_image |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
87 } | 110 } |
88 | 111 |
89 } // namespace | 112 } // namespace |
90 | 113 |
91 // We're matching Safari's cursor choices; see platform/mac/CursorMac.mm | 114 // We're matching Safari's cursor choices; see platform/mac/CursorMac.mm |
92 NSCursor* WebCursor::GetCursor() const { | 115 NSCursor* WebCursor::GetCursor() const { |
93 switch (type_) { | 116 switch (type_) { |
94 case WebCursorInfo::TypePointer: | 117 case WebCursorInfo::TypePointer: |
95 return [NSCursor arrowCursor]; | 118 return [NSCursor arrowCursor]; |
96 case WebCursorInfo::TypeCross: | 119 case WebCursorInfo::TypeCross: |
97 return LoadCursor("crossHairCursor", 11, 11); | 120 return [NSCursor crosshairCursor]; |
98 case WebCursorInfo::TypeHand: | 121 case WebCursorInfo::TypeHand: |
99 return LoadCursor("linkCursor", 6, 1); | 122 // If >= 10.7, the pointingHandCursor has a shadow so use it. Otherwise |
123 // use the custom one. | |
124 if (base::mac::IsOSLionOrLater()) | |
125 return [NSCursor pointingHandCursor]; | |
126 else | |
127 return LoadCursor("linkCursor", 6, 1); | |
100 case WebCursorInfo::TypeIBeam: | 128 case WebCursorInfo::TypeIBeam: |
101 return [NSCursor IBeamCursor]; | 129 return [NSCursor IBeamCursor]; |
102 case WebCursorInfo::TypeWait: | 130 case WebCursorInfo::TypeWait: |
103 return LoadCursor("waitCursor", 7, 7); | 131 return LoadCursor("waitCursor", 7, 7); |
104 case WebCursorInfo::TypeHelp: | 132 case WebCursorInfo::TypeHelp: |
105 return LoadCursor("helpCursor", 8, 8); | 133 return LoadCursor("helpCursor", 8, 8); |
106 case WebCursorInfo::TypeEastResize: | 134 case WebCursorInfo::TypeEastResize: |
107 case WebCursorInfo::TypeEastPanning: | 135 case WebCursorInfo::TypeEastPanning: |
108 return LoadCursor("eastResizeCursor", 14, 7); | 136 return LoadCursor("eastResizeCursor", 14, 7); |
109 case WebCursorInfo::TypeNorthResize: | 137 case WebCursorInfo::TypeNorthResize: |
(...skipping 26 matching lines...) Expand all Loading... | |
136 case WebCursorInfo::TypeNorthWestSouthEastResize: | 164 case WebCursorInfo::TypeNorthWestSouthEastResize: |
137 return LoadCursor("northWestSouthEastResizeCursor", 7, 7); | 165 return LoadCursor("northWestSouthEastResizeCursor", 7, 7); |
138 case WebCursorInfo::TypeColumnResize: | 166 case WebCursorInfo::TypeColumnResize: |
139 return [NSCursor resizeLeftRightCursor]; | 167 return [NSCursor resizeLeftRightCursor]; |
140 case WebCursorInfo::TypeRowResize: | 168 case WebCursorInfo::TypeRowResize: |
141 return [NSCursor resizeUpDownCursor]; | 169 return [NSCursor resizeUpDownCursor]; |
142 case WebCursorInfo::TypeMiddlePanning: | 170 case WebCursorInfo::TypeMiddlePanning: |
143 case WebCursorInfo::TypeMove: | 171 case WebCursorInfo::TypeMove: |
144 return LoadCursor("moveCursor", 7, 7); | 172 return LoadCursor("moveCursor", 7, 7); |
145 case WebCursorInfo::TypeVerticalText: | 173 case WebCursorInfo::TypeVerticalText: |
146 return LoadCursor("verticalTextCursor", 7, 7); | 174 // IBeamCursorForVerticalLayout is >= 10.7. |
175 if ([NSCursor respondsToSelector:@selector(IBeamCursorForVerticalLayout)]) | |
176 return [NSCursor IBeamCursorForVerticalLayout]; | |
177 else | |
178 return LoadCursor("verticalTextCursor", 7, 7); | |
147 case WebCursorInfo::TypeCell: | 179 case WebCursorInfo::TypeCell: |
148 return LoadCursor("cellCursor", 7, 7); | 180 return LoadCursor("cellCursor", 7, 7); |
149 case WebCursorInfo::TypeContextMenu: | 181 case WebCursorInfo::TypeContextMenu: |
150 return LoadCursor("contextMenuCursor", 3, 2); | 182 // contextualMenuCursor is >= 10.6. |
183 if ([NSCursor respondsToSelector:@selector(contextualMenuCursor)]) | |
184 return [NSCursor contextualMenuCursor]; | |
185 else | |
186 return LoadCursor("contextMenuCursor", 3, 2); | |
151 case WebCursorInfo::TypeAlias: | 187 case WebCursorInfo::TypeAlias: |
152 return LoadCursor("aliasCursor", 11, 3); | 188 return LoadCursor("aliasCursor", 11, 3); |
153 case WebCursorInfo::TypeProgress: | 189 case WebCursorInfo::TypeProgress: |
154 return LoadCursor("progressCursor", 3, 2); | 190 return LoadCursor("progressCursor", 3, 2); |
155 case WebCursorInfo::TypeNoDrop: | 191 case WebCursorInfo::TypeNoDrop: |
156 return LoadCursor("noDropCursor", 3, 1); | 192 return LoadCursor("noDropCursor", 3, 1); |
157 case WebCursorInfo::TypeCopy: | 193 case WebCursorInfo::TypeCopy: |
158 return LoadCursor("copyCursor", 3, 2); | 194 // dragCopyCursor is >= 10.6. |
195 if ([NSCursor respondsToSelector:@selector(dragCopyCursor)]) | |
196 return [NSCursor dragCopyCursor]; | |
197 else | |
198 return LoadCursor("copyCursor", 3, 2); | |
159 case WebCursorInfo::TypeNone: | 199 case WebCursorInfo::TypeNone: |
160 return LoadCursor("noneCursor", 7, 7); | 200 return LoadCursor("noneCursor", 7, 7); |
161 case WebCursorInfo::TypeNotAllowed: | 201 case WebCursorInfo::TypeNotAllowed: |
162 return LoadCursor("notAllowedCursor", 11, 11); | 202 // Docs say that operationNotAllowedCursor is >= 10.6, and it's not in the |
203 // 10.5 SDK, but later SDKs note that it really is available on 10.5. | |
Mark Mentovai
2011/08/15 16:00:08
Just be sure you test this.
Avi (use Gerrit)
2011/08/15 16:09:34
Tested.
| |
204 return [NSCursor operationNotAllowedCursor]; | |
163 case WebCursorInfo::TypeZoomIn: | 205 case WebCursorInfo::TypeZoomIn: |
164 return LoadCursor("zoomInCursor", 7, 7); | 206 return LoadCursor("zoomInCursor", 7, 7); |
165 case WebCursorInfo::TypeZoomOut: | 207 case WebCursorInfo::TypeZoomOut: |
166 return LoadCursor("zoomOutCursor", 7, 7); | 208 return LoadCursor("zoomOutCursor", 7, 7); |
167 case WebCursorInfo::TypeGrab: | 209 case WebCursorInfo::TypeGrab: |
168 return [NSCursor openHandCursor]; | 210 return [NSCursor openHandCursor]; |
169 case WebCursorInfo::TypeGrabbing: | 211 case WebCursorInfo::TypeGrabbing: |
170 return [NSCursor closedHandCursor]; | 212 return [NSCursor closedHandCursor]; |
171 case WebCursorInfo::TypeCustom: | 213 case WebCursorInfo::TypeCustom: |
172 return CreateCustomCursor(custom_data_, custom_size_, hotspot_); | 214 return CreateCustomCursor(custom_data_, custom_size_, hotspot_); |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
317 } else if ([cursor isEqual:[NSCursor resizeUpCursor]]) { | 359 } else if ([cursor isEqual:[NSCursor resizeUpCursor]]) { |
318 cursor_info.type = WebCursorInfo::TypeNorthResize; | 360 cursor_info.type = WebCursorInfo::TypeNorthResize; |
319 } else if ([cursor isEqual:[NSCursor resizeDownCursor]]) { | 361 } else if ([cursor isEqual:[NSCursor resizeDownCursor]]) { |
320 cursor_info.type = WebCursorInfo::TypeSouthResize; | 362 cursor_info.type = WebCursorInfo::TypeSouthResize; |
321 } else if ([cursor isEqual:[NSCursor resizeUpDownCursor]]) { | 363 } else if ([cursor isEqual:[NSCursor resizeUpDownCursor]]) { |
322 cursor_info.type = WebCursorInfo::TypeNorthSouthResize; | 364 cursor_info.type = WebCursorInfo::TypeNorthSouthResize; |
323 } else if ([cursor isEqual:[NSCursor openHandCursor]]) { | 365 } else if ([cursor isEqual:[NSCursor openHandCursor]]) { |
324 cursor_info.type = WebCursorInfo::TypeGrab; | 366 cursor_info.type = WebCursorInfo::TypeGrab; |
325 } else if ([cursor isEqual:[NSCursor closedHandCursor]]) { | 367 } else if ([cursor isEqual:[NSCursor closedHandCursor]]) { |
326 cursor_info.type = WebCursorInfo::TypeGrabbing; | 368 cursor_info.type = WebCursorInfo::TypeGrabbing; |
369 } else if ([cursor isEqual:[NSCursor operationNotAllowedCursor]]) { | |
370 cursor_info.type = WebCursorInfo::TypeNotAllowed; | |
371 } else if ([NSCursor respondsToSelector:@selector(dragCopyCursor)] && | |
372 [cursor isEqual:[NSCursor dragCopyCursor]]) { | |
373 cursor_info.type = WebCursorInfo::TypeCopy; | |
374 } else if ([NSCursor respondsToSelector:@selector(contextualMenuCursor)] && | |
375 [cursor isEqual:[NSCursor contextualMenuCursor]]) { | |
376 cursor_info.type = WebCursorInfo::TypeContextMenu; | |
377 } else if ( | |
378 [NSCursor respondsToSelector:@selector(IBeamCursorForVerticalLayout)] && | |
379 [cursor isEqual:[NSCursor IBeamCursorForVerticalLayout]]) { | |
380 cursor_info.type = WebCursorInfo::TypeVerticalText; | |
327 } else { | 381 } else { |
328 // Also handles the [NSCursor disappearingItemCursor] case. Quick-and-dirty | 382 // Also handles the [NSCursor disappearingItemCursor] case. Quick-and-dirty |
329 // image conversion; TODO(avi): do better. | 383 // image conversion; TODO(avi): do better. |
330 CGImageRef cg_image = nil; | 384 CGImageRef cg_image = nil; |
331 NSImage* image = [cursor image]; | 385 NSImage* image = [cursor image]; |
332 for (id rep in [image representations]) { | 386 for (id rep in [image representations]) { |
333 if ([rep isKindOfClass:[NSBitmapImageRep class]]) { | 387 if ([rep isKindOfClass:[NSBitmapImageRep class]]) { |
334 cg_image = [rep CGImage]; | 388 cg_image = [rep CGImage]; |
335 break; | 389 break; |
336 } | 390 } |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
412 return true; | 466 return true; |
413 } | 467 } |
414 | 468 |
415 void WebCursor::CleanupPlatformData() { | 469 void WebCursor::CleanupPlatformData() { |
416 return; | 470 return; |
417 } | 471 } |
418 | 472 |
419 void WebCursor::CopyPlatformData(const WebCursor& other) { | 473 void WebCursor::CopyPlatformData(const WebCursor& other) { |
420 return; | 474 return; |
421 } | 475 } |
OLD | NEW |