xdg-shell: upgrade to support current version (weston-1.8.0)
Handle transition from Normal to Maximize then Fullscreen and back to Maximized. Avoid to maximize if no requested size The protocol file is a raw copy of Source: http://cgit.freedesktop.org/wayland/weston/plain/protocol/xdg-shell.xml?id=1.8.0 Minor Nitpick fixes (arrays of bytes, conditionnal or test, c++ function call) Task-number: QTBUG-47327 Change-Id: Ib508e2166cc1337fd93454f30814136839cffa29 (cherry picked from commit 6906a6445c0cbf9d11f8d5d32b181f558a2292c9) Reviewed-by: Giulio Camuffo <giulio.camuffo@jollamobile.com>
This commit is contained in:
parent
38e4f03cf8
commit
b975ab4b85
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">
|
<interface name="xdg_shell" version="1">
|
||||||
<description summary="create desktop-style surfaces">
|
<description summary="create desktop-style surfaces">
|
||||||
This interface is implemented by servers that provide
|
xdg_shell allows clients to turn a wl_surface into a "real window"
|
||||||
desktop-style user interfaces.
|
which can be dragged, resized, stacked, and moved around by the
|
||||||
|
user. Everything about this interface is suited towards traditional
|
||||||
It allows clients to associate a xdg_surface with
|
desktop environments.
|
||||||
a basic surface.
|
|
||||||
</description>
|
</description>
|
||||||
|
|
||||||
<enum name="version">
|
<enum name="version">
|
||||||
@ -45,9 +44,25 @@
|
|||||||
they implement using static_assert to ensure the protocol and
|
they implement using static_assert to ensure the protocol and
|
||||||
implementation versions match.
|
implementation versions match.
|
||||||
</description>
|
</description>
|
||||||
<entry name="current" value="4" summary="Always the latest version"/>
|
<entry name="current" value="5" summary="Always the latest version"/>
|
||||||
</enum>
|
</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">
|
<request name="use_unstable_version">
|
||||||
<description summary="enable use of this unstable version">
|
<description summary="enable use of this unstable version">
|
||||||
@ -62,30 +77,40 @@
|
|||||||
|
|
||||||
<request name="get_xdg_surface">
|
<request name="get_xdg_surface">
|
||||||
<description summary="create a shell surface from a 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
|
See the documentation of xdg_surface for more details about what an
|
||||||
surface.
|
xdg_surface is and how it is used.
|
||||||
</description>
|
</description>
|
||||||
<arg name="id" type="new_id" interface="xdg_surface"/>
|
<arg name="id" type="new_id" interface="xdg_surface"/>
|
||||||
<arg name="surface" type="object" interface="wl_surface"/>
|
<arg name="surface" type="object" interface="wl_surface"/>
|
||||||
</request>
|
</request>
|
||||||
|
|
||||||
<request name="get_xdg_popup">
|
<request name="get_xdg_popup">
|
||||||
<description summary="create a shell surface from a surface">
|
<description summary="create a popup for a surface">
|
||||||
Create a popup surface for an existing 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
|
This request must be used in response to some sort of user action
|
||||||
surface.
|
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>
|
</description>
|
||||||
<arg name="id" type="new_id" interface="xdg_popup"/>
|
<arg name="id" type="new_id" interface="xdg_popup"/>
|
||||||
<arg name="surface" type="object" interface="wl_surface"/>
|
<arg name="surface" type="object" interface="wl_surface"/>
|
||||||
<arg name="parent" 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="seat" type="object" interface="wl_seat" summary="the wl_seat of the user event"/>
|
||||||
<arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
|
<arg name="serial" type="uint" summary="the serial of the user event"/>
|
||||||
<arg name="x" type="int"/>
|
<arg name="x" type="int"/>
|
||||||
<arg name="y" type="int"/>
|
<arg name="y" type="int"/>
|
||||||
<arg name="flags" type="uint"/>
|
|
||||||
</request>
|
</request>
|
||||||
|
|
||||||
<event name="ping">
|
<event name="ping">
|
||||||
@ -98,8 +123,11 @@
|
|||||||
alive. It's unspecified what will happen if the client doesn't
|
alive. It's unspecified what will happen if the client doesn't
|
||||||
respond to the ping request, or in what timeframe. Clients should
|
respond to the ping request, or in what timeframe. Clients should
|
||||||
try to respond in a reasonable amount of time.
|
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>
|
</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>
|
</event>
|
||||||
|
|
||||||
<request name="pong">
|
<request name="pong">
|
||||||
@ -112,8 +140,7 @@
|
|||||||
</interface>
|
</interface>
|
||||||
|
|
||||||
<interface name="xdg_surface" version="1">
|
<interface name="xdg_surface" version="1">
|
||||||
|
<description summary="A desktop window">
|
||||||
<description summary="desktop-style metadata interface">
|
|
||||||
An interface that may be implemented by a wl_surface, for
|
An interface that may be implemented by a wl_surface, for
|
||||||
implementations that provide a desktop-style user interface.
|
implementations that provide a desktop-style user interface.
|
||||||
|
|
||||||
@ -121,29 +148,39 @@
|
|||||||
properties like maximized, fullscreen, minimized, and to move and resize
|
properties like maximized, fullscreen, minimized, and to move and resize
|
||||||
them, and associate metadata like title and app id.
|
them, and associate metadata like title and app id.
|
||||||
|
|
||||||
On the server side the object is automatically destroyed when
|
The client must call wl_surface.commit on the corresponding wl_surface
|
||||||
the related wl_surface is destroyed. On client side,
|
for the xdg_surface state to take effect. Prior to committing the new
|
||||||
xdg_surface.destroy() must be called before destroying
|
state, it can set up initial configuration, such as maximizing or setting
|
||||||
the wl_surface object.
|
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>
|
</description>
|
||||||
|
|
||||||
<request name="destroy" type="destructor">
|
<request name="destroy" type="destructor">
|
||||||
<description summary="remove xdg_surface interface">
|
<description summary="Destroy the xdg_surface">
|
||||||
The xdg_surface interface is removed from the wl_surface object
|
Unmap and destroy the window. The window will be effectively
|
||||||
that was turned into a xdg_surface with
|
hidden from the user's point of view, and all state like
|
||||||
xdg_shell.get_xdg_surface request. The xdg_surface properties,
|
maximization, fullscreen, and so on, will be lost.
|
||||||
like maximized and fullscreen, are lost. The wl_surface loses
|
|
||||||
its role as a xdg_surface. The wl_surface is unmapped.
|
|
||||||
</description>
|
</description>
|
||||||
</request>
|
</request>
|
||||||
|
|
||||||
<request name="set_parent">
|
<request name="set_parent">
|
||||||
<description summary="surface is a child of another surface">
|
<description summary="set the parent of this surface">
|
||||||
Child surfaces are stacked above their parents, and will be
|
Set the "parent" of this surface. This window should be stacked
|
||||||
unmapped if the parent is unmapped too. They should not appear
|
above a parent. The parent surface must be mapped as long as this
|
||||||
on task bars and alt+tab.
|
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>
|
</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>
|
||||||
|
|
||||||
<request name="set_title">
|
<request name="set_title">
|
||||||
@ -160,14 +197,27 @@
|
|||||||
</request>
|
</request>
|
||||||
|
|
||||||
<request name="set_app_id">
|
<request name="set_app_id">
|
||||||
<description summary="set surface class">
|
<description summary="set application ID">
|
||||||
Set an id for the surface.
|
Set an application identifier for the surface.
|
||||||
|
|
||||||
The app id identifies the general class of applications to which
|
The app ID identifies the general class of applications to which
|
||||||
the surface belongs.
|
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
|
For D-Bus activatable applications, the app ID is used as the D-Bus
|
||||||
specification, the interface name.
|
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>
|
</description>
|
||||||
<arg name="app_id" type="string"/>
|
<arg name="app_id" type="string"/>
|
||||||
</request>
|
</request>
|
||||||
@ -179,29 +229,32 @@
|
|||||||
user a menu that they can use to maximize or minimize the window.
|
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
|
This request asks the compositor to pop up such a window menu at
|
||||||
the given position, relative to the parent surface. There are
|
the given position, relative to the local surface coordinates of
|
||||||
no guarantees as to what the window menu contains.
|
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
|
This request must be used in response to some sort of user action
|
||||||
window menu.
|
like a button press, key press, or touch down event.
|
||||||
</description>
|
</description>
|
||||||
|
|
||||||
<arg name="seat" type="object" interface="wl_seat" summary="the seat to pop the window up on"/>
|
<arg name="seat" type="object" interface="wl_seat" summary="the wl_seat of the user event"/>
|
||||||
<arg name="serial" type="uint" summary="serial of the event to pop up the window for"/>
|
<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="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"/>
|
<arg name="y" type="int" summary="the y position to pop up the window menu at"/>
|
||||||
</request>
|
</request>
|
||||||
|
|
||||||
<request name="move">
|
<request name="move">
|
||||||
<description summary="start an interactive 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 server may ignore move requests depending on the state of
|
||||||
the surface (e.g. fullscreen or maximized).
|
the surface (e.g. fullscreen or maximized).
|
||||||
</description>
|
</description>
|
||||||
<arg name="seat" type="object" interface="wl_seat" summary="the wl_seat whose pointer is used"/>
|
<arg name="seat" type="object" interface="wl_seat" summary="the wl_seat of the user event"/>
|
||||||
<arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
|
<arg name="serial" type="uint" summary="the serial of the user event"/>
|
||||||
</request>
|
</request>
|
||||||
|
|
||||||
<enum name="resize_edge">
|
<enum name="resize_edge">
|
||||||
@ -224,14 +277,16 @@
|
|||||||
|
|
||||||
<request name="resize">
|
<request name="resize">
|
||||||
<description summary="start an interactive 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 server may ignore resize requests depending on the state of
|
||||||
the surface (e.g. fullscreen or maximized).
|
the surface (e.g. fullscreen or maximized).
|
||||||
</description>
|
</description>
|
||||||
<arg name="seat" type="object" interface="wl_seat" summary="the wl_seat whose pointer is used"/>
|
<arg name="seat" type="object" interface="wl_seat" summary="the wl_seat of the user event"/>
|
||||||
<arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
|
<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"/>
|
<arg name="edges" type="uint" summary="which edge or corner is being dragged"/>
|
||||||
</request>
|
</request>
|
||||||
|
|
||||||
@ -279,16 +334,26 @@
|
|||||||
|
|
||||||
<event name="configure">
|
<event name="configure">
|
||||||
<description summary="suggest a surface change">
|
<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
|
The width and height arguments specify a hint to the window
|
||||||
about how its surface should be resized in window geometry
|
about how its surface should be resized in window geometry
|
||||||
coordinates. The states listed in the event specify how the
|
coordinates. See set_window_geometry.
|
||||||
width/height arguments should be interpreted.
|
|
||||||
|
|
||||||
A client should arrange a new surface, and then send a
|
If the width or height arguments are zero, it means the client
|
||||||
ack_configure request with the serial sent in this configure
|
should decide its own window dimension. This may happen when the
|
||||||
event before attaching a new surface.
|
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
|
If the client receives multiple configure events before it
|
||||||
can respond to one, it is free to discard all but the last
|
can respond to one, it is free to discard all but the last
|
||||||
@ -303,14 +368,19 @@
|
|||||||
|
|
||||||
<request name="ack_configure">
|
<request name="ack_configure">
|
||||||
<description summary="ack a configure event">
|
<description summary="ack a configure event">
|
||||||
When a configure event is received, a client should then ack it
|
When a configure event is received, if a client commits the
|
||||||
using the ack_configure request to ensure that the compositor
|
surface in response to the configure event, then the client
|
||||||
knows the client has seen the event.
|
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
|
For instance, the compositor might use this information to move
|
||||||
contain the buffer drawn for the configure event you are acking.
|
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>
|
</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>
|
||||||
|
|
||||||
<request name="set_window_geometry">
|
<request name="set_window_geometry">
|
||||||
@ -320,15 +390,26 @@
|
|||||||
portions like drop-shadows which should be ignored for the
|
portions like drop-shadows which should be ignored for the
|
||||||
purposes of aligning, placing and constraining windows.
|
purposes of aligning, placing and constraining windows.
|
||||||
|
|
||||||
The default value is the full bounds of the surface, including any
|
The window geometry is double buffered, and will be applied at the
|
||||||
subsurfaces. Once the window geometry of the surface is set once,
|
time wl_surface.commit of the corresponding wl_surface is called.
|
||||||
it is not possible to unset it, and it will remain the same until
|
|
||||||
|
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
|
set_window_geometry is called again, even if a new subsurface or
|
||||||
buffer is attached.
|
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
|
If responding to a configure event, the window geometry in here
|
||||||
must respect the sizing negotiations specified by the states in
|
must respect the sizing negotiations specified by the states in
|
||||||
the configure event.
|
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>
|
</description>
|
||||||
<arg name="x" type="int"/>
|
<arg name="x" type="int"/>
|
||||||
<arg name="y" type="int"/>
|
<arg name="y" type="int"/>
|
||||||
@ -336,8 +417,48 @@
|
|||||||
<arg name="height" type="int"/>
|
<arg name="height" type="int"/>
|
||||||
</request>
|
</request>
|
||||||
|
|
||||||
<request name="set_maximized" />
|
<request name="set_maximized">
|
||||||
<request name="unset_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">
|
<request name="set_fullscreen">
|
||||||
<description summary="set the window as fullscreen on a monitor">
|
<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.
|
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
|
If this value is NULL, it's up to the compositor to choose which
|
||||||
display will be used to map this surface.
|
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>
|
</description>
|
||||||
<arg name="output" type="object" interface="wl_output" allow-null="true"/>
|
<arg name="output" type="object" interface="wl_output" allow-null="true"/>
|
||||||
</request>
|
</request>
|
||||||
<request name="unset_fullscreen" />
|
<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">
|
<event name="close">
|
||||||
<description summary="surface wants to be closed">
|
<description summary="surface wants to be closed">
|
||||||
@ -368,45 +504,76 @@
|
|||||||
</interface>
|
</interface>
|
||||||
|
|
||||||
<interface name="xdg_popup" version="1">
|
<interface name="xdg_popup" version="1">
|
||||||
<description summary="desktop-style metadata interface">
|
<description summary="short-lived, popup surfaces for menus">
|
||||||
An interface that may be implemented by a wl_surface, for
|
A popup surface is a short-lived, temporary surface that can be
|
||||||
implementations that provide a desktop-style popups/menus. A popup
|
used to implement menus. It takes an explicit grab on the surface
|
||||||
surface is a transient surface with an added pointer grab.
|
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,
|
When the popup is dismissed, a popup_done event will be sent out,
|
||||||
and the popup grab will continue after the implicit grab ends
|
and at the same time the surface will be unmapped. The xdg_popup
|
||||||
(i.e. releasing the mouse button does not cause the popup to be
|
object is now inert and cannot be reactivated, so clients should
|
||||||
unmapped).
|
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
|
Clients will receive events for all their surfaces during this
|
||||||
button is pressed in any other clients window. A click in any of
|
grab (which is an "owner-events" grab in X11 parlance). This is
|
||||||
the clients surfaces is reported as normal, however, clicks in
|
done so that users can navigate through submenus and other
|
||||||
other clients surfaces will be discarded and trigger the callback.
|
"nested" popup windows without having to dismiss the topmost
|
||||||
|
popup.
|
||||||
|
|
||||||
The x and y arguments specify the locations of the upper left
|
Clients that want to dismiss the popup when another surface of
|
||||||
corner of the surface relative to the upper left corner of the
|
their own is clicked should dismiss the popup using the destroy
|
||||||
parent surface, in surface local coordinates.
|
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>
|
</description>
|
||||||
|
|
||||||
<request name="destroy" type="destructor">
|
<request name="destroy" type="destructor">
|
||||||
<description summary="remove xdg_surface interface">
|
<description summary="remove xdg_popup interface">
|
||||||
The xdg_surface interface is removed from the wl_surface object
|
This destroys the popup. Explicitly destroying the xdg_popup
|
||||||
that was turned into a xdg_surface with
|
object will also dismiss the popup, and unmap the surface.
|
||||||
xdg_shell.get_xdg_surface request. The xdg_surface properties,
|
|
||||||
like maximized and fullscreen, are lost. The wl_surface loses
|
If this xdg_popup is not the "topmost" popup, a protocol error
|
||||||
its role as a xdg_surface. The wl_surface is unmapped.
|
will be sent.
|
||||||
</description>
|
</description>
|
||||||
</request>
|
</request>
|
||||||
|
|
||||||
<event name="popup_done">
|
<event name="popup_done">
|
||||||
<description summary="popup interaction is done">
|
<description summary="popup interaction is done">
|
||||||
The popup_done event is sent out when a popup grab is broken,
|
The popup_done event is sent out when a popup is dismissed by the
|
||||||
that is, when the users clicks a surface that doesn't belong
|
compositor. The client should destroy the xdg_popup object at this
|
||||||
to the client owning the popup surface.
|
point.
|
||||||
</description>
|
</description>
|
||||||
<arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
|
|
||||||
</event>
|
</event>
|
||||||
|
|
||||||
</interface>
|
</interface>
|
||||||
|
@ -56,6 +56,7 @@ QWaylandXdgSurface::QWaylandXdgSurface(struct ::xdg_surface *xdg_surface, QWayla
|
|||||||
{
|
{
|
||||||
if (window->display()->windowExtension())
|
if (window->display()->windowExtension())
|
||||||
m_extendedWindow = new QWaylandExtendedSurface(window);
|
m_extendedWindow = new QWaylandExtendedSurface(window);
|
||||||
|
m_size = m_window->window()->geometry().size();
|
||||||
}
|
}
|
||||||
|
|
||||||
QWaylandXdgSurface::~QWaylandXdgSurface()
|
QWaylandXdgSurface::~QWaylandXdgSurface()
|
||||||
@ -126,8 +127,8 @@ void QWaylandXdgSurface::updateTransientParent(QWindow *parent)
|
|||||||
QWaylandWindow *parent_wayland_window = static_cast<QWaylandWindow *>(parent->handle());
|
QWaylandWindow *parent_wayland_window = static_cast<QWaylandWindow *>(parent->handle());
|
||||||
if (!parent_wayland_window)
|
if (!parent_wayland_window)
|
||||||
return;
|
return;
|
||||||
|
QtWayland::xdg_shell *shell = parent_wayland_window->display()->shellXdg();
|
||||||
set_parent(parent_wayland_window->object());
|
set_parent(shell->get_xdg_surface(parent_wayland_window->object()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void QWaylandXdgSurface::setTitle(const QString & title)
|
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;
|
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)) {
|
switch (*(state+i)) {
|
||||||
case XDG_SURFACE_STATE_MAXIMIZED:
|
case XDG_SURFACE_STATE_MAXIMIZED:
|
||||||
aboutToMaximize = true;
|
aboutToMaximize = ((width > 0) && (height > 0));
|
||||||
break;
|
break;
|
||||||
case XDG_SURFACE_STATE_FULLSCREEN:
|
case XDG_SURFACE_STATE_FULLSCREEN:
|
||||||
aboutToFullScreen = true;
|
aboutToFullScreen = true;
|
||||||
@ -191,7 +192,7 @@ void QWaylandXdgSurface::xdg_surface_configure(int32_t width, int32_t height, st
|
|||||||
m_margins = m_window->frameMargins();
|
m_margins = m_window->frameMargins();
|
||||||
width -= m_margins.left() + m_margins.right();
|
width -= m_margins.left() + m_margins.right();
|
||||||
height -= m_margins.top() + m_margins.bottom();
|
height -= m_margins.top() + m_margins.bottom();
|
||||||
m_size = QSize(width,height);
|
m_size = m_window->window()->geometry().size();
|
||||||
break;
|
break;
|
||||||
case XDG_SURFACE_STATE_ACTIVATED:
|
case XDG_SURFACE_STATE_ACTIVATED:
|
||||||
// TODO: here about the missing window activation
|
// 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) {
|
if (!m_fullscreen && aboutToFullScreen) {
|
||||||
m_fullscreen = true;
|
m_fullscreen = true;
|
||||||
m_size = m_window->window()->geometry().size();
|
|
||||||
m_window->window()->showFullScreen();
|
m_window->window()->showFullScreen();
|
||||||
} else if (m_fullscreen && !aboutToFullScreen) {
|
} else if (m_fullscreen && !aboutToFullScreen) {
|
||||||
m_fullscreen = false;
|
m_fullscreen = false;
|
||||||
m_window->window()->showNormal();
|
if ( m_maximized ) {
|
||||||
|
m_window->window()->showMaximized();
|
||||||
|
} else {
|
||||||
|
m_window->window()->showNormal();
|
||||||
|
}
|
||||||
} else if (!m_maximized && aboutToMaximize) {
|
} else if (!m_maximized && aboutToMaximize) {
|
||||||
m_maximized = true;
|
m_maximized = true;
|
||||||
m_size = m_window->window()->geometry().size();
|
|
||||||
m_window->window()->showMaximized();
|
m_window->window()->showMaximized();
|
||||||
} else if (m_maximized && !aboutToMaximize) {
|
} else if (m_maximized && !aboutToMaximize) {
|
||||||
m_maximized = false;
|
m_maximized = false;
|
||||||
m_window->window()->showNormal();
|
m_window->window()->showNormal();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (width == 0 && height == 0) {
|
if (width == 0 || height == 0) {
|
||||||
width = m_size.width();
|
width = m_size.width();
|
||||||
height = m_size.height();
|
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());
|
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()
|
void QWaylandXdgSurface::xdg_surface_close()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user