window-wayland: Don't send 1x1 sizes to GTK+ windows

GTK+ requests get_xdg_surface before attaching a buffer, and since it
might take a long time for GTK+ to get around to attaching a buffer and
committing it, our idle for MOVE_RESIZE will kick in beforehand.

And our idle will try to resize the 0x0 window that currently exists,
constrain it to 1x1, which will send a configure event of 1x1 to the
window while it boots up, causing it to awkwardly resize to the minimum
size of the window.

Make sure that in this case, our idle doesn't cause any problems, and
that we fizzle out any idles like this.

The "proper" way to do this would be to delay the creation of the
MetaWindow until a surface is committed, but that's difficult for a
variety of reasons, and might cause unintended issues with focus.
This commit is contained in:
Jasper St. Pierre 2014-09-16 21:09:13 -06:00
parent c8cc4344f2
commit d61dde12cb

View File

@ -188,6 +188,18 @@ meta_window_wayland_move_resize_internal (MetaWindow *window,
}
else
{
/* If we get a 0x0 size, this means that we're trying to resize
* a surface that doesn't have any buffer attached. This can happen
* when a client requests an xdg surface before bringing it up.
* The constrained_rect will be 1x1 because of how our constraints
* code works, and sending that to the window would cause it to
* redraw itself, so just don't send anything. Pretend like this
* move_resize never happened.
*/
if (unconstrained_rect.width == 0 &&
unconstrained_rect.height == 0)
return;
if (constrained_rect.width != window->rect.width ||
constrained_rect.height != window->rect.height)
{
@ -296,8 +308,8 @@ meta_window_wayland_new (MetaDisplay *display,
attrs.x = 0;
attrs.y = 0;
attrs.width = 1;
attrs.height = 1;
attrs.width = 0;
attrs.height = 0;
attrs.border_width = 0;
attrs.depth = 24;
attrs.visual = NULL;