https://bugs.kde.org/show_bug.cgi?id=379637

--- Comment #19 from Martin Flöser <mgraess...@kde.org> ---
Ok, I think I need to explain more on the situation on X11. The problem is not
that the code is fragile, undocumented or umaintained. The code is good, the
quality of the code in question is superb and one can easily understand which
area of X11 it reflects. No increase of documentation would make it possible to
implement this change request.

Let's look at the root problem. On X11 the window geometry is retrieved through
the get_geometry call:
https://www.x.org/releases/X11R7.7/doc/xproto/x11protocol.html#requests:GetGeometry

This specifies the geometry of a drawable - either a pixmap or a window. That's
what KWin's geometry handling code is based on. Now what GTK did is use this
window geometry and added the shadow into it. Additional there is a property
which indicates what to subtract from the x geometry to get to the window
geometry. If we wouldn't subtract it, we would snap to shadow, quick tiling
would include shadow, maximize would include shadow, etc. etc.

So basically everywhere where we use geometry we would have to remove that this
maps to x window geometry and replace it by an abstract geometry concept which
is either the geometry or the geometry subtracted by shadow. And this is the
fundamental problem for us. When KWin was developed nobody thought that the
geometry of a window would not match the geometry. Now you might wonder how
things like window decorations work? Well it's still a window. The actual
client window gets reparented to the window decoration and then we just use the
geometry of the decoration window again.

The geometry handling in KWin is deep involved and the assumption is carried
everywhere. It goes into the effect system (e.g. Present Windows uses it to
layout), it's deep in the compositor (we actually have a check to verify the
geometry matches the pixmap size, if it doesn't we don't render the window, see
https://phabricator.kde.org/source/kwin/browse/master/scene.cpp$1042). We have
multiple level of convenient api for it: Toplevel::width, Toplevel::height,
Toplevel::x, Toplevel::y, Toplevel::size, Toplevel::pos, etc. So it's not just
one method we have to check. Then there are methods like isOnScreen
intersecting the screen geometry with the window geometry.

So all of that is a huge effort to restructure the code base to support this
new requirement. And then there are multiple things which are completely
unknown to me as this is a not standardized protocol: when resizing do we have
to add the shadow or not? A maximized window does it include the shadow or not?
How does gravity interact with shadow? What if a base increment is set? What
about vertical only or horizontal only maximize state? Gtk doesn't like those,
so do they support it? Is it possible to have shadows only on some sides or is
it always all? Can we expect that Gtk won't change that? After all they broke
us here several times.

So to reiterate some important points:
 * this is not a bug on our side, our code is written against the X protocol,
ICCCM and EWMH
 * GTK changed basic understanding of what a window geometry is, this
understanding is completely incompatible to the assumptions KWin was
implemented on
 * The code base is in a superb state, geometry handling has very seldom bugs,
it's a done and working code base
 * The effort is comparable to adding Wayland support - the difficult part was
getting the geometry handling done
 * implementing the change is a huge effort as the code base is large and it
touches complex areas of X where the expected behavior is undocumented by GTK
(I just tried google for _GTK_FRAME_EXTENTS and found nothing)

----
Comparing to the state on Wayland: on Wayland the geometry and visual geometry
are separated. The visual geometry is defined by the size of the attached
buffer. The geometry of the window is not directly mapped from the buffer as we
have concepts such as scale built into the protocol. While KWin still is
largely based on the idea that visual geometry matches window geometry, it's
not as bad as on X11. We already weakened the assumption a lot by adding window
decorations ;-). Implementing the required request should be relatively
straight forward and doable without larger problems. We have a well tested code
base on Wayland and I am sure it can be implemented without regressions. The
main reason why the request is not implemented is that there was a little bit
of version mess when that area of code got written. That's now resolved and
it's possible to test with real world applications.

Overall I think the way forward is supporting Wayland. On X11 we need to find
different solutions which don't involve changing KWin or convince GTK to not
build a GUI based on fundamental changes to X11. I understand that they are not
able to understand KWin's problems - after all Mutter supports it. Maybe it's
possible to talk to the devs again if someone other than me approaches them. I
got from the responsible dev once the reply that he ignored all my bug reports
because it was me. Looking around it seems to me that Emmanuale Bassi is more
open to us and more open to changes to support us. Maybe Nate could try to
approach them - he is not a dev involved and focused on the quality of the
whole system. Explaining that KWin cannot implement it for the reasons given
here might help. Explaining that you are afraid of breakage might help. After
all if one is responsible for quality the change in KWin is something one needs
to take a step away from if quality is supposed to matter.

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to