summaryrefslogtreecommitdiffstats
path: root/src/client
diff options
context:
space:
mode:
Diffstat (limited to 'src/client')
-rw-r--r--src/client/qwaylanddatadevice.cpp5
-rw-r--r--src/client/qwaylanddatadevice_p.h1
-rw-r--r--src/client/qwaylandinputdevice.cpp5
-rw-r--r--src/client/qwaylandwindow.cpp9
-rw-r--r--src/client/qwaylandwindow_p.h1
5 files changed, 21 insertions, 0 deletions
diff --git a/src/client/qwaylanddatadevice.cpp b/src/client/qwaylanddatadevice.cpp
index 8f690aae0..74f879f97 100644
--- a/src/client/qwaylanddatadevice.cpp
+++ b/src/client/qwaylanddatadevice.cpp
@@ -77,6 +77,11 @@ QWaylandDataOffer *QWaylandDataDevice::selectionOffer() const
return m_selectionOffer.data();
}
+void QWaylandDataDevice::invalidateSelectionOffer()
+{
+ m_selectionOffer.reset();
+}
+
QWaylandDataSource *QWaylandDataDevice::selectionSource() const
{
return m_selectionSource.data();
diff --git a/src/client/qwaylanddatadevice_p.h b/src/client/qwaylanddatadevice_p.h
index f5fad1772..dae91290e 100644
--- a/src/client/qwaylanddatadevice_p.h
+++ b/src/client/qwaylanddatadevice_p.h
@@ -65,6 +65,7 @@ public:
~QWaylandDataDevice();
QWaylandDataOffer *selectionOffer() const;
+ void invalidateSelectionOffer();
QWaylandDataSource *selectionSource() const;
void setSelectionSource(QWaylandDataSource *source);
diff --git a/src/client/qwaylandinputdevice.cpp b/src/client/qwaylandinputdevice.cpp
index 5be76d90e..c04067688 100644
--- a/src/client/qwaylandinputdevice.cpp
+++ b/src/client/qwaylandinputdevice.cpp
@@ -717,6 +717,11 @@ void QWaylandInputDevice::Keyboard::keyboard_leave(uint32_t time, struct wl_surf
Q_UNUSED(time);
Q_UNUSED(surface);
+ if (surface) {
+ QWaylandWindow *window = QWaylandWindow::fromWlSurface(surface);
+ window->unfocus();
+ }
+
mFocus = NULL;
// Use a callback to set the focus because we may get a leave/enter pair, and
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
index 278825e83..0905cb3a2 100644
--- a/src/client/qwaylandwindow.cpp
+++ b/src/client/qwaylandwindow.cpp
@@ -42,6 +42,7 @@
#include "qwaylandwindow_p.h"
#include "qwaylandbuffer_p.h"
+#include "qwaylanddatadevice_p.h"
#include "qwaylanddisplay_p.h"
#include "qwaylandinputdevice_p.h"
#include "qwaylandscreen_p.h"
@@ -642,6 +643,14 @@ void QWaylandWindow::requestActivateWindow()
// we rely on compositor setting keyboard focus based on window stacking.
}
+void QWaylandWindow::unfocus()
+{
+ QWaylandInputDevice *inputDevice = mDisplay->currentInputDevice();
+ if (inputDevice && inputDevice->dataDevice()) {
+ inputDevice->dataDevice()->invalidateSelectionOffer();
+ }
+}
+
bool QWaylandWindow::isExposed() const
{
if (mShellSurface)
diff --git a/src/client/qwaylandwindow_p.h b/src/client/qwaylandwindow_p.h
index db0b59458..a69af9c0e 100644
--- a/src/client/qwaylandwindow_p.h
+++ b/src/client/qwaylandwindow_p.h
@@ -142,6 +142,7 @@ public:
void requestActivateWindow() Q_DECL_OVERRIDE;
bool isExposed() const Q_DECL_OVERRIDE;
+ void unfocus();
QWaylandDecoration *decoration() const;
void setDecoration(QWaylandDecoration *decoration);