Advertisement
Guest User

Untitled

a guest
Jan 12th, 2024
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.98 KB | Source Code | 0 0
  1. From f978c91c94346bd982d692239ba562069b1f61f2 Mon Sep 17 00:00:00 2001
  2. From: Vlad Zahorodnii <[email protected]>
  3. Date: Wed, 10 Jan 2024 09:18:53 +0200
  4. Subject: [PATCH 1/3] scene: Fix software cursor clip region
  5.  
  6. The dirty region is in the output local coordinate space.
  7.  
  8. BUG: 479583
  9. (cherry picked from commit 36222adb259ecfe9dac205bc3a067fc7ba9b6053)
  10. ---
  11. src/compositor_wayland.cpp | 4 ++--
  12. src/scene/cursordelegate_opengl.cpp | 2 +-
  13. 2 files changed, 3 insertions(+), 3 deletions(-)
  14.  
  15. diff --git a/src/compositor_wayland.cpp b/src/compositor_wayland.cpp
  16. index 0afd564bdd..f63ead7796 100644
  17. --- a/src/compositor_wayland.cpp
  18. +++ b/src/compositor_wayland.cpp
  19. @@ -257,9 +257,9 @@ void WaylandCompositor::addOutput(Output *output)
  20. }
  21. auto workspaceLayer = new RenderLayer(output->renderLoop());
  22. workspaceLayer->setDelegate(std::make_unique<SceneDelegate>(m_scene.get(), output));
  23. - workspaceLayer->setGeometry(output->rect());
  24. + workspaceLayer->setGeometry(output->rectF());
  25. connect(output, &Output::geometryChanged, workspaceLayer, [output, workspaceLayer]() {
  26. - workspaceLayer->setGeometry(output->rect());
  27. + workspaceLayer->setGeometry(output->rectF());
  28. });
  29.  
  30. auto cursorLayer = new RenderLayer(output->renderLoop());
  31. diff --git a/src/scene/cursordelegate_opengl.cpp b/src/scene/cursordelegate_opengl.cpp
  32. index 4ef5299027..a3b78e628e 100644
  33. --- a/src/scene/cursordelegate_opengl.cpp
  34. +++ b/src/scene/cursordelegate_opengl.cpp
  35. @@ -66,7 +66,7 @@ void CursorDelegateOpenGL::paint(const RenderTarget &renderTarget, const QRegion
  36. GLFramebuffer::pushFramebuffer(fbo);
  37.  
  38. const bool clipping = region != infiniteRegion();
  39. - const QRegion clipRegion = clipping ? RenderViewport(m_output->fractionalGeometry(), m_output->scale(), renderTarget).mapToRenderTarget(dirty) : infiniteRegion();
  40. + const QRegion clipRegion = clipping ? RenderViewport(m_output->rectF(), m_output->scale(), renderTarget).mapToRenderTarget(dirty) : infiniteRegion();
  41.  
  42. if (clipping) {
  43. glEnable(GL_SCISSOR_TEST);
  44. --
  45. 2.43.0
  46.  
  47.  
  48. From 16cbf9ec972f9bb3c6a50007b0d5fcca8a1ce658 Mon Sep 17 00:00:00 2001
  49. From: Vlad Zahorodnii <[email protected]>
  50. Date: Thu, 11 Jan 2024 10:00:58 +0200
  51. Subject: [PATCH 2/3] core: Add Output::rectF
  52.  
  53. (cherry picked from commit 571e4026acf1f11defaca46fdb647dcd9bf214cd)
  54. ---
  55. src/core/output.h | 10 ++++++++++
  56. 1 file changed, 10 insertions(+)
  57.  
  58. diff --git a/src/core/output.h b/src/core/output.h
  59. index 5876b77036..dc81e117db 100644
  60. --- a/src/core/output.h
  61. +++ b/src/core/output.h
  62. @@ -238,6 +238,11 @@ public:
  63. */
  64. QRect rect() const;
  65.  
  66. + /**
  67. + * Equivalent to `QRectF(QPointF(0, 0), geometryF().size())`
  68. + */
  69. + QRectF rectF() const;
  70. +
  71. /**
  72. * Returns the approximate vertical refresh rate of this output, in mHz.
  73. */
  74. @@ -480,6 +485,11 @@ inline QRect Output::rect() const
  75. return QRect(QPoint(0, 0), geometry().size());
  76. }
  77.  
  78. +inline QRectF Output::rectF() const
  79. +{
  80. + return QRectF(QPointF(0, 0), geometryF().size());
  81. +}
  82. +
  83. KWIN_EXPORT QDebug operator<<(QDebug debug, const Output *output);
  84.  
  85. } // namespace KWin
  86. --
  87. 2.43.0
  88.  
  89.  
  90. From f239703f0979df09c4a41bff146e37e818af8297 Mon Sep 17 00:00:00 2001
  91. From: =?UTF-8?q?Michal=20Mal=C3=BD?= <[email protected]>
  92. Date: Fri, 12 Jan 2024 12:40:22 +0100
  93. Subject: [PATCH 3/3] core: Rename Output::fractionalGeometry()
  94.  
  95. In Qt, if an overloaded function returns QRectF/QSizeF/QPointF, it
  96. usually has F suffix. Do the same in kwin for the consistency sake.
  97. ---
  98. src/core/output.cpp | 2 +-
  99. src/core/output.h | 2 +-
  100. src/rules.cpp | 2 +-
  101. src/scene/workspacescene.cpp | 2 +-
  102. src/tiles/tile.cpp | 10 +++++-----
  103. src/tiles/tilemanager.cpp | 2 +-
  104. src/wayland/xdgoutput_v1.cpp | 2 +-
  105. src/workspace.cpp | 8 ++++----
  106. src/xwayland/xwayland.cpp | 3 ++-
  107. 9 files changed, 17 insertions(+), 16 deletions(-)
  108.  
  109. diff --git a/src/core/output.cpp b/src/core/output.cpp
  110. index 483d06584c..20bf07e7bb 100644
  111. --- a/src/core/output.cpp
  112. +++ b/src/core/output.cpp
  113. @@ -462,7 +462,7 @@ QRect Output::geometry() const
  114. return QRect(m_state.position, pixelSize() / scale());
  115. }
  116.  
  117. -QRectF Output::fractionalGeometry() const
  118. +QRectF Output::geometryF() const
  119. {
  120. return QRectF(m_state.position, QSizeF(pixelSize()) / scale());
  121. }
  122. diff --git a/src/core/output.h b/src/core/output.h
  123. index dc81e117db..2ba0ff3583 100644
  124. --- a/src/core/output.h
  125. +++ b/src/core/output.h
  126. @@ -231,7 +231,7 @@ public:
  127. /**
  128. * Returns geometry of this output in device independent pixels, without rounding
  129. */
  130. - QRectF fractionalGeometry() const;
  131. + QRectF geometryF() const;
  132.  
  133. /**
  134. * Equivalent to `QRect(QPoint(0, 0), geometry().size())`
  135. diff --git a/src/rules.cpp b/src/rules.cpp
  136. index 6ddad43c97..e648d1252d 100644
  137. --- a/src/rules.cpp
  138. +++ b/src/rules.cpp
  139. @@ -781,7 +781,7 @@ QPointF WindowRules::checkPositionSafe(QPointF pos, bool init) const
  140. }
  141. const auto outputs = workspace()->outputs();
  142. const bool inAnyOutput = std::any_of(outputs.begin(), outputs.end(), [ret](const auto output) {
  143. - return output->fractionalGeometry().contains(ret);
  144. + return output->geometryF().contains(ret);
  145. });
  146. if (inAnyOutput) {
  147. return ret;
  148. diff --git a/src/scene/workspacescene.cpp b/src/scene/workspacescene.cpp
  149. index 94d26e5a2b..bb37238e8b 100644
  150. --- a/src/scene/workspacescene.cpp
  151. +++ b/src/scene/workspacescene.cpp
  152. @@ -372,7 +372,7 @@ void WorkspaceScene::postPaint()
  153. void WorkspaceScene::paint(const RenderTarget &renderTarget, const QRegion &region)
  154. {
  155. Output *output = kwinApp()->operationMode() == Application::OperationMode::OperationModeX11 ? nullptr : painted_screen;
  156. - RenderViewport viewport(output ? output->fractionalGeometry() : workspace()->geometry(), output ? output->scale() : 1, renderTarget);
  157. + RenderViewport viewport(output ? output->geometryF() : workspace()->geometry(), output ? output->scale() : 1, renderTarget);
  158.  
  159. m_renderer->beginFrame(renderTarget, viewport);
  160.  
  161. diff --git a/src/tiles/tile.cpp b/src/tiles/tile.cpp
  162. index 4a2ef0551c..cfe72d539d 100644
  163. --- a/src/tiles/tile.cpp
  164. +++ b/src/tiles/tile.cpp
  165. @@ -83,7 +83,7 @@ void Tile::setGeometryFromWindow(const QRectF &geom)
  166.  
  167. void Tile::setGeometryFromAbsolute(const QRectF &geom)
  168. {
  169. - const QRectF outGeom = m_tiling->output()->fractionalGeometry();
  170. + const QRectF outGeom = m_tiling->output()->geometryF();
  171. const QRectF relGeom((geom.x() - outGeom.x()) / outGeom.width(),
  172. (geom.y() - outGeom.y()) / outGeom.height(),
  173. geom.width() / outGeom.width(),
  174. @@ -120,7 +120,7 @@ QRectF Tile::relativeGeometry() const
  175.  
  176. QRectF Tile::absoluteGeometry() const
  177. {
  178. - const QRectF geom = m_tiling->output()->fractionalGeometry();
  179. + const QRectF geom = m_tiling->output()->geometryF();
  180. return QRectF(std::round(geom.x() + m_relativeGeometry.x() * geom.width()),
  181. std::round(geom.y() + m_relativeGeometry.y() * geom.height()),
  182. std::round(m_relativeGeometry.width() * geom.width()),
  183. @@ -129,7 +129,7 @@ QRectF Tile::absoluteGeometry() const
  184.  
  185. QRectF Tile::absoluteGeometryInScreen() const
  186. {
  187. - const QRectF geom = m_tiling->output()->fractionalGeometry();
  188. + const QRectF geom = m_tiling->output()->geometryF();
  189. return QRectF(std::round(m_relativeGeometry.x() * geom.width()),
  190. std::round(m_relativeGeometry.y() * geom.height()),
  191. std::round(m_relativeGeometry.width() * geom.width()),
  192. @@ -208,7 +208,7 @@ void Tile::resizeFromGravity(Gravity gravity, int x_root, int y_root)
  193. return;
  194. }
  195.  
  196. - const QRectF outGeom = m_tiling->output()->fractionalGeometry();
  197. + const QRectF outGeom = m_tiling->output()->geometryF();
  198. const QPointF relativePos = QPointF((x_root - outGeom.x()) / outGeom.width(), (y_root - outGeom.y()) / outGeom.height());
  199. QRectF newGeom = m_relativeGeometry;
  200.  
  201. @@ -251,7 +251,7 @@ void Tile::resizeByPixels(qreal delta, Qt::Edge edge)
  202. return;
  203. }
  204.  
  205. - const auto outGeom = m_tiling->output()->fractionalGeometry();
  206. + const auto outGeom = m_tiling->output()->geometryF();
  207. auto newGeom = m_relativeGeometry;
  208.  
  209. switch (edge) {
  210. diff --git a/src/tiles/tilemanager.cpp b/src/tiles/tilemanager.cpp
  211. index 986e0e8efc..fff0a0febf 100644
  212. --- a/src/tiles/tilemanager.cpp
  213. +++ b/src/tiles/tilemanager.cpp
  214. @@ -96,7 +96,7 @@ Tile *TileManager::bestTileForPosition(const QPointF &pos)
  215. if (!exclusiveContains(r, pos)) {
  216. // This gives a strong preference for tiles that contain the point
  217. // still base on distance though as floating tiles can overlap
  218. - distance += m_output->fractionalGeometry().width();
  219. + distance += m_output->geometryF().width();
  220. }
  221. if (distance < minimumDistance) {
  222. minimumDistance = distance;
  223. diff --git a/src/wayland/xdgoutput_v1.cpp b/src/wayland/xdgoutput_v1.cpp
  224. index 78a98425d1..342a325c54 100644
  225. --- a/src/wayland/xdgoutput_v1.cpp
  226. +++ b/src/wayland/xdgoutput_v1.cpp
  227. @@ -120,7 +120,7 @@ void XdgOutputV1Interface::update()
  228. return;
  229. }
  230.  
  231. - const QRectF geometry = output->handle()->fractionalGeometry();
  232. + const QRectF geometry = output->handle()->geometryF();
  233. const auto resources = resourceMap();
  234.  
  235. if (pos != geometry.topLeft()) {
  236. diff --git a/src/workspace.cpp b/src/workspace.cpp
  237. index 09c3a388c2..a9764b5890 100644
  238. --- a/src/workspace.cpp
  239. +++ b/src/workspace.cpp
  240. @@ -2306,7 +2306,7 @@ void Workspace::updateClientArea()
  241. workAreas[desktop] = m_geometry;
  242.  
  243. for (const Output *output : std::as_const(m_outputs)) {
  244. - screenAreas[desktop][output] = output->fractionalGeometry();
  245. + screenAreas[desktop][output] = output->geometryF();
  246. }
  247. }
  248.  
  249. @@ -2356,7 +2356,7 @@ void Workspace::updateClientArea()
  250. }
  251. restrictedAreas[vd] += strutRegion;
  252. for (Output *output : std::as_const(m_outputs)) {
  253. - const auto geo = screenAreas[vd][output].intersected(adjustClientArea(window, output->fractionalGeometry()));
  254. + const auto geo = screenAreas[vd][output].intersected(adjustClientArea(window, output->geometryF()));
  255. // ignore the geometry if it results in the screen getting removed completely
  256. if (!geo.isEmpty()) {
  257. screenAreas[vd][output] = geo;
  258. @@ -2407,12 +2407,12 @@ QRectF Workspace::clientArea(clientAreaOption opt, const Output *output, const V
  259. return *outputIt;
  260. }
  261. }
  262. - return output->fractionalGeometry();
  263. + return output->geometryF();
  264. case MaximizeFullArea:
  265. case FullScreenArea:
  266. case MovementArea:
  267. case ScreenArea:
  268. - return output->fractionalGeometry();
  269. + return output->geometryF();
  270. case WorkArea:
  271. return m_workAreas.value(desktop, m_geometry);
  272. case FullArea:
  273. diff --git a/src/xwayland/xwayland.cpp b/src/xwayland/xwayland.cpp
  274. index 64b6ec9451..e90bae34e6 100644
  275. --- a/src/xwayland/xwayland.cpp
  276. +++ b/src/xwayland/xwayland.cpp
  277. @@ -593,10 +593,11 @@ void Xwayland::updatePrimary()
  278. }
  279.  
  280. Output *const primaryOutput = workspace()->outputOrder().front();
  281. + const QRect primaryOutputGeometry = Xcb::toXNative(primaryOutput->geometryF());
  282. for (int i = 0; i < resources->num_crtcs; ++i) {
  283. Xcb::RandR::CrtcInfo crtcInfo(crtcs[i], resources->config_timestamp);
  284. const QRect geometry = crtcInfo.rect();
  285. - if (geometry.topLeft() == primaryOutput->geometry().topLeft()) {
  286. + if (geometry.topLeft() == primaryOutputGeometry.topLeft()) {
  287. auto outputs = crtcInfo.outputs();
  288. if (outputs && crtcInfo->num_outputs > 0) {
  289. qCDebug(KWIN_XWL) << "Setting primary" << primaryOutput << outputs[0];
  290. --
  291. 2.43.0
  292.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement