return 0;
}
-void WaylandInputDevice::setKeyboardFocus(WaylandSurface *surface)
+bool WaylandInputDevice::setKeyboardFocus(WaylandSurface *surface)
{
Wayland::Surface *wlsurface = surface?surface->handle():0;
- d->setKeyboardFocus(wlsurface);
+ return d->setKeyboardFocus(wlsurface);
}
WaylandSurface *WaylandInputDevice::mouseFocus() const
void sendFullTouchEvent(QTouchEvent *event);
WaylandSurface *keyboardFocus() const;
- void setKeyboardFocus(WaylandSurface *surface);
+ bool setKeyboardFocus(WaylandSurface *surface);
WaylandSurface *mouseFocus() const;
void setMouseFocus(WaylandSurface *surface, const QPointF &local_pos, const QPointF &global_pos = QPointF());
Q_D(const WaylandSurface);
return d->surface->title();
}
+
+/*!
+ * \return True if WL_SHELL_SURFACE_TRANSIENT_INACTIVE was set for this surface, meaning it should not receive keyboard focus.
+ */
+bool WaylandSurface::transientInactive() const
+{
+ Q_D(const WaylandSurface);
+ return d->surface->transientInactive();
+}
QString title() const;
+ bool transientInactive() const;
+
signals:
void mapped();
void unmapped();
return wayland_cast<Surface>(keyboardDevice()->focus);
}
-void InputDevice::setKeyboardFocus(Surface *surface)
+/*!
+ * \return True if the keyboard focus is changed successfully. False for inactive transient surfaces.
+ */
+bool InputDevice::setKeyboardFocus(Surface *surface)
{
+ if (surface && surface->transientInactive())
+ return false;
+
sendSelectionFocus(surface);
wl_keyboard_set_focus(keyboardDevice(), surface ? surface->base() : 0);
+ return true;
}
Surface *InputDevice::mouseFocus() const
void sendFullTouchEvent(QTouchEvent *event);
Surface *keyboardFocus() const;
- void setKeyboardFocus(Surface *surface);
+ bool setKeyboardFocus(Surface *surface);
Surface *mouseFocus() const;
void setMouseFocus(Surface *surface, const QPointF &localPos, const QPointF &globalPos);
shell_surface->m_transientParent = parent_shell_surface;
shell_surface->m_xOffset = x;
shell_surface->m_yOffset = y;
-
+ if (flags & WL_SHELL_SURFACE_TRANSIENT_INACTIVE)
+ shell_surface->surface()->setTransientInactive(true);
}
void ShellSurface::set_fullscreen(struct wl_client *client,
, m_extendedSurface(0)
, m_subSurface(0)
, m_shellSurface(0)
+ , m_transientInactive(false)
{
wl_list_init(&m_frame_callback_list);
addClientResource(client, &base()->resource, id, &wl_surface_interface,
QString title() const { return m_title; }
void setTitle(const QString &title);
+ bool transientInactive() const { return m_transientInactive; }
+ void setTransientInactive(bool v) { m_transientInactive = v; }
+
private:
Q_DISABLE_COPY(Surface)
QPointF m_position;
QSize m_size;
QString m_title;
+ bool m_transientInactive;
inline SurfaceBuffer *currentSurfaceBuffer() const;
bool advanceBufferQueue();
transientPos.setX(transientPos.x() + parent_wayland_window->decoration()->margins().left());
transientPos.setY(transientPos.y() + parent_wayland_window->decoration()->margins().top());
}
+
+ uint32_t flags = 0;
+ Qt::WindowFlags wf = m_window->window()->windowFlags();
+ if (wf.testFlag(Qt::ToolTip)
+ || wf.testFlag(Qt::WindowTransparentForInput))
+ flags |= WL_SHELL_SURFACE_TRANSIENT_INACTIVE;
+
wl_shell_surface_set_transient(m_shell_surface,
parent_wayland_window->shellSurface()->m_shell_surface,
transientPos.x(),
transientPos.y(),
- 0);
+ flags);
}
void QWaylandShellSurface::setTitle(const char *title)