aboutsummaryrefslogtreecommitdiffstats
path: root/src/app.hpp
diff options
context:
space:
mode:
authorMarcus Fritzsch <marcus_fritzsch@mentor.com>2017-08-17 16:45:56 +0200
committerMarcus Fritzsch <marcus_fritzsch@mentor.com>2017-09-04 16:53:49 +0200
commit6a4504b1fe5e17a09a019edf0377646cc5dd72aa (patch)
treee10f7da1767a327a017028e2d97f3214f68ac88e /src/app.hpp
parent0c9c1107ad673bc9a4977d57041c936678429a1e (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.hpp54
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);
};