@ -198,16 +198,8 @@ static void xdg_surface_unmap(struct wlr_xdg_surface_v6 *surface) {
wlr_signal_emit_safe ( & surface - > events . unmap , surface ) ;
wlr_signal_emit_safe ( & surface - > events . unmap , surface ) ;
}
}
if ( surface - > role = = WLR_XDG_SURFACE_V6_ROLE_TOPLEVEL ) {
if ( surface - > role = = WLR_XDG_SURFACE_V6_ROLE_POPUP & &
wl_resource_set_user_data ( surface - > toplevel - > resource , NULL ) ;
surface - > popup - > seat ! = NULL ) {
free ( surface - > toplevel ) ;
surface - > toplevel = NULL ;
}
if ( surface - > role = = WLR_XDG_SURFACE_V6_ROLE_POPUP ) {
wl_resource_set_user_data ( surface - > popup - > resource , NULL ) ;
if ( surface - > popup - > seat ) {
struct wlr_xdg_popup_grab_v6 * grab =
struct wlr_xdg_popup_grab_v6 * grab =
xdg_shell_popup_grab_from_seat ( surface - > client - > shell ,
xdg_shell_popup_grab_from_seat ( surface - > client - > shell ,
surface - > popup - > seat ) ;
surface - > popup - > seat ) ;
@ -222,11 +214,8 @@ static void xdg_surface_unmap(struct wlr_xdg_surface_v6 *surface) {
wlr_seat_keyboard_end_grab ( grab - > seat ) ;
wlr_seat_keyboard_end_grab ( grab - > seat ) ;
}
}
}
}
}
wl_list_remove ( & surface - > popup - > link ) ;
surface - > popup - > seat = NULL ;
free ( surface - > popup ) ;
surface - > popup = NULL ;
}
}
struct wlr_xdg_surface_v6_configure * configure , * tmp ;
struct wlr_xdg_surface_v6_configure * configure , * tmp ;
@ -234,13 +223,12 @@ static void xdg_surface_unmap(struct wlr_xdg_surface_v6 *surface) {
xdg_surface_configure_destroy ( configure ) ;
xdg_surface_configure_destroy ( configure ) ;
}
}
surface - > role = WLR_XDG_SURFACE_V6_ROLE_NONE ;
free ( surface - > title ) ;
free ( surface - > title ) ;
surface - > title = NULL ;
surface - > title = NULL ;
free ( surface - > app_id ) ;
free ( surface - > app_id ) ;
surface - > app_id = NULL ;
surface - > app_id = NULL ;
surface - > added = surface - > configured = surface - > mapped = false ;
surface - > configured = surface - > mapped = false ;
surface - > configure_serial = 0 ;
surface - > configure_serial = 0 ;
if ( surface - > configure_idle ) {
if ( surface - > configure_idle ) {
wl_event_source_remove ( surface - > configure_idle ) ;
wl_event_source_remove ( surface - > configure_idle ) ;
@ -253,6 +241,29 @@ static void xdg_surface_unmap(struct wlr_xdg_surface_v6 *surface) {
memset ( & surface - > next_geometry , 0 , sizeof ( struct wlr_box ) ) ;
memset ( & surface - > next_geometry , 0 , sizeof ( struct wlr_box ) ) ;
}
}
static void xdg_toplevel_destroy ( struct wlr_xdg_surface_v6 * surface ) {
assert ( surface - > role = = WLR_XDG_SURFACE_V6_ROLE_TOPLEVEL ) ;
xdg_surface_unmap ( surface ) ;
wl_resource_set_user_data ( surface - > toplevel - > resource , NULL ) ;
free ( surface - > toplevel ) ;
surface - > toplevel = NULL ;
surface - > role = WLR_XDG_SURFACE_V6_ROLE_NONE ;
}
static void xdg_popup_destroy ( struct wlr_xdg_surface_v6 * surface ) {
assert ( surface - > role = = WLR_XDG_SURFACE_V6_ROLE_POPUP ) ;
xdg_surface_unmap ( surface ) ;
wl_resource_set_user_data ( surface - > popup - > resource , NULL ) ;
wl_list_remove ( & surface - > popup - > link ) ;
free ( surface - > popup ) ;
surface - > popup = NULL ;
surface - > role = WLR_XDG_SURFACE_V6_ROLE_NONE ;
}
static void xdg_surface_destroy ( struct wlr_xdg_surface_v6 * surface ) {
static void xdg_surface_destroy ( struct wlr_xdg_surface_v6 * surface ) {
if ( surface - > role ! = WLR_XDG_SURFACE_V6_ROLE_NONE ) {
if ( surface - > role ! = WLR_XDG_SURFACE_V6_ROLE_NONE ) {
xdg_surface_unmap ( surface ) ;
xdg_surface_unmap ( surface ) ;
@ -260,6 +271,18 @@ static void xdg_surface_destroy(struct wlr_xdg_surface_v6 *surface) {
wlr_signal_emit_safe ( & surface - > events . destroy , surface ) ;
wlr_signal_emit_safe ( & surface - > events . destroy , surface ) ;
switch ( surface - > role ) {
case WLR_XDG_SURFACE_V6_ROLE_TOPLEVEL :
xdg_toplevel_destroy ( surface ) ;
break ;
case WLR_XDG_SURFACE_V6_ROLE_POPUP :
xdg_popup_destroy ( surface ) ;
break ;
case WLR_XDG_SURFACE_V6_ROLE_NONE :
// This space is intentionally left blank
break ;
}
wl_resource_set_user_data ( surface - > resource , NULL ) ;
wl_resource_set_user_data ( surface - > resource , NULL ) ;
wl_list_remove ( & surface - > link ) ;
wl_list_remove ( & surface - > link ) ;
wl_list_remove ( & surface - > surface_destroy_listener . link ) ;
wl_list_remove ( & surface - > surface_destroy_listener . link ) ;
@ -545,7 +568,7 @@ static void xdg_popup_resource_destroy(struct wl_resource *resource) {
struct wlr_xdg_surface_v6 * surface =
struct wlr_xdg_surface_v6 * surface =
xdg_surface_from_xdg_popup_resource ( resource ) ;
xdg_surface_from_xdg_popup_resource ( resource ) ;
if ( surface ! = NULL ) {
if ( surface ! = NULL ) {
xdg_ surface_unmap ( surface ) ;
xdg_ popup_destroy ( surface ) ;
}
}
}
}
@ -856,7 +879,7 @@ static void xdg_toplevel_resource_destroy(struct wl_resource *resource) {
struct wlr_xdg_surface_v6 * surface =
struct wlr_xdg_surface_v6 * surface =
xdg_surface_from_xdg_toplevel_resource ( resource ) ;
xdg_surface_from_xdg_toplevel_resource ( resource ) ;
if ( surface ! = NULL ) {
if ( surface ! = NULL ) {
xdg_ surface_unmap ( surface ) ;
xdg_ toplevel_destroy ( surface ) ;
}
}
}
}