#include "e_comp_wl_subsurface_intern.h"
#include "e_video_shell_intern.h"
#include "e_view_intern.h"
+#include "e_view_rect.h"
#include "e_view_client_intern.h"
#include <assert.h>
Eina_Bool map;
} E_Video_Viewport_State;
+typedef enum
+{
+ TOP = 0,
+ BOTTOM,
+ LEFT,
+ RIGHT,
+ NUM_DIRECTIONS,
+} Viewport_Border_Direction;
+
+typedef struct
+{
+ E_View_Tree tree;
+ E_View_Rect *interior_rect;
+ E_View_Rect *rects[NUM_DIRECTIONS];
+
+ int width;
+
+ struct wl_listener show;
+ struct wl_listener hide;
+ struct wl_listener restack;
+} Viewport_Border;
+
typedef struct
{
struct wl_resource *resource;
E_Video_Shell *shell;
E_Video_Viewport_Source *source;
- Evas_Object *border;
+ Viewport_Border *border;
E_Video_Viewport_State pending, cache, current;
static void _viewport_border_init(E_Video_Viewport *viewport);
static void _viewport_border_finish(E_Video_Viewport *viewport);
static void _viewport_border_geometry_update(E_Video_Viewport *viewport);
+static void _border_show(Viewport_Border *border);
+static void _border_hide(Viewport_Border *border);
static void
_viewport_cb_source_destroy(struct wl_listener *listener, void *data)
{
viewport->mapped = EINA_TRUE;
- if (viewport->border)
- evas_object_show(viewport->border);
+ _border_show(viewport->border);
if (viewport->source)
_source_viewport_map_state_changed(viewport->source);
viewport->mapped = EINA_FALSE;
- if (viewport->border)
- evas_object_hide(viewport->border);
+ _border_hide(viewport->border);
if (viewport->source)
_source_viewport_map_state_changed(viewport->source);
}
}
-typedef enum
-{
- TOP = 0,
- BOTTOM,
- LEFT,
- RIGHT,
- NUM_DIRECTIONS,
-} E_Video_Viewport_Border_Direction;
-
-typedef struct
+static void
+_border_rects_add(Viewport_Border *border, const int color[4])
{
- Evas_Object_Smart_Clipped_Data base;
- Evas_Object *objs[NUM_DIRECTIONS];
- Evas_Object *inner_obj;
-} E_Video_Viewport_Border_Smart_Data;
+ const int interior_color[4] = {50, 50, 50, 50};
+ int i;
-EVAS_SMART_SUBCLASS_NEW("Viewport_Border", _viewport_border,
- Evas_Smart_Class, Evas_Smart_Class,
- evas_object_smart_clipped_class_get, NULL)
+ border->interior_rect = e_view_rect_create(&border->tree, 1, 1, interior_color);
+ e_view_show(e_view_rect_view_get(border->interior_rect));
+ for (i = 0; i < NUM_DIRECTIONS; i++)
+ {
+ border->rects[i] = e_view_rect_create(&border->tree, 1, 1, color);
+ e_view_show(e_view_rect_view_get(border->rects[i]));
+ }
+}
static void
-_viewport_border_smart_add(Evas_Object *o)
+_border_show(Viewport_Border *border)
{
- EVAS_SMART_DATA_ALLOC(o, E_Video_Viewport_Border_Smart_Data);
+ if (!border) return;
+ e_view_show(e_view_tree_view_get(&border->tree));
+}
- _viewport_border_parent_sc->add(o);
+static void
+_border_hide(Viewport_Border *border)
+{
+ if (!border) return;
+ e_view_hide(e_view_tree_view_get(&border->tree));
+}
- for (int i = 0; i < NUM_DIRECTIONS; i++)
- {
- priv->objs[i] = evas_object_rectangle_add(evas_object_evas_get(o));
- evas_object_smart_member_add(priv->objs[i], o);
- evas_object_show(priv->objs[i]);
- }
+static void
+_border_place_above(Viewport_Border *border, E_View *sibling)
+{
+ e_view_reparent(e_view_tree_view_get(&border->tree), e_view_parent_get(sibling));
+ e_view_place_above(e_view_tree_view_get(&border->tree), sibling);
+}
- priv->inner_obj = evas_object_rectangle_add(evas_object_evas_get(o));
- evas_object_smart_member_add(priv->inner_obj, o);
- evas_object_color_set(priv->inner_obj, 50, 50, 50, 50);
- evas_object_show(priv->inner_obj);
+static void
+_border_move(Viewport_Border *border, int x, int y)
+{
+ e_view_position_set(e_view_tree_view_get(&border->tree), x, y);
}
static void
-_viewport_border_smart_resize(Evas_Object *o, Evas_Coord w, Evas_Coord h)
+_border_resize(Viewport_Border *border, int width, int height)
{
- E_Video_Viewport_Border_Smart_Data *priv = evas_object_smart_data_get(o);
- Evas_Coord ox, oy, ow, oh;
- const int BORDER_SIZE = 3;
+ e_view_rect_size_set(border->interior_rect, width, height);
+
+ e_view_rect_size_set(border->rects[TOP], width, border->width);
- evas_object_geometry_get(o, &ox, &oy, &ow, &oh);
- if ((ow == w) && (oh == h)) return;
+ e_view_position_set(e_view_rect_view_get(border->rects[BOTTOM]), 0, (height - border->width));
+ e_view_rect_size_set(border->rects[BOTTOM], width, border->width);
- evas_object_resize(priv->objs[TOP], w, BORDER_SIZE);
+ e_view_position_set(e_view_rect_view_get(border->rects[LEFT]), 0, border->width);
+ e_view_rect_size_set(border->rects[LEFT], border->width, height - (border->width * 2));
- evas_object_move(priv->objs[BOTTOM], ox, oy + (h - BORDER_SIZE));
- evas_object_resize(priv->objs[BOTTOM], w, BORDER_SIZE);
+ e_view_position_set(e_view_rect_view_get(border->rects[RIGHT]), width - border->width, border->width);
+ e_view_rect_size_set(border->rects[RIGHT], border->width, height - (border->width * 2));
+}
+
+static Viewport_Border *
+_border_create(E_View_Tree *parent, const int color[4])
+{
+ const int BORDER_WIDTH = 3;
+ Viewport_Border *border;
+
+ border = calloc(1, sizeof(*border));
+ if (!border)
+ return NULL;
- evas_object_move(priv->objs[LEFT], ox, oy + BORDER_SIZE);
- evas_object_resize(priv->objs[LEFT], BORDER_SIZE, h - (BORDER_SIZE * 2));
+ border->width = BORDER_WIDTH;
- evas_object_move(priv->objs[RIGHT], ox + (w - BORDER_SIZE), oy + BORDER_SIZE);
- evas_object_resize(priv->objs[RIGHT], BORDER_SIZE, h - (BORDER_SIZE * 2));
+ e_view_tree_init(&border->tree, NULL, parent);
+ _border_rects_add(border, color);
- evas_object_resize(priv->inner_obj, w, h);
+ return border;
}
static void
-_viewport_border_smart_set_user(Evas_Smart_Class *sc)
+_border_destroy(Viewport_Border *border)
{
- sc->add = _viewport_border_smart_add;
- sc->resize = _viewport_border_smart_resize;
+ e_view_destroy(e_view_tree_view_get(&border->tree));
+
+ wl_list_remove(&border->show.link);
+ wl_list_remove(&border->hide.link);
+ wl_list_remove(&border->restack.link);
+ free(border);
}
static void
-_viewport_border_cb_show(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+_border_cb_show(struct wl_listener *listener, void *data)
{
- E_Video_Viewport *viewport = data;
+ Viewport_Border *border = wl_container_of(listener, border, show);
- evas_object_show(viewport->border);
+ _border_show(border);
}
static void
-_viewport_border_cb_hide(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+_border_cb_hide(struct wl_listener *listener, void *data)
{
- E_Video_Viewport *viewport = data;
+ Viewport_Border *border = wl_container_of(listener, border, hide);
- evas_object_hide(viewport->border);
+ _border_hide(border);
}
static void
-_viewport_border_cb_restack(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED)
+_border_cb_restack(struct wl_listener *listener, void *data)
{
- E_Video_Viewport *viewport = data;
+ Viewport_Border *border = wl_container_of(listener, border, restack);
- evas_object_layer_set(viewport->border, evas_object_layer_get(obj));
- evas_object_stack_above(viewport->border, obj);
+ _border_place_above(border, ((E_View_Event_Callback_Data *)data)->view);
}
static void
_viewport_border_init(E_Video_Viewport *viewport)
{
E_Client *ec;
- E_Client *parent_ec;
+ E_View *view;
+ E_View_Client *parent_view;
+ Viewport_Border *border;
+ const int color[4] = {255, 0, 0, 255};
if (viewport->border)
return;
else
ec = e_surface_ec_get(e_subsurface_surface_get(viewport->subsurface));
- viewport->border = evas_object_smart_add(evas_object_evas_get(ec->frame), _viewport_border_smart_class_new());
- evas_object_color_set(viewport->border, 255, 0, 0, 255);
- evas_object_layer_set(viewport->border, evas_object_layer_get(ec->frame));
- evas_object_stack_above(viewport->border, ec->frame);
+ view = e_view_client_view_get(e_client_view_get(ec));
+ border = _border_create(e_view_parent_get(view), color);
+ if (!border)
+ {
+ VS_ERR("Failed to create Viewport_Border");
+ return;
+ }
+ _border_place_above(border, view);
+
+ 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);
- parent_ec = e_surface_ec_get(e_subsurface_parent_try_get(viewport->subsurface));
- if (evas_object_visible_get(parent_ec->frame))
- evas_object_show(viewport->border);
+ border->restack.notify = _border_cb_restack;
+ e_view_event_listener_add(view, E_VIEW_RESTACK, &border->restack);
- evas_object_event_callback_add(parent_ec->frame, EVAS_CALLBACK_SHOW, _viewport_border_cb_show, viewport);
- evas_object_event_callback_add(parent_ec->frame, EVAS_CALLBACK_HIDE, _viewport_border_cb_hide, viewport);
- evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_RESTACK, _viewport_border_cb_restack, viewport);
+ viewport->border = border;
}
static void
_viewport_border_finish(E_Video_Viewport *viewport)
{
- E_Surface *parent_surface;
- E_Client *ec, *parent_ec;
-
if (!viewport->border)
return;
- if (viewport->source)
- ec = e_surface_ec_get(viewport->source->surface->surface);
- else
- ec = e_surface_ec_get(e_subsurface_surface_get(viewport->subsurface));
-
- parent_surface = e_subsurface_parent_try_get(viewport->subsurface);
- if (parent_surface)
- {
- parent_ec = e_surface_ec_get(parent_surface);
- evas_object_event_callback_del(parent_ec->frame, EVAS_CALLBACK_SHOW, _viewport_border_cb_show);
- evas_object_event_callback_del(parent_ec->frame, EVAS_CALLBACK_HIDE, _viewport_border_cb_hide);
- }
-
- evas_object_event_callback_del(ec->frame, EVAS_CALLBACK_RESTACK, _viewport_border_cb_restack);
- evas_object_del(viewport->border);
+ _border_destroy(viewport->border);
viewport->border = NULL;
}
{
int x, y;
- if (!viewport->border)
+ if ((!viewport->border) ||
+ (viewport->current.width <= 0 || viewport->current.height <= 0))
return;
e_subsurface_coord_get(viewport->subsurface, &x, &y);
- evas_object_move(viewport->border, x, y);
- evas_object_resize(viewport->border, viewport->current.width, viewport->current.height);
+ _border_move(viewport->border, x, y);
+ _border_resize(viewport->border, viewport->current.width, viewport->current.height);
}