[ShellGtkEmbed] do a better job of tracking the actor's position

Previously the code to keep the X window aligned with its actor made
various assumptions that were true in the panel status tray area but
that are not true in the message tray. Fix it up by repositioning the
X window at clutter_actor_paint() time, which will definitely be
called every time the actor moves, whether it's because of its own or
its parent/ancestor's changes.

https://bugzilla.gnome.org/show_bug.cgi?id=608869
This commit is contained in:
Dan Winship 2010-08-06 12:43:54 -04:00
parent 745e8f608f
commit 63f2066135
2 changed files with 21 additions and 10 deletions

View File

@ -223,6 +223,12 @@ _shell_embedded_window_allocate (ShellEmbeddedWindow *window,
g_return_if_fail (SHELL_IS_EMBEDDED_WINDOW (window)); g_return_if_fail (SHELL_IS_EMBEDDED_WINDOW (window));
if (window->priv->position.x == x &&
window->priv->position.y == y &&
window->priv->position.width == width &&
window->priv->position.height == height)
return;
window->priv->position.x = x; window->priv->position.x = x;
window->priv->position.y = y; window->priv->position.y = y;
window->priv->position.width = width; window->priv->position.width = width;

View File

@ -167,19 +167,25 @@ shell_gtk_embed_get_preferred_height (ClutterActor *actor,
} }
static void static void
shell_gtk_embed_allocate (ClutterActor *actor, shell_gtk_embed_paint (ClutterActor *actor)
const ClutterActorBox *box,
ClutterAllocationFlags flags)
{ {
ShellGtkEmbed *embed = SHELL_GTK_EMBED (actor); ShellGtkEmbed *embed = SHELL_GTK_EMBED (actor);
float wx = 0.0, wy = 0.0, x, y, ax, ay; float wx = 0.0, wy = 0.0, x, y, ax, ay;
float w, h;
CLUTTER_ACTOR_CLASS (shell_gtk_embed_parent_class)-> CLUTTER_ACTOR_CLASS (shell_gtk_embed_parent_class)->paint (actor);
allocate (actor, box, flags);
/* Find the actor's new coordinates in terms of the stage (which is if (!embed->priv->window)
* priv->window's parent window. return;
/* Move the X window to the same position as the actor; it's much
* easier to just do this from paint() than it is to tray to track
* the position and allocation of @embed and each of its ancestors
* as they change. We don't use get_transformed_position() here
* because we know that the icon isn't scaled or rotated, and so
* it's faster to avoid the floating-point transformations.
*/ */
clutter_actor_get_size (actor, &w, &h);
while (actor) while (actor)
{ {
clutter_actor_get_position (actor, &x, &y); clutter_actor_get_position (actor, &x, &y);
@ -193,8 +199,7 @@ shell_gtk_embed_allocate (ClutterActor *actor,
_shell_embedded_window_allocate (embed->priv->window, _shell_embedded_window_allocate (embed->priv->window,
(int)(0.5 + wx), (int)(0.5 + wy), (int)(0.5 + wx), (int)(0.5 + wy),
box->x2 - box->x1, w, h);
box->y2 - box->y1);
} }
static void static void
@ -241,7 +246,7 @@ shell_gtk_embed_class_init (ShellGtkEmbedClass *klass)
actor_class->get_preferred_width = shell_gtk_embed_get_preferred_width; actor_class->get_preferred_width = shell_gtk_embed_get_preferred_width;
actor_class->get_preferred_height = shell_gtk_embed_get_preferred_height; actor_class->get_preferred_height = shell_gtk_embed_get_preferred_height;
actor_class->allocate = shell_gtk_embed_allocate; actor_class->paint = shell_gtk_embed_paint;
actor_class->realize = shell_gtk_embed_realize; actor_class->realize = shell_gtk_embed_realize;
actor_class->unrealize = shell_gtk_embed_unrealize; actor_class->unrealize = shell_gtk_embed_unrealize;