[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-devel
Subject:    Re: Border snap in kde-workspace-4.11.11-1
From:       Thomas_Lübking <thomas.luebking () gmail ! com>
Date:       2015-01-25 11:21:48
Message-ID: 91548562-0c23-4010-b798-97e099273317 () gmail ! com
[Download RAW message or body]

This is a multipart/mixed message in MIME format.


On Samstag, 24. Januar 2015 21:34:49 CEST, Cristian Savu wrote:

> I'm sorry to take your time with this, but I need some help 
> finding some places in the sources.

You're certainly not wasting time by asking for assistance.

The problem with that bug was that we kept repeating "it's not to save size" and "we \
can't move due to the freeze" over and over and over again and yet the very next \
comment would ignore that and make contradicting claims.

> But there is still one exception: All newly created windows go 
> to the left or right desktop edges, and still lose the border on 
> that side (the 3 pixels of border fall outside the desktop). As 
> soon as I move them, they DO snap the way I want, but at the 
> time of creation they DON'T.
> 
> So I just want to ask you, where exactly in the sources do I 
> have to go and change this last aspect too?
placement.cpp

If you obtain the code from git, revert commits \
6d256b2d149c68fd08888865b8a7fafdad397296 and cbfe71e15a11f7fcc9dc919274ef8c204b6b1a16 \
(latter is for packing, a seldom used feature)

Otherwise the relevant patches are attached (you need to "patch -R" to reverse-apply \
them)

Cheers,
Thomas


["0001-align-zero-corner-placement-to-client-not-deco.patch" (text/x-patch)]

From 6d256b2d149c68fd08888865b8a7fafdad397296 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas Lübking?= <thomas.luebking@gmail.com>
Date: Thu, 15 Aug 2013 11:53:02 +0200
Subject: [PATCH] align zero corner placement to client, not deco

BUG: 318107
FIXED-IN: 4.11.1
REVIEW: 112102
---
 kwin/manage.cpp    |  3 ++-
 kwin/placement.cpp | 30 ++++++++++++++++++++++++++----
 2 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/kwin/manage.cpp b/kwin/manage.cpp
index e4faec0..c4206d2d 100644
--- a/kwin/manage.cpp
+++ b/kwin/manage.cpp
@@ -377,6 +377,7 @@ bool Client::manage(xcb_window_t w, bool isMapped)
     if (!placementDone) {
         // Placement needs to be after setting size
         Placement::self()->place(this, area);
+        dontKeepInArea = true;
         placementDone = true;
     }

@@ -419,7 +420,7 @@ bool Client::manage(xcb_window_t w, bool isMapped)
             if (pseudo_max != Client::MaximizeRestore) {
                 maximize((MaximizeMode)pseudo_max);
                 // from now on, care about maxmode, since the maximization call will \
                override mode for fix aspects
-                dontKeepInArea = (max_mode == Client::MaximizeFull);
+                dontKeepInArea |= (max_mode == Client::MaximizeFull);
                 geom_restore = QRect(); // Use placement when unmaximizing ...
                 if (!(max_mode & Client::MaximizeVertical)) {
                     geom_restore.setY(y());   // ...but only for horizontal \
                direction
diff --git a/kwin/placement.cpp b/kwin/placement.cpp
index 55fcb34..493ae15 100644
--- a/kwin/placement.cpp
+++ b/kwin/placement.cpp
@@ -28,6 +28,7 @@ along with this program.  If not, see \
<http://www.gnu.org/licenses/>.  #include <QTextStream>

 #ifndef KCMRULES
+#include <kdecoration.h>
 #include "workspace.h"
 #include "client.h"
 #include "options.h"
@@ -96,6 +97,30 @@ void Placement::place(Client* c, QRect& area, Policy policy, \
Policy nextPlacemen  placeMaximizing(c, area, nextPlacement);
     else
         placeSmart(c, area, nextPlacement);
+
+    if (options->borderSnapZone()) {
+        // snap to titlebar / snap to window borders on inner screen edges
+        const QRect geo(c->geometry());
+        QPoint corner = geo.topLeft();
+        const QPoint cp = c->clientPos();
+        const QSize cs = geo.size() - c->clientSize();
+        KDecorationDefines::Position titlePos = c->titlebarPosition();
+
+        const QRect fullRect = workspace()->clientArea(FullArea, c);
+        if (!(c->maximizeMode() & KDecorationDefines::MaximizeHorizontal)) {
+            if (titlePos != KDecorationDefines::PositionRight && geo.right() == \
fullRect.right()) +                corner.rx() += cs.width() - cp.x();
+            if (titlePos != KDecorationDefines::PositionLeft && geo.x() == \
fullRect.x()) +                corner.rx() -= cp.x();
+        }
+        if (!(c->maximizeMode() & KDecorationDefines::MaximizeVertical)) {
+            if (titlePos != KDecorationDefines::PositionBottom && geo.bottom() == \
fullRect.bottom()) +                corner.ry() += cs.height() - cp.y();
+            if (titlePos != KDecorationDefines::PositionTop && geo.y() == \
fullRect.y()) +                corner.ry() -= cp.y();
+        }
+        c->move(corner);
+    }
 }

 /*!
@@ -442,10 +467,7 @@ void Placement::placeCentered(Client* c, const QRect& area, \
Policy /*next*/)  void Placement::placeZeroCornered(Client* c, const QRect& area, \
Policy /*next*/)  {
     // get the maximum allowed windows space and desk's origin
-    const QRect maxRect = checkArea(c, area);
-
-    // place the window
-    c->move(QPoint(maxRect.left(), maxRect.top()));
+    c->move(checkArea(c, area).topLeft());
 }

 void Placement::placeUtility(Client* c, QRect& area, Policy /*next*/)
--
2.2.1


["0001-pack-to-client-not-deco.patch" (text/x-patch)]

From cbfe71e15a11f7fcc9dc919274ef8c204b6b1a16 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas Lübking?= <thomas.luebking@gmail.com>
Date: Mon, 16 Sep 2013 16:26:21 +0200
Subject: [PATCH] pack to client, not deco

this makes packing following the snapping behavior

REVIEW: 112807
---
 kwin/client.cpp    |  2 +-
 kwin/client.h      |  2 +-
 kwin/placement.cpp | 29 +++++++++++++++++++++++++++++
 3 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/kwin/client.cpp b/kwin/client.cpp
index e8e20d5..4b88f22 100644
--- a/kwin/client.cpp
+++ b/kwin/client.cpp
@@ -2430,7 +2430,7 @@ QRect Client::decorationRect() const
     }
 }

-KDecorationDefines::Position Client::titlebarPosition()
+KDecorationDefines::Position Client::titlebarPosition() const
 {
     Position titlePos = PositionCenter; // PositionTop is returned by the default \
                implementation
                                         // this will hint errors in the metaobject \
                usage ;-)
diff --git a/kwin/client.h b/kwin/client.h
index 40811f2..a2b3365 100644
--- a/kwin/client.h
+++ b/kwin/client.h
@@ -603,7 +603,7 @@ public:

     bool decorationHasAlpha() const;

-    Position titlebarPosition();
+    Position titlebarPosition() const;

     enum CoordinateMode {
         DecorationRelative, // Relative to the top left corner of the decoration
diff --git a/kwin/placement.cpp b/kwin/placement.cpp
index 493ae15..2f5f222 100644
--- a/kwin/placement.cpp
+++ b/kwin/placement.cpp
@@ -33,6 +33,7 @@ along with this program.  If not, see \
<http://www.gnu.org/licenses/>.  #include "client.h"
 #include "options.h"
 #include "rules.h"
+#include "screens.h"
 #endif

 namespace KWin
@@ -836,6 +837,13 @@ int Workspace::packPositionLeft(const Client* cl, int oldx, bool \
left_edge) cons  if (oldx <= newx)   // try another Xinerama screen
         newx = clientArea(MaximizeArea,
                           QPoint(cl->geometry().left() - 1, \
cl->geometry().center().y()), cl->desktop()).left(); +    if (cl->titlebarPosition() \
!= KDecorationDefines::PositionLeft) { +        QRect geo = cl->geometry();
+        int rgt = newx - cl->clientPos().x();
+        geo.moveRight(rgt);
+        if (screens()->intersecting(geo) < 2)
+            newx = rgt;
+    }
     if (oldx <= newx)
         return oldx;
     for (ClientList::ConstIterator it = clients.constBegin(), end = \
clients.constEnd(); it != end; ++it) { @@ -856,6 +864,13 @@ int \
Workspace::packPositionRight(const Client* cl, int oldx, bool right_edge) co  if \
(oldx >= newx)   // try another Xinerama screen  newx = clientArea(MaximizeArea,
                           QPoint(cl->geometry().right() + 1, \
cl->geometry().center().y()), cl->desktop()).right(); +    if (cl->titlebarPosition() \
!= KDecorationDefines::PositionRight) { +        QRect geo = cl->geometry();
+        int rgt = newx + cl->width() - (cl->clientSize().width() + \
cl->clientPos().x()); +        geo.moveRight(rgt);
+        if (screens()->intersecting(geo) < 2)
+            newx = rgt;
+    }
     if (oldx >= newx)
         return oldx;
     for (ClientList::ConstIterator it = clients.constBegin(), end = \
clients.constEnd(); it != end; ++it) { @@ -876,6 +891,13 @@ int \
Workspace::packPositionUp(const Client* cl, int oldy, bool top_edge) const  if (oldy \
<= newy)   // try another Xinerama screen  newy = clientArea(MaximizeArea,
                           QPoint(cl->geometry().center().x(), cl->geometry().top() - \
1), cl->desktop()).top(); +    if (cl->titlebarPosition() != \
KDecorationDefines::PositionTop) { +        QRect geo = cl->geometry();
+        int top = newy - cl->clientPos().y();
+        geo.moveTop(top);
+        if (screens()->intersecting(geo) < 2)
+            newy = top;
+    }
     if (oldy <= newy)
         return oldy;
     for (ClientList::ConstIterator it = clients.constBegin(), end = \
clients.constEnd(); it != end; ++it) { @@ -896,6 +918,13 @@ int \
Workspace::packPositionDown(const Client* cl, int oldy, bool bottom_edge) co  if \
(oldy >= newy)   // try another Xinerama screen  newy = clientArea(MaximizeArea,
                           QPoint(cl->geometry().center().x(), \
cl->geometry().bottom() + 1), cl->desktop()).bottom(); +    if \
(cl->titlebarPosition() != KDecorationDefines::PositionBottom) { +        QRect geo = \
cl->geometry(); +        int btm = newy + cl->height() - (cl->clientSize().height() + \
cl->clientPos().y()); +        geo.moveBottom(btm);
+        if (screens()->intersecting(geo) < 2)
+            newy = btm;
+    }
     if (oldy >= newy)
         return oldy;
     for (ClientList::ConstIterator it = clients.constBegin(), end = \
                clients.constEnd(); it != end; ++it) {
--
2.2.1



>> Visit http://mail.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic