From 7b73bbc974ff74e28aecdad6cbf10b43d99a29e3 Mon Sep 17 00:00:00 2001 From: "varunjain@chromium.org" Date: Sat, 5 May 2012 09:43:16 +0000 Subject: Aura: Adds custom cursors for drag and drop. BUG=121135 TEST=none Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=135378 Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=135426 Review URL: http://codereview.chromium.org/10316019 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@135533 0039d316-1c4b-4281-b951-d872f2087c98 --- ui/aura/root_window_host_linux.cc | 55 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) (limited to 'ui/aura/root_window_host_linux.cc') diff --git a/ui/aura/root_window_host_linux.cc b/ui/aura/root_window_host_linux.cc index ff80134..1b56bb0 100644 --- a/ui/aura/root_window_host_linux.cc +++ b/ui/aura/root_window_host_linux.cc @@ -5,6 +5,7 @@ #include "ui/aura/root_window_host_linux.h" #include +#include #include #include #include @@ -14,6 +15,8 @@ #include "base/message_pump_x.h" #include "base/stl_util.h" #include "base/stringprintf.h" +#include "grit/ui_resources_standard.h" +#include "third_party/skia/include/core/SkBitmap.h" #include "ui/aura/client/user_gesture_client.h" #include "ui/aura/dispatcher_linux.h" #include "ui/aura/env.h" @@ -21,10 +24,12 @@ #include "ui/aura/root_window.h" #include "ui/base/cursor/cursor.h" #include "ui/base/keycodes/keyboard_codes.h" +#include "ui/base/resource/resource_bundle.h" #include "ui/base/touch/touch_factory.h" #include "ui/base/x/x11_util.h" #include "ui/base/view_prop.h" #include "ui/gfx/compositor/layer.h" +#include "ui/gfx/image/image.h" using std::max; using std::min; @@ -292,6 +297,51 @@ const char* kAtomList[] = { } // namespace +// A utility class that provides X Cursor for NativeCursors for which we have +// image resources. +class RootWindowHostLinux::ImageCursors { + public: + ImageCursors() { + LoadImageCursor(ui::kCursorNoDrop, IDR_AURA_CURSOR_NO_DROP); + LoadImageCursor(ui::kCursorCopy, IDR_AURA_CURSOR_COPY); + // TODO (varunjain): add more cursors once we have assets. + } + + ~ImageCursors() { + std::map::const_iterator it; + for (it = cursors_.begin(); it != cursors_.end(); ++it) + ui::UnrefCustomXCursor(it->second); + } + + // Returns true if we have an image resource loaded for the |native_cursor|. + bool IsImageCursor(gfx::NativeCursor native_cursor) { + return cursors_.find(native_cursor.native_type()) != cursors_.end(); + } + + // Gets the X Cursor corresponding to the |native_cursor|. + ::Cursor ImageCursorFromNative(gfx::NativeCursor native_cursor) { + DCHECK(cursors_.find(native_cursor.native_type()) != cursors_.end()); + return cursors_[native_cursor.native_type()]; + } + + private: + // Creates an X Cursor from an image resource and puts it in the cursor map. + void LoadImageCursor(int id, int resource_id) { + const SkBitmap* bitmap = + ui::ResourceBundle::GetSharedInstance().GetImageNamed( + resource_id).ToSkBitmap(); + + XcursorImage* image = ui::SkBitmapToXcursorImage(bitmap, gfx::Point(0, 0)); + cursors_[id] = ui::CreateReffedCustomXCursor(image); + // |bitmap| is owned by the resource bundle. So we do not need to free it. + } + + // A map to hold all image cursors. It maps the cursor ID to the X Cursor. + std::map cursors_; + + DISALLOW_COPY_AND_ASSIGN(ImageCursors); +}; + RootWindowHostLinux::RootWindowHostLinux(const gfx::Rect& bounds) : root_window_(NULL), xdisplay_(base::MessagePumpX::GetDefaultXDisplay()), @@ -301,7 +351,8 @@ RootWindowHostLinux::RootWindowHostLinux(const gfx::Rect& bounds) cursor_shown_(true), bounds_(bounds), focus_when_shown_(false), - pointer_barriers_(NULL) { + pointer_barriers_(NULL), + image_cursors_(new ImageCursors) { XSetWindowAttributes swa; memset(&swa, 0, sizeof(swa)); swa.background_pixmap = None; @@ -794,6 +845,8 @@ bool RootWindowHostLinux::IsWindowManagerPresent() { void RootWindowHostLinux::SetCursorInternal(gfx::NativeCursor cursor) { ::Cursor xcursor = + image_cursors_->IsImageCursor(cursor) ? + image_cursors_->ImageCursorFromNative(cursor) : cursor == ui::kCursorNone ? invisible_cursor_ : cursor == ui::kCursorCustom ? -- cgit v1.1