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