xcb: Use fallbacks for Xcursor names

Some cursor themes may not contain cursors with common names,
then fallback names should be used. The fallbacks in this
change were taken from the wayland plugin.

Change-Id: I7fcc47a71cafe41c88a21a7168acd3a274b71693
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
This commit is contained in:
Alexander Volkov 2017-07-19 14:18:13 +03:00
parent 597c83492a
commit bd72950fbe

View File

@ -255,29 +255,29 @@ static const uint8_t * const cursor_bits20[] = {
forbidden_bits, forbiddenm_bits
};
static const char * const cursorNames[] = {
"left_ptr",
"up_arrow",
"cross",
"wait",
"ibeam",
"size_ver",
"size_hor",
"size_bdiag",
"size_fdiag",
"size_all",
"blank",
"split_v",
"split_h",
"pointing_hand",
"forbidden",
"whats_this",
"left_ptr_watch",
"openhand",
"closedhand",
"copy",
"move",
"link"
static const std::vector<const char *> cursorNames[] = {
{ "left_ptr", "default", "top_left_arrow", "left_arrow" },
{ "up_arrow" },
{ "cross" },
{ "wait", "watch", "0426c94ea35c87780ff01dc239897213" },
{ "ibeam", "text", "xterm" },
{ "size_ver", "ns-resize", "v_double_arrow", "00008160000006810000408080010102" },
{ "size_hor", "ew-resize", "h_double_arrow", "028006030e0e7ebffc7f7070c0600140" },
{ "size_bdiag", "nesw-resize", "50585d75b494802d0151028115016902", "fcf1c3c7cd4491d801f1e1c78f100000" },
{ "size_fdiag", "nwse-resize", "38c5dff7c7b8962045400281044508d2", "c7088f0f3e6c8088236ef8e1e3e70000" },
{ "size_all" },
{ "blank" },
{ "split_v", "row-resize", "sb_v_double_arrow", "2870a09082c103050810ffdffffe0204", "c07385c7190e701020ff7ffffd08103c" },
{ "split_h", "col-resize", "sb_h_double_arrow", "043a9f68147c53184671403ffa811cc5", "14fef782d02440884392942c11205230" },
{ "pointing_hand", "pointer", "hand1", "e29285e634086352946a0e7090d73106" },
{ "forbidden", "not-allowed", "crossed_circle", "circle", "03b6e0fcb3499374a867c041f52298f0" },
{ "whats_this", "help", "question_arrow", "5c6cd98b3f3ebcb1f9c7f1c204630408", "d9ce0ab605698f320427677b458ad60b" },
{ "left_ptr_watch", "half-busy", "progress", "00000000000000020006000e7e9ffc3f", "08e8e1c95fe2fc01f976f1e063a24ccd" },
{ "openhand", "fleur", "5aca4d189052212118709018842178c0", "9d800788f1b08800ae810202380a0822" },
{ "closedhand", "grabbing", "208530c400c041818281048008011002" },
{ "dnd-copy", "copy" },
{ "dnd-move", "move" },
{ "dnd-link", "link" }
};
QXcbCursorCacheKey::QXcbCursorCacheKey(const QCursor &c)
@ -535,22 +535,13 @@ static xcb_cursor_t loadCursor(void *dpy, int cshape)
xcb_cursor_t cursor = XCB_NONE;
if (!ptrXcursorLibraryLoadCursor || !dpy)
return cursor;
switch (cshape) {
case Qt::DragCopyCursor:
cursor = ptrXcursorLibraryLoadCursor(dpy, "dnd-copy");
break;
case Qt::DragMoveCursor:
cursor = ptrXcursorLibraryLoadCursor(dpy, "dnd-move");
break;
case Qt::DragLinkCursor:
cursor = ptrXcursorLibraryLoadCursor(dpy, "dnd-link");
break;
default:
break;
}
if (!cursor) {
cursor = ptrXcursorLibraryLoadCursor(dpy, cursorNames[cshape]);
for (const char *cursorName: cursorNames[cshape]) {
cursor = ptrXcursorLibraryLoadCursor(dpy, cursorName);
if (cursor != XCB_NONE)
break;
}
return cursor;
}
#endif // QT_CONFIG(xcb_xlib) / QT_CONFIG(library)
@ -565,7 +556,6 @@ xcb_cursor_t QXcbCursor::createFontCursor(int cshape)
#if QT_CONFIG(xcb_xlib) && QT_CONFIG(library)
if (cshape >= 0 && cshape <= Qt::LastCursor) {
void *dpy = connection()->xlib_display();
// special case for non-standard dnd-* cursors
cursor = loadCursor(dpy, cshape);
if (!cursor && !m_gtkCursorThemeInitialized && m_screen->xSettings()->initialized()) {
QByteArray gtkCursorTheme = m_screen->xSettings()->setting("Gtk/CursorThemeName").toByteArray();
@ -598,7 +588,7 @@ xcb_cursor_t QXcbCursor::createFontCursor(int cshape)
}
if (cursor && cshape >= 0 && cshape < Qt::LastCursor && connection()->hasXFixes()) {
const char *name = cursorNames[cshape];
const char *name = cursorNames[cshape].front();
xcb_xfixes_set_cursor_name(conn, cursor, strlen(name), name);
}