Changeset View
Changeset View
Standalone View
Standalone View
plugins/platforms/drm/drm_output.cpp
Show First 20 Lines • Show All 325 Lines • ▼ Show 20 Line(s) | 323 | { | |||
---|---|---|---|---|---|
326 | hash.addData(m_edid.eisaId); | 326 | hash.addData(m_edid.eisaId); | ||
327 | hash.addData(m_edid.monitorName); | 327 | hash.addData(m_edid.monitorName); | ||
328 | hash.addData(m_edid.serialNumber); | 328 | hash.addData(m_edid.serialNumber); | ||
329 | m_uuid = hash.result().toHex().left(10); | 329 | m_uuid = hash.result().toHex().left(10); | ||
330 | } | 330 | } | ||
331 | 331 | | |||
332 | void DrmOutput::initOutputDevice(drmModeConnector *connector) | 332 | void DrmOutput::initOutputDevice(drmModeConnector *connector) | ||
333 | { | 333 | { | ||
334 | auto wlOutputDevice = waylandOutputDevice(); | 334 | QString manufacturer; | ||
335 | if (!wlOutputDevice.isNull()) { | | |||
336 | delete wlOutputDevice.data(); | | |||
337 | wlOutputDevice.clear(); | | |||
338 | } | | |||
339 | wlOutputDevice = waylandServer()->display()->createOutputDevice(); | | |||
340 | wlOutputDevice->setUuid(m_uuid); | | |||
341 | | ||||
342 | if (!m_edid.eisaId.isEmpty()) { | 335 | if (!m_edid.eisaId.isEmpty()) { | ||
343 | wlOutputDevice->setManufacturer(QString::fromLatin1(m_edid.eisaId)); | 336 | manufacturer = QString::fromLatin1(m_edid.eisaId); | ||
344 | } else { | | |||
345 | wlOutputDevice->setManufacturer(i18n("unknown")); | | |||
346 | } | 337 | } | ||
347 | 338 | | |||
348 | QString connectorName = s_connectorNames.value(connector->connector_type, QByteArrayLiteral("Unknown")); | 339 | QString connectorName = s_connectorNames.value(connector->connector_type, QByteArrayLiteral("Unknown")); | ||
349 | QString modelName; | 340 | QString modelName; | ||
350 | 341 | | |||
351 | if (!m_edid.monitorName.isEmpty()) { | 342 | if (!m_edid.monitorName.isEmpty()) { | ||
352 | QString model = QString::fromLatin1(m_edid.monitorName); | 343 | QString m = QString::fromLatin1(m_edid.monitorName); | ||
353 | if (!m_edid.serialNumber.isEmpty()) { | 344 | if (!m_edid.serialNumber.isEmpty()) { | ||
354 | model.append('/'); | 345 | m.append('/'); | ||
355 | model.append(QString::fromLatin1(m_edid.serialNumber)); | 346 | m.append(QString::fromLatin1(m_edid.serialNumber)); | ||
356 | } | 347 | } | ||
357 | modelName = model; | 348 | modelName = m; | ||
358 | } else if (!m_edid.serialNumber.isEmpty()) { | 349 | } else if (!m_edid.serialNumber.isEmpty()) { | ||
359 | modelName = QString::fromLatin1(m_edid.serialNumber); | 350 | modelName = QString::fromLatin1(m_edid.serialNumber); | ||
360 | } else { | 351 | } else { | ||
361 | modelName = i18n("unknown"); | 352 | modelName = i18n("unknown"); | ||
362 | } | 353 | } | ||
363 | 354 | | |||
364 | wlOutputDevice->setModel(connectorName + QStringLiteral("-") + QString::number(connector->connector_type_id) + QStringLiteral("-") + modelName); | 355 | const QString model = connectorName + QStringLiteral("-") + QString::number(connector->connector_type_id) + QStringLiteral("-") + modelName; | ||
365 | | ||||
366 | wlOutputDevice->setPhysicalSize(rawPhysicalSize()); | | |||
367 | 356 | | |||
368 | // read in mode information | 357 | // read in mode information | ||
358 | QVector<KWayland::Server::OutputDeviceInterface::Mode> modes; | ||||
369 | for (int i = 0; i < connector->count_modes; ++i) { | 359 | for (int i = 0; i < connector->count_modes; ++i) { | ||
370 | // TODO: in AMS here we could read and store for later every mode's blob_id | 360 | // TODO: in AMS here we could read and store for later every mode's blob_id | ||
371 | // would simplify isCurrentMode(..) and presentAtomically(..) in case of mode set | 361 | // would simplify isCurrentMode(..) and presentAtomically(..) in case of mode set | ||
372 | auto *m = &connector->modes[i]; | 362 | auto *m = &connector->modes[i]; | ||
373 | KWayland::Server::OutputDeviceInterface::ModeFlags deviceflags; | 363 | KWayland::Server::OutputDeviceInterface::ModeFlags deviceflags; | ||
374 | if (isCurrentMode(m)) { | 364 | if (isCurrentMode(m)) { | ||
375 | deviceflags |= KWayland::Server::OutputDeviceInterface::ModeFlag::Current; | 365 | deviceflags |= KWayland::Server::OutputDeviceInterface::ModeFlag::Current; | ||
376 | } | 366 | } | ||
377 | if (m->type & DRM_MODE_TYPE_PREFERRED) { | 367 | if (m->type & DRM_MODE_TYPE_PREFERRED) { | ||
378 | deviceflags |= KWayland::Server::OutputDeviceInterface::ModeFlag::Preferred; | 368 | deviceflags |= KWayland::Server::OutputDeviceInterface::ModeFlag::Preferred; | ||
379 | } | 369 | } | ||
380 | 370 | | |||
381 | const auto refreshRate = refreshRateForMode(m); | | |||
382 | | ||||
383 | KWayland::Server::OutputDeviceInterface::Mode mode; | 371 | KWayland::Server::OutputDeviceInterface::Mode mode; | ||
384 | mode.id = i; | 372 | mode.id = i; | ||
385 | mode.size = QSize(m->hdisplay, m->vdisplay); | 373 | mode.size = QSize(m->hdisplay, m->vdisplay); | ||
386 | mode.flags = deviceflags; | 374 | mode.flags = deviceflags; | ||
387 | mode.refreshRate = refreshRate; | 375 | mode.refreshRate = refreshRateForMode(m); | ||
388 | qCDebug(KWIN_DRM) << "Adding mode: " << i << mode.size; | 376 | modes << mode; | ||
389 | wlOutputDevice->addMode(mode); | | |||
390 | } | 377 | } | ||
391 | wlOutputDevice->create(); | 378 | | ||
392 | setWaylandOutputDevice(wlOutputDevice.data()); | 379 | AbstractOutput::initWaylandOutputDevice(model, manufacturer, m_uuid, modes); | ||
393 | } | 380 | } | ||
394 | 381 | | |||
395 | bool DrmOutput::isCurrentMode(const drmModeModeInfo *mode) const | 382 | bool DrmOutput::isCurrentMode(const drmModeModeInfo *mode) const | ||
396 | { | 383 | { | ||
397 | return mode->clock == m_mode.clock | 384 | return mode->clock == m_mode.clock | ||
398 | && mode->hdisplay == m_mode.hdisplay | 385 | && mode->hdisplay == m_mode.hdisplay | ||
399 | && mode->hsync_start == m_mode.hsync_start | 386 | && mode->hsync_start == m_mode.hsync_start | ||
400 | && mode->hsync_end == m_mode.hsync_end | 387 | && mode->hsync_end == m_mode.hsync_end | ||
▲ Show 20 Lines • Show All 815 Lines • Show Last 20 Lines |