diff options
author | Tomi Valkeinen <tomi.valkeinen@iki.fi> | 2015-09-28 01:13:34 +0300 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@iki.fi> | 2015-09-28 01:13:34 +0300 |
commit | 009828beac9bfe9c36d336a4de0d297f90aece52 (patch) | |
tree | 3ea6b22f2036dcc0c23c459ce53bfc2ad282e3e7 /libkms++/connector.cpp |
Initial version
Diffstat (limited to 'libkms++/connector.cpp')
-rw-r--r-- | libkms++/connector.cpp | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/libkms++/connector.cpp b/libkms++/connector.cpp new file mode 100644 index 0000000..ee14af9 --- /dev/null +++ b/libkms++/connector.cpp @@ -0,0 +1,111 @@ +#include <stdio.h> +#include <iostream> +#include <unistd.h> +#include <fcntl.h> +#include <cassert> + +#include "kms++.h" +#include "helpers.h" + +using namespace std; + +#define DEF_CONN(c) [DRM_MODE_CONNECTOR_##c] = #c + +namespace kms +{ + +static const char * connector_names[] = { + DEF_CONN(Unknown), + DEF_CONN(VGA), + DEF_CONN(DVII), + DEF_CONN(DVID), + DEF_CONN(DVIA), + DEF_CONN(Composite), + DEF_CONN(SVIDEO), + DEF_CONN(LVDS), + DEF_CONN(Component), + DEF_CONN(9PinDIN), + DEF_CONN(DisplayPort), + DEF_CONN(HDMIA), + DEF_CONN(HDMIB), + DEF_CONN(TV), + DEF_CONN(eDP), + DEF_CONN(VIRTUAL), + DEF_CONN(DSI), +}; + +static const char *connection_str[] = { + [0] = "<unknown>", + [DRM_MODE_CONNECTED] = "Connected", + [DRM_MODE_DISCONNECTED] = "Disconnected", + [DRM_MODE_UNKNOWNCONNECTION] = "Unknown", +}; + +struct ConnectorPriv +{ + drmModeConnectorPtr drm_connector; +}; + +Connector::Connector(Card &card, uint32_t id, uint32_t idx) + :DrmObject(card, id, DRM_MODE_OBJECT_CONNECTOR, idx) +{ + m_priv = new ConnectorPriv(); + + m_priv->drm_connector = drmModeGetConnector(this->card().fd(), this->id()); + assert(m_priv->drm_connector); + + auto name = connector_names[m_priv->drm_connector->connector_type]; + m_fullname = std::string(string(name) + std::to_string(m_priv->drm_connector->connector_type_id)); +} + + +Connector::~Connector() +{ + drmModeFreeConnector(m_priv->drm_connector); + delete m_priv; +} + +void Connector::setup() +{ + if (m_priv->drm_connector->encoder_id != 0) { + auto enc = card().get_encoder(m_priv->drm_connector->encoder_id); + if (enc) + m_current_crtc = enc->get_crtc(); + } +} + +void Connector::print_short() const +{ + auto c = m_priv->drm_connector; + + printf("Connector %d, %s, %dx%dmm, %s\n", id(), m_fullname.c_str(), + c->mmWidth, c->mmHeight, connection_str[c->connection]); +} + +Videomode Connector::get_default_mode() const +{ + drmModeModeInfo drmmode = m_priv->drm_connector->modes[0]; + + return drm_mode_to_video_mode(drmmode); +} + +bool Connector::connected() +{ + return m_priv->drm_connector->connection == DRM_MODE_CONNECTED; +} + +vector<Crtc*> Connector::get_possible_crtcs() const +{ + vector<Crtc*> crtcs; + + for (int i = 0; i < m_priv->drm_connector->count_encoders; ++i) { + auto enc = card().get_encoder(m_priv->drm_connector->encoders[i]); + + auto l = enc->get_possible_crtcs(); + + crtcs.insert(crtcs.end(), l.begin(), l.end()); + } + + return crtcs; +} +} |