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 "base/logging.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/pickle.h" 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/webkit_resources.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "third_party/skia/include/core/SkBitmap.h" 972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h" 1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/gdi_util.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/webcursor.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing WebKit::WebCursorInfo; 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic LPCWSTR ToCursorID(WebCursorInfo::Type type) { 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (type) { 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypePointer: 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_ARROW; 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeCross: 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_CROSS; 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeHand: 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_HAND; 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeIBeam: 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_IBEAM; 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeWait: 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_WAIT; 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeHelp: 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_HELP; 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeEastResize: 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_SIZEWE; 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeNorthResize: 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_SIZENS; 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeNorthEastResize: 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_SIZENESW; 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeNorthWestResize: 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_SIZENWSE; 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeSouthResize: 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_SIZENS; 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeSouthEastResize: 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_SIZENWSE; 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeSouthWestResize: 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_SIZENESW; 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeWestResize: 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_SIZEWE; 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeNorthSouthResize: 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_SIZENS; 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeEastWestResize: 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_SIZEWE; 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeNorthEastSouthWestResize: 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_SIZENESW; 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeNorthWestSouthEastResize: 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_SIZENWSE; 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeColumnResize: 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return MAKEINTRESOURCE(IDC_COLRESIZE); 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeRowResize: 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return MAKEINTRESOURCE(IDC_ROWRESIZE); 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeMiddlePanning: 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return MAKEINTRESOURCE(IDC_PAN_MIDDLE); 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeEastPanning: 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return MAKEINTRESOURCE(IDC_PAN_EAST); 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeNorthPanning: 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return MAKEINTRESOURCE(IDC_PAN_NORTH); 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeNorthEastPanning: 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return MAKEINTRESOURCE(IDC_PAN_NORTH_EAST); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeNorthWestPanning: 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return MAKEINTRESOURCE(IDC_PAN_NORTH_WEST); 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeSouthPanning: 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return MAKEINTRESOURCE(IDC_PAN_SOUTH); 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeSouthEastPanning: 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return MAKEINTRESOURCE(IDC_PAN_SOUTH_EAST); 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeSouthWestPanning: 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return MAKEINTRESOURCE(IDC_PAN_SOUTH_WEST); 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeWestPanning: 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return MAKEINTRESOURCE(IDC_PAN_WEST); 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeMove: 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_SIZEALL; 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeVerticalText: 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return MAKEINTRESOURCE(IDC_VERTICALTEXT); 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeCell: 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return MAKEINTRESOURCE(IDC_CELL); 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeContextMenu: 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return MAKEINTRESOURCE(IDC_ARROW); 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeAlias: 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return MAKEINTRESOURCE(IDC_ALIAS); 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeProgress: 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_APPSTARTING; 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeNoDrop: 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_NO; 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeCopy: 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return MAKEINTRESOURCE(IDC_COPYCUR); 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeNone: 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_ARROW; 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeNotAllowed: 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IDC_NO; 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeZoomIn: 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return MAKEINTRESOURCE(IDC_ZOOMIN); 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebCursorInfo::TypeZoomOut: 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return MAKEINTRESOURCE(IDC_ZOOMOUT); 99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // TODO(avi): get cursor images for grab/grabbing 100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // http://crbug.com/74699 101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen case WebCursorInfo::TypeGrab: 102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen case WebCursorInfo::TypeGrabbing: 103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return IDC_ARROW; 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return NULL; 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic bool IsSystemCursorID(LPCWSTR cursor_id) { 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return cursor_id >= IDC_ARROW; // See WinUser.h 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic WebCursorInfo::Type ToCursorType(HCURSOR cursor) { 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static struct { 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HCURSOR cursor; 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebCursorInfo::Type type; 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } kStandardCursors[] = { 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { LoadCursor(NULL, IDC_ARROW), WebCursorInfo::TypePointer }, 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { LoadCursor(NULL, IDC_CROSS), WebCursorInfo::TypeCross }, 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { LoadCursor(NULL, IDC_HAND), WebCursorInfo::TypeHand }, 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { LoadCursor(NULL, IDC_IBEAM), WebCursorInfo::TypeIBeam }, 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { LoadCursor(NULL, IDC_WAIT), WebCursorInfo::TypeWait }, 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { LoadCursor(NULL, IDC_HELP), WebCursorInfo::TypeHelp }, 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { LoadCursor(NULL, IDC_SIZENESW), WebCursorInfo::TypeNorthEastResize }, 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { LoadCursor(NULL, IDC_SIZENWSE), WebCursorInfo::TypeNorthWestResize }, 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { LoadCursor(NULL, IDC_SIZENS), WebCursorInfo::TypeNorthSouthResize }, 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { LoadCursor(NULL, IDC_SIZEWE), WebCursorInfo::TypeEastWestResize }, 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { LoadCursor(NULL, IDC_SIZEALL), WebCursorInfo::TypeMove }, 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { LoadCursor(NULL, IDC_APPSTARTING), WebCursorInfo::TypeProgress }, 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { LoadCursor(NULL, IDC_NO), WebCursorInfo::TypeNotAllowed }, 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int i = 0; i < arraysize(kStandardCursors); i++) { 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (cursor == kStandardCursors[i].cursor) 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return kStandardCursors[i].type; 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return WebCursorInfo::TypeCustom; 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochHCURSOR WebCursor::GetCursor(HINSTANCE module_handle){ 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!IsCustom()) { 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const wchar_t* cursor_id = 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ToCursorID(static_cast<WebCursorInfo::Type>(type_)); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (IsSystemCursorID(cursor_id)) 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch module_handle = NULL; 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return LoadCursor(module_handle, cursor_id); 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (custom_cursor_) { 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(external_cursor_ == NULL); 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return custom_cursor_; 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (external_cursor_) 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return external_cursor_; 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BITMAPINFO cursor_bitmap_info = {0}; 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::CreateBitmapHeader( 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch custom_size_.width(), custom_size_.height(), 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch reinterpret_cast<BITMAPINFOHEADER*>(&cursor_bitmap_info)); 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HDC dc = GetDC(0); 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HDC workingDC = CreateCompatibleDC(dc); 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HBITMAP bitmap_handle = CreateDIBSection( 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dc, &cursor_bitmap_info, DIB_RGB_COLORS, 0, 0, 0); 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!custom_data_.empty()) 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetDIBits( 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0, bitmap_handle, 0, custom_size_.height(), &custom_data_[0], 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &cursor_bitmap_info, DIB_RGB_COLORS); 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HBITMAP old_bitmap = reinterpret_cast<HBITMAP>( 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SelectObject(workingDC, bitmap_handle)); 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetBkMode(workingDC, TRANSPARENT); 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SelectObject(workingDC, old_bitmap); 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HBITMAP mask = CreateBitmap( 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch custom_size_.width(), custom_size_.height(), 1, 1, NULL); 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ICONINFO ii = {0}; 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ii.fIcon = FALSE; 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ii.xHotspot = hotspot_.x(); 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ii.yHotspot = hotspot_.y(); 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ii.hbmMask = mask; 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ii.hbmColor = bitmap_handle; 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch custom_cursor_ = CreateIconIndirect(&ii); 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DeleteObject(mask); 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DeleteObject(bitmap_handle); 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DeleteDC(workingDC); 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ReleaseDC(0, dc); 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return custom_cursor_; 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 194201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochgfx::NativeCursor WebCursor::GetNativeCursor() { 195201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return GetCursor(NULL); 196201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 197201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebCursor::InitFromExternalCursor(HCURSOR cursor) { 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebCursorInfo::Type cursor_type = ToCursorType(cursor); 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitFromCursorInfo(WebCursorInfo(cursor_type)); 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (cursor_type == WebCursorInfo::TypeCustom) 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch external_cursor_ = cursor; 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebCursor::InitPlatformData() { 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch external_cursor_ = NULL; 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch custom_cursor_ = NULL; 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool WebCursor::SerializePlatformData(Pickle* pickle) const { 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // There are some issues with converting certain HCURSORS to bitmaps. The 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // HCURSOR being a user object can be marshaled as is. 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // HCURSORs are always 32 bits on Windows, even on 64 bit systems. 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return pickle->WriteUInt32(reinterpret_cast<uint32>(external_cursor_)); 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool WebCursor::DeserializePlatformData(const Pickle* pickle, void** iter) { 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return pickle->ReadUInt32(iter, reinterpret_cast<uint32*>(&external_cursor_)); 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool WebCursor::IsPlatformDataEqual(const WebCursor& other) const { 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!IsCustom()) 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return (external_cursor_ == other.external_cursor_); 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebCursor::CopyPlatformData(const WebCursor& other) { 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch external_cursor_ = other.external_cursor_; 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The custom_cursor_ member will be initialized to a HCURSOR the next time 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the GetCursor member function is invoked on this WebCursor instance. The 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // cursor is created using the data in the custom_data_ vector. 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch custom_cursor_ = NULL; 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebCursor::CleanupPlatformData() { 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch external_cursor_ = NULL; 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (custom_cursor_) { 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DestroyIcon(custom_cursor_); 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch custom_cursor_ = NULL; 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 246