@ -82,6 +82,7 @@ struct desktop_shell {
struct weston_layer panel_layer ;
struct weston_layer panel_layer ;
struct weston_layer background_layer ;
struct weston_layer background_layer ;
struct weston_layer lock_layer ;
struct weston_layer lock_layer ;
struct weston_layer input_panel_layer ;
struct wl_listener pointer_focus_listener ;
struct wl_listener pointer_focus_listener ;
struct weston_surface * grab_surface ;
struct weston_surface * grab_surface ;
@ -96,6 +97,7 @@ struct desktop_shell {
} child ;
} child ;
bool locked ;
bool locked ;
bool showing_input_panels ;
bool prepare_event_sent ;
bool prepare_event_sent ;
struct weston_surface * lock_surface ;
struct weston_surface * lock_surface ;
@ -2011,7 +2013,14 @@ resume_desktop(struct desktop_shell *shell)
& shell - > fullscreen_layer . link ) ;
& shell - > fullscreen_layer . link ) ;
wl_list_insert ( & shell - > fullscreen_layer . link ,
wl_list_insert ( & shell - > fullscreen_layer . link ,
& shell - > panel_layer . link ) ;
& shell - > panel_layer . link ) ;
wl_list_insert ( & shell - > panel_layer . link , & ws - > layer . link ) ;
if ( shell - > showing_input_panels ) {
wl_list_insert ( & shell - > panel_layer . link ,
& shell - > input_panel_layer . link ) ;
wl_list_insert ( & shell - > input_panel_layer . link ,
& ws - > layer . link ) ;
} else {
wl_list_insert ( & shell - > panel_layer . link , & ws - > layer . link ) ;
}
restore_focus_state ( shell , get_current_workspace ( shell ) ) ;
restore_focus_state ( shell , get_current_workspace ( shell ) ) ;
@ -2473,6 +2482,8 @@ lock(struct wl_listener *listener, void *data)
wl_list_remove ( & shell - > panel_layer . link ) ;
wl_list_remove ( & shell - > panel_layer . link ) ;
wl_list_remove ( & shell - > fullscreen_layer . link ) ;
wl_list_remove ( & shell - > fullscreen_layer . link ) ;
if ( shell - > showing_input_panels )
wl_list_remove ( & shell - > input_panel_layer . link ) ;
wl_list_remove ( & ws - > layer . link ) ;
wl_list_remove ( & ws - > layer . link ) ;
wl_list_insert ( & shell - > compositor - > cursor_layer . link ,
wl_list_insert ( & shell - > compositor - > cursor_layer . link ,
& shell - > lock_layer . link ) ;
& shell - > lock_layer . link ) ;
@ -2512,14 +2523,20 @@ static void
show_input_panels ( struct wl_listener * listener , void * data )
show_input_panels ( struct wl_listener * listener , void * data )
{
{
struct desktop_shell * shell =
struct desktop_shell * shell =
container_of ( listener , struct desktop_shell , show_input_panel_listener ) ;
container_of ( listener , struct desktop_shell ,
show_input_panel_listener ) ;
struct input_panel_surface * surface , * next ;
struct input_panel_surface * surface , * next ;
struct weston_surface * ws ;
struct weston_surface * ws ;
shell - > showing_input_panels = true ;
wl_list_insert ( & shell - > panel_layer . link ,
& shell - > input_panel_layer . link ) ;
wl_list_for_each_safe ( surface , next ,
wl_list_for_each_safe ( surface , next ,
& shell - > input_panel . surfaces , link ) {
& shell - > input_panel . surfaces , link ) {
ws = surface - > surface ;
ws = surface - > surface ;
wl_list_insert ( & shell - > panel_layer . surface_list ,
wl_list_insert ( & shell - > input_ panel_layer. surface_list ,
& ws - > layer_link ) ;
& ws - > layer_link ) ;
weston_surface_assign_output ( ws ) ;
weston_surface_assign_output ( ws ) ;
weston_surface_damage ( ws ) ;
weston_surface_damage ( ws ) ;
@ -2527,20 +2544,21 @@ show_input_panels(struct wl_listener *listener, void *data)
}
}
}
}
static void
input_panel_configure ( struct weston_surface * surface , int32_t sx , int32_t sy ) ;
static void
static void
hide_input_panels ( struct wl_listener * listener , void * data )
hide_input_panels ( struct wl_listener * listener , void * data )
{
{
struct desktop_shell * shell =
struct desktop_shell * shell =
container_of ( listener , struct desktop_shell , hide_input_panel_listener ) ;
container_of ( listener , struct desktop_shell ,
hide_input_panel_listener ) ;
struct weston_surface * surface , * next ;
struct weston_surface * surface , * next ;
shell - > showing_input_panels = false ;
wl_list_remove ( & shell - > input_panel_layer . link ) ;
wl_list_for_each_safe ( surface , next ,
wl_list_for_each_safe ( surface , next ,
& shell - > panel_layer . surface_list , layer_link )
& shell - > input_panel_layer . surface_list , layer_link )
if ( surface - > configure = = input_panel_configure )
weston_surface_unmap ( surface ) ;
weston_surface_unmap ( surface ) ;
}
}
static void
static void
@ -3375,6 +3393,7 @@ shell_init(struct weston_compositor *ec)
weston_layer_init ( & shell - > panel_layer , & shell - > fullscreen_layer . link ) ;
weston_layer_init ( & shell - > panel_layer , & shell - > fullscreen_layer . link ) ;
weston_layer_init ( & shell - > background_layer , & shell - > panel_layer . link ) ;
weston_layer_init ( & shell - > background_layer , & shell - > panel_layer . link ) ;
weston_layer_init ( & shell - > lock_layer , NULL ) ;
weston_layer_init ( & shell - > lock_layer , NULL ) ;
weston_layer_init ( & shell - > input_panel_layer , NULL ) ;
wl_array_init ( & shell - > workspaces . array ) ;
wl_array_init ( & shell - > workspaces . array ) ;