From e472c95a23dbbb8faf6e25426ad35d4418b214d3 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Tue, 22 Oct 2019 01:46:59 +0200 Subject: [PATCH] Use QPlatformNativeInterface for getting display on Linux (Wayland still incomplete) --- CMakeLists.txt | 2 +- src/CMakeLists.txt | 3 ++- src/gui/DatabaseOpenWidget.cpp | 11 +++++------ src/gui/DatabaseOpenWidget.ui | 2 +- src/gui/PasswordEdit.cpp | 19 +++++++++++++++---- 5 files changed, 24 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0196b44126..2264609877 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -369,7 +369,7 @@ include(CLangFormat) set(QT_COMPONENTS Core Network Concurrent Gui Svg Widgets Test LinguistTools) if(UNIX AND NOT APPLE) - find_package(Qt5 COMPONENTS ${QT_COMPONENTS} DBus X11Extras REQUIRED) + find_package(Qt5 COMPONENTS ${QT_COMPONENTS} DBus REQUIRED) elseif(APPLE) find_package(Qt5 COMPONENTS ${QT_COMPONENTS} REQUIRED HINTS /usr/local/opt/qt/lib/cmake /usr/local/Cellar/qt/*/lib/cmake ENV PATH) find_package(Qt5 COMPONENTS MacExtras HINTS /usr/local/opt/qt/lib/cmake /usr/local/Cellar/qt/*/lib/cmake ENV PATH) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 01afd96785..2a0a344ae0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -329,7 +329,8 @@ if(HAIKU) target_link_libraries(keepassx_core network) endif() if(UNIX AND NOT APPLE) - target_link_libraries(keepassx_core Qt5::DBus Qt5::X11Extras X11) + target_link_libraries(keepassx_core Qt5::DBus X11) + include_directories(${Qt5Gui_PRIVATE_INCLUDE_DIRS}) endif() if(MINGW) target_link_libraries(keepassx_core Wtsapi32.lib Ws2_32.lib) diff --git a/src/gui/DatabaseOpenWidget.cpp b/src/gui/DatabaseOpenWidget.cpp index 3e2df60d0d..ff3d55a80b 100644 --- a/src/gui/DatabaseOpenWidget.cpp +++ b/src/gui/DatabaseOpenWidget.cpp @@ -54,6 +54,11 @@ DatabaseOpenWidget::DatabaseOpenWidget(QWidget* parent) m_ui->labelHeadline->setFont(font); m_ui->labelHeadline->setText(tr("Unlock KeePassXC Database")); + m_ui->capslockWarningLabel->setVisible(false); + connect(m_ui->editPassword, &PasswordEdit::capslockToggled, [&](bool state) { + m_ui->capslockWarningLabel->setVisible(state); + }); + m_ui->comboKeyFile->lineEdit()->addAction(m_ui->keyFileClearIcon, QLineEdit::TrailingPosition); m_ui->buttonTogglePassword->setIcon(filePath()->onOffIcon("actions", "password-show")); @@ -79,12 +84,6 @@ DatabaseOpenWidget::DatabaseOpenWidget(QWidget* parent) m_ui->yubikeyProgress->setSizePolicy(sp); connect(m_ui->buttonRedetectYubikey, SIGNAL(clicked()), SLOT(pollYubikey())); - - m_ui->capsLockWarningLabel->setVisible(false); - connect(m_ui->editPassword, &PasswordEdit::capslockToggled, [&](bool state) { - m_ui->capsLockWarningLabel->setVisible(state); - }); - #else m_ui->buttonRedetectYubikey->setVisible(false); m_ui->comboChallengeResponse->setVisible(false); diff --git a/src/gui/DatabaseOpenWidget.ui b/src/gui/DatabaseOpenWidget.ui index 57a9719853..e9328dbb84 100644 --- a/src/gui/DatabaseOpenWidget.ui +++ b/src/gui/DatabaseOpenWidget.ui @@ -159,7 +159,7 @@ - + QLabel { color: rgb(255, 125, 125); } diff --git a/src/gui/PasswordEdit.cpp b/src/gui/PasswordEdit.cpp index 8586ba7c47..489306fcf4 100644 --- a/src/gui/PasswordEdit.cpp +++ b/src/gui/PasswordEdit.cpp @@ -22,6 +22,9 @@ #include "core/FilePath.h" #include "gui/Font.h" +#include +#include + #if defined(Q_OS_WIN) #include #elif defined(Q_OS_MACOS) @@ -145,19 +148,27 @@ bool PasswordEdit::event(QEvent* event) void PasswordEdit::checkCapslockState() { bool newCapslockState = m_capslockState; + Q_UNUSED(m_capslockState) #if defined(Q_OS_WIN) newCapslockState = (GetKeyState(VK_CAPITAL) == 1); #elif defined(Q_OS_MACOS) newCapslockState = ((CGEventSourceFlagsState(kCGEventSourceStateHIDSystemState) & kCGEventFlagMaskAlphaShift) != 0); #elif defined(Q_OS_UNIX) - if (QX11Info::isPlatformX11() && QX11Info::display()) { + QPlatformNativeInterface* native = QGuiApplication::platformNativeInterface(); + auto* display = native->nativeResourceForWindow("display", nullptr); + if (!display) { + return; + } + + const QString platform = QGuiApplication::platformName(); + if (platform == "xcb") { unsigned state = 0; - // reinterpret cast needed, since we namespaced the XKBlib.h include - if (X11::XkbGetIndicatorState( - reinterpret_cast(QX11Info::display()), XkbUseCoreKbd, &state) == Success) { + if (X11::XkbGetIndicatorState(reinterpret_cast(display), XkbUseCoreKbd, &state) == Success) { newCapslockState = ((state & 1u) != 0); } + } else if (platform == "wayland") { +// struct wl_display* waylandDisplay = reinterpret_cast(display); } #endif