1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 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#include "webkit/glue/webcursor.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <gdk/gdk.h>
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <gtk/gtk.h>
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/logging.h"
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h"
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/gtk_util.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing WebKit::WebCursorInfo;
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// webcursor_gtk_data.h is taken directly from WebKit's CursorGtk.h.
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/webcursor_gtk_data.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This helper function is taken directly from WebKit's CursorGtk.cpp.
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// It attempts to create a custom cursor from the data inlined in
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// webcursor_gtk_data.h.
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGdkCursor* GetInlineCustomCursor(CustomCursorType type) {
25201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  static GdkCursor* CustomCursorsGdk[G_N_ELEMENTS(CustomCursors)];
26201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  GdkCursor* cursor = CustomCursorsGdk[type];
27201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (cursor)
28201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return cursor;
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const CustomCursor& custom = CustomCursors[type];
30201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  cursor = gdk_cursor_new_from_name(gdk_display_get_default(), custom.name);
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!cursor) {
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const GdkColor fg = { 0, 0, 0, 0 };
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const GdkColor bg = { 65535, 65535, 65535, 65535 };
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GdkPixmap* source = gdk_bitmap_create_from_data(NULL, custom.bits,
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                    32, 32);
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GdkPixmap* mask = gdk_bitmap_create_from_data(NULL, custom.mask_bits,
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                  32, 32);
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    cursor = gdk_cursor_new_from_pixmap(source, mask, &fg, &bg,
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        custom.hot_x, custom.hot_y);
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_object_unref(source);
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_object_unref(mask);
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
43201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  CustomCursorsGdk[type] = cursor;
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return cursor;
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// For GTK 2.16 and beyond, GDK_BLANK_CURSOR is available. Before, we have to
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// use a custom cursor.
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !GTK_CHECK_VERSION(2, 16, 0)
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Get/create a custom cursor which is invisible.
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGdkCursor* GetInvisibleCustomCursor() {
52201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  static GdkCursor* cursor = NULL;
53201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (cursor)
54201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return cursor;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char bits[] = { 0 };
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const GdkColor color = { 0, 0, 0, 0 };
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GdkPixmap* bitmap = gdk_bitmap_create_from_data(NULL, bits, 1, 1);
58201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  cursor = gdk_cursor_new_from_pixmap(bitmap, bitmap, &color, &color, 0, 0);
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_object_unref(bitmap);
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return cursor;
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // end anonymous namespace
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint WebCursor::GetCursorType() const {
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // http://library.gnome.org/devel/gdk/2.12/gdk-Cursors.html has images
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // of the default X theme, but beware that the user's cursor theme can
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // change everything.
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (type_) {
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypePointer:
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_LAST_CURSOR;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeCross:
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_CROSS;
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeHand:
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_HAND2;
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeIBeam:
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_XTERM;
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeWait:
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_WATCH;
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeHelp:
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_QUESTION_ARROW;
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeEastResize:
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_RIGHT_SIDE;
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeNorthResize:
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_TOP_SIDE;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeNorthEastResize:
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_TOP_RIGHT_CORNER;
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeNorthWestResize:
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_TOP_LEFT_CORNER;
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeSouthResize:
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_BOTTOM_SIDE;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeSouthEastResize:
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_BOTTOM_RIGHT_CORNER;
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeSouthWestResize:
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_BOTTOM_LEFT_CORNER;
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeWestResize:
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_LEFT_SIDE;
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeNorthSouthResize:
100201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return GDK_SB_V_DOUBLE_ARROW;
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeEastWestResize:
102201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return GDK_SB_H_DOUBLE_ARROW;
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeNorthEastSouthWestResize:
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeNorthWestSouthEastResize:
105201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // There isn't really a useful cursor available for these.
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTIMPLEMENTED(); return GDK_LAST_CURSOR;
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeColumnResize:
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_SB_H_DOUBLE_ARROW;  // TODO(evanm): is this correct?
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeRowResize:
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_SB_V_DOUBLE_ARROW;  // TODO(evanm): is this correct?
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeMiddlePanning:
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_FLEUR;
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeEastPanning:
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_SB_RIGHT_ARROW;
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeNorthPanning:
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_SB_UP_ARROW;
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeNorthEastPanning:
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_TOP_RIGHT_CORNER;
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeNorthWestPanning:
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_TOP_LEFT_CORNER;
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeSouthPanning:
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_SB_DOWN_ARROW;
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeSouthEastPanning:
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_BOTTOM_RIGHT_CORNER;
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeSouthWestPanning:
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_BOTTOM_LEFT_CORNER;
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeWestPanning:
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_SB_LEFT_ARROW;
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeMove:
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_FLEUR;
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeVerticalText:
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTIMPLEMENTED(); return GDK_LAST_CURSOR;
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeCell:
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTIMPLEMENTED(); return GDK_LAST_CURSOR;
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeContextMenu:
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTIMPLEMENTED(); return GDK_LAST_CURSOR;
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeAlias:
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTIMPLEMENTED(); return GDK_LAST_CURSOR;
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeProgress:
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_WATCH;
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeNoDrop:
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTIMPLEMENTED(); return GDK_LAST_CURSOR;
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeCopy:
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTIMPLEMENTED(); return GDK_LAST_CURSOR;
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeNone:
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// See comment above |GetInvisibleCustomCursor()|.
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !GTK_CHECK_VERSION(2, 16, 0)
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_CURSOR_IS_PIXMAP;
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_BLANK_CURSOR;
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeNotAllowed:
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTIMPLEMENTED(); return GDK_LAST_CURSOR;
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeZoomIn:
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeZoomOut:
156dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case WebCursorInfo::TypeGrab:
157dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case WebCursorInfo::TypeGrabbing:
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeCustom:
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GDK_CURSOR_IS_PIXMAP;
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NOTREACHED();
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return GDK_LAST_CURSOR;
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
165201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochgfx::NativeCursor WebCursor::GetNativeCursor() {
166201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int type = GetCursorType();
167201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (type == GDK_CURSOR_IS_PIXMAP)
168201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return GetCustomCursor();
169201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return gfx::GetCursor(type);
170201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
171201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
172201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochGdkCursor* WebCursor::GetCustomCursor() {
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (type_) {
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// See comment above |GetInvisibleCustomCursor()|.
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !GTK_CHECK_VERSION(2, 16, 0)
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeNone:
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GetInvisibleCustomCursor();
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeZoomIn:
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GetInlineCustomCursor(CustomCursorZoomIn);
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebCursorInfo::TypeZoomOut:
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return GetInlineCustomCursor(CustomCursorZoomOut);
183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case WebCursorInfo::TypeGrab:
184dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return GetInlineCustomCursor(CustomCursorGrab);
185dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case WebCursorInfo::TypeGrabbing:
186dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return GetInlineCustomCursor(CustomCursorGrabbing);
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (type_ != WebCursorInfo::TypeCustom) {
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED();
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return NULL;
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SkBitmap bitmap;
1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bitmap.setConfig(SkBitmap::kARGB_8888_Config,
1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                   custom_size_.width(), custom_size_.height());
1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bitmap.allocPixels();
1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  memcpy(bitmap.getAddr32(0, 0), custom_data_.data(), custom_data_.size());
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&bitmap);
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GdkCursor* cursor = gdk_cursor_new_from_pixbuf(gdk_display_get_default(),
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                 pixbuf,
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                 hotspot_.x(),
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                 hotspot_.y());
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gdk_pixbuf_unref(pixbuf);
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
208201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (unref_)
209201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    gdk_cursor_unref(unref_);
210201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  unref_ = cursor;
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return cursor;
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebCursor::InitPlatformData() {
215201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  unref_ = NULL;
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return;
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool WebCursor::SerializePlatformData(Pickle* pickle) const {
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool WebCursor::DeserializePlatformData(const Pickle* pickle, void** iter) {
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool WebCursor::IsPlatformDataEqual(const WebCursor& other) const {
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebCursor::CleanupPlatformData() {
232201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (unref_) {
233201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    gdk_cursor_unref(unref_);
234201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    unref_ = NULL;
235201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return;
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebCursor::CopyPlatformData(const WebCursor& other) {
240201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (other.unref_)
241201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    unref_ = gdk_cursor_ref(other.unref_);
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return;
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
244