Index: ui/base/x/x11_util.cc |
diff --git a/ui/base/x/x11_util.cc b/ui/base/x/x11_util.cc |
index efe05aff1ceaa0d9b72b399d587468a25a355849..05f50ecb71d8c4e91e6771c6b4204da26868c9fb 100644 |
--- a/ui/base/x/x11_util.cc |
+++ b/ui/base/x/x11_util.cc |
@@ -453,6 +453,28 @@ XcursorImage* SkBitmapToXcursorImage(const SkBitmap* bitmap, |
} |
#endif |
+void HideHostCursor() { |
+ CR_DEFINE_STATIC_LOCAL(XScopedCursor, invisible_cursor, |
+ (CreateInvisibleCursor(), ui::GetXDisplay())); |
+ XDefineCursor(ui::GetXDisplay(), DefaultRootWindow(ui::GetXDisplay()), |
+ invisible_cursor.get()); |
+} |
+ |
+::Cursor CreateInvisibleCursor() { |
+ Display* xdisplay = ui::GetXDisplay(); |
+ ::Cursor invisible_cursor; |
+ char nodata[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; |
+ XColor black; |
+ black.red = black.green = black.blue = 0; |
+ Pixmap blank = XCreateBitmapFromData(xdisplay, |
+ DefaultRootWindow(xdisplay), |
+ nodata, 8, 8); |
+ invisible_cursor = XCreatePixmapCursor(xdisplay, blank, blank, |
+ &black, &black, 0, 0); |
+ XFreePixmap(xdisplay, blank); |
+ return invisible_cursor; |
+} |
+ |
XID GetX11RootWindow() { |
return DefaultRootWindow(GetXDisplay()); |
} |
@@ -1352,6 +1374,25 @@ XScopedString::~XScopedString() { |
XFree(string_); |
} |
+XScopedCursor::XScopedCursor(::Cursor cursor, Display* display) |
+ : cursor_(cursor), |
+ display_(display) { |
+} |
+ |
+XScopedCursor::~XScopedCursor() { |
+ reset(0U); |
+} |
+ |
+::Cursor XScopedCursor::get() const { |
+ return cursor_; |
+} |
+ |
+void XScopedCursor::reset(::Cursor cursor) { |
+ if (cursor_) |
+ XFreeCursor(display_, cursor_); |
+ cursor_ = cursor; |
+} |
+ |
// ---------------------------------------------------------------------------- |
// These functions are declared in x11_util_internal.h because they require |
// XLib.h to be included, and it conflicts with many other headers. |