[packages/keepassxc] version 2.3.4
atler
atler at pld-linux.org
Mon Nov 5 00:18:58 CET 2018
commit e580663c8fa67eb30492a49f31bf4cdd35cf5aa2
Author: Jan Palus <atler at pld-linux.org>
Date: Mon Nov 5 00:17:45 2018 +0100
version 2.3.4
- enabled browser integration
- enabled ssh-agent
git.patch | 12915 -------------------------------------------------------
keepassxc.spec | 87 +-
2 files changed, 54 insertions(+), 12948 deletions(-)
---
diff --git a/keepassxc.spec b/keepassxc.spec
index 212610b..2790cb9 100644
--- a/keepassxc.spec
+++ b/keepassxc.spec
@@ -1,38 +1,51 @@
-Summary: KeePassX - Cross Platform Password Manager
-Summary(pl.UTF-8): KeePassX - Wieloplatformowy zarządca haseł
-Name: keepassx
-Version: 2.0.2
-Release: 2
+Summary: KeePassXC - Cross Platform Password Manager
+Summary(pl.UTF-8): KeePassXC - Wieloplatformowy zarządca haseł
+Name: keepassxc
+Version: 2.3.4
+Release: 1
License: GPL v2+
Group: X11/Applications
-Source0: http://www.keepassx.org/releases/%{version}/keepassx-%{version}.tar.gz
-# Source0-md5: 65d098dff663768911847a1e92d0f01d
-Patch0: git.patch
-URL: https://www.keepassx.org/
+Source0: https://github.com/keepassxreboot/keepassxc/archive/%{version}.tar.gz
+# Source0-md5: bb173c1499cc088a5ca6caf72ecc8084
+URL: https://keepassxc.org/
BuildRequires: Qt5Concurrent-devel >= 5.2.0
BuildRequires: Qt5Core-devel >= 5.2.0
+BuildRequires: Qt5DBus-devel >= 5.2.0
+BuildRequires: Qt5Network-devel >= 5.2.0
BuildRequires: Qt5Test-devel >= 5.2.0
BuildRequires: Qt5Widgets-devel >= 5.2.0
BuildRequires: Qt5X11Extras-devel >= 5.2.0
-BuildRequires: cmake >= 2.8.12
-BuildRequires: libgcrypt-devel >= 1.6
+BuildRequires: cmake >= 3.1.0
+BuildRequires: libargon2-devel
+BuildRequires: libgcrypt-devel >= 1.7.0
+BuildRequires: libgpg-error-devel
+BuildRequires: libsodium-devel >= 1.0.12
BuildRequires: qt5-build >= 5.2.0
BuildRequires: qt5-linguist >= 5.2.0
BuildRequires: qt5-qmake >= 5.2.0
BuildRequires: rpmbuild(find_lang) >= 1.37
BuildRequires: rpmbuild(macros) >= 1.230
BuildRequires: xorg-lib-libX11-devel
-BuildRequires: xorg-lib-libXext-devel
+BuildRequires: xorg-lib-libXi-devel
BuildRequires: xorg-lib-libXtst-devel
-BuildRequires: zlib-devel
+BuildRequires: zlib-devel >= 1.2.0
+Requires: Qt5Concurrent >= 5.2.0
+Requires: Qt5Core >= 5.2.0
+Requires: Qt5DBus >= 5.2.0
+Requires: Qt5Network >= 5.2.0
+Requires: Qt5Widgets >= 5.2.0
+Requires: Qt5X11Extras >= 5.2.0
Requires: desktop-file-utils
Requires: hicolor-icon-theme
+Requires: libgcrypt >= 1.7.0
+Requires: libsodium >= 1.0.12
Requires: shared-mime-info
+Requires: zlib >= 1.2.0
Obsoletes: KeePassX
BuildRoot: %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
%description
-KeePassX is a free/open-source password manager or safe which helps
+KeePassXC is a free/open-source password manager or safe which helps
you to manage your passwords in a secure way. You can put all your
passwords in one database, which is locked with one master key or a
key-disk. So you only have to remember one single master password or
@@ -41,23 +54,25 @@ encrypted using the best and most secure encryption algorithms
currently known (AES and Twofish).
%description -l pl.UTF-8
-KeePassX to darmowy i mający otwarte źródła zarządca do przechowywania
-haseł, który pozwala na zarządzanie hasłami w bardzo bezpieczny
-sposób. Pozwala umieścić wszystkie swoje hasła w jednej bazie, która
-jest zabezpieczona poprzez jedno bardzo trudne hasło albo dysk z
-kluczem. Wystarczy więc zapamiętać jedno trudne hasło lub umieścić
-dysk z kluczem aby odblokować całą bazę z kluczami. Baza jest
+KeePassXC to darmowy i mający otwarte źródła zarządca do
+przechowywania haseł, który pozwala na zarządzanie hasłami w bardzo
+bezpieczny sposób. Pozwala umieścić wszystkie swoje hasła w jednej
+bazie, która jest zabezpieczona poprzez jedno bardzo trudne hasło albo
+dysk z kluczem. Wystarczy więc zapamiętać jedno trudne hasło lub
+umieścić dysk z kluczem aby odblokować całą bazę z kluczami. Baza jest
zaszyfrowana najlepszymi i najbardziej bezpiecznymi algorytmami
szyfrowania jakie są do tej pory znane (AES i TwoFish).
%prep
%setup -q
-%patch0 -p1
%build
install -d build
cd build
%cmake \
+ -DKEEPASSXC_BUILD_TYPE=Release \
+ -DWITH_XC_BROWSER=ON \
+ -DWITH_XC_SSHAGENT=ON \
..
%{__make}
@@ -66,7 +81,7 @@ rm -rf $RPM_BUILD_ROOT
%{__make} -C build install \
DESTDIR=$RPM_BUILD_ROOT
-%find_lang %{name} --with-qm
+%find_lang keepassx %{name}.lang --with-qm
%{__sed} -i -e '
s/%lang(en_plurals)/%%lang(en)/
@@ -88,14 +103,20 @@ rm -rf $RPM_BUILD_ROOT
%files -f %{name}.lang
%defattr(644,root,root,755)
-%attr(755,root,root) %{_bindir}/keepassx
-%{_datadir}/mime/packages/keepassx.xml
-%{_desktopdir}/keepassx.desktop
-%dir %{_datadir}/keepassx
-%{_datadir}/keepassx/icons
-%dir %{_datadir}/keepassx/translations
-%dir %{_libdir}/keepassx
-%attr(755,root,root) %{_libdir}/keepassx/libkeepassx-autotype-xcb.so
-%{_iconsdir}/hicolor/*x*/apps/keepassx.png
-%{_iconsdir}/hicolor/*x*/mimetypes/application-x-keepassx.png
-%{_iconsdir}/hicolor/scalable/apps/keepassx.svgz
+%attr(755,root,root) %{_bindir}/keepassxc
+%attr(755,root,root) %{_bindir}/keepassxc-cli
+%attr(755,root,root) %{_bindir}/keepassxc-proxy
+%{_datadir}/metainfo/org.keepassxc.KeePassXC.appdata.xml
+%{_datadir}/mime/packages/keepassxc.xml
+%{_desktopdir}/org.keepassxc.KeePassXC.desktop
+%dir %{_datadir}/keepassxc
+%{_datadir}/keepassxc/icons
+%dir %{_datadir}/keepassxc/translations
+%{_datadir}/keepassxc/wordlists
+%dir %{_libdir}/keepassxc
+%attr(755,root,root) %{_libdir}/keepassxc/libkeepassx-autotype-xcb.so
+%{_iconsdir}/hicolor/*x*/apps/keepassxc*.png
+%{_iconsdir}/hicolor/*x*/mimetypes/application-x-keepassxc.png
+%{_iconsdir}/hicolor/scalable/apps/keepassxc*.svgz
+%{_iconsdir}/hicolor/scalable/mimetypes/application-x-keepassxc.svgz
+%{_mandir}/man1/keepassxc-cli.1*
diff --git a/git.patch b/git.patch
deleted file mode 100644
index 6be8810..0000000
--- a/git.patch
+++ /dev/null
@@ -1,12915 +0,0 @@
-diff --git a/.travis.yml b/.travis.yml
-index fa33cf0..550518a 100644
---- a/.travis.yml
-+++ b/.travis.yml
-@@ -5,16 +5,20 @@ compiler:
- - gcc
- - clang
- language: cpp
-+sudo: required
-+dist: trusty
- install:
- - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get -qq update; fi
-- - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get -qq install cmake libqt4-dev libgcrypt11-dev zlib1g-dev libxtst-dev; fi
-+ - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get -qq install cmake qtbase5-dev libqt5x11extras5-dev qttools5-dev qttools5-dev-tools libgcrypt20-dev zlib1g-dev libxtst-dev xvfb; fi
- - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew update; fi
- - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew ls | grep -wq cmake || brew install cmake; fi
-- - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew ls | grep -wq qt || brew install qt; fi
-+ - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew ls | grep -wq qt5 || brew install qt5; fi
- - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew ls | grep -wq libgcrypt || brew install libgcrypt; fi
--before_script: mkdir build && pushd build
-+before_script:
-+ - if [ "$TRAVIS_OS_NAME" = "osx" ]; then CMAKE_ARGS="-DCMAKE_PREFIX_PATH=/usr/local/opt/qt5"; fi
-+ - mkdir build && pushd build
- script:
-- - cmake -DCMAKE_BUILD_TYPE=Debug -DWITH_GUI_TESTS=ON ..
-+ - cmake -DCMAKE_BUILD_TYPE=Debug -DWITH_GUI_TESTS=ON $CMAKE_ARGS ..
- - make
- - if [ "$TRAVIS_OS_NAME" = "linux" ]; then make test ARGS+="-E testgui --output-on-failure"; fi
- - if [ "$TRAVIS_OS_NAME" = "linux" ]; then xvfb-run -a --server-args="-screen 0 800x600x24" make test ARGS+="-R testgui --output-on-failure"; fi
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 6df5503..21c46fa 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -21,7 +21,7 @@ endif()
-
- project(KeePassX)
-
--cmake_minimum_required(VERSION 2.6.4)
-+cmake_minimum_required(VERSION 2.8.12)
-
- set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
-
-@@ -31,7 +31,7 @@ include(CheckCXXSourceCompiles)
-
- option(WITH_TESTS "Enable building of unit tests" ON)
- option(WITH_GUI_TESTS "Enable building of GUI tests" OFF)
--option(WITH_CXX11 "Build with the C++ 11 standard" ON)
-+option(WITH_DEV_BUILD "Use only for development. Disables/warns about deprecated methods." OFF)
-
- set(KEEPASSX_VERSION "2.0.2")
- set(KEEPASSX_VERSION_NUM "2.0.2")
-@@ -61,7 +61,7 @@ macro(add_gcc_compiler_flags FLAGS)
- add_gcc_compiler_cflags("${FLAGS}")
- endmacro(add_gcc_compiler_flags)
-
--add_definitions(-DQT_NO_KEYWORDS -DQT_NO_EXCEPTIONS -DQT_NO_STL -DQT_STRICT_ITERATORS -DQT_NO_CAST_TO_ASCII)
-+add_definitions(-DQT_NO_KEYWORDS -DQT_NO_EXCEPTIONS -DQT_STRICT_ITERATORS -DQT_NO_CAST_TO_ASCII)
-
- add_gcc_compiler_flags("-fno-common -fstack-protector --param=ssp-buffer-size=4")
- add_gcc_compiler_flags("-Wall -Wextra -Wundef -Wpointer-arith -Wno-long-long")
-@@ -100,14 +100,16 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
- set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,relro")
- endif()
-
--if (WITH_CXX11)
-- add_gcc_compiler_cxxflags("-std=c++0x")
-- add_gcc_compiler_cflags("-ansi")
-- if(APPLE)
-- add_gcc_compiler_cxxflags("-stdlib=libc++")
-- endif()
--else()
-- add_gcc_compiler_flags("-ansi")
-+add_gcc_compiler_cxxflags("-std=c++11")
-+
-+if(APPLE)
-+ add_gcc_compiler_cxxflags("-stdlib=libc++")
-+endif()
-+
-+add_gcc_compiler_cflags("-ansi")
-+
-+if(WITH_DEV_BUILD)
-+ add_definitions(-DQT_DEPRECATED_WARNINGS -DGCRYPT_NO_DEPRECATED)
- endif()
-
- if(MINGW)
-@@ -146,19 +148,18 @@ if(WITH_TESTS)
- enable_testing()
- endif(WITH_TESTS)
-
--set(QT_REQUIRED_MODULES QtCore QtGui QtTest)
-+find_package(Qt5Core 5.2 REQUIRED)
-+find_package(Qt5Concurrent 5.2 REQUIRED)
-+find_package(Qt5Widgets 5.2 REQUIRED)
-+find_package(Qt5Test 5.2 REQUIRED)
-+find_package(Qt5LinguistTools 5.2 REQUIRED)
-+set(CMAKE_AUTOMOC ON)
-
--find_package(Qt4 4.6.0 REQUIRED ${QT_REQUIRED_MODULES})
--include(${QT_USE_FILE})
- # Debian sets the the build type to None for package builds.
- # Make sure we don't enable asserts there.
- set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_NONE QT_NO_DEBUG)
-
--find_package(Gcrypt REQUIRED)
--if(NOT (${GCRYPT_VERSION_STRING} VERSION_LESS "1.6.0"))
-- message(STATUS "Gcrypt ${GCRYPT_VERSION_STRING} supports the SALSA20 cipher")
-- set(GCRYPT_HAS_SALSA20 1)
--endif()
-+find_package(Gcrypt 1.6.0 REQUIRED)
-
- find_package(ZLIB REQUIRED)
-
-@@ -199,10 +200,7 @@ endif()
-
- include_directories(SYSTEM ${GCRYPT_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR})
-
--if(NOT (${CMAKE_VERSION} VERSION_LESS 2.8.3))
-- set(PRINT_SUMMARY ON)
-- include(FeatureSummary)
--endif()
-+include(FeatureSummary)
-
- add_subdirectory(src)
- add_subdirectory(share)
-diff --git a/README.md b/README.md
-index 326bd4a..0c18ff3 100644
---- a/README.md
-+++ b/README.md
-@@ -49,20 +49,20 @@ Once downloaded, double click on the file to execute the installer.
- The following tools must exist within your PATH:
-
- * make
--* cmake (>= 2.6.4)
--* g++ or clang++
-+* cmake (>= 2.8.12)
-+* g++ (>= 4.7) or clang++ (>= 3.0)
-
- The following libraries are required:
-
--* Qt 4 (>= 4.6)
--* libgcrypt
-+* Qt 5 (>= 5.2): qtbase and qttools5
-+* libgcrypt (>= 1.6)
- * zlib
--* libxtst (optional for auto-type on X11)
-+* libxtst, qtx11extras (optional for auto-type on X11)
-
- On Debian you can install them with:
-
- ```bash
--sudo apt-get install build-essential cmake libqt4-dev libgcrypt11-dev zlib1g-dev
-+sudo apt-get install build-essential cmake qtbase5-dev libqt5x11extras5-dev qttools5-dev qttools5-dev-tools libgcrypt20-dev zlib1g-dev
- ```
-
- #### Build Steps
-diff --git a/share/translations/CMakeLists.txt b/share/translations/CMakeLists.txt
-index b1aa878..7380750 100644
---- a/share/translations/CMakeLists.txt
-+++ b/share/translations/CMakeLists.txt
-@@ -17,9 +17,9 @@ file(GLOB TRANSLATION_FILES *.ts)
- get_filename_component(TRANSLATION_EN_ABS keepassx_en.ts ABSOLUTE)
- list(REMOVE_ITEM TRANSLATION_FILES keepassx_en.ts)
- list(REMOVE_ITEM TRANSLATION_FILES ${TRANSLATION_EN_ABS})
--message(STATUS ${TRANSLATION_FILES})
-+message(STATUS "${TRANSLATION_FILES}")
-
--qt4_add_translation(QM_FILES ${TRANSLATION_FILES})
-+qt5_add_translation(QM_FILES ${TRANSLATION_FILES})
-
- install(FILES ${QM_FILES} DESTINATION ${DATA_INSTALL_DIR}/translations)
- add_custom_target(translations DEPENDS ${QM_FILES})
-diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
-index da8b9ec..da35651 100644
---- a/src/CMakeLists.txt
-+++ b/src/CMakeLists.txt
-@@ -54,9 +54,6 @@ set(keepassx_SOURCES
- core/ListDeleter.h
- core/Metadata.cpp
- core/PasswordGenerator.cpp
-- core/qlockfile.cpp
-- core/qsavefile.cpp
-- core/qsavefile_p.h
- core/SignalMultiplexer.cpp
- core/TimeDelta.cpp
- core/TimeInfo.cpp
-@@ -64,8 +61,6 @@ set(keepassx_SOURCES
- core/Tools.cpp
- core/Translator.cpp
- core/Uuid.cpp
-- core/qcommandlineoption.cpp
-- core/qcommandlineparser.cpp
- crypto/Crypto.cpp
- crypto/CryptoHash.cpp
- crypto/Random.cpp
-@@ -133,94 +128,10 @@ set(keepassx_SOURCES
- streams/SymmetricCipherStream.cpp
- )
-
--if(NOT GCRYPT_HAS_SALSA20)
-- set(keepassx_SOURCES
-- ${keepassx_SOURCES}
-- crypto/salsa20/ecrypt-config.h
-- crypto/salsa20/ecrypt-machine.h
-- crypto/salsa20/ecrypt-portable.h
-- crypto/salsa20/ecrypt-sync.h
-- crypto/salsa20/salsa20.c
-- crypto/SymmetricCipherSalsa20.cpp
-- )
--endif()
--
--if(UNIX)
-- set(keepassx_SOURCES
-- ${keepassx_SOURCES}
-- core/qlockfile_unix.cpp
-- )
--elseif(MINGW)
-- set(keepassx_SOURCES
-- ${keepassx_SOURCES}
-- core/qlockfile_win.cpp
-- )
--endif()
--
- set(keepassx_SOURCES_MAINEXE
- main.cpp
- )
-
--set(keepassx_MOC
-- autotype/AutoType.h
-- autotype/AutoTypeSelectDialog.h
-- autotype/AutoTypeSelectView.h
-- autotype/ShortcutWidget.h
-- autotype/WindowSelectComboBox.h
-- core/AutoTypeAssociations.h
-- core/Config.h
-- core/Database.h
-- core/Entry.h
-- core/EntryAttachments.h
-- core/EntryAttributes.h
-- core/Group.h
-- core/InactivityTimer.h
-- core/Metadata.h
-- core/qsavefile.h
-- gui/AboutDialog.h
-- gui/Application.h
-- gui/ChangeMasterKeyWidget.h
-- gui/Clipboard.h
-- gui/DatabaseOpenWidget.h
-- gui/DatabaseRepairWidget.h
-- gui/DatabaseSettingsWidget.h
-- gui/DatabaseTabWidget.h
-- gui/DatabaseWidget.h
-- gui/DatabaseWidgetStateSync.h
-- gui/DialogyWidget.h
-- gui/DragTabBar.h
-- gui/EditWidget.h
-- gui/EditWidgetIcons.h
-- gui/EditWidgetProperties.h
-- gui/IconModels.h
-- gui/KeePass1OpenWidget.h
-- gui/LineEdit.h
-- gui/MainWindow.h
-- gui/PasswordEdit.h
-- gui/PasswordGeneratorWidget.h
-- gui/PasswordComboBox.h
-- gui/SettingsWidget.h
-- gui/SortFilterHideProxyModel.h
-- gui/UnlockDatabaseWidget.h
-- gui/WelcomeWidget.h
-- gui/entry/AutoTypeAssociationsModel.h
-- gui/entry/EditEntryWidget.h
-- gui/entry/EntryAttachmentsModel.h
-- gui/entry/EntryAttributesModel.h
-- gui/entry/EntryHistoryModel.h
-- gui/entry/EntryModel.h
-- gui/entry/EntryView.h
-- gui/group/EditGroupWidget.h
-- gui/group/GroupModel.h
-- gui/group/GroupView.h
-- keys/CompositeKey_p.h
-- streams/HashedBlockStream.h
-- streams/LayeredStream.h
-- streams/qtiocompressor.h
-- streams/StoreDataStream.h
-- streams/SymmetricCipherStream.h
--)
--
- set(keepassx_FORMS
- gui/AboutDialog.ui
- gui/ChangeMasterKeyWidget.ui
-@@ -248,17 +159,18 @@ if(MINGW)
- ${CMAKE_SOURCE_DIR}/share/windows/icon.rc)
- endif()
-
--qt4_wrap_ui(keepassx_SOURCES ${keepassx_FORMS})
--qt4_wrap_cpp(keepassx_SOURCES ${keepassx_MOC})
-+qt5_wrap_ui(keepassx_SOURCES ${keepassx_FORMS})
-
- add_library(keepassx_core STATIC ${keepassx_SOURCES})
- set_target_properties(keepassx_core PROPERTIES COMPILE_DEFINITIONS KEEPASSX_BUILDING_CORE)
-+target_link_libraries(keepassx_core Qt5::Core Qt5::Concurrent Qt5::Widgets)
-
- add_executable(${PROGNAME} WIN32 MACOSX_BUNDLE ${keepassx_SOURCES_MAINEXE})
- target_link_libraries(${PROGNAME}
- keepassx_core
-- ${QT_QTCORE_LIBRARY}
-- ${QT_QTGUI_LIBRARY}
-+ Qt5::Core
-+ Qt5::Concurrent
-+ Qt5::Widgets
- ${GCRYPT_LIBRARIES}
- ${ZLIB_LIBRARIES})
-
-@@ -276,7 +188,7 @@ install(TARGETS ${PROGNAME}
-
- add_subdirectory(autotype)
-
--if(APPLE AND NOT (${CMAKE_VERSION} VERSION_LESS 2.8.8))
-+if(APPLE)
- if(QT_MAC_USE_COCOA AND EXISTS "${QT_LIBRARY_DIR}/Resources/qt_menu.nib")
- install(DIRECTORY "${QT_LIBRARY_DIR}/Resources/qt_menu.nib"
- DESTINATION "${DATA_INSTALL_DIR}")
-@@ -294,7 +206,7 @@ if(APPLE AND NOT (${CMAKE_VERSION} VERSION_LESS 2.8.8))
- install_qt4_executable(${PROGNAME}.app "qjpeg;qgif;qico;qtaccessiblewidgets")
- endif()
-
--if(MINGW AND NOT (${CMAKE_VERSION} VERSION_LESS 2.8.8))
-+if(MINGW )
- set(CPACK_GENERATOR "ZIP")
- set(CPACK_STRIP_FILES ON)
- set(CPACK_PACKAGE_FILE_NAME "${PROGNAME}-${KEEPASSX_VERSION_NUM}")
-diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp
-index f1b7e3e..15185b2 100644
---- a/src/autotype/AutoType.cpp
-+++ b/src/autotype/AutoType.cpp
-@@ -32,7 +32,7 @@
- #include "core/Tools.h"
- #include "gui/MessageBox.h"
-
--AutoType* AutoType::m_instance = Q_NULLPTR;
-+AutoType* AutoType::m_instance = nullptr;
-
- AutoType::AutoType(QObject* parent, bool test)
- : QObject(parent)
-@@ -40,8 +40,8 @@ AutoType::AutoType(QObject* parent, bool test)
- , m_currentGlobalKey(static_cast<Qt::Key>(0))
- , m_currentGlobalModifiers(0)
- , m_pluginLoader(new QPluginLoader(this))
-- , m_plugin(Q_NULLPTR)
-- , m_executor(Q_NULLPTR)
-+ , m_plugin(nullptr)
-+ , m_executor(nullptr)
- , m_windowFromGlobal(0)
- {
- // prevent crash when the plugin has unresolved symbols
-@@ -49,7 +49,7 @@ AutoType::AutoType(QObject* parent, bool test)
-
- QString pluginName = "keepassx-autotype-";
- if (!test) {
-- pluginName += Tools::platform();
-+ pluginName += QApplication::platformName();
- }
- else {
- pluginName += "test";
-@@ -68,7 +68,7 @@ AutoType::~AutoType()
- {
- if (m_executor) {
- delete m_executor;
-- m_executor = Q_NULLPTR;
-+ m_executor = nullptr;
- }
- }
-
-@@ -79,7 +79,7 @@ void AutoType::loadPlugin(const QString& pluginPath)
- QObject* pluginInstance = m_pluginLoader->instance();
- if (pluginInstance) {
- m_plugin = qobject_cast<AutoTypePlatformInterface*>(pluginInstance);
-- m_executor = Q_NULLPTR;
-+ m_executor = nullptr;
-
- if (m_plugin) {
- if (m_plugin->isAvailable()) {
-@@ -202,11 +202,11 @@ void AutoType::performGlobalAutoType(const QList<Database*>& dbList)
- QString message = tr("Couldn't find an entry that matches the window title:");
- message.append("\n\n");
- message.append(windowTitle);
-- MessageBox::information(Q_NULLPTR, tr("Auto-Type - KeePassX"), message);
-+ MessageBox::information(nullptr, tr("Auto-Type - KeePassX"), message);
- }
- else if ((entryList.size() == 1) && !config()->get("security/autotypeask").toBool()) {
- m_inAutoType = false;
-- performAutoType(entryList.first(), Q_NULLPTR, sequenceHash[entryList.first()]);
-+ performAutoType(entryList.first(), nullptr, sequenceHash[entryList.first()]);
- }
- else {
- m_windowFromGlobal = m_plugin->activeWindow();
-@@ -228,7 +228,7 @@ void AutoType::performAutoTypeFromGlobal(Entry* entry, const QString& sequence)
- m_plugin->raiseWindow(m_windowFromGlobal);
-
- m_inAutoType = false;
-- performAutoType(entry, Q_NULLPTR, sequence, m_windowFromGlobal);
-+ performAutoType(entry, nullptr, sequence, m_windowFromGlobal);
- }
-
- void AutoType::resetInAutoType()
-@@ -242,12 +242,12 @@ void AutoType::unloadPlugin()
- {
- if (m_executor) {
- delete m_executor;
-- m_executor = Q_NULLPTR;
-+ m_executor = nullptr;
- }
-
- if (m_plugin) {
- m_plugin->unload();
-- m_plugin = Q_NULLPTR;
-+ m_plugin = nullptr;
- }
- }
-
-diff --git a/src/autotype/AutoType.h b/src/autotype/AutoType.h
-index f3d626c..d1c8817 100644
---- a/src/autotype/AutoType.h
-+++ b/src/autotype/AutoType.h
-@@ -22,8 +22,6 @@
- #include <QStringList>
- #include <QWidget>
-
--#include "core/Global.h"
--
- class AutoTypeAction;
- class AutoTypeExecutor;
- class AutoTypePlatformInterface;
-@@ -37,7 +35,7 @@ class AutoType : public QObject
-
- public:
- QStringList windowTitles();
-- void performAutoType(const Entry* entry, QWidget* hideWindow = Q_NULLPTR,
-+ void performAutoType(const Entry* entry, QWidget* hideWindow = nullptr,
- const QString& customSequence = QString(), WId window = 0);
- bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers);
- void unregisterGlobalShortcut();
-@@ -62,7 +60,7 @@ private Q_SLOTS:
- void unloadPlugin();
-
- private:
-- explicit AutoType(QObject* parent = Q_NULLPTR, bool test = false);
-+ explicit AutoType(QObject* parent = nullptr, bool test = false);
- ~AutoType();
- void loadPlugin(const QString& pluginPath);
- bool parseActions(const QString& sequence, const Entry* entry, QList<AutoTypeAction*>& actions);
-diff --git a/src/autotype/AutoTypeAction.h b/src/autotype/AutoTypeAction.h
-index 07e050b..490f0d8 100644
---- a/src/autotype/AutoTypeAction.h
-+++ b/src/autotype/AutoTypeAction.h
-@@ -66,7 +66,7 @@ public:
- class KEEPASSX_EXPORT AutoTypeClearField : public AutoTypeAction
- {
- public:
-- explicit AutoTypeClearField();
-+ AutoTypeClearField();
- AutoTypeAction* clone();
- void accept(AutoTypeExecutor* executor);
- };
-diff --git a/src/autotype/AutoTypeSelectDialog.h b/src/autotype/AutoTypeSelectDialog.h
-index 4f455c7..c0dbfe4 100644
---- a/src/autotype/AutoTypeSelectDialog.h
-+++ b/src/autotype/AutoTypeSelectDialog.h
-@@ -22,8 +22,6 @@
- #include <QDialog>
- #include <QHash>
-
--#include "core/Global.h"
--
- class AutoTypeSelectView;
- class Entry;
-
-@@ -32,7 +30,7 @@ class AutoTypeSelectDialog : public QDialog
- Q_OBJECT
-
- public:
-- explicit AutoTypeSelectDialog(QWidget* parent = Q_NULLPTR);
-+ explicit AutoTypeSelectDialog(QWidget* parent = nullptr);
- void setEntries(const QList<Entry*>& entries, const QHash<Entry*, QString>& sequences);
-
- Q_SIGNALS:
-diff --git a/src/autotype/AutoTypeSelectView.h b/src/autotype/AutoTypeSelectView.h
-index bcbb262..749f6a9 100644
---- a/src/autotype/AutoTypeSelectView.h
-+++ b/src/autotype/AutoTypeSelectView.h
-@@ -18,7 +18,6 @@
- #ifndef KEEPASSX_AUTOTYPESELECTVIEW_H
- #define KEEPASSX_AUTOTYPESELECTVIEW_H
-
--#include "core/Global.h"
- #include "gui/entry/EntryView.h"
-
- class Entry;
-@@ -28,10 +27,10 @@ class AutoTypeSelectView : public EntryView
- Q_OBJECT
-
- public:
-- explicit AutoTypeSelectView(QWidget* parent = Q_NULLPTR);
-+ explicit AutoTypeSelectView(QWidget* parent = nullptr);
-
- protected:
-- void mouseMoveEvent(QMouseEvent* event) Q_DECL_OVERRIDE;
-+ void mouseMoveEvent(QMouseEvent* event) override;
-
- private Q_SLOTS:
- void selectFirstEntry();
-diff --git a/src/autotype/CMakeLists.txt b/src/autotype/CMakeLists.txt
-index a0f7877..707edf9 100644
---- a/src/autotype/CMakeLists.txt
-+++ b/src/autotype/CMakeLists.txt
-@@ -1,12 +1,12 @@
--if(Q_WS_X11)
-+if(UNIX AND NOT APPLE)
- find_package(X11)
-- if(PRINT_SUMMARY)
-- add_feature_info(libXi X11_Xi_FOUND "The X11 Xi Protocol library is required for auto-type")
-- add_feature_info(libXtest X11_XTest_FOUND "The X11 XTEST Protocol library is required for auto-type")
-- endif()
-+ find_package(Qt5X11Extras 5.2)
-+ add_feature_info(libXi X11_Xi_FOUND "The X11 Xi Protocol library is required for auto-type")
-+ add_feature_info(libXtest X11_XTest_FOUND "The X11 XTEST Protocol library is required for auto-type")
-+ add_feature_info(Qt5X11Extras Qt5X11Extras_FOUND "The Qt5X11Extras library is required for auto-type")
-
-- if(X11_FOUND AND X11_Xi_FOUND AND X11_XTest_FOUND)
-- add_subdirectory(x11)
-+ if(X11_FOUND AND X11_Xi_FOUND AND X11_XTest_FOUND AND Qt5X11Extras_FOUND)
-+ add_subdirectory(xcb)
- endif()
- endif()
-
-diff --git a/src/autotype/ShortcutWidget.h b/src/autotype/ShortcutWidget.h
-index 5ff306c..60898ab 100644
---- a/src/autotype/ShortcutWidget.h
-+++ b/src/autotype/ShortcutWidget.h
-@@ -20,21 +20,19 @@
-
- #include <QLineEdit>
-
--#include "core/Global.h"
--
- class ShortcutWidget : public QLineEdit
- {
- Q_OBJECT
-
- public:
-- explicit ShortcutWidget(QWidget* parent = Q_NULLPTR);
-+ explicit ShortcutWidget(QWidget* parent = nullptr);
- Qt::Key key() const;
- Qt::KeyboardModifiers modifiers() const;
- void setShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers);
-
- protected:
-- void keyPressEvent(QKeyEvent* event) Q_DECL_OVERRIDE;
-- void keyReleaseEvent(QKeyEvent* event) Q_DECL_OVERRIDE;
-+ void keyPressEvent(QKeyEvent* event) override;
-+ void keyReleaseEvent(QKeyEvent* event) override;
-
- private:
- void keyEvent(QKeyEvent* event);
-diff --git a/src/autotype/WindowSelectComboBox.h b/src/autotype/WindowSelectComboBox.h
-index 661bc84..244119a 100644
---- a/src/autotype/WindowSelectComboBox.h
-+++ b/src/autotype/WindowSelectComboBox.h
-@@ -20,19 +20,17 @@
-
- #include <QComboBox>
-
--#include "core/Global.h"
--
- class WindowSelectComboBox : public QComboBox
- {
- Q_OBJECT
-
- public:
-- explicit WindowSelectComboBox(QWidget* parent = Q_NULLPTR);
-+ explicit WindowSelectComboBox(QWidget* parent = nullptr);
- void refreshWindowList();
-
-- void showPopup() Q_DECL_OVERRIDE;
-- QSize sizeHint() const Q_DECL_OVERRIDE;
-- QSize minimumSizeHint() const Q_DECL_OVERRIDE;
-+ void showPopup() override;
-+ QSize sizeHint() const override;
-+ QSize minimumSizeHint() const override;
- };
-
- #endif // KEEPASSX_WINDOWSELECTCOMBOBOX_H
-diff --git a/src/autotype/test/AutoTypeTest.cpp b/src/autotype/test/AutoTypeTest.cpp
-index a8bcc71..979af8b 100644
---- a/src/autotype/test/AutoTypeTest.cpp
-+++ b/src/autotype/test/AutoTypeTest.cpp
-@@ -129,5 +129,3 @@ void AutoTypeExecturorTest::execKey(AutoTypeKey* action)
- {
- m_platform->addActionKey(action);
- }
--
--Q_EXPORT_PLUGIN2(keepassx-autotype-test, AutoTypePlatformTest)
-diff --git a/src/autotype/test/AutoTypeTest.h b/src/autotype/test/AutoTypeTest.h
-index c791c15..8c6e524 100644
---- a/src/autotype/test/AutoTypeTest.h
-+++ b/src/autotype/test/AutoTypeTest.h
-@@ -23,34 +23,34 @@
- #include "autotype/AutoTypePlatformPlugin.h"
- #include "autotype/AutoTypeAction.h"
- #include "autotype/test/AutoTypeTestInterface.h"
--#include "core/Global.h"
-
- class AutoTypePlatformTest : public QObject,
- public AutoTypePlatformInterface,
- public AutoTypeTestInterface
- {
- Q_OBJECT
-+ Q_PLUGIN_METADATA(IID "org.keepassx.AutoTypePlatformInterface")
- Q_INTERFACES(AutoTypePlatformInterface AutoTypeTestInterface)
-
- public:
-- QString keyToString(Qt::Key key) Q_DECL_OVERRIDE;
-+ QString keyToString(Qt::Key key) override;
-
-- bool isAvailable() Q_DECL_OVERRIDE;
-- QStringList windowTitles() Q_DECL_OVERRIDE;
-- WId activeWindow() Q_DECL_OVERRIDE;
-- QString activeWindowTitle() Q_DECL_OVERRIDE;
-- bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) Q_DECL_OVERRIDE;
-- void unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) Q_DECL_OVERRIDE;
-- int platformEventFilter(void* event) Q_DECL_OVERRIDE;
-- int initialTimeout() Q_DECL_OVERRIDE;
-- bool raiseWindow(WId window) Q_DECL_OVERRIDE;
-- AutoTypeExecutor* createExecutor() Q_DECL_OVERRIDE;
-+ bool isAvailable() override;
-+ QStringList windowTitles() override;
-+ WId activeWindow() override;
-+ QString activeWindowTitle() override;
-+ bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) override;
-+ void unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) override;
-+ int platformEventFilter(void* event) override;
-+ int initialTimeout() override;
-+ bool raiseWindow(WId window) override;
-+ AutoTypeExecutor* createExecutor() override;
-
-- void setActiveWindowTitle(const QString& title) Q_DECL_OVERRIDE;
-+ void setActiveWindowTitle(const QString& title) override;
-
-- QString actionChars() Q_DECL_OVERRIDE;
-- int actionCount() Q_DECL_OVERRIDE;
-- void clearActions() Q_DECL_OVERRIDE;
-+ QString actionChars() override;
-+ int actionCount() override;
-+ void clearActions() override;
-
- void addActionChar(AutoTypeChar* action);
- void addActionKey(AutoTypeKey* action);
-@@ -69,8 +69,8 @@ class AutoTypeExecturorTest : public AutoTypeExecutor
- public:
- explicit AutoTypeExecturorTest(AutoTypePlatformTest* platform);
-
-- void execChar(AutoTypeChar* action) Q_DECL_OVERRIDE;
-- void execKey(AutoTypeKey* action) Q_DECL_OVERRIDE;
-+ void execChar(AutoTypeChar* action) override;
-+ void execKey(AutoTypeKey* action) override;
-
- private:
- AutoTypePlatformTest* const m_platform;
-diff --git a/src/autotype/test/CMakeLists.txt b/src/autotype/test/CMakeLists.txt
-index 749f7d5..9b3dbd4 100644
---- a/src/autotype/test/CMakeLists.txt
-+++ b/src/autotype/test/CMakeLists.txt
-@@ -2,11 +2,5 @@ set(autotype_test_SOURCES
- AutoTypeTest.cpp
- )
-
--set(autotype_test_MOC
-- AutoTypeTest.h
--)
--
--qt4_wrap_cpp(autotype_test_SOURCES ${autotype_test_MOC})
--
- add_library(keepassx-autotype-test MODULE ${autotype_test_SOURCES})
--target_link_libraries(keepassx-autotype-test testautotype ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY})
-+target_link_libraries(keepassx-autotype-test testautotype Qt5::Core Qt5::Widgets)
-diff --git a/src/autotype/x11/AutoTypeX11.cpp b/src/autotype/x11/AutoTypeX11.cpp
-deleted file mode 100644
-index 6a20a88..0000000
---- a/src/autotype/x11/AutoTypeX11.cpp
-+++ /dev/null
-@@ -1,850 +0,0 @@
--/*
-- * Copyright (C) 2012 Felix Geyer <debfx at fobos.de>
-- * Copyright (C) 2000-2008 Tom Sato <VEF00200 at nifty.ne.jp>
-- *
-- * This program is free software: you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License as published by
-- * the Free Software Foundation, either version 2 or (at your option)
-- * version 3 of the License.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program. If not, see <http://www.gnu.org/licenses/>.
-- */
--
--#include "AutoTypeX11.h"
--#include "KeySymMap.h"
--
--#include <time.h>
--
--bool AutoTypePlatformX11::m_catchXErrors = false;
--bool AutoTypePlatformX11::m_xErrorOccured = false;
--int (*AutoTypePlatformX11::m_oldXErrorHandler)(Display*, XErrorEvent*) = Q_NULLPTR;
--
--AutoTypePlatformX11::AutoTypePlatformX11()
--{
-- m_dpy = QX11Info::display();
-- m_rootWindow = QX11Info::appRootWindow();
--
-- m_atomWmState = XInternAtom(m_dpy, "WM_STATE", True);
-- m_atomWmName = XInternAtom(m_dpy, "WM_NAME", True);
-- m_atomNetWmName = XInternAtom(m_dpy, "_NET_WM_NAME", True);
-- m_atomString = XInternAtom(m_dpy, "STRING", True);
-- m_atomUtf8String = XInternAtom(m_dpy, "UTF8_STRING", True);
-- m_atomNetActiveWindow = XInternAtom(m_dpy, "_NET_ACTIVE_WINDOW", True);
--
-- m_classBlacklist << "desktop_window" << "gnome-panel"; // Gnome
-- m_classBlacklist << "kdesktop" << "kicker"; // KDE 3
-- m_classBlacklist << "Plasma"; // KDE 4
-- m_classBlacklist << "plasmashell"; // KDE 5
-- m_classBlacklist << "xfdesktop" << "xfce4-panel"; // Xfce 4
--
-- m_currentGlobalKey = static_cast<Qt::Key>(0);
-- m_currentGlobalModifiers = 0;
--
-- m_keysymTable = Q_NULLPTR;
-- m_xkb = Q_NULLPTR;
-- m_remapKeycode = 0;
-- m_currentRemapKeysym = NoSymbol;
-- m_modifierMask = ControlMask | ShiftMask | Mod1Mask | Mod4Mask;
--
-- m_loaded = true;
--
-- updateKeymap();
--}
--
--bool AutoTypePlatformX11::isAvailable()
--{
-- int ignore;
--
-- if (!XQueryExtension(m_dpy, "XInputExtension", &ignore, &ignore, &ignore)) {
-- return false;
-- }
--
-- if (!XQueryExtension(m_dpy, "XTEST", &ignore, &ignore, &ignore)) {
-- return false;
-- }
--
-- if (!m_xkb) {
-- XkbDescPtr kbd = getKeyboard();
--
-- if (!kbd) {
-- return false;
-- }
--
-- XkbFreeKeyboard(kbd, XkbAllComponentsMask, True);
-- }
--
-- return true;
--}
--
--void AutoTypePlatformX11::unload()
--{
-- // Restore the KeyboardMapping to its original state.
-- if (m_currentRemapKeysym != NoSymbol) {
-- AddKeysym(NoSymbol);
-- }
--
-- if (m_keysymTable) {
-- XFree(m_keysymTable);
-- }
--
-- if (m_xkb) {
-- XkbFreeKeyboard(m_xkb, XkbAllComponentsMask, True);
-- }
--
-- m_loaded = false;
--}
--
--QStringList AutoTypePlatformX11::windowTitles()
--{
-- return windowTitlesRecursive(m_rootWindow);
--}
--
--WId AutoTypePlatformX11::activeWindow()
--{
-- Window window;
-- int revert_to_return;
-- XGetInputFocus(m_dpy, &window, &revert_to_return);
--
-- int tree;
-- do {
-- if (isTopLevelWindow(window)) {
-- break;
-- }
--
-- Window root;
-- Window parent;
-- Window* children = Q_NULLPTR;
-- unsigned int numChildren;
-- tree = XQueryTree(m_dpy, window, &root, &parent, &children, &numChildren);
-- window = parent;
-- if (children) {
-- XFree(children);
-- }
-- } while (tree && window);
--
-- return window;
--}
--
--QString AutoTypePlatformX11::activeWindowTitle()
--{
-- return windowTitle(activeWindow(), true);
--}
--
--bool AutoTypePlatformX11::registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers)
--{
-- int keycode = XKeysymToKeycode(m_dpy, charToKeySym(key));
-- uint nativeModifiers = qtToNativeModifiers(modifiers);
--
-- startCatchXErrors();
-- XGrabKey(m_dpy, keycode, nativeModifiers, m_rootWindow, True, GrabModeAsync, GrabModeAsync);
-- XGrabKey(m_dpy, keycode, nativeModifiers | Mod2Mask, m_rootWindow, True, GrabModeAsync,
-- GrabModeAsync);
-- XGrabKey(m_dpy, keycode, nativeModifiers | LockMask, m_rootWindow, True, GrabModeAsync,
-- GrabModeAsync);
-- XGrabKey(m_dpy, keycode, nativeModifiers | Mod2Mask | LockMask, m_rootWindow, True,
-- GrabModeAsync, GrabModeAsync);
-- stopCatchXErrors();
--
-- if (!m_xErrorOccured) {
-- m_currentGlobalKey = key;
-- m_currentGlobalModifiers = modifiers;
-- m_currentGlobalKeycode = keycode;
-- m_currentGlobalNativeModifiers = nativeModifiers;
-- return true;
-- }
-- else {
-- unregisterGlobalShortcut(key, modifiers);
-- return false;
-- }
--}
--
--uint AutoTypePlatformX11::qtToNativeModifiers(Qt::KeyboardModifiers modifiers)
--{
-- uint nativeModifiers = 0;
--
-- if (modifiers & Qt::ShiftModifier) {
-- nativeModifiers |= ShiftMask;
-- }
-- if (modifiers & Qt::ControlModifier) {
-- nativeModifiers |= ControlMask;
-- }
-- if (modifiers & Qt::AltModifier) {
-- nativeModifiers |= Mod1Mask;
-- }
-- if (modifiers & Qt::MetaModifier) {
-- nativeModifiers |= Mod4Mask;
-- }
--
-- return nativeModifiers;
--}
--
--void AutoTypePlatformX11::unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers)
--{
-- KeyCode keycode = XKeysymToKeycode(m_dpy, charToKeySym(key));
-- uint nativeModifiers = qtToNativeModifiers(modifiers);
--
-- XUngrabKey(m_dpy, keycode, nativeModifiers, m_rootWindow);
-- XUngrabKey(m_dpy, keycode, nativeModifiers | Mod2Mask, m_rootWindow);
-- XUngrabKey(m_dpy, keycode, nativeModifiers | LockMask, m_rootWindow);
-- XUngrabKey(m_dpy, keycode, nativeModifiers | Mod2Mask | LockMask, m_rootWindow);
--
-- m_currentGlobalKey = static_cast<Qt::Key>(0);
-- m_currentGlobalModifiers = 0;
-- m_currentGlobalKeycode = 0;
-- m_currentGlobalNativeModifiers = 0;
--}
--
--int AutoTypePlatformX11::platformEventFilter(void* event)
--{
-- XEvent* xevent = static_cast<XEvent*>(event);
--
-- if ((xevent->type == KeyPress || xevent->type == KeyRelease)
-- && m_currentGlobalKey
-- && xevent->xkey.keycode == m_currentGlobalKeycode
-- && (xevent->xkey.state & m_modifierMask) == m_currentGlobalNativeModifiers
-- && (!QApplication::activeWindow() || QApplication::activeWindow()->isMinimized())
-- && m_loaded) {
-- if (xevent->type == KeyPress) {
-- Q_EMIT globalShortcutTriggered();
-- }
-- return 1;
-- }
-- if (xevent->type == MappingNotify && m_loaded) {
-- XRefreshKeyboardMapping(reinterpret_cast<XMappingEvent*>(xevent));
-- updateKeymap();
-- }
--
-- return -1;
--}
--
--AutoTypeExecutor* AutoTypePlatformX11::createExecutor()
--{
-- return new AutoTypeExecturorX11(this);
--}
--
--QString AutoTypePlatformX11::windowTitle(Window window, bool useBlacklist)
--{
-- QString title;
--
-- Atom type;
-- int format;
-- unsigned long nitems;
-- unsigned long after;
-- unsigned char* data = Q_NULLPTR;
--
-- // the window manager spec says we should read _NET_WM_NAME first, then fall back to WM_NAME
--
-- int retVal = XGetWindowProperty(m_dpy, window, m_atomNetWmName, 0, 1000, False, m_atomUtf8String,
-- &type, &format, &nitems, &after, &data);
--
-- if ((retVal == 0) && data) {
-- title = QString::fromUtf8(reinterpret_cast<char*>(data));
-- }
-- else {
-- XTextProperty textProp;
-- retVal = XGetTextProperty(m_dpy, window, &textProp, m_atomWmName);
-- if ((retVal != 0) && textProp.value) {
-- char** textList = Q_NULLPTR;
-- int count;
--
-- if (textProp.encoding == m_atomUtf8String) {
-- title = QString::fromUtf8(reinterpret_cast<char*>(textProp.value));
-- }
-- else if ((XmbTextPropertyToTextList(m_dpy, &textProp, &textList, &count) == 0)
-- && textList && (count > 0)) {
-- title = QString::fromLocal8Bit(textList[0]);
-- }
-- else if (textProp.encoding == m_atomString) {
-- title = QString::fromLocal8Bit(reinterpret_cast<char*>(textProp.value));
-- }
--
-- if (textList) {
-- XFreeStringList(textList);
-- }
-- }
--
-- if (textProp.value) {
-- XFree(textProp.value);
-- }
-- }
--
-- if (data) {
-- XFree(data);
-- }
--
-- if (useBlacklist && !title.isEmpty()) {
-- if (window == m_rootWindow) {
-- return QString();
-- }
--
-- QString className = windowClassName(window);
-- if (m_classBlacklist.contains(className)) {
-- return QString();
-- }
--
-- QList<Window> keepassxWindows = widgetsToX11Windows(QApplication::topLevelWidgets());
-- if (keepassxWindows.contains(window)) {
-- return QString();
-- }
-- }
--
-- return title;
--}
--
--QString AutoTypePlatformX11::windowClassName(Window window)
--{
-- QString className;
--
-- XClassHint wmClass;
-- wmClass.res_name = Q_NULLPTR;
-- wmClass.res_class = Q_NULLPTR;
--
-- if (XGetClassHint(m_dpy, window, &wmClass) && wmClass.res_name) {
-- className = QString::fromLocal8Bit(wmClass.res_name);
-- }
-- if (wmClass.res_name) {
-- XFree(wmClass.res_name);
-- }
-- if (wmClass.res_class) {
-- XFree(wmClass.res_class);
-- }
--
-- return className;
--}
--
--QList<Window> AutoTypePlatformX11::widgetsToX11Windows(const QWidgetList& widgetList)
--{
-- QList<Window> windows;
--
-- Q_FOREACH (const QWidget* widget, widgetList) {
-- windows.append(widget->effectiveWinId());
-- }
--
-- return windows;
--}
--
--QStringList AutoTypePlatformX11::windowTitlesRecursive(Window window)
--{
-- QStringList titles;
--
-- if (isTopLevelWindow(window)) {
-- QString title = windowTitle(window, true);
-- if (!title.isEmpty()) {
-- titles.append(title);
-- }
-- }
--
-- Window root;
-- Window parent;
-- Window* children = Q_NULLPTR;
-- unsigned int numChildren;
-- if (XQueryTree(m_dpy, window, &root, &parent, &children, &numChildren) && children) {
-- for (uint i = 0; i < numChildren; i++) {
-- titles.append(windowTitlesRecursive(children[i]));
-- }
-- }
-- if (children) {
-- XFree(children);
-- }
--
-- return titles;
--}
--
--bool AutoTypePlatformX11::isTopLevelWindow(Window window)
--{
-- Atom type = None;
-- int format;
-- unsigned long nitems;
-- unsigned long after;
-- unsigned char* data = Q_NULLPTR;
-- int retVal = XGetWindowProperty(m_dpy, window, m_atomWmState, 0, 0, False, AnyPropertyType, &type, &format,
-- &nitems, &after, &data);
-- if (data) {
-- XFree(data);
-- }
--
-- return (retVal == 0) && type;
--}
--
--KeySym AutoTypePlatformX11::charToKeySym(const QChar& ch)
--{
-- ushort unicode = ch.unicode();
--
-- /* first check for Latin-1 characters (1:1 mapping) */
-- if ((unicode >= 0x0020 && unicode <= 0x007e)
-- || (unicode >= 0x00a0 && unicode <= 0x00ff)) {
-- return unicode;
-- }
--
-- /* mapping table generated from keysymdef.h */
-- const uint* match = qBinaryFind(m_unicodeToKeysymKeys,
-- m_unicodeToKeysymKeys + m_unicodeToKeysymLen,
-- unicode);
-- int index = match - m_unicodeToKeysymKeys;
-- if (index != m_unicodeToKeysymLen) {
-- return m_unicodeToKeysymValues[index];
-- }
--
-- if (unicode >= 0x0100) {
-- return unicode | 0x01000000;
-- }
--
-- return NoSymbol;
--}
--
--KeySym AutoTypePlatformX11::keyToKeySym(Qt::Key key)
--{
-- switch (key) {
-- case Qt::Key_Tab:
-- return XK_Tab;
-- case Qt::Key_Enter:
-- return XK_Return;
-- case Qt::Key_Up:
-- return XK_Up;
-- case Qt::Key_Down:
-- return XK_Down;
-- case Qt::Key_Left:
-- return XK_Left;
-- case Qt::Key_Right:
-- return XK_Right;
-- case Qt::Key_Insert:
-- return XK_Insert;
-- case Qt::Key_Delete:
-- return XK_Delete;
-- case Qt::Key_Home:
-- return XK_Home;
-- case Qt::Key_End:
-- return XK_End;
-- case Qt::Key_PageUp:
-- return XK_Page_Up;
-- case Qt::Key_PageDown:
-- return XK_Page_Down;
-- case Qt::Key_Backspace:
-- return XK_BackSpace;
-- case Qt::Key_Pause:
-- return XK_Break;
-- case Qt::Key_CapsLock:
-- return XK_Caps_Lock;
-- case Qt::Key_Escape:
-- return XK_Escape;
-- case Qt::Key_Help:
-- return XK_Help;
-- case Qt::Key_NumLock:
-- return XK_Num_Lock;
-- case Qt::Key_Print:
-- return XK_Print;
-- case Qt::Key_ScrollLock:
-- return XK_Scroll_Lock;
-- default:
-- if (key >= Qt::Key_F1 && key <= Qt::Key_F16) {
-- return XK_F1 + (key - Qt::Key_F1);
-- }
-- else {
-- return NoSymbol;
-- }
-- }
--}
--
--/*
-- * Update the keyboard and modifier mapping.
-- * We need the KeyboardMapping for AddKeysym.
-- * Modifier mapping is required for clearing the modifiers.
-- */
--void AutoTypePlatformX11::updateKeymap()
--{
-- int keycode, inx;
-- int mod_index, mod_key;
-- XModifierKeymap *modifiers;
--
-- if (m_xkb) {
-- XkbFreeKeyboard(m_xkb, XkbAllComponentsMask, True);
-- }
-- m_xkb = getKeyboard();
--
-- XDisplayKeycodes(m_dpy, &m_minKeycode, &m_maxKeycode);
-- if (m_keysymTable != NULL) XFree(m_keysymTable);
-- m_keysymTable = XGetKeyboardMapping(m_dpy,
-- m_minKeycode, m_maxKeycode - m_minKeycode + 1,
-- &m_keysymPerKeycode);
--
-- /* determine the keycode to use for remapped keys */
-- inx = (m_remapKeycode - m_minKeycode) * m_keysymPerKeycode;
-- if (m_remapKeycode == 0 || !isRemapKeycodeValid()) {
-- for (keycode = m_minKeycode; keycode <= m_maxKeycode; keycode++) {
-- inx = (keycode - m_minKeycode) * m_keysymPerKeycode;
-- if (m_keysymTable[inx] == NoSymbol) {
-- m_remapKeycode = keycode;
-- m_currentRemapKeysym = NoSymbol;
-- break;
-- }
-- }
-- }
--
-- /* determine the keycode to use for modifiers */
-- modifiers = XGetModifierMapping(m_dpy);
-- for (mod_index = ShiftMapIndex; mod_index <= Mod5MapIndex; mod_index ++) {
-- m_modifier_keycode[mod_index] = 0;
-- for (mod_key = 0; mod_key < modifiers->max_keypermod; mod_key++) {
-- keycode = modifiers->modifiermap[mod_index * modifiers->max_keypermod + mod_key];
-- if (keycode) {
-- m_modifier_keycode[mod_index] = keycode;
-- break;
-- }
-- }
-- }
-- XFreeModifiermap(modifiers);
--
-- /* Xlib needs some time until the mapping is distributed to
-- all clients */
-- // TODO: we should probably only sleep while in the middle of typing something
-- timespec ts;
-- ts.tv_sec = 0;
-- ts.tv_nsec = 30 * 1000 * 1000;
-- nanosleep(&ts, Q_NULLPTR);
--}
--
--bool AutoTypePlatformX11::isRemapKeycodeValid()
--{
-- int baseKeycode = (m_remapKeycode - m_minKeycode) * m_keysymPerKeycode;
-- for (int i = 0; i < m_keysymPerKeycode; i++) {
-- if (m_keysymTable[baseKeycode + i] == m_currentRemapKeysym) {
-- return true;
-- }
-- }
--
-- return false;
--}
--
--void AutoTypePlatformX11::startCatchXErrors()
--{
-- Q_ASSERT(!m_catchXErrors);
--
-- m_catchXErrors = true;
-- m_xErrorOccured = false;
-- m_oldXErrorHandler = XSetErrorHandler(x11ErrorHandler);
--}
--
--void AutoTypePlatformX11::stopCatchXErrors()
--{
-- Q_ASSERT(m_catchXErrors);
--
-- XSync(m_dpy, False);
-- XSetErrorHandler(m_oldXErrorHandler);
-- m_catchXErrors = false;
--}
--
--int AutoTypePlatformX11::x11ErrorHandler(Display* display, XErrorEvent* error)
--{
-- Q_UNUSED(display)
-- Q_UNUSED(error)
--
-- if (m_catchXErrors) {
-- m_xErrorOccured = true;
-- }
--
-- return 1;
--}
--
--XkbDescPtr AutoTypePlatformX11::getKeyboard()
--{
-- int num_devices;
-- XID keyboard_id = XkbUseCoreKbd;
-- XDeviceInfo* devices = XListInputDevices(m_dpy, &num_devices);
-- if (!devices) {
-- return Q_NULLPTR;
-- }
--
-- for (int i = 0; i < num_devices; i++) {
-- if (QString(devices[i].name) == "Virtual core XTEST keyboard") {
-- keyboard_id = devices[i].id;
-- break;
-- }
-- }
--
-- XFreeDeviceList(devices);
--
-- return XkbGetKeyboard(m_dpy, XkbCompatMapMask | XkbGeometryMask, keyboard_id);
--}
--
--// --------------------------------------------------------------------------
--// The following code is taken from xvkbd 3.0 and has been slightly modified.
--// --------------------------------------------------------------------------
--
--/*
-- * Insert a specified keysym on the dedicated position in the keymap
-- * table.
-- */
--int AutoTypePlatformX11::AddKeysym(KeySym keysym)
--{
-- if (m_remapKeycode == 0) {
-- return 0;
-- }
--
-- int inx = (m_remapKeycode- m_minKeycode) * m_keysymPerKeycode;
-- m_keysymTable[inx] = keysym;
-- m_currentRemapKeysym = keysym;
--
-- XChangeKeyboardMapping(m_dpy, m_remapKeycode, m_keysymPerKeycode, &m_keysymTable[inx], 1);
-- XFlush(m_dpy);
-- updateKeymap();
--
-- return m_remapKeycode;
--}
--
--/*
-- * Send event to the focused window.
-- * If input focus is specified explicitly, select the window
-- * before send event to the window.
-- */
--void AutoTypePlatformX11::SendEvent(XKeyEvent* event, int event_type)
--{
-- XSync(event->display, False);
-- int (*oldHandler) (Display*, XErrorEvent*) = XSetErrorHandler(MyErrorHandler);
--
-- event->type = event_type;
-- Bool press;
-- if (event->type == KeyPress) {
-- press = True;
-- }
-- else {
-- press = False;
-- }
-- XTestFakeKeyEvent(event->display, event->keycode, press, 0);
-- XFlush(event->display);
--
-- XSetErrorHandler(oldHandler);
--}
--
--/*
-- * Send a modifier press/release event for all modifiers
-- * which are set in the mask variable.
-- */
--void AutoTypePlatformX11::SendModifier(XKeyEvent *event, unsigned int mask, int event_type)
--{
-- int mod_index;
-- for (mod_index = ShiftMapIndex; mod_index <= Mod5MapIndex; mod_index ++) {
-- if (mask & (1 << mod_index)) {
-- event->keycode = m_modifier_keycode[mod_index];
-- SendEvent(event, event_type);
-- if (event_type == KeyPress)
-- event->state |= (1 << mod_index);
-- else
-- event->state &= (1 << mod_index);
-- }
-- }
--}
--
--/*
-- * Determines the keycode and modifier mask for the given
-- * keysym.
-- */
--int AutoTypePlatformX11::GetKeycode(KeySym keysym, unsigned int *mask)
--{
-- int keycode = XKeysymToKeycode(m_dpy, keysym);
--
-- if (keycode && keysymModifiers(keysym, keycode, mask)) {
-- return keycode;
-- }
--
-- /* no modifier matches => resort to remapping */
-- keycode = AddKeysym(keysym);
-- if (keycode && keysymModifiers(keysym, keycode, mask)) {
-- return keycode;
-- }
--
-- *mask = 0;
-- return 0;
--}
--
--bool AutoTypePlatformX11::keysymModifiers(KeySym keysym, int keycode, unsigned int *mask)
--{
-- int shift, mod;
-- unsigned int mods_rtrn;
--
-- /* determine whether there is a combination of the modifiers
-- (Mod1-Mod5) with or without shift which returns keysym */
-- for (shift = 0; shift < 2; shift ++) {
-- for (mod = ControlMapIndex; mod <= Mod5MapIndex; mod ++) {
-- KeySym keysym_rtrn;
-- *mask = (mod == ControlMapIndex) ? shift : shift | (1 << mod);
-- XkbTranslateKeyCode(m_xkb, keycode, *mask, &mods_rtrn, &keysym_rtrn);
-- if (keysym_rtrn == keysym) {
-- return true;
-- }
-- }
-- }
--
-- return false;
--}
--
--
--
--/*
-- * Send sequence of KeyPressed/KeyReleased events to the focused
-- * window to simulate keyboard. If modifiers (shift, control, etc)
-- * are set ON, many events will be sent.
-- */
--void AutoTypePlatformX11::SendKeyPressedEvent(KeySym keysym)
--{
-- Window cur_focus;
-- int revert_to;
-- XKeyEvent event;
-- int keycode;
--
-- if (keysym == NoSymbol) {
-- qWarning("No such key: keysym=0x%lX", keysym);
-- return;
-- }
--
-- XGetInputFocus(m_dpy, &cur_focus, &revert_to);
--
-- event.display = m_dpy;
-- event.window = cur_focus;
-- event.root = m_rootWindow;
-- event.subwindow = None;
-- event.time = CurrentTime;
-- event.x = 1;
-- event.y = 1;
-- event.x_root = 1;
-- event.y_root = 1;
-- event.same_screen = TRUE;
--
-- Window root, child;
-- int root_x, root_y, x, y;
-- unsigned int wanted_mask = 0;
-- unsigned int original_mask;
--
-- XQueryPointer(m_dpy, event.root, &root, &child, &root_x, &root_y, &x, &y, &original_mask);
--
-- /* determine keycode and mask for the given keysym */
-- keycode = GetKeycode(keysym, &wanted_mask);
-- if (keycode < 8 || keycode > 255) {
-- qWarning("Unable to get valid keycode for key: keysym=0x%lX", keysym);
-- return;
-- }
--
-- event.state = original_mask;
--
-- // modifiers that need to be pressed but aren't
-- unsigned int press_mask = wanted_mask & ~original_mask;
--
-- // modifiers that are pressed but maybe shouldn't
-- unsigned int release_check_mask = original_mask & ~wanted_mask;
--
-- // modifiers we need to release before sending the keycode
-- unsigned int release_mask = 0;
--
-- // check every release_check_mask individually if it affects the keysym we would generate
-- // if it doesn't we probably don't need to release it
-- for (int mod_index = ShiftMapIndex; mod_index <= Mod5MapIndex; mod_index ++) {
-- if (release_check_mask & (1 << mod_index)) {
-- unsigned int mods_rtrn;
-- KeySym keysym_rtrn;
-- XkbTranslateKeyCode(m_xkb, keycode, wanted_mask | (1 << mod_index), &mods_rtrn, &keysym_rtrn);
--
-- if (keysym_rtrn != keysym) {
-- release_mask |= (1 << mod_index);
-- }
-- }
-- }
--
-- // finally check if the combination of pressed modifiers that we chose to ignore affects the keysym
-- unsigned int mods_rtrn;
-- KeySym keysym_rtrn;
-- XkbTranslateKeyCode(m_xkb, keycode, wanted_mask | (release_check_mask & ~release_mask), &mods_rtrn, &keysym_rtrn);
-- if (keysym_rtrn != keysym) {
-- // oh well, release all the modifiers we don't want
-- release_mask = release_check_mask;
-- }
--
-- /* release all modifiers */
-- SendModifier(&event, release_mask, KeyRelease);
--
-- SendModifier(&event, press_mask, KeyPress);
--
-- /* press and release key */
-- event.keycode = keycode;
-- SendEvent(&event, KeyPress);
-- SendEvent(&event, KeyRelease);
--
-- /* release the modifiers */
-- SendModifier(&event, press_mask, KeyRelease);
--
-- /* restore the old keyboard mask */
-- SendModifier(&event, release_mask, KeyPress);
--}
--
--int AutoTypePlatformX11::MyErrorHandler(Display* my_dpy, XErrorEvent* event)
--{
-- char msg[200];
--
-- if (event->error_code == BadWindow) {
-- return 0;
-- }
-- XGetErrorText(my_dpy, event->error_code, msg, sizeof(msg) - 1);
-- qWarning("X error trapped: %s, request-code=%d\n", msg, event->request_code);
-- return 0;
--}
--
--
--AutoTypeExecturorX11::AutoTypeExecturorX11(AutoTypePlatformX11* platform)
-- : m_platform(platform)
--{
--}
--
--void AutoTypeExecturorX11::execChar(AutoTypeChar* action)
--{
-- m_platform->SendKeyPressedEvent(m_platform->charToKeySym(action->character));
--}
--
--void AutoTypeExecturorX11::execKey(AutoTypeKey* action)
--{
-- m_platform->SendKeyPressedEvent(m_platform->keyToKeySym(action->key));
--}
--
--int AutoTypePlatformX11::initialTimeout()
--{
-- return 500;
--}
--
--bool AutoTypePlatformX11::raiseWindow(WId window)
--{
-- if (m_atomNetActiveWindow == None) {
-- return false;
-- }
--
-- XRaiseWindow(m_dpy, window);
--
-- XEvent event;
-- event.xclient.type = ClientMessage;
-- event.xclient.serial = 0;
-- event.xclient.send_event = True;
-- event.xclient.window = window;
-- event.xclient.message_type = m_atomNetActiveWindow;
-- event.xclient.format = 32;
-- event.xclient.data.l[0] = 1; // FromApplication
-- event.xclient.data.l[1] = QX11Info::appUserTime();
-- QWidget* activeWindow = QApplication::activeWindow();
-- if (activeWindow) {
-- event.xclient.data.l[2] = activeWindow->internalWinId();
-- }
-- else {
-- event.xclient.data.l[2] = 0;
-- }
-- event.xclient.data.l[3] = 0;
-- event.xclient.data.l[4] = 0;
-- XSendEvent(m_dpy, m_rootWindow, False,
-- SubstructureRedirectMask | SubstructureNotifyMask,
-- &event);
-- XFlush(m_dpy);
--
-- return true;
--}
--
--Q_EXPORT_PLUGIN2(keepassx-autotype-x11, AutoTypePlatformX11)
-diff --git a/src/autotype/x11/AutoTypeX11.h b/src/autotype/x11/AutoTypeX11.h
-deleted file mode 100644
-index 99abb23..0000000
---- a/src/autotype/x11/AutoTypeX11.h
-+++ /dev/null
-@@ -1,134 +0,0 @@
--/*
-- * Copyright (C) 2012 Felix Geyer <debfx at fobos.de>
-- * Copyright (C) 2000-2008 Tom Sato <VEF00200 at nifty.ne.jp>
-- *
-- * This program is free software: you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License as published by
-- * the Free Software Foundation, either version 2 or (at your option)
-- * version 3 of the License.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program. If not, see <http://www.gnu.org/licenses/>.
-- */
--
--#ifndef KEEPASSX_AUTOTYPEX11_H
--#define KEEPASSX_AUTOTYPEX11_H
--
--#include <QApplication>
--#include <QSet>
--#include <QtPlugin>
--#include <QWidget>
--#include <QX11Info>
--
--#include <X11/Xutil.h>
--#include <X11/extensions/XTest.h>
--#include <X11/XKBlib.h>
--
--#include "autotype/AutoTypePlatformPlugin.h"
--#include "autotype/AutoTypeAction.h"
--#include "core/Global.h"
--
--#define N_MOD_INDICES (Mod5MapIndex + 1)
--
--class AutoTypePlatformX11 : public QObject, public AutoTypePlatformInterface
--{
-- Q_OBJECT
-- Q_INTERFACES(AutoTypePlatformInterface)
--
--public:
-- AutoTypePlatformX11();
-- bool isAvailable() Q_DECL_OVERRIDE;
-- void unload() Q_DECL_OVERRIDE;
-- QStringList windowTitles() Q_DECL_OVERRIDE;
-- WId activeWindow() Q_DECL_OVERRIDE;
-- QString activeWindowTitle() Q_DECL_OVERRIDE;
-- bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) Q_DECL_OVERRIDE;
-- void unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) Q_DECL_OVERRIDE;
-- int platformEventFilter(void* event) Q_DECL_OVERRIDE;
-- int initialTimeout() Q_DECL_OVERRIDE;
-- bool raiseWindow(WId window) Q_DECL_OVERRIDE;
-- AutoTypeExecutor* createExecutor() Q_DECL_OVERRIDE;
--
-- KeySym charToKeySym(const QChar& ch);
-- KeySym keyToKeySym(Qt::Key key);
--
-- void SendKeyPressedEvent(KeySym keysym);
--
--Q_SIGNALS:
-- void globalShortcutTriggered();
--
--private:
-- QString windowTitle(Window window, bool useBlacklist);
-- QStringList windowTitlesRecursive(Window window);
-- QString windowClassName(Window window);
-- QList<Window> widgetsToX11Windows(const QWidgetList& widgetList);
-- bool isTopLevelWindow(Window window);
-- uint qtToNativeModifiers(Qt::KeyboardModifiers modifiers);
-- void startCatchXErrors();
-- void stopCatchXErrors();
-- static int x11ErrorHandler(Display* display, XErrorEvent* error);
--
-- XkbDescPtr getKeyboard();
-- void updateKeymap();
-- bool isRemapKeycodeValid();
-- int AddKeysym(KeySym keysym);
-- void AddModifier(KeySym keysym);
-- void SendEvent(XKeyEvent* event, int event_type);
-- void SendModifier(XKeyEvent *event, unsigned int mask, int event_type);
-- int GetKeycode(KeySym keysym, unsigned int *mask);
-- bool keysymModifiers(KeySym keysym, int keycode, unsigned int *mask);
--
-- static int MyErrorHandler(Display* my_dpy, XErrorEvent* event);
--
-- Display* m_dpy;
-- Window m_rootWindow;
-- Atom m_atomWmState;
-- Atom m_atomWmName;
-- Atom m_atomNetWmName;
-- Atom m_atomString;
-- Atom m_atomUtf8String;
-- Atom m_atomNetActiveWindow;
-- QSet<QString> m_classBlacklist;
-- Qt::Key m_currentGlobalKey;
-- Qt::KeyboardModifiers m_currentGlobalModifiers;
-- uint m_currentGlobalKeycode;
-- uint m_currentGlobalNativeModifiers;
-- int m_modifierMask;
-- static bool m_catchXErrors;
-- static bool m_xErrorOccured;
-- static int (*m_oldXErrorHandler)(Display*, XErrorEvent*);
--
-- static const int m_unicodeToKeysymLen;
-- static const uint m_unicodeToKeysymKeys[];
-- static const uint m_unicodeToKeysymValues[];
--
-- XkbDescPtr m_xkb;
-- KeySym* m_keysymTable;
-- int m_minKeycode;
-- int m_maxKeycode;
-- int m_keysymPerKeycode;
-- /* dedicated keycode for remapped keys */
-- unsigned int m_remapKeycode;
-- KeySym m_currentRemapKeysym;
-- KeyCode m_modifier_keycode[N_MOD_INDICES];
-- bool m_loaded;
--};
--
--class AutoTypeExecturorX11 : public AutoTypeExecutor
--{
--public:
-- explicit AutoTypeExecturorX11(AutoTypePlatformX11* platform);
--
-- void execChar(AutoTypeChar* action) Q_DECL_OVERRIDE;
-- void execKey(AutoTypeKey* action) Q_DECL_OVERRIDE;
--
--private:
-- AutoTypePlatformX11* const m_platform;
--};
--
--#endif // KEEPASSX_AUTOTYPEX11_H
-diff --git a/src/autotype/x11/CMakeLists.txt b/src/autotype/x11/CMakeLists.txt
-deleted file mode 100644
-index cc401f7..0000000
---- a/src/autotype/x11/CMakeLists.txt
-+++ /dev/null
-@@ -1,17 +0,0 @@
--include_directories(SYSTEM ${X11_X11_INCLUDE_PATH})
--
--set(autotype_X11_SOURCES
-- AutoTypeX11.cpp
--)
--
--set(autotype_X11_MOC
-- AutoTypeX11.h
--)
--
--qt4_wrap_cpp(autotype_X11_SOURCES ${autotype_X11_MOC})
--
--add_library(keepassx-autotype-x11 MODULE ${autotype_X11_SOURCES})
--target_link_libraries(keepassx-autotype-x11 ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${X11_X11_LIB} ${X11_Xi_LIB} ${X11_XTest_LIB})
--install(TARGETS keepassx-autotype-x11
-- BUNDLE DESTINATION . COMPONENT Runtime
-- LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR} COMPONENT Runtime)
-diff --git a/src/autotype/x11/KeySymMap.h b/src/autotype/x11/KeySymMap.h
-deleted file mode 100644
-index 55022fe..0000000
---- a/src/autotype/x11/KeySymMap.h
-+++ /dev/null
-@@ -1,169 +0,0 @@
--/*
-- * Automatically generated by keysymmap.py from parsing keysymdef.h.
-- */
--
--const int AutoTypePlatformX11::m_unicodeToKeysymLen = 632;
--
--const uint AutoTypePlatformX11::m_unicodeToKeysymKeys[] = {
-- 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107,
-- 0x0108, 0x0109, 0x010a, 0x010b, 0x010c, 0x010d, 0x010e, 0x010f,
-- 0x0110, 0x0111, 0x0112, 0x0113, 0x0116, 0x0117, 0x0118, 0x0119,
-- 0x011a, 0x011b, 0x011c, 0x011d, 0x011e, 0x011f, 0x0120, 0x0121,
-- 0x0122, 0x0123, 0x0124, 0x0125, 0x0126, 0x0127, 0x0128, 0x0129,
-- 0x012a, 0x012b, 0x012e, 0x012f, 0x0130, 0x0131, 0x0134, 0x0135,
-- 0x0136, 0x0137, 0x0138, 0x0139, 0x013a, 0x013b, 0x013c, 0x013d,
-- 0x013e, 0x0141, 0x0142, 0x0143, 0x0144, 0x0145, 0x0146, 0x0147,
-- 0x0148, 0x014a, 0x014b, 0x014c, 0x014d, 0x0150, 0x0151, 0x0152,
-- 0x0153, 0x0154, 0x0155, 0x0156, 0x0157, 0x0158, 0x0159, 0x015a,
-- 0x015b, 0x015c, 0x015d, 0x015e, 0x015f, 0x0160, 0x0161, 0x0162,
-- 0x0163, 0x0164, 0x0165, 0x0166, 0x0167, 0x0168, 0x0169, 0x016a,
-- 0x016b, 0x016c, 0x016d, 0x016e, 0x016f, 0x0170, 0x0171, 0x0172,
-- 0x0173, 0x0178, 0x0179, 0x017a, 0x017b, 0x017c, 0x017d, 0x017e,
-- 0x0192, 0x02c7, 0x02d8, 0x02d9, 0x02db, 0x02dd, 0x0385, 0x0386,
-- 0x0388, 0x0389, 0x038a, 0x038c, 0x038e, 0x038f, 0x0390, 0x0391,
-- 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399,
-- 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1,
-- 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa,
-- 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03b0, 0x03b1, 0x03b2,
-- 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba,
-- 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c2,
-- 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca,
-- 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0401, 0x0402, 0x0403, 0x0404,
-- 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a, 0x040b, 0x040c,
-- 0x040e, 0x040f, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415,
-- 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d,
-- 0x041e, 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425,
-- 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d,
-- 0x042e, 0x042f, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435,
-- 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d,
-- 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445,
-- 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d,
-- 0x044e, 0x044f, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456,
-- 0x0457, 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x045e, 0x045f,
-- 0x0490, 0x0491, 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5,
-- 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd,
-- 0x05de, 0x05df, 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5,
-- 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0x060c, 0x061b, 0x061f,
-- 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628,
-- 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, 0x0630,
-- 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638,
-- 0x0639, 0x063a, 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645,
-- 0x0646, 0x0647, 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d,
-- 0x064e, 0x064f, 0x0650, 0x0651, 0x0652, 0x0e01, 0x0e02, 0x0e03,
-- 0x0e04, 0x0e05, 0x0e06, 0x0e07, 0x0e08, 0x0e09, 0x0e0a, 0x0e0b,
-- 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, 0x0e10, 0x0e11, 0x0e12, 0x0e13,
-- 0x0e14, 0x0e15, 0x0e16, 0x0e17, 0x0e18, 0x0e19, 0x0e1a, 0x0e1b,
-- 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, 0x0e20, 0x0e21, 0x0e22, 0x0e23,
-- 0x0e24, 0x0e25, 0x0e26, 0x0e27, 0x0e28, 0x0e29, 0x0e2a, 0x0e2b,
-- 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, 0x0e30, 0x0e31, 0x0e32, 0x0e33,
-- 0x0e34, 0x0e35, 0x0e36, 0x0e37, 0x0e38, 0x0e39, 0x0e3a, 0x0e3f,
-- 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47,
-- 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e50, 0x0e51,
-- 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, 0x0e58, 0x0e59,
-- 0x2002, 0x2003, 0x2004, 0x2005, 0x2007, 0x2008, 0x2009, 0x200a,
-- 0x2012, 0x2013, 0x2014, 0x2015, 0x2017, 0x2018, 0x2019, 0x201a,
-- 0x201c, 0x201d, 0x201e, 0x2020, 0x2021, 0x2025, 0x2026, 0x2030,
-- 0x2032, 0x2033, 0x2038, 0x203e, 0x20ac, 0x2105, 0x2116, 0x2117,
-- 0x211e, 0x2122, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158,
-- 0x2159, 0x215a, 0x215b, 0x215c, 0x215d, 0x215e, 0x2190, 0x2191,
-- 0x2192, 0x2193, 0x21d2, 0x21d4, 0x2202, 0x2207, 0x2218, 0x221a,
-- 0x221d, 0x221e, 0x2227, 0x2228, 0x2229, 0x222a, 0x222b, 0x2234,
-- 0x223c, 0x2243, 0x2260, 0x2261, 0x2264, 0x2265, 0x2282, 0x2283,
-- 0x22a2, 0x22a3, 0x22a4, 0x22a5, 0x2308, 0x230a, 0x2315, 0x2320,
-- 0x2321, 0x2395, 0x239b, 0x239d, 0x239e, 0x23a0, 0x23a1, 0x23a3,
-- 0x23a4, 0x23a6, 0x23a8, 0x23ac, 0x23b7, 0x23ba, 0x23bb, 0x23bc,
-- 0x23bd, 0x2409, 0x240a, 0x240b, 0x240c, 0x240d, 0x2424, 0x2500,
-- 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, 0x252c,
-- 0x2534, 0x253c, 0x2592, 0x25c6, 0x25cb, 0x260e, 0x2640, 0x2642,
-- 0x2663, 0x2665, 0x2666, 0x266d, 0x266f, 0x2713, 0x2717, 0x271d,
-- 0x2720, 0x3001, 0x3002, 0x300c, 0x300d, 0x309b, 0x309c, 0x30a1,
-- 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8, 0x30a9,
-- 0x30aa, 0x30ab, 0x30ad, 0x30af, 0x30b1, 0x30b3, 0x30b5, 0x30b7,
-- 0x30b9, 0x30bb, 0x30bd, 0x30bf, 0x30c1, 0x30c3, 0x30c4, 0x30c6,
-- 0x30c8, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d2,
-- 0x30d5, 0x30d8, 0x30db, 0x30de, 0x30df, 0x30e0, 0x30e1, 0x30e2,
-- 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, 0x30e9, 0x30ea,
-- 0x30eb, 0x30ec, 0x30ed, 0x30ef, 0x30f2, 0x30f3, 0x30fb, 0x30fc
--};
--
--const uint AutoTypePlatformX11::m_unicodeToKeysymValues[] = {
-- 0x03c0, 0x03e0, 0x01c3, 0x01e3, 0x01a1, 0x01b1, 0x01c6, 0x01e6,
-- 0x02c6, 0x02e6, 0x02c5, 0x02e5, 0x01c8, 0x01e8, 0x01cf, 0x01ef,
-- 0x01d0, 0x01f0, 0x03aa, 0x03ba, 0x03cc, 0x03ec, 0x01ca, 0x01ea,
-- 0x01cc, 0x01ec, 0x02d8, 0x02f8, 0x02ab, 0x02bb, 0x02d5, 0x02f5,
-- 0x03ab, 0x03bb, 0x02a6, 0x02b6, 0x02a1, 0x02b1, 0x03a5, 0x03b5,
-- 0x03cf, 0x03ef, 0x03c7, 0x03e7, 0x02a9, 0x02b9, 0x02ac, 0x02bc,
-- 0x03d3, 0x03f3, 0x03a2, 0x01c5, 0x01e5, 0x03a6, 0x03b6, 0x01a5,
-- 0x01b5, 0x01a3, 0x01b3, 0x01d1, 0x01f1, 0x03d1, 0x03f1, 0x01d2,
-- 0x01f2, 0x03bd, 0x03bf, 0x03d2, 0x03f2, 0x01d5, 0x01f5, 0x13bc,
-- 0x13bd, 0x01c0, 0x01e0, 0x03a3, 0x03b3, 0x01d8, 0x01f8, 0x01a6,
-- 0x01b6, 0x02de, 0x02fe, 0x01aa, 0x01ba, 0x01a9, 0x01b9, 0x01de,
-- 0x01fe, 0x01ab, 0x01bb, 0x03ac, 0x03bc, 0x03dd, 0x03fd, 0x03de,
-- 0x03fe, 0x02dd, 0x02fd, 0x01d9, 0x01f9, 0x01db, 0x01fb, 0x03d9,
-- 0x03f9, 0x13be, 0x01ac, 0x01bc, 0x01af, 0x01bf, 0x01ae, 0x01be,
-- 0x08f6, 0x01b7, 0x01a2, 0x01ff, 0x01b2, 0x01bd, 0x07ae, 0x07a1,
-- 0x07a2, 0x07a3, 0x07a4, 0x07a7, 0x07a8, 0x07ab, 0x07b6, 0x07c1,
-- 0x07c2, 0x07c3, 0x07c4, 0x07c5, 0x07c6, 0x07c7, 0x07c8, 0x07c9,
-- 0x07ca, 0x07cb, 0x07cc, 0x07cd, 0x07ce, 0x07cf, 0x07d0, 0x07d1,
-- 0x07d2, 0x07d4, 0x07d5, 0x07d6, 0x07d7, 0x07d8, 0x07d9, 0x07a5,
-- 0x07a9, 0x07b1, 0x07b2, 0x07b3, 0x07b4, 0x07ba, 0x07e1, 0x07e2,
-- 0x07e3, 0x07e4, 0x07e5, 0x07e6, 0x07e7, 0x07e8, 0x07e9, 0x07ea,
-- 0x07eb, 0x07ec, 0x07ed, 0x07ee, 0x07ef, 0x07f0, 0x07f1, 0x07f3,
-- 0x07f2, 0x07f4, 0x07f5, 0x07f6, 0x07f7, 0x07f8, 0x07f9, 0x07b5,
-- 0x07b9, 0x07b7, 0x07b8, 0x07bb, 0x06b3, 0x06b1, 0x06b2, 0x06b4,
-- 0x06b5, 0x06b6, 0x06b7, 0x06b8, 0x06b9, 0x06ba, 0x06bb, 0x06bc,
-- 0x06be, 0x06bf, 0x06e1, 0x06e2, 0x06f7, 0x06e7, 0x06e4, 0x06e5,
-- 0x06f6, 0x06fa, 0x06e9, 0x06ea, 0x06eb, 0x06ec, 0x06ed, 0x06ee,
-- 0x06ef, 0x06f0, 0x06f2, 0x06f3, 0x06f4, 0x06f5, 0x06e6, 0x06e8,
-- 0x06e3, 0x06fe, 0x06fb, 0x06fd, 0x06ff, 0x06f9, 0x06f8, 0x06fc,
-- 0x06e0, 0x06f1, 0x06c1, 0x06c2, 0x06d7, 0x06c7, 0x06c4, 0x06c5,
-- 0x06d6, 0x06da, 0x06c9, 0x06ca, 0x06cb, 0x06cc, 0x06cd, 0x06ce,
-- 0x06cf, 0x06d0, 0x06d2, 0x06d3, 0x06d4, 0x06d5, 0x06c6, 0x06c8,
-- 0x06c3, 0x06de, 0x06db, 0x06dd, 0x06df, 0x06d9, 0x06d8, 0x06dc,
-- 0x06c0, 0x06d1, 0x06a3, 0x06a1, 0x06a2, 0x06a4, 0x06a5, 0x06a6,
-- 0x06a7, 0x06a8, 0x06a9, 0x06aa, 0x06ab, 0x06ac, 0x06ae, 0x06af,
-- 0x06bd, 0x06ad, 0x0ce0, 0x0ce1, 0x0ce2, 0x0ce3, 0x0ce4, 0x0ce5,
-- 0x0ce6, 0x0ce7, 0x0ce8, 0x0ce9, 0x0cea, 0x0ceb, 0x0cec, 0x0ced,
-- 0x0cee, 0x0cef, 0x0cf0, 0x0cf1, 0x0cf2, 0x0cf3, 0x0cf4, 0x0cf5,
-- 0x0cf6, 0x0cf7, 0x0cf8, 0x0cf9, 0x0cfa, 0x05ac, 0x05bb, 0x05bf,
-- 0x05c1, 0x05c2, 0x05c3, 0x05c4, 0x05c5, 0x05c6, 0x05c7, 0x05c8,
-- 0x05c9, 0x05ca, 0x05cb, 0x05cc, 0x05cd, 0x05ce, 0x05cf, 0x05d0,
-- 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8,
-- 0x05d9, 0x05da, 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5,
-- 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0x05eb, 0x05ec, 0x05ed,
-- 0x05ee, 0x05ef, 0x05f0, 0x05f1, 0x05f2, 0x0da1, 0x0da2, 0x0da3,
-- 0x0da4, 0x0da5, 0x0da6, 0x0da7, 0x0da8, 0x0da9, 0x0daa, 0x0dab,
-- 0x0dac, 0x0dad, 0x0dae, 0x0daf, 0x0db0, 0x0db1, 0x0db2, 0x0db3,
-- 0x0db4, 0x0db5, 0x0db6, 0x0db7, 0x0db8, 0x0db9, 0x0dba, 0x0dbb,
-- 0x0dbc, 0x0dbd, 0x0dbe, 0x0dbf, 0x0dc0, 0x0dc1, 0x0dc2, 0x0dc3,
-- 0x0dc4, 0x0dc5, 0x0dc6, 0x0dc7, 0x0dc8, 0x0dc9, 0x0dca, 0x0dcb,
-- 0x0dcc, 0x0dcd, 0x0dce, 0x0dcf, 0x0dd0, 0x0dd1, 0x0dd2, 0x0dd3,
-- 0x0dd4, 0x0dd5, 0x0dd6, 0x0dd7, 0x0dd8, 0x0dd9, 0x0dda, 0x0ddf,
-- 0x0de0, 0x0de1, 0x0de2, 0x0de3, 0x0de4, 0x0de5, 0x0de6, 0x0de7,
-- 0x0de8, 0x0de9, 0x0dea, 0x0deb, 0x0dec, 0x0ded, 0x0df0, 0x0df1,
-- 0x0df2, 0x0df3, 0x0df4, 0x0df5, 0x0df6, 0x0df7, 0x0df8, 0x0df9,
-- 0x0aa2, 0x0aa1, 0x0aa3, 0x0aa4, 0x0aa5, 0x0aa6, 0x0aa7, 0x0aa8,
-- 0x0abb, 0x0aaa, 0x0aa9, 0x07af, 0x0cdf, 0x0ad0, 0x0ad1, 0x0afd,
-- 0x0ad2, 0x0ad3, 0x0afe, 0x0af1, 0x0af2, 0x0aaf, 0x0aae, 0x0ad5,
-- 0x0ad6, 0x0ad7, 0x0afc, 0x047e, 0x20ac, 0x0ab8, 0x06b0, 0x0afb,
-- 0x0ad4, 0x0ac9, 0x0ab0, 0x0ab1, 0x0ab2, 0x0ab3, 0x0ab4, 0x0ab5,
-- 0x0ab6, 0x0ab7, 0x0ac3, 0x0ac4, 0x0ac5, 0x0ac6, 0x08fb, 0x08fc,
-- 0x08fd, 0x08fe, 0x08ce, 0x08cd, 0x08ef, 0x08c5, 0x0bca, 0x08d6,
-- 0x08c1, 0x08c2, 0x08de, 0x08df, 0x08dc, 0x08dd, 0x08bf, 0x08c0,
-- 0x08c8, 0x08c9, 0x08bd, 0x08cf, 0x08bc, 0x08be, 0x08da, 0x08db,
-- 0x0bfc, 0x0bdc, 0x0bc2, 0x0bce, 0x0bd3, 0x0bc4, 0x0afa, 0x08a4,
-- 0x08a5, 0x0bcc, 0x08ab, 0x08ac, 0x08ad, 0x08ae, 0x08a7, 0x08a8,
-- 0x08a9, 0x08aa, 0x08af, 0x08b0, 0x08a1, 0x09ef, 0x09f0, 0x09f2,
-- 0x09f3, 0x09e2, 0x09e5, 0x09e9, 0x09e3, 0x09e4, 0x09e8, 0x09f1,
-- 0x09f8, 0x09ec, 0x09eb, 0x09ed, 0x09ea, 0x09f4, 0x09f5, 0x09f7,
-- 0x09f6, 0x09ee, 0x09e1, 0x09e0, 0x0bcf, 0x0af9, 0x0af8, 0x0af7,
-- 0x0aec, 0x0aee, 0x0aed, 0x0af6, 0x0af5, 0x0af3, 0x0af4, 0x0ad9,
-- 0x0af0, 0x04a4, 0x04a1, 0x04a2, 0x04a3, 0x04de, 0x04df, 0x04a7,
-- 0x04b1, 0x04a8, 0x04b2, 0x04a9, 0x04b3, 0x04aa, 0x04b4, 0x04ab,
-- 0x04b5, 0x04b6, 0x04b7, 0x04b8, 0x04b9, 0x04ba, 0x04bb, 0x04bc,
-- 0x04bd, 0x04be, 0x04bf, 0x04c0, 0x04c1, 0x04af, 0x04c2, 0x04c3,
-- 0x04c4, 0x04c5, 0x04c6, 0x04c7, 0x04c8, 0x04c9, 0x04ca, 0x04cb,
-- 0x04cc, 0x04cd, 0x04ce, 0x04cf, 0x04d0, 0x04d1, 0x04d2, 0x04d3,
-- 0x04ac, 0x04d4, 0x04ad, 0x04d5, 0x04ae, 0x04d6, 0x04d7, 0x04d8,
-- 0x04d9, 0x04da, 0x04db, 0x04dc, 0x04a6, 0x04dd, 0x04a5, 0x04b0
--};
-diff --git a/src/autotype/x11/keysymmap.py b/src/autotype/x11/keysymmap.py
-deleted file mode 100755
-index a359710..0000000
---- a/src/autotype/x11/keysymmap.py
-+++ /dev/null
-@@ -1,107 +0,0 @@
--#!/usr/bin/python3
--
--#
--# Copyright (C) 2013 Felix Geyer <debfx at fobos.de>
--#
--# This program is free software: you can redistribute it and/or modify
--# it under the terms of the GNU General Public License as published by
--# the Free Software Foundation, either version 2 or (at your option)
--# version 3 of the License.
--#
--# This program is distributed in the hope that it will be useful,
--# but WITHOUT ANY WARRANTY; without even the implied warranty of
--# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--# GNU General Public License for more details.
--#
--# You should have received a copy of the GNU General Public License
--# along with this program. If not, see <http://www.gnu.org/licenses/>.
--#
--
--#
--# Parses keysymdef.h to construct a unicode symbol -> keysym mapping table.
--#
--# The lines that are parsed look like this:
--# #define XK_Aogonek 0x01a1 /* U+0104 LATIN CAPITAL LETTER A WITH OGONEK */
--#
--# This would create a 0x0104 -> 0x01a1 mapping.
--#
--
--import sys
--import re
--import collections
--
--cols = 8
--
--if len(sys.argv) >= 2:
-- keysymdef = sys.argv[1]
--else:
-- keysymdef = "/usr/include/X11/keysymdef.h"
--
--keysymMap = {}
--
--f = open(keysymdef, "r")
--for line in f:
-- match = re.search(r'0x([0-9a-fA-F]+)\s+/\* U\+([0-9a-fA-F]+)', line)
-- if match:
-- keysym = int(match.group(1), 16)
-- unicodeVal = int(match.group(2), 16)
--
-- # ignore 1:1 mappings
-- if keysym >= 0x0020 and keysym <= 0x007e:
-- continue
-- if keysym >= 0x00a0 and keysym <= 0x00ff:
-- continue
-- # ignore unicode | 0x01000000 mappings
-- if keysym >= 0x1000000:
-- continue
--
-- keysymMap[unicodeVal] = keysym
--
--keysymMap = collections.OrderedDict(sorted(keysymMap.items(), key=lambda t: t[0]))
--
--print("""/*
-- * Automatically generated by keysymmap.py from parsing keysymdef.h.
-- */
--""")
--
--print("const int AutoTypePlatformX11::m_unicodeToKeysymLen = " + str(len(keysymMap)) + ";")
--
--print()
--
--print("const uint AutoTypePlatformX11::m_unicodeToKeysymKeys[] = {")
--keys = keysymMap.keys()
--keyLen = len(keys)
--i = 1
--for val in keys:
-- hexVal = "{0:#0{1}x}".format(val, 6)
--
-- if i == keyLen:
-- print(hexVal)
-- elif (i % cols) == 0:
-- print(hexVal + ",")
-- elif ((i - 1) % cols) == 0:
-- print(" " + hexVal + ", ", end="")
-- else:
-- print(hexVal + ", ", end="")
-- i += 1
--print("};")
--
--print()
--
--print("const uint AutoTypePlatformX11::m_unicodeToKeysymValues[] = {")
--values = keysymMap.values()
--valuesLen = len(values)
--i = 1
--for val in values:
-- hexVal = "{0:#0{1}x}".format(val, 6)
--
-- if i == valuesLen:
-- print(hexVal)
-- elif (i % cols) == 0:
-- print(hexVal + ",")
-- elif ((i - 1) % cols) == 0:
-- print(" " + hexVal + ", ", end="")
-- else:
-- print(hexVal + ", ", end="")
-- i += 1
--print("};")
-diff --git a/src/autotype/xcb/AutoTypeXCB.cpp b/src/autotype/xcb/AutoTypeXCB.cpp
-new file mode 100644
-index 0000000..40acaf6
---- /dev/null
-+++ b/src/autotype/xcb/AutoTypeXCB.cpp
-@@ -0,0 +1,870 @@
-+/*
-+ * Copyright (C) 2012 Felix Geyer <debfx at fobos.de>
-+ * Copyright (C) 2000-2008 Tom Sato <VEF00200 at nifty.ne.jp>
-+ *
-+ * This program is free software: you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation, either version 2 or (at your option)
-+ * version 3 of the License.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
-+ */
-+
-+#include "AutoTypeXCB.h"
-+#include "KeySymMap.h"
-+#include "core/Tools.h"
-+
-+#include <time.h>
-+#include <xcb/xcb.h>
-+
-+bool AutoTypePlatformX11::m_catchXErrors = false;
-+bool AutoTypePlatformX11::m_xErrorOccured = false;
-+int (*AutoTypePlatformX11::m_oldXErrorHandler)(Display*, XErrorEvent*) = nullptr;
-+
-+AutoTypePlatformX11::AutoTypePlatformX11()
-+{
-+ m_dpy = QX11Info::display();
-+ m_rootWindow = QX11Info::appRootWindow();
-+
-+ m_atomWmState = XInternAtom(m_dpy, "WM_STATE", True);
-+ m_atomWmName = XInternAtom(m_dpy, "WM_NAME", True);
-+ m_atomNetWmName = XInternAtom(m_dpy, "_NET_WM_NAME", True);
-+ m_atomString = XInternAtom(m_dpy, "STRING", True);
-+ m_atomUtf8String = XInternAtom(m_dpy, "UTF8_STRING", True);
-+ m_atomNetActiveWindow = XInternAtom(m_dpy, "_NET_ACTIVE_WINDOW", True);
-+
-+ m_classBlacklist << "desktop_window" << "gnome-panel"; // Gnome
-+ m_classBlacklist << "kdesktop" << "kicker"; // KDE 3
-+ m_classBlacklist << "Plasma"; // KDE 4
-+ m_classBlacklist << "plasmashell"; // KDE 5
-+ m_classBlacklist << "xfdesktop" << "xfce4-panel"; // Xfce 4
-+
-+ m_currentGlobalKey = static_cast<Qt::Key>(0);
-+ m_currentGlobalModifiers = 0;
-+
-+ m_keysymTable = nullptr;
-+ m_xkb = nullptr;
-+ m_remapKeycode = 0;
-+ m_currentRemapKeysym = NoSymbol;
-+ m_modifierMask = ControlMask | ShiftMask | Mod1Mask | Mod4Mask;
-+
-+ m_loaded = true;
-+
-+ updateKeymap();
-+}
-+
-+bool AutoTypePlatformX11::isAvailable()
-+{
-+ int ignore;
-+
-+ if (!XQueryExtension(m_dpy, "XInputExtension", &ignore, &ignore, &ignore)) {
-+ return false;
-+ }
-+
-+ if (!XQueryExtension(m_dpy, "XTEST", &ignore, &ignore, &ignore)) {
-+ return false;
-+ }
-+
-+ if (!m_xkb) {
-+ XkbDescPtr kbd = getKeyboard();
-+
-+ if (!kbd) {
-+ return false;
-+ }
-+
-+ XkbFreeKeyboard(kbd, XkbAllComponentsMask, True);
-+ }
-+
-+ return true;
-+}
-+
-+void AutoTypePlatformX11::unload()
-+{
-+ // Restore the KeyboardMapping to its original state.
-+ if (m_currentRemapKeysym != NoSymbol) {
-+ AddKeysym(NoSymbol);
-+ }
-+
-+ if (m_keysymTable) {
-+ XFree(m_keysymTable);
-+ }
-+
-+ if (m_xkb) {
-+ XkbFreeKeyboard(m_xkb, XkbAllComponentsMask, True);
-+ }
-+
-+ m_loaded = false;
-+}
-+
-+QStringList AutoTypePlatformX11::windowTitles()
-+{
-+ return windowTitlesRecursive(m_rootWindow);
-+}
-+
-+WId AutoTypePlatformX11::activeWindow()
-+{
-+ Window window;
-+ int revert_to_return;
-+ XGetInputFocus(m_dpy, &window, &revert_to_return);
-+
-+ int tree;
-+ do {
-+ if (isTopLevelWindow(window)) {
-+ break;
-+ }
-+
-+ Window root;
-+ Window parent;
-+ Window* children = nullptr;
-+ unsigned int numChildren;
-+ tree = XQueryTree(m_dpy, window, &root, &parent, &children, &numChildren);
-+ window = parent;
-+ if (children) {
-+ XFree(children);
-+ }
-+ } while (tree && window);
-+
-+ return window;
-+}
-+
-+QString AutoTypePlatformX11::activeWindowTitle()
-+{
-+ return windowTitle(activeWindow(), true);
-+}
-+
-+bool AutoTypePlatformX11::registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers)
-+{
-+ int keycode = XKeysymToKeycode(m_dpy, charToKeySym(key));
-+ uint nativeModifiers = qtToNativeModifiers(modifiers);
-+
-+ startCatchXErrors();
-+ XGrabKey(m_dpy, keycode, nativeModifiers, m_rootWindow, True, GrabModeAsync, GrabModeAsync);
-+ XGrabKey(m_dpy, keycode, nativeModifiers | Mod2Mask, m_rootWindow, True, GrabModeAsync,
-+ GrabModeAsync);
-+ XGrabKey(m_dpy, keycode, nativeModifiers | LockMask, m_rootWindow, True, GrabModeAsync,
-+ GrabModeAsync);
-+ XGrabKey(m_dpy, keycode, nativeModifiers | Mod2Mask | LockMask, m_rootWindow, True,
-+ GrabModeAsync, GrabModeAsync);
-+ stopCatchXErrors();
-+
-+ if (!m_xErrorOccured) {
-+ m_currentGlobalKey = key;
-+ m_currentGlobalModifiers = modifiers;
-+ m_currentGlobalKeycode = keycode;
-+ m_currentGlobalNativeModifiers = nativeModifiers;
-+ return true;
-+ }
-+ else {
-+ unregisterGlobalShortcut(key, modifiers);
-+ return false;
-+ }
-+}
-+
-+uint AutoTypePlatformX11::qtToNativeModifiers(Qt::KeyboardModifiers modifiers)
-+{
-+ uint nativeModifiers = 0;
-+
-+ if (modifiers & Qt::ShiftModifier) {
-+ nativeModifiers |= ShiftMask;
-+ }
-+ if (modifiers & Qt::ControlModifier) {
-+ nativeModifiers |= ControlMask;
-+ }
-+ if (modifiers & Qt::AltModifier) {
-+ nativeModifiers |= Mod1Mask;
-+ }
-+ if (modifiers & Qt::MetaModifier) {
-+ nativeModifiers |= Mod4Mask;
-+ }
-+
-+ return nativeModifiers;
-+}
-+
-+void AutoTypePlatformX11::unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers)
-+{
-+ KeyCode keycode = XKeysymToKeycode(m_dpy, charToKeySym(key));
-+ uint nativeModifiers = qtToNativeModifiers(modifiers);
-+
-+ XUngrabKey(m_dpy, keycode, nativeModifiers, m_rootWindow);
-+ XUngrabKey(m_dpy, keycode, nativeModifiers | Mod2Mask, m_rootWindow);
-+ XUngrabKey(m_dpy, keycode, nativeModifiers | LockMask, m_rootWindow);
-+ XUngrabKey(m_dpy, keycode, nativeModifiers | Mod2Mask | LockMask, m_rootWindow);
-+
-+ m_currentGlobalKey = static_cast<Qt::Key>(0);
-+ m_currentGlobalModifiers = 0;
-+ m_currentGlobalKeycode = 0;
-+ m_currentGlobalNativeModifiers = 0;
-+}
-+
-+int AutoTypePlatformX11::platformEventFilter(void* event)
-+{
-+ xcb_generic_event_t* genericEvent = static_cast<xcb_generic_event_t*>(event);
-+ quint8 type = genericEvent->response_type & 0x7f;
-+
-+ if (type == XCB_KEY_PRESS || type == XCB_KEY_RELEASE) {
-+ xcb_key_press_event_t* keyPressEvent = static_cast<xcb_key_press_event_t*>(event);
-+ if (keyPressEvent->detail == m_currentGlobalKeycode
-+ && (keyPressEvent->state & m_modifierMask) == m_currentGlobalNativeModifiers
-+ && (!QApplication::activeWindow() || QApplication::activeWindow()->isMinimized())
-+ && m_loaded) {
-+ if (type == XCB_KEY_PRESS) {
-+ Q_EMIT globalShortcutTriggered();
-+ }
-+
-+ return 1;
-+ }
-+ }
-+ else if (type == XCB_MAPPING_NOTIFY) {
-+ xcb_mapping_notify_event_t* mappingNotifyEvent = static_cast<xcb_mapping_notify_event_t*>(event);
-+ if (mappingNotifyEvent->request == XCB_MAPPING_KEYBOARD
-+ || mappingNotifyEvent->request == XCB_MAPPING_MODIFIER)
-+ {
-+ XMappingEvent xMappingEvent;
-+ memset(&xMappingEvent, 0, sizeof(xMappingEvent));
-+ xMappingEvent.type = MappingNotify;
-+ xMappingEvent.display = m_dpy;
-+ if (mappingNotifyEvent->request == XCB_MAPPING_KEYBOARD) {
-+ xMappingEvent.request = MappingKeyboard;
-+ }
-+ else {
-+ xMappingEvent.request = MappingModifier;
-+ }
-+ xMappingEvent.first_keycode = mappingNotifyEvent->first_keycode;
-+ xMappingEvent.count = mappingNotifyEvent->count;
-+ XRefreshKeyboardMapping(&xMappingEvent);
-+ updateKeymap();
-+ }
-+ }
-+
-+ return -1;
-+}
-+
-+AutoTypeExecutor* AutoTypePlatformX11::createExecutor()
-+{
-+ return new AutoTypeExecturorX11(this);
-+}
-+
-+QString AutoTypePlatformX11::windowTitle(Window window, bool useBlacklist)
-+{
-+ QString title;
-+
-+ Atom type;
-+ int format;
-+ unsigned long nitems;
-+ unsigned long after;
-+ unsigned char* data = nullptr;
-+
-+ // the window manager spec says we should read _NET_WM_NAME first, then fall back to WM_NAME
-+
-+ int retVal = XGetWindowProperty(m_dpy, window, m_atomNetWmName, 0, 1000, False, m_atomUtf8String,
-+ &type, &format, &nitems, &after, &data);
-+
-+ if ((retVal == 0) && data) {
-+ title = QString::fromUtf8(reinterpret_cast<char*>(data));
-+ }
-+ else {
-+ XTextProperty textProp;
-+ retVal = XGetTextProperty(m_dpy, window, &textProp, m_atomWmName);
-+ if ((retVal != 0) && textProp.value) {
-+ char** textList = nullptr;
-+ int count;
-+
-+ if (textProp.encoding == m_atomUtf8String) {
-+ title = QString::fromUtf8(reinterpret_cast<char*>(textProp.value));
-+ }
-+ else if ((XmbTextPropertyToTextList(m_dpy, &textProp, &textList, &count) == 0)
-+ && textList && (count > 0)) {
-+ title = QString::fromLocal8Bit(textList[0]);
-+ }
-+ else if (textProp.encoding == m_atomString) {
-+ title = QString::fromLocal8Bit(reinterpret_cast<char*>(textProp.value));
-+ }
-+
-+ if (textList) {
-+ XFreeStringList(textList);
-+ }
-+ }
-+
-+ if (textProp.value) {
-+ XFree(textProp.value);
-+ }
-+ }
-+
-+ if (data) {
-+ XFree(data);
-+ }
-+
-+ if (useBlacklist && !title.isEmpty()) {
-+ if (window == m_rootWindow) {
-+ return QString();
-+ }
-+
-+ QString className = windowClassName(window);
-+ if (m_classBlacklist.contains(className)) {
-+ return QString();
-+ }
-+
-+ QList<Window> keepassxWindows = widgetsToX11Windows(QApplication::topLevelWidgets());
-+ if (keepassxWindows.contains(window)) {
-+ return QString();
-+ }
-+ }
-+
-+ return title;
-+}
-+
-+QString AutoTypePlatformX11::windowClassName(Window window)
-+{
-+ QString className;
-+
-+ XClassHint wmClass;
-+ wmClass.res_name = nullptr;
-+ wmClass.res_class = nullptr;
-+
-+ if (XGetClassHint(m_dpy, window, &wmClass) && wmClass.res_name) {
-+ className = QString::fromLocal8Bit(wmClass.res_name);
-+ }
-+ if (wmClass.res_name) {
-+ XFree(wmClass.res_name);
-+ }
-+ if (wmClass.res_class) {
-+ XFree(wmClass.res_class);
-+ }
-+
-+ return className;
-+}
-+
-+QList<Window> AutoTypePlatformX11::widgetsToX11Windows(const QWidgetList& widgetList)
-+{
-+ QList<Window> windows;
-+
-+ Q_FOREACH (const QWidget* widget, widgetList) {
-+ windows.append(widget->effectiveWinId());
-+ }
-+
-+ return windows;
-+}
-+
-+QStringList AutoTypePlatformX11::windowTitlesRecursive(Window window)
-+{
-+ QStringList titles;
-+
-+ if (isTopLevelWindow(window)) {
-+ QString title = windowTitle(window, true);
-+ if (!title.isEmpty()) {
-+ titles.append(title);
-+ }
-+ }
-+
-+ Window root;
-+ Window parent;
-+ Window* children = nullptr;
-+ unsigned int numChildren;
-+ if (XQueryTree(m_dpy, window, &root, &parent, &children, &numChildren) && children) {
-+ for (uint i = 0; i < numChildren; i++) {
-+ titles.append(windowTitlesRecursive(children[i]));
-+ }
-+ }
-+ if (children) {
-+ XFree(children);
-+ }
-+
-+ return titles;
-+}
-+
-+bool AutoTypePlatformX11::isTopLevelWindow(Window window)
-+{
-+ Atom type = None;
-+ int format;
-+ unsigned long nitems;
-+ unsigned long after;
-+ unsigned char* data = nullptr;
-+ int retVal = XGetWindowProperty(m_dpy, window, m_atomWmState, 0, 0, False, AnyPropertyType, &type, &format,
-+ &nitems, &after, &data);
-+ if (data) {
-+ XFree(data);
-+ }
-+
-+ return (retVal == 0) && type;
-+}
-+
-+KeySym AutoTypePlatformX11::charToKeySym(const QChar& ch)
-+{
-+ ushort unicode = ch.unicode();
-+
-+ /* first check for Latin-1 characters (1:1 mapping) */
-+ if ((unicode >= 0x0020 && unicode <= 0x007e)
-+ || (unicode >= 0x00a0 && unicode <= 0x00ff)) {
-+ return unicode;
-+ }
-+
-+ /* mapping table generated from keysymdef.h */
-+ const uint* match = Tools::binaryFind(m_unicodeToKeysymKeys,
-+ m_unicodeToKeysymKeys + m_unicodeToKeysymLen,
-+ unicode);
-+ int index = match - m_unicodeToKeysymKeys;
-+ if (index != m_unicodeToKeysymLen) {
-+ return m_unicodeToKeysymValues[index];
-+ }
-+
-+ if (unicode >= 0x0100) {
-+ return unicode | 0x01000000;
-+ }
-+
-+ return NoSymbol;
-+}
-+
-+KeySym AutoTypePlatformX11::keyToKeySym(Qt::Key key)
-+{
-+ switch (key) {
-+ case Qt::Key_Tab:
-+ return XK_Tab;
-+ case Qt::Key_Enter:
-+ return XK_Return;
-+ case Qt::Key_Up:
-+ return XK_Up;
-+ case Qt::Key_Down:
-+ return XK_Down;
-+ case Qt::Key_Left:
-+ return XK_Left;
-+ case Qt::Key_Right:
-+ return XK_Right;
-+ case Qt::Key_Insert:
-+ return XK_Insert;
-+ case Qt::Key_Delete:
-+ return XK_Delete;
-+ case Qt::Key_Home:
-+ return XK_Home;
-+ case Qt::Key_End:
-+ return XK_End;
-+ case Qt::Key_PageUp:
-+ return XK_Page_Up;
-+ case Qt::Key_PageDown:
-+ return XK_Page_Down;
-+ case Qt::Key_Backspace:
-+ return XK_BackSpace;
-+ case Qt::Key_Pause:
-+ return XK_Break;
-+ case Qt::Key_CapsLock:
-+ return XK_Caps_Lock;
-+ case Qt::Key_Escape:
-+ return XK_Escape;
-+ case Qt::Key_Help:
-+ return XK_Help;
-+ case Qt::Key_NumLock:
-+ return XK_Num_Lock;
-+ case Qt::Key_Print:
-+ return XK_Print;
-+ case Qt::Key_ScrollLock:
-+ return XK_Scroll_Lock;
-+ default:
-+ if (key >= Qt::Key_F1 && key <= Qt::Key_F16) {
-+ return XK_F1 + (key - Qt::Key_F1);
-+ }
-+ else {
-+ return NoSymbol;
-+ }
-+ }
-+}
-+
-+/*
-+ * Update the keyboard and modifier mapping.
-+ * We need the KeyboardMapping for AddKeysym.
-+ * Modifier mapping is required for clearing the modifiers.
-+ */
-+void AutoTypePlatformX11::updateKeymap()
-+{
-+ int keycode, inx;
-+ int mod_index, mod_key;
-+ XModifierKeymap *modifiers;
-+
-+ if (m_xkb) {
-+ XkbFreeKeyboard(m_xkb, XkbAllComponentsMask, True);
-+ }
-+ m_xkb = getKeyboard();
-+
-+ XDisplayKeycodes(m_dpy, &m_minKeycode, &m_maxKeycode);
-+ if (m_keysymTable != NULL) XFree(m_keysymTable);
-+ m_keysymTable = XGetKeyboardMapping(m_dpy,
-+ m_minKeycode, m_maxKeycode - m_minKeycode + 1,
-+ &m_keysymPerKeycode);
-+
-+ /* determine the keycode to use for remapped keys */
-+ inx = (m_remapKeycode - m_minKeycode) * m_keysymPerKeycode;
-+ if (m_remapKeycode == 0 || !isRemapKeycodeValid()) {
-+ for (keycode = m_minKeycode; keycode <= m_maxKeycode; keycode++) {
-+ inx = (keycode - m_minKeycode) * m_keysymPerKeycode;
-+ if (m_keysymTable[inx] == NoSymbol) {
-+ m_remapKeycode = keycode;
-+ m_currentRemapKeysym = NoSymbol;
-+ break;
-+ }
-+ }
-+ }
-+
-+ /* determine the keycode to use for modifiers */
-+ modifiers = XGetModifierMapping(m_dpy);
-+ for (mod_index = ShiftMapIndex; mod_index <= Mod5MapIndex; mod_index ++) {
-+ m_modifier_keycode[mod_index] = 0;
-+ for (mod_key = 0; mod_key < modifiers->max_keypermod; mod_key++) {
-+ keycode = modifiers->modifiermap[mod_index * modifiers->max_keypermod + mod_key];
-+ if (keycode) {
-+ m_modifier_keycode[mod_index] = keycode;
-+ break;
-+ }
-+ }
-+ }
-+ XFreeModifiermap(modifiers);
-+
-+ /* Xlib needs some time until the mapping is distributed to
-+ all clients */
-+ // TODO: we should probably only sleep while in the middle of typing something
-+ timespec ts;
-+ ts.tv_sec = 0;
-+ ts.tv_nsec = 30 * 1000 * 1000;
-+ nanosleep(&ts, nullptr);
-+}
-+
-+bool AutoTypePlatformX11::isRemapKeycodeValid()
-+{
-+ int baseKeycode = (m_remapKeycode - m_minKeycode) * m_keysymPerKeycode;
-+ for (int i = 0; i < m_keysymPerKeycode; i++) {
-+ if (m_keysymTable[baseKeycode + i] == m_currentRemapKeysym) {
-+ return true;
-+ }
-+ }
-+
-+ return false;
-+}
-+
-+void AutoTypePlatformX11::startCatchXErrors()
-+{
-+ Q_ASSERT(!m_catchXErrors);
-+
-+ m_catchXErrors = true;
-+ m_xErrorOccured = false;
-+ m_oldXErrorHandler = XSetErrorHandler(x11ErrorHandler);
-+}
-+
-+void AutoTypePlatformX11::stopCatchXErrors()
-+{
-+ Q_ASSERT(m_catchXErrors);
-+
-+ XSync(m_dpy, False);
-+ XSetErrorHandler(m_oldXErrorHandler);
-+ m_catchXErrors = false;
-+}
-+
-+int AutoTypePlatformX11::x11ErrorHandler(Display* display, XErrorEvent* error)
-+{
-+ Q_UNUSED(display)
-+ Q_UNUSED(error)
-+
-+ if (m_catchXErrors) {
-+ m_xErrorOccured = true;
-+ }
-+
-+ return 1;
-+}
-+
-+XkbDescPtr AutoTypePlatformX11::getKeyboard()
-+{
-+ int num_devices;
-+ XID keyboard_id = XkbUseCoreKbd;
-+ XDeviceInfo* devices = XListInputDevices(m_dpy, &num_devices);
-+ if (!devices) {
-+ return nullptr;
-+ }
-+
-+ for (int i = 0; i < num_devices; i++) {
-+ if (QString(devices[i].name) == "Virtual core XTEST keyboard") {
-+ keyboard_id = devices[i].id;
-+ break;
-+ }
-+ }
-+
-+ XFreeDeviceList(devices);
-+
-+ return XkbGetKeyboard(m_dpy, XkbCompatMapMask | XkbGeometryMask, keyboard_id);
-+}
-+
-+// --------------------------------------------------------------------------
-+// The following code is taken from xvkbd 3.0 and has been slightly modified.
-+// --------------------------------------------------------------------------
-+
-+/*
-+ * Insert a specified keysym on the dedicated position in the keymap
-+ * table.
-+ */
-+int AutoTypePlatformX11::AddKeysym(KeySym keysym)
-+{
-+ if (m_remapKeycode == 0) {
-+ return 0;
-+ }
-+
-+ int inx = (m_remapKeycode- m_minKeycode) * m_keysymPerKeycode;
-+ m_keysymTable[inx] = keysym;
-+ m_currentRemapKeysym = keysym;
-+
-+ XChangeKeyboardMapping(m_dpy, m_remapKeycode, m_keysymPerKeycode, &m_keysymTable[inx], 1);
-+ XFlush(m_dpy);
-+ updateKeymap();
-+
-+ return m_remapKeycode;
-+}
-+
-+/*
-+ * Send event to the focused window.
-+ * If input focus is specified explicitly, select the window
-+ * before send event to the window.
-+ */
-+void AutoTypePlatformX11::SendEvent(XKeyEvent* event, int event_type)
-+{
-+ XSync(event->display, False);
-+ int (*oldHandler) (Display*, XErrorEvent*) = XSetErrorHandler(MyErrorHandler);
-+
-+ event->type = event_type;
-+ Bool press;
-+ if (event->type == KeyPress) {
-+ press = True;
-+ }
-+ else {
-+ press = False;
-+ }
-+ XTestFakeKeyEvent(event->display, event->keycode, press, 0);
-+ XFlush(event->display);
-+
-+ XSetErrorHandler(oldHandler);
-+}
-+
-+/*
-+ * Send a modifier press/release event for all modifiers
-+ * which are set in the mask variable.
-+ */
-+void AutoTypePlatformX11::SendModifier(XKeyEvent *event, unsigned int mask, int event_type)
-+{
-+ int mod_index;
-+ for (mod_index = ShiftMapIndex; mod_index <= Mod5MapIndex; mod_index ++) {
-+ if (mask & (1 << mod_index)) {
-+ event->keycode = m_modifier_keycode[mod_index];
-+ SendEvent(event, event_type);
-+ if (event_type == KeyPress)
-+ event->state |= (1 << mod_index);
-+ else
-+ event->state &= (1 << mod_index);
-+ }
-+ }
-+}
-+
-+/*
-+ * Determines the keycode and modifier mask for the given
-+ * keysym.
-+ */
-+int AutoTypePlatformX11::GetKeycode(KeySym keysym, unsigned int *mask)
-+{
-+ int keycode = XKeysymToKeycode(m_dpy, keysym);
-+
-+ if (keycode && keysymModifiers(keysym, keycode, mask)) {
-+ return keycode;
-+ }
-+
-+ /* no modifier matches => resort to remapping */
-+ keycode = AddKeysym(keysym);
-+ if (keycode && keysymModifiers(keysym, keycode, mask)) {
-+ return keycode;
-+ }
-+
-+ *mask = 0;
-+ return 0;
-+}
-+
-+bool AutoTypePlatformX11::keysymModifiers(KeySym keysym, int keycode, unsigned int *mask)
-+{
-+ int shift, mod;
-+ unsigned int mods_rtrn;
-+
-+ /* determine whether there is a combination of the modifiers
-+ (Mod1-Mod5) with or without shift which returns keysym */
-+ for (shift = 0; shift < 2; shift ++) {
-+ for (mod = ControlMapIndex; mod <= Mod5MapIndex; mod ++) {
-+ KeySym keysym_rtrn;
-+ *mask = (mod == ControlMapIndex) ? shift : shift | (1 << mod);
-+ XkbTranslateKeyCode(m_xkb, keycode, *mask, &mods_rtrn, &keysym_rtrn);
-+ if (keysym_rtrn == keysym) {
-+ return true;
-+ }
-+ }
-+ }
-+
-+ return false;
-+}
-+
-+
-+
-+/*
-+ * Send sequence of KeyPressed/KeyReleased events to the focused
-+ * window to simulate keyboard. If modifiers (shift, control, etc)
-+ * are set ON, many events will be sent.
-+ */
-+void AutoTypePlatformX11::SendKeyPressedEvent(KeySym keysym)
-+{
-+ Window cur_focus;
-+ int revert_to;
-+ XKeyEvent event;
-+ int keycode;
-+
-+ if (keysym == NoSymbol) {
-+ qWarning("No such key: keysym=0x%lX", keysym);
-+ return;
-+ }
-+
-+ XGetInputFocus(m_dpy, &cur_focus, &revert_to);
-+
-+ event.display = m_dpy;
-+ event.window = cur_focus;
-+ event.root = m_rootWindow;
-+ event.subwindow = None;
-+ event.time = CurrentTime;
-+ event.x = 1;
-+ event.y = 1;
-+ event.x_root = 1;
-+ event.y_root = 1;
-+ event.same_screen = True;
-+
-+ Window root, child;
-+ int root_x, root_y, x, y;
-+ unsigned int wanted_mask = 0;
-+ unsigned int original_mask;
-+
-+ XQueryPointer(m_dpy, event.root, &root, &child, &root_x, &root_y, &x, &y, &original_mask);
-+
-+ /* determine keycode and mask for the given keysym */
-+ keycode = GetKeycode(keysym, &wanted_mask);
-+ if (keycode < 8 || keycode > 255) {
-+ qWarning("Unable to get valid keycode for key: keysym=0x%lX", keysym);
-+ return;
-+ }
-+
-+ event.state = original_mask;
-+
-+ // modifiers that need to be pressed but aren't
-+ unsigned int press_mask = wanted_mask & ~original_mask;
-+
-+ // modifiers that are pressed but maybe shouldn't
-+ unsigned int release_check_mask = original_mask & ~wanted_mask;
-+
-+ // modifiers we need to release before sending the keycode
-+ unsigned int release_mask = 0;
-+
-+ // check every release_check_mask individually if it affects the keysym we would generate
-+ // if it doesn't we probably don't need to release it
-+ for (int mod_index = ShiftMapIndex; mod_index <= Mod5MapIndex; mod_index ++) {
-+ if (release_check_mask & (1 << mod_index)) {
-+ unsigned int mods_rtrn;
-+ KeySym keysym_rtrn;
-+ XkbTranslateKeyCode(m_xkb, keycode, wanted_mask | (1 << mod_index), &mods_rtrn, &keysym_rtrn);
-+
-+ if (keysym_rtrn != keysym) {
-+ release_mask |= (1 << mod_index);
-+ }
-+ }
-+ }
-+
-+ // finally check if the combination of pressed modifiers that we chose to ignore affects the keysym
-+ unsigned int mods_rtrn;
-+ KeySym keysym_rtrn;
-+ XkbTranslateKeyCode(m_xkb, keycode, wanted_mask | (release_check_mask & ~release_mask), &mods_rtrn, &keysym_rtrn);
-+ if (keysym_rtrn != keysym) {
-+ // oh well, release all the modifiers we don't want
-+ release_mask = release_check_mask;
-+ }
-+
-+ /* release all modifiers */
-+ SendModifier(&event, release_mask, KeyRelease);
-+
-+ SendModifier(&event, press_mask, KeyPress);
-+
-+ /* press and release key */
-+ event.keycode = keycode;
-+ SendEvent(&event, KeyPress);
-+ SendEvent(&event, KeyRelease);
-+
-+ /* release the modifiers */
-+ SendModifier(&event, press_mask, KeyRelease);
-+
-+ /* restore the old keyboard mask */
-+ SendModifier(&event, release_mask, KeyPress);
-+}
-+
-+int AutoTypePlatformX11::MyErrorHandler(Display* my_dpy, XErrorEvent* event)
-+{
-+ char msg[200];
-+
-+ if (event->error_code == BadWindow) {
-+ return 0;
-+ }
-+ XGetErrorText(my_dpy, event->error_code, msg, sizeof(msg) - 1);
-+ qWarning("X error trapped: %s, request-code=%d\n", msg, event->request_code);
-+ return 0;
-+}
-+
-+
-+AutoTypeExecturorX11::AutoTypeExecturorX11(AutoTypePlatformX11* platform)
-+ : m_platform(platform)
-+{
-+}
-+
-+void AutoTypeExecturorX11::execChar(AutoTypeChar* action)
-+{
-+ m_platform->SendKeyPressedEvent(m_platform->charToKeySym(action->character));
-+}
-+
-+void AutoTypeExecturorX11::execKey(AutoTypeKey* action)
-+{
-+ m_platform->SendKeyPressedEvent(m_platform->keyToKeySym(action->key));
-+}
-+
-+int AutoTypePlatformX11::initialTimeout()
-+{
-+ return 500;
-+}
-+
-+bool AutoTypePlatformX11::raiseWindow(WId window)
-+{
-+ if (m_atomNetActiveWindow == None) {
-+ return false;
-+ }
-+
-+ XRaiseWindow(m_dpy, window);
-+
-+ XEvent event;
-+ event.xclient.type = ClientMessage;
-+ event.xclient.serial = 0;
-+ event.xclient.send_event = True;
-+ event.xclient.window = window;
-+ event.xclient.message_type = m_atomNetActiveWindow;
-+ event.xclient.format = 32;
-+ event.xclient.data.l[0] = 1; // FromApplication
-+ event.xclient.data.l[1] = QX11Info::appUserTime();
-+ QWidget* activeWindow = QApplication::activeWindow();
-+ if (activeWindow) {
-+ event.xclient.data.l[2] = activeWindow->internalWinId();
-+ }
-+ else {
-+ event.xclient.data.l[2] = 0;
-+ }
-+ event.xclient.data.l[3] = 0;
-+ event.xclient.data.l[4] = 0;
-+ XSendEvent(m_dpy, m_rootWindow, False,
-+ SubstructureRedirectMask | SubstructureNotifyMask,
-+ &event);
-+ XFlush(m_dpy);
-+
-+ return true;
-+}
-diff --git a/src/autotype/xcb/AutoTypeXCB.h b/src/autotype/xcb/AutoTypeXCB.h
-new file mode 100644
-index 0000000..8adee77
---- /dev/null
-+++ b/src/autotype/xcb/AutoTypeXCB.h
-@@ -0,0 +1,134 @@
-+/*
-+ * Copyright (C) 2012 Felix Geyer <debfx at fobos.de>
-+ * Copyright (C) 2000-2008 Tom Sato <VEF00200 at nifty.ne.jp>
-+ *
-+ * This program is free software: you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation, either version 2 or (at your option)
-+ * version 3 of the License.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
-+ */
-+
-+#ifndef KEEPASSX_AUTOTYPEXCB_H
-+#define KEEPASSX_AUTOTYPEXCB_H
-+
-+#include <QApplication>
-+#include <QSet>
-+#include <QtPlugin>
-+#include <QWidget>
-+#include <QX11Info>
-+
-+#include <X11/Xutil.h>
-+#include <X11/extensions/XTest.h>
-+#include <X11/XKBlib.h>
-+
-+#include "autotype/AutoTypePlatformPlugin.h"
-+#include "autotype/AutoTypeAction.h"
-+
-+#define N_MOD_INDICES (Mod5MapIndex + 1)
-+
-+class AutoTypePlatformX11 : public QObject, public AutoTypePlatformInterface
-+{
-+ Q_OBJECT
-+ Q_PLUGIN_METADATA(IID "org.keepassx.AutoTypePlatformX11")
-+ Q_INTERFACES(AutoTypePlatformInterface)
-+
-+public:
-+ AutoTypePlatformX11();
-+ bool isAvailable() override;
-+ void unload() override;
-+ QStringList windowTitles() override;
-+ WId activeWindow() override;
-+ QString activeWindowTitle() override;
-+ bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) override;
-+ void unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) override;
-+ int platformEventFilter(void* event) override;
-+ int initialTimeout() override;
-+ bool raiseWindow(WId window) override;
-+ AutoTypeExecutor* createExecutor() override;
-+
-+ KeySym charToKeySym(const QChar& ch);
-+ KeySym keyToKeySym(Qt::Key key);
-+
-+ void SendKeyPressedEvent(KeySym keysym);
-+
-+Q_SIGNALS:
-+ void globalShortcutTriggered();
-+
-+private:
-+ QString windowTitle(Window window, bool useBlacklist);
-+ QStringList windowTitlesRecursive(Window window);
-+ QString windowClassName(Window window);
-+ QList<Window> widgetsToX11Windows(const QWidgetList& widgetList);
-+ bool isTopLevelWindow(Window window);
-+ uint qtToNativeModifiers(Qt::KeyboardModifiers modifiers);
-+ void startCatchXErrors();
-+ void stopCatchXErrors();
-+ static int x11ErrorHandler(Display* display, XErrorEvent* error);
-+
-+ XkbDescPtr getKeyboard();
-+ void updateKeymap();
-+ bool isRemapKeycodeValid();
-+ int AddKeysym(KeySym keysym);
-+ void AddModifier(KeySym keysym);
-+ void SendEvent(XKeyEvent* event, int event_type);
-+ void SendModifier(XKeyEvent *event, unsigned int mask, int event_type);
-+ int GetKeycode(KeySym keysym, unsigned int *mask);
-+ bool keysymModifiers(KeySym keysym, int keycode, unsigned int *mask);
-+
-+ static int MyErrorHandler(Display* my_dpy, XErrorEvent* event);
-+
-+ Display* m_dpy;
-+ Window m_rootWindow;
-+ Atom m_atomWmState;
-+ Atom m_atomWmName;
-+ Atom m_atomNetWmName;
-+ Atom m_atomString;
-+ Atom m_atomUtf8String;
-+ Atom m_atomNetActiveWindow;
-+ QSet<QString> m_classBlacklist;
-+ Qt::Key m_currentGlobalKey;
-+ Qt::KeyboardModifiers m_currentGlobalModifiers;
-+ uint m_currentGlobalKeycode;
-+ uint m_currentGlobalNativeModifiers;
-+ int m_modifierMask;
-+ static bool m_catchXErrors;
-+ static bool m_xErrorOccured;
-+ static int (*m_oldXErrorHandler)(Display*, XErrorEvent*);
-+
-+ static const int m_unicodeToKeysymLen;
-+ static const uint m_unicodeToKeysymKeys[];
-+ static const uint m_unicodeToKeysymValues[];
-+
-+ XkbDescPtr m_xkb;
-+ KeySym* m_keysymTable;
-+ int m_minKeycode;
-+ int m_maxKeycode;
-+ int m_keysymPerKeycode;
-+ /* dedicated keycode for remapped keys */
-+ unsigned int m_remapKeycode;
-+ KeySym m_currentRemapKeysym;
-+ KeyCode m_modifier_keycode[N_MOD_INDICES];
-+ bool m_loaded;
-+};
-+
-+class AutoTypeExecturorX11 : public AutoTypeExecutor
-+{
-+public:
-+ explicit AutoTypeExecturorX11(AutoTypePlatformX11* platform);
-+
-+ void execChar(AutoTypeChar* action) override;
-+ void execKey(AutoTypeKey* action) override;
-+
-+private:
-+ AutoTypePlatformX11* const m_platform;
-+};
-+
-+#endif // KEEPASSX_AUTOTYPEXCB_H
-diff --git a/src/autotype/xcb/CMakeLists.txt b/src/autotype/xcb/CMakeLists.txt
-new file mode 100644
-index 0000000..3b56b31
---- /dev/null
-+++ b/src/autotype/xcb/CMakeLists.txt
-@@ -0,0 +1,11 @@
-+include_directories(SYSTEM ${X11_X11_INCLUDE_PATH})
-+
-+set(autotype_XCB_SOURCES
-+ AutoTypeXCB.cpp
-+)
-+
-+add_library(keepassx-autotype-xcb MODULE ${autotype_XCB_SOURCES})
-+target_link_libraries(keepassx-autotype-xcb Qt5::Core Qt5::Widgets Qt5::X11Extras ${X11_X11_LIB} ${X11_Xi_LIB} ${X11_XTest_LIB})
-+install(TARGETS keepassx-autotype-xcb
-+ BUNDLE DESTINATION . COMPONENT Runtime
-+ LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR} COMPONENT Runtime)
-diff --git a/src/autotype/xcb/KeySymMap.h b/src/autotype/xcb/KeySymMap.h
-new file mode 100644
-index 0000000..55022fe
---- /dev/null
-+++ b/src/autotype/xcb/KeySymMap.h
-@@ -0,0 +1,169 @@
-+/*
-+ * Automatically generated by keysymmap.py from parsing keysymdef.h.
-+ */
-+
-+const int AutoTypePlatformX11::m_unicodeToKeysymLen = 632;
-+
-+const uint AutoTypePlatformX11::m_unicodeToKeysymKeys[] = {
-+ 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107,
-+ 0x0108, 0x0109, 0x010a, 0x010b, 0x010c, 0x010d, 0x010e, 0x010f,
-+ 0x0110, 0x0111, 0x0112, 0x0113, 0x0116, 0x0117, 0x0118, 0x0119,
-+ 0x011a, 0x011b, 0x011c, 0x011d, 0x011e, 0x011f, 0x0120, 0x0121,
-+ 0x0122, 0x0123, 0x0124, 0x0125, 0x0126, 0x0127, 0x0128, 0x0129,
-+ 0x012a, 0x012b, 0x012e, 0x012f, 0x0130, 0x0131, 0x0134, 0x0135,
-+ 0x0136, 0x0137, 0x0138, 0x0139, 0x013a, 0x013b, 0x013c, 0x013d,
-+ 0x013e, 0x0141, 0x0142, 0x0143, 0x0144, 0x0145, 0x0146, 0x0147,
-+ 0x0148, 0x014a, 0x014b, 0x014c, 0x014d, 0x0150, 0x0151, 0x0152,
-+ 0x0153, 0x0154, 0x0155, 0x0156, 0x0157, 0x0158, 0x0159, 0x015a,
-+ 0x015b, 0x015c, 0x015d, 0x015e, 0x015f, 0x0160, 0x0161, 0x0162,
-+ 0x0163, 0x0164, 0x0165, 0x0166, 0x0167, 0x0168, 0x0169, 0x016a,
-+ 0x016b, 0x016c, 0x016d, 0x016e, 0x016f, 0x0170, 0x0171, 0x0172,
-+ 0x0173, 0x0178, 0x0179, 0x017a, 0x017b, 0x017c, 0x017d, 0x017e,
-+ 0x0192, 0x02c7, 0x02d8, 0x02d9, 0x02db, 0x02dd, 0x0385, 0x0386,
-+ 0x0388, 0x0389, 0x038a, 0x038c, 0x038e, 0x038f, 0x0390, 0x0391,
-+ 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399,
-+ 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1,
-+ 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa,
-+ 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03b0, 0x03b1, 0x03b2,
-+ 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba,
-+ 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c2,
-+ 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca,
-+ 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0401, 0x0402, 0x0403, 0x0404,
-+ 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a, 0x040b, 0x040c,
-+ 0x040e, 0x040f, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415,
-+ 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d,
-+ 0x041e, 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425,
-+ 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d,
-+ 0x042e, 0x042f, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435,
-+ 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d,
-+ 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445,
-+ 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d,
-+ 0x044e, 0x044f, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456,
-+ 0x0457, 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x045e, 0x045f,
-+ 0x0490, 0x0491, 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5,
-+ 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd,
-+ 0x05de, 0x05df, 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5,
-+ 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0x060c, 0x061b, 0x061f,
-+ 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628,
-+ 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, 0x0630,
-+ 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638,
-+ 0x0639, 0x063a, 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645,
-+ 0x0646, 0x0647, 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d,
-+ 0x064e, 0x064f, 0x0650, 0x0651, 0x0652, 0x0e01, 0x0e02, 0x0e03,
-+ 0x0e04, 0x0e05, 0x0e06, 0x0e07, 0x0e08, 0x0e09, 0x0e0a, 0x0e0b,
-+ 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, 0x0e10, 0x0e11, 0x0e12, 0x0e13,
-+ 0x0e14, 0x0e15, 0x0e16, 0x0e17, 0x0e18, 0x0e19, 0x0e1a, 0x0e1b,
-+ 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, 0x0e20, 0x0e21, 0x0e22, 0x0e23,
-+ 0x0e24, 0x0e25, 0x0e26, 0x0e27, 0x0e28, 0x0e29, 0x0e2a, 0x0e2b,
-+ 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, 0x0e30, 0x0e31, 0x0e32, 0x0e33,
-+ 0x0e34, 0x0e35, 0x0e36, 0x0e37, 0x0e38, 0x0e39, 0x0e3a, 0x0e3f,
-+ 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47,
-+ 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e50, 0x0e51,
-+ 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, 0x0e58, 0x0e59,
-+ 0x2002, 0x2003, 0x2004, 0x2005, 0x2007, 0x2008, 0x2009, 0x200a,
-+ 0x2012, 0x2013, 0x2014, 0x2015, 0x2017, 0x2018, 0x2019, 0x201a,
-+ 0x201c, 0x201d, 0x201e, 0x2020, 0x2021, 0x2025, 0x2026, 0x2030,
-+ 0x2032, 0x2033, 0x2038, 0x203e, 0x20ac, 0x2105, 0x2116, 0x2117,
-+ 0x211e, 0x2122, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158,
-+ 0x2159, 0x215a, 0x215b, 0x215c, 0x215d, 0x215e, 0x2190, 0x2191,
-+ 0x2192, 0x2193, 0x21d2, 0x21d4, 0x2202, 0x2207, 0x2218, 0x221a,
-+ 0x221d, 0x221e, 0x2227, 0x2228, 0x2229, 0x222a, 0x222b, 0x2234,
-+ 0x223c, 0x2243, 0x2260, 0x2261, 0x2264, 0x2265, 0x2282, 0x2283,
-+ 0x22a2, 0x22a3, 0x22a4, 0x22a5, 0x2308, 0x230a, 0x2315, 0x2320,
-+ 0x2321, 0x2395, 0x239b, 0x239d, 0x239e, 0x23a0, 0x23a1, 0x23a3,
-+ 0x23a4, 0x23a6, 0x23a8, 0x23ac, 0x23b7, 0x23ba, 0x23bb, 0x23bc,
-+ 0x23bd, 0x2409, 0x240a, 0x240b, 0x240c, 0x240d, 0x2424, 0x2500,
-+ 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, 0x252c,
-+ 0x2534, 0x253c, 0x2592, 0x25c6, 0x25cb, 0x260e, 0x2640, 0x2642,
-+ 0x2663, 0x2665, 0x2666, 0x266d, 0x266f, 0x2713, 0x2717, 0x271d,
-+ 0x2720, 0x3001, 0x3002, 0x300c, 0x300d, 0x309b, 0x309c, 0x30a1,
-+ 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8, 0x30a9,
-+ 0x30aa, 0x30ab, 0x30ad, 0x30af, 0x30b1, 0x30b3, 0x30b5, 0x30b7,
-+ 0x30b9, 0x30bb, 0x30bd, 0x30bf, 0x30c1, 0x30c3, 0x30c4, 0x30c6,
-+ 0x30c8, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d2,
-+ 0x30d5, 0x30d8, 0x30db, 0x30de, 0x30df, 0x30e0, 0x30e1, 0x30e2,
-+ 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, 0x30e9, 0x30ea,
-+ 0x30eb, 0x30ec, 0x30ed, 0x30ef, 0x30f2, 0x30f3, 0x30fb, 0x30fc
-+};
-+
-+const uint AutoTypePlatformX11::m_unicodeToKeysymValues[] = {
-+ 0x03c0, 0x03e0, 0x01c3, 0x01e3, 0x01a1, 0x01b1, 0x01c6, 0x01e6,
-+ 0x02c6, 0x02e6, 0x02c5, 0x02e5, 0x01c8, 0x01e8, 0x01cf, 0x01ef,
-+ 0x01d0, 0x01f0, 0x03aa, 0x03ba, 0x03cc, 0x03ec, 0x01ca, 0x01ea,
-+ 0x01cc, 0x01ec, 0x02d8, 0x02f8, 0x02ab, 0x02bb, 0x02d5, 0x02f5,
-+ 0x03ab, 0x03bb, 0x02a6, 0x02b6, 0x02a1, 0x02b1, 0x03a5, 0x03b5,
-+ 0x03cf, 0x03ef, 0x03c7, 0x03e7, 0x02a9, 0x02b9, 0x02ac, 0x02bc,
-+ 0x03d3, 0x03f3, 0x03a2, 0x01c5, 0x01e5, 0x03a6, 0x03b6, 0x01a5,
-+ 0x01b5, 0x01a3, 0x01b3, 0x01d1, 0x01f1, 0x03d1, 0x03f1, 0x01d2,
-+ 0x01f2, 0x03bd, 0x03bf, 0x03d2, 0x03f2, 0x01d5, 0x01f5, 0x13bc,
-+ 0x13bd, 0x01c0, 0x01e0, 0x03a3, 0x03b3, 0x01d8, 0x01f8, 0x01a6,
-+ 0x01b6, 0x02de, 0x02fe, 0x01aa, 0x01ba, 0x01a9, 0x01b9, 0x01de,
-+ 0x01fe, 0x01ab, 0x01bb, 0x03ac, 0x03bc, 0x03dd, 0x03fd, 0x03de,
-+ 0x03fe, 0x02dd, 0x02fd, 0x01d9, 0x01f9, 0x01db, 0x01fb, 0x03d9,
-+ 0x03f9, 0x13be, 0x01ac, 0x01bc, 0x01af, 0x01bf, 0x01ae, 0x01be,
-+ 0x08f6, 0x01b7, 0x01a2, 0x01ff, 0x01b2, 0x01bd, 0x07ae, 0x07a1,
-+ 0x07a2, 0x07a3, 0x07a4, 0x07a7, 0x07a8, 0x07ab, 0x07b6, 0x07c1,
-+ 0x07c2, 0x07c3, 0x07c4, 0x07c5, 0x07c6, 0x07c7, 0x07c8, 0x07c9,
-+ 0x07ca, 0x07cb, 0x07cc, 0x07cd, 0x07ce, 0x07cf, 0x07d0, 0x07d1,
-+ 0x07d2, 0x07d4, 0x07d5, 0x07d6, 0x07d7, 0x07d8, 0x07d9, 0x07a5,
-+ 0x07a9, 0x07b1, 0x07b2, 0x07b3, 0x07b4, 0x07ba, 0x07e1, 0x07e2,
-+ 0x07e3, 0x07e4, 0x07e5, 0x07e6, 0x07e7, 0x07e8, 0x07e9, 0x07ea,
-+ 0x07eb, 0x07ec, 0x07ed, 0x07ee, 0x07ef, 0x07f0, 0x07f1, 0x07f3,
-+ 0x07f2, 0x07f4, 0x07f5, 0x07f6, 0x07f7, 0x07f8, 0x07f9, 0x07b5,
-+ 0x07b9, 0x07b7, 0x07b8, 0x07bb, 0x06b3, 0x06b1, 0x06b2, 0x06b4,
-+ 0x06b5, 0x06b6, 0x06b7, 0x06b8, 0x06b9, 0x06ba, 0x06bb, 0x06bc,
-+ 0x06be, 0x06bf, 0x06e1, 0x06e2, 0x06f7, 0x06e7, 0x06e4, 0x06e5,
-+ 0x06f6, 0x06fa, 0x06e9, 0x06ea, 0x06eb, 0x06ec, 0x06ed, 0x06ee,
-+ 0x06ef, 0x06f0, 0x06f2, 0x06f3, 0x06f4, 0x06f5, 0x06e6, 0x06e8,
-+ 0x06e3, 0x06fe, 0x06fb, 0x06fd, 0x06ff, 0x06f9, 0x06f8, 0x06fc,
-+ 0x06e0, 0x06f1, 0x06c1, 0x06c2, 0x06d7, 0x06c7, 0x06c4, 0x06c5,
-+ 0x06d6, 0x06da, 0x06c9, 0x06ca, 0x06cb, 0x06cc, 0x06cd, 0x06ce,
-+ 0x06cf, 0x06d0, 0x06d2, 0x06d3, 0x06d4, 0x06d5, 0x06c6, 0x06c8,
-+ 0x06c3, 0x06de, 0x06db, 0x06dd, 0x06df, 0x06d9, 0x06d8, 0x06dc,
-+ 0x06c0, 0x06d1, 0x06a3, 0x06a1, 0x06a2, 0x06a4, 0x06a5, 0x06a6,
-+ 0x06a7, 0x06a8, 0x06a9, 0x06aa, 0x06ab, 0x06ac, 0x06ae, 0x06af,
-+ 0x06bd, 0x06ad, 0x0ce0, 0x0ce1, 0x0ce2, 0x0ce3, 0x0ce4, 0x0ce5,
-+ 0x0ce6, 0x0ce7, 0x0ce8, 0x0ce9, 0x0cea, 0x0ceb, 0x0cec, 0x0ced,
-+ 0x0cee, 0x0cef, 0x0cf0, 0x0cf1, 0x0cf2, 0x0cf3, 0x0cf4, 0x0cf5,
-+ 0x0cf6, 0x0cf7, 0x0cf8, 0x0cf9, 0x0cfa, 0x05ac, 0x05bb, 0x05bf,
-+ 0x05c1, 0x05c2, 0x05c3, 0x05c4, 0x05c5, 0x05c6, 0x05c7, 0x05c8,
-+ 0x05c9, 0x05ca, 0x05cb, 0x05cc, 0x05cd, 0x05ce, 0x05cf, 0x05d0,
-+ 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8,
-+ 0x05d9, 0x05da, 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5,
-+ 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0x05eb, 0x05ec, 0x05ed,
-+ 0x05ee, 0x05ef, 0x05f0, 0x05f1, 0x05f2, 0x0da1, 0x0da2, 0x0da3,
-+ 0x0da4, 0x0da5, 0x0da6, 0x0da7, 0x0da8, 0x0da9, 0x0daa, 0x0dab,
-+ 0x0dac, 0x0dad, 0x0dae, 0x0daf, 0x0db0, 0x0db1, 0x0db2, 0x0db3,
-+ 0x0db4, 0x0db5, 0x0db6, 0x0db7, 0x0db8, 0x0db9, 0x0dba, 0x0dbb,
-+ 0x0dbc, 0x0dbd, 0x0dbe, 0x0dbf, 0x0dc0, 0x0dc1, 0x0dc2, 0x0dc3,
-+ 0x0dc4, 0x0dc5, 0x0dc6, 0x0dc7, 0x0dc8, 0x0dc9, 0x0dca, 0x0dcb,
-+ 0x0dcc, 0x0dcd, 0x0dce, 0x0dcf, 0x0dd0, 0x0dd1, 0x0dd2, 0x0dd3,
-+ 0x0dd4, 0x0dd5, 0x0dd6, 0x0dd7, 0x0dd8, 0x0dd9, 0x0dda, 0x0ddf,
-+ 0x0de0, 0x0de1, 0x0de2, 0x0de3, 0x0de4, 0x0de5, 0x0de6, 0x0de7,
-+ 0x0de8, 0x0de9, 0x0dea, 0x0deb, 0x0dec, 0x0ded, 0x0df0, 0x0df1,
-+ 0x0df2, 0x0df3, 0x0df4, 0x0df5, 0x0df6, 0x0df7, 0x0df8, 0x0df9,
-+ 0x0aa2, 0x0aa1, 0x0aa3, 0x0aa4, 0x0aa5, 0x0aa6, 0x0aa7, 0x0aa8,
-+ 0x0abb, 0x0aaa, 0x0aa9, 0x07af, 0x0cdf, 0x0ad0, 0x0ad1, 0x0afd,
-+ 0x0ad2, 0x0ad3, 0x0afe, 0x0af1, 0x0af2, 0x0aaf, 0x0aae, 0x0ad5,
-+ 0x0ad6, 0x0ad7, 0x0afc, 0x047e, 0x20ac, 0x0ab8, 0x06b0, 0x0afb,
-+ 0x0ad4, 0x0ac9, 0x0ab0, 0x0ab1, 0x0ab2, 0x0ab3, 0x0ab4, 0x0ab5,
-+ 0x0ab6, 0x0ab7, 0x0ac3, 0x0ac4, 0x0ac5, 0x0ac6, 0x08fb, 0x08fc,
-+ 0x08fd, 0x08fe, 0x08ce, 0x08cd, 0x08ef, 0x08c5, 0x0bca, 0x08d6,
-+ 0x08c1, 0x08c2, 0x08de, 0x08df, 0x08dc, 0x08dd, 0x08bf, 0x08c0,
-+ 0x08c8, 0x08c9, 0x08bd, 0x08cf, 0x08bc, 0x08be, 0x08da, 0x08db,
-+ 0x0bfc, 0x0bdc, 0x0bc2, 0x0bce, 0x0bd3, 0x0bc4, 0x0afa, 0x08a4,
-+ 0x08a5, 0x0bcc, 0x08ab, 0x08ac, 0x08ad, 0x08ae, 0x08a7, 0x08a8,
-+ 0x08a9, 0x08aa, 0x08af, 0x08b0, 0x08a1, 0x09ef, 0x09f0, 0x09f2,
-+ 0x09f3, 0x09e2, 0x09e5, 0x09e9, 0x09e3, 0x09e4, 0x09e8, 0x09f1,
-+ 0x09f8, 0x09ec, 0x09eb, 0x09ed, 0x09ea, 0x09f4, 0x09f5, 0x09f7,
-+ 0x09f6, 0x09ee, 0x09e1, 0x09e0, 0x0bcf, 0x0af9, 0x0af8, 0x0af7,
-+ 0x0aec, 0x0aee, 0x0aed, 0x0af6, 0x0af5, 0x0af3, 0x0af4, 0x0ad9,
-+ 0x0af0, 0x04a4, 0x04a1, 0x04a2, 0x04a3, 0x04de, 0x04df, 0x04a7,
-+ 0x04b1, 0x04a8, 0x04b2, 0x04a9, 0x04b3, 0x04aa, 0x04b4, 0x04ab,
-+ 0x04b5, 0x04b6, 0x04b7, 0x04b8, 0x04b9, 0x04ba, 0x04bb, 0x04bc,
-+ 0x04bd, 0x04be, 0x04bf, 0x04c0, 0x04c1, 0x04af, 0x04c2, 0x04c3,
-+ 0x04c4, 0x04c5, 0x04c6, 0x04c7, 0x04c8, 0x04c9, 0x04ca, 0x04cb,
-+ 0x04cc, 0x04cd, 0x04ce, 0x04cf, 0x04d0, 0x04d1, 0x04d2, 0x04d3,
-+ 0x04ac, 0x04d4, 0x04ad, 0x04d5, 0x04ae, 0x04d6, 0x04d7, 0x04d8,
-+ 0x04d9, 0x04da, 0x04db, 0x04dc, 0x04a6, 0x04dd, 0x04a5, 0x04b0
-+};
-diff --git a/src/autotype/xcb/keysymmap.py b/src/autotype/xcb/keysymmap.py
-new file mode 100755
-index 0000000..a359710
---- /dev/null
-+++ b/src/autotype/xcb/keysymmap.py
-@@ -0,0 +1,107 @@
-+#!/usr/bin/python3
-+
-+#
-+# Copyright (C) 2013 Felix Geyer <debfx at fobos.de>
-+#
-+# This program is free software: you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation, either version 2 or (at your option)
-+# version 3 of the License.
-+#
-+# This program is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+# GNU General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program. If not, see <http://www.gnu.org/licenses/>.
-+#
-+
-+#
-+# Parses keysymdef.h to construct a unicode symbol -> keysym mapping table.
-+#
-+# The lines that are parsed look like this:
-+# #define XK_Aogonek 0x01a1 /* U+0104 LATIN CAPITAL LETTER A WITH OGONEK */
-+#
-+# This would create a 0x0104 -> 0x01a1 mapping.
-+#
-+
-+import sys
-+import re
-+import collections
-+
-+cols = 8
-+
-+if len(sys.argv) >= 2:
-+ keysymdef = sys.argv[1]
-+else:
-+ keysymdef = "/usr/include/X11/keysymdef.h"
-+
-+keysymMap = {}
-+
-+f = open(keysymdef, "r")
-+for line in f:
-+ match = re.search(r'0x([0-9a-fA-F]+)\s+/\* U\+([0-9a-fA-F]+)', line)
-+ if match:
-+ keysym = int(match.group(1), 16)
-+ unicodeVal = int(match.group(2), 16)
-+
-+ # ignore 1:1 mappings
-+ if keysym >= 0x0020 and keysym <= 0x007e:
-+ continue
-+ if keysym >= 0x00a0 and keysym <= 0x00ff:
-+ continue
-+ # ignore unicode | 0x01000000 mappings
-+ if keysym >= 0x1000000:
-+ continue
-+
-+ keysymMap[unicodeVal] = keysym
-+
-+keysymMap = collections.OrderedDict(sorted(keysymMap.items(), key=lambda t: t[0]))
-+
-+print("""/*
-+ * Automatically generated by keysymmap.py from parsing keysymdef.h.
-+ */
-+""")
-+
-+print("const int AutoTypePlatformX11::m_unicodeToKeysymLen = " + str(len(keysymMap)) + ";")
-+
-+print()
-+
-+print("const uint AutoTypePlatformX11::m_unicodeToKeysymKeys[] = {")
-+keys = keysymMap.keys()
-+keyLen = len(keys)
-+i = 1
-+for val in keys:
-+ hexVal = "{0:#0{1}x}".format(val, 6)
-+
-+ if i == keyLen:
-+ print(hexVal)
-+ elif (i % cols) == 0:
-+ print(hexVal + ",")
-+ elif ((i - 1) % cols) == 0:
-+ print(" " + hexVal + ", ", end="")
-+ else:
-+ print(hexVal + ", ", end="")
-+ i += 1
-+print("};")
-+
-+print()
-+
-+print("const uint AutoTypePlatformX11::m_unicodeToKeysymValues[] = {")
-+values = keysymMap.values()
-+valuesLen = len(values)
-+i = 1
-+for val in values:
-+ hexVal = "{0:#0{1}x}".format(val, 6)
-+
-+ if i == valuesLen:
-+ print(hexVal)
-+ elif (i % cols) == 0:
-+ print(hexVal + ",")
-+ elif ((i - 1) % cols) == 0:
-+ print(" " + hexVal + ", ", end="")
-+ else:
-+ print(hexVal + ", ", end="")
-+ i += 1
-+print("};")
-diff --git a/src/config-keepassx.h.cmake b/src/config-keepassx.h.cmake
-index 197c0d3..dc418b6 100644
---- a/src/config-keepassx.h.cmake
-+++ b/src/config-keepassx.h.cmake
-@@ -16,6 +16,4 @@
- #cmakedefine HAVE_RLIMIT_CORE 1
- #cmakedefine HAVE_PT_DENY_ATTACH 1
-
--#cmakedefine GCRYPT_HAS_SALSA20
--
- #endif // KEEPASSX_CONFIG_KEEPASSX_H
-diff --git a/src/core/AutoTypeAssociations.h b/src/core/AutoTypeAssociations.h
-index 1b5871b..491a5db 100644
---- a/src/core/AutoTypeAssociations.h
-+++ b/src/core/AutoTypeAssociations.h
-@@ -20,8 +20,6 @@
-
- #include <QObject>
-
--#include "core/Global.h"
--
- class AutoTypeAssociations : public QObject
- {
- Q_OBJECT
-@@ -36,7 +34,7 @@ public:
- bool operator!=(const AutoTypeAssociations::Association& other) const;
- };
-
-- explicit AutoTypeAssociations(QObject* parent = Q_NULLPTR);
-+ explicit AutoTypeAssociations(QObject* parent = nullptr);
- void copyDataFrom(const AutoTypeAssociations* other);
- void add(const AutoTypeAssociations::Association& association);
- void remove(int index);
-diff --git a/src/core/Config.cpp b/src/core/Config.cpp
-index 046a0fe..5b06c22 100644
---- a/src/core/Config.cpp
-+++ b/src/core/Config.cpp
-@@ -18,12 +18,12 @@
- #include "Config.h"
-
- #include <QCoreApplication>
--#include <QDesktopServices>
- #include <QDir>
- #include <QSettings>
-+#include <QStandardPaths>
- #include <QTemporaryFile>
-
--Config* Config::m_instance(Q_NULLPTR);
-+Config* Config::m_instance(nullptr);
-
- QVariant Config::get(const QString& key)
- {
-@@ -53,7 +53,7 @@ Config::Config(QObject* parent)
- QString homePath = QDir::homePath();
-
- #if defined(Q_OS_UNIX) && !defined(Q_OS_MAC)
-- // we can't use QDesktopServices on X11 as it uses XDG_DATA_HOME instead of XDG_CONFIG_HOME
-+ // we can't use QStandardPaths on X11 as it uses XDG_DATA_HOME instead of XDG_CONFIG_HOME
- QByteArray env = qgetenv("XDG_CONFIG_HOME");
- if (env.isEmpty()) {
- userPath = homePath;
-@@ -70,7 +70,7 @@ Config::Config(QObject* parent)
-
- userPath += "/keepassx/";
- #else
-- userPath = QDir::fromNativeSeparators(QDesktopServices::storageLocation(QDesktopServices::DataLocation));
-+ userPath = QDir::fromNativeSeparators(QStandardPaths::writableLocation(QStandardPaths::DataLocation));
- // storageLocation() appends the application name ("/keepassx") to the end
- userPath += "/";
- #endif
-diff --git a/src/core/Config.h b/src/core/Config.h
-index ca0f74c..09aa02f 100644
---- a/src/core/Config.h
-+++ b/src/core/Config.h
-@@ -21,8 +21,6 @@
- #include <QScopedPointer>
- #include <QVariant>
-
--#include "core/Global.h"
--
- class QSettings;
-
- class Config : public QObject
-diff --git a/src/core/Database.cpp b/src/core/Database.cpp
-index 098cc06..6f94235 100644
---- a/src/core/Database.cpp
-+++ b/src/core/Database.cpp
-@@ -23,7 +23,6 @@
-
- #include "core/Group.h"
- #include "core/Metadata.h"
--#include "core/Tools.h"
- #include "crypto/Random.h"
- #include "format/KeePass2.h"
-
-@@ -105,7 +104,7 @@ Entry* Database::recFindEntry(const Uuid& uuid, Group* group)
- }
- }
-
-- return Q_NULLPTR;
-+ return nullptr;
- }
-
- Group* Database::resolveGroup(const Uuid& uuid)
-@@ -126,7 +125,7 @@ Group* Database::recFindGroup(const Uuid& uuid, Group* group)
- }
- }
-
-- return Q_NULLPTR;
-+ return nullptr;
- }
-
- QList<DeletedObject> Database::deletedObjects()
-@@ -143,7 +142,7 @@ void Database::addDeletedObject(const DeletedObject& delObj)
- void Database::addDeletedObject(const Uuid& uuid)
- {
- DeletedObject delObj;
-- delObj.deletionTime = Tools::currentDateTimeUtc();
-+ delObj.deletionTime = QDateTime::currentDateTimeUtc();
- delObj.uuid = uuid;
-
- addDeletedObject(delObj);
-@@ -223,7 +222,7 @@ bool Database::setKey(const CompositeKey& key, const QByteArray& transformSeed,
- m_data.transformedMasterKey = transformedMasterKey;
- m_data.hasKey = true;
- if (updateChangedTime) {
-- m_metadata->setMasterKeyChanged(Tools::currentDateTimeUtc());
-+ m_metadata->setMasterKeyChanged(QDateTime::currentDateTimeUtc());
- }
- Q_EMIT modifiedImmediate();
-
-diff --git a/src/core/Database.h b/src/core/Database.h
-index 97ccad2..6fde3c6 100644
---- a/src/core/Database.h
-+++ b/src/core/Database.h
-@@ -20,6 +20,7 @@
-
- #include <QDateTime>
- #include <QHash>
-+#include <QObject>
-
- #include "core/Uuid.h"
- #include "keys/CompositeKey.h"
-diff --git a/src/core/DatabaseIcons.cpp b/src/core/DatabaseIcons.cpp
-index d6e816f..4e62f79 100644
---- a/src/core/DatabaseIcons.cpp
-+++ b/src/core/DatabaseIcons.cpp
-@@ -19,7 +19,7 @@
-
- #include "core/FilePath.h"
-
--DatabaseIcons* DatabaseIcons::m_instance(Q_NULLPTR);
-+DatabaseIcons* DatabaseIcons::m_instance(nullptr);
- const int DatabaseIcons::IconCount(69);
- const int DatabaseIcons::ExpiredIconIndex(45);
- const char* const DatabaseIcons::m_indexToName[] = {
-diff --git a/src/core/DatabaseIcons.h b/src/core/DatabaseIcons.h
-index 68d1e0c..a1d9480 100644
---- a/src/core/DatabaseIcons.h
-+++ b/src/core/DatabaseIcons.h
-@@ -23,8 +23,6 @@
- #include <QPixmapCache>
- #include <QVector>
-
--#include "core/Global.h"
--
- class DatabaseIcons
- {
- public:
-diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp
-index 784b489..2fd52d0 100644
---- a/src/core/Entry.cpp
-+++ b/src/core/Entry.cpp
-@@ -21,7 +21,6 @@
- #include "core/DatabaseIcons.h"
- #include "core/Group.h"
- #include "core/Metadata.h"
--#include "core/Tools.h"
-
- const int Entry::DefaultIconNumber = 0;
-
-@@ -29,7 +28,7 @@ Entry::Entry()
- : m_attributes(new EntryAttributes(this))
- , m_attachments(new EntryAttachments(this))
- , m_autoTypeAssociations(new AutoTypeAssociations(this))
-- , m_tmpHistoryItem(Q_NULLPTR)
-+ , m_tmpHistoryItem(nullptr)
- , m_modifiedSinceBegin(false)
- , m_updateTimeinfo(true)
- {
-@@ -74,8 +73,8 @@ template <class T> inline bool Entry::set(T& property, const T& value)
- void Entry::updateTimeinfo()
- {
- if (m_updateTimeinfo) {
-- m_data.timeInfo.setLastModificationTime(Tools::currentDateTimeUtc());
-- m_data.timeInfo.setLastAccessTime(Tools::currentDateTimeUtc());
-+ m_data.timeInfo.setLastModificationTime(QDateTime::currentDateTimeUtc());
-+ m_data.timeInfo.setLastAccessTime(QDateTime::currentDateTimeUtc());
- }
- }
-
-@@ -223,7 +222,7 @@ QString Entry::notes() const
-
- bool Entry::isExpired() const
- {
-- return m_data.timeInfo.expires() && m_data.timeInfo.expiryTime() < Tools::currentDateTimeUtc();
-+ return m_data.timeInfo.expires() && m_data.timeInfo.expiryTime() < QDateTime::currentDateTimeUtc();
- }
-
- EntryAttributes* Entry::attributes()
-@@ -474,7 +473,7 @@ Entry* Entry::clone(CloneFlags flags) const
- entry->setUpdateTimeinfo(true);
-
- if (flags & CloneResetTimeInfo) {
-- QDateTime now = Tools::currentDateTimeUtc();
-+ QDateTime now = QDateTime::currentDateTimeUtc();
- entry->m_data.timeInfo.setCreationTime(now);
- entry->m_data.timeInfo.setLastModificationTime(now);
- entry->m_data.timeInfo.setLastAccessTime(now);
-@@ -522,7 +521,7 @@ void Entry::endUpdate()
- delete m_tmpHistoryItem;
- }
-
-- m_tmpHistoryItem = Q_NULLPTR;
-+ m_tmpHistoryItem = nullptr;
- }
-
- void Entry::updateModifiedSinceBegin()
-@@ -568,7 +567,7 @@ void Entry::setGroup(Group* group)
- QObject::setParent(group);
-
- if (m_updateTimeinfo) {
-- m_data.timeInfo.setLocationChanged(Tools::currentDateTimeUtc());
-+ m_data.timeInfo.setLocationChanged(QDateTime::currentDateTimeUtc());
- }
- }
-
-@@ -583,7 +582,7 @@ const Database* Entry::database() const
- return m_group->database();
- }
- else {
-- return Q_NULLPTR;
-+ return nullptr;
- }
- }
-
-diff --git a/src/core/Entry.h b/src/core/Entry.h
-index 3044dc8..cd7c7b7 100644
---- a/src/core/Entry.h
-+++ b/src/core/Entry.h
-@@ -29,7 +29,6 @@
- #include "core/AutoTypeAssociations.h"
- #include "core/EntryAttachments.h"
- #include "core/EntryAttributes.h"
--#include "core/Global.h"
- #include "core/TimeInfo.h"
- #include "core/Uuid.h"
-
-diff --git a/src/core/EntryAttachments.h b/src/core/EntryAttachments.h
-index 3446b31..903ca10 100644
---- a/src/core/EntryAttachments.h
-+++ b/src/core/EntryAttachments.h
-@@ -21,14 +21,12 @@
- #include <QMap>
- #include <QObject>
-
--#include "core/Global.h"
--
- class EntryAttachments : public QObject
- {
- Q_OBJECT
-
- public:
-- explicit EntryAttachments(QObject* parent = Q_NULLPTR);
-+ explicit EntryAttachments(QObject* parent = nullptr);
- QList<QString> keys() const;
- bool hasKey(const QString& key) const;
- QList<QByteArray> values() const;
-diff --git a/src/core/EntryAttributes.h b/src/core/EntryAttributes.h
-index 334eb0a..c6bbf29 100644
---- a/src/core/EntryAttributes.h
-+++ b/src/core/EntryAttributes.h
-@@ -23,14 +23,12 @@
- #include <QSet>
- #include <QStringList>
-
--#include "core/Global.h"
--
- class EntryAttributes : public QObject
- {
- Q_OBJECT
-
- public:
-- explicit EntryAttributes(QObject* parent = Q_NULLPTR);
-+ explicit EntryAttributes(QObject* parent = nullptr);
- QList<QString> keys() const;
- bool hasKey(const QString& key) const;
- QList<QString> customKeys();
-diff --git a/src/core/EntrySearcher.cpp b/src/core/EntrySearcher.cpp
-index 82a553e..05c4c58 100644
---- a/src/core/EntrySearcher.cpp
-+++ b/src/core/EntrySearcher.cpp
-@@ -19,7 +19,8 @@
-
- #include "core/Group.h"
-
--QList<Entry*> EntrySearcher::search(const QString &searchTerm, const Group* group, Qt::CaseSensitivity caseSensitivity)
-+QList<Entry*> EntrySearcher::search(const QString& searchTerm, const Group* group,
-+ Qt::CaseSensitivity caseSensitivity)
- {
- if (!group->resolveSearchingEnabled()) {
- return QList<Entry*>();
-@@ -28,7 +29,8 @@ QList<Entry*> EntrySearcher::search(const QString &searchTerm, const Group* grou
- return searchEntries(searchTerm, group, caseSensitivity);
- }
-
--QList<Entry*> EntrySearcher::searchEntries(const QString& searchTerm, const Group* group, Qt::CaseSensitivity caseSensitivity)
-+QList<Entry*> EntrySearcher::searchEntries(const QString& searchTerm, const Group* group,
-+ Qt::CaseSensitivity caseSensitivity)
- {
- QList<Entry*> searchResult;
-
-@@ -44,7 +46,8 @@ QList<Entry*> EntrySearcher::searchEntries(const QString& searchTerm, const Grou
- return searchResult;
- }
-
--QList<Entry*> EntrySearcher::matchEntry(const QString& searchTerm, Entry* entry, Qt::CaseSensitivity caseSensitivity)
-+QList<Entry*> EntrySearcher::matchEntry(const QString& searchTerm, Entry* entry,
-+ Qt::CaseSensitivity caseSensitivity)
- {
- QStringList wordList = searchTerm.split(QRegExp("\\s"), QString::SkipEmptyParts);
- Q_FOREACH (const QString& word, wordList) {
-diff --git a/src/core/EntrySearcher.h b/src/core/EntrySearcher.h
-index 246538c..c7075dc 100644
---- a/src/core/EntrySearcher.h
-+++ b/src/core/EntrySearcher.h
-@@ -28,10 +28,11 @@ class EntrySearcher
- {
- public:
- QList<Entry*> search(const QString& searchTerm, const Group* group, Qt::CaseSensitivity caseSensitivity);
-+
- private:
- QList<Entry*> searchEntries(const QString& searchTerm, const Group* group, Qt::CaseSensitivity caseSensitivity);
- QList<Entry*> matchEntry(const QString& searchTerm, Entry* entry, Qt::CaseSensitivity caseSensitivity);
-- bool wordMatch(const QString &word, Entry *entry, Qt::CaseSensitivity caseSensitivity);
-+ bool wordMatch(const QString& word, Entry* entry, Qt::CaseSensitivity caseSensitivity);
- };
-
- #endif // KEEPASSX_ENTRYSEARCHER_H
-diff --git a/src/core/FilePath.cpp b/src/core/FilePath.cpp
-index f7c4075..497568a 100644
---- a/src/core/FilePath.cpp
-+++ b/src/core/FilePath.cpp
-@@ -23,7 +23,7 @@
-
- #include "config-keepassx.h"
-
--FilePath* FilePath::m_instance(Q_NULLPTR);
-+FilePath* FilePath::m_instance(nullptr);
-
- QString FilePath::dataPath(const QString& name)
- {
-diff --git a/src/core/FilePath.h b/src/core/FilePath.h
-index 9e98d3e..c37a908 100644
---- a/src/core/FilePath.h
-+++ b/src/core/FilePath.h
-@@ -22,8 +22,6 @@
- #include <QIcon>
- #include <QString>
-
--#include "core/Global.h"
--
- class FilePath
- {
- public:
-diff --git a/src/core/Global.h b/src/core/Global.h
-index 914c7b4..14281ee 100644
---- a/src/core/Global.h
-+++ b/src/core/Global.h
-@@ -20,104 +20,8 @@
- #ifndef KEEPASSX_GLOBAL_H
- #define KEEPASSX_GLOBAL_H
-
--// mostly copied from qcompilerdetection.h which is part of Qt 5
--
- #include <QtGlobal>
-
--#ifdef Q_CC_CLANG
--# if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
--# if __has_feature(cxx_strong_enums)
--# define COMPILER_CLASS_ENUM
--# endif
--# if __has_feature(cxx_constexpr)
--# define COMPILER_CONSTEXPR
--# endif
--# if __has_feature(cxx_decltype) /* && __has_feature(cxx_decltype_incomplete_return_types) */
--# define COMPILER_DECLTYPE
--# endif
--# if __has_feature(cxx_override_control)
--# define COMPILER_EXPLICIT_OVERRIDES
--# endif
--# if __has_feature(cxx_nullptr)
--# define COMPILER_NULLPTR
--# endif
--# if __has_feature(cxx_static_assert)
--# define COMPILER_STATIC_ASSERT
--# endif
--# endif
--#endif // Q_CC_CLANG
--
--#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_CLANG)
--# if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L
--# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403
--# define COMPILER_DECLTYPE
--# define COMPILER_STATIC_ASSERT
--# endif
--# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404
--# define COMPILER_CLASS_ENUM
--# endif
--# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406
--# define COMPILER_CONSTEXPR
--# define COMPILER_NULLPTR
--# endif
--# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407
--# define COMPILER_EXPLICIT_OVERRIDES
--# endif
--# endif
--#endif
--
--/*
-- * C++11 keywords and expressions
-- */
--#if !defined(Q_NULLPTR)
--# ifdef COMPILER_NULLPTR
--# define Q_NULLPTR nullptr
--# else
--# define Q_NULLPTR 0
--# endif
--#endif
--
--#if !defined(Q_DECL_CONSTEXPR)
--# ifdef COMPILER_CONSTEXPR
--# define Q_DECL_CONSTEXPR constexpr
--# else
--# define Q_DECL_CONSTEXPR
--# endif
--#endif
--
--#if !defined(Q_DECL_OVERRIDE) && !defined(Q_DECL_FINAL) && !defined(Q_DECL_FINAL_CLASS)
--# ifdef COMPILER_EXPLICIT_OVERRIDES
--# define Q_DECL_OVERRIDE override
--# define Q_DECL_FINAL final
--# ifdef COMPILER_DECLTYPE
--# define Q_DECL_FINAL_CLASS final
--# else
--# define Q_DECL_FINAL_CLASS
--# endif
--# else
--# define Q_DECL_OVERRIDE
--# define Q_DECL_FINAL
--# define Q_DECL_FINAL_CLASS
--# endif
--#endif
--
--#if !defined(Q_STATIC_ASSERT) && !defined(Q_STATIC_ASSERT_X)
--#ifdef COMPILER_STATIC_ASSERT
--#define Q_STATIC_ASSERT(Condition) static_assert(static_cast<bool>(Condition), #Condition)
--#define Q_STATIC_ASSERT_X(Condition, Message) static_assert(static_cast<bool>(Condition), Message)
--#else
--// Intentionally undefined
--template <bool Test> class QStaticAssertFailure;
--template <> class QStaticAssertFailure<true> {};
--
--#define Q_STATIC_ASSERT_PRIVATE_JOIN(A, B) Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B)
--#define Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B) A ## B
--#define Q_STATIC_ASSERT(Condition) \
-- enum {Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __LINE__) = sizeof(QStaticAssertFailure<!!(Condition)>)}
--#define Q_STATIC_ASSERT_X(Condition, Message) Q_STATIC_ASSERT(Condition)
--#endif // COMPILER_STATIC_ASSERT
--#endif // !defined(Q_STATIC_ASSERT) && !defined(Q_STATIC_ASSERT_X)
--
- #if defined(Q_OS_WIN)
- # if defined(KEEPASSX_BUILDING_CORE)
- # define KEEPASSX_EXPORT Q_DECL_EXPORT
-diff --git a/src/core/Group.cpp b/src/core/Group.cpp
-index 371f3e4..2b9e9bc 100644
---- a/src/core/Group.cpp
-+++ b/src/core/Group.cpp
-@@ -20,7 +20,6 @@
- #include "core/Config.h"
- #include "core/DatabaseIcons.h"
- #include "core/Metadata.h"
--#include "core/Tools.h"
-
- const int Group::DefaultIconNumber = 48;
- const int Group::RecycleBinIconNumber = 43;
-@@ -50,7 +49,7 @@ Group::~Group()
-
- if (m_db && m_parent) {
- DeletedObject delGroup;
-- delGroup.deletionTime = Tools::currentDateTimeUtc();
-+ delGroup.deletionTime = QDateTime::currentDateTimeUtc();
- delGroup.uuid = m_uuid;
- m_db->addDeletedObject(delGroup);
- }
-@@ -84,8 +83,8 @@ template <class P, class V> inline bool Group::set(P& property, const V& value)
- void Group::updateTimeinfo()
- {
- if (m_updateTimeinfo) {
-- m_data.timeInfo.setLastModificationTime(Tools::currentDateTimeUtc());
<Skipped 9092 lines>
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/keepassxc.git/commitdiff/e580663c8fa67eb30492a49f31bf4cdd35cf5aa2
More information about the pld-cvs-commit
mailing list