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