summaryrefslogtreecommitdiff
path: root/src/plugins/platforms/wayland_common/qwaylandinputdevice.cpp
diff options
context:
space:
mode:
authorGiulio Camuffo <giuliocamuffo@gmail.com>2013-06-18 15:16:17 +0200
committerPier Luigi Fiorini <pierluigi.fiorini@gmail.com>2013-07-24 23:32:21 +0200
commita52431954dc6b7ab18ecbf1344dbf13e94601f24 (patch)
tree66bf5dc17bbc8b44445c5ac8f74b430d779d0db1 /src/plugins/platforms/wayland_common/qwaylandinputdevice.cpp
parentfa9c133cc3799bfcf027e6b3d4983bd4cfd5db6d (diff)
downloadqtwayland-a52431954dc6b7ab18ecbf1344dbf13e94601f24.tar.gz
Fix switching of active window.
When getting a surface leave/surface enter pair, the enter event was lost. It could be seen when opening a popup menu. This patch uses a wl_callback to activate the right window. Change-Id: Ibd35fcaa0d43f4723dd7aeff71264d6145411a08 Reviewed-by: Andy Nichols <andy.nichols@digia.com>
Diffstat (limited to 'src/plugins/platforms/wayland_common/qwaylandinputdevice.cpp')
-rw-r--r--src/plugins/platforms/wayland_common/qwaylandinputdevice.cpp37
1 files changed, 33 insertions, 4 deletions
diff --git a/src/plugins/platforms/wayland_common/qwaylandinputdevice.cpp b/src/plugins/platforms/wayland_common/qwaylandinputdevice.cpp
index 4c965dd4..c426db7b 100644
--- a/src/plugins/platforms/wayland_common/qwaylandinputdevice.cpp
+++ b/src/plugins/platforms/wayland_common/qwaylandinputdevice.cpp
@@ -71,6 +71,7 @@ QWaylandInputDevice::QWaylandInputDevice(QWaylandDisplay *display, uint32_t id)
: QtWayland::wl_seat(display->wl_registry(), id)
, mQDisplay(display)
, mDisplay(display->wl_display())
+ , mFocusCallback(0)
, mCaps(0)
, mTransferDevice(0)
, mPointerFocus(0)
@@ -455,10 +456,14 @@ void QWaylandInputDevice::keyboard_enter(uint32_t time, struct wl_surface *surfa
if (!surface)
return;
+
QWaylandWindow *window = QWaylandWindow::fromWlSurface(surface);
mKeyboardFocus = window;
- mQDisplay->setLastKeyboardFocusInputDevice(this);
- QWindowSystemInterface::handleWindowActivated(window->window());
+
+ if (!mFocusCallback) {
+ mFocusCallback = wl_display_sync(mDisplay);
+ wl_callback_add_listener(mFocusCallback, &QWaylandInputDevice::callback, this);
+ }
}
void QWaylandInputDevice::keyboard_leave(uint32_t time, struct wl_surface *surface)
@@ -467,8 +472,32 @@ void QWaylandInputDevice::keyboard_leave(uint32_t time, struct wl_surface *surfa
Q_UNUSED(surface);
mKeyboardFocus = NULL;
- mQDisplay->setLastKeyboardFocusInputDevice(0);
- QWindowSystemInterface::handleWindowActivated(0);
+
+ // Use a callback to set the focus because we may get a leave/enter pair, and
+ // the latter one would be lost in the QWindowSystemInterface queue, if
+ // we issue the handleWindowActivated() calls immediately.
+ if (!mFocusCallback) {
+ mFocusCallback = wl_display_sync(mDisplay);
+ wl_callback_add_listener(mFocusCallback, &QWaylandInputDevice::callback, this);
+ }
+}
+
+const wl_callback_listener QWaylandInputDevice::callback = {
+ QWaylandInputDevice::focusCallback
+};
+
+void QWaylandInputDevice::focusCallback(void *data, struct wl_callback *callback, uint32_t time)
+{
+ Q_UNUSED(time);
+ Q_UNUSED(callback);
+ QWaylandInputDevice *self = static_cast<QWaylandInputDevice *>(data);
+ if (self->mFocusCallback) {
+ wl_callback_destroy(self->mFocusCallback);
+ self->mFocusCallback = 0;
+ }
+
+ self->mQDisplay->setLastKeyboardFocusInputDevice(self->mKeyboardFocus ? self : 0);
+ QWindowSystemInterface::handleWindowActivated(self->mKeyboardFocus ? self->mKeyboardFocus->window() : 0);
}
void QWaylandInputDevice::keyboard_key(uint32_t serial, uint32_t time, uint32_t key, uint32_t state)