@ -6608,6 +6608,18 @@ weston_output_set_position(struct weston_output *output, int x, int y)
WL_EXPORT void
weston_output_move ( struct weston_output * output , int x , int y )
{
/* XXX: we should probably perform some sanity checking here
* as we do for weston_output_enable , and allow moves to fail .
*
* However , while a front - end is rearranging outputs it may
* pass through indeterminate states where outputs overlap
* or are discontinuous , and this may be ok as long as no
* input processing or rendering occurs at that time .
*
* Ultimately , we probably need a way to pass complete output
* config atomically to libweston .
*/
output - > compositor - > output_flow_dirty = true ;
weston_output_set_position ( output , x , y ) ;
}
@ -7230,6 +7242,45 @@ weston_output_create_heads_string(struct weston_output *output)
return str ;
}
static bool
weston_outputs_overlap ( struct weston_output * a , struct weston_output * b )
{
bool overlap ;
pixman_region32_t intersection ;
pixman_region32_init ( & intersection ) ;
pixman_region32_intersect ( & intersection , & a - > region , & b - > region ) ;
overlap = pixman_region32_not_empty ( & intersection ) ;
pixman_region32_fini ( & intersection ) ;
return overlap ;
}
/* This only works if the output region is current!
*
* That means we shouldn ' t expect it to return usable results unless
* the output is at least undergoing enabling .
*/
static bool
weston_output_placement_ok ( struct weston_output * output )
{
struct weston_compositor * c = output - > compositor ;
struct weston_output * iter ;
wl_list_for_each ( iter , & c - > output_list , link ) {
if ( ! iter - > enabled )
continue ;
if ( weston_outputs_overlap ( iter , output ) ) {
weston_log ( " Error: output '%s' overlaps enabled output '%s'. \n " ,
output - > name , iter - > name ) ;
return false ;
}
}
return true ;
}
/** Constructs a weston_output object that can be used by the compositor.
*
* \ param output The weston_output object that needs to be enabled . Must not
@ -7309,6 +7360,11 @@ weston_output_enable(struct weston_output *output)
weston_output_transform_scale_init ( output , output - > transform , output - > scale ) ;
weston_output_init_geometry ( output , output - > x , output - > y ) ;
/* At this point we have a valid region so we can check placement. */
if ( ! weston_output_placement_ok ( output ) )
return - 1 ;
weston_output_damage ( output ) ;
wl_list_init ( & output - > animation_list ) ;