X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fwayland.cpp;h=f274874d3d65440be7f0cb526a4e3869f6498aa2;hb=3a0a0018eec4a3a2cbcb34cf2f2033f86e6f9504;hp=e7ba1573d16d533407fcd59986009aed7848e865;hpb=18cc724bb76a6b2b6e9607ce6658cb9cc8f7ec0d;p=staging%2Fwindowmanager.git diff --git a/src/wayland.cpp b/src/wayland.cpp index e7ba157..f274874 100644 --- a/src/wayland.cpp +++ b/src/wayland.cpp @@ -31,6 +31,8 @@ void display::flush() { wl_display_flush(this->d.get()); } int display::get_fd() const { return wl_display_get_fd(this->d.get()); } +int display::get_error() { return wl_display_get_error(this->d.get()); } + // _ _ // _ __ ___ __ _(_)___| |_ _ __ _ _ // | '__/ _ \/ _` | / __| __| '__| | | | @@ -189,13 +191,6 @@ constexpr struct ivi_controller_listener listener = { controller::controller(struct wl_registry *r, uint32_t name, uint32_t version) : wayland_proxy( wl_registry_bind(r, name, &ivi_controller_interface, version)), - surface_proxy_to_id{}, - layer_proxy_to_id{}, - screen_proxy_to_id{}, - surfaces{}, - layers{}, - screens{}, - pending{}, output_size{} { ivi_controller_add_listener(this->proxy.get(), &listener, this); } @@ -225,15 +220,7 @@ void controller::controller_surface(uint32_t id) { logdebug("genivi::controller @ %p surface %u (%x)", this->proxy.get(), id, id); this->surfaces[id] = std::make_unique(id, this); - - add_task("fullscreen surface", [id](struct controller *c) { - auto &s = c->surfaces[id]; - s->set_destination_rectangle(0, 0, c->output_size.w, c->output_size.h); - s->set_visibility(1); - uint32_t lid = id == 0x16180 ? 1000 : 100; - c->layers[lid]->add_surface(s.get()); - logdebug("Surface %u now fullscreen on layer %u", id, lid); - }); + this->chooks->surface_created(id); } void controller::controller_error(int32_t object_id, int32_t object_type, @@ -321,13 +308,7 @@ layer::layer(uint32_t i, int32_t w, int32_t h, struct controller *c) 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); } @@ -387,19 +368,19 @@ void layer::set_render_order(std::vector const &ro) { 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, @@ -407,31 +388,32 @@ 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_screen(struct layer * /*l*/, struct wl_output *screen) { logdebug("genivi::layer %s @ %p s %p", __func__, this->proxy.get(), 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); }); + add_task("remove layer", [l](struct controller *c) { + c->lprops.erase(l->id); + c->layers.erase(l->id); + }); } // __ @@ -543,13 +525,7 @@ surface::surface(uint32_t i, struct controller *c) 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); @@ -598,13 +574,13 @@ void surface::destroy(int32_t destroy_scene_object) { 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, @@ -612,7 +588,7 @@ 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, @@ -620,34 +596,35 @@ 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, int32_t pixelformat) { +void controller::surface_pixelformat(struct surface * /*s*/, + int32_t pixelformat) { logdebug("genivi::surface %s @ %p f %i", __func__, this->proxy.get(), pixelformat); } -void controller::surface_layer(struct surface *s, +void controller::surface_layer(struct surface * /*s*/, struct ivi_controller_layer *layer) { logdebug("genivi::surface %s @ %p l %u @ %p", __func__, this->proxy.get(), this->layer_proxy_to_id[uintptr_t(layer)], layer); } -void controller::surface_stats(struct surface *s, uint32_t redraw_count, +void controller::surface_stats(struct surface * /*s*/, uint32_t redraw_count, uint32_t frame_count, uint32_t update_count, uint32_t pid, const char *process_name) { logdebug("genivi::surface %s @ %p r %u f %u u %u pid %u p %s", __func__, @@ -657,6 +634,9 @@ void controller::surface_stats(struct surface *s, uint32_t redraw_count, void controller::surface_destroyed(struct surface *s) { logdebug("genivi::surface %s @ %p", __func__, this->proxy.get()); + this->chooks->surface_removed(s->id); + // XXX: do I need to actually remove the surface late, i.e. using add_task()? + this->sprops.erase(s->id); this->surfaces.erase(s->id); } @@ -664,15 +644,19 @@ void controller::surface_content(struct surface *s, int32_t content_state) { logdebug("genivi::surface %s @ %p s %i", __func__, this->proxy.get(), 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); }); + this->chooks->surface_removed(s->id); // XXX is this the right thing to do? + add_task("remove surface", [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) { @@ -684,6 +668,7 @@ void controller::add_proxy_to_id_mapping(struct ivi_controller_layer *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) { @@ -718,29 +703,6 @@ void controller::execute_pending() { } } -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 "); - } -} // // ___ ___ _ __ ___ ___ _ __ // / __|/ __| '__/ _ \/ _ \ '_ \