@ -181,21 +181,14 @@ struct sway_container *output_get_active_workspace(struct sway_output *output) {
return workspace ;
return workspace ;
}
}
bool output_has_opaque_lockscreen ( struct sway_output * output ,
bool output_has_opaque_overlay_layer_surface ( struct sway_output * output ) {
struct sway_seat * seat ) {
if ( ! seat - > exclusive_client ) {
return false ;
}
struct wlr_layer_surface * wlr_layer_surface ;
struct wlr_layer_surface * wlr_layer_surface ;
wl_list_for_each ( wlr_layer_surface , & server . layer_shell - > surfaces , link ) {
wl_list_for_each ( wlr_layer_surface , & server . layer_shell - > surfaces , link ) {
if ( wlr_layer_surface - > output ! = output - > wlr_output ) {
if ( wlr_layer_surface - > output ! = output - > wlr_output | |
wlr_layer_surface - > layer ! = ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY ) {
continue ;
continue ;
}
}
struct wlr_surface * wlr_surface = wlr_layer_surface - > surface ;
struct wlr_surface * wlr_surface = wlr_layer_surface - > surface ;
if ( wlr_surface - > resource - > client ! = seat - > exclusive_client ) {
continue ;
}
struct sway_layer_surface * sway_layer_surface =
struct sway_layer_surface * sway_layer_surface =
layer_from_wlr_layer_surface ( wlr_layer_surface ) ;
layer_from_wlr_layer_surface ( wlr_layer_surface ) ;
pixman_box32_t output_box = {
pixman_box32_t output_box = {
@ -221,16 +214,11 @@ struct send_frame_done_data {
struct root_geometry root_geo ;
struct root_geometry root_geo ;
struct sway_output * output ;
struct sway_output * output ;
struct timespec * when ;
struct timespec * when ;
struct wl_client * exclusive_client ;
} ;
} ;
static void send_frame_done_iterator ( struct wlr_surface * surface ,
static void send_frame_done_iterator ( struct wlr_surface * surface ,
int sx , int sy , void * _data ) {
int sx , int sy , void * _data ) {
struct send_frame_done_data * data = _data ;
struct send_frame_done_data * data = _data ;
if ( data - > exclusive_client & &
data - > exclusive_client ! = surface - > resource - > client ) {
return ;
}
bool intersects = output_get_surface_box ( & data - > root_geo , data - > output , surface ,
bool intersects = output_get_surface_box ( & data - > root_geo , data - > output , surface ,
sx , sy , NULL ) ;
sx , sy , NULL ) ;
@ -279,14 +267,15 @@ static void send_frame_done_container(struct send_frame_done_data *data,
}
}
static void send_frame_done ( struct sway_output * output , struct timespec * when ) {
static void send_frame_done ( struct sway_output * output , struct timespec * when ) {
struct sway_seat * seat = input_manager_current_seat ( input_manager ) ;
struct send_frame_done_data data = {
struct send_frame_done_data data = {
. output = output ,
. output = output ,
. when = when ,
. when = when ,
. exclusive_client = output_has_opaque_lockscreen ( output , seat ) ?
seat - > exclusive_client : NULL ,
} ;
} ;
if ( output_has_opaque_overlay_layer_surface ( output ) ) {
goto send_frame_overlay ;
}
struct sway_container * workspace = output_get_active_workspace ( output ) ;
struct sway_container * workspace = output_get_active_workspace ( output ) ;
if ( workspace - > current . ws_fullscreen ) {
if ( workspace - > current . ws_fullscreen ) {
send_frame_done_container_iterator (
send_frame_done_container_iterator (
@ -311,6 +300,7 @@ static void send_frame_done(struct sway_output *output, struct timespec *when) {
& output - > layers [ ZWLR_LAYER_SHELL_V1_LAYER_TOP ] ) ;
& output - > layers [ ZWLR_LAYER_SHELL_V1_LAYER_TOP ] ) ;
}
}
send_frame_overlay :
send_frame_done_layer ( & data ,
send_frame_done_layer ( & data ,
& output - > layers [ ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY ] ) ;
& output - > layers [ ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY ] ) ;
send_frame_done_drag_icons ( & data , & root_container . sway_root - > drag_icons ) ;
send_frame_done_drag_icons ( & data , & root_container . sway_root - > drag_icons ) ;