From: Seunghun Lee Date: Tue, 15 Apr 2025 08:34:57 +0000 (+0900) Subject: video_shell: Refactor listeners of Viewport_Border X-Git-Tag: accepted/tizen/unified/20250416.040904~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=053e15efb0a66467f90d3be23bbede878383976b;p=platform%2Fupstream%2Fenlightenment.git video_shell: Refactor listeners of Viewport_Border This patch ensures that `e_view_event_listener_del()` is used for a listener added by calling `e_view_event_listener_add()`. Otherwise, the corresponding Evas object event cannot be properly destroyed. This issue is addressed in this patch. Additionally, this patch cleans up listeners of Viewport_Border. Change-Id: I6b1c41cd607b3941a40ea809e9554ee48c6761ee --- diff --git a/src/bin/server/e_video_shell.c b/src/bin/server/e_video_shell.c index ae2abd3cca..bde5711dac 100644 --- a/src/bin/server/e_video_shell.c +++ b/src/bin/server/e_video_shell.c @@ -62,12 +62,14 @@ typedef struct E_View_Tree tree; E_View_Rect *interior_rect; E_View_Rect *rects[NUM_DIRECTIONS]; + E_View *parent_view; int width; struct wl_listener show; struct wl_listener hide; struct wl_listener restack; + struct wl_listener parent_view_destroy; } Viewport_Border; typedef struct @@ -2218,14 +2220,21 @@ _border_create(E_View_Tree *parent, const int color[4]) } static void -_border_destroy(Viewport_Border *border) +_border_parent_view_client_unlink(Viewport_Border *border) { - e_view_destroy(e_view_tree_view_get(&border->tree)); - + e_view_event_listener_del(border->parent_view, E_VIEW_RESTACK, &border->restack); wl_list_remove(&border->show.link); wl_list_remove(&border->hide.link); - wl_list_remove(&border->restack.link); - free(border); + wl_list_remove(&border->parent_view_destroy.link); + border->parent_view = NULL; +} + +static void +_border_cb_parent_view_destroy(struct wl_listener *listener, void *data) +{ + Viewport_Border *border = wl_container_of(listener, border, parent_view_destroy); + + _border_parent_view_client_unlink(border); } static void @@ -2252,12 +2261,43 @@ _border_cb_restack(struct wl_listener *listener, void *data) _border_place_above(border, ((E_View_Event_Callback_Data *)data)->view); } +static void +_border_parent_view_client_link(Viewport_Border *border, E_View_Client *view_client) +{ + E_View *view = e_view_client_view_get(view_client); + + border->parent_view = view; + + border->parent_view_destroy.notify = _border_cb_parent_view_destroy; + e_view_destroy_listener_add(view, &border->parent_view_destroy); + + border->show.notify = _border_cb_show; + e_view_client_show_listener_add(view_client, &border->show); + + border->hide.notify = _border_cb_hide; + e_view_client_hide_listener_add(view_client, &border->hide); + + border->restack.notify = _border_cb_restack; + e_view_event_listener_add(view, E_VIEW_RESTACK, &border->restack); +} + +static void +_border_destroy(Viewport_Border *border) +{ + e_view_destroy(e_view_tree_view_get(&border->tree)); + + if (border->parent_view) + _border_parent_view_client_unlink(border); + + free(border); +} + static void _viewport_border_init(E_Video_Viewport *viewport) { E_Client *ec; + E_View_Client *view_client; E_View *view; - E_View_Client *parent_view; Viewport_Border *border; const int color[4] = {255, 0, 0, 255}; @@ -2269,7 +2309,8 @@ _viewport_border_init(E_Video_Viewport *viewport) else ec = e_surface_ec_get(e_subsurface_surface_get(viewport->subsurface)); - view = e_view_client_view_get(e_client_view_get(ec)); + view_client = e_client_view_get(ec); + view = e_view_client_view_get(view_client); border = _border_create(e_view_parent_get(view), color); if (!border) { @@ -2281,15 +2322,7 @@ _viewport_border_init(E_Video_Viewport *viewport) if (e_view_visible_get(view)) _border_show(border); - parent_view = e_client_view_get(e_surface_ec_get(e_subsurface_parent_try_get(viewport->subsurface))); - border->show.notify = _border_cb_show; - e_view_client_show_listener_add(parent_view, &border->show); - - border->hide.notify = _border_cb_hide; - e_view_client_hide_listener_add(parent_view, &border->hide); - - border->restack.notify = _border_cb_restack; - e_view_event_listener_add(view, E_VIEW_RESTACK, &border->restack); + _border_parent_view_client_link(border, view_client); viewport->border = border; }