return m_compositor->outputGeometry();
}
+void WaylandCompositor::setOutputRefreshRate(int rate)
+{
+ m_compositor->setOutputRefreshRate(rate);
+}
+
+int WaylandCompositor::outputRefreshRate() const
+{
+ return m_compositor->outputRefreshRate();
+}
+
WaylandInputDevice *WaylandCompositor::defaultInputDevice() const
{
return m_compositor->defaultInputDevice()->handle();
void setOutputGeometry(const QRect &outputGeometry);
QRect outputGeometry() const;
+ void setOutputRefreshRate(int refreshRate);
+ int outputRefreshRate() const;
+
WaylandInputDevice *defaultInputDevice() const;
bool isDragging() const;
return m_output_global.geometry();
}
+void Compositor::setOutputRefreshRate(int rate)
+{
+ m_output_global.setRefreshRate(rate);
+}
+
+int Compositor::outputRefreshRate() const
+{
+ return m_output_global.refreshRate();
+}
+
void Compositor::setClientFullScreenHint(bool value)
{
m_windowManagerIntegration->setShowIsFullScreen(value);
Qt::ScreenOrientation screenOrientation() const;
void setOutputGeometry(const QRect &geometry);
QRect outputGeometry() const;
+ void setOutputRefreshRate(int rate);
+ int outputRefreshRate() const;
void setClientFullScreenHint(bool value);
{
QScreen *screen = QGuiApplication::primaryScreen();
m_geometry = QRect(QPoint(0, 0), screen->availableGeometry().size());
+ m_refreshRate = qRound(screen->refreshRate());
}
OutputGlobal::~OutputGlobal()
m_geometry = geometry;
}
+void OutputGlobal::setRefreshRate(int rate)
+{
+ m_refreshRate = rate;
+}
+
Output *OutputGlobal::outputForClient(wl_client *client) const
{
return static_cast<Output *>(resourceForClient(client)->data);
m_output_global->size().width(), m_output_global->size().height(),0,"","");
wl_output_send_mode(m_output_resource, WL_OUTPUT_MODE_CURRENT|WL_OUTPUT_MODE_PREFERRED,
- m_output_global->size().width(),m_output_global->size().height(), 60);
+ m_output_global->size().width(), m_output_global->size().height(), m_output_global->refreshRate());
}
int y() const { return m_geometry.y(); }
QSize size() const { return m_geometry.size(); }
+ void setRefreshRate(int rate);
+ int refreshRate() const { return m_refreshRate; }
+
Output *outputForClient(struct wl_client *client) const;
static void output_bind_func(struct wl_client *client, void *data,
uint32_t version, uint32_t id);
private:
QRect m_geometry;
+ int m_refreshRate;
int m_displayId;
int m_numQueued;
QList<Output *> m_outputs;
}
void QWaylandDisplay::mode(void *data,
- struct wl_output *wl_output,
+ struct wl_output *output,
uint32_t flags,
int width,
int height,
int refresh)
{
- Q_UNUSED(data);
- Q_UNUSED(wl_output);
- Q_UNUSED(flags);
- Q_UNUSED(width);
- Q_UNUSED(height);
- Q_UNUSED(refresh);
+ QWaylandDisplay *waylandDisplay = static_cast<QWaylandDisplay *>(data);
+
+ if (flags & WL_OUTPUT_MODE_CURRENT) {
+ QWaylandScreen *screen = waylandDisplay->screenForOutput(output);
+ if (screen)
+ screen->handleMode(QSize(width, height), refresh);
+ }
}
const struct wl_output_listener QWaylandDisplay::outputListener = {
, mExtendedOutput(0)
, mGeometry(geometry)
, mDepth(32)
+ , mRefreshRate(60)
, mFormat(QImage::Format_ARGB32_Premultiplied)
, mWaylandCursor(new QWaylandCursor(this))
{
return QPlatformScreen::orientation();
}
+qreal QWaylandScreen::refreshRate() const
+{
+ return mRefreshRate;
+}
+
QPlatformCursor *QWaylandScreen::cursor() const
{
return mWaylandCursor;
QPlatformScreen *platformScreen = QPlatformScreen::platformScreenForWindow(window);
return static_cast<QWaylandScreen *>(platformScreen);
}
+
+void QWaylandScreen::handleMode(const QSize &size, int refreshRate)
+{
+ if (size != mGeometry.size()) {
+ mGeometry.setSize(size);
+ QWindowSystemInterface::handleScreenGeometryChange(screen(), mGeometry);
+ }
+
+ if (refreshRate != mRefreshRate) {
+ mRefreshRate = refreshRate;
+ QWindowSystemInterface::handleScreenRefreshRateChange(screen(), mRefreshRate);
+ }
+}
QImage::Format format() const;
Qt::ScreenOrientation orientation() const;
+ qreal refreshRate() const;
QPlatformCursor *cursor() const;
static QWaylandScreen *waylandScreenFromWindow(QWindow *window);
+ void handleMode(const QSize &size, int refreshRate);
+
private:
QWaylandDisplay *mWaylandDisplay;
struct wl_output *mOutput;
QWaylandExtendedOutput *mExtendedOutput;
QRect mGeometry;
int mDepth;
+ int mRefreshRate;
QImage::Format mFormat;
QSize mPhysicalSize;
void Compositor::sendOutputMode(wl_resource *resource)
{
- wl_output_send_mode(resource, WL_OUTPUT_MODE_CURRENT | WL_OUTPUT_MODE_PREFERRED, 640, 480, 60);
+ const QRect &r = m_outputGeometry;
+ wl_output_send_mode(resource, WL_OUTPUT_MODE_CURRENT | WL_OUTPUT_MODE_PREFERRED, r.width(), r.height(), 60);
}
void Compositor::setOutputGeometry(void *c, const QList<QVariant> ¶meters)