1 #include <xf86drm.h>
2 #include <xf86drmMode.h>
4 #include "kms++.h"
6 using namespace std;
8 namespace kms
9 {
11 struct PropertyPriv
12 {
13 drmModePropertyPtr drm_prop;
14 };
16 Property::Property(Card& card, uint32_t id)
17 : DrmObject(card, id, DRM_MODE_OBJECT_PROPERTY)
18 {
19 m_priv = new PropertyPriv();
20 m_priv->drm_prop = drmModeGetProperty(card.fd(), id);
21 m_name = m_priv->drm_prop->name;
22 }
24 Property::~Property()
25 {
26 drmModeFreeProperty(m_priv->drm_prop);
27 delete m_priv;
28 }
30 const string& Property::name() const
31 {
32 return m_name;
33 }
35 const std::string Property::to_str(uint64_t val) const
36 {
37 drmModePropertyPtr p = m_priv->drm_prop;
38 string ret;
40 if (p->flags & DRM_MODE_PROP_ENUM) {
41 for (int i = 0; i < p->count_enums; i++) {
42 if (p->enums[i].value == val) {
43 ret += string("\"") + p->enums[i].name + "\"";
44 break;
45 }
46 }
47 ret += " (enum: " + to_string(val) + ")";
48 } else if (p->flags & DRM_MODE_PROP_RANGE) {
49 ret += to_string(val);
50 if (p->count_values == 2)
51 ret += " [" + to_string(p->values[0]) + "-" +
52 to_string(p->values[1]) + "]";
53 else
54 ret += " <broken range>";
55 } else if (p->flags & DRM_MODE_PROP_BLOB) {
56 ret += "Blob id: " + to_string(val);
58 auto blob = drmModeGetPropertyBlob(card().fd(), (uint32_t) val);
59 if (blob) {
60 ret += " length: " + to_string(blob->length);
61 drmModeFreePropertyBlob(blob);
62 }
63 } else {
64 ret += to_string(val);
65 }
67 if (p->flags & DRM_MODE_PROP_PENDING)
68 ret += " (pendig)";
69 if (p->flags & DRM_MODE_PROP_IMMUTABLE)
70 ret += " (immutable)";
72 return ret;
73 }
74 }