diff options
Diffstat (limited to 'src/plugins/platforms/xlib/qxlibscreen.cpp')
-rw-r--r-- | src/plugins/platforms/xlib/qxlibscreen.cpp | 490 |
1 files changed, 0 insertions, 490 deletions
diff --git a/src/plugins/platforms/xlib/qxlibscreen.cpp b/src/plugins/platforms/xlib/qxlibscreen.cpp deleted file mode 100644 index 62c80b6ad4..0000000000 --- a/src/plugins/platforms/xlib/qxlibscreen.cpp +++ /dev/null @@ -1,490 +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 <private/qguiapplication_p.h> -#include "qxlibscreen.h" - -#include <X11/extensions/Xfixes.h> - -#include "qxlibcursor.h" -#include "qxlibwindow.h" -#include "qxlibkeyboard.h" -#include "qxlibstatic.h" -#include "qxlibclipboard.h" -#include "qxlibdisplay.h" -#include "qxlibnativeinterface.h" - -#include <QtCore/QDebug> -#include <QtCore/QSocketNotifier> -#include <QtCore/QElapsedTimer> - -#include <QtGui/QScreen> - -QT_BEGIN_NAMESPACE - -static int (*original_x_errhandler)(Display *dpy, XErrorEvent *); -static bool seen_badwindow; - -static int qt_x_errhandler(Display *dpy, XErrorEvent *err) -{ - -qDebug() << "qt_x_errhandler" << err->error_code; - - switch (err->error_code) { - case BadAtom: -#if 0 - if (err->request_code == 20 /* X_GetProperty */ - && (err->resourceid == XA_RESOURCE_MANAGER - || err->resourceid == XA_RGB_DEFAULT_MAP - || err->resourceid == ATOM(_NET_SUPPORTED) - || err->resourceid == ATOM(_NET_SUPPORTING_WM_CHECK) - || err->resourceid == ATOM(KDE_FULL_SESSION) - || err->resourceid == ATOM(KWIN_RUNNING) - || err->resourceid == ATOM(XdndProxy) - || err->resourceid == ATOM(XdndAware)) - - - ) { - // Perhaps we're running under SECURITY reduction? :/ - return 0; - } -#endif - qDebug() << "BadAtom"; - break; - - case BadWindow: - if (err->request_code == 2 /* X_ChangeWindowAttributes */ - || err->request_code == 38 /* X_QueryPointer */) { - for (int i = 0; i < ScreenCount(dpy); ++i) { - if (err->resourceid == RootWindow(dpy, i)) { - // Perhaps we're running under SECURITY reduction? :/ - return 0; - } - } - } - seen_badwindow = true; - if (err->request_code == 25 /* X_SendEvent */) { - for (int i = 0; i < ScreenCount(dpy); ++i) { - if (err->resourceid == RootWindow(dpy, i)) { - // Perhaps we're running under SECURITY reduction? :/ - return 0; - } - } -#if 0 - if (X11->xdndHandleBadwindow()) { - qDebug("xdndHandleBadwindow returned true"); - return 0; - } -#endif - } -#if 0 - if (X11->ignore_badwindow) - return 0; -#endif - break; - - case BadMatch: - if (err->request_code == 42 /* X_SetInputFocus */) - return 0; - break; - - default: -#if 0 //!defined(QT_NO_XINPUT) - if (err->request_code == X11->xinput_major - && err->error_code == (X11->xinput_errorbase + XI_BadDevice) - && err->minor_code == 3 /* X_OpenDevice */) { - return 0; - } -#endif - break; - } - - char errstr[256]; - XGetErrorText( dpy, err->error_code, errstr, 256 ); - char buffer[256]; - char request_str[256]; - qsnprintf(buffer, 256, "%d", err->request_code); - XGetErrorDatabaseText(dpy, "XRequest", buffer, "", request_str, 256); - if (err->request_code < 128) { - // X error for a normal protocol request - qWarning( "X Error: %s %d\n" - " Major opcode: %d (%s)\n" - " Resource id: 0x%lx", - errstr, err->error_code, - err->request_code, - request_str, - err->resourceid ); - } else { - // X error for an extension request - const char *extensionName = 0; -#if 0 - if (err->request_code == X11->xrender_major) - extensionName = "RENDER"; - else if (err->request_code == X11->xrandr_major) - extensionName = "RANDR"; - else if (err->request_code == X11->xinput_major) - extensionName = "XInputExtension"; - else if (err->request_code == X11->mitshm_major) - extensionName = "MIT-SHM"; -#endif - char minor_str[256]; - if (extensionName) { - qsnprintf(buffer, 256, "%s.%d", extensionName, err->minor_code); - XGetErrorDatabaseText(dpy, "XRequest", buffer, "", minor_str, 256); - } else { - extensionName = "Uknown extension"; - qsnprintf(minor_str, 256, "Unknown request"); - } - qWarning( "X Error: %s %d\n" - " Extension: %d (%s)\n" - " Minor opcode: %d (%s)\n" - " Resource id: 0x%lx", - errstr, err->error_code, - err->request_code, - extensionName, - err->minor_code, - minor_str, - err->resourceid ); - } - - // ### we really should distinguish between severe, non-severe and - // ### application specific errors - - return 0; -} - -QXlibScreen::QXlibScreen(QXlibNativeInterface *nativeInterface) - : mNativeInterface(nativeInterface) - , mFormat(QImage::Format_RGB32) -#if !defined(QT_NO_OPENGL) && defined(QT_OPENGL_ES_2) - , mEGLDisplay(0) -#endif -{ - char *display_name = getenv("DISPLAY"); - Display *display = XOpenDisplay(display_name); - mDisplay = new QXlibDisplay(display); - - -#ifndef DONT_USE_MIT_SHM - int MIT_SHM_extension_supported = XShmQueryExtension (mDisplay->nativeDisplay()); - Q_ASSERT(MIT_SHM_extension_supported == True); -#endif - original_x_errhandler = XSetErrorHandler(qt_x_errhandler); - - if (qgetenv("DO_X_SYNCHRONIZE").toInt()) - XSynchronize(mDisplay->nativeDisplay(), true); - - mScreen = DefaultScreen(mDisplay->nativeDisplay()); - XSelectInput(mDisplay->nativeDisplay(),rootWindow(), KeymapStateMask | EnterWindowMask | LeaveWindowMask | PropertyChangeMask); - int width = DisplayWidth(mDisplay->nativeDisplay(), mScreen); - int height = DisplayHeight(mDisplay->nativeDisplay(), mScreen); - mGeometry = QRect(0,0,width,height); - - int physicalWidth = DisplayWidthMM(mDisplay->nativeDisplay(), mScreen); - int physicalHeight = DisplayHeightMM(mDisplay->nativeDisplay(), mScreen); - mPhysicalSize = QSizeF(physicalWidth, physicalHeight); - - int xSocketNumber = XConnectionNumber(mDisplay->nativeDisplay()); - - mDepth = DefaultDepth(mDisplay->nativeDisplay(),mScreen); -#ifdef MYX11_DEBUG - qDebug() << "X socket:"<< xSocketNumber; -#endif - QSocketNotifier *sock = new QSocketNotifier(xSocketNumber, QSocketNotifier::Read, this); - connect(sock, SIGNAL(activated(int)), this, SLOT(eventDispatcher())); - - mCursor = new QXlibCursor(this); - mKeyboard = new QXlibKeyboard(this); -} - -QXlibScreen::~QXlibScreen() -{ - delete mCursor; - delete mDisplay; -} - -QPlatformCursor *QXlibScreen::cursor() const -{ - return mCursor; -} - -Window QXlibScreen::rootWindow() -{ - return RootWindow(mDisplay->nativeDisplay(), mScreen); -} - -unsigned long QXlibScreen::blackPixel() -{ - return BlackPixel(mDisplay->nativeDisplay(), mScreen); -} - -unsigned long QXlibScreen::whitePixel() -{ - return WhitePixel(mDisplay->nativeDisplay(), mScreen); -} - -#ifdef KeyPress -#undef KeyPress -#endif -#ifdef KeyRelease -#undef KeyRelease -#endif - -bool QXlibScreen::handleEvent(XEvent *xe) -{ - if (QPlatformNativeInterface::EventFilter filter = mNativeInterface->eventFilterForEventType(QByteArrayLiteral("XEvent"))) { - if (filter(xe, 0)) - return true; - } - - int quit = false; - QXlibWindow *platformWindow = QXlibWindow::platformWindowForXWindow(xe->xany.window); - if (!platformWindow) - return false; - - Atom wmProtocolsAtom = QXlibStatic::atom(QXlibStatic::WM_PROTOCOLS); - Atom wmDeleteWindowAtom = QXlibStatic::atom(QXlibStatic::WM_DELETE_WINDOW); - switch (xe->type) { - - case ClientMessage: - if (xe->xclient.format == 32 && xe->xclient.message_type == wmProtocolsAtom) { - Atom a = xe->xclient.data.l[0]; - if (a == wmDeleteWindowAtom) - platformWindow->handleCloseEvent(); - } - break; - - case Expose: - // ### -// if (xe->xexpose.count == 0) -// platformWindow->paintEvent(); - break; - case ConfigureNotify: - platformWindow->resizeEvent(&xe->xconfigure); - break; - - case ButtonPress: - platformWindow->mousePressEvent(&xe->xbutton); - break; - - case ButtonRelease: - platformWindow->handleMouseEvent(QEvent::MouseButtonRelease, &xe->xbutton); - break; - - case MotionNotify: - platformWindow->handleMouseEvent(QEvent::MouseMove, &xe->xbutton); - break; - - case XKeyPress: - mKeyboard->handleKeyEvent(platformWindow->window(), QEvent::KeyPress, &xe->xkey); - break; - - case XKeyRelease: - mKeyboard->handleKeyEvent(platformWindow->window(), QEvent::KeyRelease, &xe->xkey); - break; - - case EnterNotify: - platformWindow->handleEnterEvent(); - break; - - case LeaveNotify: - platformWindow->handleLeaveEvent(); - break; - - case XFocusIn: - platformWindow->handleFocusInEvent(); - break; - - case XFocusOut: - platformWindow->handleFocusOutEvent(); - break; - - case PropertyNotify: - break; - - case SelectionClear: - qDebug() << "Selection Clear!!!"; - break; - case SelectionRequest: - handleSelectionRequest(xe); - break; - case SelectionNotify: - qDebug() << "Selection Notify!!!!"; - - break; - - - default: -#ifdef MYX11_DEBUG - qDebug() << hex << xe->xany.window << "Other X event" << xe->type; -#endif - break; - } - - return quit; -} - -static Bool checkForClipboardEvents(Display *, XEvent *e, XPointer) -{ - Atom clipboard = QXlibStatic::atom(QXlibStatic::CLIPBOARD); - return ((e->type == SelectionRequest && (e->xselectionrequest.selection == XA_PRIMARY - || e->xselectionrequest.selection == clipboard)) - || (e->type == SelectionClear && (e->xselectionclear.selection == XA_PRIMARY - || e->xselectionclear.selection == clipboard))); -} - -bool QXlibScreen::waitForClipboardEvent(Window win, int type, XEvent *event, int timeout) -{ - QElapsedTimer timer; - timer.start(); - do { - if (XCheckTypedWindowEvent(mDisplay->nativeDisplay(),win,type,event)) - return true; - - // process other clipboard events, since someone is probably requesting data from us - XEvent e; - if (XCheckIfEvent(mDisplay->nativeDisplay(), &e, checkForClipboardEvents, 0)) - handleEvent(&e); - - mDisplay->flush(); - - // sleep 50 ms, so we don't use up CPU cycles all the time. - struct timeval usleep_tv; - usleep_tv.tv_sec = 0; - usleep_tv.tv_usec = 50000; - select(0, 0, 0, 0, &usleep_tv); - } while (timer.elapsed() < timeout); - return false; -} - -void QXlibScreen::eventDispatcher() -{ - ulong marker = XNextRequest(mDisplay->nativeDisplay()); - // int i = 0; - while (XPending(mDisplay->nativeDisplay())) { - XEvent event; - XNextEvent(mDisplay->nativeDisplay(), &event); - /* done = */ - handleEvent(&event); - - if (event.xany.serial >= marker) { - #ifdef MYX11_DEBUG - qDebug() << "potential livelock averted"; - #endif - #if 0 - if (XEventsQueued(mDisplay->nativeDisplay(), QueuedAfterFlush)) { - qDebug() << " with events queued"; - QTimer::singleShot(0, this, SLOT(eventDispatcher())); - } - #endif - break; - } - } -} - -QImage QXlibScreen::grabWindow(Window window, int x, int y, int w, int h) -{ - if (w == 0 || h ==0) - return QImage(); - - //WinId 0 means the desktop widget - if (!window) - window = rootWindow(); - - XWindowAttributes window_attr; - if (!XGetWindowAttributes(mDisplay->nativeDisplay(), window, &window_attr)) - return QImage(); - - if (w < 0) - w = window_attr.width - x; - if (h < 0) - h = window_attr.height - y; - - // Ideally, we should also limit ourselves to the screen area, but the Qt docs say - // that it's "unsafe" to go outside the screen, so we can ignore that problem. - - //We're definitely not optimizing for speed... - XImage *xi = XGetImage(mDisplay->nativeDisplay(), window, x, y, w, h, AllPlanes, ZPixmap); - - if (!xi) - return QImage(); - - //taking a copy to make sure we have ownership -- not fast - QImage result = QImage( (uchar*) xi->data, xi->width, xi->height, xi->bytes_per_line, QImage::Format_RGB32 ).copy(); - - XDestroyImage(xi); - - return result; -} - -QXlibScreen * QXlibScreen::testLiteScreenForWidget(QWindow *widget) -{ - return static_cast<QXlibScreen *>(widget->screen()->handle()); -} - -QXlibDisplay * QXlibScreen::display() const -{ - return mDisplay; -} - -int QXlibScreen::xScreenNumber() const -{ - return mScreen; -} - -Visual * QXlibScreen::defaultVisual() const -{ - return DefaultVisual(display()->nativeDisplay(), xScreenNumber()); -} - -QXlibKeyboard * QXlibScreen::keyboard() const -{ - return mKeyboard; -} - -void QXlibScreen::handleSelectionRequest(XEvent *event) -{ - QPlatformIntegration *integration = QGuiApplicationPrivate::platformIntegration(); - QXlibClipboard *clipboard = static_cast<QXlibClipboard *>(integration->clipboard()); - clipboard->handleSelectionRequest(event); -} - -QT_END_NAMESPACE |