diff options
author | Marcus Fritzsch <marcus_fritzsch@mentor.com> | 2017-08-17 16:45:56 +0200 |
---|---|---|
committer | Marcus Fritzsch <marcus_fritzsch@mentor.com> | 2017-09-04 16:53:49 +0200 |
commit | 6a4504b1fe5e17a09a019edf0377646cc5dd72aa (patch) | |
tree | e10f7da1767a327a017028e2d97f3214f68ac88e /src/app.hpp | |
parent | 0c9c1107ad673bc9a4977d57041c936678429a1e (diff) |
Implement surface names
* request_surface(name: string) -> id: int.
* activate_surface(name: string).
* names will be mapped to their respective layers by use of the layers'
surface rola match, a regex.
* the generated IDs are global and not reused.
* allow wp-request to use -p, disable use of pygments even if found.
Things missing:
* surface removal does not remove already established mappings/names.
* Mostly untested.
Signed-off-by: Marcus Fritzsch <marcus_fritzsch@mentor.com>
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); }; |