Merge branch 'qt/5.6' into wip-compositor-api
Conflicts: examples/wayland/pure-qml/main.cpp examples/wayland/pure-qml/qml/Chrome.qml examples/wayland/pure-qml/qml/main.qml src/client/qwaylanddnd_p.h src/compositor/compositor_api/qwaylandquicksurface.cpp src/compositor/compositor_api/qwaylandsurface_p.h src/compositor/compositor_api/qwaylandsurfaceitem.cpp src/compositor/extensions/qwlinputmethodcontext_p.h src/compositor/hardware_integration/qwlclientbufferintegration_p.h src/compositor/hardware_integration/qwlclientbufferintegrationfactory_p.h src/compositor/hardware_integration/qwlclientbufferintegrationplugin_p.h src/compositor/hardware_integration/qwlhwintegration_p.h src/compositor/hardware_integration/qwlserverbufferintegrationfactory_p.h src/compositor/hardware_integration/qwlserverbufferintegrationplugin_p.h src/compositor/wayland_wrapper/qwlcompositor_p.h src/compositor/wayland_wrapper/qwldatadevice_p.h src/compositor/wayland_wrapper/qwldatadevicemanager_p.h src/compositor/wayland_wrapper/qwldatasource_p.h src/compositor/wayland_wrapper/qwlextendedsurface_p.h src/compositor/wayland_wrapper/qwlinputdevice_p.h src/compositor/wayland_wrapper/qwlinputmethod_p.h src/compositor/wayland_wrapper/qwlinputpanel_p.h src/compositor/wayland_wrapper/qwlinputpanelsurface_p.h src/compositor/wayland_wrapper/qwlkeyboard.cpp src/compositor/wayland_wrapper/qwlkeyboard_p.h src/compositor/wayland_wrapper/qwloutput_p.h src/compositor/wayland_wrapper/qwlpointer_p.h src/compositor/wayland_wrapper/qwlregion_p.h src/compositor/wayland_wrapper/qwlshellsurface_p.h src/compositor/wayland_wrapper/qwlsubsurface_p.h src/compositor/wayland_wrapper/qwlsurface.cpp src/compositor/wayland_wrapper/qwlsurface_p.h src/compositor/wayland_wrapper/qwltextinput_p.h src/compositor/wayland_wrapper/qwltextinputmanager_p.h src/compositor/wayland_wrapper/qwltouch_p.h src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration_p.h src/imports/compositor/WaylandCursorItem.qml Change-Id: I4e63ef295b297022d4970b3c68b3d565843086bd
This commit is contained in:
commit
5effda3eb0
365
src/3rdparty/wayland/protocols/xdg-shell.xml
vendored
365
src/3rdparty/wayland/protocols/xdg-shell.xml
vendored
@ -31,11 +31,10 @@
|
||||
|
||||
<interface name="xdg_shell" version="1">
|
||||
<description summary="create desktop-style surfaces">
|
||||
This interface is implemented by servers that provide
|
||||
desktop-style user interfaces.
|
||||
|
||||
It allows clients to associate a xdg_surface with
|
||||
a basic surface.
|
||||
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">
|
||||
@ -45,9 +44,25 @@
|
||||
they implement using static_assert to ensure the protocol and
|
||||
implementation versions match.
|
||||
</description>
|
||||
<entry name="current" value="4" summary="Always the latest version"/>
|
||||
<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">
|
||||
@ -62,30 +77,40 @@
|
||||
|
||||
<request name="get_xdg_surface">
|
||||
<description summary="create a shell surface from a surface">
|
||||
Create a shell surface for an existing 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.
|
||||
|
||||
Only one shell or popup surface can be associated with a given
|
||||
surface.
|
||||
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 shell surface from a surface">
|
||||
Create a popup surface for an existing surface.
|
||||
<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.
|
||||
|
||||
Only one shell or popup surface can be associated with a given
|
||||
surface.
|
||||
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 whose pointer is used"/>
|
||||
<arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
|
||||
<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"/>
|
||||
<arg name="flags" type="uint"/>
|
||||
</request>
|
||||
|
||||
<event name="ping">
|
||||
@ -98,8 +123,11 @@
|
||||
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 callback"/>
|
||||
<arg name="serial" type="uint" summary="pass this to the pong request"/>
|
||||
</event>
|
||||
|
||||
<request name="pong">
|
||||
@ -112,8 +140,7 @@
|
||||
</interface>
|
||||
|
||||
<interface name="xdg_surface" version="1">
|
||||
|
||||
<description summary="desktop-style metadata interface">
|
||||
<description summary="A desktop window">
|
||||
An interface that may be implemented by a wl_surface, for
|
||||
implementations that provide a desktop-style user interface.
|
||||
|
||||
@ -121,29 +148,39 @@
|
||||
properties like maximized, fullscreen, minimized, and to move and resize
|
||||
them, and associate metadata like title and app id.
|
||||
|
||||
On the server side the object is automatically destroyed when
|
||||
the related wl_surface is destroyed. On client side,
|
||||
xdg_surface.destroy() must be called before destroying
|
||||
the wl_surface object.
|
||||
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="remove xdg_surface interface">
|
||||
The xdg_surface interface is removed from the wl_surface object
|
||||
that was turned into a xdg_surface with
|
||||
xdg_shell.get_xdg_surface request. The xdg_surface properties,
|
||||
like maximized and fullscreen, are lost. The wl_surface loses
|
||||
its role as a xdg_surface. The wl_surface is unmapped.
|
||||
<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="surface is a child of another surface">
|
||||
Child surfaces are stacked above their parents, and will be
|
||||
unmapped if the parent is unmapped too. They should not appear
|
||||
on task bars and alt+tab.
|
||||
<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="wl_surface" allow-null="true"/>
|
||||
<arg name="parent" type="object" interface="xdg_surface" allow-null="true"/>
|
||||
</request>
|
||||
|
||||
<request name="set_title">
|
||||
@ -160,14 +197,27 @@
|
||||
</request>
|
||||
|
||||
<request name="set_app_id">
|
||||
<description summary="set surface class">
|
||||
Set an id for the surface.
|
||||
<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 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.
|
||||
|
||||
It should be the ID that appears in the new desktop entry
|
||||
specification, the interface name.
|
||||
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>
|
||||
@ -179,29 +229,32 @@
|
||||
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 parent surface. There are
|
||||
no guarantees as to what the window menu contains.
|
||||
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.
|
||||
|
||||
Your surface must have focus on the seat passed in to pop up the
|
||||
window menu.
|
||||
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 seat to pop the window up on"/>
|
||||
<arg name="serial" type="uint" summary="serial of the event to pop up the window for"/>
|
||||
<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 a pointer-driven move of the surface.
|
||||
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.
|
||||
|
||||
This request must be used in response to a button press event.
|
||||
The server may ignore move requests depending on the state of
|
||||
the surface (e.g. fullscreen or maximized).
|
||||
</description>
|
||||
<arg name="seat" type="object" interface="wl_seat" summary="the wl_seat whose pointer is used"/>
|
||||
<arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
|
||||
<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">
|
||||
@ -224,14 +277,16 @@
|
||||
|
||||
<request name="resize">
|
||||
<description summary="start an interactive resize">
|
||||
Start a pointer-driven resizing of the surface.
|
||||
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.
|
||||
|
||||
This request must be used in response to a button press event.
|
||||
The server may ignore resize requests depending on the state of
|
||||
the surface (e.g. fullscreen or maximized).
|
||||
</description>
|
||||
<arg name="seat" type="object" interface="wl_seat" summary="the wl_seat whose pointer is used"/>
|
||||
<arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
|
||||
<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>
|
||||
|
||||
@ -279,16 +334,26 @@
|
||||
|
||||
<event name="configure">
|
||||
<description summary="suggest a surface change">
|
||||
The configure event asks the client to resize its surface.
|
||||
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. The states listed in the event specify how the
|
||||
width/height arguments should be interpreted.
|
||||
about how its surface should be resized in window geometry
|
||||
coordinates. See set_window_geometry.
|
||||
|
||||
A client should arrange a new surface, and then send a
|
||||
ack_configure request with the serial sent in this configure
|
||||
event before attaching a new surface.
|
||||
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
|
||||
@ -303,14 +368,19 @@
|
||||
|
||||
<request name="ack_configure">
|
||||
<description summary="ack a configure event">
|
||||
When a configure event is received, a client should then ack it
|
||||
using the ack_configure request to ensure that the compositor
|
||||
knows the client has seen the event.
|
||||
When a configure event is received, if a client commits the
|
||||
surface in response to the configure event, then the client
|
||||
must make a ack_configure request before the commit request,
|
||||
passing along the serial of the configure event.
|
||||
|
||||
By this point, the state is confirmed, and the next attach should
|
||||
contain the buffer drawn for the configure event you are acking.
|
||||
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.
|
||||
</description>
|
||||
<arg name="serial" type="uint" summary="a serial to configure for"/>
|
||||
<arg name="serial" type="uint" summary="the serial from the configure event"/>
|
||||
</request>
|
||||
|
||||
<request name="set_window_geometry">
|
||||
@ -320,15 +390,26 @@
|
||||
portions like drop-shadows which should be ignored for the
|
||||
purposes of aligning, placing and constraining windows.
|
||||
|
||||
The default value is the full bounds of the surface, including any
|
||||
subsurfaces. Once the window geometry of the surface is set once,
|
||||
it is not possible to unset it, and it will remain the same until
|
||||
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"/>
|
||||
@ -336,8 +417,48 @@
|
||||
<arg name="height" type="int"/>
|
||||
</request>
|
||||
|
||||
<request name="set_maximized" />
|
||||
<request name="unset_maximized" />
|
||||
<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">
|
||||
@ -346,12 +467,27 @@
|
||||
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" />
|
||||
<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">
|
||||
@ -368,45 +504,76 @@
|
||||
</interface>
|
||||
|
||||
<interface name="xdg_popup" version="1">
|
||||
<description summary="desktop-style metadata interface">
|
||||
An interface that may be implemented by a wl_surface, for
|
||||
implementations that provide a desktop-style popups/menus. A popup
|
||||
surface is a transient surface with an added pointer grab.
|
||||
<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.
|
||||
|
||||
An existing implicit grab will be changed to owner-events mode,
|
||||
and the popup grab will continue after the implicit grab ends
|
||||
(i.e. releasing the mouse button does not cause the popup to be
|
||||
unmapped).
|
||||
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.
|
||||
|
||||
The popup grab continues until the window is destroyed or a mouse
|
||||
button is pressed in any other clients window. A click in any of
|
||||
the clients surfaces is reported as normal, however, clicks in
|
||||
other clients surfaces will be discarded and trigger the callback.
|
||||
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.
|
||||
|
||||
The x and y arguments specify the locations of the upper left
|
||||
corner of the surface relative to the upper left corner of the
|
||||
parent surface, in surface local coordinates.
|
||||
Clients that want to dismiss the popup when another surface of
|
||||
their own is clicked should dismiss the popup using the destroy
|
||||
request.
|
||||
|
||||
xdg_popup surfaces are always transient for another surface.
|
||||
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_surface interface">
|
||||
The xdg_surface interface is removed from the wl_surface object
|
||||
that was turned into a xdg_surface with
|
||||
xdg_shell.get_xdg_surface request. The xdg_surface properties,
|
||||
like maximized and fullscreen, are lost. The wl_surface loses
|
||||
its role as a xdg_surface. The wl_surface is unmapped.
|
||||
<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 grab is broken,
|
||||
that is, when the users clicks a surface that doesn't belong
|
||||
to the client owning the popup surface.
|
||||
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>
|
||||
<arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
|
||||
</event>
|
||||
|
||||
</interface>
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDCLIENTBUFFERINTEGRATION_H
|
||||
#define QWAYLANDCLIENTBUFFERINTEGRATION_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 <QtCore/qglobal.h>
|
||||
#include <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDCLIENTBUFFERINTEGRATIONFACTORY_H
|
||||
#define QWAYLANDCLIENTBUFFERINTEGRATIONFACTORY_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 <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
#include <QtCore/QStringList>
|
||||
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDCLIENTBUFFERINTEGRATIONPLUGIN_H
|
||||
#define QWAYLANDCLIENTBUFFERINTEGRATIONPLUGIN_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 <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
|
||||
#include <QtCore/qplugin.h>
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDHARDWAREINTEGRATION_H
|
||||
#define QWAYLANDHARDWAREINTEGRATION_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 <QtWaylandClient/private/qwayland-hardware-integration.h>
|
||||
#include <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDSERVERBUFFERINTEGRATION_H
|
||||
#define QWAYLANDSERVERBUFFERINTEGRATION_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 <QtCore/QSize>
|
||||
#include <QtGui/qopengl.h>
|
||||
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDSERVERBUFFERINTEGRATIONFACTORY_H
|
||||
#define QWAYLANDSERVERBUFFERINTEGRATIONFACTORY_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 <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
#include <QtCore/QStringList>
|
||||
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDSERVERBUFFERINTEGRATIONPLUGIN_H
|
||||
#define QWAYLANDSERVERBUFFERINTEGRATIONPLUGIN_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 <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
|
||||
#include <QtCore/qplugin.h>
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDINPUTDEVICEINTEGRATION_H
|
||||
#define QWAYLANDINPUTDEVICEINTEGRATION_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 <QtCore/qglobal.h>
|
||||
#include <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDINPUTDEVICEINTEGRATIONFACTORY_H
|
||||
#define QWAYLANDINPUTDEVICEINTEGRATIONFACTORY_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 <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
#include <QtCore/QStringList>
|
||||
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDINPUTDEVICEINTEGRATIONPLUGIN_H
|
||||
#define QWAYLANDINPUTDEVICEINTEGRATIONPLUGIN_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 <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
|
||||
#include <QtCore/qplugin.h>
|
||||
|
@ -35,6 +35,17 @@
|
||||
#ifndef QWAYLANDABSTRACTDECORATION_H
|
||||
#define QWAYLANDABSTRACTDECORATION_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 <QtCore/QMargins>
|
||||
#include <QtCore/QPointF>
|
||||
#include <QtGui/QGuiApplication>
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDBUFFER_H
|
||||
#define QWAYLANDBUFFER_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 <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
|
||||
#include <QtCore/QSize>
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDCLIENTEXPORT_H
|
||||
#define QWAYLANDCLIENTEXPORT_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 <QtCore/qglobal.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDCLIPBOARD_H
|
||||
#define QWAYLANDCLIPBOARD_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 <qpa/qplatformclipboard.h>
|
||||
#include <QtCore/QVariant>
|
||||
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDCURSOR_H
|
||||
#define QWAYLANDCURSOR_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 <qpa/qplatformcursor.h>
|
||||
#include <QtCore/QMap>
|
||||
#include <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
|
@ -35,6 +35,17 @@
|
||||
#ifndef QWAYLANDDATADEVICE_H
|
||||
#define QWAYLANDDATADEVICE_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 <QObject>
|
||||
#include <QPoint>
|
||||
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDDATADEVICEMANAGER_H
|
||||
#define QWAYLANDDATADEVICEMANAGER_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 <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
#include <QtWaylandClient/private/qwayland-wayland.h>
|
||||
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDDATAOFFER_H
|
||||
#define QWAYLANDDATAOFFER_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 <QtGui/private/qdnd_p.h>
|
||||
|
||||
#include <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDDATASOURCE_H
|
||||
#define QWAYLANDDATASOURCE_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 <QObject>
|
||||
|
||||
#include <QtWaylandClient/private/qwayland-wayland.h>
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDDECORATIONFACTORY_H
|
||||
#define QWAYLANDDECORATIONFACTORY_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 <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
#include <QtCore/QStringList>
|
||||
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDDECORATIONPLUGIN_H
|
||||
#define QWAYLANDDECORATIONPLUGIN_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 <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
|
||||
#include <QtCore/qplugin.h>
|
||||
|
@ -154,12 +154,7 @@ QWaylandDisplay::QWaylandDisplay(QWaylandIntegration *waylandIntegration)
|
||||
mEventThreadObject->displayConnect();
|
||||
mDisplay = mEventThreadObject->display(); //blocks until display is available
|
||||
|
||||
//Create a new even queue for the QtGui thread
|
||||
mEventQueue = wl_display_create_queue(mDisplay);
|
||||
|
||||
struct ::wl_registry *registry = wl_display_get_registry(mDisplay);
|
||||
wl_proxy_set_queue((struct wl_proxy *)registry, mEventQueue);
|
||||
|
||||
init(registry);
|
||||
|
||||
connect(mEventThreadObject, SIGNAL(newEventsRead()), this, SLOT(flushRequests()));
|
||||
@ -187,7 +182,7 @@ QWaylandDisplay::~QWaylandDisplay(void)
|
||||
|
||||
void QWaylandDisplay::flushRequests()
|
||||
{
|
||||
if (wl_display_dispatch_queue_pending(mDisplay, mEventQueue) < 0) {
|
||||
if (wl_display_dispatch_pending(mDisplay) < 0) {
|
||||
mEventThreadObject->checkError();
|
||||
exitWithError();
|
||||
}
|
||||
@ -198,7 +193,7 @@ void QWaylandDisplay::flushRequests()
|
||||
|
||||
void QWaylandDisplay::blockingReadEvents()
|
||||
{
|
||||
if (wl_display_dispatch_queue(mDisplay, mEventQueue) < 0) {
|
||||
if (wl_display_dispatch(mDisplay) < 0) {
|
||||
mEventThreadObject->checkError();
|
||||
exitWithError();
|
||||
}
|
||||
@ -206,6 +201,8 @@ void QWaylandDisplay::blockingReadEvents()
|
||||
|
||||
void QWaylandDisplay::exitWithError()
|
||||
{
|
||||
mEventThread->quit();
|
||||
mEventThread->wait();
|
||||
::exit(1);
|
||||
}
|
||||
|
||||
@ -348,17 +345,16 @@ void QWaylandDisplay::forceRoundTrip()
|
||||
int ret = 0;
|
||||
bool done = false;
|
||||
wl_callback *callback = wl_display_sync(mDisplay);
|
||||
wl_proxy_set_queue((struct wl_proxy *)callback, mEventQueue);
|
||||
wl_callback_add_listener(callback, &sync_listener, &done);
|
||||
flushRequests();
|
||||
if (QThread::currentThread()->eventDispatcher()) {
|
||||
while (!done && ret >= 0) {
|
||||
QThread::currentThread()->eventDispatcher()->processEvents(QEventLoop::WaitForMoreEvents);
|
||||
ret = wl_display_dispatch_queue_pending(mDisplay, mEventQueue);
|
||||
ret = wl_display_dispatch_pending(mDisplay);
|
||||
}
|
||||
} else {
|
||||
while (!done && ret >= 0)
|
||||
ret = wl_display_dispatch_queue(mDisplay, mEventQueue);
|
||||
ret = wl_display_dispatch(mDisplay);
|
||||
}
|
||||
|
||||
if (ret == -1 && !done)
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDDISPLAY_H
|
||||
#define QWAYLANDDISPLAY_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 <QtCore/QObject>
|
||||
#include <QtCore/QRect>
|
||||
#include <QtCore/QPointer>
|
||||
@ -108,7 +119,6 @@ public:
|
||||
void setCursor(struct wl_buffer *buffer, struct wl_cursor_image *image);
|
||||
|
||||
struct wl_display *wl_display() const { return mDisplay; }
|
||||
struct wl_event_queue *wl_event_queue() const { return mEventQueue; }
|
||||
struct ::wl_registry *wl_registry() { return object(); }
|
||||
|
||||
const struct wl_compositor *wl_compositor() const { return mCompositor.object(); }
|
||||
@ -173,7 +183,6 @@ private:
|
||||
};
|
||||
|
||||
struct wl_display *mDisplay;
|
||||
struct wl_event_queue *mEventQueue;
|
||||
QtWayland::wl_compositor mCompositor;
|
||||
struct wl_shm *mShm;
|
||||
QThread *mEventThread;
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDDND_H
|
||||
#define QWAYLANDDND_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 <qpa/qplatformdrag.h>
|
||||
#include <QtGui/private/qsimpledrag_p.h>
|
||||
|
||||
|
@ -80,13 +80,9 @@ void QWaylandEventThread::checkError() const
|
||||
|
||||
void QWaylandEventThread::readWaylandEvents()
|
||||
{
|
||||
if (wl_display_dispatch(m_display) < 0) {
|
||||
checkError();
|
||||
m_readNotifier->setEnabled(false);
|
||||
emit fatalError();
|
||||
return;
|
||||
if (wl_display_prepare_read(m_display) == 0) {
|
||||
wl_display_read_events(m_display);
|
||||
}
|
||||
|
||||
emit newEventsRead();
|
||||
}
|
||||
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDEVENTTHREAD_H
|
||||
#define QWAYLANDEVENTTHREAD_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 <QObject>
|
||||
#include <QMutex>
|
||||
#include <wayland-client.h>
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDEXTENDEDSURFACE_H
|
||||
#define QWAYLANDEXTENDEDSURFACE_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 <QtCore/QString>
|
||||
#include <QtCore/QVariant>
|
||||
|
||||
|
@ -35,6 +35,17 @@
|
||||
#ifndef QWAYLANDINPUTCONTEXT_H
|
||||
#define QWAYLANDINPUTCONTEXT_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 <qpa/qplatforminputcontext.h>
|
||||
|
||||
#include <QtWaylandClient/private/qwayland-text.h>
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDINPUTDEVICE_H
|
||||
#define QWAYLANDINPUTDEVICE_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 <QtWaylandClient/private/qwaylandwindow_p.h>
|
||||
|
||||
#include <QSocketNotifier>
|
||||
|
@ -128,7 +128,9 @@ QWaylandIntegration::QWaylandIntegration()
|
||||
mClipboard = new QWaylandClipboard(mDisplay);
|
||||
mDrag = new QWaylandDrag(mDisplay);
|
||||
|
||||
mInputContext.reset(new QWaylandInputContext(mDisplay));
|
||||
QString icStr = QPlatformInputContextFactory::requested();
|
||||
icStr.isNull() ? mInputContext.reset(new QWaylandInputContext(mDisplay))
|
||||
: mInputContext.reset(QPlatformInputContextFactory::create(icStr));
|
||||
}
|
||||
|
||||
QWaylandIntegration::~QWaylandIntegration()
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QPLATFORMINTEGRATION_WAYLAND_H
|
||||
#define QPLATFORMINTEGRATION_WAYLAND_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 <qpa/qplatformintegration.h>
|
||||
|
||||
#include <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
|
@ -58,8 +58,6 @@ void *QWaylandNativeInterface::nativeResourceForIntegration(const QByteArray &re
|
||||
|
||||
if (lowerCaseResource == "display" || lowerCaseResource == "wl_display" || lowerCaseResource == "nativedisplay")
|
||||
return m_integration->display()->wl_display();
|
||||
if (lowerCaseResource == "wl_event_queue")
|
||||
return m_integration->display()->wl_event_queue();
|
||||
if (lowerCaseResource == "compositor")
|
||||
return const_cast<wl_compositor *>(m_integration->display()->wl_compositor());
|
||||
if (lowerCaseResource == "server_buffer_integration")
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDNATIVEINTERFACE_H
|
||||
#define QWAYLANDNATIVEINTERFACE_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 <QVariantMap>
|
||||
#include <qpa/qplatformnativeinterface.h>
|
||||
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDQTKEY_H
|
||||
#define QWAYLANDQTKEY_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 <qpa/qwindowsysteminterface.h>
|
||||
|
||||
#include <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDSCREEN_H
|
||||
#define QWAYLANDSCREEN_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 <qpa/qplatformscreen.h>
|
||||
#include <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDSHELLSURFACE_H
|
||||
#define QWAYLANDSHELLSURFACE_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 <QtCore/QSize>
|
||||
#include <QObject>
|
||||
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDSHMBACKINGSTORE_H
|
||||
#define QWAYLANDSHMBACKINGSTORE_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 <QtWaylandClient/private/qwaylandbuffer_p.h>
|
||||
|
||||
#include <qpa/qplatformbackingstore.h>
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDSHMWINDOW_H
|
||||
#define QWAYLANDSHMWINDOW_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 <QtWaylandClient/private/qwaylandwindow_p.h>
|
||||
#include <QtGui/QRegion>
|
||||
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDSUBSURFACE_H
|
||||
#define QWAYLANDSUBSURFACE_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 <wayland-client.h>
|
||||
|
||||
#include <QtCore/qglobal.h>
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDTOUCH_H
|
||||
#define QWAYLANDTOUCH_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 <qpa/qwindowsysteminterface.h>
|
||||
|
||||
#include <QtWaylandClient/private/qwayland-touch-extension.h>
|
||||
|
@ -156,7 +156,8 @@ void QWaylandWindow::initWindow()
|
||||
mShellSurface->updateTransientParent(window()->transientParent());
|
||||
}
|
||||
} else {
|
||||
mShellSurface->setTopLevel();
|
||||
if (window()->type() != Qt::ToolTip)
|
||||
mShellSurface->setTopLevel();
|
||||
}
|
||||
}
|
||||
|
||||
@ -269,17 +270,18 @@ void QWaylandWindow::setGeometry(const QRect &rect)
|
||||
void QWaylandWindow::setVisible(bool visible)
|
||||
{
|
||||
if (visible) {
|
||||
if (window()->type() == Qt::Popup) {
|
||||
QWaylandWindow *parent = transientParent();
|
||||
if (!parent) {
|
||||
// Try with the current focus window. It should be the right one and anyway
|
||||
// better than having no parent at all.
|
||||
parent = mDisplay->lastInputWindow();
|
||||
}
|
||||
if (parent) {
|
||||
QWaylandWlShellSurface *wlshellSurface = qobject_cast<QWaylandWlShellSurface*>(mShellSurface);
|
||||
if (wlshellSurface)
|
||||
wlshellSurface->setPopup(parent, mDisplay->lastInputDevice(), mDisplay->lastInputSerial());
|
||||
if (mShellSurface) {
|
||||
if (window()->type() == Qt::Popup) {
|
||||
QWaylandWindow *parent = transientParent();
|
||||
if (parent) {
|
||||
QWaylandWlShellSurface *wlshellSurface = qobject_cast<QWaylandWlShellSurface*>(mShellSurface);
|
||||
if (wlshellSurface)
|
||||
wlshellSurface->setPopup(parent, mDisplay->lastInputDevice(), mDisplay->lastInputSerial());
|
||||
}
|
||||
} else if (window()->type() == Qt::ToolTip) {
|
||||
if (QWaylandWindow *parent = transientParent()) {
|
||||
mShellSurface->updateTransientParent(parent->window());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -646,7 +648,9 @@ QWaylandWindow *QWaylandWindow::transientParent() const
|
||||
// events.
|
||||
return static_cast<QWaylandWindow *>(topLevelWindow(window()->transientParent())->handle());
|
||||
}
|
||||
return 0;
|
||||
// Try with the current focus window. It should be the right one and anyway
|
||||
// better than having no parent at all.
|
||||
return mDisplay->lastInputWindow();
|
||||
}
|
||||
|
||||
void QWaylandWindow::handleMouse(QWaylandInputDevice *inputDevice, const QWaylandPointerEvent &e)
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDWINDOW_H
|
||||
#define QWAYLANDWINDOW_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 <QtCore/QWaitCondition>
|
||||
#include <QtCore/QMutex>
|
||||
#include <QtGui/QIcon>
|
||||
|
@ -127,28 +127,33 @@ QByteArray QWaylandWindowManagerIntegration::desktopEnvironment() const
|
||||
|
||||
void QWaylandWindowManagerIntegration::openUrl_helper(const QUrl &url)
|
||||
{
|
||||
if (isInitialized()) {
|
||||
QByteArray data = url.toString().toUtf8();
|
||||
Q_ASSERT(isInitialized());
|
||||
QByteArray data = url.toString().toUtf8();
|
||||
|
||||
static const int chunkSize = 128;
|
||||
while (!data.isEmpty()) {
|
||||
QByteArray chunk = data.left(chunkSize);
|
||||
data = data.mid(chunkSize);
|
||||
open_url(!data.isEmpty(), QString::fromUtf8(chunk));
|
||||
}
|
||||
static const int chunkSize = 128;
|
||||
while (!data.isEmpty()) {
|
||||
QByteArray chunk = data.left(chunkSize);
|
||||
data = data.mid(chunkSize);
|
||||
open_url(!data.isEmpty(), QString::fromUtf8(chunk));
|
||||
}
|
||||
}
|
||||
|
||||
bool QWaylandWindowManagerIntegration::openUrl(const QUrl &url)
|
||||
{
|
||||
openUrl_helper(url);
|
||||
return true;
|
||||
if (isInitialized()) {
|
||||
openUrl_helper(url);
|
||||
return true;
|
||||
}
|
||||
return QGenericUnixServices::openUrl(url);
|
||||
}
|
||||
|
||||
bool QWaylandWindowManagerIntegration::openDocument(const QUrl &url)
|
||||
{
|
||||
openUrl_helper(url);
|
||||
return true;
|
||||
if (isInitialized()) {
|
||||
openUrl_helper(url);
|
||||
return true;
|
||||
}
|
||||
return QGenericUnixServices::openDocument(url);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -34,11 +34,22 @@
|
||||
#ifndef QWAYLANDWINDOWMANAGERINTEGRATION_H
|
||||
#define QWAYLANDWINDOWMANAGERINTEGRATION_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 <QtCore/QObject>
|
||||
#include <QtCore/QScopedPointer>
|
||||
|
||||
#include <wayland-client.h>
|
||||
#include <qpa/qplatformservices.h>
|
||||
#include <QtPlatformSupport/private/qgenericunixservices_p.h>
|
||||
|
||||
#include <QtWaylandClient/private/qwayland-windowmanager.h>
|
||||
#include <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
@ -52,7 +63,7 @@ class QWaylandDisplay;
|
||||
|
||||
class QWaylandWindowManagerIntegrationPrivate;
|
||||
|
||||
class Q_WAYLAND_CLIENT_EXPORT QWaylandWindowManagerIntegration : public QObject, public QPlatformServices, public QtWayland::qt_windowmanager
|
||||
class Q_WAYLAND_CLIENT_EXPORT QWaylandWindowManagerIntegration : public QObject, public QGenericUnixServices, public QtWayland::qt_windowmanager
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_DECLARE_PRIVATE(QWaylandWindowManagerIntegration)
|
||||
|
@ -47,8 +47,8 @@ QT_BEGIN_NAMESPACE
|
||||
namespace QtWaylandClient {
|
||||
|
||||
QWaylandWlShellSurface::QWaylandWlShellSurface(struct ::wl_shell_surface *shell_surface, QWaylandWindow *window)
|
||||
: QtWayland::wl_shell_surface(shell_surface)
|
||||
, QWaylandShellSurface(window)
|
||||
: QWaylandShellSurface(window)
|
||||
, QtWayland::wl_shell_surface(shell_surface)
|
||||
, m_window(window)
|
||||
, m_maximized(false)
|
||||
, m_fullscreen(false)
|
||||
@ -159,8 +159,7 @@ void QWaylandWlShellSurface::updateTransientParent(QWindow *parent)
|
||||
|
||||
// set_transient expects a position relative to the parent
|
||||
QPoint transientPos = m_window->geometry().topLeft(); // this is absolute
|
||||
QWindow *parentWin = m_window->window()->transientParent();
|
||||
transientPos -= parentWin->geometry().topLeft();
|
||||
transientPos -= parent->geometry().topLeft();
|
||||
if (parent_wayland_window->decoration()) {
|
||||
transientPos.setX(transientPos.x() + parent_wayland_window->decoration()->margins().left());
|
||||
transientPos.setY(transientPos.y() + parent_wayland_window->decoration()->margins().top());
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDWLSHELLSURFACE_H
|
||||
#define QWAYLANDWLSHELLSURFACE_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 <QtCore/QSize>
|
||||
|
||||
#include <wayland-client.h>
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDXDGSHELL_H
|
||||
#define QWAYLANDXDGSHELL_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 <QtCore/QSize>
|
||||
|
||||
#include <wayland-client.h>
|
||||
|
@ -46,8 +46,8 @@ QT_BEGIN_NAMESPACE
|
||||
namespace QtWaylandClient {
|
||||
|
||||
QWaylandXdgSurface::QWaylandXdgSurface(struct ::xdg_surface *xdg_surface, QWaylandWindow *window)
|
||||
: QtWayland::xdg_surface(xdg_surface)
|
||||
, QWaylandShellSurface(window)
|
||||
: QWaylandShellSurface(window)
|
||||
, QtWayland::xdg_surface(xdg_surface)
|
||||
, m_window(window)
|
||||
, m_maximized(false)
|
||||
, m_minimized(false)
|
||||
@ -56,6 +56,7 @@ QWaylandXdgSurface::QWaylandXdgSurface(struct ::xdg_surface *xdg_surface, QWayla
|
||||
{
|
||||
if (window->display()->windowExtension())
|
||||
m_extendedWindow = new QWaylandExtendedSurface(window);
|
||||
m_size = m_window->window()->geometry().size();
|
||||
}
|
||||
|
||||
QWaylandXdgSurface::~QWaylandXdgSurface()
|
||||
@ -126,8 +127,8 @@ void QWaylandXdgSurface::updateTransientParent(QWindow *parent)
|
||||
QWaylandWindow *parent_wayland_window = static_cast<QWaylandWindow *>(parent->handle());
|
||||
if (!parent_wayland_window)
|
||||
return;
|
||||
|
||||
set_parent(parent_wayland_window->object());
|
||||
QtWayland::xdg_shell *shell = parent_wayland_window->display()->shellXdg();
|
||||
set_parent(shell->get_xdg_surface(parent_wayland_window->object()));
|
||||
}
|
||||
|
||||
void QWaylandXdgSurface::setTitle(const QString & title)
|
||||
@ -178,11 +179,11 @@ void QWaylandXdgSurface::xdg_surface_configure(int32_t width, int32_t height, st
|
||||
|
||||
state = (uint32_t*) states->data;
|
||||
|
||||
for (uint32_t i=0; i < states->size; i++)
|
||||
for (uint32_t i = 0; i < states->size / sizeof(state) ; i++)
|
||||
{
|
||||
switch (*(state+i)) {
|
||||
case XDG_SURFACE_STATE_MAXIMIZED:
|
||||
aboutToMaximize = true;
|
||||
aboutToMaximize = ((width > 0) && (height > 0));
|
||||
break;
|
||||
case XDG_SURFACE_STATE_FULLSCREEN:
|
||||
aboutToFullScreen = true;
|
||||
@ -191,7 +192,7 @@ void QWaylandXdgSurface::xdg_surface_configure(int32_t width, int32_t height, st
|
||||
m_margins = m_window->frameMargins();
|
||||
width -= m_margins.left() + m_margins.right();
|
||||
height -= m_margins.top() + m_margins.bottom();
|
||||
m_size = QSize(width,height);
|
||||
m_size = m_window->window()->geometry().size();
|
||||
break;
|
||||
case XDG_SURFACE_STATE_ACTIVATED:
|
||||
// TODO: here about the missing window activation
|
||||
@ -203,21 +204,23 @@ void QWaylandXdgSurface::xdg_surface_configure(int32_t width, int32_t height, st
|
||||
|
||||
if (!m_fullscreen && aboutToFullScreen) {
|
||||
m_fullscreen = true;
|
||||
m_size = m_window->window()->geometry().size();
|
||||
m_window->window()->showFullScreen();
|
||||
} else if (m_fullscreen && !aboutToFullScreen) {
|
||||
m_fullscreen = false;
|
||||
m_window->window()->showNormal();
|
||||
if ( m_maximized ) {
|
||||
m_window->window()->showMaximized();
|
||||
} else {
|
||||
m_window->window()->showNormal();
|
||||
}
|
||||
} else if (!m_maximized && aboutToMaximize) {
|
||||
m_maximized = true;
|
||||
m_size = m_window->window()->geometry().size();
|
||||
m_window->window()->showMaximized();
|
||||
} else if (m_maximized && !aboutToMaximize) {
|
||||
m_maximized = false;
|
||||
m_window->window()->showNormal();
|
||||
}
|
||||
|
||||
if (width == 0 && height == 0) {
|
||||
if (width == 0 || height == 0) {
|
||||
width = m_size.width();
|
||||
height = m_size.height();
|
||||
}
|
||||
@ -227,7 +230,7 @@ void QWaylandXdgSurface::xdg_surface_configure(int32_t width, int32_t height, st
|
||||
m_window->configure(0, width + m_margins.left() + m_margins.right(), height + m_margins.top() + m_margins.bottom());
|
||||
}
|
||||
|
||||
xdg_surface_ack_configure(object(), serial);
|
||||
ack_configure(serial);
|
||||
}
|
||||
|
||||
void QWaylandXdgSurface::xdg_surface_close()
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDXDGSURFACE_H
|
||||
#define QWAYLANDXDGSURFACE_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 <QtCore/QSize>
|
||||
#include <QtCore/QMargins>
|
||||
|
||||
|
@ -135,6 +135,8 @@ static const uint32_t KeyTbl[] = {
|
||||
|
||||
XKB_KEY_XF86Eject, Qt::Key_Eject,
|
||||
|
||||
XKB_KEY_XF86Phone, Qt::Key_ToggleCallHangup,
|
||||
|
||||
0, 0
|
||||
};
|
||||
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDSHELLINTEGRATION_H
|
||||
#define QWAYLANDSHELLINTEGRATION_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 <QtCore/qglobal.h>
|
||||
#include <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDSHELLINTEGRATIONFACTORY_H
|
||||
#define QWAYLANDSHELLINTEGRATIONFACTORY_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 <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
#include <QtCore/QStringList>
|
||||
|
||||
|
@ -34,6 +34,17 @@
|
||||
#ifndef QWAYLANDSHELLINTEGRATIONPLUGIN_H
|
||||
#define QWAYLANDSHELLINTEGRATIONPLUGIN_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 <QtWaylandClient/private/qwaylandclientexport_p.h>
|
||||
|
||||
#include <QtCore/qplugin.h>
|
||||
|
Loading…
x
Reference in New Issue
Block a user