File indexing completed on 2024-11-10 04:56:25
0001 /* 0002 KWin - the KDE window manager 0003 This file is part of the KDE project. 0004 0005 SPDX-FileCopyrightText: 2017 Martin Gräßlin <mgraesslin@kde.org> 0006 0007 SPDX-License-Identifier: GPL-2.0-or-later 0008 */ 0009 0010 #include <QTest> 0011 #include <private/qtx11extras_p.h> 0012 0013 #include "effect/xcb.h" 0014 #include "main.h" 0015 #include "utils/common.h" 0016 0017 namespace KWin 0018 { 0019 0020 class X11TestApplication : public Application 0021 { 0022 Q_OBJECT 0023 public: 0024 X11TestApplication(int &argc, char **argv); 0025 ~X11TestApplication() override; 0026 0027 protected: 0028 void performStartup() override; 0029 }; 0030 0031 X11TestApplication::X11TestApplication(int &argc, char **argv) 0032 : Application(OperationModeX11, argc, argv) 0033 { 0034 setX11Connection(QX11Info::connection()); 0035 setX11RootWindow(QX11Info::appRootWindow()); 0036 } 0037 0038 X11TestApplication::~X11TestApplication() 0039 { 0040 } 0041 0042 void X11TestApplication::performStartup() 0043 { 0044 } 0045 0046 } 0047 0048 class X11TimestampUpdateTest : public QObject 0049 { 0050 Q_OBJECT 0051 private Q_SLOTS: 0052 void testGrabAfterServerTime(); 0053 void testBeforeLastGrabTime(); 0054 }; 0055 0056 void X11TimestampUpdateTest::testGrabAfterServerTime() 0057 { 0058 // this test tries to grab the X keyboard with a timestamp in future 0059 // that should fail, but after updating the X11 timestamp, it should 0060 // work again 0061 KWin::kwinApp()->updateXTime(); 0062 QCOMPARE(KWin::grabXKeyboard(), true); 0063 KWin::ungrabXKeyboard(); 0064 0065 // now let's change the timestamp 0066 KWin::kwinApp()->setX11Time(KWin::xTime() + 5 * 60 * 1000); 0067 0068 // now grab keyboard should fail 0069 QCOMPARE(KWin::grabXKeyboard(), false); 0070 0071 // let's update timestamp, now it should work again 0072 KWin::kwinApp()->updateXTime(); 0073 QCOMPARE(KWin::grabXKeyboard(), true); 0074 KWin::ungrabXKeyboard(); 0075 } 0076 0077 void X11TimestampUpdateTest::testBeforeLastGrabTime() 0078 { 0079 // this test tries to grab the X keyboard with a timestamp before the 0080 // last grab time on the server. That should fail, but after updating the X11 0081 // timestamp it should work again 0082 0083 // first set the grab timestamp 0084 KWin::kwinApp()->updateXTime(); 0085 QCOMPARE(KWin::grabXKeyboard(), true); 0086 KWin::ungrabXKeyboard(); 0087 0088 // now go to past 0089 const auto timestamp = KWin::xTime(); 0090 KWin::kwinApp()->setX11Time(KWin::xTime() - 5 * 60 * 1000, KWin::Application::TimestampUpdate::Always); 0091 QCOMPARE(KWin::xTime(), timestamp - 5 * 60 * 1000); 0092 0093 // now grab keyboard should fail 0094 QCOMPARE(KWin::grabXKeyboard(), false); 0095 0096 // let's update timestamp, now it should work again 0097 KWin::kwinApp()->updateXTime(); 0098 QVERIFY(KWin::xTime() >= timestamp); 0099 QCOMPARE(KWin::grabXKeyboard(), true); 0100 KWin::ungrabXKeyboard(); 0101 } 0102 0103 int main(int argc, char *argv[]) 0104 { 0105 setenv("QT_QPA_PLATFORM", "xcb", true); 0106 KWin::X11TestApplication app(argc, argv); 0107 app.setAttribute(Qt::AA_Use96Dpi, true); 0108 X11TimestampUpdateTest tc; 0109 return QTest::qExec(&tc, argc, argv); 0110 } 0111 0112 #include "test_x11_timestamp_update.moc"