Made compositor keep track of key / pointer focus surfaces.
authorSamuel Rødal <samuel.rodal@nokia.com>
Mon, 21 Mar 2011 07:53:27 +0000 (08:53 +0100)
committerSamuel Rødal <samuel.rodal@nokia.com>
Mon, 21 Mar 2011 07:53:27 +0000 (08:53 +0100)
Puts less burden on the implementation to make sure the input focus is
cleared when a surface is destroyed.

examples/qml-compositor/main.cpp
examples/qwidget-compositor/main.cpp
src/qt-compositor/wayland_wrapper/wlcompositor.cpp
src/qt-compositor/wayland_wrapper/wlcompositor.h
src/qt-compositor/wayland_wrapper/wlsurface.cpp

index b09444b..79823bc 100644 (file)
@@ -38,7 +38,7 @@
 **
 ****************************************************************************/
 
-#include "qtcompositor.h"
+#include "waylandcompositor.h"
 
 #include "waylandsurface.h"
 
@@ -297,7 +297,6 @@ private slots:
     void surfaceDestroyed(QObject *object) {
         WindowItem *item = m_windowMap.take(object);
         emit windowDestroyed(QVariant::fromValue(static_cast<QSGItem *>(item)));
-        setInputFocus(0);
     }
 
 protected:
index 004d4f8..b9d5d8f 100644 (file)
@@ -76,10 +76,8 @@ public:
 
 private slots:
     void surfaceDestroyed(QObject *object) {
-        WaylandSurface *surface = qobject_cast<WaylandSurface *>(object);
+        WaylandSurface *surface = static_cast<WaylandSurface *>(object);
         m_surfaces.removeAll(surface);
-        if (m_surfaces.isEmpty())
-            setInputFocus(0);
         update();
     }
 
index b18d811..eca6f2d 100644 (file)
@@ -169,6 +169,8 @@ Compositor::Compositor(WaylandCompositor *qt_compositor)
     , m_current_frame(0)
     , m_last_queued_buf(-1)
     , m_qt_compositor(qt_compositor)
+    , m_pointerFocusSurface(0)
+    , m_keyFocusSurface(0)
 {
 #if defined (QT_COMPOSITOR_WAYLAND_GL)
     m_graphics_hw_integration = GraphicsHardwareIntegration::createGraphicsHardwareIntegration(qt_compositor);
@@ -280,6 +282,10 @@ void Compositor::processWaylandEvents()
 void Compositor::surfaceDestroyed(Surface *surface)
 {
     m_surfaces.removeOne(surface);
+    if (m_keyFocusSurface == surface)
+        setKeyFocus(0);
+    if (m_pointerFocusSurface == surface)
+        setPointerFocus(0);
 }
 
 void Compositor::setInputFocus(Surface *surface)
@@ -288,10 +294,24 @@ void Compositor::setInputFocus(Surface *surface)
 
     ulong time = currentTimeMsecs();
 
+    m_keyFocusSurface = surface;
+    m_pointerFocusSurface = surface;
     wl_input_device_set_keyboard_focus(&m_input, base, time);
     wl_input_device_set_pointer_focus(&m_input, base, time, 0, 0, 0, 0);
 }
 
+void Compositor::setKeyFocus(Surface *surface)
+{
+    m_keyFocusSurface = surface;
+    wl_input_device_set_keyboard_focus(&m_input, surface ? surface->base() : 0, currentTimeMsecs());
+}
+
+void Compositor::setPointerFocus(Surface *surface, const QPoint &pos)
+{
+    m_pointerFocusSurface = surface;
+    wl_input_device_set_pointer_focus(&m_input, surface ? surface->base() : 0, currentTimeMsecs(), pos.x(), pos.y(), pos.x(), pos.y());
+}
+
 QWidget * Compositor::topLevelWidget() const
 {
     return m_qt_compositor->topLevelWidget();
index e596f48..b2f0b33 100644 (file)
@@ -65,12 +65,13 @@ public:
 
     void frameFinished();
     void setInputFocus(Surface *surface);
+    void setKeyFocus(Surface *surface);
+    void setPointerFocus(Surface *surface, const QPoint &point = QPoint());
 
     Surface *getSurfaceFromWinId(uint winId) const;
     struct wl_client *getClientFromWinId(uint winId) const;
     QImage image(uint winId) const;
 
-
     const struct wl_input_device *inputDevice() const { return &m_input; }
     struct wl_input_device *inputDevice() { return &m_input; }
 
@@ -111,6 +112,9 @@ private:
 
     WaylandCompositor *m_qt_compositor;
 
+    Surface *m_pointerFocusSurface;
+    Surface *m_keyFocusSurface;
+
 #ifdef QT_COMPOSITOR_WAYLAND_GL
     GraphicsHardwareIntegration *m_graphics_hw_integration;
 #endif
index f281c01..51e835f 100644 (file)
@@ -268,8 +268,7 @@ void Surface::sendMouseMoveEvent(int x, int y)
     Q_D(Surface);
     if (d->client) {
         uint32_t time = d->compositor->currentTimeMsecs();
-        wl_input_device_set_pointer_focus(d->compositor->defaultInputDevice(),
-            base(), time, x, y, x, y);
+        d->compositor->setPointerFocus(this, QPoint(x, y));
         wl_client_post_event(d->client, &d->compositor->defaultInputDevice()->object,
              WL_INPUT_DEVICE_MOTION, time, x, y, x, y);
     }
@@ -299,10 +298,7 @@ void Surface::sendKeyReleaseEvent(uint code)
 void Surface::setInputFocus()
 {
     Q_D(Surface);
-    ulong time = d->compositor->currentTimeMsecs();
-
-    wl_input_device_set_keyboard_focus(d->compositor->defaultInputDevice(), base(), time);
-    wl_input_device_set_pointer_focus(d->compositor->defaultInputDevice(), base(), time, 0, 0, 0, 0);
+    d->compositor->setInputFocus(this);
 }
 
 }