summaryrefslogtreecommitdiff
path: root/src/xcb_resources_xrm.cc
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@opera.com>2026-01-12 23:06:20 +0100
committerJoel Klinghed <the_jk@opera.com>2026-01-12 23:06:20 +0100
commitdfeb19b0a83b8ce57d28bf94a4f8d129993d1064 (patch)
treed352908df286058059e306c350d89a07c67049eb /src/xcb_resources_xrm.cc
Initial commit
Diffstat (limited to 'src/xcb_resources_xrm.cc')
-rw-r--r--src/xcb_resources_xrm.cc74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/xcb_resources_xrm.cc b/src/xcb_resources_xrm.cc
new file mode 100644
index 0000000..1574fdc
--- /dev/null
+++ b/src/xcb_resources_xrm.cc
@@ -0,0 +1,74 @@
+#include "xcb_connection.hh"
+#include "xcb_resources.hh"
+
+#include <cstdlib>
+#include <memory>
+#include <optional>
+#include <string>
+#include <utility>
+#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_(std::move(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::nullopt;
+ }
+
+ 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::nullopt;
+ }
+
+ 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::nullopt;
+ }
+
+ 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>(std::move(conn));
+}
+
+} // namespace xcb