x11: Implement setNativeMouseCursor()

This commit is contained in:
David Capello 2017-04-21 16:25:05 -03:00
parent c947425051
commit 616c83732a
2 changed files with 94 additions and 1 deletions

View File

@ -13,6 +13,7 @@
#include "gfx/rect.h"
#include "she/event.h"
#include <X11/cursorfont.h>
#include <map>
namespace she {
@ -23,6 +24,9 @@ namespace {
// window is pressed by the userh.
Atom wmDeleteMessage = 0;
// Cursor Without pixels to simulate a hidden X11 cursor
Cursor empty_xcursor = None;
// See https://bugs.freedesktop.org/show_bug.cgi?id=12871 for more
// information, it looks like the official way to convert a X Window
// into our own user data pointer (X11Window instance) is using a map.
@ -102,6 +106,8 @@ void X11Window::removeWindow(X11Window* window)
X11Window::X11Window(::Display* display, int width, int height, int scale)
: m_display(display)
, m_gc(nullptr)
, m_cursor(None)
, m_scale(scale)
{
// Initialize special messages (just the first time a X11Window is
@ -207,7 +213,93 @@ void X11Window::updateWindow(const gfx::Rect& unscaledBounds)
bool X11Window::setNativeMouseCursor(NativeCursor cursor)
{
return false;
Cursor xcursor = None;
switch (cursor) {
case kNoCursor: {
if (empty_xcursor == None) {
char data = 0;
Pixmap image = XCreateBitmapFromData(
m_display, m_window, (char*)&data, 1, 1);
XColor color;
empty_xcursor = XCreatePixmapCursor(
m_display, image, image, &color, &color, 0, 0);
XFreePixmap(m_display, image);
}
xcursor = empty_xcursor;
break;
}
case kArrowCursor:
xcursor = XCreateFontCursor(m_display, XC_arrow);
break;
case kCrosshairCursor:
xcursor = XCreateFontCursor(m_display, XC_crosshair);
break;
case kIBeamCursor:
xcursor = XCreateFontCursor(m_display, XC_xterm);
break;
case kWaitCursor:
xcursor = XCreateFontCursor(m_display, XC_watch);
break;
case kLinkCursor:
xcursor = XCreateFontCursor(m_display, XC_hand1);
break;
case kHelpCursor:
xcursor = XCreateFontCursor(m_display, XC_question_arrow);
break;
case kForbiddenCursor:
xcursor = XCreateFontCursor(m_display, XC_X_cursor);
break;
case kMoveCursor:
xcursor = XCreateFontCursor(m_display, XC_fleur);
break;
case kSizeNCursor:
xcursor = XCreateFontCursor(m_display, XC_top_side);
break;
case kSizeNSCursor:
xcursor = XCreateFontCursor(m_display, XC_sb_v_double_arrow);
break;
case kSizeSCursor:
xcursor = XCreateFontCursor(m_display, XC_bottom_side);
break;
case kSizeWCursor:
xcursor = XCreateFontCursor(m_display, XC_left_side);
break;
case kSizeECursor:
xcursor = XCreateFontCursor(m_display, XC_right_side);
break;
case kSizeWECursor:
xcursor = XCreateFontCursor(m_display, XC_sb_h_double_arrow);
break;
case kSizeNWCursor:
xcursor = XCreateFontCursor(m_display, XC_top_left_corner);
break;
case kSizeNECursor:
xcursor = XCreateFontCursor(m_display, XC_top_right_corner);
break;
case kSizeSWCursor:
xcursor = XCreateFontCursor(m_display, XC_bottom_left_corner);
break;
case kSizeSECursor:
xcursor = XCreateFontCursor(m_display, XC_bottom_right_corner);
break;
}
if (m_cursor != None) {
if (m_cursor != empty_xcursor) // Don't delete empty_xcursor
XFreeCursor(m_display, m_cursor);
m_cursor = None;
}
if (xcursor != None) {
m_cursor = xcursor;
XDefineCursor(m_display, m_window, xcursor);
return true;
}
else
return false;
}
bool X11Window::setNativeMouseCursor(const she::Surface* surface,

View File

@ -64,6 +64,7 @@ private:
::Display* m_display;
::Window m_window;
::GC m_gc;
::Cursor m_cursor;
int m_scale;
};