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:
parent
ddc0723c5b
commit
ae5cb4bcc2
|
@ -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()
|
||||||
|
|
||||||
|
|
3
qtox.pro
3
qtox.pro
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
64
src/platform/x11_display.cpp
Normal file
64
src/platform/x11_display.cpp
Normal 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__)
|
42
src/platform/x11_display.h
Normal file
42
src/platform/x11_display.h
Normal 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
|
Loading…
Reference in New Issue
Block a user