15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/common/cursors/webcursor.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include <X11/cursorfont.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/Xcursor/Xcursor.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/Xlib.h> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebCursorInfo.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/cursor/cursor.h" 142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "ui/base/cursor/cursor_loader_x11.h" 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/base/cursor/cursor_util.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/x/x11_util.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace content { 1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciui::PlatformCursor WebCursor::GetPlatformCursor() { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (platform_cursor_) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return platform_cursor_; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (custom_data_.size() == 0) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap bitmap; 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bitmap.allocN32Pixels(custom_size_.width(), custom_size_.height()); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(bitmap.getAddr32(0, 0), custom_data_.data(), custom_data_.size()); 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point hotspot = hotspot_; 312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ui::ScaleAndRotateCursorBitmapAndHotpoint( 326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) device_scale_factor_, gfx::Display::ROTATE_0, &bitmap, &hotspot); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) XcursorImage* image = ui::SkBitmapToXcursorImage(&bitmap, hotspot); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) platform_cursor_ = ui::CreateReffedCustomXCursor(image); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return platform_cursor_; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochvoid WebCursor::SetDisplayInfo(const gfx::Display& display) { 406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (device_scale_factor_ == display.device_scale_factor()) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch device_scale_factor_ = display.device_scale_factor(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (platform_cursor_) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::UnrefCustomXCursor(platform_cursor_); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) platform_cursor_ = 0; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is not necessary to recreate platform_cursor_ yet, since it will be 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // recreated on demand when GetPlatformCursor is called. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebCursor::InitPlatformData() { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) platform_cursor_ = 0; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_scale_factor_ = 1.f; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebCursor::SerializePlatformData(Pickle* pickle) const { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebCursor::DeserializePlatformData(PickleIterator* iter) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebCursor::IsPlatformDataEqual(const WebCursor& other) const { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebCursor::CleanupPlatformData() { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (platform_cursor_) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::UnrefCustomXCursor(platform_cursor_); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) platform_cursor_ = 0; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebCursor::CopyPlatformData(const WebCursor& other) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (platform_cursor_) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::UnrefCustomXCursor(platform_cursor_); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) platform_cursor_ = other.platform_cursor_; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (platform_cursor_) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::RefCustomXCursor(platform_cursor_); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_scale_factor_ = other.device_scale_factor_; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} // namespace content 86