weston_shell_utils_center_on_output() already handles the case where we
don't have an output to aim at.
Signed-off-by: Daniel Stone <daniels@collabora.com>
Since drm-backend requires libgbm 21.1.1 or later, there is no need to
support the old libgbm which does not support modifiers or fd import.
Signed-off-by: Tomohito Esaki <etom@igel.co.jp>
Since clients using dmabuf require libgbm 21.1.1, there is no need to
support the old libgbm which does not support modifiers.
Signed-off-by: Tomohito Esaki <etom@igel.co.jp>
Since drm-backend requires libgbm 21.1.1, client samples using dmabuf
should be similar to drm-backend.
Signed-off-by: Tomohito Esaki <etom@igel.co.jp>
Since simple-dmabuf-feedback requires libgbm 21.1.1, there is no need to
support the old libgbm which does not support modifiers.
Signed-off-by: Tomohito Esaki <etom@igel.co.jp>
Remove any attempt to reposition windows when handling an output resize.
This had some side-effects on x11 and wayland backends that keep moving
windows at random positions when manually the output.
A more smarter approach would be to move them only if they're actually
affected by a resize -- like no longer in the output's viewing area, but
that remains for another day.
Fixes: #793
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Reported-by: Philipp Zabel <p.zabel@pengutronix.de>
Initialize no-op color manager in weston_compositor_backends_loaded()
if weston_compositor_load_color_manager() was never called.
This makes weston_compositor_load_backend() live up to its name and
prepares it to be called multiple times.
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Move the presentation clock selection loop into
weston_compositor_set_presentation_clock() and refactor
weston_compositor_backends_loaded() to make it possible
to add more functionality.
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
We seem to be using at least mesa 21.1.1 since Weston 10, but we never
explicitly asked for it.
Fixes: #790
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Since we use paint nodes to track damage, we have to be very careful to
make sure that we never have paint nodes that aren't actually being
displayed on their outputs.
Shells may move views to invisible layers (minimized_layer, inactive_layer)
and this currently leaves the paint node alive but not visible on its
output.
When this happens, the paint node's previous visible region is left
undamaged, and the paint node is removed from processing.
Let's delete paint nodes when their views change layers, thus creating
damage for their full visible region.
This may create excess damage if the paint node moves between two visible
layers, but this is probably far less harmful than leaving pieces of
invisible views on screen.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Commit 43b59786 errantly claimed that paint_node_damage_below() needed to
damage all planes because it's used when moving paint nodes between
planes.
This is wrong because the destination plane will receive damage correctly
from paint_node_update_late() when the node's visible region is added to
its damage.
Leave the rest of that commit's changes, but make it once again only
damage the plane the node is currently on.
The problem this caused is easily seen by turning on triangle fan debug
and moving the mouse. Extra damage is generated beneath the cursor plane.
Fixes 43b59786
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Let backends declare the presentation clocks they can use with a
new bitfield weston_backend::supported_presentation_clocks and set
presentation clock after loading the backend in the compositor.
Make weston_compositor_set_presentation_clock() internal and replace
weston_compositor_set_presentation_clock_software() with an exported
weston_compositor_backends_loaded(), which is called by the compositor
after the backend is loaded.
In the future, this can be extended to determine the subset of clocks
supported by all backends.
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Replace previous logic when placing views in the weston layers upon surface
activation with new one that takes into account the surface tree lists design
from the previous commits.
This commit is based on previous code by Alexandros Frantzis.
Fixes: #680
Signed-off-by: Sergio Gómez <sergio.g.delreal@gmail.com>
If we have a successor view that comes from the inactive layer, this means that
we have a change in the active surface tree, so call
kiosk_shell_output_set_active_surface_tree() on the root of that view's kiosk
surface.
If we have no successors, just reset the current active surface tree.
Signed-off-by: Sergio Gómez <sergio.g.delreal@gmail.com>
The function find_focus_successor() is called when destroying a surface to find
a successor to the current focus. It, however, has the following issues:
- Its first parameter is the weston layer from which to search for a successor.
This is an unnecessary flexibility for our use, which only adds complexity to
the user of the function by having to make a call for each layer. We know
that we want to search for a successor first in the normal layer, and if that
fails, then in the inactive layer. So we change the signature of
find_focus_successor(), removing this first parameter.
- It includes logic to decide whether to do the search or not: if the destroyed
surface is different from the surface that currently has focus, and if their
outputs are the same, then abort and don't do the search. This returns NULL to
the calling function. The problem is that the function also returns NULL if
it does the search and finds no successor. The distinction for the failing
reason is lost, and the user of the function needs to add more logic to know
the reason for failure. To simplify, we take the logic out of
find_focus_successor() and inside the caller.
- It returns the successor view, although it receives surfaces and the client
has logic to retrieve the surface corresponding to the returned view. To
simplify and maintain symmetry, we change the signature so that the function
returns the surface corresponding to the successor view.
Fixes: #738
Signed-off-by: Sergio Gómez <sergio.g.delreal@gmail.com>
Currently, the 'parent_destroy_listener' is being paired with
'destroy_signal'. The signal is emitted from kiosk_shell_surface_destroy(),
which is the appropriate place to emit this general-purpose surface destruction
signal.
However, we need to inform the children of the surface destruction before
finding the focus successor and activating it, that is, before calling
find_focus_successor() and kiosk_shell_surface_activate(), which happen before
kiosk_shell_surface_destroy().
Since there are currently other uses for 'destroy_signal' (e.g. in
kiosk-shell-grab.c), don't mess with it and simply add a new
'parent_destroy_signal', placing its emition where we need it.
Signed-off-by: Sergio Gómez <sergio.g.delreal@gmail.com>
This commit adds code to maintain the correct order and linking of a surface in
its surface tree list for when a new parent is being set on it.
If the new parent is not NULL, the child might already belong to the same
surface tree as the new parent's root, in which case no relinking is necessary.
Check this by calling kiosk_shell_surface_is_surface_in_tree(shsurf, shroot),
to see if 'shsurf' is in the surface tree list represented by 'shroot', where
'shroot' is the new parent's root surface. In case 'shsurf' doesn't belong to
this surface tree, relink it there.
If parent is NULL, 'shsurf' will become root of a new surface tree list. In
this case 'shroot' is the root surface of shsurf's current surface tree list.
Iterate through the surface tree list of this 'shroot' to relink all
descendents of 'shsurf' into this new list and set it as the new active surface
tree for the output.
Signed-off-by: Sergio Gómez <sergio.g.delreal@gmail.com>
This commit introduces to the kiosk shell output structure a pointer to a
surface tree list. This pointer will reference the surface tree list currently
active on the output. (Surface tree lists were introduced in the previous
commit)
Each output will have at most one active surface tree. A surface tree being
active on an output means that all views for this output belonging to that
surface tree, and only those views, are in the normal layer.
kiosk_shell_output_set_active_surface_tree() sets the current active surface
tree for the specified output, replacing the previous one.
Set the new active surface tree when first mapping a surface
Signed-off-by: Sergio Gómez <sergio.g.delreal@gmail.com>
The following patchset implements proper z-order for xdg surfaces in the kiosk
shell. For this it introduces to the kiosk shell the concept of a "surface
tree": a list of kiosk shell surface structures having a common ancestor (in
the xdg protocol sense).
The design is based on the following assumptions that the kiosk shell currently
makes:
- A kiosk surface with no parent must be fullscreen.
- If a parent is set on a kiosk surface, that surface is assigned the output of
the root kiosk surface. This means that all kiosk surfaces in a surface tree
will always have the same output.
- There is no possibility to minimize a kiosk surface.
With these in mind, the following design decisions were deemed convenient:
- For every output, at most one surface tree list will be active. This means
that, for a given output, only views belonging to surfaces of the same
surface tree will be in the normal layer. Moreover, all such views will be in
the normal layer if the surface tree list is active.
- The z-order of surface trees (the weston views' relative placement in the
normal layer) is determined by the placement of their corresponding kiosk
surface in the surface tree list.
Each kiosk shell surface begins its life as root of its own surface tree list.
Whenever a parent is set on a surface, that surface is linked to the surface
tree list of the root surface of the parent. If a parent kiosk shell surface is
destroyed, its children will keep the link to the root surface's surface tree
list. If the destroyed parent is also the root surface of the surface tree,
each child is unlinked from this root and they become the root of a new surface
tree.
This commit introduces to the kiosk_shell_surface structure the fields
'surface_tree_list', representing the surface tree list to which the surface is
linked at creation as its root, and 'surface_tree_link', the link to the
surface tree list.
Signed-off-by: Sergio Gómez <sergio.g.delreal@gmail.com>
There is no need to manually schedule a repaint anymore, it will be
triggered by changes to opacity or transform.
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Use the weston_view_move_to_layer() helper instead of calling
weston_layer_entry_insert() / weston_view_unmap() directly.
This requires us to stop just clearing out the layer view list and then
adding visible surfaces' views to it. Instead, we have to explicitly
move all views onto or off of the layers.
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Stop manipulating the view->geometry.transformation_list directly and
replace weston_view_geometry_dirty() and weston_view_update_transform()
calls with weston_view_add/remove_transform().
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
We don't need to manually schedule a repaint after we've updated our
views - which happens as a side effect of destroying the transform/etc
within the animation.
Signed-off-by: Daniel Stone <daniels@collabora.com>
Whenever a view is moved, we should schedule a repaint for the outputs
the view is on. This avoids users having to do it by hand every time
they change something. There is no change in determinism of behaviour
(e.g. 'I can reconfigure views as often as I like and it won't take
effect until I schedule a repaint' isn't true, because output repaints
might happen for reasons outside your control).
Signed-off-by: Daniel Stone <daniels@collabora.com>
This list walk is broken, the intent was to walk the tail of the list
starting from the currently held node - but that is not what happens.
Instead, walk the list backwards and stop a the held node.
Also, paint_node_damage_below() is used when moving paint nodes between
planes, and in these cases we definitely don't want to limit damage to
the current plane.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Currently this isn't calculated properly, and results in clipping away
important damage when a client moves from a non-primary plane to the
primary plane.
Instead of trying to fix it, let's just throw it away.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
In other parts of the code, use_geometry implies a parent is present. So
let's clear it when we clear relative placement.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Having use_geometry set is not the only time we have a parent window,
apparently.
Clicking on the 'Line diff' drop down in gitk would cause an assert()
because of this.
Fixes#769
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
This seems to break interactive resize, giving invalid/0/negative values
to pending allocations.
This reverts commit 9555118095.
Fixes: #780
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Until kernel mainline does merge the aysnc page flip ioctl, make the
whole bit look like it's unsupported. We can further switch it back when
it lands into the kernel.
Fixes: 9203d98f
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Reported-by: Simon Ser <contact@emersion.fr>
Add another wrapper so we can build with -Dxwayland=false.
Signed-off-by: Daniel Stone <daniels@collabora.com>
Fixes: 388702c181 ("frontend: Explicitly destroy Xwayland from frontend code")
Closes: wayland/weston#779
Add a workaround to fix rendering the dot files with doxygen 1.9.6
and cairo 1.17.8 on Fedora 38.
This is fixed upstream in doxygen 1.9.7, for details see:
https://github.com/doxygen/doxygen/issues/9319
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Stop flushing surfaces that are put on an overlay plane on the output to
be repainted next, but that have to be painted into another output's
primary_plane.
Now that each output has its own primary_plane, and flush_damage() knows
the output that is going to be repainted, texture_used can be limited to
surfaces that will actually be used by the renderer during the following
repaint_output().
Always upload when called from gl_renderer_surface_copy_content() or
gl_renderer_create_surface() with the output parameter set to NULL.
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
When flush_damage() is called, the output to be repainted next is
already known. Pass it along into the renderer, which can make use
of this information:
The GL renderer can get a better idea which SHM surface textures
actually have to be updated, in case a surface can be put on a plane
on one output, but not another.
A future Vulkan renderer could record texture uploads into an output
specific command buffer.
Signed-off-by: Philipp Zabel <philipp.zabel@gmail.com>
Move the destroy listener registration to the top, to avoid having
to call hmi_controller_destroy() for cleanup when it fails.
This would segfault trying to remove the destroy listener from a list
when its link was never initialized or inserted into any list.
The failure case can be hit by setting both modules=hmi-controller.so in
weston.ini and --modules=hmi-controller.so on the command line.
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Currently dbus support is built when launcher-logind option
is set; let's split that such that dbus is its own option
and launcher-logind depends on dbus.
Signed-off-by: Christopher Obbard <chris.obbard@collabora.com>