summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/xlib/qxlibwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/xlib/qxlibwindow.cpp')
-rw-r--r--src/plugins/platforms/xlib/qxlibwindow.cpp739
1 files changed, 0 insertions, 739 deletions
diff --git a/src/plugins/platforms/xlib/qxlibwindow.cpp b/src/plugins/platforms/xlib/qxlibwindow.cpp
deleted file mode 100644
index 00403aed64..0000000000
--- a/src/plugins/platforms/xlib/qxlibwindow.cpp
+++ /dev/null
@@ -1,739 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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, Nokia gives you certain additional
-** rights. These rights are described in the Nokia 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.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtGui/private/qguiapplication_p.h>
-#include "qxlibwindow.h"
-
-#include "qxlibintegration.h"
-#include "qxlibscreen.h"
-#include "qxlibkeyboard.h"
-#include "qxlibstatic.h"
-#include "qxlibdisplay.h"
-
-#if !defined(QT_NO_OPENGL)
-#if !defined(QT_OPENGL_ES_2)
-#include "qglxintegration.h"
-#include "private/qglxconvenience_p.h"
-#else
-#include "../eglconvenience/qeglconvenience.h"
-#include "../eglconvenience/qeglplatformcontext.h"
-#include "../eglconvenience/qxlibeglintegration.h"
-#endif //QT_OPENGL_ES_2
-#endif //QT_NO_OPENGL
-
-
-#include <QtGui/QWindowSystemInterface>
-#include <QSocketNotifier>
-#include <QGuiApplication>
-#include <QStyleHints>
-#include <QDebug>
-
-//#define MYX11_DEBUG
-
-QT_BEGIN_NAMESPACE
-
-QHash<Window, QXlibWindow *> QXlibWindow::windowMap;
-
-
-QXlibWindow::QXlibWindow(QWindow *window)
- : QPlatformWindow(window)
- , mGLContext(0)
- , mScreen(QXlibScreen::testLiteScreenForWidget(window))
-{
- int x = window->x();
- int y = window->y();
- int w = window->width();
- int h = window->height();
-
- mSurfaceFormat = window->requestedFormat();
-
-#if !defined(QT_NO_OPENGL)
- if(window->surfaceType() == QWindow::OpenGLSurface) {
-#if !defined(QT_OPENGL_ES_2)
- XVisualInfo *visualInfo = qglx_findVisualInfo(mScreen->display()->nativeDisplay(), mScreen->xScreenNumber(), &mSurfaceFormat);
- if (!visualInfo)
- qFatal("Could not initialize GLX");
-#else
- QPlatformWindowFormat windowFormat = correctColorBuffers(window->platformWindowFormat());
-
- EGLDisplay eglDisplay = mScreen->eglDisplay();
- EGLConfig eglConfig = q_configFromQPlatformWindowFormat(eglDisplay,windowFormat);
- VisualID id = QXlibEglIntegration::getCompatibleVisualId(mScreen->display()->nativeDisplay(), eglDisplay, eglConfig);
-
- XVisualInfo visualInfoTemplate;
- memset(&visualInfoTemplate, 0, sizeof(XVisualInfo));
- visualInfoTemplate.visualid = id;
-
- XVisualInfo *visualInfo;
- int matchingCount = 0;
- visualInfo = XGetVisualInfo(mScreen->display()->nativeDisplay(), VisualIDMask, &visualInfoTemplate, &matchingCount);
- if (!visualInfo)
- qFatal("Could not initialize EGL");
-#endif //!defined(QT_OPENGL_ES_2)
- mDepth = visualInfo->depth;
- mFormat = (mDepth == 32) ? QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32;
- mVisual = visualInfo->visual;
- Colormap cmap = XCreateColormap(mScreen->display()->nativeDisplay(), mScreen->rootWindow(), visualInfo->visual, AllocNone);
-
- XSetWindowAttributes a;
- a.background_pixel = WhitePixel(mScreen->display()->nativeDisplay(), mScreen->xScreenNumber());
- a.border_pixel = BlackPixel(mScreen->display()->nativeDisplay(), mScreen->xScreenNumber());
- a.colormap = cmap;
- x_window = XCreateWindow(mScreen->display()->nativeDisplay(), mScreen->rootWindow(),x, y, w, h,
- 0, visualInfo->depth, InputOutput, visualInfo->visual,
- CWBackPixel|CWBorderPixel|CWColormap, &a);
- XFree(visualInfo);
- } else
-#endif //!defined(QT_NO_OPENGL)
- {
- mDepth = mScreen->depth();
- mFormat = (mDepth == 32) ? QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32;
- mVisual = mScreen->defaultVisual();
-
- x_window = XCreateSimpleWindow(mScreen->display()->nativeDisplay(), mScreen->rootWindow(),
- x, y, w, h, 0 /*border_width*/,
- mScreen->blackPixel(), mScreen->whitePixel());
- }
-
-#ifdef MYX11_DEBUG
- qDebug() << "QTestLiteWindow::QTestLiteWindow creating" << hex << x_window << window;
-#endif
-
- XSetWindowBackgroundPixmap(mScreen->display()->nativeDisplay(), x_window, XNone);
-
- XSelectInput(mScreen->display()->nativeDisplay(), x_window,
- ExposureMask | KeyPressMask | KeyReleaseMask |
- EnterWindowMask | LeaveWindowMask | FocusChangeMask |
- PointerMotionMask | ButtonPressMask | ButtonReleaseMask |
- ButtonMotionMask | PropertyChangeMask |
- StructureNotifyMask);
-
- gc = createGC();
-
- Atom protocols[5];
- int n = 0;
- protocols[n++] = QXlibStatic::atom(QXlibStatic::WM_DELETE_WINDOW); // support del window protocol
- protocols[n++] = QXlibStatic::atom(QXlibStatic::WM_TAKE_FOCUS); // support take focus window protocol
-// protocols[n++] = QXlibStatic::atom(QXlibStatic::_NET_WM_PING); // support _NET_WM_PING protocol
-#ifndef QT_NO_XSYNC
- protocols[n++] = QXlibStatic::atom(QXlibStatic::_NET_WM_SYNC_REQUEST); // support _NET_WM_SYNC_REQUEST protocol
-#endif // QT_NO_XSYNC
- if (window->windowFlags() & Qt::WindowContextHelpButtonHint)
- protocols[n++] = QXlibStatic::atom(QXlibStatic::_NET_WM_CONTEXT_HELP);
- XSetWMProtocols(mScreen->display()->nativeDisplay(), x_window, protocols, n);
-
- windowMap.insert(x_window, this);
-}
-
-
-
-QXlibWindow::~QXlibWindow()
-{
-#ifdef MYX11_DEBUG
- qDebug() << "~QTestLiteWindow" << hex << x_window;
-#endif
-
- windowMap.remove(x_window);
-
- delete mGLContext;
- XFreeGC(mScreen->display()->nativeDisplay(), gc);
- XDestroyWindow(mScreen->display()->nativeDisplay(), x_window);
-}
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Mouse event stuff
-static Qt::MouseButtons translateMouseButtons(int s)
-{
- Qt::MouseButtons ret = 0;
- if (s & Button1Mask)
- ret |= Qt::LeftButton;
- if (s & Button2Mask)
- ret |= Qt::MidButton;
- if (s & Button3Mask)
- ret |= Qt::RightButton;
- return ret;
-}
-
-
-
-void QXlibWindow::handleMouseEvent(QEvent::Type type, XButtonEvent *e)
-{
- static QPoint mousePoint;
-
- Qt::MouseButton button = Qt::NoButton;
- Qt::MouseButtons buttons = translateMouseButtons(e->state);
- Qt::KeyboardModifiers modifiers = mScreen->keyboard()->translateModifiers(e->state);
- if (type != QEvent::MouseMove) {
- switch (e->button) {
- case Button1: button = Qt::LeftButton; break;
- case Button2: button = Qt::MidButton; break;
- case Button3: button = Qt::RightButton; break;
- case Button4:
- case Button5:
- case 6:
- case 7: {
- //mouse wheel
- if (type == QEvent::MouseButtonPress) {
- //logic borrowed from qapplication_x11.cpp
- int delta = 120 * ((e->button == Button4 || e->button == 6) ? 1 : -1);
- bool hor = (((e->button == Button4 || e->button == Button5)
- && (modifiers & Qt::AltModifier))
- || (e->button == 6 || e->button == 7));
- QWindowSystemInterface::handleWheelEvent(window(), e->time,
- QPoint(e->x, e->y),
- QPoint(e->x_root, e->y_root),
- delta, hor ? Qt::Horizontal : Qt::Vertical);
- }
- return;
- }
- case 8: button = Qt::BackButton; break; // Also known as Qt::ExtraButton1
- case 9: button = Qt::ForwardButton; break; // Also known as Qt::ExtraButton2
- case 10: button = Qt::ExtraButton3; break;
- case 11: button = Qt::ExtraButton4; break;
- case 12: button = Qt::ExtraButton5; break;
- case 13: button = Qt::ExtraButton6; break;
- case 14: button = Qt::ExtraButton7; break;
- case 15: button = Qt::ExtraButton8; break;
- case 16: button = Qt::ExtraButton9; break;
- case 17: button = Qt::ExtraButton10; break;
- case 18: button = Qt::ExtraButton11; break;
- case 19: button = Qt::ExtraButton12; break;
- case 20: button = Qt::ExtraButton13; break;
- case 21: button = Qt::ExtraButton14; break;
- case 22: button = Qt::ExtraButton15; break;
- case 23: button = Qt::ExtraButton16; break;
- case 24: button = Qt::ExtraButton17; break;
- case 25: button = Qt::ExtraButton18; break;
- case 26: button = Qt::ExtraButton19; break;
- case 27: button = Qt::ExtraButton20; break;
- case 28: button = Qt::ExtraButton21; break;
- case 29: button = Qt::ExtraButton22; break;
- case 30: button = Qt::ExtraButton23; break;
- case 31: button = Qt::ExtraButton24; break;
- default: break;
- }
- }
-
- buttons ^= button; // X event uses state *before*, Qt uses state *after*
-
- QWindowSystemInterface::handleMouseEvent(window(), e->time, QPoint(e->x, e->y),
- QPoint(e->x_root, e->y_root),
- buttons);
-
- mousePoint = QPoint(e->x_root, e->y_root);
-}
-
-void QXlibWindow::handleCloseEvent()
-{
- QWindowSystemInterface::handleCloseEvent(window());
-}
-
-
-void QXlibWindow::handleEnterEvent()
-{
- QWindowSystemInterface::handleEnterEvent(window());
-}
-
-void QXlibWindow::handleLeaveEvent()
-{
- QWindowSystemInterface::handleLeaveEvent(window());
-}
-
-void QXlibWindow::handleFocusInEvent()
-{
- QWindowSystemInterface::handleWindowActivated(window());
-}
-
-void QXlibWindow::handleFocusOutEvent()
-{
- QWindowSystemInterface::handleWindowActivated(0);
-}
-
-
-
-void QXlibWindow::setGeometry(const QRect &rect)
-{
- XMoveResizeWindow(mScreen->display()->nativeDisplay(), x_window, rect.x(), rect.y(), rect.width(), rect.height());
- QPlatformWindow::setGeometry(rect);
-}
-
-
-Qt::WindowFlags QXlibWindow::windowFlags() const
-{
- return mWindowFlags;
-}
-
-WId QXlibWindow::winId() const
-{
- return x_window;
-}
-
-void QXlibWindow::setParent(const QPlatformWindow *parent)
-{
- QPoint topLeft = geometry().topLeft();
- WId parentWinId = parent ? parent->winId() : mScreen->rootWindow();
- XReparentWindow(mScreen->display()->nativeDisplay(),x_window,parentWinId,topLeft.x(),topLeft.y());
-}
-
-void QXlibWindow::raise()
-{
- XRaiseWindow(mScreen->display()->nativeDisplay(), x_window);
-}
-
-void QXlibWindow::lower()
-{
- XLowerWindow(mScreen->display()->nativeDisplay(), x_window);
-}
-
-void QXlibWindow::setWindowTitle(const QString &title)
-{
- QByteArray ba = title.toLatin1(); //We're not making a general solution here...
- XTextProperty windowName;
- windowName.value = (unsigned char *)ba.constData();
- windowName.encoding = XA_STRING;
- windowName.format = 8;
- windowName.nitems = ba.length();
-
- XSetWMName(mScreen->display()->nativeDisplay(), x_window, &windowName);
-}
-
-GC QXlibWindow::createGC()
-{
- GC gc;
-
- gc = XCreateGC(mScreen->display()->nativeDisplay(), x_window, 0, 0);
- if (gc < 0) {
- qWarning("QTestLiteWindow::createGC() could not create GC");
- }
- return gc;
-}
-
-void QXlibWindow::requestActivateWindow()
-{
- XSetInputFocus(mScreen->display()->nativeDisplay(), x_window, XRevertToParent, CurrentTime);
-}
-
-void QXlibWindow::resizeEvent(XConfigureEvent *e)
-{
- int xpos = geometry().x();
- int ypos = geometry().y();
- if ((e->width != geometry().width() || e->height != geometry().height()) && e->x == 0 && e->y == 0) {
- //qDebug() << "resize with bogus pos" << e->x << e->y << e->width << e->height << "window"<< hex << window;
- } else {
- //qDebug() << "geometry change" << e->x << e->y << e->width << e->height << "window"<< hex << window;
- xpos = e->x;
- ypos = e->y;
- }
-#ifdef MYX11_DEBUG
- qDebug() << hex << x_window << dec << "ConfigureNotify" << e->x << e->y << e->width << e->height <<
- "geometry" << xpos << ypos << e->width << e->height;
-#endif
-
- QRect newRect(xpos, ypos, e->width, e->height);
- QWindowSystemInterface::handleGeometryChange(window(), newRect);
-}
-
-void QXlibWindow::mousePressEvent(XButtonEvent *e)
-{
- static long prevTime = 0;
- static Window prevWindow;
- static int prevX = -999;
- static int prevY = -999;
-
- QEvent::Type type = QEvent::MouseButtonPress;
-
- const int doubleClickInterval = qApp->styleHints()->mouseDoubleClickInterval();
- if (e->window == prevWindow && long(e->time) - prevTime < doubleClickInterval
- && qAbs(e->x - prevX) < 5 && qAbs(e->y - prevY) < 5) {
- type = QEvent::MouseButtonDblClick;
- prevTime = e->time - doubleClickInterval; //no double click next time
- } else {
- prevTime = e->time;
- }
- prevWindow = e->window;
- prevX = e->x;
- prevY = e->y;
-
- handleMouseEvent(type, e);
-}
-
-QXlibMWMHints QXlibWindow::getMWMHints() const
-{
- QXlibMWMHints mwmhints;
-
- Atom type;
- int format;
- ulong nitems, bytesLeft;
- uchar *data = 0;
- Atom atomForMotifWmHints = QXlibStatic::atom(QXlibStatic::_MOTIF_WM_HINTS);
- if ((XGetWindowProperty(mScreen->display()->nativeDisplay(), x_window, atomForMotifWmHints, 0, 5, false,
- atomForMotifWmHints, &type, &format, &nitems, &bytesLeft,
- &data) == Success)
- && (type == atomForMotifWmHints
- && format == 32
- && nitems >= 5)) {
- mwmhints = *(reinterpret_cast<QXlibMWMHints *>(data));
- } else {
- mwmhints.flags = 0L;
- mwmhints.functions = MWM_FUNC_ALL;
- mwmhints.decorations = MWM_DECOR_ALL;
- mwmhints.input_mode = 0L;
- mwmhints.status = 0L;
- }
-
- if (data)
- XFree(data);
-
- return mwmhints;
-}
-
-void QXlibWindow::setMWMHints(const QXlibMWMHints &mwmhints)
-{
- Atom atomForMotifWmHints = QXlibStatic::atom(QXlibStatic::_MOTIF_WM_HINTS);
- if (mwmhints.flags != 0l) {
- XChangeProperty(mScreen->display()->nativeDisplay(), x_window,
- atomForMotifWmHints, atomForMotifWmHints, 32,
- PropModeReplace, (unsigned char *) &mwmhints, 5);
- } else {
- XDeleteProperty(mScreen->display()->nativeDisplay(), x_window, atomForMotifWmHints);
- }
-}
-
-// Returns true if we should set WM_TRANSIENT_FOR on \a w
-static inline bool isTransient(const QWindow *w)
-{
- return (w->windowType() == Qt::Dialog
- || w->windowType() == Qt::Sheet
- || w->windowType() == Qt::Tool
- || w->windowType() == Qt::SplashScreen
- || w->windowType() == Qt::ToolTip
- || w->windowType() == Qt::Drawer
- || w->windowType() == Qt::Popup);
-}
-
-QVector<Atom> QXlibWindow::getNetWmState() const
-{
- QVector<Atom> returnValue;
-
- // Don't read anything, just get the size of the property data
- Atom actualType;
- int actualFormat;
- ulong propertyLength;
- ulong bytesLeft;
- uchar *propertyData = 0;
- if (XGetWindowProperty(mScreen->display()->nativeDisplay(), x_window, QXlibStatic::atom(QXlibStatic::_NET_WM_STATE), 0, 0,
- False, XA_ATOM, &actualType, &actualFormat,
- &propertyLength, &bytesLeft, &propertyData) == Success
- && actualType == XA_ATOM && actualFormat == 32) {
- returnValue.resize(bytesLeft / 4);
- XFree((char*) propertyData);
-
- // fetch all data
- if (XGetWindowProperty(mScreen->display()->nativeDisplay(), x_window, QXlibStatic::atom(QXlibStatic::_NET_WM_STATE), 0,
- returnValue.size(), False, XA_ATOM, &actualType, &actualFormat,
- &propertyLength, &bytesLeft, &propertyData) != Success) {
- returnValue.clear();
- } else if (propertyLength != (ulong)returnValue.size()) {
- returnValue.resize(propertyLength);
- }
-
- // put it into netWmState
- if (!returnValue.isEmpty()) {
- memcpy(returnValue.data(), propertyData, returnValue.size() * sizeof(Atom));
- }
- XFree((char*) propertyData);
- }
-
- return returnValue;
-}
-
-Qt::WindowFlags QXlibWindow::setWindowFlags(Qt::WindowFlags flags)
-{
-// Q_ASSERT(flags & Qt::Window);
- mWindowFlags = flags;
-
-#ifdef MYX11_DEBUG
- qDebug() << "QTestLiteWindow::setWindowFlags" << hex << x_window << "flags" << flags;
-#endif
- Qt::WindowType type = static_cast<Qt::WindowType>(int(flags & Qt::WindowType_Mask));
-
- if (type == Qt::ToolTip)
- flags |= Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint;
- if (type == Qt::Popup)
- flags |= Qt::X11BypassWindowManagerHint;
-
- bool topLevel = (flags & Qt::Window);
- bool popup = (type == Qt::Popup);
- bool dialog = (type == Qt::Dialog
- || type == Qt::Sheet);
- bool desktop = (type == Qt::Desktop);
- bool tool = (type == Qt::Tool || type == Qt::SplashScreen
- || type == Qt::ToolTip || type == Qt::Drawer);
-
- Q_UNUSED(topLevel);
- Q_UNUSED(dialog);
- Q_UNUSED(desktop);
-
- bool tooltip = (type == Qt::ToolTip);
-
- XSetWindowAttributes wsa;
-
- QXlibMWMHints mwmhints;
- mwmhints.flags = 0L;
- mwmhints.functions = 0L;
- mwmhints.decorations = 0;
- mwmhints.input_mode = 0L;
- mwmhints.status = 0L;
-
-
- ulong wsa_mask = 0;
- if (type != Qt::SplashScreen) { // && customize) {
- mwmhints.flags |= MWM_HINTS_DECORATIONS;
-
- bool customize = flags & Qt::CustomizeWindowHint;
- if (!(flags & Qt::FramelessWindowHint) && !(customize && !(flags & Qt::WindowTitleHint))) {
- mwmhints.decorations |= MWM_DECOR_BORDER;
- mwmhints.decorations |= MWM_DECOR_RESIZEH;
-
- if (flags & Qt::WindowTitleHint)
- mwmhints.decorations |= MWM_DECOR_TITLE;
-
- if (flags & Qt::WindowSystemMenuHint)
- mwmhints.decorations |= MWM_DECOR_MENU;
-
- if (flags & Qt::WindowMinimizeButtonHint) {
- mwmhints.decorations |= MWM_DECOR_MINIMIZE;
- mwmhints.functions |= MWM_FUNC_MINIMIZE;
- }
-
- if (flags & Qt::WindowMaximizeButtonHint) {
- mwmhints.decorations |= MWM_DECOR_MAXIMIZE;
- mwmhints.functions |= MWM_FUNC_MAXIMIZE;
- }
-
- if (flags & Qt::WindowCloseButtonHint)
- mwmhints.functions |= MWM_FUNC_CLOSE;
- }
- } else {
- // if type == Qt::SplashScreen
- mwmhints.decorations = MWM_DECOR_ALL;
- }
-
- if (tool) {
- wsa.save_under = True;
- wsa_mask |= CWSaveUnder;
- }
-
- if (flags & Qt::X11BypassWindowManagerHint) {
- wsa.override_redirect = True;
- wsa_mask |= CWOverrideRedirect;
- }
-#if 0
- if (wsa_mask && initializeWindow) {
- Q_ASSERT(id);
- XChangeWindowAttributes(dpy, id, wsa_mask, &wsa);
- }
-#endif
- if (mwmhints.functions != 0) {
- mwmhints.flags |= MWM_HINTS_FUNCTIONS;
- mwmhints.functions |= MWM_FUNC_MOVE | MWM_FUNC_RESIZE;
- } else {
- mwmhints.functions = MWM_FUNC_ALL;
- }
-
- if (!(flags & Qt::FramelessWindowHint)
- && flags & Qt::CustomizeWindowHint
- && flags & Qt::WindowTitleHint
- && !(flags &
- (Qt::WindowMinimizeButtonHint
- | Qt::WindowMaximizeButtonHint
- | Qt::WindowCloseButtonHint))) {
- // a special case - only the titlebar without any button
- mwmhints.flags = MWM_HINTS_FUNCTIONS;
- mwmhints.functions = MWM_FUNC_MOVE | MWM_FUNC_RESIZE;
- mwmhints.decorations = 0;
- }
-
- if (window()->windowModality() == Qt::WindowModal) {
- mwmhints.input_mode = MWM_INPUT_PRIMARY_APPLICATION_MODAL;
- } else if (window()->windowModality() == Qt::ApplicationModal) {
- mwmhints.input_mode = MWM_INPUT_FULL_APPLICATION_MODAL;
- }
-
- setMWMHints(mwmhints);
-
- QVector<Atom> netWmState = getNetWmState();
-
- if (flags & Qt::WindowStaysOnTopHint) {
- if (flags & Qt::WindowStaysOnBottomHint)
- qWarning() << "QWindow: Incompatible window flags: the window can't be on top and on bottom at the same time";
- if (!netWmState.contains(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_ABOVE)))
- netWmState.append(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_ABOVE));
- if (!netWmState.contains(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_STAYS_ON_TOP)))
- netWmState.append(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_STAYS_ON_TOP));
- } else if (flags & Qt::WindowStaysOnBottomHint) {
- if (!netWmState.contains(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_BELOW)))
- netWmState.append(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_BELOW));
- }
- if (window()->windowState() & Qt::WindowFullScreen) {
- if (!netWmState.contains(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_FULLSCREEN)))
- netWmState.append(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_FULLSCREEN));
- }
- if (window()->windowState() & Qt::WindowMaximized) {
- if (!netWmState.contains(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_MAXIMIZED_HORZ)))
- netWmState.append(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_MAXIMIZED_HORZ));
- if (!netWmState.contains(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_MAXIMIZED_VERT)))
- netWmState.append(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_MAXIMIZED_VERT));
- }
- if (window()->windowModality() != Qt::NonModal) {
- if (!netWmState.contains(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_MODAL)))
- netWmState.append(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_MODAL));
- }
-
- if (!netWmState.isEmpty()) {
- XChangeProperty(mScreen->display()->nativeDisplay(), x_window,
- QXlibStatic::atom(QXlibStatic::_NET_WM_STATE), XA_ATOM, 32, PropModeReplace,
- (unsigned char *) netWmState.data(), netWmState.size());
- } else {
- XDeleteProperty(mScreen->display()->nativeDisplay(), x_window, QXlibStatic::atom(QXlibStatic::_NET_WM_STATE));
- }
-
-//##### only if initializeWindow???
-
- if (popup || tooltip) { // popup widget
-#ifdef MYX11_DEBUG
- qDebug() << "Doing XChangeWindowAttributes for popup" << wsa.override_redirect;
-#endif
- // set EWMH window types
- // setNetWmWindowTypes();
-
- wsa.override_redirect = True;
- wsa.save_under = True;
- XChangeWindowAttributes(mScreen->display()->nativeDisplay(), x_window, CWOverrideRedirect | CWSaveUnder,
- &wsa);
- } else {
-#ifdef MYX11_DEBUG
- qDebug() << "Doing XChangeWindowAttributes for non-popup";
-#endif
- }
-
- return flags;
-}
-
-Qt::WindowState QXlibWindow::setWindowState(Qt::WindowState state)
-{
- // ####
- return state;
-}
-
-void QXlibWindow::setVisible(bool visible)
-{
-#ifdef MYX11_DEBUG
- qDebug() << "QTestLiteWindow::setVisible" << visible << hex << x_window;
-#endif
- if (isTransient(window())) {
- Window parentXWindow = x_window;
- QWindow *parent = window()->parent();
- if (parent && parent->handle()) {
- QXlibWindow *xlibParent = static_cast<QXlibWindow *>(parent->handle());
- parentXWindow = xlibParent->x_window;
- }
- XSetTransientForHint(mScreen->display()->nativeDisplay(),x_window,parentXWindow);
- }
-
- if (visible) {
- qDebug() << ">>> mapping";
- //ensure that the window is viewed in correct position.
- doSizeHints();
- XMapWindow(mScreen->display()->nativeDisplay(), x_window);
- } else {
- XUnmapWindow(mScreen->display()->nativeDisplay(), x_window);
- }
-}
-
-void QXlibWindow::setCursor(const Cursor &cursor)
-{
- XDefineCursor(mScreen->display()->nativeDisplay(), x_window, cursor);
- mScreen->display()->flush();
-}
-
-QSurfaceFormat QXlibWindow::format() const
-{
- return mSurfaceFormat;
-}
-
-
-Window QXlibWindow::xWindow() const
-{
- return x_window;
-}
-
-GC QXlibWindow::graphicsContext() const
-{
- return gc;
-}
-
-void QXlibWindow::doSizeHints()
-{
-// Q_ASSERT(window()->testAttribute(Qt::WA_WState_Created));
- XSizeHints s;
- s.flags = 0;
- QRect g = geometry();
- s.x = g.x();
- s.y = g.y();
- s.width = g.width();
- s.height = g.height();
- s.flags |= USPosition;
- s.flags |= PPosition;
- s.flags |= USSize;
- s.flags |= PSize;
- s.flags |= PWinGravity;
- s.win_gravity = QGuiApplication::isRightToLeft() ? NorthEastGravity : NorthWestGravity;
- XSetWMNormalHints(mScreen->display()->nativeDisplay(), x_window, &s);
-}
-
-
-QXlibWindow *QXlibWindow::platformWindowForXWindow(Window window)
-{
- return windowMap.value(window);
-}
-
-QT_END_NAMESPACE