diff options
Diffstat (limited to 'src/plugins/platforms/xcb')
-rw-r--r-- | src/plugins/platforms/xcb/qxcbclipboard.cpp | 19 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbconnection.cpp | 10 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbconnection_basic.cpp | 8 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbcursor.cpp | 8 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbkeyboard.cpp | 24 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbkeyboard.h | 1 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbwindow.cpp | 4 |
7 files changed, 54 insertions, 20 deletions
diff --git a/src/plugins/platforms/xcb/qxcbclipboard.cpp b/src/plugins/platforms/xcb/qxcbclipboard.cpp index dabdfcb6c5..b9ae587958 100644 --- a/src/plugins/platforms/xcb/qxcbclipboard.cpp +++ b/src/plugins/platforms/xcb/qxcbclipboard.cpp @@ -71,7 +71,7 @@ public: break; default: - qWarning("QXcbClipboardMime: Internal error: Unsupported clipboard mode"); + qCWarning(lcQpaClipboard, "QXcbClipboardMime: Internal error: Unsupported clipboard mode"); break; } } @@ -265,7 +265,7 @@ QXcbClipboard::~QXcbClipboard() if (auto event = waitForClipboardEvent(m_owner, XCB_SELECTION_NOTIFY, true)) { free(event); } else { - qWarning("QXcbClipboard: Unable to receive an event from the " + qCWarning(lcQpaClipboard, "QXcbClipboard: Unable to receive an event from the " "clipboard manager in a reasonable time"); } } @@ -371,7 +371,7 @@ void QXcbClipboard::setMimeData(QMimeData *data, QClipboard::Mode mode) xcb_set_selection_owner(xcb_connection(), newOwner, modeAtom, connection()->time()); if (getSelectionOwner(modeAtom) != newOwner) { - qWarning("QXcbClipboard::setMimeData: Cannot set X11 selection owner"); + qCWarning(lcQpaClipboard, "QXcbClipboard::setMimeData: Cannot set X11 selection owner"); } emitChanged(mode); @@ -538,7 +538,7 @@ void QXcbClipboard::handleSelectionClearRequest(xcb_selection_clear_event_t *eve void QXcbClipboard::handleSelectionRequest(xcb_selection_request_event_t *req) { if (requestor() && req->requestor == requestor()) { - qWarning("QXcbClipboard: Selection request should be caught before"); + qCWarning(lcQpaClipboard, "QXcbClipboard: Selection request should be caught before"); return; } @@ -553,7 +553,8 @@ void QXcbClipboard::handleSelectionRequest(xcb_selection_request_event_t *req) QMimeData *d; QClipboard::Mode mode = modeForAtom(req->selection); if (mode > QClipboard::Selection) { - qWarning() << "QXcbClipboard: Unknown selection" << connection()->atomName(req->selection); + qCWarning(lcQpaClipboard, "QXcbClipboard: Unknown selection %s", + connection()->atomName(req->selection).constData()); xcb_send_event(xcb_connection(), false, req->requestor, XCB_EVENT_MASK_NO_EVENT, (const char *)&event); return; } @@ -561,14 +562,14 @@ void QXcbClipboard::handleSelectionRequest(xcb_selection_request_event_t *req) d = m_clientClipboard[mode]; if (!d) { - qWarning("QXcbClipboard: Cannot transfer data, no data available"); + qCWarning(lcQpaClipboard, "QXcbClipboard: Cannot transfer data, no data available"); xcb_send_event(xcb_connection(), false, req->requestor, XCB_EVENT_MASK_NO_EVENT, (const char *)&event); return; } if (m_timestamp[mode] == XCB_CURRENT_TIME // we don't own the selection anymore || (req->time != XCB_CURRENT_TIME && req->time < m_timestamp[mode])) { - qWarning("QXcbClipboard: SelectionRequest too old"); + qCDebug(lcQpaClipboard, "QXcbClipboard: SelectionRequest too old"); xcb_send_event(xcb_connection(), false, req->requestor, XCB_EVENT_MASK_NO_EVENT, (const char *)&event); return; } @@ -623,7 +624,7 @@ void QXcbClipboard::handleSelectionRequest(xcb_selection_request_event_t *req) property, XCB_ATOM_INTEGER, 32, 1, &m_timestamp[mode]); ret = property; } else { - qWarning("QXcbClipboard: Invalid data timestamp"); + qCWarning(lcQpaClipboard, "QXcbClipboard: Invalid data timestamp"); } } else if (target == targetsAtom) { ret = sendTargetsSelection(d, req->requestor, property); @@ -728,7 +729,7 @@ bool QXcbClipboard::clipboardReadProperty(xcb_window_t win, xcb_atom_t property, // recover -- this shouldn't normally happen, but it doesn't // hurt to be defensive if ((int)(buffer_offset + length) > buffer->size()) { - qWarning("QXcbClipboard: buffer overflow"); + qCWarning(lcQpaClipboard, "QXcbClipboard: buffer overflow"); length = buffer->size() - buffer_offset; // escape loop diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp index 34fbc0b10b..9e2a37a6a1 100644 --- a/src/plugins/platforms/xcb/qxcbconnection.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection.cpp @@ -750,7 +750,7 @@ void QXcbConnection::handleXcbEvent(xcb_generic_event_t *event) case XCB_XKB_NEW_KEYBOARD_NOTIFY: { xcb_xkb_new_keyboard_notify_event_t *ev = &xkb_event->new_keyboard_notify; if (ev->changed & XCB_XKB_NKN_DETAIL_KEYCODES) - m_keyboard->updateKeymap(); + m_keyboard->updateKeymap(ev); break; } default: @@ -838,7 +838,13 @@ xcb_timestamp_t QXcbConnection::getTimestamp() xcb_window_t QXcbConnection::getSelectionOwner(xcb_atom_t atom) const { - return Q_XCB_REPLY(xcb_get_selection_owner, xcb_connection(), atom)->owner; + auto reply = Q_XCB_REPLY(xcb_get_selection_owner, xcb_connection(), atom); + if (!reply) { + qCDebug(lcQpaXcb) << "failed to query selection owner"; + return XCB_NONE; + } + + return reply->owner; } xcb_window_t QXcbConnection::getQtSelectionOwner() diff --git a/src/plugins/platforms/xcb/qxcbconnection_basic.cpp b/src/plugins/platforms/xcb/qxcbconnection_basic.cpp index 18dee89adb..9dd608cdc0 100644 --- a/src/plugins/platforms/xcb/qxcbconnection_basic.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection_basic.cpp @@ -179,7 +179,13 @@ xcb_atom_t QXcbBasicConnection::internAtom(const char *name) if (!name || *name == 0) return XCB_NONE; - return Q_XCB_REPLY(xcb_intern_atom, m_xcbConnection, false, strlen(name), name)->atom; + auto reply = Q_XCB_REPLY(xcb_intern_atom, m_xcbConnection, false, strlen(name), name); + if (!reply) { + qCDebug(lcQpaXcb) << "failed to query intern atom: " << name; + return XCB_NONE; + } + + return reply->atom; } QByteArray QXcbBasicConnection::atomName(xcb_atom_t atom) diff --git a/src/plugins/platforms/xcb/qxcbcursor.cpp b/src/plugins/platforms/xcb/qxcbcursor.cpp index a032085f0b..4210bf428e 100644 --- a/src/plugins/platforms/xcb/qxcbcursor.cpp +++ b/src/plugins/platforms/xcb/qxcbcursor.cpp @@ -534,6 +534,8 @@ bool updateCursorTheme(void *dpy, const QByteArray &theme) { Q_UNUSED(screen); Q_UNUSED(name); QXcbCursor *self = static_cast<QXcbCursor *>(handle); + self->m_cursorHash.clear(); + updateCursorTheme(self->connection()->xlib_display(),property.toByteArray()); } @@ -559,14 +561,16 @@ xcb_cursor_t QXcbCursor::createFontCursor(int cshape) int cursorId = cursorIdForShape(cshape); xcb_cursor_t cursor = XCB_NONE; - // Try Xcursor first #if QT_CONFIG(xcb_xlib) && QT_CONFIG(library) + if (m_screen->xSettings()->initialized()) + m_screen->xSettings()->registerCallbackForProperty("Gtk/CursorThemeName",cursorThemePropertyChanged,this); + + // Try Xcursor first if (cshape >= 0 && cshape <= Qt::LastCursor) { void *dpy = connection()->xlib_display(); cursor = loadCursor(dpy, cshape); if (!cursor && !m_gtkCursorThemeInitialized && m_screen->xSettings()->initialized()) { QByteArray gtkCursorTheme = m_screen->xSettings()->setting("Gtk/CursorThemeName").toByteArray(); - m_screen->xSettings()->registerCallbackForProperty("Gtk/CursorThemeName",cursorThemePropertyChanged,this); if (updateCursorTheme(dpy,gtkCursorTheme)) { cursor = loadCursor(dpy, cshape); } diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp index e8286381a2..efecd7e2d1 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp +++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp @@ -365,6 +365,17 @@ void QXcbKeyboard::updateKeymap(xcb_mapping_notify_event_t *event) updateKeymap(); } +void QXcbKeyboard::updateKeymap(xcb_xkb_new_keyboard_notify_event_t *event) +{ + if (!event) + return; + + if (event->deviceID != event->oldDeviceID) + m_config = false; + + updateKeymap(); +} + void QXcbKeyboard::updateKeymap() { KeysymModifierMap keysymMods; @@ -372,8 +383,6 @@ void QXcbKeyboard::updateKeymap() keysymMods = keysymsToModifiers(); updateModifiers(keysymMods); - m_config = true; - if (!m_xkbContext) { m_xkbContext.reset(xkb_context_new(XKB_CONTEXT_NO_DEFAULT_INCLUDES)); if (!m_xkbContext) { @@ -389,8 +398,13 @@ void QXcbKeyboard::updateKeymap() if (connection()->hasXKB()) { m_xkbKeymap.reset(xkb_x11_keymap_new_from_device(m_xkbContext.get(), xcb_connection(), core_device_id, XKB_KEYMAP_COMPILE_NO_FLAGS)); - if (m_xkbKeymap) - m_xkbState.reset(xkb_x11_state_new_from_device(m_xkbKeymap.get(), xcb_connection(), core_device_id)); + if (m_xkbKeymap) { + if (m_config) + m_xkbState.reset(xkb_state_new(m_xkbKeymap.get())); + else + m_xkbState.reset(xkb_x11_state_new_from_device(m_xkbKeymap.get(), xcb_connection(), core_device_id)); + + } } else { m_xkbKeymap.reset(keymapFromCore(keysymMods)); if (m_xkbKeymap) @@ -411,6 +425,8 @@ void QXcbKeyboard::updateKeymap() updateXKBMods(); QXkbCommon::verifyHasLatinLayout(m_xkbKeymap.get()); + + m_config = true; } QList<int> QXcbKeyboard::possibleKeys(const QKeyEvent *event) const diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.h b/src/plugins/platforms/xcb/qxcbkeyboard.h index 0ee08aeff2..b652c85fe3 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.h +++ b/src/plugins/platforms/xcb/qxcbkeyboard.h @@ -69,6 +69,7 @@ public: Qt::KeyboardModifiers translateModifiers(int s) const; void updateKeymap(xcb_mapping_notify_event_t *event); + void updateKeymap(xcb_xkb_new_keyboard_notify_event_t *event); void updateKeymap(); QList<int> possibleKeys(const QKeyEvent *event) const; diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index da179591e9..ffda7b6a57 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -258,7 +258,7 @@ enum : quint32 { | XCB_EVENT_MASK_POINTER_MOTION, transparentForInputEventMask = baseEventMask - | XCB_EVENT_MASK_VISIBILITY_CHANGE | XCB_EVENT_MASK_RESIZE_REDIRECT + | XCB_EVENT_MASK_VISIBILITY_CHANGE | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT | XCB_EVENT_MASK_COLOR_MAP_CHANGE | XCB_EVENT_MASK_OWNER_GRAB_BUTTON }; @@ -1894,7 +1894,7 @@ void QXcbWindow::handleUnmapNotifyEvent(const xcb_unmap_notify_event_t *event) if (event->window == m_window) { m_mapped = false; QWindowSystemInterface::handleExposeEvent(window(), QRegion()); - if (!m_isWmManagedWindow) { + if (!m_isWmManagedWindow || parent()) { m_wmStateValid = true; handleDeferredTasks(); } |