| Index: plugin/cross/o3d_glue.cc
|
| ===================================================================
|
| --- plugin/cross/o3d_glue.cc (revision 39116)
|
| +++ plugin/cross/o3d_glue.cc (working copy)
|
| @@ -887,13 +887,10 @@
|
| }
|
| }
|
|
|
| -static unsigned int O3DToX11Cursor(o3d::Cursor::CursorType cursor_type) {
|
| +static unsigned int O3DToX11CursorShape(o3d::Cursor::CursorType cursor_type) {
|
| switch (cursor_type) {
|
| case o3d::Cursor::DEFAULT:
|
| return XC_arrow;
|
| - case o3d::Cursor::NONE:
|
| - NOTIMPLEMENTED();
|
| - return XC_arrow;
|
| case o3d::Cursor::CROSSHAIR:
|
| return XC_crosshair;
|
| case o3d::Cursor::POINTER:
|
| @@ -927,13 +924,45 @@
|
| NOTIMPLEMENTED();
|
| return XC_arrow;
|
| }
|
| + NOTIMPLEMENTED();
|
| return XC_arrow;
|
| }
|
|
|
| +static Cursor O3DToX11Cursor(Display *display, Window window,
|
| + o3d::Cursor::CursorType cursor_type) {
|
| + switch (cursor_type) {
|
| + case o3d::Cursor::NONE: {
|
| + // There is no X11 primitive for hiding the cursor. The standard practice
|
| + // is to define a custom cursor from a 1x1 invisible pixmap.
|
| + static char zero[1] = {0};
|
| + Pixmap zero_pixmap = XCreateBitmapFromData(display, window, zero, 1, 1);
|
| + DLOG_ASSERT(zero_pixmap);
|
| + if (!zero_pixmap) {
|
| + return 0;
|
| + }
|
| + // This could actually be any colour, since our mask pixmap specifies that
|
| + // no pixels are visible.
|
| + XColor black;
|
| + black.red = 0;
|
| + black.green = 0;
|
| + black.blue = 0;
|
| + Cursor cursor = XCreatePixmapCursor(display, zero_pixmap, zero_pixmap,
|
| + &black, &black, 0, 0);
|
| + XFreePixmap(display, zero_pixmap);
|
| + return cursor;
|
| + }
|
| +
|
| + default:
|
| + return XCreateFontCursor(display, O3DToX11CursorShape(cursor_type));
|
| + }
|
| +}
|
| +
|
| void PluginObject::PlatformSpecificSetCursor() {
|
| if (!cursors_[cursor_type_]) {
|
| - cursors_[cursor_type_] =
|
| - XCreateFontCursor(display_, O3DToX11Cursor(cursor_type_));
|
| + // According to the docs, the window here is only relevant for selecting the
|
| + // screen, and we always create our fullscreen and embedded windows on the
|
| + // same screen, so we can just always use the embedded window.
|
| + cursors_[cursor_type_] = O3DToX11Cursor(display_, window_, cursor_type_);
|
| }
|
| Window window = fullscreen_ ? fullscreen_window_ : window_;
|
| XDefineCursor(display_, window, cursors_[cursor_type_]);
|
|
|