1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef WEBKIT_GLUE_WEBCURSOR_H_ 6 #define WEBKIT_GLUE_WEBCURSOR_H_ 7 8 #include "base/basictypes.h" 9 #include "ui/gfx/native_widget_types.h" 10 #include "ui/gfx/point.h" 11 #include "ui/gfx/size.h" 12 13 #include <vector> 14 15 #if defined(OS_WIN) 16 typedef struct HINSTANCE__* HINSTANCE; 17 typedef struct HICON__* HICON; 18 typedef HICON HCURSOR; 19 #elif defined(USE_X11) 20 typedef struct _GdkCursor GdkCursor; 21 #elif defined(OS_MACOSX) 22 #ifdef __OBJC__ 23 @class NSCursor; 24 #else 25 class NSCursor; 26 #endif 27 typedef UInt32 ThemeCursor; 28 struct Cursor; 29 #endif 30 31 class Pickle; 32 33 namespace WebKit { 34 class WebImage; 35 struct WebCursorInfo; 36 } 37 38 // This class encapsulates a cross-platform description of a cursor. Platform 39 // specific methods are provided to translate the cross-platform cursor into a 40 // platform specific cursor. It is also possible to serialize / de-serialize a 41 // WebCursor. 42 class WebCursor { 43 public: 44 WebCursor(); 45 explicit WebCursor(const WebKit::WebCursorInfo& cursor_info); 46 ~WebCursor(); 47 48 // Copy constructor/assignment operator combine. 49 WebCursor(const WebCursor& other); 50 const WebCursor& operator=(const WebCursor& other); 51 52 // Conversion from/to WebCursorInfo. 53 void InitFromCursorInfo(const WebKit::WebCursorInfo& cursor_info); 54 void GetCursorInfo(WebKit::WebCursorInfo* cursor_info) const; 55 56 // Serialization / De-serialization 57 bool Deserialize(const Pickle* pickle, void** iter); 58 bool Serialize(Pickle* pickle) const; 59 60 // Returns true if GetCustomCursor should be used to allocate a platform 61 // specific cursor object. Otherwise GetCursor should be used. 62 bool IsCustom() const; 63 64 // Returns true if the current cursor object contains the same cursor as the 65 // cursor object passed in. If the current cursor is a custom cursor, we also 66 // compare the bitmaps to verify whether they are equal. 67 bool IsEqual(const WebCursor& other) const; 68 69 // Returns a native cursor representing the current WebCursor instance. 70 gfx::NativeCursor GetNativeCursor(); 71 72 #if defined(OS_WIN) 73 // Returns a HCURSOR representing the current WebCursor instance. 74 // The ownership of the HCURSOR (does not apply to external cursors) remains 75 // with the WebCursor instance. 76 HCURSOR GetCursor(HINSTANCE module_handle); 77 78 // Initialize this from the given Windows cursor. The caller must ensure that 79 // the HCURSOR remains valid by not invoking the DestroyCursor/DestroyIcon 80 // APIs on it. 81 void InitFromExternalCursor(HCURSOR handle); 82 83 #elif defined(USE_X11) 84 // Return the stock GdkCursorType for this cursor, or GDK_CURSOR_IS_PIXMAP 85 // if it's a custom cursor. Return GDK_LAST_CURSOR to indicate that the cursor 86 // should be set to the system default. 87 // Returns an int so we don't need to include GDK headers in this header file. 88 int GetCursorType() const; 89 90 // Return a new GdkCursor* for this cursor. Only valid if GetCursorType 91 // returns GDK_CURSOR_IS_PIXMAP. 92 GdkCursor* GetCustomCursor(); 93 #elif defined(OS_MACOSX) 94 // Gets an NSCursor* for this cursor. 95 NSCursor* GetCursor() const; 96 97 // Initialize this from the given Carbon ThemeCursor. 98 void InitFromThemeCursor(ThemeCursor cursor); 99 100 // Initialize this from the given Carbon Cursor. 101 void InitFromCursor(const Cursor* cursor); 102 103 // Initialize this from the given Cocoa NSCursor. 104 void InitFromNSCursor(NSCursor* cursor); 105 #endif 106 107 private: 108 // Copies the contents of the WebCursor instance passed in. 109 void Copy(const WebCursor& other); 110 111 // Cleans up the WebCursor instance. 112 void Clear(); 113 114 // Platform specific initialization goes here. 115 void InitPlatformData(); 116 117 // Platform specific Serialization / De-serialization 118 bool SerializePlatformData(Pickle* pickle) const; 119 bool DeserializePlatformData(const Pickle* pickle, void** iter); 120 121 // Returns true if the platform data in the current cursor object 122 // matches that of the cursor passed in. 123 bool IsPlatformDataEqual(const WebCursor& other) const ; 124 125 // Copies platform specific data from the WebCursor instance passed in. 126 void CopyPlatformData(const WebCursor& other); 127 128 // Platform specific cleanup. 129 void CleanupPlatformData(); 130 131 void SetCustomData(const WebKit::WebImage& image); 132 void ImageFromCustomData(WebKit::WebImage* image) const; 133 134 // Clamp the hotspot to the custom image's bounds, if this is a custom cursor. 135 void ClampHotspot(); 136 137 // WebCore::PlatformCursor type. 138 int type_; 139 140 gfx::Point hotspot_; 141 142 // Custom cursor data, as 32-bit RGBA. 143 // Platform-inspecific because it can be serialized. 144 gfx::Size custom_size_; 145 std::vector<char> custom_data_; 146 147 #if defined(OS_WIN) 148 // An externally generated HCURSOR. We assume that it remains valid, i.e we 149 // don't attempt to copy the HCURSOR. 150 HCURSOR external_cursor_; 151 // A custom cursor created from custom bitmap data by Webkit. 152 HCURSOR custom_cursor_; 153 #endif // OS_WIN 154 155 #if defined(USE_X11) 156 // A custom cursor created that should be unref'ed from the destructor. 157 GdkCursor* unref_; 158 #endif 159 }; 160 161 #endif // WEBKIT_GLUE_WEBCURSOR_H_ 162