video_shell: Refactor listeners of Viewport_Border 44/322744/2
authorSeunghun Lee <shiin.lee@samsung.com>
Tue, 15 Apr 2025 08:34:57 +0000 (17:34 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 15 Apr 2025 09:10:26 +0000 (09:10 +0000)
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

src/bin/server/e_video_shell.c

index ae2abd3cca9c1ddd134e583febb659465d0e8584..bde5711dacec5aa84d5326e6cdd9db16bba60996 100644 (file)
@@ -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;
 }