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