@ -17,6 +17,39 @@
# include "sway/tree/arrange.h"
# include "sway/tree/arrange.h"
# include "sway/tree/workspace.h"
# include "sway/tree/workspace.h"
struct wlr_layer_surface_v1 * toplevel_layer_surface_from_surface (
struct wlr_surface * surface ) {
struct wlr_layer_surface_v1 * layer ;
do {
if ( ! surface ) {
return NULL ;
}
// Topmost layer surface
if ( ( layer = wlr_layer_surface_v1_try_from_wlr_surface ( surface ) ) ) {
return layer ;
}
// Layer subsurface
if ( wlr_subsurface_try_from_wlr_surface ( surface ) ) {
surface = wlr_surface_get_root_surface ( surface ) ;
continue ;
}
// Layer surface popup
struct wlr_xdg_surface * xdg_popup = NULL ;
if ( ( xdg_popup = wlr_xdg_surface_try_from_wlr_surface ( surface ) ) & &
xdg_popup - > role = = WLR_XDG_SURFACE_ROLE_POPUP ) {
if ( ! xdg_popup - > popup - > parent ) {
return NULL ;
}
surface = wlr_surface_get_root_surface ( xdg_popup - > popup - > parent ) ;
continue ;
}
// Return early if the surface is not a layer/xdg_popup/sub surface
return NULL ;
} while ( true ) ;
}
static void apply_exclusive ( struct wlr_box * usable_area ,
static void apply_exclusive ( struct wlr_box * usable_area ,
uint32_t anchor , int32_t exclusive ,
uint32_t anchor , int32_t exclusive ,
int32_t margin_top , int32_t margin_right ,
int32_t margin_top , int32_t margin_right ,
@ -218,7 +251,8 @@ void arrange_layers(struct sway_output *output) {
for ( size_t i = 0 ; i < nlayers ; + + i ) {
for ( size_t i = 0 ; i < nlayers ; + + i ) {
wl_list_for_each_reverse ( layer ,
wl_list_for_each_reverse ( layer ,
& output - > layers [ layers_above_shell [ i ] ] , link ) {
& output - > layers [ layers_above_shell [ i ] ] , link ) {
if ( layer - > layer_surface - > current . keyboard_interactive & &
if ( layer - > layer_surface - > current . keyboard_interactive
= = ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE & &
layer - > layer_surface - > surface - > mapped ) {
layer - > layer_surface - > surface - > mapped ) {
topmost = layer ;
topmost = layer ;
break ;
break ;
@ -231,10 +265,12 @@ void arrange_layers(struct sway_output *output) {
struct sway_seat * seat ;
struct sway_seat * seat ;
wl_list_for_each ( seat , & server . input - > seats , link ) {
wl_list_for_each ( seat , & server . input - > seats , link ) {
seat - > has_exclusive_layer = false ;
if ( topmost ! = NULL ) {
if ( topmost ! = NULL ) {
seat_set_focus_layer ( seat , topmost - > layer_surface ) ;
seat_set_focus_layer ( seat , topmost - > layer_surface ) ;
} else if ( seat - > focused_layer & &
} else if ( seat - > focused_layer & &
! seat - > focused_layer - > current . keyboard_interactive ) {
seat - > focused_layer - > current . keyboard_interactive
! = ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE ) {
seat_set_focus_layer ( seat , NULL ) ;
seat_set_focus_layer ( seat , NULL ) ;
}
}
}
}