1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00

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.
This commit is contained in:
Yuri 2017-07-22 13:50:06 -07:00
parent ddc0723c5b
commit ae5cb4bcc2
6 changed files with 118 additions and 5 deletions

View File

@ -455,6 +455,7 @@ if (PLATFORM_EXTENSIONS)
src/platform/timer_osx.cpp src/platform/timer_osx.cpp
src/platform/timer_win.cpp src/platform/timer_win.cpp
src/platform/timer_x11.cpp src/platform/timer_x11.cpp
src/platform/x11_display.cpp
) )
endif() endif()

View File

@ -123,6 +123,9 @@ contains(DEFINES, QTOX_PLATFORM_EXT) {
SOURCES += src/platform/capslock_win.cpp \ SOURCES += src/platform/capslock_win.cpp \
src/platform/capslock_x11.cpp \ src/platform/capslock_x11.cpp \
src/platform/capslock_osx.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 # Rules for Windows, Mac OSX, and Linux

View File

@ -20,6 +20,7 @@
#include <QtCore/qsystemdetection.h> #include <QtCore/qsystemdetection.h>
#if defined(Q_OS_UNIX) && !defined(__APPLE__) && !defined(__MACH__) #if defined(Q_OS_UNIX) && !defined(__APPLE__) && !defined(__MACH__)
#include "src/platform/capslock.h" #include "src/platform/capslock.h"
#include "src/platform/x11_display.h"
#include <X11/XKBlib.h> #include <X11/XKBlib.h>
#undef KeyPress #undef KeyPress
#undef KeyRelease #undef KeyRelease
@ -28,14 +29,14 @@
bool Platform::capsLockEnabled() bool Platform::capsLockEnabled()
{ {
Display* d = XOpenDisplay((char*)0); Display* d = X11Display::lock();
bool caps_state = false; bool caps_state = false;
if (d) { if (d) {
unsigned n; unsigned n;
XkbGetIndicatorState(d, XkbUseCoreKbd, &n); XkbGetIndicatorState(d, XkbUseCoreKbd, &n);
caps_state = (n & 0x01) == 1; caps_state = (n & 0x01) == 1;
XCloseDisplay(d);
} }
X11Display::unlock();
return caps_state; return caps_state;
} }

View File

@ -18,6 +18,7 @@
#include <QtCore/qsystemdetection.h> #include <QtCore/qsystemdetection.h>
#if defined(Q_OS_UNIX) && !defined(__APPLE__) && !defined(__MACH__) #if defined(Q_OS_UNIX) && !defined(__APPLE__) && !defined(__MACH__)
#include "src/platform/timer.h" #include "src/platform/timer.h"
#include "src/platform/x11_display.h"
#include <QDebug> #include <QDebug>
#include <X11/extensions/scrnsaver.h> #include <X11/extensions/scrnsaver.h>
@ -25,9 +26,10 @@ uint32_t Platform::getIdleTime()
{ {
uint32_t idleTime = 0; uint32_t idleTime = 0;
Display* display = XOpenDisplay(NULL); Display* display = X11Display::lock();
if (!display) { if (!display) {
qDebug() << "XOpenDisplay(NULL) failed"; qDebug() << "XOpenDisplay failed";
X11Display::unlock();
return 0; return 0;
} }
@ -42,7 +44,7 @@ uint32_t Platform::getIdleTime()
} else } else
qDebug() << "XScreenSaverAllocInfo() failed"; qDebug() << "XScreenSaverAllocInfo() failed";
} }
XCloseDisplay(display); X11Display::unlock();
return idleTime; return idleTime;
} }

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
#include <QtCore/qsystemdetection.h>
#if defined(Q_OS_UNIX) && !defined(__APPLE__) && !defined(__MACH__)
#include "src/platform/x11_display.h"
#include <QMutex>
#include <X11/Xlib.h>
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__)

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
#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