Introduce geometry sync mode flags

The sync mode flags indicate in which fashion position and size update
are made, i.e. synchronous or asynchronous.
master
Vlad Zahorodnii 2020-08-21 09:58:24 +03:00
parent 7029d9c57c
commit fde34f3c57
4 changed files with 33 additions and 0 deletions

View File

@ -30,6 +30,8 @@ InputPanelV1Client::InputPanelV1Client(InputPanelSurfaceV1Interface *panelSurfac
setSkipSwitcher(true); setSkipSwitcher(true);
setSkipPager(true); setSkipPager(true);
setSkipTaskbar(true); setSkipTaskbar(true);
setPositionSyncMode(SyncMode::Sync);
setSizeSyncMode(SyncMode::Sync);
setupCompositing(); setupCompositing();
connect(surface(), &SurfaceInterface::aboutToBeDestroyed, this, &InputPanelV1Client::destroyClient); connect(surface(), &SurfaceInterface::aboutToBeDestroyed, this, &InputPanelV1Client::destroyClient);

View File

@ -423,7 +423,17 @@ void WaylandClient::setFrameGeometry(const QRect &rect, ForceGeometry_t force)
requestGeometry(requestedFrameGeometry()); requestGeometry(requestedFrameGeometry());
} else { } else {
updateGeometry(requestedFrameGeometry()); updateGeometry(requestedFrameGeometry());
return;
} }
QRect updateRect = m_frameGeometry;
if (m_positionSyncMode == SyncMode::Sync) {
updateRect.moveTopLeft(requestedPos());
}
if (m_sizeSyncMode == SyncMode::Sync) {
updateRect.setSize(requestedSize());
}
updateGeometry(updateRect);
} }
void WaylandClient::move(int x, int y, ForceGeometry_t force) void WaylandClient::move(int x, int y, ForceGeometry_t force)
@ -514,4 +524,14 @@ void WaylandClient::updateGeometry(const QRect &rect)
addRepaintDuringGeometryUpdates(); addRepaintDuringGeometryUpdates();
} }
void WaylandClient::setPositionSyncMode(SyncMode syncMode)
{
m_positionSyncMode = syncMode;
}
void WaylandClient::setSizeSyncMode(SyncMode syncMode)
{
m_sizeSyncMode = syncMode;
}
} // namespace KWin } // namespace KWin

View File

@ -11,6 +11,11 @@
namespace KWin namespace KWin
{ {
enum class SyncMode {
Sync,
Async,
};
class WaylandClient : public AbstractClient class WaylandClient : public AbstractClient
{ {
Q_OBJECT Q_OBJECT
@ -61,6 +66,8 @@ protected:
void doSetActive() override; void doSetActive() override;
void updateCaption() override; void updateCaption() override;
void setPositionSyncMode(SyncMode syncMode);
void setSizeSyncMode(SyncMode syncMode);
void cleanGrouping(); void cleanGrouping();
virtual void requestGeometry(const QRect &rect); virtual void requestGeometry(const QRect &rect);
@ -80,6 +87,8 @@ private:
QRect m_requestedFrameGeometry; QRect m_requestedFrameGeometry;
QRect m_bufferGeometry; QRect m_bufferGeometry;
QRect m_requestedClientGeometry; QRect m_requestedClientGeometry;
SyncMode m_positionSyncMode = SyncMode::Sync;
SyncMode m_sizeSyncMode = SyncMode::Sync;
quint32 m_windowId; quint32 m_windowId;
bool m_isHidden = false; bool m_isHidden = false;
}; };

View File

@ -43,6 +43,8 @@ XdgSurfaceClient::XdgSurfaceClient(XdgSurfaceInterface *shellSurface)
, m_shellSurface(shellSurface) , m_shellSurface(shellSurface)
, m_configureTimer(new QTimer(this)) , m_configureTimer(new QTimer(this))
{ {
setSizeSyncMode(SyncMode::Async);
setPositionSyncMode(SyncMode::Async);
setupCompositing(); setupCompositing();
connect(shellSurface, &XdgSurfaceInterface::configureAcknowledged, connect(shellSurface, &XdgSurfaceInterface::configureAcknowledged,