Client: Drop XdgShellV5 and XdgShellV6
Both of these are deprecated given this is now formalised as the final xdg-wm-base. This final release has been out for several years and all main compositors (kwin, sway, mutter) have dropped or are dropping legacy support. tst_nooutput is moved to stable XdgShell. Change-Id: I46a011502dfec6d4a215c3b22d03e8ceebed46c3 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
This commit is contained in:
parent
edbc9697b6
commit
19281f9c3b
@ -157,7 +157,7 @@
|
||||
"Name": "Wayland XDG Shell Protocol",
|
||||
"QDocModule": "qtwaylandcompositor",
|
||||
"QtUsage": "Used in the Qt Wayland Compositor, and the Qt Wayland platform plugin.",
|
||||
"Files": " xdg-shell-unstable-v5.xml xdg-shell-unstable-v6.xml xdg-shell.xml ../../plugins/shellintegration/xdg-shell-v5/pregenerated/3rdparty/qwayland-xdg-shell-unstable-v5.cpp ../../plugins/shellintegration/xdg-shell-v5/pregenerated/3rdparty/qwayland-xdg-shell-unstable-v5_p.h ../../plugins/shellintegration/xdg-shell-v5/pregenerated/3rdparty/wayland-xdg-shell-unstable-v5-client-protocol_p.h ../../plugins/shellintegration/xdg-shell-v5/pregenerated/3rdparty/wayland-xdg-shell-unstable-v5-protocol.c",
|
||||
"Files": "xdg-shell.xml",
|
||||
|
||||
"Description": "The XDG-Shell protocol is an extended way to manage surfaces under Wayland compositors.",
|
||||
"Homepage": "https://gitlab.freedesktop.org/wayland/wayland-protocols/",
|
||||
|
@ -1,623 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="xdg_shell_unstable_v5">
|
||||
|
||||
<copyright>
|
||||
Copyright © 2008-2013 Kristian Høgsberg
|
||||
Copyright © 2013 Rafael Antognolli
|
||||
Copyright © 2013 Jasper St. Pierre
|
||||
Copyright © 2010-2013 Intel Corporation
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
</copyright>
|
||||
|
||||
<interface name="xdg_shell" version="1">
|
||||
<description summary="create desktop-style surfaces">
|
||||
xdg_shell allows clients to turn a wl_surface into a "real window"
|
||||
which can be dragged, resized, stacked, and moved around by the
|
||||
user. Everything about this interface is suited towards traditional
|
||||
desktop environments.
|
||||
</description>
|
||||
|
||||
<enum name="version">
|
||||
<description summary="latest protocol version">
|
||||
The 'current' member of this enum gives the version of the
|
||||
protocol. Implementations can compare this to the version
|
||||
they implement using static_assert to ensure the protocol and
|
||||
implementation versions match.
|
||||
</description>
|
||||
<entry name="current" value="5" summary="Always the latest version"/>
|
||||
</enum>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="role" value="0" summary="given wl_surface has another role"/>
|
||||
<entry name="defunct_surfaces" value="1" summary="xdg_shell was destroyed before children"/>
|
||||
<entry name="not_the_topmost_popup" value="2" summary="the client tried to map or destroy a non-topmost popup"/>
|
||||
<entry name="invalid_popup_parent" value="3" summary="the client specified an invalid popup parent surface"/>
|
||||
</enum>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy xdg_shell">
|
||||
Destroy this xdg_shell object.
|
||||
|
||||
Destroying a bound xdg_shell object while there are surfaces
|
||||
still alive created by this xdg_shell object instance is illegal
|
||||
and will result in a protocol error.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="use_unstable_version">
|
||||
<description summary="enable use of this unstable version">
|
||||
Negotiate the unstable version of the interface. This
|
||||
mechanism is in place to ensure client and server agree on the
|
||||
unstable versions of the protocol that they speak or exit
|
||||
cleanly if they don't agree. This request will go away once
|
||||
the xdg-shell protocol is stable.
|
||||
</description>
|
||||
<arg name="version" type="int"/>
|
||||
</request>
|
||||
|
||||
<request name="get_xdg_surface">
|
||||
<description summary="create a shell surface from a surface">
|
||||
This creates an xdg_surface for the given surface and gives it the
|
||||
xdg_surface role. A wl_surface can only be given an xdg_surface role
|
||||
once. If get_xdg_surface is called with a wl_surface that already has
|
||||
an active xdg_surface associated with it, or if it had any other role,
|
||||
an error is raised.
|
||||
|
||||
See the documentation of xdg_surface for more details about what an
|
||||
xdg_surface is and how it is used.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="xdg_surface"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"/>
|
||||
</request>
|
||||
|
||||
<request name="get_xdg_popup">
|
||||
<description summary="create a popup for a surface">
|
||||
This creates an xdg_popup for the given surface and gives it the
|
||||
xdg_popup role. A wl_surface can only be given an xdg_popup role
|
||||
once. If get_xdg_popup is called with a wl_surface that already has
|
||||
an active xdg_popup associated with it, or if it had any other role,
|
||||
an error is raised.
|
||||
|
||||
This request must be used in response to some sort of user action
|
||||
like a button press, key press, or touch down event.
|
||||
|
||||
See the documentation of xdg_popup for more details about what an
|
||||
xdg_popup is and how it is used.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="xdg_popup"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"/>
|
||||
<arg name="parent" type="object" interface="wl_surface"/>
|
||||
<arg name="seat" type="object" interface="wl_seat" summary="the wl_seat of the user event"/>
|
||||
<arg name="serial" type="uint" summary="the serial of the user event"/>
|
||||
<arg name="x" type="int"/>
|
||||
<arg name="y" type="int"/>
|
||||
</request>
|
||||
|
||||
<event name="ping">
|
||||
<description summary="check if the client is alive">
|
||||
The ping event asks the client if it's still alive. Pass the
|
||||
serial specified in the event back to the compositor by sending
|
||||
a "pong" request back with the specified serial.
|
||||
|
||||
Compositors can use this to determine if the client is still
|
||||
alive. It's unspecified what will happen if the client doesn't
|
||||
respond to the ping request, or in what timeframe. Clients should
|
||||
try to respond in a reasonable amount of time.
|
||||
|
||||
A compositor is free to ping in any way it wants, but a client must
|
||||
always respond to any xdg_shell object it created.
|
||||
</description>
|
||||
<arg name="serial" type="uint" summary="pass this to the pong request"/>
|
||||
</event>
|
||||
|
||||
<request name="pong">
|
||||
<description summary="respond to a ping event">
|
||||
A client must respond to a ping event with a pong request or
|
||||
the client may be deemed unresponsive.
|
||||
</description>
|
||||
<arg name="serial" type="uint" summary="serial of the ping event"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="xdg_surface" version="1">
|
||||
<description summary="A desktop window">
|
||||
An interface that may be implemented by a wl_surface, for
|
||||
implementations that provide a desktop-style user interface.
|
||||
|
||||
It provides requests to treat surfaces like windows, allowing to set
|
||||
properties like maximized, fullscreen, minimized, and to move and resize
|
||||
them, and associate metadata like title and app id.
|
||||
|
||||
The client must call wl_surface.commit on the corresponding wl_surface
|
||||
for the xdg_surface state to take effect. Prior to committing the new
|
||||
state, it can set up initial configuration, such as maximizing or setting
|
||||
a window geometry.
|
||||
|
||||
Even without attaching a buffer the compositor must respond to initial
|
||||
committed configuration, for instance sending a configure event with
|
||||
expected window geometry if the client maximized its surface during
|
||||
initialization.
|
||||
|
||||
For a surface to be mapped by the compositor the client must have
|
||||
committed both an xdg_surface state and a buffer.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="Destroy the xdg_surface">
|
||||
Unmap and destroy the window. The window will be effectively
|
||||
hidden from the user's point of view, and all state like
|
||||
maximization, fullscreen, and so on, will be lost.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="set_parent">
|
||||
<description summary="set the parent of this surface">
|
||||
Set the "parent" of this surface. This window should be stacked
|
||||
above a parent. The parent surface must be mapped as long as this
|
||||
surface is mapped.
|
||||
|
||||
Parent windows should be set on dialogs, toolboxes, or other
|
||||
"auxiliary" surfaces, so that the parent is raised when the dialog
|
||||
is raised.
|
||||
</description>
|
||||
<arg name="parent" type="object" interface="xdg_surface" allow-null="true"/>
|
||||
</request>
|
||||
|
||||
<request name="set_title">
|
||||
<description summary="set surface title">
|
||||
Set a short title for the surface.
|
||||
|
||||
This string may be used to identify the surface in a task bar,
|
||||
window list, or other user interface elements provided by the
|
||||
compositor.
|
||||
|
||||
The string must be encoded in UTF-8.
|
||||
</description>
|
||||
<arg name="title" type="string"/>
|
||||
</request>
|
||||
|
||||
<request name="set_app_id">
|
||||
<description summary="set application ID">
|
||||
Set an application identifier for the surface.
|
||||
|
||||
The app ID identifies the general class of applications to which
|
||||
the surface belongs. The compositor can use this to group multiple
|
||||
surfaces together, or to determine how to launch a new application.
|
||||
|
||||
For D-Bus activatable applications, the app ID is used as the D-Bus
|
||||
service name.
|
||||
|
||||
The compositor shell will try to group application surfaces together
|
||||
by their app ID. As a best practice, it is suggested to select app
|
||||
ID's that match the basename of the application's .desktop file.
|
||||
For example, "org.freedesktop.FooViewer" where the .desktop file is
|
||||
"org.freedesktop.FooViewer.desktop".
|
||||
|
||||
See the desktop-entry specification [0] for more details on
|
||||
application identifiers and how they relate to well-known D-Bus
|
||||
names and .desktop files.
|
||||
|
||||
[0] http://standards.freedesktop.org/desktop-entry-spec/
|
||||
</description>
|
||||
<arg name="app_id" type="string"/>
|
||||
</request>
|
||||
|
||||
<request name="show_window_menu">
|
||||
<description summary="show the window menu">
|
||||
Clients implementing client-side decorations might want to show
|
||||
a context menu when right-clicking on the decorations, giving the
|
||||
user a menu that they can use to maximize or minimize the window.
|
||||
|
||||
This request asks the compositor to pop up such a window menu at
|
||||
the given position, relative to the local surface coordinates of
|
||||
the parent surface. There are no guarantees as to what menu items
|
||||
the window menu contains.
|
||||
|
||||
This request must be used in response to some sort of user action
|
||||
like a button press, key press, or touch down event.
|
||||
</description>
|
||||
<arg name="seat" type="object" interface="wl_seat" summary="the wl_seat of the user event"/>
|
||||
<arg name="serial" type="uint" summary="the serial of the user event"/>
|
||||
<arg name="x" type="int" summary="the x position to pop up the window menu at"/>
|
||||
<arg name="y" type="int" summary="the y position to pop up the window menu at"/>
|
||||
</request>
|
||||
|
||||
<request name="move">
|
||||
<description summary="start an interactive move">
|
||||
Start an interactive, user-driven move of the surface.
|
||||
|
||||
This request must be used in response to some sort of user action
|
||||
like a button press, key press, or touch down event. The passed
|
||||
serial is used to determine the type of interactive move (touch,
|
||||
pointer, etc).
|
||||
|
||||
The server may ignore move requests depending on the state of
|
||||
the surface (e.g. fullscreen or maximized), or if the passed serial
|
||||
is no longer valid.
|
||||
|
||||
If triggered, the surface will lose the focus of the device
|
||||
(wl_pointer, wl_touch, etc) used for the move. It is up to the
|
||||
compositor to visually indicate that the move is taking place, such as
|
||||
updating a pointer cursor, during the move. There is no guarantee
|
||||
that the device focus will return when the move is completed.
|
||||
</description>
|
||||
<arg name="seat" type="object" interface="wl_seat" summary="the wl_seat of the user event"/>
|
||||
<arg name="serial" type="uint" summary="the serial of the user event"/>
|
||||
</request>
|
||||
|
||||
<enum name="resize_edge">
|
||||
<description summary="edge values for resizing">
|
||||
These values are used to indicate which edge of a surface
|
||||
is being dragged in a resize operation.
|
||||
</description>
|
||||
<entry name="none" value="0"/>
|
||||
<entry name="top" value="1"/>
|
||||
<entry name="bottom" value="2"/>
|
||||
<entry name="left" value="4"/>
|
||||
<entry name="top_left" value="5"/>
|
||||
<entry name="bottom_left" value="6"/>
|
||||
<entry name="right" value="8"/>
|
||||
<entry name="top_right" value="9"/>
|
||||
<entry name="bottom_right" value="10"/>
|
||||
</enum>
|
||||
|
||||
<request name="resize">
|
||||
<description summary="start an interactive resize">
|
||||
Start a user-driven, interactive resize of the surface.
|
||||
|
||||
This request must be used in response to some sort of user action
|
||||
like a button press, key press, or touch down event. The passed
|
||||
serial is used to determine the type of interactive resize (touch,
|
||||
pointer, etc).
|
||||
|
||||
The server may ignore resize requests depending on the state of
|
||||
the surface (e.g. fullscreen or maximized).
|
||||
|
||||
If triggered, the client will receive configure events with the
|
||||
"resize" state enum value and the expected sizes. See the "resize"
|
||||
enum value for more details about what is required. The client
|
||||
must also acknowledge configure events using "ack_configure". After
|
||||
the resize is completed, the client will receive another "configure"
|
||||
event without the resize state.
|
||||
|
||||
If triggered, the surface also will lose the focus of the device
|
||||
(wl_pointer, wl_touch, etc) used for the resize. It is up to the
|
||||
compositor to visually indicate that the resize is taking place,
|
||||
such as updating a pointer cursor, during the resize. There is no
|
||||
guarantee that the device focus will return when the resize is
|
||||
completed.
|
||||
|
||||
The edges parameter specifies how the surface should be resized,
|
||||
and is one of the values of the resize_edge enum. The compositor
|
||||
may use this information to update the surface position for
|
||||
example when dragging the top left corner. The compositor may also
|
||||
use this information to adapt its behavior, e.g. choose an
|
||||
appropriate cursor image.
|
||||
</description>
|
||||
<arg name="seat" type="object" interface="wl_seat" summary="the wl_seat of the user event"/>
|
||||
<arg name="serial" type="uint" summary="the serial of the user event"/>
|
||||
<arg name="edges" type="uint" summary="which edge or corner is being dragged"/>
|
||||
</request>
|
||||
|
||||
<enum name="state">
|
||||
<description summary="types of state on the surface">
|
||||
The different state values used on the surface. This is designed for
|
||||
state values like maximized, fullscreen. It is paired with the
|
||||
configure event to ensure that both the client and the compositor
|
||||
setting the state can be synchronized.
|
||||
|
||||
States set in this way are double-buffered. They will get applied on
|
||||
the next commit.
|
||||
|
||||
Desktop environments may extend this enum by taking up a range of
|
||||
values and documenting the range they chose in this description.
|
||||
They are not required to document the values for the range that they
|
||||
chose. Ideally, any good extensions from a desktop environment should
|
||||
make its way into standardization into this enum.
|
||||
|
||||
The current reserved ranges are:
|
||||
|
||||
0x0000 - 0x0FFF: xdg-shell core values, documented below.
|
||||
0x1000 - 0x1FFF: GNOME
|
||||
0x2000 - 0x2FFF: EFL
|
||||
</description>
|
||||
<entry name="maximized" value="1" summary="the surface is maximized">
|
||||
<description summary="the surface is maximized">
|
||||
The surface is maximized. The window geometry specified in the configure
|
||||
event must be obeyed by the client.
|
||||
</description>
|
||||
</entry>
|
||||
<entry name="fullscreen" value="2" summary="the surface is fullscreen">
|
||||
<description summary="the surface is fullscreen">
|
||||
The surface is fullscreen. The window geometry specified in the configure
|
||||
event must be obeyed by the client.
|
||||
</description>
|
||||
</entry>
|
||||
<entry name="resizing" value="3" summary="the surface is being resized">
|
||||
<description summary="the surface is being resized">
|
||||
The surface is being resized. The window geometry specified in the
|
||||
configure event is a maximum; the client cannot resize beyond it.
|
||||
Clients that have aspect ratio or cell sizing configuration can use
|
||||
a smaller size, however.
|
||||
</description>
|
||||
</entry>
|
||||
<entry name="activated" value="4" summary="the surface is now activated">
|
||||
<description summary="the surface is now activated">
|
||||
Client window decorations should be painted as if the window is
|
||||
active. Do not assume this means that the window actually has
|
||||
keyboard or pointer focus.
|
||||
</description>
|
||||
</entry>
|
||||
</enum>
|
||||
|
||||
<event name="configure">
|
||||
<description summary="suggest a surface change">
|
||||
The configure event asks the client to resize its surface or to
|
||||
change its state.
|
||||
|
||||
The width and height arguments specify a hint to the window
|
||||
about how its surface should be resized in window geometry
|
||||
coordinates. See set_window_geometry.
|
||||
|
||||
If the width or height arguments are zero, it means the client
|
||||
should decide its own window dimension. This may happen when the
|
||||
compositor need to configure the state of the surface but doesn't
|
||||
have any information about any previous or expected dimension.
|
||||
|
||||
The states listed in the event specify how the width/height
|
||||
arguments should be interpreted, and possibly how it should be
|
||||
drawn.
|
||||
|
||||
Clients should arrange their surface for the new size and
|
||||
states, and then send a ack_configure request with the serial
|
||||
sent in this configure event at some point before committing
|
||||
the new surface.
|
||||
|
||||
If the client receives multiple configure events before it
|
||||
can respond to one, it is free to discard all but the last
|
||||
event it received.
|
||||
</description>
|
||||
<arg name="width" type="int"/>
|
||||
<arg name="height" type="int"/>
|
||||
<arg name="states" type="array"/>
|
||||
<arg name="serial" type="uint"/>
|
||||
</event>
|
||||
|
||||
<request name="ack_configure">
|
||||
<description summary="ack a configure event">
|
||||
When a configure event is received, if a client commits the
|
||||
surface in response to the configure event, then the client
|
||||
must make an ack_configure request sometime before the commit
|
||||
request, passing along the serial of the configure event.
|
||||
|
||||
For instance, the compositor might use this information to move
|
||||
a surface to the top left only when the client has drawn itself
|
||||
for the maximized or fullscreen state.
|
||||
|
||||
If the client receives multiple configure events before it
|
||||
can respond to one, it only has to ack the last configure event.
|
||||
|
||||
A client is not required to commit immediately after sending
|
||||
an ack_configure request - it may even ack_configure several times
|
||||
before its next surface commit.
|
||||
|
||||
The compositor expects that the most recently received
|
||||
ack_configure request at the time of a commit indicates which
|
||||
configure event the client is responding to.
|
||||
</description>
|
||||
<arg name="serial" type="uint" summary="the serial from the configure event"/>
|
||||
</request>
|
||||
|
||||
<request name="set_window_geometry">
|
||||
<description summary="set the new window geometry">
|
||||
The window geometry of a window is its "visible bounds" from the
|
||||
user's perspective. Client-side decorations often have invisible
|
||||
portions like drop-shadows which should be ignored for the
|
||||
purposes of aligning, placing and constraining windows.
|
||||
|
||||
The window geometry is double buffered, and will be applied at the
|
||||
time wl_surface.commit of the corresponding wl_surface is called.
|
||||
|
||||
Once the window geometry of the surface is set once, it is not
|
||||
possible to unset it, and it will remain the same until
|
||||
set_window_geometry is called again, even if a new subsurface or
|
||||
buffer is attached.
|
||||
|
||||
If never set, the value is the full bounds of the surface,
|
||||
including any subsurfaces. This updates dynamically on every
|
||||
commit. This unset mode is meant for extremely simple clients.
|
||||
|
||||
If responding to a configure event, the window geometry in here
|
||||
must respect the sizing negotiations specified by the states in
|
||||
the configure event.
|
||||
|
||||
The arguments are given in the surface local coordinate space of
|
||||
the wl_surface associated with this xdg_surface.
|
||||
|
||||
The width and height must be greater than zero.
|
||||
</description>
|
||||
<arg name="x" type="int"/>
|
||||
<arg name="y" type="int"/>
|
||||
<arg name="width" type="int"/>
|
||||
<arg name="height" type="int"/>
|
||||
</request>
|
||||
|
||||
<request name="set_maximized">
|
||||
<description summary="maximize the window">
|
||||
Maximize the surface.
|
||||
|
||||
After requesting that the surface should be maximized, the compositor
|
||||
will respond by emitting a configure event with the "maximized" state
|
||||
and the required window geometry. The client should then update its
|
||||
content, drawing it in a maximized state, i.e. without shadow or other
|
||||
decoration outside of the window geometry. The client must also
|
||||
acknowledge the configure when committing the new content (see
|
||||
ack_configure).
|
||||
|
||||
It is up to the compositor to decide how and where to maximize the
|
||||
surface, for example which output and what region of the screen should
|
||||
be used.
|
||||
|
||||
If the surface was already maximized, the compositor will still emit
|
||||
a configure event with the "maximized" state.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="unset_maximized">
|
||||
<description summary="unmaximize the window">
|
||||
Unmaximize the surface.
|
||||
|
||||
After requesting that the surface should be unmaximized, the compositor
|
||||
will respond by emitting a configure event without the "maximized"
|
||||
state. If available, the compositor will include the window geometry
|
||||
dimensions the window had prior to being maximized in the configure
|
||||
request. The client must then update its content, drawing it in a
|
||||
regular state, i.e. potentially with shadow, etc. The client must also
|
||||
acknowledge the configure when committing the new content (see
|
||||
ack_configure).
|
||||
|
||||
It is up to the compositor to position the surface after it was
|
||||
unmaximized; usually the position the surface had before maximizing, if
|
||||
applicable.
|
||||
|
||||
If the surface was already not maximized, the compositor will still
|
||||
emit a configure event without the "maximized" state.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="set_fullscreen">
|
||||
<description summary="set the window as fullscreen on a monitor">
|
||||
Make the surface fullscreen.
|
||||
|
||||
You can specify an output that you would prefer to be fullscreen.
|
||||
If this value is NULL, it's up to the compositor to choose which
|
||||
display will be used to map this surface.
|
||||
|
||||
If the surface doesn't cover the whole output, the compositor will
|
||||
position the surface in the center of the output and compensate with
|
||||
black borders filling the rest of the output.
|
||||
</description>
|
||||
<arg name="output" type="object" interface="wl_output" allow-null="true"/>
|
||||
</request>
|
||||
<request name="unset_fullscreen" />
|
||||
|
||||
<request name="set_minimized">
|
||||
<description summary="set the window as minimized">
|
||||
Request that the compositor minimize your surface. There is no
|
||||
way to know if the surface is currently minimized, nor is there
|
||||
any way to unset minimization on this surface.
|
||||
|
||||
If you are looking to throttle redrawing when minimized, please
|
||||
instead use the wl_surface.frame event for this, as this will
|
||||
also work with live previews on windows in Alt-Tab, Expose or
|
||||
similar compositor features.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<event name="close">
|
||||
<description summary="surface wants to be closed">
|
||||
The close event is sent by the compositor when the user
|
||||
wants the surface to be closed. This should be equivalent to
|
||||
the user clicking the close button in client-side decorations,
|
||||
if your application has any...
|
||||
|
||||
This is only a request that the user intends to close your
|
||||
window. The client may choose to ignore this request, or show
|
||||
a dialog to ask the user to save their data...
|
||||
</description>
|
||||
</event>
|
||||
</interface>
|
||||
|
||||
<interface name="xdg_popup" version="1">
|
||||
<description summary="short-lived, popup surfaces for menus">
|
||||
A popup surface is a short-lived, temporary surface that can be
|
||||
used to implement menus. It takes an explicit grab on the surface
|
||||
that will be dismissed when the user dismisses the popup. This can
|
||||
be done by the user clicking outside the surface, using the keyboard,
|
||||
or even locking the screen through closing the lid or a timeout.
|
||||
|
||||
When the popup is dismissed, a popup_done event will be sent out,
|
||||
and at the same time the surface will be unmapped. The xdg_popup
|
||||
object is now inert and cannot be reactivated, so clients should
|
||||
destroy it. Explicitly destroying the xdg_popup object will also
|
||||
dismiss the popup and unmap the surface.
|
||||
|
||||
Clients will receive events for all their surfaces during this
|
||||
grab (which is an "owner-events" grab in X11 parlance). This is
|
||||
done so that users can navigate through submenus and other
|
||||
"nested" popup windows without having to dismiss the topmost
|
||||
popup.
|
||||
|
||||
Clients that want to dismiss the popup when another surface of
|
||||
their own is clicked should dismiss the popup using the destroy
|
||||
request.
|
||||
|
||||
The parent surface must have either an xdg_surface or xdg_popup
|
||||
role.
|
||||
|
||||
Specifying an xdg_popup for the parent means that the popups are
|
||||
nested, with this popup now being the topmost popup. Nested
|
||||
popups must be destroyed in the reverse order they were created
|
||||
in, e.g. the only popup you are allowed to destroy at all times
|
||||
is the topmost one.
|
||||
|
||||
If there is an existing popup when creating a new popup, the
|
||||
parent must be the current topmost popup.
|
||||
|
||||
A parent surface must be mapped before the new popup is mapped.
|
||||
|
||||
When compositors choose to dismiss a popup, they will likely
|
||||
dismiss every nested popup as well. When a compositor dismisses
|
||||
popups, it will follow the same dismissing order as required
|
||||
from the client.
|
||||
|
||||
The x and y arguments passed when creating the popup object specify
|
||||
where the top left of the popup should be placed, relative to the
|
||||
local surface coordinates of the parent surface. See
|
||||
xdg_shell.get_xdg_popup.
|
||||
|
||||
The client must call wl_surface.commit on the corresponding wl_surface
|
||||
for the xdg_popup state to take effect.
|
||||
|
||||
For a surface to be mapped by the compositor the client must have
|
||||
committed both the xdg_popup state and a buffer.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="remove xdg_popup interface">
|
||||
This destroys the popup. Explicitly destroying the xdg_popup
|
||||
object will also dismiss the popup, and unmap the surface.
|
||||
|
||||
If this xdg_popup is not the "topmost" popup, a protocol error
|
||||
will be sent.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<event name="popup_done">
|
||||
<description summary="popup interaction is done">
|
||||
The popup_done event is sent out when a popup is dismissed by the
|
||||
compositor. The client should destroy the xdg_popup object at this
|
||||
point.
|
||||
</description>
|
||||
</event>
|
||||
|
||||
</interface>
|
||||
</protocol>
|
@ -182,14 +182,6 @@ qt_feature("wayland-client-xdg-shell" PRIVATE
|
||||
LABEL "xdg-shell"
|
||||
CONDITION QT_FEATURE_wayland_client
|
||||
)
|
||||
qt_feature("wayland-client-xdg-shell-v5" PRIVATE
|
||||
LABEL "xdg-shell unstable v5 (deprecated)"
|
||||
CONDITION QT_FEATURE_wayland_client
|
||||
)
|
||||
qt_feature("wayland-client-xdg-shell-v6" PRIVATE
|
||||
LABEL "xdg-shell unstable v6"
|
||||
CONDITION QT_FEATURE_wayland_client
|
||||
)
|
||||
qt_feature("egl-extension-platform-wayland" PRIVATE
|
||||
LABEL "EGL wayland platform extension"
|
||||
CONDITION QT_FEATURE_wayland_client AND QT_FEATURE_opengl AND QT_FEATURE_egl AND TEST_egl_1_5_wayland
|
||||
|
@ -207,16 +207,6 @@
|
||||
"condition": "features.wayland-client",
|
||||
"output": [ "privateFeature" ]
|
||||
},
|
||||
"wayland-client-xdg-shell-v5": {
|
||||
"label": "xdg-shell unstable v5 (deprecated)",
|
||||
"condition": "features.wayland-client",
|
||||
"output": [ "privateFeature" ]
|
||||
},
|
||||
"wayland-client-xdg-shell-v6": {
|
||||
"label": "xdg-shell unstable v6",
|
||||
"condition": "features.wayland-client",
|
||||
"output": [ "privateFeature" ]
|
||||
},
|
||||
"egl-extension-platform-wayland": {
|
||||
"label": "EGL wayland platform extension",
|
||||
"condition": "features.wayland-client && features.opengl && features.egl && tests.egl_1_5-wayland",
|
||||
@ -298,8 +288,6 @@
|
||||
"condition": "features.wayland-client",
|
||||
"entries": [
|
||||
"wayland-client-xdg-shell",
|
||||
"wayland-client-xdg-shell-v5",
|
||||
"wayland-client-xdg-shell-v6",
|
||||
"wayland-client-ivi-shell",
|
||||
"wayland-client-wl-shell"
|
||||
]
|
||||
|
@ -12,9 +12,3 @@ endif()
|
||||
if(QT_FEATURE_wayland_client_xdg_shell)
|
||||
add_subdirectory(xdg-shell)
|
||||
endif()
|
||||
if(QT_FEATURE_wayland_client_xdg_shell_v5)
|
||||
add_subdirectory(xdg-shell-v5)
|
||||
endif()
|
||||
if(QT_FEATURE_wayland_client_xdg_shell_v6)
|
||||
add_subdirectory(xdg-shell-v6)
|
||||
endif()
|
||||
|
@ -5,5 +5,3 @@ qtConfig(wayland-client-fullscreen-shell-v1): SUBDIRS += fullscreen-shell-v1
|
||||
qtConfig(wayland-client-ivi-shell): SUBDIRS += ivi-shell
|
||||
qtConfig(wayland-client-wl-shell): SUBDIRS += wl-shell
|
||||
qtConfig(wayland-client-xdg-shell): SUBDIRS += xdg-shell
|
||||
qtConfig(wayland-client-xdg-shell-v5): SUBDIRS += xdg-shell-v5
|
||||
qtConfig(wayland-client-xdg-shell-v6): SUBDIRS += xdg-shell-v6
|
||||
|
@ -63,7 +63,7 @@ bool QWaylandWlShellIntegration::initialize(QWaylandDisplay *display)
|
||||
}
|
||||
|
||||
qCWarning(lcQpaWayland) << "\"wl-shell\" is a deprecated shell extension, prefer using"
|
||||
<< "\"xdg-shell-v6\" or \"xdg-shell\" if supported by the compositor"
|
||||
<< "\"xdg-shell\" if supported by the compositor"
|
||||
<< "by setting the environment variable QT_WAYLAND_SHELL_INTEGRATION";
|
||||
|
||||
return QWaylandShellIntegration::initialize(display);
|
||||
|
@ -1,38 +0,0 @@
|
||||
# Generated from xdg-shell-v5.pro.
|
||||
|
||||
#####################################################################
|
||||
## QWaylandXdgShellV5IntegrationPlugin Plugin:
|
||||
#####################################################################
|
||||
|
||||
qt_internal_add_plugin(QWaylandXdgShellV5IntegrationPlugin
|
||||
OUTPUT_NAME xdg-shell-v5
|
||||
TYPE wayland-shell-integration
|
||||
SOURCES
|
||||
main.cpp
|
||||
pregenerated/3rdparty/qwayland-xdg-shell-unstable-v5.cpp pregenerated/3rdparty/qwayland-xdg-shell-unstable-v5_p.h
|
||||
pregenerated/3rdparty/wayland-xdg-shell-unstable-v5-client-protocol_p.h
|
||||
pregenerated/3rdparty/wayland-xdg-shell-unstable-v5-protocol.c
|
||||
qwaylandxdgpopupv5.cpp qwaylandxdgpopupv5_p.h
|
||||
qwaylandxdgshellv5.cpp qwaylandxdgshellv5_p.h
|
||||
qwaylandxdgshellv5integration.cpp qwaylandxdgshellv5integration_p.h
|
||||
qwaylandxdgsurfacev5.cpp qwaylandxdgsurfacev5_p.h
|
||||
INCLUDE_DIRECTORIES
|
||||
pregenerated/3rdparty
|
||||
PUBLIC_LIBRARIES
|
||||
Qt::Core
|
||||
Qt::Gui
|
||||
Qt::GuiPrivate
|
||||
Qt::WaylandClientPrivate
|
||||
Wayland::Client
|
||||
)
|
||||
|
||||
#### Keys ignored in scope 1:.:.:xdg-shell-v5.pro:<TRUE>:
|
||||
# OTHER_FILES = "xdg-shell-v5.json"
|
||||
|
||||
## Scopes:
|
||||
#####################################################################
|
||||
|
||||
qt_internal_extend_target(QWaylandXdgShellV5IntegrationPlugin CONDITION QT_FEATURE_xkbcommon
|
||||
PUBLIC_LIBRARIES
|
||||
XKB::XKB
|
||||
)
|
@ -1,69 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2018 The Qt Company Ltd.
|
||||
** Copyright (C) 2017 ITAGE Corporation, author: <yusuke.binsaki@itage.co.jp>
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the plugins of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or (at your option) the GNU General
|
||||
** Public license version 3 or any later version approved by the KDE Free
|
||||
** Qt Foundation. The licenses are as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qwaylandxdgshellv5integration_p.h"
|
||||
|
||||
#include <QtWaylandClient/private/qwaylandshellintegrationplugin_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QtWaylandClient {
|
||||
|
||||
class QWaylandXdgShellV5IntegrationPlugin : public QWaylandShellIntegrationPlugin
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PLUGIN_METADATA(IID QWaylandShellIntegrationFactoryInterface_iid FILE "xdg-shell-v5.json")
|
||||
|
||||
public:
|
||||
QWaylandShellIntegration *create(const QString &key, const QStringList ¶mList) override;
|
||||
};
|
||||
|
||||
QWaylandShellIntegration *QWaylandXdgShellV5IntegrationPlugin::create(const QString &key, const QStringList ¶mList)
|
||||
{
|
||||
Q_UNUSED(key);
|
||||
Q_UNUSED(paramList);
|
||||
return new QWaylandXdgShellV5Integration();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#include "main.moc"
|
@ -1,3 +0,0 @@
|
||||
!qwayland-*.cpp
|
||||
!qwayland-*.h
|
||||
!wayland-*-protocol.c
|
@ -1,399 +0,0 @@
|
||||
// Hand-edited to resolve conflicts with xdg-shell stable
|
||||
/*
|
||||
* Copyright © 2008-2013 Kristian Høgsberg
|
||||
* Copyright © 2013 Rafael Antognolli
|
||||
* Copyright © 2013 Jasper St. Pierre
|
||||
* Copyright © 2010-2013 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include "qwayland-xdg-shell-unstable-v5_p.h"
|
||||
#include <QtWaylandClient/private/wayland-wayland-client-protocol.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
QT_WARNING_PUSH
|
||||
QT_WARNING_DISABLE_GCC("-Wmissing-field-initializers")
|
||||
|
||||
namespace QtWayland {
|
||||
xdg_shell_v5::xdg_shell_v5(struct ::wl_registry *registry, int id, int version)
|
||||
{
|
||||
init(registry, id, version);
|
||||
}
|
||||
|
||||
xdg_shell_v5::xdg_shell_v5(struct ::xdg_shell_v5 *obj)
|
||||
: m_xdg_shell(obj)
|
||||
{
|
||||
init_listener();
|
||||
}
|
||||
|
||||
xdg_shell_v5::xdg_shell_v5()
|
||||
: m_xdg_shell(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
xdg_shell_v5::~xdg_shell_v5()
|
||||
{
|
||||
}
|
||||
|
||||
void xdg_shell_v5::init(struct ::wl_registry *registry, int id, int version)
|
||||
{
|
||||
m_xdg_shell = static_cast<struct ::xdg_shell_v5 *>(wl_registry_bind(registry, id, &xdg_shell_v5_interface, version));
|
||||
init_listener();
|
||||
}
|
||||
|
||||
void xdg_shell_v5::init(struct ::xdg_shell_v5 *obj)
|
||||
{
|
||||
m_xdg_shell = obj;
|
||||
init_listener();
|
||||
}
|
||||
|
||||
bool xdg_shell_v5::isInitialized() const
|
||||
{
|
||||
return m_xdg_shell != nullptr;
|
||||
}
|
||||
|
||||
const struct wl_interface *xdg_shell_v5::interface()
|
||||
{
|
||||
return &::xdg_shell_v5_interface;
|
||||
}
|
||||
|
||||
void xdg_shell_v5::destroy()
|
||||
{
|
||||
xdg_shell_destroy(
|
||||
m_xdg_shell);
|
||||
m_xdg_shell = nullptr;
|
||||
}
|
||||
|
||||
void xdg_shell_v5::use_unstable_version(int32_t version)
|
||||
{
|
||||
xdg_shell_use_unstable_version(
|
||||
m_xdg_shell,
|
||||
version);
|
||||
}
|
||||
|
||||
struct ::xdg_surface_v5 *xdg_shell_v5::get_xdg_surface(struct ::wl_surface *surface)
|
||||
{
|
||||
return xdg_shell_get_xdg_surface(
|
||||
m_xdg_shell,
|
||||
surface);
|
||||
}
|
||||
|
||||
struct ::xdg_popup_v5 *xdg_shell_v5::get_xdg_popup(struct ::wl_surface *surface, struct ::wl_surface *parent, struct ::wl_seat *seat, uint32_t serial, int32_t x, int32_t y)
|
||||
{
|
||||
return xdg_shell_get_xdg_popup(
|
||||
m_xdg_shell,
|
||||
surface,
|
||||
parent,
|
||||
seat,
|
||||
serial,
|
||||
x,
|
||||
y);
|
||||
}
|
||||
|
||||
void xdg_shell_v5::pong(uint32_t serial)
|
||||
{
|
||||
xdg_shell_pong(
|
||||
m_xdg_shell,
|
||||
serial);
|
||||
}
|
||||
|
||||
void xdg_shell_v5::xdg_shell_ping(uint32_t )
|
||||
{
|
||||
}
|
||||
|
||||
void xdg_shell_v5::handle_ping(
|
||||
void *data,
|
||||
struct ::xdg_shell_v5 *object,
|
||||
uint32_t serial)
|
||||
{
|
||||
Q_UNUSED(object);
|
||||
static_cast<xdg_shell_v5 *>(data)->xdg_shell_ping(
|
||||
serial);
|
||||
}
|
||||
|
||||
const struct xdg_shell_listener xdg_shell_v5::m_xdg_shell_listener = {
|
||||
xdg_shell_v5::handle_ping
|
||||
};
|
||||
|
||||
void xdg_shell_v5::init_listener()
|
||||
{
|
||||
xdg_shell_add_listener(m_xdg_shell, &m_xdg_shell_listener, this);
|
||||
}
|
||||
|
||||
xdg_surface_v5::xdg_surface_v5(struct ::wl_registry *registry, int id, int version)
|
||||
{
|
||||
init(registry, id, version);
|
||||
}
|
||||
|
||||
xdg_surface_v5::xdg_surface_v5(struct ::xdg_surface_v5 *obj)
|
||||
: m_xdg_surface(obj)
|
||||
{
|
||||
init_listener();
|
||||
}
|
||||
|
||||
xdg_surface_v5::xdg_surface_v5()
|
||||
: m_xdg_surface(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
xdg_surface_v5::~xdg_surface_v5()
|
||||
{
|
||||
}
|
||||
|
||||
void xdg_surface_v5::init(struct ::wl_registry *registry, int id, int version)
|
||||
{
|
||||
m_xdg_surface = static_cast<struct ::xdg_surface_v5 *>(wl_registry_bind(registry, id, &xdg_surface_v5_interface, version));
|
||||
init_listener();
|
||||
}
|
||||
|
||||
void xdg_surface_v5::init(struct ::xdg_surface_v5 *obj)
|
||||
{
|
||||
m_xdg_surface = obj;
|
||||
init_listener();
|
||||
}
|
||||
|
||||
bool xdg_surface_v5::isInitialized() const
|
||||
{
|
||||
return m_xdg_surface != nullptr;
|
||||
}
|
||||
|
||||
const struct wl_interface *xdg_surface_v5::interface()
|
||||
{
|
||||
return &::xdg_surface_v5_interface;
|
||||
}
|
||||
|
||||
void xdg_surface_v5::destroy()
|
||||
{
|
||||
xdg_surface_destroy(
|
||||
m_xdg_surface);
|
||||
m_xdg_surface = nullptr;
|
||||
}
|
||||
|
||||
void xdg_surface_v5::set_parent(struct ::xdg_surface_v5 *parent)
|
||||
{
|
||||
xdg_surface_set_parent(
|
||||
m_xdg_surface,
|
||||
parent);
|
||||
}
|
||||
|
||||
void xdg_surface_v5::set_title(const QString &title)
|
||||
{
|
||||
xdg_surface_set_title(
|
||||
m_xdg_surface,
|
||||
title.toUtf8().constData());
|
||||
}
|
||||
|
||||
void xdg_surface_v5::set_app_id(const QString &app_id)
|
||||
{
|
||||
xdg_surface_set_app_id(
|
||||
m_xdg_surface,
|
||||
app_id.toUtf8().constData());
|
||||
}
|
||||
|
||||
void xdg_surface_v5::show_window_menu(struct ::wl_seat *seat, uint32_t serial, int32_t x, int32_t y)
|
||||
{
|
||||
xdg_surface_show_window_menu(
|
||||
m_xdg_surface,
|
||||
seat,
|
||||
serial,
|
||||
x,
|
||||
y);
|
||||
}
|
||||
|
||||
void xdg_surface_v5::move(struct ::wl_seat *seat, uint32_t serial)
|
||||
{
|
||||
xdg_surface_move(
|
||||
m_xdg_surface,
|
||||
seat,
|
||||
serial);
|
||||
}
|
||||
|
||||
void xdg_surface_v5::resize(struct ::wl_seat *seat, uint32_t serial, uint32_t edges)
|
||||
{
|
||||
xdg_surface_resize(
|
||||
m_xdg_surface,
|
||||
seat,
|
||||
serial,
|
||||
edges);
|
||||
}
|
||||
|
||||
void xdg_surface_v5::ack_configure(uint32_t serial)
|
||||
{
|
||||
xdg_surface_ack_configure(
|
||||
m_xdg_surface,
|
||||
serial);
|
||||
}
|
||||
|
||||
void xdg_surface_v5::set_window_geometry(int32_t x, int32_t y, int32_t width, int32_t height)
|
||||
{
|
||||
xdg_surface_set_window_geometry(
|
||||
m_xdg_surface,
|
||||
x,
|
||||
y,
|
||||
width,
|
||||
height);
|
||||
}
|
||||
|
||||
void xdg_surface_v5::set_maximized()
|
||||
{
|
||||
xdg_surface_set_maximized(
|
||||
m_xdg_surface);
|
||||
}
|
||||
|
||||
void xdg_surface_v5::unset_maximized()
|
||||
{
|
||||
xdg_surface_unset_maximized(
|
||||
m_xdg_surface);
|
||||
}
|
||||
|
||||
void xdg_surface_v5::set_fullscreen(struct ::wl_output *output)
|
||||
{
|
||||
xdg_surface_set_fullscreen(
|
||||
m_xdg_surface,
|
||||
output);
|
||||
}
|
||||
|
||||
void xdg_surface_v5::unset_fullscreen()
|
||||
{
|
||||
xdg_surface_unset_fullscreen(
|
||||
m_xdg_surface);
|
||||
}
|
||||
|
||||
void xdg_surface_v5::set_minimized()
|
||||
{
|
||||
xdg_surface_set_minimized(
|
||||
m_xdg_surface);
|
||||
}
|
||||
|
||||
void xdg_surface_v5::xdg_surface_configure(int32_t , int32_t , wl_array *, uint32_t )
|
||||
{
|
||||
}
|
||||
|
||||
void xdg_surface_v5::handle_configure(
|
||||
void *data,
|
||||
struct ::xdg_surface_v5 *object,
|
||||
int32_t width,
|
||||
int32_t height,
|
||||
wl_array *states,
|
||||
uint32_t serial)
|
||||
{
|
||||
Q_UNUSED(object);
|
||||
static_cast<xdg_surface_v5 *>(data)->xdg_surface_configure(
|
||||
width,
|
||||
height,
|
||||
states,
|
||||
serial);
|
||||
}
|
||||
|
||||
void xdg_surface_v5::xdg_surface_close()
|
||||
{
|
||||
}
|
||||
|
||||
void xdg_surface_v5::handle_close(
|
||||
void *data,
|
||||
struct ::xdg_surface_v5 *object)
|
||||
{
|
||||
Q_UNUSED(object);
|
||||
static_cast<xdg_surface_v5 *>(data)->xdg_surface_close();
|
||||
}
|
||||
|
||||
const struct xdg_surface_listener xdg_surface_v5::m_xdg_surface_listener = {
|
||||
xdg_surface_v5::handle_configure,
|
||||
xdg_surface_v5::handle_close
|
||||
};
|
||||
|
||||
void xdg_surface_v5::init_listener()
|
||||
{
|
||||
xdg_surface_add_listener(m_xdg_surface, &m_xdg_surface_listener, this);
|
||||
}
|
||||
|
||||
xdg_popup_v5::xdg_popup_v5(struct ::wl_registry *registry, int id, int version)
|
||||
{
|
||||
init(registry, id, version);
|
||||
}
|
||||
|
||||
xdg_popup_v5::xdg_popup_v5(struct ::xdg_popup_v5 *obj)
|
||||
: m_xdg_popup(obj)
|
||||
{
|
||||
init_listener();
|
||||
}
|
||||
|
||||
xdg_popup_v5::xdg_popup_v5()
|
||||
: m_xdg_popup(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
xdg_popup_v5::~xdg_popup_v5()
|
||||
{
|
||||
}
|
||||
|
||||
void xdg_popup_v5::init(struct ::wl_registry *registry, int id, int version)
|
||||
{
|
||||
m_xdg_popup = static_cast<struct ::xdg_popup_v5 *>(wl_registry_bind(registry, id, &xdg_popup_v5_interface, version));
|
||||
init_listener();
|
||||
}
|
||||
|
||||
void xdg_popup_v5::init(struct ::xdg_popup_v5 *obj)
|
||||
{
|
||||
m_xdg_popup = obj;
|
||||
init_listener();
|
||||
}
|
||||
|
||||
bool xdg_popup_v5::isInitialized() const
|
||||
{
|
||||
return m_xdg_popup != nullptr;
|
||||
}
|
||||
|
||||
const struct wl_interface *xdg_popup_v5::interface()
|
||||
{
|
||||
return &::xdg_popup_v5_interface;
|
||||
}
|
||||
|
||||
void xdg_popup_v5::destroy()
|
||||
{
|
||||
xdg_popup_destroy(
|
||||
m_xdg_popup);
|
||||
m_xdg_popup = nullptr;
|
||||
}
|
||||
|
||||
void xdg_popup_v5::xdg_popup_popup_done()
|
||||
{
|
||||
}
|
||||
|
||||
void xdg_popup_v5::handle_popup_done(
|
||||
void *data,
|
||||
struct ::xdg_popup_v5 *object)
|
||||
{
|
||||
Q_UNUSED(object);
|
||||
static_cast<xdg_popup_v5 *>(data)->xdg_popup_popup_done();
|
||||
}
|
||||
|
||||
const struct xdg_popup_listener xdg_popup_v5::m_xdg_popup_listener = {
|
||||
xdg_popup_v5::handle_popup_done
|
||||
};
|
||||
|
||||
void xdg_popup_v5::init_listener()
|
||||
{
|
||||
xdg_popup_add_listener(m_xdg_popup, &m_xdg_popup_listener, this);
|
||||
}
|
||||
}
|
||||
|
||||
QT_WARNING_POP
|
||||
QT_END_NAMESPACE
|
@ -1,200 +0,0 @@
|
||||
// Hand-edited to resolve conflicts with xdg-shell stable
|
||||
/*
|
||||
* Copyright © 2008-2013 Kristian Høgsberg
|
||||
* Copyright © 2013 Rafael Antognolli
|
||||
* Copyright © 2013 Jasper St. Pierre
|
||||
* Copyright © 2010-2013 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#ifndef QT_WAYLAND_XDG_SHELL_UNSTABLE_V5
|
||||
#define QT_WAYLAND_XDG_SHELL_UNSTABLE_V5
|
||||
|
||||
#include "wayland-xdg-shell-unstable-v5-client-protocol_p.h"
|
||||
#include <QByteArray>
|
||||
#include <QString>
|
||||
|
||||
struct wl_registry;
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
QT_WARNING_PUSH
|
||||
QT_WARNING_DISABLE_GCC("-Wmissing-field-initializers")
|
||||
|
||||
namespace QtWayland {
|
||||
class xdg_shell_v5
|
||||
{
|
||||
public:
|
||||
xdg_shell_v5(struct ::wl_registry *registry, int id, int version);
|
||||
xdg_shell_v5(struct ::xdg_shell_v5 *object);
|
||||
xdg_shell_v5();
|
||||
|
||||
virtual ~xdg_shell_v5();
|
||||
|
||||
void init(struct ::wl_registry *registry, int id, int version);
|
||||
void init(struct ::xdg_shell_v5 *object);
|
||||
|
||||
struct ::xdg_shell_v5 *object() { return m_xdg_shell; }
|
||||
const struct ::xdg_shell_v5 *object() const { return m_xdg_shell; }
|
||||
|
||||
bool isInitialized() const;
|
||||
|
||||
static const struct ::wl_interface *interface();
|
||||
|
||||
enum version {
|
||||
version_current = 5 // Always the latest version
|
||||
};
|
||||
|
||||
enum error {
|
||||
error_role = 0, // given wl_surface has another role
|
||||
error_defunct_surfaces = 1, // xdg_shell was destroyed before children
|
||||
error_not_the_topmost_popup = 2, // the client tried to map or destroy a non-topmost popup
|
||||
error_invalid_popup_parent = 3 // the client specified an invalid popup parent surface
|
||||
};
|
||||
|
||||
void destroy();
|
||||
void use_unstable_version(int32_t version);
|
||||
struct ::xdg_surface_v5 *get_xdg_surface(struct ::wl_surface *surface);
|
||||
struct ::xdg_popup_v5 *get_xdg_popup(struct ::wl_surface *surface, struct ::wl_surface *parent, struct ::wl_seat *seat, uint32_t serial, int32_t x, int32_t y);
|
||||
void pong(uint32_t serial);
|
||||
|
||||
protected:
|
||||
virtual void xdg_shell_ping(uint32_t serial);
|
||||
|
||||
private:
|
||||
void init_listener();
|
||||
static const struct xdg_shell_listener m_xdg_shell_listener;
|
||||
static void handle_ping(
|
||||
void *data,
|
||||
struct ::xdg_shell_v5 *object,
|
||||
uint32_t serial);
|
||||
struct ::xdg_shell_v5 *m_xdg_shell;
|
||||
};
|
||||
|
||||
class xdg_surface_v5
|
||||
{
|
||||
public:
|
||||
xdg_surface_v5(struct ::wl_registry *registry, int id, int version);
|
||||
xdg_surface_v5(struct ::xdg_surface_v5 *object);
|
||||
xdg_surface_v5();
|
||||
|
||||
virtual ~xdg_surface_v5();
|
||||
|
||||
void init(struct ::wl_registry *registry, int id, int version);
|
||||
void init(struct ::xdg_surface_v5 *object);
|
||||
|
||||
struct ::xdg_surface_v5 *object() { return m_xdg_surface; }
|
||||
const struct ::xdg_surface_v5 *object() const { return m_xdg_surface; }
|
||||
|
||||
bool isInitialized() const;
|
||||
|
||||
static const struct ::wl_interface *interface();
|
||||
|
||||
enum resize_edge {
|
||||
resize_edge_none = 0,
|
||||
resize_edge_top = 1,
|
||||
resize_edge_bottom = 2,
|
||||
resize_edge_left = 4,
|
||||
resize_edge_top_left = 5,
|
||||
resize_edge_bottom_left = 6,
|
||||
resize_edge_right = 8,
|
||||
resize_edge_top_right = 9,
|
||||
resize_edge_bottom_right = 10
|
||||
};
|
||||
|
||||
enum state {
|
||||
state_maximized = 1, // the surface is maximized
|
||||
state_fullscreen = 2, // the surface is fullscreen
|
||||
state_resizing = 3,
|
||||
state_activated = 4
|
||||
};
|
||||
|
||||
void destroy();
|
||||
void set_parent(struct ::xdg_surface_v5 *parent);
|
||||
void set_title(const QString &title);
|
||||
void set_app_id(const QString &app_id);
|
||||
void show_window_menu(struct ::wl_seat *seat, uint32_t serial, int32_t x, int32_t y);
|
||||
void move(struct ::wl_seat *seat, uint32_t serial);
|
||||
void resize(struct ::wl_seat *seat, uint32_t serial, uint32_t edges);
|
||||
void ack_configure(uint32_t serial);
|
||||
void set_window_geometry(int32_t x, int32_t y, int32_t width, int32_t height);
|
||||
void set_maximized();
|
||||
void unset_maximized();
|
||||
void set_fullscreen(struct ::wl_output *output);
|
||||
void unset_fullscreen();
|
||||
void set_minimized();
|
||||
|
||||
protected:
|
||||
virtual void xdg_surface_configure(int32_t width, int32_t height, wl_array *states, uint32_t serial);
|
||||
virtual void xdg_surface_close();
|
||||
|
||||
private:
|
||||
void init_listener();
|
||||
static const struct xdg_surface_listener m_xdg_surface_listener;
|
||||
static void handle_configure(
|
||||
void *data,
|
||||
struct ::xdg_surface_v5 *object,
|
||||
int32_t width,
|
||||
int32_t height,
|
||||
wl_array *states,
|
||||
uint32_t serial);
|
||||
static void handle_close(
|
||||
void *data,
|
||||
struct ::xdg_surface_v5 *object);
|
||||
struct ::xdg_surface_v5 *m_xdg_surface;
|
||||
};
|
||||
|
||||
class xdg_popup_v5
|
||||
{
|
||||
public:
|
||||
xdg_popup_v5(struct ::wl_registry *registry, int id, int version);
|
||||
xdg_popup_v5(struct ::xdg_popup_v5 *object);
|
||||
xdg_popup_v5();
|
||||
|
||||
virtual ~xdg_popup_v5();
|
||||
|
||||
void init(struct ::wl_registry *registry, int id, int version);
|
||||
void init(struct ::xdg_popup_v5 *object);
|
||||
|
||||
struct ::xdg_popup_v5 *object() { return m_xdg_popup; }
|
||||
const struct ::xdg_popup_v5 *object() const { return m_xdg_popup; }
|
||||
|
||||
bool isInitialized() const;
|
||||
|
||||
static const struct ::wl_interface *interface();
|
||||
|
||||
void destroy();
|
||||
|
||||
protected:
|
||||
virtual void xdg_popup_popup_done();
|
||||
|
||||
private:
|
||||
void init_listener();
|
||||
static const struct xdg_popup_listener m_xdg_popup_listener;
|
||||
static void handle_popup_done(
|
||||
void *data,
|
||||
struct ::xdg_popup_v5 *object);
|
||||
struct ::xdg_popup_v5 *m_xdg_popup;
|
||||
};
|
||||
}
|
||||
|
||||
QT_WARNING_POP
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
@ -1,126 +0,0 @@
|
||||
/* Generated by wayland-scanner 1.13.0 */
|
||||
// Hand-edited to resolve conflicts with xdg-shell stable
|
||||
|
||||
/*
|
||||
* Copyright © 2008-2013 Kristian Høgsberg
|
||||
* Copyright © 2013 Rafael Antognolli
|
||||
* Copyright © 2013 Jasper St. Pierre
|
||||
* Copyright © 2010-2013 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include "wayland-util.h"
|
||||
|
||||
extern const struct wl_interface wl_output_interface;
|
||||
extern const struct wl_interface wl_seat_interface;
|
||||
extern const struct wl_interface wl_surface_interface;
|
||||
extern const struct wl_interface xdg_popup_v5_interface;
|
||||
extern const struct wl_interface xdg_surface_v5_interface;
|
||||
|
||||
static const struct wl_interface *types[] = {
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&xdg_surface_v5_interface,
|
||||
&wl_surface_interface,
|
||||
&xdg_popup_v5_interface,
|
||||
&wl_surface_interface,
|
||||
&wl_surface_interface,
|
||||
&wl_seat_interface,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&xdg_surface_v5_interface,
|
||||
&wl_seat_interface,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&wl_seat_interface,
|
||||
NULL,
|
||||
&wl_seat_interface,
|
||||
NULL,
|
||||
NULL,
|
||||
&wl_output_interface,
|
||||
};
|
||||
|
||||
static const struct wl_message xdg_shell_requests[] = {
|
||||
{ "destroy", "", types + 0 },
|
||||
{ "use_unstable_version", "i", types + 0 },
|
||||
{ "get_xdg_surface", "no", types + 4 },
|
||||
{ "get_xdg_popup", "nooouii", types + 6 },
|
||||
{ "pong", "u", types + 0 },
|
||||
};
|
||||
|
||||
static const struct wl_message xdg_shell_events[] = {
|
||||
{ "ping", "u", types + 0 },
|
||||
};
|
||||
|
||||
WL_EXPORT const struct wl_interface xdg_shell_v5_interface = {
|
||||
"xdg_shell", 1,
|
||||
5, xdg_shell_requests,
|
||||
1, xdg_shell_events,
|
||||
};
|
||||
|
||||
static const struct wl_message xdg_surface_requests[] = {
|
||||
{ "destroy", "", types + 0 },
|
||||
{ "set_parent", "?o", types + 13 },
|
||||
{ "set_title", "s", types + 0 },
|
||||
{ "set_app_id", "s", types + 0 },
|
||||
{ "show_window_menu", "ouii", types + 14 },
|
||||
{ "move", "ou", types + 18 },
|
||||
{ "resize", "ouu", types + 20 },
|
||||
{ "ack_configure", "u", types + 0 },
|
||||
{ "set_window_geometry", "iiii", types + 0 },
|
||||
{ "set_maximized", "", types + 0 },
|
||||
{ "unset_maximized", "", types + 0 },
|
||||
{ "set_fullscreen", "?o", types + 23 },
|
||||
{ "unset_fullscreen", "", types + 0 },
|
||||
{ "set_minimized", "", types + 0 },
|
||||
};
|
||||
|
||||
static const struct wl_message xdg_surface_events[] = {
|
||||
{ "configure", "iiau", types + 0 },
|
||||
{ "close", "", types + 0 },
|
||||
};
|
||||
|
||||
WL_EXPORT const struct wl_interface xdg_surface_v5_interface = {
|
||||
"xdg_surface", 1,
|
||||
14, xdg_surface_requests,
|
||||
2, xdg_surface_events,
|
||||
};
|
||||
|
||||
static const struct wl_message xdg_popup_requests[] = {
|
||||
{ "destroy", "", types + 0 },
|
||||
};
|
||||
|
||||
static const struct wl_message xdg_popup_events[] = {
|
||||
{ "popup_done", "", types + 0 },
|
||||
};
|
||||
|
||||
WL_EXPORT const struct wl_interface xdg_popup_v5_interface = {
|
||||
"xdg_popup", 1,
|
||||
1, xdg_popup_requests,
|
||||
1, xdg_popup_events,
|
||||
};
|
||||
|
@ -1,12 +0,0 @@
|
||||
# Putting pregenerated files in a 3rdparty directory to avoid
|
||||
# qtqa's license checking failing.
|
||||
|
||||
HEADERS += \
|
||||
$$PWD/3rdparty/qwayland-xdg-shell-unstable-v5_p.h \
|
||||
$$PWD/3rdparty/wayland-xdg-shell-unstable-v5-client-protocol_p.h
|
||||
|
||||
SOURCES += \
|
||||
$$PWD/3rdparty/qwayland-xdg-shell-unstable-v5.cpp \
|
||||
$$PWD/3rdparty/wayland-xdg-shell-unstable-v5-protocol.c
|
||||
|
||||
INCLUDEPATH += $$PWD/3rdparty
|
@ -1,72 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2017 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the plugins of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or (at your option) the GNU General
|
||||
** Public license version 3 or any later version approved by the KDE Free
|
||||
** Qt Foundation. The licenses are as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qwaylandxdgpopupv5_p.h"
|
||||
|
||||
#include <QtWaylandClient/private/qwaylanddisplay_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandwindow_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandextendedsurface_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QtWaylandClient {
|
||||
|
||||
QWaylandXdgPopupV5::QWaylandXdgPopupV5(struct ::xdg_popup_v5 *popup, QWaylandWindow *window)
|
||||
: QWaylandShellSurface(window)
|
||||
, QtWayland::xdg_popup_v5(popup)
|
||||
, m_window(window)
|
||||
{
|
||||
if (window->display()->windowExtension())
|
||||
m_extendedWindow = new QWaylandExtendedSurface(window);
|
||||
}
|
||||
|
||||
QWaylandXdgPopupV5::~QWaylandXdgPopupV5()
|
||||
{
|
||||
xdg_popup_destroy(object());
|
||||
delete m_extendedWindow;
|
||||
}
|
||||
|
||||
void QWaylandXdgPopupV5::xdg_popup_popup_done()
|
||||
{
|
||||
m_window->window()->close();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
@ -1,88 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2017 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the config.tests of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or (at your option) the GNU General
|
||||
** Public license version 3 or any later version approved by the KDE Free
|
||||
** Qt Foundation. The licenses are as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QWAYLANDXDGPOPUPV5_P_H
|
||||
#define QWAYLANDXDGPOPUPV5_P_H
|
||||
|
||||
//
|
||||
// W A R N I N G
|
||||
// -------------
|
||||
//
|
||||
// This file is not part of the Qt API. It exists purely as an
|
||||
// implementation detail. This header file may change from version to
|
||||
// version without notice, or even be removed.
|
||||
//
|
||||
// We mean it.
|
||||
//
|
||||
|
||||
#include "qwayland-xdg-shell-unstable-v5_p.h"
|
||||
|
||||
#include <QtWaylandClient/qtwaylandclientglobal.h>
|
||||
#include <QtWaylandClient/private/qwaylandshellsurface_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QWindow;
|
||||
|
||||
namespace QtWaylandClient {
|
||||
|
||||
class QWaylandWindow;
|
||||
class QWaylandExtendedSurface;
|
||||
|
||||
class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgPopupV5 : public QWaylandShellSurface
|
||||
, public QtWayland::xdg_popup_v5
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
QWaylandXdgPopupV5(struct ::xdg_popup_v5 *popup, QWaylandWindow *window);
|
||||
~QWaylandXdgPopupV5() override;
|
||||
|
||||
protected:
|
||||
void xdg_popup_popup_done() override;
|
||||
|
||||
private:
|
||||
QWaylandExtendedSurface *m_extendedWindow = nullptr;
|
||||
QWaylandWindow *m_window = nullptr;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
}
|
||||
|
||||
#endif // QWAYLANDXDGPOPUPV5_P_H
|
@ -1,104 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 Eurogiciel, author: <philippe.coval@eurogiciel.fr>
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the config.tests of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or (at your option) the GNU General
|
||||
** Public license version 3 or any later version approved by the KDE Free
|
||||
** Qt Foundation. The licenses are as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qwaylandxdgshellv5_p.h"
|
||||
#include "qwaylandxdgpopupv5_p.h"
|
||||
#include "qwaylandxdgsurfacev5_p.h"
|
||||
|
||||
#include <QtCore/QDebug>
|
||||
|
||||
#include <QtWaylandClient/private/qwaylanddisplay_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandwindow_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandinputdevice_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandscreen_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QtWaylandClient {
|
||||
|
||||
QWaylandXdgShellV5::QWaylandXdgShellV5(struct ::wl_registry *registry, uint32_t id)
|
||||
: QtWayland::xdg_shell_v5(registry, id, 1)
|
||||
{
|
||||
use_unstable_version(QtWayland::xdg_shell_v5::version_current);
|
||||
}
|
||||
|
||||
QWaylandXdgShellV5::~QWaylandXdgShellV5()
|
||||
{
|
||||
xdg_shell_destroy(object());
|
||||
}
|
||||
|
||||
QWaylandXdgSurfaceV5 *QWaylandXdgShellV5::createXdgSurface(QWaylandWindow *window)
|
||||
{
|
||||
return new QWaylandXdgSurfaceV5(this, window);
|
||||
}
|
||||
|
||||
QWaylandXdgPopupV5 *QWaylandXdgShellV5::createXdgPopup(QWaylandWindow *window, QWaylandInputDevice *inputDevice)
|
||||
{
|
||||
QWaylandWindow *parentWindow = m_popups.empty() ? window->transientParent() : m_popups.last();
|
||||
if (!parentWindow)
|
||||
return nullptr;
|
||||
|
||||
::wl_surface *parentSurface = parentWindow->wlSurface();
|
||||
|
||||
if (m_popupSerial == 0)
|
||||
m_popupSerial = inputDevice->serial();
|
||||
::wl_seat *seat = inputDevice->wl_seat();
|
||||
|
||||
QPoint position = window->geometry().topLeft() - parentWindow->geometry().topLeft();
|
||||
int x = position.x() + parentWindow->frameMargins().left();
|
||||
int y = position.y() + parentWindow->frameMargins().top();
|
||||
|
||||
auto popup = new QWaylandXdgPopupV5(get_xdg_popup(window->wlSurface(), parentSurface, seat, m_popupSerial, x, y), window);
|
||||
m_popups.append(window);
|
||||
QObject::connect(popup, &QWaylandXdgPopupV5::destroyed, [this, window](){
|
||||
m_popups.removeOne(window);
|
||||
if (m_popups.empty())
|
||||
m_popupSerial = 0;
|
||||
});
|
||||
return popup;
|
||||
}
|
||||
|
||||
void QWaylandXdgShellV5::xdg_shell_ping(uint32_t serial)
|
||||
{
|
||||
pong(serial);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
@ -1,93 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 Eurogiciel, author: <philippe.coval@eurogiciel.fr>
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the config.tests of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or (at your option) the GNU General
|
||||
** Public license version 3 or any later version approved by the KDE Free
|
||||
** Qt Foundation. The licenses are as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QWAYLANDXDGSHELLV5_H
|
||||
#define QWAYLANDXDGSHELLV5_H
|
||||
|
||||
//
|
||||
// W A R N I N G
|
||||
// -------------
|
||||
//
|
||||
// This file is not part of the Qt API. It exists purely as an
|
||||
// implementation detail. This header file may change from version to
|
||||
// version without notice, or even be removed.
|
||||
//
|
||||
// We mean it.
|
||||
//
|
||||
|
||||
#include "qwayland-xdg-shell-unstable-v5_p.h"
|
||||
|
||||
#include <QtCore/QSize>
|
||||
#include <QtCore/QList>
|
||||
|
||||
#include <QtWaylandClient/qtwaylandclientglobal.h>
|
||||
#include <QtWaylandClient/private/qwaylandshellsurface_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QWindow;
|
||||
|
||||
namespace QtWaylandClient {
|
||||
|
||||
class QWaylandWindow;
|
||||
class QWaylandInputDevice;
|
||||
class QWaylandXdgSurfaceV5;
|
||||
class QWaylandXdgPopupV5;
|
||||
|
||||
class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgShellV5 : public QtWayland::xdg_shell_v5
|
||||
{
|
||||
public:
|
||||
QWaylandXdgShellV5(struct ::wl_registry *registry, uint32_t id);
|
||||
~QWaylandXdgShellV5() override;
|
||||
|
||||
QWaylandXdgSurfaceV5 *createXdgSurface(QWaylandWindow *window);
|
||||
QWaylandXdgPopupV5 *createXdgPopup(QWaylandWindow *window, QWaylandInputDevice *inputDevice);
|
||||
|
||||
private:
|
||||
void xdg_shell_ping(uint32_t serial) override;
|
||||
|
||||
QList<QWaylandWindow *> m_popups;
|
||||
uint m_popupSerial = 0;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
}
|
||||
|
||||
#endif // QWAYLANDXDGSHELLV5_H
|
@ -1,97 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2017 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the plugins of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or (at your option) the GNU General
|
||||
** Public license version 3 or any later version approved by the KDE Free
|
||||
** Qt Foundation. The licenses are as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qwaylandxdgshellv5integration_p.h"
|
||||
#include "qwaylandxdgsurfacev5_p.h"
|
||||
#include "qwaylandxdgpopupv5_p.h"
|
||||
#include "qwaylandxdgshellv5_p.h"
|
||||
|
||||
#include <QtWaylandClient/private/qwaylandwindow_p.h>
|
||||
#include <QtWaylandClient/private/qwaylanddisplay_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QtWaylandClient {
|
||||
|
||||
bool QWaylandXdgShellV5Integration::initialize(QWaylandDisplay *display)
|
||||
{
|
||||
const auto globals = display->globals();
|
||||
for (QWaylandDisplay::RegistryGlobal global : globals) {
|
||||
if (global.interface == QLatin1String("xdg_shell")) {
|
||||
m_xdgShell.reset(new QWaylandXdgShellV5(display->wl_registry(), global.id));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!m_xdgShell) {
|
||||
qWarning() << "Couldn't find global xdg_shell for xdg-shell unstable v5";
|
||||
return false;
|
||||
}
|
||||
|
||||
qCWarning(lcQpaWayland) << "\"xdg-shell-v5\" is a deprecated shell extension, prefer using"
|
||||
<< "\"xdg-shell-v6\" or \"xdg-shell\" if supported by the compositor"
|
||||
<< "by setting the environment variable QT_WAYLAND_SHELL_INTEGRATION";
|
||||
|
||||
return QWaylandShellIntegration::initialize(display);
|
||||
}
|
||||
|
||||
QWaylandShellSurface *QWaylandXdgShellV5Integration::createShellSurface(QWaylandWindow *window)
|
||||
{
|
||||
QWaylandInputDevice *inputDevice = window->display()->lastInputDevice();
|
||||
if (window->window()->type() == Qt::WindowType::Popup && inputDevice) {
|
||||
if (auto *popup = m_xdgShell->createXdgPopup(window, inputDevice))
|
||||
return popup;
|
||||
|
||||
qWarning(lcQpaWayland) << "Failed to create xdg-popup v5 for window" << window->window()
|
||||
<< "falling back to creating an xdg-surface";
|
||||
}
|
||||
|
||||
return m_xdgShell->createXdgSurface(window);
|
||||
}
|
||||
|
||||
void QWaylandXdgShellV5Integration::handleKeyboardFocusChanged(QWaylandWindow *newFocus, QWaylandWindow *oldFocus) {
|
||||
if (newFocus && qobject_cast<QWaylandXdgPopupV5 *>(newFocus->shellSurface()))
|
||||
m_display->handleWindowActivated(newFocus);
|
||||
if (oldFocus && qobject_cast<QWaylandXdgPopupV5 *>(oldFocus->shellSurface()))
|
||||
m_display->handleWindowDeactivated(oldFocus);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
@ -1,80 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2017 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the plugins of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or (at your option) the GNU General
|
||||
** Public license version 3 or any later version approved by the KDE Free
|
||||
** Qt Foundation. The licenses are as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QWAYLANDXDGSHELLV5INTEGRATION_P_H
|
||||
#define QWAYLANDXDGSHELLV5INTEGRATION_P_H
|
||||
|
||||
//
|
||||
// W A R N I N G
|
||||
// -------------
|
||||
//
|
||||
// This file is not part of the Qt API. It exists purely as an
|
||||
// implementation detail. This header file may change from version to
|
||||
// version without notice, or even be removed.
|
||||
//
|
||||
// We mean it.
|
||||
//
|
||||
|
||||
#include "qwaylandxdgshellv5_p.h"
|
||||
|
||||
#include <QtWaylandClient/private/qwaylandshellintegration_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QtWaylandClient {
|
||||
|
||||
class QWaylandXdgShellV5;
|
||||
|
||||
class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgShellV5Integration : public QWaylandShellIntegration
|
||||
{
|
||||
public:
|
||||
QWaylandXdgShellV5Integration() {}
|
||||
bool initialize(QWaylandDisplay *display) override;
|
||||
QWaylandShellSurface *createShellSurface(QWaylandWindow *window) override;
|
||||
void handleKeyboardFocusChanged(QWaylandWindow *newFocus, QWaylandWindow *oldFocus) override;
|
||||
|
||||
private:
|
||||
QScopedPointer<QWaylandXdgShellV5> m_xdgShell;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QWAYLANDXDGSHELLV5INTEGRATION_P_H
|
@ -1,246 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2018 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the config.tests of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or (at your option) the GNU General
|
||||
** Public license version 3 or any later version approved by the KDE Free
|
||||
** Qt Foundation. The licenses are as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qwaylandxdgsurfacev5_p.h"
|
||||
#include "qwaylandxdgshellv5_p.h"
|
||||
|
||||
#include <QtWaylandClient/private/qwaylanddisplay_p.h>
|
||||
#include <QtWaylandClient/private/qwaylanddisplay_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandwindow_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandinputdevice_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandabstractdecoration_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandscreen_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandextendedsurface_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QtWaylandClient {
|
||||
|
||||
QWaylandXdgSurfaceV5::QWaylandXdgSurfaceV5(QWaylandXdgShellV5 *shell, QWaylandWindow *window)
|
||||
: QWaylandShellSurface(window)
|
||||
, QtWayland::xdg_surface_v5(shell->get_xdg_surface(window->wlSurface()))
|
||||
, m_window(window)
|
||||
, m_shell(shell)
|
||||
{
|
||||
if (window->display()->windowExtension())
|
||||
m_extendedWindow = new QWaylandExtendedSurface(window);
|
||||
|
||||
updateTransientParent(window->transientParent());
|
||||
}
|
||||
|
||||
QWaylandXdgSurfaceV5::~QWaylandXdgSurfaceV5()
|
||||
{
|
||||
if (m_acked.states & Qt::WindowActive)
|
||||
window()->display()->handleWindowDeactivated(m_window);
|
||||
|
||||
xdg_surface_destroy(object());
|
||||
delete m_extendedWindow;
|
||||
}
|
||||
|
||||
QtWayland::xdg_surface_v5::resize_edge QWaylandXdgSurfaceV5::convertToResizeEdges(Qt::Edges edges)
|
||||
{
|
||||
return static_cast<enum resize_edge>(
|
||||
((edges & Qt::TopEdge) ? resize_edge_top : 0)
|
||||
| ((edges & Qt::BottomEdge) ? resize_edge_bottom : 0)
|
||||
| ((edges & Qt::LeftEdge) ? resize_edge_left : 0)
|
||||
| ((edges & Qt::RightEdge) ? resize_edge_right : 0));
|
||||
}
|
||||
|
||||
bool QWaylandXdgSurfaceV5::resize(QWaylandInputDevice *inputDevice, Qt::Edges edges)
|
||||
{
|
||||
resize_edge resizeEdges = convertToResizeEdges(edges);
|
||||
resize(inputDevice->wl_seat(), inputDevice->serial(), resizeEdges);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool QWaylandXdgSurfaceV5::move(QWaylandInputDevice *inputDevice)
|
||||
{
|
||||
move(inputDevice->wl_seat(),
|
||||
inputDevice->serial());
|
||||
return true;
|
||||
}
|
||||
|
||||
bool QWaylandXdgSurfaceV5::showWindowMenu(QWaylandInputDevice *seat)
|
||||
{
|
||||
QPoint position = seat->pointerSurfacePosition().toPoint();
|
||||
show_window_menu(seat->wl_seat(), seat->serial(), position.x(), position.y());
|
||||
return true;
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV5::updateTransientParent(QWaylandWindow *parent)
|
||||
{
|
||||
if (!parent)
|
||||
return;
|
||||
auto parentXdgSurface = qobject_cast<QWaylandXdgSurfaceV5 *>(parent->shellSurface());
|
||||
Q_ASSERT(parentXdgSurface);
|
||||
set_parent(parentXdgSurface->object());
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV5::setTitle(const QString & title)
|
||||
{
|
||||
return QtWayland::xdg_surface_v5::set_title(title);
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV5::setAppId(const QString & appId)
|
||||
{
|
||||
return QtWayland::xdg_surface_v5::set_app_id(appId);
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV5::raise()
|
||||
{
|
||||
if (m_extendedWindow)
|
||||
m_extendedWindow->raise();
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV5::lower()
|
||||
{
|
||||
if (m_extendedWindow)
|
||||
m_extendedWindow->lower();
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV5::setContentOrientationMask(Qt::ScreenOrientations orientation)
|
||||
{
|
||||
if (m_extendedWindow)
|
||||
m_extendedWindow->setContentOrientationMask(orientation);
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV5::setWindowFlags(Qt::WindowFlags flags)
|
||||
{
|
||||
if (m_extendedWindow)
|
||||
m_extendedWindow->setWindowFlags(flags);
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV5::sendProperty(const QString &name, const QVariant &value)
|
||||
{
|
||||
if (m_extendedWindow)
|
||||
m_extendedWindow->updateGenericProperty(name, value);
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV5::applyConfigure()
|
||||
{
|
||||
if (m_pending.isResizing)
|
||||
m_normalSize = m_pending.size;
|
||||
else if (!(m_acked.states & (Qt::WindowMaximized|Qt::WindowFullScreen)))
|
||||
m_normalSize = m_window->window()->frameGeometry().size();
|
||||
|
||||
if ((m_pending.states & Qt::WindowActive) && !(m_acked.states & Qt::WindowActive))
|
||||
m_window->display()->handleWindowActivated(m_window);
|
||||
|
||||
if (!(m_pending.states & Qt::WindowActive) && (m_acked.states & Qt::WindowActive))
|
||||
m_window->display()->handleWindowDeactivated(m_window);
|
||||
|
||||
// TODO: none of the other plugins send WindowActive either, but is it on purpose?
|
||||
Qt::WindowStates statesWithoutActive = m_pending.states & ~Qt::WindowActive;
|
||||
|
||||
m_window->handleWindowStatesChanged(statesWithoutActive);
|
||||
if (!m_pending.size.isEmpty())
|
||||
m_window->resizeFromApplyConfigure(m_pending.size);
|
||||
else if (!m_normalSize.isEmpty())
|
||||
m_window->resizeFromApplyConfigure(m_normalSize);
|
||||
ack_configure(m_pending.serial);
|
||||
m_acked = m_pending;
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV5::requestWindowStates(Qt::WindowStates states)
|
||||
{
|
||||
Qt::WindowStates changedStates = m_acked.states ^ states;
|
||||
|
||||
if (changedStates & Qt::WindowMaximized) {
|
||||
if (states & Qt::WindowMaximized)
|
||||
set_maximized();
|
||||
else
|
||||
unset_maximized();
|
||||
}
|
||||
|
||||
if (changedStates & Qt::WindowFullScreen) {
|
||||
if (states & Qt::WindowFullScreen)
|
||||
set_fullscreen(nullptr);
|
||||
else
|
||||
unset_fullscreen();
|
||||
}
|
||||
|
||||
// Minimized state is not reported by the protocol, so always send it
|
||||
if (states & Qt::WindowMinimized) {
|
||||
set_minimized();
|
||||
window()->handleWindowStatesChanged(states & ~Qt::WindowMinimized);
|
||||
}
|
||||
}
|
||||
|
||||
bool QWaylandXdgSurfaceV5::wantsDecorations() const
|
||||
{
|
||||
return !(m_pending.states & Qt::WindowFullScreen);
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV5::xdg_surface_configure(int32_t width, int32_t height, struct wl_array *states,uint32_t serial)
|
||||
{
|
||||
uint32_t *xdgStates = reinterpret_cast<uint32_t*>(states->data);
|
||||
size_t numStates = states->size / sizeof(uint32_t);
|
||||
m_pending.serial = serial;
|
||||
m_pending.size = QSize(width, height);
|
||||
m_pending.isResizing = false;
|
||||
m_pending.states = Qt::WindowNoState;
|
||||
for (size_t i = 0; i < numStates; i++) {
|
||||
switch (xdgStates[i]) {
|
||||
case XDG_SURFACE_STATE_MAXIMIZED:
|
||||
m_pending.states |= Qt::WindowMaximized;
|
||||
break;
|
||||
case XDG_SURFACE_STATE_FULLSCREEN:
|
||||
m_pending.states |= Qt::WindowFullScreen;
|
||||
break;
|
||||
case XDG_SURFACE_STATE_RESIZING:
|
||||
m_pending.isResizing = true;
|
||||
break;
|
||||
case XDG_SURFACE_STATE_ACTIVATED:
|
||||
m_pending.states |= Qt::WindowActive;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
m_window->applyConfigureWhenPossible();
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV5::xdg_surface_close()
|
||||
{
|
||||
m_window->window()->close();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
@ -1,131 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the config.tests of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or (at your option) the GNU General
|
||||
** Public license version 3 or any later version approved by the KDE Free
|
||||
** Qt Foundation. The licenses are as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QWAYLANDXDGSURFACEV5_P_H
|
||||
#define QWAYLANDXDGSURFACEV5_P_H
|
||||
|
||||
//
|
||||
// W A R N I N G
|
||||
// -------------
|
||||
//
|
||||
// This file is not part of the Qt API. It exists purely as an
|
||||
// implementation detail. This header file may change from version to
|
||||
// version without notice, or even be removed.
|
||||
//
|
||||
// We mean it.
|
||||
//
|
||||
|
||||
#include "qwayland-xdg-shell-unstable-v5_p.h"
|
||||
|
||||
#include <QtWaylandClient/qtwaylandclientglobal.h>
|
||||
#include <QtWaylandClient/private/qwaylandshellsurface_p.h>
|
||||
|
||||
#include <QtCore/QSize>
|
||||
#include <QtCore/QMargins>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QWindow;
|
||||
|
||||
namespace QtWaylandClient {
|
||||
|
||||
class QWaylandWindow;
|
||||
class QWaylandInputDevice;
|
||||
class QWaylandExtendedSurface;
|
||||
class QWaylandXdgShellV5;
|
||||
|
||||
class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgSurfaceV5 : public QWaylandShellSurface
|
||||
, public QtWayland::xdg_surface_v5
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
QWaylandXdgSurfaceV5(QWaylandXdgShellV5 *shell, QWaylandWindow *window);
|
||||
~QWaylandXdgSurfaceV5() override;
|
||||
|
||||
using QtWayland::xdg_surface_v5::resize;
|
||||
static resize_edge convertToResizeEdges(Qt::Edges edges);
|
||||
bool resize(QWaylandInputDevice *inputDevice, Qt::Edges edges) override;
|
||||
|
||||
using QtWayland::xdg_surface_v5::move;
|
||||
bool move(QWaylandInputDevice *inputDevice) override;
|
||||
bool showWindowMenu(QWaylandInputDevice *seat) override;
|
||||
|
||||
void setTitle(const QString &title) override;
|
||||
void setAppId(const QString &appId) override;
|
||||
|
||||
void raise() override;
|
||||
void lower() override;
|
||||
void setContentOrientationMask(Qt::ScreenOrientations orientation) override;
|
||||
void setWindowFlags(Qt::WindowFlags flags) override;
|
||||
void sendProperty(const QString &name, const QVariant &value) override;
|
||||
|
||||
void applyConfigure() override;
|
||||
void requestWindowStates(Qt::WindowStates states) override;
|
||||
bool wantsDecorations() const override;
|
||||
|
||||
private:
|
||||
void updateTransientParent(QWaylandWindow *parent);
|
||||
|
||||
private:
|
||||
QWaylandWindow *m_window = nullptr;
|
||||
QWaylandXdgShellV5* m_shell = nullptr;
|
||||
struct {
|
||||
Qt::WindowStates states = Qt::WindowNoState;
|
||||
bool isResizing = false;
|
||||
QSize size = {0, 0};
|
||||
uint serial = 0;
|
||||
} m_acked, m_pending;
|
||||
QSize m_normalSize;
|
||||
QMargins m_margins;
|
||||
QWaylandExtendedSurface *m_extendedWindow = nullptr;
|
||||
|
||||
void xdg_surface_configure(int32_t width,
|
||||
int32_t height,
|
||||
struct wl_array *states,
|
||||
uint32_t serial) override;
|
||||
void xdg_surface_close() override;
|
||||
|
||||
friend class QWaylandWindow;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
}
|
||||
|
||||
#endif // QWAYLANDXDGSURFACEV5_P_H
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"Keys":[ "xdg-shell-v5" ]
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
QT += gui-private waylandclient-private
|
||||
CONFIG += wayland-scanner
|
||||
|
||||
QMAKE_USE += wayland-client
|
||||
|
||||
qtConfig(xkbcommon): \
|
||||
QMAKE_USE += xkbcommon
|
||||
|
||||
HEADERS += \
|
||||
qwaylandxdgpopupv5_p.h \
|
||||
qwaylandxdgshellv5_p.h \
|
||||
qwaylandxdgshellv5integration_p.h \
|
||||
qwaylandxdgsurfacev5_p.h \
|
||||
|
||||
SOURCES += \
|
||||
main.cpp \
|
||||
qwaylandxdgpopupv5.cpp \
|
||||
qwaylandxdgshellv5.cpp \
|
||||
qwaylandxdgshellv5integration.cpp \
|
||||
qwaylandxdgsurfacev5.cpp \
|
||||
|
||||
include (pregenerated/xdg-shell-v5.pri)
|
||||
|
||||
OTHER_FILES += \
|
||||
xdg-shell-v5.json
|
||||
|
||||
PLUGIN_TYPE = wayland-shell-integration
|
||||
PLUGIN_CLASS_NAME = QWaylandXdgShellV5IntegrationPlugin
|
||||
load(qt_plugin)
|
@ -1,36 +0,0 @@
|
||||
# Generated from xdg-shell-v6.pro.
|
||||
|
||||
#####################################################################
|
||||
## QWaylandXdgShellV6IntegrationPlugin Plugin:
|
||||
#####################################################################
|
||||
|
||||
qt_internal_add_plugin(QWaylandXdgShellV6IntegrationPlugin
|
||||
OUTPUT_NAME xdg-shell-v6
|
||||
TYPE wayland-shell-integration
|
||||
SOURCES
|
||||
main.cpp
|
||||
qwaylandxdgshellv6.cpp qwaylandxdgshellv6_p.h
|
||||
qwaylandxdgshellv6integration.cpp qwaylandxdgshellv6integration_p.h
|
||||
PUBLIC_LIBRARIES
|
||||
Qt::Core
|
||||
Qt::Gui
|
||||
Qt::GuiPrivate
|
||||
Qt::WaylandClientPrivate
|
||||
Wayland::Client
|
||||
)
|
||||
|
||||
qt6_generate_wayland_protocol_client_sources(QWaylandXdgShellV6IntegrationPlugin
|
||||
FILES
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/protocol/xdg-shell-unstable-v6.xml
|
||||
)
|
||||
|
||||
#### Keys ignored in scope 1:.:.:xdg-shell-v6.pro:<TRUE>:
|
||||
# OTHER_FILES = "xdg-shell-v6.json"
|
||||
|
||||
## Scopes:
|
||||
#####################################################################
|
||||
|
||||
qt_internal_extend_target(QWaylandXdgShellV6IntegrationPlugin CONDITION QT_FEATURE_xkbcommon
|
||||
LIBRARIES
|
||||
XKB::XKB
|
||||
)
|
@ -1,68 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2018 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the plugins of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or (at your option) the GNU General
|
||||
** Public license version 3 or any later version approved by the KDE Free
|
||||
** Qt Foundation. The licenses are as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qwaylandxdgshellv6integration_p.h"
|
||||
|
||||
#include <QtWaylandClient/private/qwaylandshellintegrationplugin_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QtWaylandClient {
|
||||
|
||||
class QWaylandXdgShellV6IntegrationPlugin : public QWaylandShellIntegrationPlugin
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PLUGIN_METADATA(IID QWaylandShellIntegrationFactoryInterface_iid FILE "xdg-shell-v6.json")
|
||||
|
||||
public:
|
||||
QWaylandShellIntegration *create(const QString &key, const QStringList ¶mList) override;
|
||||
};
|
||||
|
||||
QWaylandShellIntegration *QWaylandXdgShellV6IntegrationPlugin::create(const QString &key, const QStringList ¶mList)
|
||||
{
|
||||
Q_UNUSED(key);
|
||||
Q_UNUSED(paramList);
|
||||
return new QWaylandXdgShellV6Integration();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#include "main.moc"
|
@ -1,441 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2017 The Qt Company Ltd.
|
||||
** Copyright (C) 2017 Eurogiciel, author: <philippe.coval@eurogiciel.fr>
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the config.tests of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or (at your option) the GNU General
|
||||
** Public license version 3 or any later version approved by the KDE Free
|
||||
** Qt Foundation. The licenses are as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qwaylandxdgshellv6_p.h"
|
||||
|
||||
#include <QtWaylandClient/private/qwaylanddisplay_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandwindow_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandinputdevice_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandscreen_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandabstractdecoration_p.h>
|
||||
|
||||
#include <QtGui/private/qwindow_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QtWaylandClient {
|
||||
|
||||
QWaylandXdgSurfaceV6::Toplevel::Toplevel(QWaylandXdgSurfaceV6 *xdgSurface)
|
||||
: QtWayland::zxdg_toplevel_v6(xdgSurface->get_toplevel())
|
||||
, m_xdgSurface(xdgSurface)
|
||||
{
|
||||
requestWindowStates(xdgSurface->window()->window()->windowStates());
|
||||
}
|
||||
|
||||
QWaylandXdgSurfaceV6::Toplevel::~Toplevel()
|
||||
{
|
||||
if (m_applied.states & Qt::WindowActive) {
|
||||
QWaylandWindow *window = m_xdgSurface->window();
|
||||
window->display()->handleWindowDeactivated(window);
|
||||
}
|
||||
if (isInitialized())
|
||||
destroy();
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV6::Toplevel::applyConfigure()
|
||||
{
|
||||
if (!(m_applied.states & (Qt::WindowMaximized|Qt::WindowFullScreen)))
|
||||
m_normalSize = m_xdgSurface->m_window->window()->frameGeometry().size();
|
||||
|
||||
if ((m_pending.states & Qt::WindowActive) && !(m_applied.states & Qt::WindowActive))
|
||||
m_xdgSurface->m_window->display()->handleWindowActivated(m_xdgSurface->m_window);
|
||||
|
||||
if (!(m_pending.states & Qt::WindowActive) && (m_applied.states & Qt::WindowActive))
|
||||
m_xdgSurface->m_window->display()->handleWindowDeactivated(m_xdgSurface->m_window);
|
||||
|
||||
// TODO: none of the other plugins send WindowActive either, but is it on purpose?
|
||||
Qt::WindowStates statesWithoutActive = m_pending.states & ~Qt::WindowActive;
|
||||
|
||||
m_xdgSurface->m_window->handleWindowStatesChanged(statesWithoutActive);
|
||||
|
||||
if (m_pending.size.isEmpty()) {
|
||||
// An empty size in the configure means it's up to the client to choose the size
|
||||
bool normalPending = !(m_pending.states & (Qt::WindowMaximized|Qt::WindowFullScreen));
|
||||
if (normalPending && !m_normalSize.isEmpty())
|
||||
m_xdgSurface->m_window->resizeFromApplyConfigure(m_normalSize);
|
||||
} else {
|
||||
m_xdgSurface->m_window->resizeFromApplyConfigure(m_pending.size);
|
||||
}
|
||||
|
||||
m_xdgSurface->setSizeHints();
|
||||
|
||||
m_applied = m_pending;
|
||||
qCDebug(lcQpaWayland) << "Applied pending zxdg_toplevel_v6 configure event:" << m_applied.size << m_applied.states;
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV6::Toplevel::zxdg_toplevel_v6_configure(int32_t width, int32_t height, wl_array *states)
|
||||
{
|
||||
m_pending.size = QSize(width, height);
|
||||
|
||||
auto *xdgStates = static_cast<uint32_t *>(states->data);
|
||||
size_t numStates = states->size / sizeof(uint32_t);
|
||||
|
||||
m_pending.states = Qt::WindowNoState;
|
||||
|
||||
for (size_t i = 0; i < numStates; i++) {
|
||||
switch (xdgStates[i]) {
|
||||
case ZXDG_TOPLEVEL_V6_STATE_ACTIVATED:
|
||||
m_pending.states |= Qt::WindowActive;
|
||||
break;
|
||||
case ZXDG_TOPLEVEL_V6_STATE_MAXIMIZED:
|
||||
m_pending.states |= Qt::WindowMaximized;
|
||||
break;
|
||||
case ZXDG_TOPLEVEL_V6_STATE_FULLSCREEN:
|
||||
m_pending.states |= Qt::WindowFullScreen;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
qCDebug(lcQpaWayland) << "Received zxdg_toplevel_v6.configure with" << m_pending.size
|
||||
<< "and" << m_pending.states;
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV6::Toplevel::zxdg_toplevel_v6_close()
|
||||
{
|
||||
m_xdgSurface->m_window->window()->close();
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV6::Toplevel::requestWindowStates(Qt::WindowStates states)
|
||||
{
|
||||
// Re-send what's different from the applied state
|
||||
Qt::WindowStates changedStates = m_applied.states ^ states;
|
||||
|
||||
if (changedStates & Qt::WindowMaximized) {
|
||||
if (states & Qt::WindowMaximized)
|
||||
set_maximized();
|
||||
else
|
||||
unset_maximized();
|
||||
}
|
||||
|
||||
if (changedStates & Qt::WindowFullScreen) {
|
||||
if (states & Qt::WindowFullScreen)
|
||||
set_fullscreen(nullptr);
|
||||
else
|
||||
unset_fullscreen();
|
||||
}
|
||||
|
||||
// Minimized state is not reported by the protocol, so always send it
|
||||
if (states & Qt::WindowMinimized) {
|
||||
set_minimized();
|
||||
m_xdgSurface->window()->handleWindowStatesChanged(states & ~Qt::WindowMinimized);
|
||||
}
|
||||
}
|
||||
|
||||
QtWayland::zxdg_toplevel_v6::resize_edge QWaylandXdgSurfaceV6::Toplevel::convertToResizeEdges(Qt::Edges edges)
|
||||
{
|
||||
return static_cast<enum resize_edge>(
|
||||
((edges & Qt::TopEdge) ? resize_edge_top : 0)
|
||||
| ((edges & Qt::BottomEdge) ? resize_edge_bottom : 0)
|
||||
| ((edges & Qt::LeftEdge) ? resize_edge_left : 0)
|
||||
| ((edges & Qt::RightEdge) ? resize_edge_right : 0));
|
||||
}
|
||||
|
||||
QWaylandXdgSurfaceV6::Popup::Popup(QWaylandXdgSurfaceV6 *xdgSurface, QWaylandXdgSurfaceV6 *parent,
|
||||
QtWayland::zxdg_positioner_v6 *positioner)
|
||||
: zxdg_popup_v6(xdgSurface->get_popup(parent->object(), positioner->object()))
|
||||
, m_xdgSurface(xdgSurface)
|
||||
, m_parent(parent)
|
||||
{
|
||||
}
|
||||
|
||||
QWaylandXdgSurfaceV6::Popup::~Popup()
|
||||
{
|
||||
if (isInitialized())
|
||||
destroy();
|
||||
|
||||
if (m_grabbing) {
|
||||
auto *shell = m_xdgSurface->m_shell;
|
||||
Q_ASSERT(shell->m_topmostGrabbingPopup == this);
|
||||
shell->m_topmostGrabbingPopup = m_parent->m_popup;
|
||||
}
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV6::Popup::grab(QWaylandInputDevice *seat, uint serial)
|
||||
{
|
||||
m_xdgSurface->m_shell->m_topmostGrabbingPopup = this;
|
||||
zxdg_popup_v6::grab(seat->wl_seat(), serial);
|
||||
m_grabbing = true;
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV6::Popup::zxdg_popup_v6_popup_done()
|
||||
{
|
||||
m_xdgSurface->m_window->window()->close();
|
||||
}
|
||||
|
||||
QWaylandXdgSurfaceV6::QWaylandXdgSurfaceV6(QWaylandXdgShellV6 *shell, ::zxdg_surface_v6 *surface, QWaylandWindow *window)
|
||||
: QWaylandShellSurface(window)
|
||||
, zxdg_surface_v6(surface)
|
||||
, m_shell(shell)
|
||||
, m_window(window)
|
||||
{
|
||||
QWaylandDisplay *display = window->display();
|
||||
Qt::WindowType type = window->window()->type();
|
||||
auto *transientParent = window->transientParent();
|
||||
|
||||
if (type == Qt::ToolTip && transientParent) {
|
||||
setPopup(transientParent);
|
||||
} else if (type == Qt::Popup && transientParent && display->lastInputDevice()) {
|
||||
setGrabPopup(transientParent, display->lastInputDevice(), display->lastInputSerial());
|
||||
} else {
|
||||
setToplevel();
|
||||
if (transientParent) {
|
||||
auto parentXdgSurface = static_cast<QWaylandXdgSurfaceV6 *>(transientParent->shellSurface());
|
||||
if (parentXdgSurface)
|
||||
m_toplevel->set_parent(parentXdgSurface->m_toplevel->object());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QWaylandXdgSurfaceV6::~QWaylandXdgSurfaceV6()
|
||||
{
|
||||
if (m_toplevel) {
|
||||
delete m_toplevel;
|
||||
m_toplevel = nullptr;
|
||||
}
|
||||
if (m_popup) {
|
||||
delete m_popup;
|
||||
m_popup = nullptr;
|
||||
}
|
||||
destroy();
|
||||
}
|
||||
|
||||
bool QWaylandXdgSurfaceV6::resize(QWaylandInputDevice *inputDevice, Qt::Edges edges)
|
||||
{
|
||||
if (!m_toplevel || !m_toplevel->isInitialized())
|
||||
return false;
|
||||
|
||||
auto resizeEdges = Toplevel::convertToResizeEdges(edges);
|
||||
m_toplevel->resize(inputDevice->wl_seat(), inputDevice->serial(), resizeEdges);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool QWaylandXdgSurfaceV6::move(QWaylandInputDevice *inputDevice)
|
||||
{
|
||||
if (m_toplevel && m_toplevel->isInitialized()) {
|
||||
m_toplevel->move(inputDevice->wl_seat(), inputDevice->serial());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool QWaylandXdgSurfaceV6::showWindowMenu(QWaylandInputDevice *seat)
|
||||
{
|
||||
if (m_toplevel && m_toplevel->isInitialized()) {
|
||||
QPoint position = seat->pointerSurfacePosition().toPoint();
|
||||
m_toplevel->show_window_menu(seat->wl_seat(), seat->serial(), position.x(), position.y());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV6::setTitle(const QString &title)
|
||||
{
|
||||
if (m_toplevel)
|
||||
m_toplevel->set_title(title);
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV6::setAppId(const QString &appId)
|
||||
{
|
||||
if (m_toplevel)
|
||||
m_toplevel->set_app_id(appId);
|
||||
}
|
||||
|
||||
bool QWaylandXdgSurfaceV6::isExposed() const
|
||||
{
|
||||
return m_configured || m_pendingConfigureSerial;
|
||||
}
|
||||
|
||||
bool QWaylandXdgSurfaceV6::handleExpose(const QRegion ®ion)
|
||||
{
|
||||
if (!isExposed() && !region.isEmpty()) {
|
||||
m_exposeRegion = region;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV6::applyConfigure()
|
||||
{
|
||||
Q_ASSERT(m_pendingConfigureSerial != 0);
|
||||
|
||||
if (m_toplevel)
|
||||
m_toplevel->applyConfigure();
|
||||
|
||||
m_configured = true;
|
||||
ack_configure(m_pendingConfigureSerial);
|
||||
|
||||
m_pendingConfigureSerial = 0;
|
||||
}
|
||||
|
||||
bool QWaylandXdgSurfaceV6::wantsDecorations() const
|
||||
{
|
||||
return m_toplevel && !(m_toplevel->m_pending.states & Qt::WindowFullScreen);
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV6::propagateSizeHints()
|
||||
{
|
||||
setSizeHints();
|
||||
|
||||
if (m_toplevel && m_window)
|
||||
m_window->commit();
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV6::setWindowGeometry(const QRect &rect)
|
||||
{
|
||||
set_window_geometry(rect.x(), rect.y(), rect.width(), rect.height());
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV6::setSizeHints()
|
||||
{
|
||||
if (m_toplevel && m_window) {
|
||||
const int minWidth = qMax(0, m_window->windowMinimumSize().width());
|
||||
const int minHeight = qMax(0, m_window->windowMinimumSize().height());
|
||||
m_toplevel->set_min_size(minWidth, minHeight);
|
||||
|
||||
int maxWidth = qMax(0, m_window->windowMaximumSize().width());
|
||||
if (maxWidth == QWINDOWSIZE_MAX)
|
||||
maxWidth = 0;
|
||||
int maxHeight = qMax(0, m_window->windowMaximumSize().height());
|
||||
if (maxHeight == QWINDOWSIZE_MAX)
|
||||
maxHeight = 0;
|
||||
m_toplevel->set_max_size(maxWidth, maxHeight);
|
||||
}
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV6::requestWindowStates(Qt::WindowStates states)
|
||||
{
|
||||
if (m_toplevel)
|
||||
m_toplevel->requestWindowStates(states);
|
||||
else
|
||||
qCDebug(lcQpaWayland) << "Ignoring window states requested by non-toplevel.";
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV6::setToplevel()
|
||||
{
|
||||
Q_ASSERT(!m_toplevel && !m_popup);
|
||||
m_toplevel = new Toplevel(this);
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV6::setPopup(QWaylandWindow *parent)
|
||||
{
|
||||
Q_ASSERT(!m_toplevel && !m_popup);
|
||||
|
||||
auto parentXdgSurface = static_cast<QWaylandXdgSurfaceV6 *>(parent->shellSurface());
|
||||
|
||||
auto positioner = new QtWayland::zxdg_positioner_v6(m_shell->create_positioner());
|
||||
// set_popup expects a position relative to the parent
|
||||
QPoint transientPos = m_window->geometry().topLeft(); // this is absolute
|
||||
transientPos -= parent->geometry().topLeft();
|
||||
if (parent->decoration()) {
|
||||
transientPos.setX(transientPos.x() + parent->decoration()->margins().left());
|
||||
transientPos.setY(transientPos.y() + parent->decoration()->margins().top());
|
||||
}
|
||||
positioner->set_anchor_rect(transientPos.x(), transientPos.y(), 1, 1);
|
||||
positioner->set_anchor(QtWayland::zxdg_positioner_v6::anchor_top | QtWayland::zxdg_positioner_v6::anchor_left);
|
||||
positioner->set_gravity(QtWayland::zxdg_positioner_v6::gravity_bottom | QtWayland::zxdg_positioner_v6::gravity_right);
|
||||
positioner->set_size(m_window->geometry().width(), m_window->geometry().height());
|
||||
m_popup = new Popup(this, parentXdgSurface, positioner);
|
||||
positioner->destroy();
|
||||
delete positioner;
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV6::setGrabPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial)
|
||||
{
|
||||
auto parentXdgSurface = static_cast<QWaylandXdgSurfaceV6 *>(parent->shellSurface());
|
||||
auto *top = m_shell->m_topmostGrabbingPopup;
|
||||
|
||||
if (top && top->m_xdgSurface != parentXdgSurface) {
|
||||
qCWarning(lcQpaWayland) << "setGrabPopup called with a parent," << parentXdgSurface
|
||||
<< "which does not match the current topmost grabbing popup,"
|
||||
<< top->m_xdgSurface << "According to the xdg-shell-v6 protocol, this"
|
||||
<< "is not allowed. The wayland QPA plugin is currently handling"
|
||||
<< "it by setting the parent to the topmost grabbing popup."
|
||||
<< "Note, however, that this may cause positioning errors and"
|
||||
<< "popups closing unxpectedly because xdg-shell-v6 mandate that child"
|
||||
<< "popups close before parents";
|
||||
parent = top->m_xdgSurface->m_window;
|
||||
}
|
||||
setPopup(parent);
|
||||
m_popup->grab(device, serial);
|
||||
}
|
||||
|
||||
void QWaylandXdgSurfaceV6::zxdg_surface_v6_configure(uint32_t serial)
|
||||
{
|
||||
m_pendingConfigureSerial = serial;
|
||||
if (!m_configured) {
|
||||
// We have to do the initial applyConfigure() immediately, since that is the expose.
|
||||
applyConfigure();
|
||||
m_exposeRegion = QRegion(QRect(QPoint(), m_window->geometry().size()));
|
||||
} else {
|
||||
// Later configures are probably resizes, so we have to queue them up for a time when we
|
||||
// are not painting to the window.
|
||||
m_window->applyConfigureWhenPossible();
|
||||
}
|
||||
|
||||
if (!m_exposeRegion.isEmpty()) {
|
||||
m_window->handleExpose(m_exposeRegion);
|
||||
m_exposeRegion = QRegion();
|
||||
}
|
||||
}
|
||||
|
||||
QWaylandXdgShellV6::QWaylandXdgShellV6(struct ::wl_registry *registry, uint32_t id, uint32_t availableVersion)
|
||||
: QtWayland::zxdg_shell_v6(registry, id, qMin(availableVersion, 1u))
|
||||
{
|
||||
}
|
||||
|
||||
QWaylandXdgShellV6::~QWaylandXdgShellV6()
|
||||
{
|
||||
destroy();
|
||||
}
|
||||
|
||||
QWaylandXdgSurfaceV6 *QWaylandXdgShellV6::getXdgSurface(QWaylandWindow *window)
|
||||
{
|
||||
return new QWaylandXdgSurfaceV6(this, get_xdg_surface(window->wlSurface()), window);
|
||||
}
|
||||
|
||||
void QWaylandXdgShellV6::zxdg_shell_v6_ping(uint32_t serial)
|
||||
{
|
||||
pong(serial);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
@ -1,173 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2017 The Qt Company Ltd.
|
||||
** Copyright (C) 2017 Eurogiciel, author: <philippe.coval@eurogiciel.fr>
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the config.tests of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or (at your option) the GNU General
|
||||
** Public license version 3 or any later version approved by the KDE Free
|
||||
** Qt Foundation. The licenses are as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QWAYLANDXDGSHELLV6_H
|
||||
#define QWAYLANDXDGSHELLV6_H
|
||||
|
||||
//
|
||||
// W A R N I N G
|
||||
// -------------
|
||||
//
|
||||
// This file is not part of the Qt API. It exists purely as an
|
||||
// implementation detail. This header file may change from version to
|
||||
// version without notice, or even be removed.
|
||||
//
|
||||
// We mean it.
|
||||
//
|
||||
|
||||
#include "qwayland-xdg-shell-unstable-v6.h"
|
||||
|
||||
#include <QtWaylandClient/qtwaylandclientglobal.h>
|
||||
#include <QtWaylandClient/private/qwaylandshellsurface_p.h>
|
||||
|
||||
#include <QtCore/QSize>
|
||||
#include <QtGui/QRegion>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QWindow;
|
||||
|
||||
namespace QtWaylandClient {
|
||||
|
||||
class QWaylandWindow;
|
||||
class QWaylandInputDevice;
|
||||
class QWaylandXdgShellV6;
|
||||
|
||||
class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgSurfaceV6 : public QWaylandShellSurface, public QtWayland::zxdg_surface_v6
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
QWaylandXdgSurfaceV6(QWaylandXdgShellV6 *shell, ::zxdg_surface_v6 *surface, QWaylandWindow *window);
|
||||
~QWaylandXdgSurfaceV6() override;
|
||||
|
||||
bool resize(QWaylandInputDevice *inputDevice, Qt::Edges edges) override;
|
||||
bool move(QWaylandInputDevice *inputDevice) override;
|
||||
bool showWindowMenu(QWaylandInputDevice *seat) override;
|
||||
void setTitle(const QString &title) override;
|
||||
void setAppId(const QString &appId) override;
|
||||
|
||||
bool isExposed() const override;
|
||||
bool handleExpose(const QRegion &) override;
|
||||
bool handlesActiveState() const { return m_toplevel; }
|
||||
void applyConfigure() override;
|
||||
bool wantsDecorations() const override;
|
||||
void propagateSizeHints() override;
|
||||
void setWindowGeometry(const QRect &rect) override;
|
||||
|
||||
void setSizeHints();
|
||||
|
||||
protected:
|
||||
void requestWindowStates(Qt::WindowStates states) override;
|
||||
void zxdg_surface_v6_configure(uint32_t serial) override;
|
||||
|
||||
private:
|
||||
class Toplevel: public QtWayland::zxdg_toplevel_v6
|
||||
{
|
||||
public:
|
||||
Toplevel(QWaylandXdgSurfaceV6 *xdgSurface);
|
||||
~Toplevel() override;
|
||||
|
||||
void applyConfigure();
|
||||
|
||||
void zxdg_toplevel_v6_configure(int32_t width, int32_t height, wl_array *states) override;
|
||||
void zxdg_toplevel_v6_close() override;
|
||||
|
||||
void requestWindowStates(Qt::WindowStates states);
|
||||
|
||||
static resize_edge convertToResizeEdges(Qt::Edges edges);
|
||||
|
||||
struct {
|
||||
QSize size = {0, 0};
|
||||
Qt::WindowStates states = Qt::WindowNoState;
|
||||
} m_pending, m_applied;
|
||||
QSize m_normalSize;
|
||||
|
||||
QWaylandXdgSurfaceV6 *m_xdgSurface = nullptr;
|
||||
};
|
||||
|
||||
class Popup : public QtWayland::zxdg_popup_v6 {
|
||||
public:
|
||||
Popup(QWaylandXdgSurfaceV6 *xdgSurface, QWaylandXdgSurfaceV6 *parent, QtWayland::zxdg_positioner_v6 *positioner);
|
||||
~Popup() override;
|
||||
|
||||
void grab(QWaylandInputDevice *seat, uint serial);
|
||||
void zxdg_popup_v6_popup_done() override;
|
||||
|
||||
QWaylandXdgSurfaceV6 *m_xdgSurface = nullptr;
|
||||
QWaylandXdgSurfaceV6 *m_parent = nullptr;
|
||||
bool m_grabbing = false;
|
||||
};
|
||||
|
||||
void setToplevel();
|
||||
void setPopup(QWaylandWindow *parent);
|
||||
void setGrabPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial);
|
||||
|
||||
QWaylandXdgShellV6 *m_shell = nullptr;
|
||||
QWaylandWindow *m_window = nullptr;
|
||||
Toplevel *m_toplevel = nullptr;
|
||||
Popup *m_popup = nullptr;
|
||||
bool m_configured = false;
|
||||
QRegion m_exposeRegion;
|
||||
uint m_pendingConfigureSerial = 0;
|
||||
|
||||
friend class QWaylandXdgShellV6;
|
||||
};
|
||||
|
||||
class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgShellV6 : public QtWayland::zxdg_shell_v6
|
||||
{
|
||||
public:
|
||||
QWaylandXdgShellV6(struct ::wl_registry *registry, uint32_t id, uint32_t availableVersion);
|
||||
|
||||
QWaylandXdgSurfaceV6 *getXdgSurface(QWaylandWindow *window);
|
||||
|
||||
~QWaylandXdgShellV6() override;
|
||||
|
||||
private:
|
||||
void zxdg_shell_v6_ping(uint32_t serial) override;
|
||||
QWaylandXdgSurfaceV6::Popup *m_topmostGrabbingPopup = nullptr;
|
||||
|
||||
friend class QWaylandXdgSurfaceV6;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
}
|
||||
|
||||
#endif // QWAYLANDXDGSHELLV6_H
|
@ -1,87 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2017 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the plugins of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or (at your option) the GNU General
|
||||
** Public license version 3 or any later version approved by the KDE Free
|
||||
** Qt Foundation. The licenses are as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qwaylandxdgshellv6integration_p.h"
|
||||
|
||||
#include <QtWaylandClient/private/qwaylandwindow_p.h>
|
||||
#include <QtWaylandClient/private/qwaylanddisplay_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QtWaylandClient {
|
||||
|
||||
bool QWaylandXdgShellV6Integration::initialize(QWaylandDisplay *display)
|
||||
{
|
||||
for (QWaylandDisplay::RegistryGlobal global : display->globals()) {
|
||||
if (global.interface == QLatin1String("zxdg_shell_v6")) {
|
||||
m_xdgShell.reset(new QWaylandXdgShellV6(display->wl_registry(), global.id, global.version));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!m_xdgShell) {
|
||||
qCDebug(lcQpaWayland) << "Couldn't find global zxdg_shell_v6 for xdg-shell unstable v6";
|
||||
return false;
|
||||
}
|
||||
|
||||
return QWaylandShellIntegration::initialize(display);
|
||||
}
|
||||
|
||||
QWaylandShellSurface *QWaylandXdgShellV6Integration::createShellSurface(QWaylandWindow *window)
|
||||
{
|
||||
return m_xdgShell->getXdgSurface(window);
|
||||
}
|
||||
|
||||
void QWaylandXdgShellV6Integration::handleKeyboardFocusChanged(QWaylandWindow *newFocus, QWaylandWindow *oldFocus)
|
||||
{
|
||||
if (newFocus) {
|
||||
auto *xdgSurface = qobject_cast<QWaylandXdgSurfaceV6 *>(newFocus->shellSurface());
|
||||
if (xdgSurface && !xdgSurface->handlesActiveState())
|
||||
m_display->handleWindowActivated(newFocus);
|
||||
}
|
||||
if (oldFocus && qobject_cast<QWaylandXdgSurfaceV6 *>(oldFocus->shellSurface())) {
|
||||
auto *xdgSurface = qobject_cast<QWaylandXdgSurfaceV6 *>(oldFocus->shellSurface());
|
||||
if (xdgSurface && !xdgSurface->handlesActiveState())
|
||||
m_display->handleWindowDeactivated(oldFocus);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
@ -1,78 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2017 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the plugins of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or (at your option) the GNU General
|
||||
** Public license version 3 or any later version approved by the KDE Free
|
||||
** Qt Foundation. The licenses are as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QWAYLANDXDGSHELLV6INTEGRATION_P_H
|
||||
#define QWAYLANDXDGSHELLV6INTEGRATION_P_H
|
||||
|
||||
//
|
||||
// W A R N I N G
|
||||
// -------------
|
||||
//
|
||||
// This file is not part of the Qt API. It exists purely as an
|
||||
// implementation detail. This header file may change from version to
|
||||
// version without notice, or even be removed.
|
||||
//
|
||||
// We mean it.
|
||||
//
|
||||
|
||||
#include "qwaylandxdgshellv6_p.h"
|
||||
|
||||
#include <QtWaylandClient/private/qwaylandshellintegration_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QtWaylandClient {
|
||||
|
||||
class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgShellV6Integration : public QWaylandShellIntegration
|
||||
{
|
||||
public:
|
||||
QWaylandXdgShellV6Integration() {}
|
||||
bool initialize(QWaylandDisplay *display) override;
|
||||
QWaylandShellSurface *createShellSurface(QWaylandWindow *window) override;
|
||||
void handleKeyboardFocusChanged(QWaylandWindow *newFocus, QWaylandWindow *oldFocus) override;
|
||||
|
||||
private:
|
||||
QScopedPointer<QWaylandXdgShellV6> m_xdgShell;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QWAYLANDXDGSHELLV6INTEGRATION_P_H
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"Keys":[ "xdg-shell-v6" ]
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
QT += gui-private waylandclient-private
|
||||
CONFIG += wayland-scanner
|
||||
|
||||
QMAKE_USE += wayland-client
|
||||
qtConfig(xkbcommon): \
|
||||
QMAKE_USE_PRIVATE += xkbcommon
|
||||
|
||||
WAYLANDCLIENTSOURCES += \
|
||||
../../../3rdparty/protocol/xdg-shell-unstable-v6.xml
|
||||
|
||||
HEADERS += \
|
||||
qwaylandxdgshellv6_p.h \
|
||||
qwaylandxdgshellv6integration_p.h \
|
||||
|
||||
SOURCES += \
|
||||
main.cpp \
|
||||
qwaylandxdgshellv6.cpp \
|
||||
qwaylandxdgshellv6integration.cpp \
|
||||
|
||||
OTHER_FILES += \
|
||||
xdg-shell-v6.json
|
||||
|
||||
PLUGIN_TYPE = wayland-shell-integration
|
||||
PLUGIN_CLASS_NAME = QWaylandXdgShellV6IntegrationPlugin
|
||||
load(qt_plugin)
|
@ -399,13 +399,6 @@ void QWaylandIntegration::initializeShellIntegration()
|
||||
preferredShells = targetKeys.split(QLatin1Char(';'));
|
||||
} else {
|
||||
preferredShells << QLatin1String("xdg-shell");
|
||||
preferredShells << QLatin1String("xdg-shell-v6");
|
||||
QString useXdgShell = QString::fromLocal8Bit(qgetenv("QT_WAYLAND_USE_XDG_SHELL"));
|
||||
if (!useXdgShell.isEmpty() && useXdgShell != QLatin1String("0")) {
|
||||
qWarning() << "QT_WAYLAND_USE_XDG_SHELL is deprecated, "
|
||||
"please specify the shell using QT_WAYLAND_SHELL_INTEGRATION instead";
|
||||
preferredShells << QLatin1String("xdg-shell-v5");
|
||||
}
|
||||
preferredShells << QLatin1String("wl-shell") << QLatin1String("ivi-shell");
|
||||
}
|
||||
|
||||
|
@ -15,7 +15,6 @@ add_subdirectory(wl_connect)
|
||||
add_subdirectory(xdgdecorationv1)
|
||||
add_subdirectory(xdgoutput)
|
||||
add_subdirectory(xdgshell)
|
||||
add_subdirectory(xdgshellv6)
|
||||
if(QT_FEATURE_im)
|
||||
add_subdirectory(inputcontext)
|
||||
endif()
|
||||
|
@ -15,7 +15,6 @@ SUBDIRS += \
|
||||
wl_connect \
|
||||
xdgdecorationv1 \
|
||||
xdgoutput \
|
||||
xdgshell \
|
||||
xdgshellv6
|
||||
xdgshell
|
||||
|
||||
qtConfig(im): SUBDIRS += inputcontext
|
||||
|
@ -14,7 +14,6 @@ qt_internal_add_test(tst_client
|
||||
../shared_old/mockregion.cpp ../shared_old/mockregion.h
|
||||
../shared_old/mocksurface.cpp ../shared_old/mocksurface.h
|
||||
../shared_old/mockwlshell.cpp ../shared_old/mockwlshell.h
|
||||
../shared_old/mockxdgshellv6.cpp ../shared_old/mockxdgshellv6.h
|
||||
tst_client.cpp
|
||||
INCLUDE_DIRECTORIES
|
||||
../shared_old
|
||||
@ -33,7 +32,7 @@ qt6_generate_wayland_protocol_server_sources(tst_client
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/fullscreen-shell-unstable-v1.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/ivi-application.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/wayland.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/xdg-shell-unstable-v6.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/xdg-shell.xml
|
||||
)
|
||||
|
||||
#### Keys ignored in scope 1:.:.:client.pro:<TRUE>:
|
||||
|
@ -14,7 +14,6 @@ qt_internal_add_test(tst_client
|
||||
../shared_old/mockregion.cpp ../shared_old/mockregion.h
|
||||
../shared_old/mocksurface.cpp ../shared_old/mocksurface.h
|
||||
../shared_old/mockwlshell.cpp ../shared_old/mockwlshell.h
|
||||
../shared_old/mockxdgshellv6.cpp ../shared_old/mockxdgshellv6.h
|
||||
tst_client.cpp
|
||||
INCLUDE_DIRECTORIES
|
||||
../shared_old
|
||||
@ -34,7 +33,7 @@ qt6_generate_wayland_protocol_server_sources(tst_client
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/fullscreen-shell-unstable-v1.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/ivi-application.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/wayland.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/xdg-shell-unstable-v6.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/xdg-shell.xml
|
||||
)
|
||||
|
||||
#### Keys ignored in scope 1:.:.:client.pro:<TRUE>:
|
||||
|
@ -3,4 +3,3 @@ set -ex
|
||||
$@
|
||||
env QT_WAYLAND_SHELL_INTEGRATION=wl-shell $@
|
||||
env QT_WAYLAND_SHELL_INTEGRATION=ivi-shell $@
|
||||
env QT_WAYLAND_SHELL_INTEGRATION=xdg-shell-v6 $@
|
||||
|
@ -167,7 +167,6 @@ public slots:
|
||||
// and don't show up as false positives in the next test
|
||||
QTRY_VERIFY(!compositor->surface());
|
||||
QTRY_VERIFY(!compositor->iviSurface());
|
||||
QTRY_VERIFY(!compositor->xdgToplevelV6());
|
||||
}
|
||||
|
||||
private slots:
|
||||
@ -212,9 +211,6 @@ void tst_WaylandClient::activeWindowFollowsKeyboardFocus()
|
||||
|
||||
QTRY_VERIFY(window.isExposed());
|
||||
|
||||
if (compositor->xdgToplevelV6())
|
||||
QSKIP("On xdg-shell v6 focus is handled by configure events");
|
||||
|
||||
QCOMPARE(window.focusInEventCount, 0);
|
||||
compositor->setKeyboardFocus(surface);
|
||||
QTRY_COMPARE(window.focusInEventCount, 1);
|
||||
|
@ -14,7 +14,6 @@ qt_internal_add_test(tst_client_fullscreenshellv1
|
||||
../shared_old/mockregion.cpp ../shared_old/mockregion.h
|
||||
../shared_old/mocksurface.cpp ../shared_old/mocksurface.h
|
||||
../shared_old/mockwlshell.cpp ../shared_old/mockwlshell.h
|
||||
../shared_old/mockxdgshellv6.cpp ../shared_old/mockxdgshellv6.h
|
||||
tst_fullscreenshellv1.cpp
|
||||
INCLUDE_DIRECTORIES
|
||||
../shared_old
|
||||
@ -33,5 +32,5 @@ qt6_generate_wayland_protocol_server_sources(tst_client_fullscreenshellv1
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/fullscreen-shell-unstable-v1.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/ivi-application.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/wayland.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/xdg-shell-unstable-v6.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/xdg-shell.xml
|
||||
)
|
||||
|
@ -14,7 +14,6 @@ qt_internal_add_test(tst_client_fullscreenshellv1
|
||||
../shared_old/mockregion.cpp ../shared_old/mockregion.h
|
||||
../shared_old/mocksurface.cpp ../shared_old/mocksurface.h
|
||||
../shared_old/mockwlshell.cpp ../shared_old/mockwlshell.h
|
||||
../shared_old/mockxdgshellv6.cpp ../shared_old/mockxdgshellv6.h
|
||||
tst_fullscreenshellv1.cpp
|
||||
INCLUDE_DIRECTORIES
|
||||
../shared_old
|
||||
@ -34,5 +33,5 @@ qt6_generate_wayland_protocol_server_sources(tst_client_fullscreenshellv1
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/fullscreen-shell-unstable-v1.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/ivi-application.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/wayland.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/xdg-shell-unstable-v6.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/xdg-shell.xml
|
||||
)
|
||||
|
@ -14,7 +14,6 @@ qt_internal_add_test(tst_client_iviapplication
|
||||
../shared_old/mockregion.cpp ../shared_old/mockregion.h
|
||||
../shared_old/mocksurface.cpp ../shared_old/mocksurface.h
|
||||
../shared_old/mockwlshell.cpp ../shared_old/mockwlshell.h
|
||||
../shared_old/mockxdgshellv6.cpp ../shared_old/mockxdgshellv6.h
|
||||
tst_iviapplication.cpp
|
||||
INCLUDE_DIRECTORIES
|
||||
../shared_old
|
||||
@ -33,5 +32,5 @@ qt6_generate_wayland_protocol_server_sources(tst_client_iviapplication
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/fullscreen-shell-unstable-v1.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/ivi-application.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/wayland.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/xdg-shell-unstable-v6.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/xdg-shell.xml
|
||||
)
|
||||
|
@ -60,8 +60,17 @@ void tst_nooutput::noScreens()
|
||||
window.resize(16, 16);
|
||||
window.show();
|
||||
|
||||
// We have to handle showing a window when there are no real outputs
|
||||
QCOMPOSITOR_TRY_VERIFY(xdgSurface() && xdgSurface()->m_committedConfigureSerial);
|
||||
QCOMPOSITOR_TRY_VERIFY(xdgToplevel());
|
||||
|
||||
QTRY_VERIFY(window.isVisible());
|
||||
// The window should not be exposed before the first xdg_surface configure event
|
||||
QTRY_VERIFY(!window.isExposed());
|
||||
|
||||
exec([=] {
|
||||
xdgToplevel()->sendConfigure({0, 0}, {}); // Let the window decide the size
|
||||
});
|
||||
|
||||
QTRY_VERIFY(window.isExposed());
|
||||
}
|
||||
|
||||
QCOMPOSITOR_TEST_MAIN(tst_nooutput)
|
||||
|
@ -31,11 +31,8 @@
|
||||
#include "mockoutput.h"
|
||||
#include "mocksurface.h"
|
||||
#include "mockwlshell.h"
|
||||
#include "mockxdgshellv6.h"
|
||||
#include "mockiviapplication.h"
|
||||
|
||||
#include <wayland-xdg-shell-unstable-v6-server-protocol.h>
|
||||
|
||||
#include <stdio.h>
|
||||
MockCompositor::MockCompositor()
|
||||
{
|
||||
@ -199,17 +196,6 @@ void MockCompositor::sendIviSurfaceConfigure(const QSharedPointer<MockIviSurface
|
||||
processCommand(command);
|
||||
}
|
||||
|
||||
void MockCompositor::sendXdgToplevelV6Configure(const QSharedPointer<MockXdgToplevelV6> toplevel, const QSize &size, const QList<uint> &states)
|
||||
{
|
||||
Command command = makeCommand(Impl::Compositor::sendXdgToplevelV6Configure, m_compositor);
|
||||
command.parameters << QVariant::fromValue(toplevel);
|
||||
command.parameters << QVariant::fromValue(size);
|
||||
QByteArray statesBytes(reinterpret_cast<const char *>(states.data()),
|
||||
states.size() * static_cast<int>(sizeof(uint)));
|
||||
command.parameters << statesBytes;
|
||||
processCommand(command);
|
||||
}
|
||||
|
||||
void MockCompositor::waitForStartDrag()
|
||||
{
|
||||
Command command = makeCommand(Impl::Compositor::waitForStartDrag, m_compositor);
|
||||
@ -254,16 +240,6 @@ QSharedPointer<MockIviSurface> MockCompositor::iviSurface(int index)
|
||||
return result;
|
||||
}
|
||||
|
||||
QSharedPointer<MockXdgToplevelV6> MockCompositor::xdgToplevelV6(int index)
|
||||
{
|
||||
QSharedPointer<MockXdgToplevelV6> result;
|
||||
lock();
|
||||
if (Impl::XdgToplevelV6 *toplevel = m_compositor->xdgShellV6()->toplevels().value(index, nullptr))
|
||||
result = toplevel->mockToplevel();
|
||||
unlock();
|
||||
return result;
|
||||
}
|
||||
|
||||
QSharedPointer<MockSurface> MockCompositor::fullScreenShellV1Surface(int index)
|
||||
{
|
||||
QSharedPointer<MockSurface> result;
|
||||
@ -356,7 +332,6 @@ Compositor::Compositor(MockCompositor *mockCompositor)
|
||||
m_outputs.append(new Output(m_display, QSize(1920, 1080), QPoint(0, 0)));
|
||||
m_iviApplication.reset(new IviApplication(m_display));
|
||||
m_wlShell.reset(new WlShell(m_display));
|
||||
m_xdgShellV6.reset(new XdgShellV6(m_display));
|
||||
m_fullScreenShellV1.reset(new FullScreenShellV1(m_display));
|
||||
|
||||
m_loop = wl_display_get_event_loop(m_display);
|
||||
@ -430,11 +405,6 @@ IviApplication *Compositor::iviApplication() const
|
||||
return m_iviApplication.data();
|
||||
}
|
||||
|
||||
XdgShellV6 *Compositor::xdgShellV6() const
|
||||
{
|
||||
return m_xdgShellV6.data();
|
||||
}
|
||||
|
||||
FullScreenShellV1 *Compositor::fullScreenShellV1() const
|
||||
{
|
||||
return m_fullScreenShellV1.data();
|
||||
@ -480,10 +450,4 @@ IviSurface *Compositor::resolveIviSurface(const QVariant &v)
|
||||
return mockIviSurface ? mockIviSurface->handle() : nullptr;
|
||||
}
|
||||
|
||||
XdgToplevelV6 *Compositor::resolveToplevel(const QVariant &v)
|
||||
{
|
||||
QSharedPointer<MockXdgToplevelV6> mockToplevel = v.value<QSharedPointer<MockXdgToplevelV6>>();
|
||||
return mockToplevel ? mockToplevel->handle() : nullptr;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -29,7 +29,6 @@
|
||||
#ifndef MOCKCOMPOSITOR_H
|
||||
#define MOCKCOMPOSITOR_H
|
||||
|
||||
#include "mockxdgshellv6.h"
|
||||
#include "mockiviapplication.h"
|
||||
#include "mockfullscreenshellv1.h"
|
||||
#include "mockregion.h"
|
||||
@ -62,7 +61,6 @@ class Surface;
|
||||
class Output;
|
||||
class IviApplication;
|
||||
class WlShell;
|
||||
class XdgShellV6;
|
||||
class Region;
|
||||
|
||||
class Compositor
|
||||
@ -81,7 +79,6 @@ public:
|
||||
QList<Output *> outputs() const;
|
||||
|
||||
IviApplication *iviApplication() const;
|
||||
XdgShellV6 *xdgShellV6() const;
|
||||
FullScreenShellV1 *fullScreenShellV1() const;
|
||||
|
||||
void addSurface(Surface *surface);
|
||||
@ -105,7 +102,6 @@ public:
|
||||
static void setOutputMode(void *compositor, const QList<QVariant> ¶meters);
|
||||
static void sendShellSurfaceConfigure(void *data, const QList<QVariant> ¶meters);
|
||||
static void sendIviSurfaceConfigure(void *data, const QList<QVariant> ¶meters);
|
||||
static void sendXdgToplevelV6Configure(void *data, const QList<QVariant> ¶meters);
|
||||
|
||||
public:
|
||||
bool m_startDragSeen = false;
|
||||
@ -115,7 +111,6 @@ private:
|
||||
static Surface *resolveSurface(const QVariant &v);
|
||||
static Output *resolveOutput(const QVariant &v);
|
||||
static IviSurface *resolveIviSurface(const QVariant &v);
|
||||
static XdgToplevelV6 *resolveToplevel(const QVariant &v);
|
||||
|
||||
void initShm();
|
||||
|
||||
@ -137,7 +132,6 @@ private:
|
||||
QList<Output *> m_outputs;
|
||||
QScopedPointer<IviApplication> m_iviApplication;
|
||||
QScopedPointer<WlShell> m_wlShell;
|
||||
QScopedPointer<XdgShellV6> m_xdgShellV6;
|
||||
QScopedPointer<FullScreenShellV1> m_fullScreenShellV1;
|
||||
};
|
||||
|
||||
@ -193,32 +187,6 @@ private:
|
||||
|
||||
Q_DECLARE_METATYPE(QSharedPointer<MockIviSurface>)
|
||||
|
||||
class MockXdgToplevelV6 : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
Impl::XdgToplevelV6 *handle() const { return m_toplevel; }
|
||||
|
||||
void sendConfigure(const QSharedPointer<MockXdgToplevelV6> toplevel);
|
||||
|
||||
signals:
|
||||
uint setMinimizedRequested();
|
||||
uint setMaximizedRequested();
|
||||
uint unsetMaximizedRequested();
|
||||
uint setFullscreenRequested();
|
||||
uint unsetFullscreenRequested();
|
||||
void windowGeometryRequested(QRect geometry); // NOTE: This is really an xdg surface event
|
||||
|
||||
private:
|
||||
MockXdgToplevelV6(Impl::XdgToplevelV6 *toplevel) : m_toplevel(toplevel) {}
|
||||
friend class Impl::Compositor;
|
||||
friend class Impl::XdgToplevelV6;
|
||||
|
||||
Impl::XdgToplevelV6 *m_toplevel;
|
||||
};
|
||||
|
||||
Q_DECLARE_METATYPE(QSharedPointer<MockXdgToplevelV6>)
|
||||
|
||||
class MockOutput {
|
||||
public:
|
||||
Impl::Output *handle() const { return m_output; }
|
||||
@ -259,14 +227,11 @@ public:
|
||||
void sendSurfaceLeave(const QSharedPointer<MockSurface> &surface, QSharedPointer<MockOutput> &output);
|
||||
void sendShellSurfaceConfigure(const QSharedPointer<MockSurface> surface, const QSize &size = QSize(0, 0));
|
||||
void sendIviSurfaceConfigure(const QSharedPointer<MockIviSurface> iviSurface, const QSize &size);
|
||||
void sendXdgToplevelV6Configure(const QSharedPointer<MockXdgToplevelV6> toplevel, const QSize &size = QSize(0, 0),
|
||||
const QList<uint> &states = { ZXDG_TOPLEVEL_V6_STATE_ACTIVATED });
|
||||
void waitForStartDrag();
|
||||
|
||||
QSharedPointer<MockSurface> surface();
|
||||
QSharedPointer<MockOutput> output(int index = 0);
|
||||
QSharedPointer<MockIviSurface> iviSurface(int index = 0);
|
||||
QSharedPointer<MockXdgToplevelV6> xdgToplevelV6(int index = 0);
|
||||
QSharedPointer<MockSurface> fullScreenShellV1Surface(int index = 0);
|
||||
|
||||
void lock();
|
||||
|
@ -41,13 +41,7 @@ void Compositor::sendShellSurfaceConfigure(void *data, const QList<QVariant> &pa
|
||||
Surface *surface = resolveSurface(parameters.at(0));
|
||||
QSize size = parameters.at(1).toSize();
|
||||
Q_ASSERT(size.isValid());
|
||||
if (auto toplevel = surface->xdgToplevelV6()) {
|
||||
QList<uint> states = { ZXDG_TOPLEVEL_V6_STATE_ACTIVATED };
|
||||
auto statesBytes = QByteArray::fromRawData(reinterpret_cast<const char *>(states.data()),
|
||||
states.size() * static_cast<int>(sizeof(uint)));
|
||||
toplevel->send_configure(size.width(), size.height(), statesBytes);
|
||||
toplevel->xdgSurface()->sendConfigure(compositor->nextSerial());
|
||||
} else if (auto wlShellSurface = surface->wlShellSurface()) {
|
||||
if (auto wlShellSurface = surface->wlShellSurface()) {
|
||||
const uint edges = 0;
|
||||
wlShellSurface->send_configure(edges, size.width(), size.height());
|
||||
} else {
|
||||
@ -95,17 +89,11 @@ void Surface::surface_destroy(Resource *resource)
|
||||
if (m_wlShellSurface) // on wl-shell the shell surface is automatically destroyed with the surface
|
||||
wl_resource_destroy(m_wlShellSurface->resource()->handle);
|
||||
Q_ASSERT(!m_wlShellSurface);
|
||||
Q_ASSERT(!m_xdgSurfaceV6);
|
||||
wl_resource_destroy(resource->handle);
|
||||
}
|
||||
|
||||
void Surface::surface_attach(Resource *resource, struct wl_resource *buffer, int x, int y)
|
||||
{
|
||||
if (m_xdgSurfaceV6) {
|
||||
// It's a protocol error to attach a buffer to an xdgSurface that's not configured
|
||||
Q_ASSERT(xdgSurfaceV6()->configureSent());
|
||||
}
|
||||
|
||||
Q_UNUSED(resource);
|
||||
Q_UNUSED(x);
|
||||
Q_UNUSED(y);
|
||||
|
@ -37,7 +37,6 @@
|
||||
|
||||
namespace Impl {
|
||||
|
||||
class XdgToplevelV6;
|
||||
class WlShellSurface;
|
||||
|
||||
class Surface : public QtWaylandServer::wl_surface
|
||||
@ -50,8 +49,6 @@ public:
|
||||
static Surface *fromResource(struct ::wl_resource *resource);
|
||||
void map();
|
||||
bool isMapped() const;
|
||||
XdgSurfaceV6 *xdgSurfaceV6() const { return m_xdgSurfaceV6; }
|
||||
XdgToplevelV6 *xdgToplevelV6() const { return m_xdgSurfaceV6 ? m_xdgSurfaceV6->toplevel() : nullptr; }
|
||||
WlShellSurface *wlShellSurface() const { return m_wlShellSurface; }
|
||||
|
||||
QSharedPointer<MockSurface> mockSurface() const { return m_mockSurface; }
|
||||
@ -72,7 +69,6 @@ protected:
|
||||
void surface_commit(Resource *resource) override;
|
||||
private:
|
||||
wl_resource *m_buffer = nullptr;
|
||||
XdgSurfaceV6 *m_xdgSurfaceV6 = nullptr;
|
||||
WlShellSurface *m_wlShellSurface = nullptr;
|
||||
|
||||
Compositor *m_compositor = nullptr;
|
||||
@ -80,7 +76,6 @@ private:
|
||||
QList<wl_resource *> m_frameCallbackList;
|
||||
bool m_mapped = false;
|
||||
|
||||
friend class XdgSurfaceV6;
|
||||
friend class WlShellSurface;
|
||||
};
|
||||
|
||||
|
@ -1,145 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2017 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "mockxdgshellv6.h"
|
||||
#include "mocksurface.h"
|
||||
#include "mockcompositor.h"
|
||||
|
||||
namespace Impl {
|
||||
|
||||
void Compositor::sendXdgToplevelV6Configure(void *data, const QList<QVariant> ¶meters)
|
||||
{
|
||||
Compositor *compositor = static_cast<Compositor *>(data);
|
||||
XdgToplevelV6 *toplevel = resolveToplevel(parameters.at(0));
|
||||
Q_ASSERT(toplevel && toplevel->resource());
|
||||
QSize size = parameters.at(1).toSize();
|
||||
Q_ASSERT(size.isValid());
|
||||
auto statesBytes = parameters.at(2).toByteArray();
|
||||
toplevel->send_configure(size.width(), size.height(), statesBytes);
|
||||
toplevel->xdgSurface()->send_configure(compositor->nextSerial());
|
||||
}
|
||||
|
||||
XdgSurfaceV6::XdgSurfaceV6(XdgShellV6 *shell, Surface *surface, wl_client *client, uint32_t id)
|
||||
: QtWaylandServer::zxdg_surface_v6(client, id, 1)
|
||||
, m_surface(surface)
|
||||
, m_shell(shell)
|
||||
{
|
||||
m_surface->m_xdgSurfaceV6 = this;
|
||||
}
|
||||
|
||||
XdgSurfaceV6::~XdgSurfaceV6()
|
||||
{
|
||||
m_surface->m_xdgSurfaceV6 = nullptr;
|
||||
}
|
||||
|
||||
void XdgSurfaceV6::sendConfigure(uint32_t serial)
|
||||
{
|
||||
send_configure(serial);
|
||||
m_configureSent = true;
|
||||
}
|
||||
|
||||
void XdgSurfaceV6::zxdg_surface_v6_get_toplevel(QtWaylandServer::zxdg_surface_v6::Resource *resource, uint32_t id)
|
||||
{
|
||||
int version = wl_resource_get_version(resource->handle);
|
||||
m_toplevel = new XdgToplevelV6(this, resource->client(), id, version);
|
||||
}
|
||||
|
||||
void XdgSurfaceV6::zxdg_surface_v6_set_window_geometry(QtWaylandServer::zxdg_surface_v6::Resource *resource, int32_t x, int32_t y, int32_t width, int32_t height)
|
||||
{
|
||||
Q_UNUSED(resource);
|
||||
if (m_toplevel) {
|
||||
QRect geometry(x, y, width, height);
|
||||
emit m_toplevel->mockToplevel()->windowGeometryRequested(geometry);
|
||||
}
|
||||
}
|
||||
|
||||
void XdgSurfaceV6::zxdg_surface_v6_destroy(QtWaylandServer::zxdg_surface_v6::Resource *resource)
|
||||
{
|
||||
Q_ASSERT(!m_toplevel);
|
||||
wl_resource_destroy(resource->handle);
|
||||
}
|
||||
|
||||
XdgToplevelV6::XdgToplevelV6(XdgSurfaceV6 *xdgSurface, wl_client *client, uint32_t id, int version)
|
||||
: QtWaylandServer::zxdg_toplevel_v6(client, id, version)
|
||||
, m_xdgSurface(xdgSurface)
|
||||
, m_mockToplevel(new MockXdgToplevelV6(this))
|
||||
{
|
||||
auto *surface = m_xdgSurface->surface();
|
||||
m_xdgSurface->shell()->addToplevel(this);
|
||||
surface->map();
|
||||
}
|
||||
|
||||
XdgToplevelV6::~XdgToplevelV6()
|
||||
{
|
||||
m_xdgSurface->shell()->removeToplevel(this);
|
||||
m_mockToplevel->m_toplevel = nullptr;
|
||||
}
|
||||
|
||||
void XdgToplevelV6::zxdg_toplevel_v6_destroy(QtWaylandServer::zxdg_toplevel_v6::Resource *resource)
|
||||
{
|
||||
m_xdgSurface->m_toplevel = nullptr;
|
||||
wl_resource_destroy(resource->handle);
|
||||
}
|
||||
|
||||
void XdgToplevelV6::zxdg_toplevel_v6_set_minimized(QtWaylandServer::zxdg_toplevel_v6::Resource *resource)
|
||||
{
|
||||
Q_UNUSED(resource);
|
||||
emit m_mockToplevel->setMinimizedRequested();
|
||||
}
|
||||
|
||||
void XdgToplevelV6::zxdg_toplevel_v6_set_maximized(QtWaylandServer::zxdg_toplevel_v6::Resource *resource)
|
||||
{
|
||||
Q_UNUSED(resource);
|
||||
emit m_mockToplevel->setMaximizedRequested();
|
||||
}
|
||||
|
||||
void XdgToplevelV6::zxdg_toplevel_v6_unset_maximized(QtWaylandServer::zxdg_toplevel_v6::Resource *resource)
|
||||
{
|
||||
Q_UNUSED(resource);
|
||||
emit m_mockToplevel->unsetMaximizedRequested();
|
||||
}
|
||||
|
||||
void XdgToplevelV6::zxdg_toplevel_v6_set_fullscreen(QtWaylandServer::zxdg_toplevel_v6::Resource *resource, wl_resource *output)
|
||||
{
|
||||
Q_UNUSED(resource);
|
||||
Q_UNUSED(output);
|
||||
emit m_mockToplevel->setFullscreenRequested();
|
||||
}
|
||||
|
||||
void XdgToplevelV6::zxdg_toplevel_v6_unset_fullscreen(QtWaylandServer::zxdg_toplevel_v6::Resource *resource)
|
||||
{
|
||||
Q_UNUSED(resource);
|
||||
emit m_mockToplevel->unsetFullscreenRequested();
|
||||
}
|
||||
|
||||
void Impl::XdgShellV6::zxdg_shell_v6_get_xdg_surface(QtWaylandServer::zxdg_shell_v6::Resource *resource, uint32_t id, wl_resource *surface)
|
||||
{
|
||||
new XdgSurfaceV6(this, Surface::fromResource(surface), resource->client(), id);
|
||||
}
|
||||
|
||||
} // namespace Impl
|
@ -1,114 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2018 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include <qwayland-server-xdg-shell-unstable-v6.h>
|
||||
|
||||
#include <QList>
|
||||
#include <QSharedPointer>
|
||||
|
||||
#ifndef MOCKXDGSHELLV6_H
|
||||
#define MOCKXDGSHELLV6_H
|
||||
|
||||
class MockXdgToplevelV6;
|
||||
|
||||
namespace Impl {
|
||||
|
||||
class XdgToplevelV6;
|
||||
class XdgShellV6;
|
||||
class Surface;
|
||||
|
||||
class XdgSurfaceV6 : public QtWaylandServer::zxdg_surface_v6
|
||||
{
|
||||
public:
|
||||
XdgSurfaceV6(XdgShellV6 *shell, Surface *surface, wl_client *client, uint32_t id);
|
||||
~XdgSurfaceV6() override;
|
||||
XdgShellV6 *shell() const { return m_shell; }
|
||||
Surface *surface() const { return m_surface; }
|
||||
XdgToplevelV6 *toplevel() const { return m_toplevel; }
|
||||
|
||||
void sendConfigure(uint32_t serial);
|
||||
bool configureSent() const { return m_configureSent; }
|
||||
|
||||
protected:
|
||||
void zxdg_surface_v6_destroy_resource(Resource *) override { delete this; }
|
||||
void zxdg_surface_v6_get_toplevel(Resource *resource, uint32_t id) override;
|
||||
void zxdg_surface_v6_set_window_geometry(Resource *resource, int32_t x, int32_t y, int32_t width, int32_t height) override;
|
||||
void zxdg_surface_v6_destroy(Resource *resource) override;
|
||||
|
||||
private:
|
||||
Surface *m_surface = nullptr;
|
||||
XdgToplevelV6 *m_toplevel = nullptr;
|
||||
XdgShellV6 *m_shell = nullptr;
|
||||
bool m_configureSent = false;
|
||||
|
||||
friend class XdgToplevelV6;
|
||||
};
|
||||
|
||||
class XdgToplevelV6 : public QtWaylandServer::zxdg_toplevel_v6
|
||||
{
|
||||
public:
|
||||
XdgToplevelV6(XdgSurfaceV6 *xdgSurface, wl_client *client, uint32_t id, int version);
|
||||
~XdgToplevelV6() override;
|
||||
XdgSurfaceV6 *xdgSurface() const { return m_xdgSurface; }
|
||||
|
||||
QSharedPointer<MockXdgToplevelV6> mockToplevel() const { return m_mockToplevel; }
|
||||
|
||||
protected:
|
||||
void zxdg_toplevel_v6_destroy_resource(Resource *) override { delete this; }
|
||||
void zxdg_toplevel_v6_destroy(Resource *resource) override;
|
||||
void zxdg_toplevel_v6_set_minimized(Resource *resource) override;
|
||||
void zxdg_toplevel_v6_set_maximized(Resource *resource) override;
|
||||
void zxdg_toplevel_v6_unset_maximized(Resource *resource) override;
|
||||
void zxdg_toplevel_v6_set_fullscreen(Resource *resource, struct ::wl_resource *output) override;
|
||||
void zxdg_toplevel_v6_unset_fullscreen(Resource *resource) override;
|
||||
|
||||
private:
|
||||
XdgSurfaceV6 *m_xdgSurface = nullptr;
|
||||
QSharedPointer<MockXdgToplevelV6> m_mockToplevel;
|
||||
};
|
||||
|
||||
class XdgShellV6 : public QtWaylandServer::zxdg_shell_v6
|
||||
{
|
||||
public:
|
||||
explicit XdgShellV6(::wl_display *display) : zxdg_shell_v6(display, 1) {}
|
||||
QList<XdgToplevelV6 *> toplevels() const { return m_toplevels; }
|
||||
|
||||
protected:
|
||||
void zxdg_shell_v6_get_xdg_surface(Resource *resource, uint32_t id, ::wl_resource *surface) override;
|
||||
|
||||
private:
|
||||
void addToplevel(XdgToplevelV6 *toplevel) { m_toplevels.append(toplevel); }
|
||||
void removeToplevel(XdgToplevelV6 *toplevel) { m_toplevels.removeOne(toplevel); }
|
||||
QList<XdgToplevelV6 *> m_toplevels;
|
||||
|
||||
friend class XdgToplevelV6;
|
||||
};
|
||||
|
||||
} // namespace Impl
|
||||
|
||||
#endif // MOCKXDGSHELLV6_H
|
@ -8,7 +8,7 @@ CONFIG += wayland-scanner
|
||||
WAYLANDSERVERSOURCES += \
|
||||
../../../../src/3rdparty/protocol/ivi-application.xml \
|
||||
../../../../src/3rdparty/protocol/wayland.xml \
|
||||
../../../../src/3rdparty/protocol/xdg-shell-unstable-v6.xml \
|
||||
../../../../src/3rdparty/protocol/xdg-shell.xml \
|
||||
../../../../src/3rdparty/protocol/fullscreen-shell-unstable-v1.xml
|
||||
|
||||
INCLUDEPATH += ../shared_old
|
||||
@ -19,7 +19,6 @@ SOURCES += \
|
||||
../shared_old/mockinput.cpp \
|
||||
../shared_old/mockiviapplication.cpp \
|
||||
../shared_old/mockwlshell.cpp \
|
||||
../shared_old/mockxdgshellv6.cpp \
|
||||
../shared_old/mocksurface.cpp \
|
||||
../shared_old/mockregion.cpp \
|
||||
../shared_old/mockoutput.cpp
|
||||
@ -30,7 +29,6 @@ HEADERS += \
|
||||
../shared_old/mockinput.h \
|
||||
../shared_old/mockiviapplication.h \
|
||||
../shared_old/mockwlshell.h \
|
||||
../shared_old/mockxdgshellv6.h \
|
||||
../shared_old/mocksurface.h \
|
||||
../shared_old/mockregion.h \
|
||||
../shared_old/mockoutput.h
|
||||
|
@ -1,37 +0,0 @@
|
||||
# Generated from xdgshellv6.pro.
|
||||
|
||||
#####################################################################
|
||||
## tst_client_xdgshellv6 Test:
|
||||
#####################################################################
|
||||
|
||||
qt_internal_add_test(tst_client_xdgshellv6
|
||||
SOURCES
|
||||
../shared_old/mockcompositor.cpp ../shared_old/mockcompositor.h
|
||||
../shared_old/mockfullscreenshellv1.cpp ../shared_old/mockfullscreenshellv1.h
|
||||
../shared_old/mockinput.cpp ../shared_old/mockinput.h
|
||||
../shared_old/mockiviapplication.cpp ../shared_old/mockiviapplication.h
|
||||
../shared_old/mockoutput.cpp ../shared_old/mockoutput.h
|
||||
../shared_old/mockregion.cpp ../shared_old/mockregion.h
|
||||
../shared_old/mocksurface.cpp ../shared_old/mocksurface.h
|
||||
../shared_old/mockwlshell.cpp ../shared_old/mockwlshell.h
|
||||
../shared_old/mockxdgshellv6.cpp ../shared_old/mockxdgshellv6.h
|
||||
tst_xdgshellv6.cpp
|
||||
INCLUDE_DIRECTORIES
|
||||
../shared_old
|
||||
PUBLIC_LIBRARIES
|
||||
Qt::CorePrivate
|
||||
Qt::Gui
|
||||
Qt::GuiPrivate
|
||||
Qt::OpenGL
|
||||
Qt::WaylandClientPrivate
|
||||
Wayland::Client
|
||||
Wayland::Server
|
||||
)
|
||||
|
||||
qt6_generate_wayland_protocol_server_sources(tst_client_xdgshellv6
|
||||
FILES
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/fullscreen-shell-unstable-v1.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/ivi-application.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/wayland.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/xdg-shell-unstable-v6.xml
|
||||
)
|
@ -1,38 +0,0 @@
|
||||
# Generated from xdgshellv6.pro.
|
||||
|
||||
#####################################################################
|
||||
## tst_client_xdgshellv6 Test:
|
||||
#####################################################################
|
||||
|
||||
qt_internal_add_test(tst_client_xdgshellv6
|
||||
SOURCES
|
||||
../shared_old/mockcompositor.cpp ../shared_old/mockcompositor.h
|
||||
../shared_old/mockfullscreenshellv1.cpp ../shared_old/mockfullscreenshellv1.h
|
||||
../shared_old/mockinput.cpp ../shared_old/mockinput.h
|
||||
../shared_old/mockiviapplication.cpp ../shared_old/mockiviapplication.h
|
||||
../shared_old/mockoutput.cpp ../shared_old/mockoutput.h
|
||||
../shared_old/mockregion.cpp ../shared_old/mockregion.h
|
||||
../shared_old/mocksurface.cpp ../shared_old/mocksurface.h
|
||||
../shared_old/mockwlshell.cpp ../shared_old/mockwlshell.h
|
||||
../shared_old/mockxdgshellv6.cpp ../shared_old/mockxdgshellv6.h
|
||||
tst_xdgshellv6.cpp
|
||||
INCLUDE_DIRECTORIES
|
||||
../shared_old
|
||||
PUBLIC_LIBRARIES
|
||||
Qt::CorePrivate
|
||||
Qt::Gui
|
||||
Qt::GuiPrivate
|
||||
Qt::OpenGL
|
||||
Qt::WaylandClientPrivate
|
||||
Wayland::Client
|
||||
Wayland::Server
|
||||
Threads::Threads # special case
|
||||
)
|
||||
|
||||
qt6_generate_wayland_protocol_server_sources(tst_client_xdgshellv6
|
||||
FILES
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/fullscreen-shell-unstable-v1.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/ivi-application.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/wayland.xml
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/3rdparty/protocol/xdg-shell-unstable-v6.xml
|
||||
)
|
@ -1,445 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2017 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "mockcompositor.h"
|
||||
|
||||
#include <QBackingStore>
|
||||
#include <QPainter>
|
||||
#include <QScreen>
|
||||
#include <QWindow>
|
||||
#include <QMimeData>
|
||||
#include <QPixmap>
|
||||
#include <QDrag>
|
||||
|
||||
#include <QtTest/QtTest>
|
||||
|
||||
static const QSize screenSize(1600, 1200);
|
||||
|
||||
class TestWindow : public QWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
TestWindow()
|
||||
{
|
||||
setSurfaceType(QSurface::RasterSurface);
|
||||
setGeometry(0, 0, 32, 32);
|
||||
create();
|
||||
}
|
||||
|
||||
bool event(QEvent *event) override
|
||||
{
|
||||
if (event->type() == QEvent::WindowStateChange)
|
||||
emit windowStateChangeEventReceived(static_cast<QWindowStateChangeEvent *>(event)->oldState());
|
||||
return QWindow::event(event);
|
||||
}
|
||||
|
||||
void exposeEvent(QExposeEvent *event) override
|
||||
{
|
||||
++exposeEventCount;
|
||||
QWindow::exposeEvent(event);
|
||||
}
|
||||
|
||||
int exposeEventCount = 0;
|
||||
|
||||
signals:
|
||||
void windowStateChangeEventReceived(uint oldState);
|
||||
};
|
||||
|
||||
class tst_WaylandClientXdgShellV6 : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
tst_WaylandClientXdgShellV6(MockCompositor *c)
|
||||
: m_compositor(c)
|
||||
{
|
||||
qRegisterMetaType<Qt::WindowState>();
|
||||
QSocketNotifier *notifier = new QSocketNotifier(m_compositor->waylandFileDescriptor(), QSocketNotifier::Read, this);
|
||||
connect(notifier, &QSocketNotifier::activated, this, &tst_WaylandClientXdgShellV6::processWaylandEvents);
|
||||
// connect to the event dispatcher to make sure to flush out the outgoing message queue
|
||||
connect(QCoreApplication::eventDispatcher(), &QAbstractEventDispatcher::awake, this, &tst_WaylandClientXdgShellV6::processWaylandEvents);
|
||||
connect(QCoreApplication::eventDispatcher(), &QAbstractEventDispatcher::aboutToBlock, this, &tst_WaylandClientXdgShellV6::processWaylandEvents);
|
||||
}
|
||||
|
||||
public slots:
|
||||
void processWaylandEvents()
|
||||
{
|
||||
m_compositor->processWaylandEvents();
|
||||
}
|
||||
|
||||
void cleanup()
|
||||
{
|
||||
// make sure the surfaces from the last test are properly cleaned up
|
||||
// and don't show up as false positives in the next test
|
||||
QTRY_VERIFY(!m_compositor->surface());
|
||||
QTRY_VERIFY(!m_compositor->xdgToplevelV6());
|
||||
}
|
||||
|
||||
private slots:
|
||||
void createDestroyWindow();
|
||||
void configure();
|
||||
void showMinimized();
|
||||
void setMinimized();
|
||||
void unsetMaximized();
|
||||
void focusWindowFollowsConfigure();
|
||||
void windowStateChangedEvents();
|
||||
void windowGeometrySimple();
|
||||
void windowGeometryFixed();
|
||||
void flushUnconfiguredXdgSurface();
|
||||
void dontSpamExposeEvents();
|
||||
|
||||
private:
|
||||
MockCompositor *m_compositor = nullptr;
|
||||
};
|
||||
|
||||
void tst_WaylandClientXdgShellV6::createDestroyWindow()
|
||||
{
|
||||
TestWindow window;
|
||||
window.show();
|
||||
|
||||
QTRY_VERIFY(m_compositor->surface());
|
||||
|
||||
window.destroy();
|
||||
QTRY_VERIFY(!m_compositor->surface());
|
||||
}
|
||||
|
||||
void tst_WaylandClientXdgShellV6::configure()
|
||||
{
|
||||
QSharedPointer<MockOutput> output;
|
||||
QTRY_VERIFY(output = m_compositor->output());
|
||||
|
||||
TestWindow window;
|
||||
window.show();
|
||||
|
||||
QSharedPointer<MockSurface> surface;
|
||||
QTRY_VERIFY(surface = m_compositor->surface());
|
||||
|
||||
m_compositor->processWaylandEvents();
|
||||
QTRY_VERIFY(window.isVisible());
|
||||
QTRY_VERIFY(!window.isExposed()); //Window should not be exposed before the first configure event
|
||||
|
||||
//TODO: according to xdg-shell protocol, a buffer should not be attached to a the surface
|
||||
//until it's configured. Ensure this in the test!
|
||||
|
||||
QSharedPointer<MockXdgToplevelV6> toplevel;
|
||||
QTRY_VERIFY(toplevel = m_compositor->xdgToplevelV6());
|
||||
|
||||
const QSize newSize(123, 456);
|
||||
m_compositor->sendXdgToplevelV6Configure(toplevel, newSize);
|
||||
QTRY_VERIFY(window.isExposed());
|
||||
QTRY_COMPARE(window.visibility(), QWindow::Windowed);
|
||||
QTRY_COMPARE(window.windowStates(), Qt::WindowNoState);
|
||||
QTRY_COMPARE(window.frameGeometry(), QRect(QPoint(), newSize));
|
||||
|
||||
m_compositor->sendXdgToplevelV6Configure(toplevel, screenSize, { ZXDG_TOPLEVEL_V6_STATE_ACTIVATED, ZXDG_TOPLEVEL_V6_STATE_MAXIMIZED });
|
||||
QTRY_COMPARE(window.visibility(), QWindow::Maximized);
|
||||
QTRY_COMPARE(window.windowStates(), Qt::WindowMaximized);
|
||||
QTRY_COMPARE(window.frameGeometry(), QRect(QPoint(), screenSize));
|
||||
|
||||
m_compositor->sendXdgToplevelV6Configure(toplevel, screenSize, { ZXDG_TOPLEVEL_V6_STATE_ACTIVATED, ZXDG_TOPLEVEL_V6_STATE_FULLSCREEN });
|
||||
QTRY_COMPARE(window.visibility(), QWindow::FullScreen);
|
||||
QTRY_COMPARE(window.windowStates(), Qt::WindowFullScreen);
|
||||
QTRY_COMPARE(window.frameGeometry(), QRect(QPoint(), screenSize));
|
||||
|
||||
//The window should remember it's original size
|
||||
m_compositor->sendXdgToplevelV6Configure(toplevel, QSize(0, 0), { ZXDG_TOPLEVEL_V6_STATE_ACTIVATED });
|
||||
QTRY_COMPARE(window.visibility(), QWindow::Windowed);
|
||||
QTRY_COMPARE(window.windowStates(), Qt::WindowNoState);
|
||||
QTRY_COMPARE(window.frameGeometry(), QRect(QPoint(), newSize));
|
||||
}
|
||||
|
||||
void tst_WaylandClientXdgShellV6::showMinimized()
|
||||
{
|
||||
// On xdg-shell v6 there's really no way for the compositor to tell the window if it's minimized
|
||||
// There are wl_surface.enter events and so on, but there's really no way to differentiate
|
||||
// between a window preview and an unminimized window.
|
||||
TestWindow window;
|
||||
window.showMinimized();
|
||||
QCOMPARE(window.windowStates(), Qt::WindowMinimized); // should return minimized until
|
||||
QTRY_COMPARE(window.windowStates(), Qt::WindowNoState); // rejected by handleWindowStateChanged
|
||||
|
||||
// Make sure the window on the compositor side is/was created here, and not after the test
|
||||
// finishes, as that may mess up for later tests.
|
||||
QTRY_VERIFY(m_compositor->xdgToplevelV6());
|
||||
}
|
||||
|
||||
void tst_WaylandClientXdgShellV6::setMinimized()
|
||||
{
|
||||
TestWindow window;
|
||||
window.show();
|
||||
|
||||
QSharedPointer<MockXdgToplevelV6> toplevel;
|
||||
QTRY_VERIFY(toplevel = m_compositor->xdgToplevelV6());
|
||||
|
||||
m_compositor->sendXdgToplevelV6Configure(toplevel);
|
||||
QTRY_COMPARE(window.visibility(), QWindow::Windowed);
|
||||
QTRY_COMPARE(window.windowStates(), Qt::WindowNoState);
|
||||
|
||||
QSignalSpy setMinimizedSpy(toplevel.data(), SIGNAL(setMinimizedRequested()));
|
||||
QSignalSpy windowStateChangeSpy(&window, SIGNAL(windowStateChangeEventReceived(uint)));
|
||||
|
||||
window.setVisibility(QWindow::Minimized);
|
||||
QCOMPARE(window.visibility(), QWindow::Minimized);
|
||||
QCOMPARE(window.windowStates(), Qt::WindowMinimized);
|
||||
QTRY_COMPARE(setMinimizedSpy.count(), 1);
|
||||
{
|
||||
QTRY_VERIFY(windowStateChangeSpy.count() > 0);
|
||||
Qt::WindowStates oldStates(windowStateChangeSpy.takeFirst().at(0).toUInt());
|
||||
QCOMPARE(oldStates, Qt::WindowNoState);
|
||||
}
|
||||
|
||||
// In the meantime the compositor may minimize, do nothing or reshow the window without
|
||||
// telling us.
|
||||
|
||||
QTRY_COMPARE(window.visibility(), QWindow::Windowed); // verify that we don't know anything
|
||||
QTRY_COMPARE(window.windowStates(), Qt::WindowNoState);
|
||||
{
|
||||
QTRY_COMPARE(windowStateChangeSpy.count(), 1);
|
||||
Qt::WindowStates oldStates(windowStateChangeSpy.takeFirst().at(0).toUInt());
|
||||
QCOMPARE(oldStates, Qt::WindowNoState); // because the window never was minimized
|
||||
}
|
||||
|
||||
// Setting visibility again should send another set_minimized request
|
||||
window.setVisibility(QWindow::Minimized);
|
||||
QTRY_COMPARE(setMinimizedSpy.count(), 2);
|
||||
}
|
||||
|
||||
void tst_WaylandClientXdgShellV6::unsetMaximized()
|
||||
{
|
||||
TestWindow window;
|
||||
window.show();
|
||||
|
||||
QSharedPointer<MockXdgToplevelV6> toplevel;
|
||||
QTRY_VERIFY(toplevel = m_compositor->xdgToplevelV6());
|
||||
|
||||
QSignalSpy unsetMaximizedSpy(toplevel.data(), SIGNAL(unsetMaximizedRequested()));
|
||||
|
||||
QSignalSpy windowStateChangedSpy(&window, SIGNAL(windowStateChanged(Qt::WindowState)));
|
||||
|
||||
m_compositor->sendXdgToplevelV6Configure(toplevel, screenSize, { ZXDG_TOPLEVEL_V6_STATE_MAXIMIZED });
|
||||
|
||||
QTRY_COMPARE(windowStateChangedSpy.count(), 1);
|
||||
QCOMPARE(windowStateChangedSpy.takeFirst().at(0).toUInt(), Qt::WindowMaximized);
|
||||
|
||||
window.setWindowStates(Qt::WindowNoState);
|
||||
|
||||
QTRY_COMPARE(unsetMaximizedSpy.count(), 1);
|
||||
QTRY_COMPARE(windowStateChangedSpy.count(), 1);
|
||||
QCOMPARE(windowStateChangedSpy.takeFirst().at(0).toUInt(), Qt::WindowNoState);
|
||||
|
||||
m_compositor->sendXdgToplevelV6Configure(toplevel, QSize(0, 0), {});
|
||||
|
||||
QTRY_COMPARE(windowStateChangedSpy.count(), 1);
|
||||
QCOMPARE(windowStateChangedSpy.takeFirst().at(0).toUInt(), Qt::WindowNoState);
|
||||
}
|
||||
|
||||
void tst_WaylandClientXdgShellV6::focusWindowFollowsConfigure()
|
||||
{
|
||||
TestWindow window;
|
||||
window.show();
|
||||
|
||||
QSharedPointer<MockXdgToplevelV6> toplevel;
|
||||
QTRY_VERIFY(toplevel = m_compositor->xdgToplevelV6());
|
||||
QTRY_VERIFY(!window.isActive());
|
||||
|
||||
QSignalSpy windowStateChangeSpy(&window, SIGNAL(windowStateChangeEventReceived(uint)));
|
||||
|
||||
m_compositor->sendXdgToplevelV6Configure(toplevel, QSize(0, 0), { ZXDG_TOPLEVEL_V6_STATE_ACTIVATED });
|
||||
QTRY_VERIFY(window.isActive());
|
||||
|
||||
m_compositor->sendXdgToplevelV6Configure(toplevel, QSize(0, 0), {});
|
||||
QTRY_VERIFY(!window.isActive());
|
||||
}
|
||||
|
||||
void tst_WaylandClientXdgShellV6::windowStateChangedEvents()
|
||||
{
|
||||
TestWindow window;
|
||||
window.show();
|
||||
|
||||
QSharedPointer<MockXdgToplevelV6> toplevel;
|
||||
QTRY_VERIFY(toplevel = m_compositor->xdgToplevelV6());
|
||||
|
||||
QSignalSpy eventSpy(&window, SIGNAL(windowStateChangeEventReceived(uint)));
|
||||
QSignalSpy signalSpy(&window, SIGNAL(windowStateChanged(Qt::WindowState)));
|
||||
|
||||
m_compositor->sendXdgToplevelV6Configure(toplevel, screenSize, { ZXDG_TOPLEVEL_V6_STATE_MAXIMIZED });
|
||||
|
||||
QTRY_COMPARE(window.windowStates(), Qt::WindowMaximized);
|
||||
QTRY_COMPARE(window.windowState(), Qt::WindowMaximized);
|
||||
{
|
||||
QTRY_COMPARE(eventSpy.count(), 1);
|
||||
Qt::WindowStates oldStates(eventSpy.takeFirst().at(0).toUInt());
|
||||
QCOMPARE(oldStates, Qt::WindowNoState);
|
||||
|
||||
QTRY_COMPARE(signalSpy.count(), 1);
|
||||
uint newState = signalSpy.takeFirst().at(0).toUInt();
|
||||
QCOMPARE(newState, Qt::WindowMaximized);
|
||||
}
|
||||
|
||||
m_compositor->sendXdgToplevelV6Configure(toplevel, screenSize, { ZXDG_TOPLEVEL_V6_STATE_FULLSCREEN });
|
||||
|
||||
QTRY_COMPARE(window.windowStates(), Qt::WindowFullScreen);
|
||||
QTRY_COMPARE(window.windowState(), Qt::WindowFullScreen);
|
||||
{
|
||||
QTRY_COMPARE(eventSpy.count(), 1);
|
||||
Qt::WindowStates oldStates(eventSpy.takeFirst().at(0).toUInt());
|
||||
QCOMPARE(oldStates, Qt::WindowMaximized);
|
||||
|
||||
QTRY_COMPARE(signalSpy.count(), 1);
|
||||
uint newState = signalSpy.takeFirst().at(0).toUInt();
|
||||
QCOMPARE(newState, Qt::WindowFullScreen);
|
||||
}
|
||||
|
||||
m_compositor->sendXdgToplevelV6Configure(toplevel, QSize(0, 0), {});
|
||||
|
||||
QTRY_COMPARE(window.windowStates(), Qt::WindowNoState);
|
||||
QTRY_COMPARE(window.windowState(), Qt::WindowNoState);
|
||||
{
|
||||
QTRY_COMPARE(eventSpy.count(), 1);
|
||||
Qt::WindowStates oldStates(eventSpy.takeFirst().at(0).toUInt());
|
||||
QCOMPARE(oldStates, Qt::WindowFullScreen);
|
||||
|
||||
QTRY_COMPARE(signalSpy.count(), 1);
|
||||
uint newState = signalSpy.takeFirst().at(0).toUInt();
|
||||
QCOMPARE(newState, Qt::WindowNoState);
|
||||
}
|
||||
}
|
||||
|
||||
void tst_WaylandClientXdgShellV6::windowGeometrySimple()
|
||||
{
|
||||
QSKIP("TODO: This test is flaky, figure out why.");
|
||||
QWindow window;
|
||||
window.show();
|
||||
|
||||
QSharedPointer<MockXdgToplevelV6> toplevel;
|
||||
QTRY_VERIFY(toplevel = m_compositor->xdgToplevelV6());
|
||||
QSignalSpy geometrySpy(toplevel.data(), SIGNAL(windowGeometryRequested(QRect)));
|
||||
|
||||
m_compositor->sendXdgToplevelV6Configure(toplevel);
|
||||
QTRY_COMPARE(geometrySpy.count(), 1);
|
||||
QCOMPARE(geometrySpy.takeFirst().at(0).toRect().size(), window.frameGeometry().size());
|
||||
|
||||
m_compositor->sendXdgToplevelV6Configure(toplevel, QSize(123, 456));
|
||||
QTRY_COMPARE(geometrySpy.count(), 1);
|
||||
QCOMPARE(geometrySpy.takeFirst().at(0).toRect().size(), QSize(123, 456));
|
||||
}
|
||||
|
||||
void tst_WaylandClientXdgShellV6::windowGeometryFixed()
|
||||
{
|
||||
QSKIP("TODO: This test is flaky, figure out why.");
|
||||
QWindow window;
|
||||
window.resize(QSize(1337, 137));
|
||||
window.setMaximumSize(window.size());
|
||||
window.setMinimumSize(window.size());
|
||||
window.show();
|
||||
|
||||
QSharedPointer<MockXdgToplevelV6> toplevel;
|
||||
QTRY_VERIFY(toplevel = m_compositor->xdgToplevelV6());
|
||||
QSignalSpy geometrySpy(toplevel.data(), SIGNAL(windowGeometryRequested(QRect)));
|
||||
|
||||
m_compositor->sendXdgToplevelV6Configure(toplevel);
|
||||
QTRY_COMPARE(geometrySpy.count(), 1);
|
||||
QRect initialWindowGeometry = geometrySpy.takeFirst().at(0).toRect();
|
||||
QCOMPARE(initialWindowGeometry.size(), window.frameGeometry().size());
|
||||
|
||||
m_compositor->sendXdgToplevelV6Configure(toplevel, QSize(123, 456));
|
||||
QTRY_COMPARE(geometrySpy.count(), 1);
|
||||
// Configuring the window should not change the window geometry
|
||||
QCOMPARE(geometrySpy.takeFirst().at(0).toRect().size(), initialWindowGeometry.size());
|
||||
}
|
||||
|
||||
void tst_WaylandClientXdgShellV6::flushUnconfiguredXdgSurface()
|
||||
{
|
||||
TestWindow window;
|
||||
window.show();
|
||||
|
||||
QSharedPointer<MockSurface> surface;
|
||||
QTRY_VERIFY(surface = m_compositor->surface());
|
||||
|
||||
// Paint and flush some magenta
|
||||
QBackingStore backingStore(&window);
|
||||
QRect rect(QPoint(), window.size());
|
||||
backingStore.resize(rect.size());
|
||||
backingStore.beginPaint(rect);
|
||||
QColor color = Qt::magenta;
|
||||
QPainter p(backingStore.paintDevice());
|
||||
p.fillRect(rect, color);
|
||||
p.end();
|
||||
backingStore.endPaint();
|
||||
backingStore.flush(rect);
|
||||
|
||||
// We're not allowed to send buffer on this surface since it isn't yet configured.
|
||||
// So, from the compositor's point of view there should be no buffer data yet.
|
||||
m_compositor->processWaylandEvents();
|
||||
QVERIFY(surface->image.isNull());
|
||||
QVERIFY(!window.isExposed());
|
||||
|
||||
// Finally sending the configure should trigger an attach and commit with the
|
||||
// right buffer.
|
||||
m_compositor->sendShellSurfaceConfigure(surface);
|
||||
QTRY_COMPARE(surface->image.size(), window.frameGeometry().size());
|
||||
QTRY_COMPARE(surface->image.pixel(window.frameMargins().left(), window.frameMargins().top()), color.rgba());
|
||||
QTRY_VERIFY(window.isExposed());
|
||||
}
|
||||
|
||||
void tst_WaylandClientXdgShellV6::dontSpamExposeEvents()
|
||||
{
|
||||
TestWindow window;
|
||||
window.show();
|
||||
|
||||
QSharedPointer<MockSurface> surface;
|
||||
QTRY_VERIFY(surface = m_compositor->surface());
|
||||
QTRY_COMPARE(window.exposeEventCount, 0);
|
||||
|
||||
m_compositor->sendShellSurfaceConfigure(surface);
|
||||
QTRY_VERIFY(window.isExposed());
|
||||
QTRY_COMPARE(window.exposeEventCount, 1);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
QTemporaryDir tmpRuntimeDir;
|
||||
setenv("XDG_RUNTIME_DIR", tmpRuntimeDir.path().toLocal8Bit(), 1);
|
||||
setenv("QT_QPA_PLATFORM", "wayland", 1); // force QGuiApplication to use wayland plugin
|
||||
setenv("QT_WAYLAND_SHELL_INTEGRATION", "xdg-shell-v6", 1);
|
||||
|
||||
// wayland-egl hangs in the test setup when we try to initialize. Until it gets
|
||||
// figured out, avoid clientBufferIntegration() from being called in
|
||||
// QWaylandWindow::createDecorations().
|
||||
setenv("QT_WAYLAND_DISABLE_WINDOWDECORATION", "1", 1);
|
||||
|
||||
MockCompositor compositor;
|
||||
compositor.setOutputMode(screenSize);
|
||||
|
||||
QGuiApplication app(argc, argv);
|
||||
compositor.applicationInitialized();
|
||||
|
||||
tst_WaylandClientXdgShellV6 tc(&compositor);
|
||||
return QTest::qExec(&tc, argc, argv);
|
||||
}
|
||||
|
||||
#include <tst_xdgshellv6.moc>
|
@ -1,5 +0,0 @@
|
||||
include (../shared_old/shared_old.pri)
|
||||
|
||||
TARGET = tst_client_xdgshellv6
|
||||
SOURCES += tst_xdgshellv6.cpp
|
||||
|
Loading…
x
Reference in New Issue
Block a user