deskutils/charmtimetracker: fix idle detection on Wayland

Fetch an upstream patch to avoid a crash when using charmtimetracker
on Wayland. While this avoids the crash, there's no idle-check
any more, so time tracking is less convenient than it is on X11
(where you can get up and go for lunch and deal with the idle
time later).
This commit is contained in:
Adriaan de Groot 2021-05-03 12:32:32 +02:00
parent 5a4f78e2d1
commit 9d5d08cb80
2 changed files with 108 additions and 1 deletions

View File

@ -1,6 +1,6 @@
PORTNAME= charmtimetracker
DISTVERSION= 1.12.0
PORTREVISION= 4
PORTREVISION= 5
CATEGORIES= deskutils
# PATCH_SITES= https://github.com/${GH_ACCOUNT}/${GH_PROJECT}/commit/

View File

@ -0,0 +1,107 @@
Idle detection: Fix crash on Wayland
Check for screen saver extension before using it, avoids a crash on
Wayland (where xcb_screensaver_query_info_reply returns null).
Change-Id: Icecd2f930ed071eff573866784c8c52ccc272253
Reviewed-on: https://codereview.kdab.com/c/Charm/+/88868
Reviewed-by: Andras Mantia <andras@kdab.com>
Tested-by: Continuous Integration <build@kdab.com>
diff --git a/Charm/Idle/IdleDetector.cpp b/Charm/Idle/IdleDetector.cpp
index 24e0c457..1cc74460 100644
--- Charm/Idle/IdleDetector.cpp
+++ Charm/Idle/IdleDetector.cpp
@@ -45,24 +45,22 @@ IdleDetector::IdleDetector(QObject *parent)
IdleDetector *IdleDetector::createIdleDetector(QObject *parent)
{
#ifdef CHARM_IDLE_DETECTION
-#ifdef Q_OS_OSX
+#if (defined Q_OS_OSX)
return new MacIdleDetector(parent);
-#endif
-
-#ifdef Q_OS_WIN
+#elif (defined Q_OS_WIN)
return new WindowsIdleDetector(parent);
+#elif (defined CHARM_IDLE_DETECTION_AVAILABLE)
+ return new X11IdleDetector(parent);
+#else
+ auto unavailable = new IdleDetector(parent);
+ unavailable->setAvailable(false);
+ return unavailable;
#endif
-
-#ifdef CHARM_IDLE_DETECTION_AVAILABLE
- X11IdleDetector *detector = new X11IdleDetector(parent);
- detector->setAvailable(detector->idleCheckPossible());
- return detector;
-#endif
-#endif
-
- IdleDetector *unavailable = new IdleDetector(parent);
+#else
+ auto unavailable = new IdleDetector(parent);
unavailable->setAvailable(false);
return unavailable;
+#endif
}
bool IdleDetector::available() const
diff --git a/Charm/Idle/X11IdleDetector.cpp b/Charm/Idle/X11IdleDetector.cpp
index 4f03a418..796742a3 100644
--- Charm/Idle/X11IdleDetector.cpp
+++ Charm/Idle/X11IdleDetector.cpp
@@ -32,18 +32,20 @@
X11IdleDetector::X11IdleDetector(QObject *parent)
: IdleDetector(parent)
{
+ setAvailable(false);
+ m_connection = xcb_connect(NULL, NULL); // krazy:exclude=null
+ m_screen = xcb_setup_roots_iterator(xcb_get_setup(m_connection)).data;
+ if (!m_screen)
+ return;
+ auto query = xcb_get_extension_data(m_connection, &xcb_screensaver_id);
+ Q_ASSERT(query);
+ if (!query->present)
+ return;
+
connect(&m_timer, &QTimer::timeout, this, &X11IdleDetector::checkIdleness);
m_timer.start(idlenessDuration() * 1000 / 5);
m_heartbeat = QDateTime::currentDateTime();
-}
-
-bool X11IdleDetector::idleCheckPossible()
-{
- m_connection = xcb_connect(NULL, NULL); //krazy:exclude=null
- m_screen = xcb_setup_roots_iterator(xcb_get_setup(m_connection)).data;
- if (m_screen)
- return true;
- return false;
+ setAvailable(true);
}
void X11IdleDetector::onIdlenessDurationChanged()
diff --git a/Charm/Idle/X11IdleDetector.h b/Charm/Idle/X11IdleDetector.h
index 0b0f48ca..45ef9328 100644
--- Charm/Idle/X11IdleDetector.h
+++ Charm/Idle/X11IdleDetector.h
@@ -38,7 +38,6 @@ class X11IdleDetector : public IdleDetector
Q_OBJECT
public:
explicit X11IdleDetector(QObject *parent);
- bool idleCheckPossible();
protected:
void onIdlenessDurationChanged() override;
@@ -50,8 +49,8 @@ private Q_SLOTS:
QDateTime m_heartbeat;
QTimer m_timer;
#if defined(Q_OS_UNIX) && !defined(Q_OS_OSX)
- xcb_connection_t *m_connection;
- xcb_screen_t *m_screen;
+ xcb_connection_t *m_connection = nullptr;
+ xcb_screen_t *m_screen = nullptr;
#endif
};