void RandROutput::queryOutputInfo(void) { XRROutputInfo *info = XRRGetOutputInfo(QX11Info::display(), m_screen->resources(), m_id); Q_ASSERT(info); if (RandR::timestamp != info->timestamp) RandR::timestamp = info->timestamp; // Set up the output's connection status, name, and current // CRT controller. m_connected = (info->connection == RR_Connected); m_name = info->name; kDebug() << "XID" << m_id << "is output" << m_name << (isConnected() ? "(connected)" : "(disconnected)"); setCrtc(m_screen->crtc(info->crtc)); kDebug() << "Possible CRTCs for output" << m_name << ":"; if (!info->ncrtc) { kDebug() << " - none"; } for(int i = 0; i < info->ncrtc; ++i) { kDebug() << " - CRTC" << info->crtcs[i]; m_possibleCrtcs.append(info->crtcs[i]); } //TODO: is it worth notifying changes on mode list changing? m_modes.clear(); for (int i = 0; i < info->nmode; ++i) { if (i < info->npreferred) { m_preferredMode = m_screen->mode(info->modes[i]); } m_modes.append(info->modes[i]); } //get all possible rotations m_rotations = 0; for (int i = 0; i < m_possibleCrtcs.count(); ++i) { RandRCrtc *crtc = m_screen->crtc(m_possibleCrtcs.at(i)); Q_ASSERT(crtc); m_rotations |= crtc->rotations(); } m_originalRotation = m_crtc->rotation(); m_originalRate = m_crtc->refreshRate(); m_originalRect = m_crtc->rect(); if(isConnected()) { kDebug() << "Current configuration for output" << m_name << ":"; kDebug() << " - Refresh rate:" << m_originalRate; kDebug() << " - Rect:" << m_originalRect; kDebug() << " - Rotation:" << m_originalRotation; } XRRFreeOutputInfo(info); }
void RandROutput::loadSettings(bool notify) { int changes = 0; XRROutputInfo *info = XRRGetOutputInfo(QX11Info::display(), m_screen->resources(), m_id); Q_ASSERT(info); if (RandR::timestamp != info->timestamp) RandR::timestamp = info->timestamp; // this information shouldn't change, so m_name = info->name; m_possibleCrtcs.clear(); for (int i = 0; i < info->ncrtc; ++i) m_possibleCrtcs.append(info->crtcs[i]); //check if the crtc changed if (info->crtc != m_currentCrtc) { setCrtc(info->crtc); changes |= RandR::ChangeCrtc; } bool connected = (info->connection == RR_Connected); if (connected != m_connected) { m_connected = connected; changes |= RandR::ChangeConnection; } //CHECK: is it worth notifying changes on mode list changing? //get modes m_modes.clear(); for (int i = 0; i < info->nmode; ++i) m_modes.append(info->modes[i]); //get all possible rotations m_rotations = 0; for (int i = 0; i < m_possibleCrtcs.count(); ++i) { RandRCrtc *crtc = m_screen->crtc(m_possibleCrtcs.at(i)); Q_ASSERT(crtc); m_rotations |= crtc->rotations(); } // free the info XRRFreeOutputInfo(info); if (changes && notify) emit outputChanged(m_id, changes); }
RRMode RandROutput::mode() const { if (!isConnected()) return None; RandRCrtc *crtc = m_screen->crtc(m_currentCrtc); if (!crtc) return None; return crtc->mode(); }