diff options
| author | Joel Klinghed <the_jk@spawned.biz> | 2021-01-27 22:06:49 +0100 |
|---|---|---|
| committer | Joel Klinghed <the_jk@spawned.biz> | 2021-01-27 22:06:49 +0100 |
| commit | 06950aab233de6a2f47293d59575bb42f6131660 (patch) | |
| tree | 62f6eed4a6d35414f656d22b9ac7420849018a11 /src/xcb_resources_xrm.cc | |
| parent | 1ef9c463f1efc1adfb62e42ab3dd17e8c6394373 (diff) | |
Complete rewrite using C++ and with shared state support
Diffstat (limited to 'src/xcb_resources_xrm.cc')
| -rw-r--r-- | src/xcb_resources_xrm.cc | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/xcb_resources_xrm.cc b/src/xcb_resources_xrm.cc new file mode 100644 index 0000000..a9149af --- /dev/null +++ b/src/xcb_resources_xrm.cc @@ -0,0 +1,78 @@ +#include "common.hh" + +#include "xcb_resources.hh" + +#include <xcb/xcb_xrm.h> + +namespace xcb { + +namespace { + +struct DatabaseDeleter { + void operator() (xcb_xrm_database_t* db) { + xcb_xrm_database_free(db); + } +}; + +class ResourcesXrm : public Resources { +public: + explicit ResourcesXrm(shared_conn conn) + : conn_(conn), db_(xcb_xrm_database_from_default(conn_.get())) { + } + + std::optional<std::string> get_string(std::string const& name, + std::string const& clazz) override { + if (db_) { + char* tmp; + if (xcb_xrm_resource_get_string(db_.get(), + std::string(name).c_str(), + std::string(clazz).c_str(), + &tmp) >= 0) { + std::string ret(tmp); + free(tmp); + return ret; + } + } + return std::optional<std::string>(); + } + + std::optional<long> get_long(std::string const& name, + std::string const& clazz) override { + if (db_) { + long tmp; + if (xcb_xrm_resource_get_long(db_.get(), + std::string(name).c_str(), + std::string(clazz).c_str(), + &tmp) >= 0) { + return tmp; + } + } + return std::optional<long>(); + } + + std::optional<bool> get_bool(std::string const& name, + std::string const& clazz) override { + if (db_) { + bool tmp; + if (xcb_xrm_resource_get_bool(db_.get(), + std::string(name).c_str(), + std::string(clazz).c_str(), + &tmp) >= 0) { + return tmp; + } + } + return std::optional<bool>(); + } + +private: + shared_conn conn_; + std::unique_ptr<xcb_xrm_database_t, DatabaseDeleter> db_; +}; + +} // namespace + +std::unique_ptr<Resources> Resources::create(shared_conn conn) { + return std::make_unique<ResourcesXrm>(conn); +} + +} // namespace xcb |
