[packages/keepassx] - restore git patch; rel 2

baggins baggins at pld-linux.org
Sun Oct 11 10:58:25 CEST 2015


commit 28c3672f60ad5fb9b6c8537b35b3c498a6ed9953
Author: Jan Rękorajski <baggins at pld-linux.org>
Date:   Sun Oct 11 10:56:41 2015 +0200

    - restore git patch; rel 2
    
    Keepasx in in't current form is unusable, it freezes on input fields
    quite predictably. Current git master switched from Qt4 and X11 for
    autotype to Qt5 and xcb which works without any issues.

 git.patch     | 12483 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 keepassx.spec |    22 +-
 2 files changed, 12496 insertions(+), 9 deletions(-)
---
diff --git a/keepassx.spec b/keepassx.spec
index 9a8c36b..ec33279 100644
--- a/keepassx.spec
+++ b/keepassx.spec
@@ -1,7 +1,7 @@
 # TODO
 # - forcing our cflags breaks build
 %define pre beta2
-%define	rel 1
+%define	rel 2
 Summary:	KeePassX - Cross Platform Password Manager
 Summary(pl.UTF-8):	KeePassX - Wieloplatformowy zarządca haseł
 Name:		keepassx
@@ -12,15 +12,18 @@ Group:		X11/Applications
 #Source0:	http://downloads.sourceforge.net/keepassx/keepassx-%{version}.tar.gz
 Source0:	http://www.keepassx.org/dev/attachments/download/115/keepassx-%{version}-%{pre}.tar.gz
 # Source0-md5:	95114e6719d12eb9a1e3ac618b7bd275
+Patch0:		git.patch
 URL:		http://keepassx.sourceforge.net/
-BuildRequires:	QtCore-devel >= 4.6.0
-BuildRequires:	QtDBus-devel >= 4.6.0
-BuildRequires:	QtGui-devel >= 4.6.0
-BuildRequires:	QtXml-devel >= 4.6.0
+BuildRequires:	Qt5Core-devel >= 5.2.0
+BuildRequires:	Qt5Concurrent-devel >= 5.2.0
+BuildRequires:	Qt5Widgets-devel >= 5.2.0
+BuildRequires:	Qt5Test-devel >= 5.2.0
+BuildRequires:	Qt5X11Extras-devel >= 5.2.0
+BuildRequires:	cmake >= 2.8.12
 BuildRequires:	libgcrypt-devel >= 1.6
-BuildRequires:	qt4-build >= 4.6.0
-BuildRequires:	qt4-linguist >= 4.6.0
-BuildRequires:	qt4-qmake >= 4.6.0
+BuildRequires:	qt5-build >= 5.2.0
+BuildRequires:	qt5-linguist >= 5.2.0
+BuildRequires:	qt5-qmake >= 5.2.0
 BuildRequires:	rpmbuild(macros) >= 1.230
 BuildRequires:	xorg-lib-libX11-devel
 BuildRequires:	xorg-lib-libXext-devel
@@ -53,6 +56,7 @@ szyfrowania jakie są do tej pory znane (AES i TwoFish).
 
 %prep
 %setup -q -n %{name}-%{version}-%{pre}
+%patch0 -p1
 
 %build
 install -d build
@@ -103,7 +107,7 @@ rm -rf $RPM_BUILD_ROOT
 %lang(zh_CN) %{_datadir}/keepassx/translations/keepassx_zh_CN.qm
 %lang(zh_TW) %{_datadir}/keepassx/translations/keepassx_zh_TW.qm
 %dir %{_libdir}/keepassx
-%attr(755,root,root) %{_libdir}/keepassx/libkeepassx-autotype-x11.so
+%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
diff --git a/git.patch b/git.patch
new file mode 100644
index 0000000..30b09e4
--- /dev/null
+++ b/git.patch
@@ -0,0 +1,12483 @@
+diff -urN -x .git -x .tx keepassx-2.0-beta2/CMakeLists.txt keepassx/CMakeLists.txt
+--- keepassx-2.0-beta2/CMakeLists.txt	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/CMakeLists.txt	2015-10-11 10:44:51.877209219 +0200
+@@ -21,7 +21,7 @@
+ 
+ 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,8 +31,6 @@
+ 
+ option(WITH_TESTS "Enable building of unit tests" ON)
+ option(WITH_GUI_TESTS "Enable building of GUI tests" OFF)
+-option(WITH_LTO "Enable Link Time Optimization (LTO)" OFF)
+-option(WITH_CXX11 "Build with the C++ 11 standard" ON)
+ 
+ set(KEEPASSX_VERSION "2.0 beta 2")
+ set(KEEPASSX_VERSION_NUM "1.9.92")
+@@ -62,7 +60,7 @@
+   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")
+@@ -101,30 +99,14 @@
+   set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,relro")
+ endif()
+ 
+-if(WITH_LTO)
+-  if(CMAKE_COMPILER_IS_GNUCC AND CMAKE_COMPILER_IS_GNUCXX)
+-    check_cxx_compiler_flag("-flto -fuse-linker-plugin" LTO_AVAILABLE)
+-
+-    if(LTO_AVAILABLE)
+-      add_gcc_compiler_flags("-flto -fuse-linker-plugin")
+-    else()
+-      message(FATAL_ERROR "This version of gcc doesn't support LTO")
+-    endif(LTO_AVAILABLE)
+-  else()
+-    message(FATAL_ERROR "LTO is only supported with gcc")
+-  endif()
+-endif()
++add_gcc_compiler_cxxflags("-std=c++11")
+ 
+-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")
++if(APPLE)
++  add_gcc_compiler_cxxflags("-stdlib=libc++")
+ endif()
+ 
++add_gcc_compiler_cflags("-ansi")
++
+ if(MINGW)
+   set(CMAKE_RC_COMPILER_INIT windres)
+   enable_language(RC)
+@@ -161,19 +143,18 @@
+   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)
+ 
+@@ -214,10 +195,7 @@
+ 
+ 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 -urN -x .git -x .tx keepassx-2.0-beta2/README.md keepassx/README.md
+--- keepassx-2.0-beta2/README.md	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/README.md	2015-10-11 10:44:51.877209219 +0200
+@@ -49,20 +49,20 @@
+ 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 -urN -x .git -x .tx keepassx-2.0-beta2/share/translations/CMakeLists.txt keepassx/share/translations/CMakeLists.txt
+--- keepassx-2.0-beta2/share/translations/CMakeLists.txt	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/share/translations/CMakeLists.txt	2015-10-11 10:44:51.877209219 +0200
+@@ -17,9 +17,9 @@
+ 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 -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/AutoType.cpp keepassx/src/autotype/AutoType.cpp
+--- keepassx-2.0-beta2/src/autotype/AutoType.cpp	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/autotype/AutoType.cpp	2015-10-11 10:44:51.877209219 +0200
+@@ -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 @@
+     , 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 @@
+ 
+     QString pluginName = "keepassx-autotype-";
+     if (!test) {
+-        pluginName += Tools::platform();
++        pluginName += QApplication::platformName();
+     }
+     else {
+         pluginName += "test";
+@@ -68,7 +68,7 @@
+ {
+     if (m_executor) {
+         delete m_executor;
+-        m_executor = Q_NULLPTR;
++        m_executor = nullptr;
+     }
+ }
+ 
+@@ -195,11 +195,11 @@
+         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();
+@@ -218,8 +218,10 @@
+ {
+     Q_ASSERT(m_inAutoType);
+ 
++    m_plugin->raiseWindow(m_windowFromGlobal);
++
+     m_inAutoType = false;
+-    performAutoType(entry, Q_NULLPTR, sequence, m_windowFromGlobal);
++    performAutoType(entry, nullptr, sequence, m_windowFromGlobal);
+ }
+ 
+ void AutoType::resetInAutoType()
+@@ -233,12 +235,12 @@
+ {
+     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 -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/AutoType.h keepassx/src/autotype/AutoType.h
+--- keepassx-2.0-beta2/src/autotype/AutoType.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/autotype/AutoType.h	2015-10-11 10:44:51.877209219 +0200
+@@ -22,8 +22,6 @@
+ #include <QStringList>
+ #include <QWidget>
+ 
+-#include "core/Global.h"
+-
+ class AutoTypeAction;
+ class AutoTypeExecutor;
+ class AutoTypePlatformInterface;
+@@ -37,7 +35,7 @@
+ 
+ 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 @@
+     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 -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/AutoTypePlatformPlugin.h keepassx/src/autotype/AutoTypePlatformPlugin.h
+--- keepassx-2.0-beta2/src/autotype/AutoTypePlatformPlugin.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/autotype/AutoTypePlatformPlugin.h	2015-10-11 10:44:51.877209219 +0200
+@@ -33,6 +33,7 @@
+     virtual void unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) = 0;
+     virtual int platformEventFilter(void* event) = 0;
+     virtual int initialTimeout() = 0;
++    virtual bool raiseWindow(WId window) = 0;
+     virtual void unload() {}
+ 
+     virtual AutoTypeExecutor* createExecutor() = 0;
+diff -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/AutoTypeSelectDialog.h keepassx/src/autotype/AutoTypeSelectDialog.h
+--- keepassx-2.0-beta2/src/autotype/AutoTypeSelectDialog.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/autotype/AutoTypeSelectDialog.h	2015-10-11 10:44:51.877209219 +0200
+@@ -22,8 +22,6 @@
+ #include <QDialog>
+ #include <QHash>
+ 
+-#include "core/Global.h"
+-
+ class AutoTypeSelectView;
+ class Entry;
+ 
+@@ -32,7 +30,7 @@
+     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 -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/AutoTypeSelectView.h keepassx/src/autotype/AutoTypeSelectView.h
+--- keepassx-2.0-beta2/src/autotype/AutoTypeSelectView.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/autotype/AutoTypeSelectView.h	2015-10-11 10:44:51.877209219 +0200
+@@ -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 @@
+     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 -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/CMakeLists.txt keepassx/src/autotype/CMakeLists.txt
+--- keepassx-2.0-beta2/src/autotype/CMakeLists.txt	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/autotype/CMakeLists.txt	2015-10-11 10:44:51.877209219 +0200
+@@ -1,11 +1,12 @@
+-if(Q_WS_X11)
++if(UNIX AND NOT APPLE)
+   find_package(X11)
+-  if(PRINT_SUMMARY)
+-    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_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 -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/ShortcutWidget.h keepassx/src/autotype/ShortcutWidget.h
+--- keepassx-2.0-beta2/src/autotype/ShortcutWidget.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/autotype/ShortcutWidget.h	2015-10-11 10:44:51.880542689 +0200
+@@ -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 -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/test/AutoTypeTest.cpp keepassx/src/autotype/test/AutoTypeTest.cpp
+--- keepassx-2.0-beta2/src/autotype/test/AutoTypeTest.cpp	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/autotype/test/AutoTypeTest.cpp	2015-10-11 10:44:51.880542689 +0200
+@@ -103,6 +103,13 @@
+     return 0;
+ }
+ 
++bool AutoTypePlatformTest::raiseWindow(WId window)
++{
++    Q_UNUSED(window);
++
++    return false;
++}
++
+ AutoTypeExecturorTest::AutoTypeExecturorTest(AutoTypePlatformTest* platform)
+     : m_platform(platform)
+ {
+@@ -117,5 +124,3 @@
+ {
+     m_platform->addActionKey(action);
+ }
+-
+-Q_EXPORT_PLUGIN2(keepassx-autotype-test, AutoTypePlatformTest)
+diff -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/test/AutoTypeTest.h keepassx/src/autotype/test/AutoTypeTest.h
+--- keepassx-2.0-beta2/src/autotype/test/AutoTypeTest.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/autotype/test/AutoTypeTest.h	2015-10-11 10:44:51.880542689 +0200
+@@ -23,32 +23,33 @@
+ #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);
++    QString keyToString(Qt::Key key) Q_DECL_OVERRIDE;
+ 
+-    QStringList windowTitles();
+-    WId activeWindow();
+-    QString activeWindowTitle();
+-    bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers);
+-    void unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers);
+-    int platformEventFilter(void* event);
+-    int initialTimeout();
+-    AutoTypeExecutor* createExecutor();
+-
+-    void setActiveWindowTitle(const QString& title);
+-
+-    QString actionChars();
+-    int actionCount();
+-    void clearActions();
++    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;
++
++    void setActiveWindowTitle(const QString& title) Q_DECL_OVERRIDE;
++
++    QString actionChars() Q_DECL_OVERRIDE;
++    int actionCount() Q_DECL_OVERRIDE;
++    void clearActions() Q_DECL_OVERRIDE;
+ 
+     void addActionChar(AutoTypeChar* action);
+     void addActionKey(AutoTypeKey* action);
+@@ -67,8 +68,8 @@
+ public:
+     explicit AutoTypeExecturorTest(AutoTypePlatformTest* platform);
+ 
+-    void execChar(AutoTypeChar* action);
+-    void execKey(AutoTypeKey* action);
++    void execChar(AutoTypeChar* action) Q_DECL_OVERRIDE;
++    void execKey(AutoTypeKey* action) Q_DECL_OVERRIDE;
+ 
+ private:
+     AutoTypePlatformTest* const m_platform;
+diff -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/test/CMakeLists.txt keepassx/src/autotype/test/CMakeLists.txt
+--- keepassx-2.0-beta2/src/autotype/test/CMakeLists.txt	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/autotype/test/CMakeLists.txt	2015-10-11 10:44:51.880542689 +0200
+@@ -2,11 +2,5 @@
+     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 -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/WindowSelectComboBox.h keepassx/src/autotype/WindowSelectComboBox.h
+--- keepassx-2.0-beta2/src/autotype/WindowSelectComboBox.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/autotype/WindowSelectComboBox.h	2015-10-11 10:44:51.880542689 +0200
+@@ -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 -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/x11/AutoTypeX11.cpp keepassx/src/autotype/x11/AutoTypeX11.cpp
+--- keepassx-2.0-beta2/src/autotype/x11/AutoTypeX11.cpp	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/autotype/x11/AutoTypeX11.cpp	1970-01-01 01:00:00.000000000 +0100
+@@ -1,773 +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_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();
+-}
+-
+-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::focusWidget()
+-            && 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 != NULL) XkbFreeKeyboard(m_xkb, XkbAllComponentsMask, True);
+-
+-    XDeviceInfo* devices;
+-    int num_devices;
+-    XID keyboard_id = XkbUseCoreKbd;
+-    devices = XListInputDevices(m_dpy, &num_devices);
+-
+-    for (int i = 0; i < num_devices; i++) {
+-        if (QString(devices[i].name) == "Virtual core XTEST keyboard") {
+-            keyboard_id = devices[i].id;
+-            break;
+-        }
+-    }
+-
+-    m_xkb = XkbGetKeyboard(m_dpy, XkbCompatMapMask | XkbGeometryMask, keyboard_id);
+-
+-    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;
+-}
+-
+-// --------------------------------------------------------------------------
+-// 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;
+-    XTestFakeKeyEvent(event->display, event->keycode, event->type == KeyPress, 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;
+-}
+-
+-Q_EXPORT_PLUGIN2(keepassx-autotype-x11, AutoTypePlatformX11)
+diff -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/x11/AutoTypeX11.h keepassx/src/autotype/x11/AutoTypeX11.h
+--- keepassx-2.0-beta2/src/autotype/x11/AutoTypeX11.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/autotype/x11/AutoTypeX11.h	1970-01-01 01:00:00.000000000 +0100
+@@ -1,130 +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();
+-    void unload() Q_DECL_OVERRIDE;
+-    QStringList windowTitles();
+-    WId activeWindow();
+-    QString activeWindowTitle();
+-    bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers);
+-    void unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers);
+-    int platformEventFilter(void* event);
+-    int initialTimeout();
+-    AutoTypeExecutor* createExecutor();
+-
+-    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);
+-
+-    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;
+-    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);
+-    void execKey(AutoTypeKey* action);
+-
+-private:
+-    AutoTypePlatformX11* const m_platform;
+-};
+-
+-#endif // KEEPASSX_AUTOTYPEX11_H
+diff -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/x11/CMakeLists.txt keepassx/src/autotype/x11/CMakeLists.txt
+--- keepassx-2.0-beta2/src/autotype/x11/CMakeLists.txt	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/autotype/x11/CMakeLists.txt	1970-01-01 01:00:00.000000000 +0100
+@@ -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_XTest_LIB})
+-install(TARGETS keepassx-autotype-x11
+-        BUNDLE DESTINATION . COMPONENT Runtime
+-        LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR} COMPONENT Runtime)
+diff -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/x11/KeySymMap.h keepassx/src/autotype/x11/KeySymMap.h
+--- keepassx-2.0-beta2/src/autotype/x11/KeySymMap.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/autotype/x11/KeySymMap.h	1970-01-01 01:00:00.000000000 +0100
+@@ -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 -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/x11/keysymmap.py keepassx/src/autotype/x11/keysymmap.py
+--- keepassx-2.0-beta2/src/autotype/x11/keysymmap.py	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/autotype/x11/keysymmap.py	1970-01-01 01:00:00.000000000 +0100
+@@ -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 -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/xcb/AutoTypeXCB.cpp keepassx/src/autotype/xcb/AutoTypeXCB.cpp
+--- keepassx-2.0-beta2/src/autotype/xcb/AutoTypeXCB.cpp	1970-01-01 01:00:00.000000000 +0100
++++ keepassx/src/autotype/xcb/AutoTypeXCB.cpp	2015-10-11 10:44:51.880542689 +0200
+@@ -0,0 +1,834 @@
++/*
++ *  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 <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();
++}
++
++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::focusWidget()
++                && 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 = 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 != NULL) XkbFreeKeyboard(m_xkb, XkbAllComponentsMask, True);
++
++    XDeviceInfo* devices;
++    int num_devices;
++    XID keyboard_id = XkbUseCoreKbd;
++    devices = XListInputDevices(m_dpy, &num_devices);
++
++    for (int i = 0; i < num_devices; i++) {
++        if (QString(devices[i].name) == "Virtual core XTEST keyboard") {
++            keyboard_id = devices[i].id;
++            break;
++        }
++    }
++
++    m_xkb = XkbGetKeyboard(m_dpy, XkbCompatMapMask | XkbGeometryMask, keyboard_id);
++
++    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;
++}
++
++// --------------------------------------------------------------------------
++// 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 -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/xcb/AutoTypeXCB.h keepassx/src/autotype/xcb/AutoTypeXCB.h
+--- keepassx-2.0-beta2/src/autotype/xcb/AutoTypeXCB.h	1970-01-01 01:00:00.000000000 +0100
++++ keepassx/src/autotype/xcb/AutoTypeXCB.h	2015-10-11 10:44:51.880542689 +0200
+@@ -0,0 +1,132 @@
++/*
++ *  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();
++    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);
++
++    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_AUTOTYPEXCB_H
+diff -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/xcb/CMakeLists.txt keepassx/src/autotype/xcb/CMakeLists.txt
+--- keepassx-2.0-beta2/src/autotype/xcb/CMakeLists.txt	1970-01-01 01:00:00.000000000 +0100
++++ keepassx/src/autotype/xcb/CMakeLists.txt	2015-10-11 10:44:51.880542689 +0200
+@@ -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 -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/xcb/KeySymMap.h keepassx/src/autotype/xcb/KeySymMap.h
+--- keepassx-2.0-beta2/src/autotype/xcb/KeySymMap.h	1970-01-01 01:00:00.000000000 +0100
++++ keepassx/src/autotype/xcb/KeySymMap.h	2015-10-11 10:44:51.880542689 +0200
+@@ -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 -urN -x .git -x .tx keepassx-2.0-beta2/src/autotype/xcb/keysymmap.py keepassx/src/autotype/xcb/keysymmap.py
+--- keepassx-2.0-beta2/src/autotype/xcb/keysymmap.py	1970-01-01 01:00:00.000000000 +0100
++++ keepassx/src/autotype/xcb/keysymmap.py	2015-10-11 10:44:51.880542689 +0200
+@@ -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 -urN -x .git -x .tx keepassx-2.0-beta2/src/CMakeLists.txt keepassx/src/CMakeLists.txt
+--- keepassx-2.0-beta2/src/CMakeLists.txt	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/CMakeLists.txt	2015-10-11 10:44:51.877209219 +0200
+@@ -54,9 +54,6 @@
+     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 @@
+     core/Tools.cpp
+     core/Translator.cpp
+     core/Uuid.cpp
+-    core/qcommandlineoption.cpp
+-    core/qcommandlineparser.cpp
+     crypto/Crypto.cpp
+     crypto/CryptoHash.cpp
+     crypto/Random.cpp
+@@ -131,93 +126,10 @@
+     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/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
+@@ -245,17 +157,18 @@
+       ${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})
+ 
+@@ -273,7 +186,7 @@
+ 
+ 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}")
+@@ -291,7 +204,7 @@
+   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 -urN -x .git -x .tx keepassx-2.0-beta2/src/config-keepassx.h.cmake keepassx/src/config-keepassx.h.cmake
+--- keepassx-2.0-beta2/src/config-keepassx.h.cmake	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/config-keepassx.h.cmake	2015-10-11 10:44:51.880542689 +0200
+@@ -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 -urN -x .git -x .tx keepassx-2.0-beta2/src/core/AutoTypeAssociations.h keepassx/src/core/AutoTypeAssociations.h
+--- keepassx-2.0-beta2/src/core/AutoTypeAssociations.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/core/AutoTypeAssociations.h	2015-10-11 10:44:51.880542689 +0200
+@@ -20,8 +20,6 @@
+ 
+ #include <QObject>
+ 
+-#include "core/Global.h"
+-
+ class AutoTypeAssociations : public QObject
+ {
+     Q_OBJECT
+@@ -36,7 +34,7 @@
+         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 -urN -x .git -x .tx keepassx-2.0-beta2/src/core/Config.cpp keepassx/src/core/Config.cpp
+--- keepassx-2.0-beta2/src/core/Config.cpp	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/core/Config.cpp	2015-10-11 10:44:51.880542689 +0200
+@@ -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 @@
+     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 @@
+ 
+     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 -urN -x .git -x .tx keepassx-2.0-beta2/src/core/Config.h keepassx/src/core/Config.h
+--- keepassx-2.0-beta2/src/core/Config.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/core/Config.h	2015-10-11 10:44:51.880542689 +0200
+@@ -21,8 +21,6 @@
+ #include <QScopedPointer>
+ #include <QVariant>
+ 
+-#include "core/Global.h"
+-
+ class QSettings;
+ 
+ class Config : public QObject
+diff -urN -x .git -x .tx keepassx-2.0-beta2/src/core/Database.cpp keepassx/src/core/Database.cpp
+--- keepassx-2.0-beta2/src/core/Database.cpp	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/core/Database.cpp	2015-10-11 10:44:51.880542689 +0200
+@@ -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 @@
+         }
+     }
+ 
+-    return Q_NULLPTR;
++    return nullptr;
+ }
+ 
+ Group* Database::resolveGroup(const Uuid& uuid)
+@@ -126,7 +125,7 @@
+         }
+     }
+ 
+-    return Q_NULLPTR;
++    return nullptr;
+ }
+ 
+ QList<DeletedObject> Database::deletedObjects()
+@@ -143,7 +142,7 @@
+ 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 @@
+     m_data.transformedMasterKey = transformedMasterKey;
+     m_data.hasKey = true;
+     if (updateChangedTime) {
+-        m_metadata->setMasterKeyChanged(Tools::currentDateTimeUtc());
++        m_metadata->setMasterKeyChanged(QDateTime::currentDateTimeUtc());
+     }
+     Q_EMIT modifiedImmediate();
+ 
+diff -urN -x .git -x .tx keepassx-2.0-beta2/src/core/Database.h keepassx/src/core/Database.h
+--- keepassx-2.0-beta2/src/core/Database.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/core/Database.h	2015-10-11 10:44:51.880542689 +0200
+@@ -20,6 +20,7 @@
+ 
+ #include <QDateTime>
+ #include <QHash>
++#include <QObject>
+ 
+ #include "core/Uuid.h"
+ #include "keys/CompositeKey.h"
+diff -urN -x .git -x .tx keepassx-2.0-beta2/src/core/DatabaseIcons.cpp keepassx/src/core/DatabaseIcons.cpp
+--- keepassx-2.0-beta2/src/core/DatabaseIcons.cpp	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/core/DatabaseIcons.cpp	2015-10-11 10:44:51.880542689 +0200
+@@ -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 -urN -x .git -x .tx keepassx-2.0-beta2/src/core/DatabaseIcons.h keepassx/src/core/DatabaseIcons.h
+--- keepassx-2.0-beta2/src/core/DatabaseIcons.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/core/DatabaseIcons.h	2015-10-11 10:44:51.880542689 +0200
+@@ -23,8 +23,6 @@
+ #include <QPixmapCache>
+ #include <QVector>
+ 
+-#include "core/Global.h"
+-
+ class DatabaseIcons
+ {
+ public:
+diff -urN -x .git -x .tx keepassx-2.0-beta2/src/core/EntryAttachments.h keepassx/src/core/EntryAttachments.h
+--- keepassx-2.0-beta2/src/core/EntryAttachments.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/core/EntryAttachments.h	2015-10-11 10:44:51.880542689 +0200
+@@ -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 -urN -x .git -x .tx keepassx-2.0-beta2/src/core/EntryAttributes.h keepassx/src/core/EntryAttributes.h
+--- keepassx-2.0-beta2/src/core/EntryAttributes.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/core/EntryAttributes.h	2015-10-11 10:44:51.880542689 +0200
+@@ -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 -urN -x .git -x .tx keepassx-2.0-beta2/src/core/Entry.cpp keepassx/src/core/Entry.cpp
+--- keepassx-2.0-beta2/src/core/Entry.cpp	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/core/Entry.cpp	2015-10-11 10:44:51.880542689 +0200
+@@ -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 @@
+     : 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 @@
+ 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());
+     }
+ }
+ 
+@@ -211,7 +210,7 @@
+ 
+ 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()
+@@ -466,7 +465,7 @@
+     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);
+@@ -514,7 +513,7 @@
+         delete m_tmpHistoryItem;
+     }
+ 
+-    m_tmpHistoryItem = Q_NULLPTR;
++    m_tmpHistoryItem = nullptr;
+ }
+ 
+ void Entry::updateModifiedSinceBegin()
+@@ -560,7 +559,7 @@
+     QObject::setParent(group);
+ 
+     if (m_updateTimeinfo) {
+-        m_data.timeInfo.setLocationChanged(Tools::currentDateTimeUtc());
++        m_data.timeInfo.setLocationChanged(QDateTime::currentDateTimeUtc());
+     }
+ }
+ 
+@@ -575,7 +574,7 @@
+         return m_group->database();
+     }
+     else {
+-        return Q_NULLPTR;
++        return nullptr;
+     }
+ }
+ 
+diff -urN -x .git -x .tx keepassx-2.0-beta2/src/core/Entry.h keepassx/src/core/Entry.h
+--- keepassx-2.0-beta2/src/core/Entry.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/core/Entry.h	2015-10-11 10:44:51.880542689 +0200
+@@ -30,7 +30,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 -urN -x .git -x .tx keepassx-2.0-beta2/src/core/FilePath.cpp keepassx/src/core/FilePath.cpp
+--- keepassx-2.0-beta2/src/core/FilePath.cpp	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/core/FilePath.cpp	2015-10-11 10:44:51.880542689 +0200
+@@ -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 -urN -x .git -x .tx keepassx-2.0-beta2/src/core/FilePath.h keepassx/src/core/FilePath.h
+--- keepassx-2.0-beta2/src/core/FilePath.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/core/FilePath.h	2015-10-11 10:44:51.880542689 +0200
+@@ -22,8 +22,6 @@
+ #include <QIcon>
+ #include <QString>
+ 
+-#include "core/Global.h"
+-
+ class FilePath
+ {
+ public:
+diff -urN -x .git -x .tx keepassx-2.0-beta2/src/core/Global.h keepassx/src/core/Global.h
+--- keepassx-2.0-beta2/src/core/Global.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/core/Global.h	2015-10-11 10:44:51.880542689 +0200
+@@ -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 -urN -x .git -x .tx keepassx-2.0-beta2/src/core/Group.cpp keepassx/src/core/Group.cpp
+--- keepassx-2.0-beta2/src/core/Group.cpp	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/core/Group.cpp	2015-10-11 10:44:51.880542689 +0200
+@@ -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 @@
+ 
+     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 @@
+ void Group::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());
+     }
+ }
+ 
+@@ -186,7 +185,7 @@
+ 
+ bool Group::isExpired() const
+ {
+-    return m_data.timeInfo.expires() && m_data.timeInfo.expiryTime() < Tools::currentDateTimeUtc();
++    return m_data.timeInfo.expires() && m_data.timeInfo.expiryTime() < QDateTime::currentDateTimeUtc();
+ }
+ 
+ void Group::setUuid(const Uuid& uuid)
+@@ -352,7 +351,7 @@
+     }
+ 
+     if (m_updateTimeinfo) {
+-        m_data.timeInfo.setLocationChanged(Tools::currentDateTimeUtc());
++        m_data.timeInfo.setLocationChanged(QDateTime::currentDateTimeUtc());
+     }
+ 
+     Q_EMIT modified();
+@@ -372,7 +371,7 @@
+ 
+     cleanupParent();
+ 
+-    m_parent = Q_NULLPTR;
++    m_parent = nullptr;
+     recSetDatabase(db);
+ 
+     QObject::setParent(db);
+@@ -497,7 +496,7 @@
+ 
+     clonedGroup->setUpdateTimeinfo(true);
+ 
+-    QDateTime now = Tools::currentDateTimeUtc();
++    QDateTime now = QDateTime::currentDateTimeUtc();
+     clonedGroup->m_data.timeInfo.setCreationTime(now);
+     clonedGroup->m_data.timeInfo.setLastModificationTime(now);
+     clonedGroup->m_data.timeInfo.setLastAccessTime(now);
+diff -urN -x .git -x .tx keepassx-2.0-beta2/src/core/InactivityTimer.h keepassx/src/core/InactivityTimer.h
+--- keepassx-2.0-beta2/src/core/InactivityTimer.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/core/InactivityTimer.h	2015-10-11 10:44:51.880542689 +0200
+@@ -21,8 +21,6 @@
+ #include <QMutex>
+ #include <QObject>
+ 
+-#include "core/Global.h"
+-
+ class QTimer;
+ 
+ class InactivityTimer : public QObject
+@@ -30,7 +28,7 @@
+     Q_OBJECT
+ 
+ public:
+-    explicit InactivityTimer(QObject* parent = Q_NULLPTR);
++    explicit InactivityTimer(QObject* parent = nullptr);
+     void setInactivityTimeout(int inactivityTimeout);
+     void activate();
+     void deactivate();
+diff -urN -x .git -x .tx keepassx-2.0-beta2/src/core/Metadata.cpp keepassx/src/core/Metadata.cpp
+--- keepassx-2.0-beta2/src/core/Metadata.cpp	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/core/Metadata.cpp	2015-10-11 10:44:51.880542689 +0200
+@@ -42,7 +42,7 @@
+     m_data.protectNotes = false;
+     // m_data.autoEnableVisualHiding = false;
+ 
+-    QDateTime now = Tools::currentDateTimeUtc();
++    QDateTime now = QDateTime::currentDateTimeUtc();
+     m_data.nameChanged = now;
+     m_data.descriptionChanged = now;
+     m_data.defaultUserNameChanged = now;
+@@ -67,7 +67,7 @@
+     if (property != value) {
+         property = value;
+         if (m_updateDatetime) {
+-            dateTime = Tools::currentDateTimeUtc();
++            dateTime = QDateTime::currentDateTimeUtc();
+         }
+         Q_EMIT modified();
+         return true;
+diff -urN -x .git -x .tx keepassx-2.0-beta2/src/core/Metadata.h keepassx/src/core/Metadata.h
+--- keepassx-2.0-beta2/src/core/Metadata.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/core/Metadata.h	2015-10-11 10:44:51.880542689 +0200
+@@ -24,7 +24,6 @@
+ #include <QImage>
+ #include <QPointer>
+ 
+-#include "core/Global.h"
+ #include "core/Uuid.h"
+ 
+ class Database;
+@@ -35,7 +34,7 @@
+     Q_OBJECT
+ 
+ public:
+-    explicit Metadata(QObject* parent = Q_NULLPTR);
++    explicit Metadata(QObject* parent = nullptr);
+ 
+     struct MetadataData
+     {
+diff -urN -x .git -x .tx keepassx-2.0-beta2/src/core/PasswordGenerator.h keepassx/src/core/PasswordGenerator.h
+--- keepassx-2.0-beta2/src/core/PasswordGenerator.h	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/core/PasswordGenerator.h	2015-10-11 10:44:51.880542689 +0200
+@@ -22,8 +22,6 @@
+ #include <QString>
+ #include <QVector>
+ 
+-#include "core/Global.h"
+-
+ typedef QVector<QChar> PasswordGroup;
+ 
+ class PasswordGenerator
+diff -urN -x .git -x .tx keepassx-2.0-beta2/src/core/qcommandlineoption.cpp keepassx/src/core/qcommandlineoption.cpp
+--- keepassx-2.0-beta2/src/core/qcommandlineoption.cpp	2015-09-06 23:41:29.000000000 +0200
++++ keepassx/src/core/qcommandlineoption.cpp	1970-01-01 01:00:00.000000000 +0100
+@@ -1,305 +0,0 @@
+-/****************************************************************************
+-**
+-** Copyright (C) 2013 Laszlo Papp <lpapp at kde.org>
+-** Copyright (C) 2013 David Faure <faure at kde.org>
+-** Contact: http://www.qt-project.org/legal
+-**
+-** This file is part of the QtCore module of the Qt Toolkit.
+-**
+-** $QT_BEGIN_LICENSE:LGPL$
+-** Commercial License Usage
+-** Licensees holding valid commercial Qt licenses may use this file in
+-** accordance with the commercial license agreement provided with the
+-** Software or, alternatively, in accordance with the terms contained in
+-** a written agreement between you and Digia.  For licensing terms and
+-** conditions see http://qt.digia.com/licensing.  For further information
+-** use the contact form at http://qt.digia.com/contact-us.
+-**
+-** GNU Lesser General Public License Usage
+-** Alternatively, this file may be used under the terms of the GNU Lesser
+-** General Public License version 2.1 as published by the Free Software
+-** Foundation and appearing in the file LICENSE.LGPL included in the
+-** packaging of this file.  Please review the following information to
+-** ensure the GNU Lesser General Public License version 2.1 requirements
+-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+-**
+-** In addition, as a special exception, Digia gives you certain additional
+-** rights.  These rights are described in the Digia Qt LGPL Exception
+-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+-**
+-** GNU General Public License Usage
+-** Alternatively, this file may be used under the terms of the GNU
+-** General Public License version 3.0 as published by the Free Software
+-** Foundation and appearing in the file LICENSE.GPL included in the
+-** packaging of this file.  Please review the following information to
+-** ensure the GNU General Public License version 3.0 requirements will be
+-** met: http://www.gnu.org/copyleft/gpl.html.
+-**
+-**
+-** $QT_END_LICENSE$
+-**
+-****************************************************************************/
+-
+-#include "qcommandlineoption.h"
+-
+-#include <QSet>
+-
+-class QCommandLineOptionPrivate : public QSharedData
+-{
+-public:
+-    inline QCommandLineOptionPrivate()
+-    { }
+-
+-    void setNames(const QStringList &nameList);
+-
+-    //! The list of names used for this option.
+-    QStringList names;
+-
+-    //! The documentation name for the value, if one is expected
+-    //! Example: "-o <file>" means valueName == "file"
+-    QString valueName;
+-
+-    //! The description used for this option.
+-    QString description;
+-
+-    //! The list of default values used for this option.
+-    QStringList defaultValues;
+-};
+-
+-/*!
+-    \since 5.2
+-    \class QCommandLineOption
+-    \brief The QCommandLineOption class defines a possible command-line option.
+-    \inmodule QtCore
+-    \ingroup shared
+-    \ingroup tools
+-
+-    This class is used to describe an option on the command line. It allows
+-    different ways of defining the same option with multiple aliases possible.
+-    It is also used to describe how the option is used - it may be a flag (e.g. \c{-v})
+-    or take an argument (e.g. \c{-o file}).
+-
+-    Examples:
+-    \snippet code/src_corelib_tools_qcommandlineoption.cpp 0
+-
+-    \sa QCommandLineParser
+-*/
+-
+-/*!
+-    Constructs a command line option object with the given arguments.
+-
+-    The name of the option is set to \a name.
+-    The name can be either short or long. If the name is one character in
+-    length, it is considered a short name. Option names must not be empty,
+-    must not start with a dash or a slash character, must not contain a \c{=}
+-    and cannot be repeated.
+-
+-    The description is set to \a description. It is customary to add a "."
+-    at the end of the description.
+-
+-    In addition, the \a valueName can be set if the option expects a value.
+-    The default value for the option is set to \a defaultValue.
+-
+-    \sa setDescription(), setValueName(), setDefaultValues()
+-*/
+-QCommandLineOption::QCommandLineOption(const QString &name, const QString &description,
+-                                       const QString &valueName,
+-                                       const QString &defaultValue)
+-    : d(new QCommandLineOptionPrivate)
+-{
+-    d->setNames(QStringList(name));
+-    setValueName(valueName);
+-    setDescription(description);
+-    setDefaultValue(defaultValue);
+-}
+-
+-/*!
+-    Constructs a command line option object with the given arguments.
+-
+-    This overload allows to set multiple names for the option, for instance
+-    \c{o} and \c{output}.
+-
+-    The names of the option are set to \a names.
+-    The names can be either short or long. Any name in the list that is one
+-    character in length is a short name. Option names must not be empty,
+-    must not start with a dash or a slash character, must not contain a \c{=}
+-    and cannot be repeated.
+-
+-    The description is set to \a description. It is customary to add a "."
+-    at the end of the description.
+-
+-    In addition, the \a valueName can be set if the option expects a value.
+-    The default value for the option is set to \a defaultValue.
+-
+-    \sa setDescription(), setValueName(), setDefaultValues()
+-*/
+-QCommandLineOption::QCommandLineOption(const QStringList &names, const QString &description,
+-                                       const QString &valueName,
+-                                       const QString &defaultValue)
+-    : d(new QCommandLineOptionPrivate)
+-{
+-    d->setNames(names);
+-    setValueName(valueName);
+-    setDescription(description);
+-    setDefaultValue(defaultValue);
+-}
+-
+-/*!
+-    Constructs a QCommandLineOption object that is a copy of the QCommandLineOption
+-    object \a other.
+-
+-    \sa operator=()
+-*/
+-QCommandLineOption::QCommandLineOption(const QCommandLineOption &other)
+-    : d(other.d)
+-{
+-}
+-
+-/*!
+-    Destroys the command line option object.
+-*/
+-QCommandLineOption::~QCommandLineOption()
+-{
+-}
+-
+-/*!
+-    Makes a copy of the \a other object and assigns it to this QCommandLineOption
+-    object.
+-*/
+-QCommandLineOption &QCommandLineOption::operator=(const QCommandLineOption &other)
+-{
+-    d = other.d;
+-    return *this;
+-}
+-
+-/*!
+-    Returns the names set for this option.
+- */
+-QStringList QCommandLineOption::names() const
+-{
+-    return d->names;
+-}
+-
+-void QCommandLineOptionPrivate::setNames(const QStringList &nameList)
+-{
+-    QStringList newNames;
+-    if (nameList.isEmpty())
+-        qWarning("QCommandLineOption: Options must have at least one name");
+-    Q_FOREACH (const QString &name, nameList) {
+-        if (name.isEmpty()) {
+-            qWarning("QCommandLineOption: Option names cannot be empty");
+-        } else {
+-            const QChar c = name.at(0);
+-            if (c == QLatin1Char('-'))
+-                qWarning("QCommandLineOption: Option names cannot start with a '-'");
+-            else if (c == QLatin1Char('/'))
+-                qWarning("QCommandLineOption: Option names cannot start with a '/'");
+-            else if (name.contains(QLatin1Char('=')))
+-                qWarning("QCommandLineOption: Option names cannot contain a '='");
+-            else
+-                newNames.append(name);
+-        }
+-    }
<Skipped 8573 lines>
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/keepassx.git/commitdiff/28c3672f60ad5fb9b6c8537b35b3c498a6ed9953




More information about the pld-cvs-commit mailing list