From 5480650d050895ab184186ee3813004da494fc30 Mon Sep 17 00:00:00 2001 From: David Faure Date: Tue, 4 Dec 2012 22:39:56 +0100 Subject: Initial creation of the qtx11support library. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This implements QX11Info again, for source compat with Qt4, on top of the XCB QPA backend. The API and the documentation are forward-ported from Qt4 (minus things that cannot be implemented anymore). The implementation, however, is new (by Richard Moore, in this initial commit). Change-Id: Iff9fd16fa6aaaa54f6d3cc0843b6b6fd08d5b1fb Reviewed-by: Richard J. Moore Reviewed-by: Lars Knoll Reviewed-by: Samuel Rødal --- .gitattributes | 3 + .gitignore | 126 +++++++++++++++ .qmake.conf | 1 + .tag | 1 + qtx11support.pro | 1 + src/src.pro | 2 + src/x11support/doc/qtx11support.qdocconf | 46 ++++++ src/x11support/qtx11supportglobal.h | 65 ++++++++ src/x11support/qx11info_x11.cpp | 262 +++++++++++++++++++++++++++++++ src/x11support/qx11info_x11.h | 82 ++++++++++ src/x11support/x11support.pro | 12 ++ sync.profile | 14 ++ 12 files changed, 615 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .qmake.conf create mode 100644 .tag create mode 100644 qtx11support.pro create mode 100644 src/src.pro create mode 100644 src/x11support/doc/qtx11support.qdocconf create mode 100644 src/x11support/qtx11supportglobal.h create mode 100644 src/x11support/qx11info_x11.cpp create mode 100644 src/x11support/qx11info_x11.h create mode 100644 src/x11support/x11support.pro create mode 100644 sync.profile diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..a96f8f5 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +.tag export-subst +.gitignore export-ignore +.gitattributes export-ignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4a5200a --- /dev/null +++ b/.gitignore @@ -0,0 +1,126 @@ +# This file is used to ignore files which are generated in the Qt build system +# ---------------------------------------------------------------------------- + +callgrind.out.* +pcviewer.cfg +*~ +*.a +*.la +*.core +*.moc +*.o +*.obj +*.orig +*.swp +*.rej +*.so +*.pbxuser +*.mode1 +*.mode1v3 +*_pch.h.cpp +*_resource.rc +.#* +*.*# +core +.qmake.cache +.qmake.vars +*.prl +tags +.DS_Store +*.debug +Makefile* +*.prl +*.app +*.pro.user +*.qmlproject.user +*.gcov +moc_*.cpp +ui_*.h +qrc_*.cpp + +# Test generated files +QObject.log +tst_* +!tst_*.* +tst_*.log +tst_*.debug +tst_*~ + +# xemacs temporary files +*.flc + +# Vim temporary files +.*.swp + +# Visual Studio generated files +*.ib_pdb_index +*.idb +*.ilk +*.pdb +*.sln +*.suo +*.vcproj +*vcproj.*.*.user +*.ncb +*.vcxproj +*.vcxproj.filters +*.vcxproj.user + +# MinGW generated files +*.Debug +*.Release + +# Symlinks generated by configure +.DS_Store +.pch +.rcc +*.app + + +# Directories to ignore +# --------------------- + +debug +include/* +include/*/* +lib/* +!lib/fonts +!lib/README +plugins/*/* +release +tmp +doc-build +doc/html/* +doc/qch +doc-build +.rcc +.pch +.metadata + +# runonphone crash dumps +d_exc_*.txt +d_exc_*.stk + +# Generated by abldfast.bat from devtools. +.abldsteps.* + +# Carbide project files +# --------------------- +.project +.cproject +.make.cache +*.d + +qtc-debugging-helper + +.pc/ + +# INTEGRITY generated files +*.gpj +*.int +*.ael +*.dla +*.dnm +*.dep +*.map +work diff --git a/.qmake.conf b/.qmake.conf new file mode 100644 index 0000000..42ba8e4 --- /dev/null +++ b/.qmake.conf @@ -0,0 +1 @@ +load(qt_build_config) diff --git a/.tag b/.tag new file mode 100644 index 0000000..6828f88 --- /dev/null +++ b/.tag @@ -0,0 +1 @@ +$Format:%H$ diff --git a/qtx11support.pro b/qtx11support.pro new file mode 100644 index 0000000..58c33f2 --- /dev/null +++ b/qtx11support.pro @@ -0,0 +1 @@ +load(qt_parts) diff --git a/src/src.pro b/src/src.pro new file mode 100644 index 0000000..97de7b0 --- /dev/null +++ b/src/src.pro @@ -0,0 +1,2 @@ +TEMPLATE = subdirs +SUBDIRS += x11support diff --git a/src/x11support/doc/qtx11support.qdocconf b/src/x11support/doc/qtx11support.qdocconf new file mode 100644 index 0000000..ba5db5c --- /dev/null +++ b/src/x11support/doc/qtx11support.qdocconf @@ -0,0 +1,46 @@ +include($QT_INSTALL_DOCS/global/qt-module-defaults.qdocconf) + +# Name of the project which must match the outputdir. Determines the .index file +project = qtx11support + +# Directories in which to search for files to document and images. +# By default set to the root directory of the project for sources +# and headers and qdoc will therefore generate output for each file. +# Images should be placed in /dic/images and examples in +# /examples. +# Paths are relative to the location of this file. +exampledirs += ../../../examples \ + snippets + +headerdirs += .. +imagedirs += images +sourcedirs += .. + +depends += qtcore qtwidgets + +# The following parameters are for creating a qhp file, the qhelpgenerator +# program can convert the qhp file into a qch file which can be opened in +# Qt Assistant and/or Qt Creator. + +# Defines the name of the project. You cannot use operators (+, =, -) in +# the name. Properties for this project are set using a qhp..property +# format. +qhp.projects = qtx11support + +# Sets the name of the output qhp file. +qhp.qtx11support.file = qtx11support.qhp + +# Namespace for the output file. This namespace is used to distinguish between +# different documentation files in Creator/Assistant. +qhp.qtx11support.namespace = org.qt-project.qtx11support.500 + +# Title for the package, will be the main title for the package in +# Assistant/Creator. +qhp.qtx11support.indexTitle = Qt X11 Support Documentation + +# Only update the name of the project for the next variables. +qhp.qtx11support.virtualFolder = qtx11support +qhp.qtx11support.subprojects = classes +qhp.qtx11support.subprojects.classes.title = Qt X11 Support C++ Classes +qhp.qtx11support.subprojects.classes.selectors = class fake:headerfile +qhp.qtx11support.subprojects.classes.sortPages = true diff --git a/src/x11support/qtx11supportglobal.h b/src/x11support/qtx11supportglobal.h new file mode 100644 index 0000000..054f9a0 --- /dev/null +++ b/src/x11support/qtx11supportglobal.h @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Intel Corporation. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QTX11SUPPORTGLOBAL_H +#define QTX11SUPPORTGLOBAL_H + +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +#ifndef QT_STATIC +# if defined(QT_BUILD_X11SUPPORT_LIB) +# define Q_X11SUPPORT_EXPORT Q_DECL_EXPORT +# else +# define Q_X11SUPPORT_EXPORT Q_DECL_IMPORT +# endif +#else +# define Q_X11SUPPORT_EXPORT +#endif + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QTX11SUPPORTGLOBAL_H diff --git a/src/x11support/qx11info_x11.cpp b/src/x11support/qx11info_x11.cpp new file mode 100644 index 0000000..ebfb9db --- /dev/null +++ b/src/x11support/qx11info_x11.cpp @@ -0,0 +1,262 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2012 Richard Moore +** Copyright (C) 2012 David Faure +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// An implementation of QX11Info for Qt5. This code only provides the +// static methods of the QX11Info, not the methods for getting information +// about particular widgets or pixmaps. +// + +#include "qx11info_x11.h" + +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + + +/*! + \class QX11Info + \brief The QX11Info class provides information about the X display + configuration. + + The class provides two APIs: a set of non-static functions that + provide information about a specific widget or pixmap, and a set + of static functions that provide the default information for the + application. + + \warning This class is only available on X11. For querying + per-screen information in a portable way, use QDesktopWidget. +*/ + +/*! + Constructs an empty QX11Info object. +*/ +QX11Info::QX11Info() +{ +} + +/*! + Returns the horizontal resolution of the given \a screen in terms of the + number of dots per inch. + + The \a screen argument is an X screen number. Be aware that if + the user's system uses Xinerama (as opposed to traditional X11 + multiscreen), there is only one X screen. Use QDesktopWidget to + query for information about Xinerama screens. + + \sa setAppDpiX(), appDpiY() +*/ +int QX11Info::appDpiX(int screen) +{ + if (screen == -1) { + const QScreen *scr = QGuiApplication::primaryScreen(); + if (!scr) + return 75; + return qRound(scr->logicalDotsPerInchX()); + } + + QList screens = QGuiApplication::screens(); + if (screen >= screens.size()) + return 0; + + return screens[screen]->logicalDotsPerInchX(); +} + +/*! + Returns the vertical resolution of the given \a screen in terms of the + number of dots per inch. + + The \a screen argument is an X screen number. Be aware that if + the user's system uses Xinerama (as opposed to traditional X11 + multiscreen), there is only one X screen. Use QDesktopWidget to + query for information about Xinerama screens. + + \sa setAppDpiY(), appDpiX() +*/ +int QX11Info::appDpiY(int screen) +{ + if (screen == -1) { + const QScreen *scr = QGuiApplication::primaryScreen(); + if (!scr) + return 75; + return qRound(scr->logicalDotsPerInchY()); + } + + QList screens = QGuiApplication::screens(); + if (screen > screens.size()) + return 0; + + return screens[screen]->logicalDotsPerInchY(); +} + +/*! + Returns a handle for the applications root window on the given \a screen. + + The \a screen argument is an X screen number. Be aware that if + the user's system uses Xinerama (as opposed to traditional X11 + multiscreen), there is only one X screen. Use QDesktopWidget to + query for information about Xinerama screens. + + \sa QApplication::desktop() +*/ +Qt::HANDLE QX11Info::appRootWindow(int screen) +{ + if (!qApp) + return 0; +#if 0 + // This looks like it should work, but gives the wrong value. + QDesktopWidget *desktop = QApplication::desktop(); + QWidget *screenWidget = desktop->screen(screen); + QWindow *window = screenWidget->windowHandle(); +#else + Q_UNUSED(screen); + + QDesktopWidget *desktop = QApplication::desktop(); + QWindow *window = desktop->windowHandle(); +#endif + return Qt::HANDLE(window->winId()); +} + +/*! + Returns the number of the screen where the application is being + displayed. + + \sa display(), screen() +*/ +int QX11Info::appScreen() +{ + if (!qApp) + return 0; + QDesktopWidget *desktop = QApplication::desktop(); + return desktop->primaryScreen(); +} + +/*! + Returns the X11 time. + + \sa setAppTime(), appUserTime() +*/ +unsigned long QX11Info::appTime() +{ + // ### TODO implement + return 0L; +} + +/*! + Returns the X11 user time. + + \sa setAppUserTime(), appTime() +*/ +unsigned long QX11Info::appUserTime() +{ + // ### TODO implement + return 0L; +} + +/*! + Sets the X11 time to the value specified by \a time. + + \sa appTime(), setAppUserTime() +*/ +void QX11Info::setAppTime(unsigned long time) +{ + // ### TODO implement + Q_UNUSED(time); +} + +/*! + Sets the X11 user time as specified by \a time. + + \sa appUserTime(), setAppTime() +*/ +void QX11Info::setAppUserTime(unsigned long time) +{ + if (!qApp) + return; + QPlatformNativeInterface *native = qApp->platformNativeInterface(); + + QDesktopWidget *desktop = QApplication::desktop(); + QWindow *window = desktop->windowHandle(); + + xcb_timestamp_t timestamp = uint32_t(time); + QMetaObject::invokeMethod(native, "updateNetWmUserTime", Qt::DirectConnection, + Q_ARG(QWindow *,window), Q_ARG(xcb_timestamp_t, timestamp)); +} + +/*! + Returns the default display for the application. + + \sa appScreen() +*/ +Display *QX11Info::display() +{ + if (!qApp) + return NULL; + QPlatformNativeInterface *native = qApp->platformNativeInterface(); + + void *display = native->nativeResourceForScreen(QByteArray("display"), QGuiApplication::primaryScreen()); + return reinterpret_cast(display); +} + +/*! + Returns the default XCB connection for the application. + + \sa display() +*/ +xcb_connection_t *QX11Info::connection() +{ + if (!qApp) + return NULL; + QPlatformNativeInterface *native = qApp->platformNativeInterface(); + + void *connection = native->nativeResourceForWindow(QByteArray("connection"), 0); + return reinterpret_cast(connection); +} + +QT_END_NAMESPACE diff --git a/src/x11support/qx11info_x11.h b/src/x11support/qx11info_x11.h new file mode 100644 index 0000000..68cb6a8 --- /dev/null +++ b/src/x11support/qx11info_x11.h @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QX11INFO_X11_H +#define QX11INFO_X11_H + +#include +#include "QtX11Support/qtx11supportglobal.h" + +typedef struct _XDisplay Display; +struct xcb_connection_t; + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +class Q_X11SUPPORT_EXPORT QX11Info +{ +public: + static int appDpiX(int screen=-1); + static int appDpiY(int screen=-1); + + static Qt::HANDLE appRootWindow(int screen=-1); + static int appScreen(); + + static unsigned long appTime(); + static unsigned long appUserTime(); + + static void setAppTime(unsigned long time); + static void setAppUserTime(unsigned long time); + + static Display *display(); + static xcb_connection_t *connection(); + +private: + QX11Info(); +}; + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QX11INFO_X11_H + diff --git a/src/x11support/x11support.pro b/src/x11support/x11support.pro new file mode 100644 index 0000000..fed7d00 --- /dev/null +++ b/src/x11support/x11support.pro @@ -0,0 +1,12 @@ +TARGET = QtX11Support + +DEFINES += QT_NO_USING_NAMESPACE + +QMAKE_DOCS = $$PWD/doc/qtx11support.qdocconf + +load(qt_module) + +QT += widgets gui-private + +HEADERS += qx11info_x11.h +SOURCES += qx11info_x11.cpp diff --git a/sync.profile b/sync.profile new file mode 100644 index 0000000..2b293ed --- /dev/null +++ b/sync.profile @@ -0,0 +1,14 @@ +%modules = ( # path to module name map + "QtX11Support" => "$basedir/src/x11support", +); +%moduleheaders = ( # restrict the module headers to those found in relative path +); +# Module dependencies. +# Every module that is required to build this module should have one entry. +# Each of the module version specifiers can take one of the following values: +# - A specific Git revision. +# - any git symbolic ref resolvable from the module's repository (e.g. "refs/heads/master" to track master branch) +# +%dependencies = ( + "qtbase" => "refs/heads/master", +); -- cgit v1.2.1