using json = nlohmann::json;
-template <typename T>
-json_object *to_json_(T const *s) {
+json_object *to_json(genivi::surface_properties const &s) {
auto j = json::object({
- {"id", s->id},
- {"size", {{"width", s->size.w}, {"height", s->size.h}}},
+ {"id", s.id},
+ {"size", {{"width", s.size.w}, {"height", s.size.h}}},
{"dst",
- {{"width", s->dst_rect.w},
- {"height", s->dst_rect.h},
- {"x", s->dst_rect.x},
- {"y", s->dst_rect.y}}},
+ {{"width", s.dst_rect.w},
+ {"height", s.dst_rect.h},
+ {"x", s.dst_rect.x},
+ {"y", s.dst_rect.y}}},
{"src",
- {{"width", s->src_rect.w},
- {"height", s->src_rect.h},
- {"x", s->src_rect.x},
- {"y", s->src_rect.y}}},
- {"visibility", s->visibility},
- {"opacity", s->opacity},
- {"orientation", s->orientation},
+ {{"width", s.src_rect.w},
+ {"height", s.src_rect.h},
+ {"x", s.src_rect.x},
+ {"y", s.src_rect.y}}},
+ {"visibility", s.visibility},
+ {"opacity", s.opacity},
+ {"orientation", s.orientation},
});
return json_tokener_parse(j.dump().c_str());
}
-json_object *to_json(genivi::surface const *s) { return to_json_(s); }
-
-json_object *to_json(genivi::layer const *l) { return to_json_(l); }
-
json_object *to_json(genivi::screen const *s) {
auto o = json_object_new_object();
json_object_object_add(o, "id", json_object_new_int(s->id));
if (!s.empty()) {
for (auto const &i : s) {
- json_object_array_add(a, to_json(i.second.get()));
+ json_object_array_add(a, to_json(i.second));
}
}
return a;
}
-json_object *to_json(genivi::controller::surface_map_type const &s) {
- return to_json_(s);
-}
-
-json_object *to_json(genivi::controller::layer_map_type const &l) {
- return to_json_(l);
-}
-
-json_object *to_json(genivi::controller::screen_map_type const &s) {
+json_object *to_json(genivi::controller::props_map const &s) {
return to_json_(s);
}
c->remove_proxy_to_id_mapping(l);
ivi_controller_layer_destroy(l, 1);
}),
- controller_child(c, i),
- dst_rect{},
- src_rect{},
- size{},
- orientation{},
- visibility{},
- opacity{} {
+ controller_child(c, i) {
this->parent->add_proxy_to_id_mapping(this->proxy.get(), i);
ivi_controller_layer_add_listener(this->proxy.get(), &layer_listener, this);
}
void controller::layer_visibility(struct layer *l, int32_t visibility) {
logdebug("genivi::layer %s @ %p v %i", __func__, this->proxy.get(),
visibility);
- l->visibility = visibility;
+ this->lprops[l->id].visibility = visibility;
}
void controller::layer_opacity(struct layer *l, float opacity) {
logdebug("genivi::layer %s @ %p o %f", __func__, this->proxy.get(), opacity);
- l->opacity = opacity;
+ this->lprops[l->id].opacity = opacity;
}
void controller::layer_source_rectangle(struct layer *l, int32_t x, int32_t y,
int32_t width, int32_t height) {
logdebug("genivi::layer %s @ %p x %i y %i w %i h %i", __func__,
this->proxy.get(), x, y, width, height);
- l->src_rect = rect{uint32_t(width), uint32_t(height), x, y};
+ this->lprops[l->id].src_rect = rect{uint32_t(width), uint32_t(height), x, y};
}
void controller::layer_destination_rectangle(struct layer *l, int32_t x,
int32_t height) {
logdebug("genivi::layer %s @ %p x %i y %i w %i h %i", __func__,
this->proxy.get(), x, y, width, height);
- l->dst_rect = rect{uint32_t(width), uint32_t(height), x, y};
+ this->lprops[l->id].dst_rect = rect{uint32_t(width), uint32_t(height), x, y};
}
void controller::layer_configuration(struct layer *l, int32_t width,
int32_t height) {
logdebug("genivi::layer %s @ %p w %i h %i", __func__, this->proxy.get(),
width, height);
- l->size = size{uint32_t(width), uint32_t(height)};
+ this->lprops[l->id].size = size{uint32_t(width), uint32_t(height)};
}
void controller::layer_orientation(struct layer *l, int32_t orientation) {
logdebug("genivi::layer %s @ %p o %i", __func__, this->proxy.get(),
orientation);
- l->orientation = orientation;
+ this->lprops[l->id].orientation = orientation;
}
void controller::layer_screen(struct layer * /*l*/, struct wl_output *screen) {
void controller::layer_destroyed(struct layer *l) {
logdebug("genivi::layer %s @ %p", __func__, this->proxy.get());
add_task("remove layer",
- [l](struct controller *c) { c->layers.erase(l->id); });
+ [l](struct controller *c) {
+ c->lprops.erase(l->id);
+ c->layers.erase(l->id);
+ });
}
// __
c->remove_proxy_to_id_mapping(s);
ivi_controller_surface_destroy(s, 1);
}),
- controller_child(c, i),
- dst_rect{},
- src_rect{},
- size{},
- orientation{},
- visibility{},
- opacity{1.f} {
+ controller_child(c, i) {
this->parent->add_proxy_to_id_mapping(this->proxy.get(), i);
ivi_controller_surface_add_listener(this->proxy.get(), &surface_listener,
this);
void controller::surface_visibility(struct surface *s, int32_t visibility) {
logdebug("genivi::surface %s @ %p v %i", __func__, this->proxy.get(),
visibility);
- s->visibility = visibility;
+ this->sprops[s->id].visibility = visibility;
}
void controller::surface_opacity(struct surface *s, float opacity) {
logdebug("genivi::surface %s @ %p o %f", __func__, this->proxy.get(),
opacity);
- s->opacity = opacity;
+ this->sprops[s->id].opacity = opacity;
}
void controller::surface_source_rectangle(struct surface *s, int32_t x,
int32_t height) {
logdebug("genivi::surface %s @ %p x %i y %i w %i h %i", __func__,
this->proxy.get(), x, y, width, height);
- s->src_rect = rect{uint32_t(width), uint32_t(height), x, y};
+ this->sprops[s->id].src_rect = rect{uint32_t(width), uint32_t(height), x, y};
}
void controller::surface_destination_rectangle(struct surface *s, int32_t x,
int32_t height) {
logdebug("genivi::surface %s @ %p x %i y %i w %i h %i", __func__,
this->proxy.get(), x, y, width, height);
- s->dst_rect = rect{uint32_t(width), uint32_t(height), x, y};
+ this->sprops[s->id].dst_rect = rect{uint32_t(width), uint32_t(height), x, y};
}
void controller::surface_configuration(struct surface *s, int32_t width,
int32_t height) {
logdebug("genivi::surface %s @ %p w %i h %i", __func__, this->proxy.get(),
width, height);
- s->size = size{uint32_t(width), uint32_t(height)};
+ this->sprops[s->id].size = size{uint32_t(width), uint32_t(height)};
}
void controller::surface_orientation(struct surface *s, int32_t orientation) {
logdebug("genivi::surface %s @ %p o %i", __func__, this->proxy.get(),
orientation);
- s->orientation = orientation;
+ this->sprops[s->id].orientation = orientation;
}
void controller::surface_pixelformat(struct surface * /*s*/,
void controller::surface_destroyed(struct surface *s) {
logdebug("genivi::surface %s @ %p", __func__, this->proxy.get());
+ this->sprops.erase(s->id);
this->surfaces.erase(s->id);
}
content_state);
if (content_state == IVI_CONTROLLER_SURFACE_CONTENT_STATE_CONTENT_REMOVED) {
add_task("remove surface",
- [s](struct controller *c) { c->surfaces.erase(s->id); });
+ [s](struct controller *c) {
+ c->sprops.erase(s->id);
+ c->surfaces.erase(s->id);
+ });
}
}
void controller::add_proxy_to_id_mapping(struct ivi_controller_surface *p,
uint32_t id) {
- this->surface_proxy_to_id[uintptr_t(p)] = id;
logdebug("Add surface proxy mapping for %p (%u)", p, id);
+ this->surface_proxy_to_id[uintptr_t(p)] = id;
+ this->sprops[id].id = id;
}
void controller::remove_proxy_to_id_mapping(struct ivi_controller_surface *p) {
uint32_t id) {
logdebug("Add layer proxy mapping for %p (%u)", p, id);
this->layer_proxy_to_id[uintptr_t(p)] = id;
+ this->lprops[id].id = id;
}
void controller::remove_proxy_to_id_mapping(struct ivi_controller_layer *p) {
}
}
-void controller::debug_dump_current_status() {
- if (!this->surfaces.empty()) {
- puts("Surfaces:");
- for (auto const &i : this->surfaces) {
- auto const &r = i.second->dst_rect;
- auto const &s = i.second->size;
- printf("%d [%ux%u] (%ux%u@%dx%d), ", i.first, s.w, s.h, r.w, r.h, r.x,
- r.y);
- }
- puts("\b\b ");
- }
-
- if (!this->layers.empty()) {
- puts("Layers:");
- for (auto const &i : this->layers) {
- auto const &r = i.second->dst_rect;
- auto const &s = i.second->size;
- printf("%d [%ux%u] (%ux%u@%dx%d), ", i.first, s.w, s.h, r.w, r.h, r.x,
- r.y);
- }
- puts("\b\b ");
- }
-}
-
//
// ___ ___ _ __ ___ ___ _ __
// / __|/ __| '__/ _ \/ _ \ '_ \