mirror of
https://github.com/brl/mutter.git
synced 2024-12-27 05:12:15 +00:00
wayland/surface: Move buffer size check to meta_wayland_surface_commit
Multiple reasons: * More consistent with the protocol spec language. * Ensures the size is checked and the protocol error sent from a protocol processing context, instead of whatever context meta_wayland_surface_commit might get called from. * The latter implies that surface->resource is guaranteed to be valid. Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3211 Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3463>
This commit is contained in:
parent
0a0d1e2066
commit
7649e2f3ab
@ -698,7 +698,6 @@ meta_wayland_surface_apply_state (MetaWaylandSurface *surface,
|
|||||||
{
|
{
|
||||||
gboolean had_damage = FALSE;
|
gboolean had_damage = FALSE;
|
||||||
int old_width, old_height;
|
int old_width, old_height;
|
||||||
int surface_scale;
|
|
||||||
|
|
||||||
old_width = meta_wayland_surface_get_width (surface);
|
old_width = meta_wayland_surface_get_width (surface);
|
||||||
old_height = meta_wayland_surface_get_height (surface);
|
old_height = meta_wayland_surface_get_height (surface);
|
||||||
@ -746,36 +745,6 @@ meta_wayland_surface_apply_state (MetaWaylandSurface *surface,
|
|||||||
if (state->scale > 0)
|
if (state->scale > 0)
|
||||||
surface->applied_state.scale = state->scale;
|
surface->applied_state.scale = state->scale;
|
||||||
|
|
||||||
surface_scale = surface->applied_state.scale;
|
|
||||||
if ((meta_wayland_surface_get_buffer_width (surface) % surface_scale != 0) ||
|
|
||||||
(meta_wayland_surface_get_buffer_height (surface) % surface_scale != 0))
|
|
||||||
{
|
|
||||||
if (surface->role && !META_IS_WAYLAND_CURSOR_SURFACE (surface->role))
|
|
||||||
{
|
|
||||||
wl_resource_post_error (surface->resource, WL_SURFACE_ERROR_INVALID_SIZE,
|
|
||||||
"Buffer size (%dx%d) must be an integer multiple "
|
|
||||||
"of the buffer_scale (%d).",
|
|
||||||
meta_wayland_surface_get_buffer_width (surface),
|
|
||||||
meta_wayland_surface_get_buffer_height (surface),
|
|
||||||
surface_scale);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
struct wl_resource *resource = surface->resource;
|
|
||||||
pid_t pid;
|
|
||||||
|
|
||||||
wl_client_get_credentials (wl_resource_get_client (resource), &pid, NULL,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
g_warning ("Bug in client with pid %ld: Cursor buffer size (%dx%d) is "
|
|
||||||
"not an integer multiple of the buffer_scale (%d).",
|
|
||||||
(long) pid,
|
|
||||||
meta_wayland_surface_get_buffer_width (surface),
|
|
||||||
meta_wayland_surface_get_buffer_height (surface),
|
|
||||||
surface_scale);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state->has_new_buffer_transform)
|
if (state->has_new_buffer_transform)
|
||||||
surface->buffer_transform = state->buffer_transform;
|
surface->buffer_transform = state->buffer_transform;
|
||||||
|
|
||||||
@ -926,6 +895,8 @@ meta_wayland_surface_commit (MetaWaylandSurface *surface)
|
|||||||
|
|
||||||
if (buffer)
|
if (buffer)
|
||||||
{
|
{
|
||||||
|
int committed_scale = surface->committed_state.scale;
|
||||||
|
MetaMultiTexture *committed_texture;
|
||||||
g_autoptr (GError) error = NULL;
|
g_autoptr (GError) error = NULL;
|
||||||
|
|
||||||
g_clear_signal_handler (&pending->buffer_destroy_handler_id,
|
g_clear_signal_handler (&pending->buffer_destroy_handler_id,
|
||||||
@ -947,7 +918,38 @@ meta_wayland_surface_commit (MetaWaylandSurface *surface)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pending->texture = g_object_ref (surface->committed_state.texture);
|
committed_texture = surface->committed_state.texture;
|
||||||
|
if ((meta_multi_texture_get_width (committed_texture) % committed_scale != 0) ||
|
||||||
|
(meta_multi_texture_get_height (committed_texture) % committed_scale != 0))
|
||||||
|
{
|
||||||
|
if (surface->role && !META_IS_WAYLAND_CURSOR_SURFACE (surface->role))
|
||||||
|
{
|
||||||
|
wl_resource_post_error (surface->resource, WL_SURFACE_ERROR_INVALID_SIZE,
|
||||||
|
"Buffer size (%dx%d) must be an integer multiple "
|
||||||
|
"of the buffer_scale (%d).",
|
||||||
|
meta_wayland_surface_get_buffer_width (surface),
|
||||||
|
meta_wayland_surface_get_buffer_height (surface),
|
||||||
|
committed_scale);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
struct wl_resource *resource = surface->resource;
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
|
wl_client_get_credentials (wl_resource_get_client (resource), &pid, NULL,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
g_warning ("Bug in client with pid %ld: Cursor buffer size (%dx%d) is "
|
||||||
|
"not an integer multiple of the buffer_scale (%d).",
|
||||||
|
(long) pid,
|
||||||
|
meta_wayland_surface_get_buffer_width (surface),
|
||||||
|
meta_wayland_surface_get_buffer_height (surface),
|
||||||
|
committed_scale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pending->texture = g_object_ref (committed_texture);
|
||||||
|
|
||||||
g_object_ref (buffer);
|
g_object_ref (buffer);
|
||||||
meta_wayland_buffer_inc_use_count (buffer);
|
meta_wayland_buffer_inc_use_count (buffer);
|
||||||
|
Loading…
Reference in New Issue
Block a user