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
}
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
_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};
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)
{
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;
}