**
****************************************************************************/
-#include "qtcompositor.h"
+#include "waylandcompositor.h"
#include "waylandsurface.h"
void surfaceDestroyed(QObject *object) {
WindowItem *item = m_windowMap.take(object);
emit windowDestroyed(QVariant::fromValue(static_cast<QSGItem *>(item)));
- setInputFocus(0);
}
protected:
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();
}
, 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);
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)
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();
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; }
WaylandCompositor *m_qt_compositor;
+ Surface *m_pointerFocusSurface;
+ Surface *m_keyFocusSurface;
+
#ifdef QT_COMPOSITOR_WAYLAND_GL
GraphicsHardwareIntegration *m_graphics_hw_integration;
#endif
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);
}
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);
}
}