From ae5cb4bcc27754f46d30209bf1658e49ff559dc7 Mon Sep 17 00:00:00 2001 From: Yuri Date: Sat, 22 Jul 2017 13:50:06 -0700 Subject: [PATCH] fix: Keep open and share X11 connection This prevents opening and closing of X11 connection and associated files every 1 second. X11 connection is used for userAutoAway feature and to read CapsLock status. --- CMakeLists.txt | 1 + qtox.pro | 3 ++ src/platform/capslock_x11.cpp | 5 +-- src/platform/timer_x11.cpp | 8 +++-- src/platform/x11_display.cpp | 64 +++++++++++++++++++++++++++++++++++ src/platform/x11_display.h | 42 +++++++++++++++++++++++ 6 files changed, 118 insertions(+), 5 deletions(-) create mode 100644 src/platform/x11_display.cpp create mode 100644 src/platform/x11_display.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 6aed8c874..35f596e2d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -455,6 +455,7 @@ if (PLATFORM_EXTENSIONS) src/platform/timer_osx.cpp src/platform/timer_win.cpp src/platform/timer_x11.cpp + src/platform/x11_display.cpp ) endif() diff --git a/qtox.pro b/qtox.pro index 5648ac87e..976fdbafa 100644 --- a/qtox.pro +++ b/qtox.pro @@ -123,6 +123,9 @@ contains(DEFINES, QTOX_PLATFORM_EXT) { SOURCES += src/platform/capslock_win.cpp \ src/platform/capslock_x11.cpp \ src/platform/capslock_osx.cpp + + HEADERS += src/platform/x11_display.h + SOURCES += src/platform/x11_display.cpp } # Rules for Windows, Mac OSX, and Linux diff --git a/src/platform/capslock_x11.cpp b/src/platform/capslock_x11.cpp index 7fccd0031..961e89db6 100644 --- a/src/platform/capslock_x11.cpp +++ b/src/platform/capslock_x11.cpp @@ -20,6 +20,7 @@ #include #if defined(Q_OS_UNIX) && !defined(__APPLE__) && !defined(__MACH__) #include "src/platform/capslock.h" +#include "src/platform/x11_display.h" #include #undef KeyPress #undef KeyRelease @@ -28,14 +29,14 @@ bool Platform::capsLockEnabled() { - Display* d = XOpenDisplay((char*)0); + Display* d = X11Display::lock(); bool caps_state = false; if (d) { unsigned n; XkbGetIndicatorState(d, XkbUseCoreKbd, &n); caps_state = (n & 0x01) == 1; - XCloseDisplay(d); } + X11Display::unlock(); return caps_state; } diff --git a/src/platform/timer_x11.cpp b/src/platform/timer_x11.cpp index 269687325..3ae086777 100644 --- a/src/platform/timer_x11.cpp +++ b/src/platform/timer_x11.cpp @@ -18,6 +18,7 @@ #include #if defined(Q_OS_UNIX) && !defined(__APPLE__) && !defined(__MACH__) #include "src/platform/timer.h" +#include "src/platform/x11_display.h" #include #include @@ -25,9 +26,10 @@ uint32_t Platform::getIdleTime() { uint32_t idleTime = 0; - Display* display = XOpenDisplay(NULL); + Display* display = X11Display::lock(); if (!display) { - qDebug() << "XOpenDisplay(NULL) failed"; + qDebug() << "XOpenDisplay failed"; + X11Display::unlock(); return 0; } @@ -42,7 +44,7 @@ uint32_t Platform::getIdleTime() } else qDebug() << "XScreenSaverAllocInfo() failed"; } - XCloseDisplay(display); + X11Display::unlock(); return idleTime; } diff --git a/src/platform/x11_display.cpp b/src/platform/x11_display.cpp new file mode 100644 index 000000000..69823e256 --- /dev/null +++ b/src/platform/x11_display.cpp @@ -0,0 +1,64 @@ +/* + Copyright © 2017 by The qTox Project Contributors + + This file is part of qTox, a Qt-based graphical interface for Tox. + + qTox is libre 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 3 of the License, or + (at your option) any later version. + + qTox 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 qTox. If not, see . +*/ + +#include +#if defined(Q_OS_UNIX) && !defined(__APPLE__) && !defined(__MACH__) +#include "src/platform/x11_display.h" +#include +#include + +namespace Platform { + +struct X11DisplayPrivate +{ + Display* display; + QMutex mutex; + + X11DisplayPrivate() + : display(XOpenDisplay(nullptr)) + { + } + ~X11DisplayPrivate() + { + if (display) { + XCloseDisplay(display); + } + } + static X11DisplayPrivate& getSingleInstance() + { + // object created on-demand + static X11DisplayPrivate singleInstance; + return singleInstance; + } +}; + +Display* X11Display::lock() +{ + X11DisplayPrivate& singleInstance = X11DisplayPrivate::getSingleInstance(); + singleInstance.mutex.lock(); + return singleInstance.display; +} + +void X11Display::unlock() +{ + X11DisplayPrivate::getSingleInstance().mutex.unlock(); +} +} + +#endif // Q_OS_UNIX && !defined(__APPLE__) && !defined(__MACH__) diff --git a/src/platform/x11_display.h b/src/platform/x11_display.h new file mode 100644 index 000000000..cf02a9e6c --- /dev/null +++ b/src/platform/x11_display.h @@ -0,0 +1,42 @@ +/* + Copyright © 2017 by The qTox Project Contributors + + This file is part of qTox, a Qt-based graphical interface for Tox. + + qTox is libre 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 3 of the License, or + (at your option) any later version. + + qTox 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 qTox. If not, see . +*/ + +#ifdef QTOX_PLATFORM_EXT + +#ifndef PLATFORM_X11_DISPLAY_H +#define PLATFORM_X11_DISPLAY_H + +#if defined(Q_OS_UNIX) && !defined(__APPLE__) && !defined(__MACH__) + +typedef struct _XDisplay Display; + +namespace Platform { + +namespace X11Display { +Display* lock(); +void unlock(); +} + +} + +#endif // Q_OS_UNIX && !defined(__APPLE__) && !defined(__MACH__) + +#endif // PLATFORM_X11_DISPLAY_H + +#endif // QTOX_PLATFORM_EXT