diff --git a/abstract_client.h b/abstract_client.h index f68bdd0bdb..c013d6d27d 100644 --- a/abstract_client.h +++ b/abstract_client.h @@ -308,6 +308,8 @@ public: enum ForceGeometry_t { NormalGeometrySet, ForceGeometrySet }; virtual void move(int x, int y, ForceGeometry_t force = NormalGeometrySet) = 0; void move(const QPoint &p, ForceGeometry_t force = NormalGeometrySet); + virtual void resizeWithChecks(int w, int h, ForceGeometry_t force = NormalGeometrySet) = 0; + void resizeWithChecks(const QSize& s, ForceGeometry_t force = NormalGeometrySet); // TODO: remove boolean trap static bool belongToSameApplication(const AbstractClient* c1, const AbstractClient* c2, bool active_hack = false); @@ -410,6 +412,11 @@ inline void AbstractClient::move(const QPoint& p, ForceGeometry_t force) move(p.x(), p.y(), force); } +inline void AbstractClient::resizeWithChecks(const QSize& s, AbstractClient::ForceGeometry_t force) +{ + resizeWithChecks(s.width(), s.height(), force); +} + } Q_DECLARE_METATYPE(KWin::AbstractClient*) diff --git a/client.h b/client.h index affe6796e4..98725f71f1 100644 --- a/client.h +++ b/client.h @@ -338,8 +338,10 @@ public: void plainResize(int w, int h, ForceGeometry_t force = NormalGeometrySet); void plainResize(const QSize& s, ForceGeometry_t force = NormalGeometrySet); /// resizeWithChecks() resizes according to gravity, and checks workarea position - void resizeWithChecks(int w, int h, xcb_gravity_t gravity = XCB_GRAVITY_BIT_FORGET, ForceGeometry_t force = NormalGeometrySet); - void resizeWithChecks(const QSize& s, xcb_gravity_t gravity = XCB_GRAVITY_BIT_FORGET, ForceGeometry_t force = NormalGeometrySet); + using AbstractClient::resizeWithChecks; + void resizeWithChecks(int w, int h, ForceGeometry_t force = NormalGeometrySet) override; + void resizeWithChecks(int w, int h, xcb_gravity_t gravity, ForceGeometry_t force = NormalGeometrySet); + void resizeWithChecks(const QSize& s, xcb_gravity_t gravity, ForceGeometry_t force = NormalGeometrySet); void keepInArea(QRect area, bool partial = false); void setElectricBorderMode(QuickTileMode mode); QuickTileMode electricBorderMode() const; @@ -1008,6 +1010,11 @@ inline void Client::plainResize(const QSize& s, ForceGeometry_t force) plainResize(s.width(), s.height(), force); } +inline void Client::resizeWithChecks(int w, int h, AbstractClient::ForceGeometry_t force) +{ + resizeWithChecks(w, h, XCB_GRAVITY_BIT_FORGET, force); +} + inline void Client::resizeWithChecks(const QSize& s, xcb_gravity_t gravity, ForceGeometry_t force) { resizeWithChecks(s.width(), s.height(), gravity, force); diff --git a/shell_client.cpp b/shell_client.cpp index 2ac63a5c73..f3faa135e7 100644 --- a/shell_client.cpp +++ b/shell_client.cpp @@ -421,4 +421,18 @@ void ShellClient::move(int x, int y, ForceGeometry_t force) emit geometryChanged(); } +void ShellClient::resizeWithChecks(int w, int h, ForceGeometry_t force) +{ + Q_UNUSED(force) + QRect area = workspace()->clientArea(WorkArea, this); + // don't allow growing larger than workarea + if (w > area.width()) { + w = area.width(); + } + if (h > area.height()) { + h = area.height(); + } + m_shellSurface->requestSize(QSize(w, h)); +} + } diff --git a/shell_client.h b/shell_client.h index 236325617e..b62d7211be 100644 --- a/shell_client.h +++ b/shell_client.h @@ -90,6 +90,8 @@ public: xcb_window_t window() const override; using AbstractClient::move; void move(int x, int y, ForceGeometry_t force = NormalGeometrySet) override; + using AbstractClient::resizeWithChecks; + void resizeWithChecks(int w, int h, ForceGeometry_t force = NormalGeometrySet) override; quint32 windowId() const { return m_windowId;