[x11] Fix the race between resize and glViewport calls
The race we were experiencing in the X11 backends is apparently back after the fix in commit 00a3c698. This time, just delaying the setting of the SYNC_MATRICES flag is not enough, so we can resume the use of a STAGE_IN_RESIZE private flag. This should also fix bug: http://bugzilla.openedhand.com/show_bug.cgi?id=1668
This commit is contained in:
parent
3726213291
commit
250b775926
@ -153,12 +153,15 @@ _clutter_stage_maybe_relayout (ClutterActor *stage)
|
|||||||
void
|
void
|
||||||
_clutter_stage_maybe_setup_viewport (ClutterStage *stage)
|
_clutter_stage_maybe_setup_viewport (ClutterStage *stage)
|
||||||
{
|
{
|
||||||
if (CLUTTER_PRIVATE_FLAGS (stage) & CLUTTER_ACTOR_SYNC_MATRICES)
|
if ((CLUTTER_PRIVATE_FLAGS (stage) & CLUTTER_ACTOR_SYNC_MATRICES) &&
|
||||||
|
!(CLUTTER_PRIVATE_FLAGS (stage) & CLUTTER_STAGE_IN_RESIZE))
|
||||||
{
|
{
|
||||||
ClutterPerspective perspective;
|
ClutterPerspective perspective;
|
||||||
gfloat width, height;
|
gfloat width, height;
|
||||||
|
|
||||||
clutter_actor_get_size (CLUTTER_ACTOR (stage), &width, &height);
|
clutter_actor_get_preferred_size (CLUTTER_ACTOR (stage),
|
||||||
|
NULL, NULL,
|
||||||
|
&width, &height);
|
||||||
clutter_stage_get_perspective (stage, &perspective);
|
clutter_stage_get_perspective (stage, &perspective);
|
||||||
|
|
||||||
CLUTTER_NOTE (PAINT,
|
CLUTTER_NOTE (PAINT,
|
||||||
|
@ -64,7 +64,8 @@ typedef enum {
|
|||||||
*/
|
*/
|
||||||
CLUTTER_ACTOR_IN_PAINT = 1 << 4, /* Used to avoid recursion */
|
CLUTTER_ACTOR_IN_PAINT = 1 << 4, /* Used to avoid recursion */
|
||||||
CLUTTER_ACTOR_IN_RELAYOUT = 1 << 5, /* Used to avoid recursion */
|
CLUTTER_ACTOR_IN_RELAYOUT = 1 << 5, /* Used to avoid recursion */
|
||||||
CLUTTER_TEXTURE_IN_CLONE_PAINT = 1 << 6 /* Used for safety in clones */
|
CLUTTER_TEXTURE_IN_CLONE_PAINT = 1 << 6, /* Used for safety in clones */
|
||||||
|
CLUTTER_STAGE_IN_RESIZE = 1 << 7
|
||||||
} ClutterPrivateFlags;
|
} ClutterPrivateFlags;
|
||||||
|
|
||||||
struct _ClutterInputDevice
|
struct _ClutterInputDevice
|
||||||
|
@ -482,11 +482,13 @@ event_translate (ClutterBackend *backend,
|
|||||||
stage_x11->xwin_width = xevent->xconfigure.width;
|
stage_x11->xwin_width = xevent->xconfigure.width;
|
||||||
stage_x11->xwin_height = xevent->xconfigure.height;
|
stage_x11->xwin_height = xevent->xconfigure.height;
|
||||||
|
|
||||||
|
CLUTTER_UNSET_PRIVATE_FLAGS (stage_x11->wrapper,
|
||||||
|
CLUTTER_STAGE_IN_RESIZE);
|
||||||
|
|
||||||
/* the resize process is complete, so we can ask the stage
|
/* the resize process is complete, so we can ask the stage
|
||||||
* to set up the GL viewport with the new size
|
* to set up the GL viewport with the new size
|
||||||
*/
|
*/
|
||||||
CLUTTER_SET_PRIVATE_FLAGS (CLUTTER_ACTOR (stage_x11->wrapper),
|
clutter_stage_ensure_viewport (stage);
|
||||||
CLUTTER_ACTOR_SYNC_MATRICES);
|
|
||||||
|
|
||||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (stage_x11->wrapper));
|
clutter_actor_queue_relayout (CLUTTER_ACTOR (stage_x11->wrapper));
|
||||||
}
|
}
|
||||||
|
@ -280,6 +280,9 @@ clutter_stage_x11_allocate (ClutterActor *self,
|
|||||||
stage_x11->xwin_width,
|
stage_x11->xwin_width,
|
||||||
stage_x11->xwin_height);
|
stage_x11->xwin_height);
|
||||||
|
|
||||||
|
CLUTTER_SET_PRIVATE_FLAGS (stage_x11->wrapper,
|
||||||
|
CLUTTER_STAGE_IN_RESIZE);
|
||||||
|
|
||||||
XResizeWindow (stage_x11->xdpy,
|
XResizeWindow (stage_x11->xdpy,
|
||||||
stage_x11->xwin,
|
stage_x11->xwin,
|
||||||
stage_x11->xwin_width,
|
stage_x11->xwin_width,
|
||||||
@ -472,7 +475,8 @@ clutter_stage_x11_set_fullscreen (ClutterStageWindow *stage_window,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (stage));
|
clutter_stage_ensure_viewport (CLUTTER_STAGE (stage_x11->wrapper));
|
||||||
|
clutter_actor_queue_relayout (CLUTTER_ACTOR (stage_x11->wrapper));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -547,15 +551,32 @@ clutter_stage_x11_show (ClutterStageWindow *stage_window,
|
|||||||
if (stage_x11->xwin != None)
|
if (stage_x11->xwin != None)
|
||||||
{
|
{
|
||||||
if (do_raise)
|
if (do_raise)
|
||||||
|
{
|
||||||
|
CLUTTER_NOTE (BACKEND, "Raising stage[%lu]",
|
||||||
|
(unsigned long) stage_x11->xwin);
|
||||||
XRaiseWindow (stage_x11->xdpy, stage_x11->xwin);
|
XRaiseWindow (stage_x11->xdpy, stage_x11->xwin);
|
||||||
|
}
|
||||||
|
|
||||||
if (!STAGE_X11_IS_MAPPED (stage_x11))
|
if (!STAGE_X11_IS_MAPPED (stage_x11))
|
||||||
{
|
{
|
||||||
CLUTTER_NOTE (BACKEND, "Mapping stage[%lu] (%d, %d)",
|
CLUTTER_NOTE (BACKEND, "Mapping stage[%lu]",
|
||||||
|
(unsigned long) stage_x11->xwin);
|
||||||
|
|
||||||
|
if (!stage_x11->is_foreign_xwin)
|
||||||
|
{
|
||||||
|
CLUTTER_NOTE (BACKEND, "Resizing stage[%lu] (%d, %d)",
|
||||||
(unsigned long) stage_x11->xwin,
|
(unsigned long) stage_x11->xwin,
|
||||||
stage_x11->xwin_width,
|
stage_x11->xwin_width,
|
||||||
stage_x11->xwin_height);
|
stage_x11->xwin_height);
|
||||||
|
|
||||||
|
CLUTTER_SET_PRIVATE_FLAGS (stage_x11->wrapper,
|
||||||
|
CLUTTER_STAGE_IN_RESIZE);
|
||||||
|
|
||||||
|
XResizeWindow (stage_x11->xdpy, stage_x11->xwin,
|
||||||
|
stage_x11->xwin_width,
|
||||||
|
stage_x11->xwin_height);
|
||||||
|
}
|
||||||
|
|
||||||
update_wm_hints (stage_x11);
|
update_wm_hints (stage_x11);
|
||||||
|
|
||||||
if (stage_x11->fullscreen_on_map)
|
if (stage_x11->fullscreen_on_map)
|
||||||
@ -564,8 +585,6 @@ clutter_stage_x11_show (ClutterStageWindow *stage_window,
|
|||||||
clutter_stage_x11_set_fullscreen (stage_window, FALSE);
|
clutter_stage_x11_set_fullscreen (stage_window, FALSE);
|
||||||
|
|
||||||
set_stage_state (stage_x11, STAGE_X11_WITHDRAWN, 0);
|
set_stage_state (stage_x11, STAGE_X11_WITHDRAWN, 0);
|
||||||
|
|
||||||
clutter_stage_ensure_viewport (CLUTTER_STAGE (stage_x11->wrapper));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
g_assert (STAGE_X11_IS_MAPPED (stage_x11));
|
g_assert (STAGE_X11_IS_MAPPED (stage_x11));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user