[xcb] Fix build failure

Build failure was introduced by 9bb634a6176c639bd6b52d58151e9927c30919d0.

When linking with systems provided libxkbcommon, then DFLT_XKB_CONFIG_ROOT
can't be accessed directly.

The reason that this slip through CI is that on CI machines Qt
is build with bundled version of libxkbcommon.

In addition this patch improves keymap error message, by making it more explicit for
users what could be the reasons for "keymap compilation" failures and what should
be done to make input work. As it turns out this is a common issue on old systems,
servers and some VNC clients.

Task-number: QTBUG-37971

Change-Id: I77667a404150ee7ab8465a065e23ca5eea63c33b
Reviewed-by: Uli Schlachter <psychon@znc.in>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
This commit is contained in:
Gatis Paeglis 2014-03-31 14:48:29 +02:00 committed by The Qt Project
parent 3b18ea3cb8
commit ee3dea8d3f
2 changed files with 10 additions and 20 deletions

View File

@ -663,23 +663,14 @@ void QXcbKeyboard::clearXKBConfig()
memset(&xkb_names, 0, sizeof(xkb_names));
}
void QXcbKeyboard::printKeymapError(const QString &error) const
void QXcbKeyboard::printKeymapError(const char *error) const
{
qWarning() << "Qt: " << error;
// check if XKB config root is a valid path
const QDir xkbRoot = qEnvironmentVariableIsSet("QT_XKB_CONFIG_ROOT")
? QString::fromLocal8Bit(qgetenv("QT_XKB_CONFIG_ROOT"))
: DFLT_XKB_CONFIG_ROOT;
if (!xkbRoot.exists() || xkbRoot.dirName() != "xkb") {
qWarning() << "Set QT_XKB_CONFIG_ROOT to provide a valid XKB configuration data path, current search paths: "
<< xkbRoot.path() << ". Use ':' as separator to provide several search paths.";
return;
}
qWarning() << "_XKB_RULES_NAMES property contains:" << "\nrules : " << xkb_names.rules <<
"\nmodel : " << xkb_names.model << "\nlayout : " << xkb_names.layout <<
"\nvariant : " << xkb_names.variant << "\noptions : " << xkb_names.options <<
"\nIf this looks like a valid keyboard layout information then you might need to "
"update XKB configuration data on the system (http://cgit.freedesktop.org/xkeyboard-config/).";
qWarning() << error << "Current XKB configuration data search paths are: ";
for (unsigned int i = 0; i < xkb_context_num_include_paths(xkb_context); ++i)
qWarning() << xkb_context_include_path_get(xkb_context, i);
qWarning() << "Use QT_XKB_CONFIG_ROOT environmental variable to provide an additional search path, "
"add ':' as separator to provide several search paths and/or make sure that XKB configuration data "
"directory contains recent enough contents, to update please see http://cgit.freedesktop.org/xkeyboard-config/ .";
}
void QXcbKeyboard::updateKeymap()
@ -696,7 +687,7 @@ void QXcbKeyboard::updateKeymap()
xkb_context = xkb_context_new((xkb_context_flags)0);
}
if (!xkb_context) {
printKeymapError("Failed to create XKB context!");
printKeymapError("Qt: Failed to create XKB context!");
m_config = false;
return;
}
@ -731,8 +722,7 @@ void QXcbKeyboard::updateKeymap()
if (xkb_keymap) {
new_state = xkb_state_new(xkb_keymap);
} else {
// failed to compile from RMLVO, give a verbose error message
printKeymapError("Qt: Failed to compile a keymap!");
printKeymapError("Failed to compile a keymap!");
m_config = false;
return;
}

View File

@ -92,7 +92,7 @@ protected:
QString keysymToUnicode(xcb_keysym_t sym) const;
int keysymToQtKey(xcb_keysym_t keysym) const;
int keysymToQtKey(xcb_keysym_t keysym, Qt::KeyboardModifiers &modifiers, QString text) const;
void printKeymapError(const QString &error) const;
void printKeymapError(const char *error) const;
void readXKBConfig();
void clearXKBConfig();