Skip to content
This repository has been archived by the owner on Feb 12, 2023. It is now read-only.

Commit

Permalink
fix: Keep open and share X11 connection
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
yurivict committed Jul 23, 2017
1 parent ddc0723 commit ae5cb4b
Show file tree
Hide file tree
Showing 6 changed files with 118 additions and 5 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand Down
3 changes: 3 additions & 0 deletions qtox.pro
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 3 additions & 2 deletions src/platform/capslock_x11.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include <QtCore/qsystemdetection.h>
#if defined(Q_OS_UNIX) && !defined(__APPLE__) && !defined(__MACH__)
#include "src/platform/capslock.h"
#include "src/platform/x11_display.h"
#include <X11/XKBlib.h>
#undef KeyPress
#undef KeyRelease
Expand All @@ -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;
}

Expand Down
8 changes: 5 additions & 3 deletions src/platform/timer_x11.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,18 @@
#include <QtCore/qsystemdetection.h>
#if defined(Q_OS_UNIX) && !defined(__APPLE__) && !defined(__MACH__)
#include "src/platform/timer.h"
#include "src/platform/x11_display.h"
#include <QDebug>
#include <X11/extensions/scrnsaver.h>

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;
}

Expand All @@ -42,7 +44,7 @@ uint32_t Platform::getIdleTime()
} else
qDebug() << "XScreenSaverAllocInfo() failed";
}
XCloseDisplay(display);
X11Display::unlock();
return idleTime;
}

Expand Down
64 changes: 64 additions & 0 deletions src/platform/x11_display.cpp
Original file line number Diff line number Diff line change
@@ -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 changes: 42 additions & 0 deletions src/platform/x11_display.h
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit ae5cb4b

Please sign in to comment.