summaryrefslogtreecommitdiffstats
path: root/ui/aura/root_window_host_linux.cc
diff options
context:
space:
mode:
authorvarunjain@chromium.org <varunjain@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-05 09:43:16 +0000
committervarunjain@chromium.org <varunjain@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-05 09:43:16 +0000
commit7b73bbc974ff74e28aecdad6cbf10b43d99a29e3 (patch)
treee144e1a6dc7326656ea2bdc88108e3e5263aec5d /ui/aura/root_window_host_linux.cc
parentbaa0e34f39f96dd52ff7421c3d4058a663f14d38 (diff)
downloadchromium_src-7b73bbc974ff74e28aecdad6cbf10b43d99a29e3.zip
chromium_src-7b73bbc974ff74e28aecdad6cbf10b43d99a29e3.tar.gz
chromium_src-7b73bbc974ff74e28aecdad6cbf10b43d99a29e3.tar.bz2
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
Diffstat (limited to 'ui/aura/root_window_host_linux.cc')
-rw-r--r--ui/aura/root_window_host_linux.cc55
1 files changed, 54 insertions, 1 deletions
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 <X11/Xatom.h>
+#include <X11/Xcursor/Xcursor.h>
#include <X11/cursorfont.h>
#include <X11/extensions/XInput2.h>
#include <X11/extensions/Xfixes.h>
@@ -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<int, Cursor>::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<int, Cursor> 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 ?