summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Faure <david.faure@kdab.com>2012-12-04 22:39:56 +0100
committerDavid Faure <david.faure@kdab.com>2012-12-05 11:19:23 +0100
commit5480650d050895ab184186ee3813004da494fc30 (patch)
treedf7b98900fca5c099fca583fd6cc6eb8d1c34c2b
parent20422631502054cd86a7ef5b1cef6953b72f535c (diff)
Initial creation of the qtx11support library.
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 <rich@kde.org> Reviewed-by: Lars Knoll <lars.knoll@digia.com> Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
-rw-r--r--.gitattributes3
-rw-r--r--.gitignore126
-rw-r--r--.qmake.conf1
-rw-r--r--.tag1
-rw-r--r--qtx11support.pro1
-rw-r--r--src/src.pro2
-rw-r--r--src/x11support/doc/qtx11support.qdocconf46
-rw-r--r--src/x11support/qtx11supportglobal.h65
-rw-r--r--src/x11support/qx11info_x11.cpp262
-rw-r--r--src/x11support/qx11info_x11.h82
-rw-r--r--src/x11support/x11support.pro12
-rw-r--r--sync.profile14
12 files changed, 615 insertions, 0 deletions
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 <rootdir>/dic/images and examples in
+# <rootdir>/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.<projectname>.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 <QtCore/qglobal.h>
+
+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 <rich@kde.org>
+** Copyright (C) 2012 David Faure <david.faure@kdab.com>
+** 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 <qpa/qplatformnativeinterface.h>
+#include <qpa/qplatformwindow.h>
+#include <qscreen.h>
+#include <qdesktopwidget.h>
+#include <qwindow.h>
+#include <qapplication.h>
+#include <xcb/xcb.h>
+
+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<QScreen *> 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<QScreen *> 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 *>(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<xcb_connection_t *>(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 <QtCore/qnamespace.h>
+#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",
+);