From bbee0db8f99a6a2f3926ca1b4118189fb5a957dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Wed, 27 Apr 2011 17:40:16 +0200 Subject: Preliminary QWindow event delivery. (cherry picked from commit 28a09e668a8125cff680ab9f1e7256e7e4e34158) --- src/plugins/platforms/xcb/qxcbconnection.cpp | 25 +++++++++++---------- src/plugins/platforms/xcb/qxcbconnection.h | 10 +++++++++ src/plugins/platforms/xcb/qxcbwindow.cpp | 33 ++++++++++++++++++---------- 3 files changed, 45 insertions(+), 23 deletions(-) (limited to 'src/plugins/platforms') diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp index a9340ad78d..5a2a033b4c 100644 --- a/src/plugins/platforms/xcb/qxcbconnection.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection.cpp @@ -143,23 +143,26 @@ QXcbConnection::~QXcbConnection() delete m_keyboard; } -QXcbWindow *platformWindowFromId(xcb_window_t id) +void QXcbConnection::addWindow(xcb_window_t id, QXcbWindow *window) { - QWidget *widget = QWidget::find(id); - if (widget) - return static_cast(widget->windowHandle()->handle()); - return 0; + m_mapper.insert(id, window); +} + +void QXcbConnection::removeWindow(xcb_window_t id) +{ + m_mapper.remove(id); +} + +QXcbWindow *QXcbConnection::platformWindowFromId(xcb_window_t id) +{ + return m_mapper.value(id, 0); } #define HANDLE_PLATFORM_WINDOW_EVENT(event_t, windowMember, handler) \ { \ event_t *e = (event_t *)event; \ - if (QXcbWindow *platformWindow = platformWindowFromId(e->windowMember)) { \ - QWindow *windowHandle = platformWindow->window(); \ - QObjectPrivate *d = QObjectPrivate::get(windowHandle->widget()); \ - if (!d->wasDeleted) \ - platformWindow->handler(e); \ - } \ + if (QXcbWindow *platformWindow = platformWindowFromId(e->windowMember)) \ + platformWindow->handler(e); \ } \ break; diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h index 6b5f81047d..cbdfff7e15 100644 --- a/src/plugins/platforms/xcb/qxcbconnection.h +++ b/src/plugins/platforms/xcb/qxcbconnection.h @@ -44,6 +44,7 @@ #include +#include #include #include #include @@ -51,6 +52,9 @@ #define Q_XCB_DEBUG class QXcbScreen; +class QXcbWindow; + +typedef QHash WindowMapper; namespace QXcbAtom { enum Atom { @@ -255,6 +259,9 @@ public: void sync(); void handleXcbError(xcb_generic_error_t *error); + void addWindow(xcb_window_t id, QXcbWindow *window); + void removeWindow(xcb_window_t id); + private slots: void processXcbEvents(); @@ -264,6 +271,7 @@ private: #ifdef XCB_USE_DRI2 void initializeDri2(); #endif + QXcbWindow *platformWindowFromId(xcb_window_t id); xcb_connection_t *m_connection; const xcb_setup_t *m_setup; @@ -303,6 +311,8 @@ private: template friend cookie_t q_xcb_call_template(const cookie_t &cookie, QXcbConnection *connection, const char *file, int line); #endif + + WindowMapper m_mapper; }; #define DISPLAY_FROM_XCB(object) ((Display *)(object->connection()->xlib_display())) diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 81aa986c11..fa8ab0aa22 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -90,7 +90,7 @@ QXcbWindow::QXcbWindow(QWindow *window) , m_context(0) { QWidget *tlw = window->widget(); - m_screen = static_cast(QPlatformScreen::platformScreenForWidget(tlw)); + m_screen = static_cast(QGuiApplicationPrivate::platformIntegration()->screens().at(0)); setConnection(m_screen->connection()); @@ -112,9 +112,11 @@ QXcbWindow::QXcbWindow(QWindow *window) | XCB_EVENT_MASK_FOCUS_CHANGE }; + QRect rect = window->geometry(); + #if defined(XCB_USE_GLX) || defined(XCB_USE_EGL) if (window->surfaceType() == QWindow::OpenGLSurface - && QApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL)) + && QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL)) { #if defined(XCB_USE_GLX) XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen),m_screen->screenNumber(), window->requestedWindowFormat()); @@ -136,7 +138,7 @@ QXcbWindow::QXcbWindow(QWindow *window) XSetWindowAttributes a; a.colormap = cmap; - m_window = XCreateWindow(DISPLAY_FROM_XCB(this), m_screen->root(), tlw->x(), tlw->y(), tlw->width(), tlw->height(), + m_window = XCreateWindow(DISPLAY_FROM_XCB(this), m_screen->root(), rect.x(), rect.y(), rect.width(), rect.height(), 0, visualInfo->depth, InputOutput, visualInfo->visual, CWColormap, &a); @@ -153,10 +155,10 @@ QXcbWindow::QXcbWindow(QWindow *window) XCB_COPY_FROM_PARENT, // depth -- same as root m_window, // window id m_screen->root(), // parent window id - tlw->x(), - tlw->y(), - tlw->width(), - tlw->height(), + rect.x(), + rect.y(), + rect.width(), + rect.height(), 0, // border width XCB_WINDOW_CLASS_INPUT_OUTPUT, // window class m_screen->screen()->root_visual, // visual @@ -166,6 +168,8 @@ QXcbWindow::QXcbWindow(QWindow *window) printf("created regular window: %d\n", m_window); } + connection()->addWindow(m_window, this); + Q_XCB_CALL(xcb_change_window_attributes(xcb_connection(), m_window, mask, values)); xcb_atom_t properties[4]; @@ -177,7 +181,7 @@ QXcbWindow::QXcbWindow(QWindow *window) if (m_screen->syncRequestSupported()) properties[propertyCount++] = atom(QXcbAtom::_NET_WM_SYNC_REQUEST); - if (tlw->windowFlags() & Qt::WindowContextHelpButtonHint) + if (window->windowFlags() & Qt::WindowContextHelpButtonHint) properties[propertyCount++] = atom(QXcbAtom::_NET_WM_CONTEXT_HELP); Q_XCB_CALL(xcb_change_property(xcb_connection(), @@ -205,7 +209,7 @@ QXcbWindow::QXcbWindow(QWindow *window) &m_syncCounter)); } - if (isTransient(tlw) && tlw->parentWidget()) { + if (tlw && isTransient(tlw) && tlw->parentWidget()) { // ICCCM 4.1.2.6 QWidget *p = tlw->parentWidget()->window(); xcb_window_t parentWindow = p->winId(); @@ -227,6 +231,7 @@ QXcbWindow::~QXcbWindow() delete m_context; if (m_screen->syncRequestSupported()) Q_XCB_CALL(xcb_sync_destroy_counter(xcb_connection(), m_syncCounter)); + connection()->removeWindow(m_window); Q_XCB_CALL(xcb_destroy_window(xcb_connection(), m_window)); } @@ -245,7 +250,7 @@ void QXcbWindow::setVisible(bool visible) xcb_wm_hints_t hints; if (visible) { // TODO: QWindow::isMinimized() or similar - if (window()->widget()->isMinimized()) + if (window()->windowState() & Qt::WindowMinimized) xcb_wm_hints_set_iconic(&hints); else xcb_wm_hints_set_normal(&hints); @@ -522,11 +527,15 @@ QPlatformGLContext *QXcbWindow::glContext() const void QXcbWindow::handleExposeEvent(const xcb_expose_event_t *event) { - QWindowSurface *surface = window()->widget()->windowSurface(); + QWidget *widget = window()->widget(); + if (!widget) + return; + + QWindowSurface *surface = widget->windowSurface(); if (surface) { QRect rect(event->x, event->y, event->width, event->height); - surface->flush(window()->widget(), rect, QPoint()); + surface->flush(widget, rect, QPoint()); } } -- cgit v1.2.3