diff options
Diffstat (limited to 'src/app.hpp')
-rw-r--r-- | src/app.hpp | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/src/app.hpp b/src/app.hpp index 90ab42c..12d26b4 100644 --- a/src/app.hpp +++ b/src/app.hpp @@ -19,6 +19,8 @@ #include <json-c/json.h> #include <memory> +#include <unordered_map> +#include <unordered_set> #include "afb_binding_api.hpp" #include "config.hpp" @@ -38,6 +40,41 @@ struct controller; namespace wm { +struct id_allocator { + unsigned next = 0x0100'0000; + + // Surfaces that where requested but not yet created + std::unordered_map<unsigned, std::string> surfaces; + // std::unordered_set<unsigned> pending_surfaces; + std::unordered_map<std::string, unsigned> names; + + id_allocator(id_allocator const &) = delete; + id_allocator(id_allocator &&) = delete; + id_allocator &operator=(id_allocator const &); + id_allocator &operator=(id_allocator &&) = delete; + + // Allocate a new ID + unsigned operator()(std::string const &name) { + unsigned sid = this->next++; + this->surfaces[sid] = name; + // this->pending_surfaces.insert({sid}); + this->names[name] = sid; + logdebug("allocated new id %u with name %s", sid, name.c_str()); + return sid; + } + + // Lookup by ID or by name + optional<unsigned> operator[](std::string const &name) { + auto i = this->names.find(name); + return i == this->names.end() ? nullopt : optional<unsigned>(i->second); + } + + optional<std::string> operator[](unsigned id) { + auto i = this->surfaces.find(id); + return i == this->surfaces.end() ? nullopt : optional<std::string>(i->second); + } +}; + struct App { struct binding_api api; struct controller_hooks chooks; @@ -56,6 +93,11 @@ struct App { typedef std::pair<char const *, std::function<void()>> name_task_pair; std::vector<name_task_pair> pending; + typedef std::map<std::string, int> drawing_name_map; + drawing_name_map name_mapping; + + struct id_allocator id_alloc; + explicit App(wl::display *d); ~App(); @@ -65,14 +107,24 @@ struct App { App &operator=(App &&) = delete; int init(); - int dispatch_events(); int init_layout(); + + int dispatch_events(); + void surface_set_layout(uint32_t surface_id); char const *activate_surface(uint32_t surface_id); + // Allocate a surface ID for this role + result<int> request_surface(char const *drawing_name); + + // Activate (i.e. make visible, if allowed!) a surface + char const *activate_surface(char const *drawng_name); + + // add tasks, executed after dispatch_events() void add_task(char const *name, std::function<void()> &&f); void execute_pending(); + // Events from the compositor we are interested in void surface_created(uint32_t surface_id); void surface_removed(uint32_t surface_id); }; |