Summary:
It doesn't make sense to pass const `QWindow`s to `PanelShadows` because
a `KWindowShadow` needs a mutable `QWindow` object.
Test Plan: const_cast in PanelShadows::Private::updateShadow is gone \o/
Reviewers: #plasma, apol
Reviewed By: apol
Subscribers: plasma-devel
Tags: #plasma
Differential Revision: https://phabricator.kde.org/D26985
Summary:
Older Plasma themes, which are still offered also for current Plasma 5 e.g.
from store.kde.org, are missing out "shadow-*" elements for
"widgets/panel-background". The old code of the PanelShadows class does not
handle that case though, and as result for X11 sets a _KDE_NET_WM_SHADOW
property with "0" for most of the pixmaps due to them being an empty pixmap
in at least one dimension (except for the emtpy corner pixmap which is
always 1,1). The resulting behaviour with current KWin (X11) is this:
* when starting a Plasma shell with a theme without panel shadow elements,
KWin does not show shadows
* when switching from a theme with shadow elements to one without, the
shadow of the previous theme is continued to be used.
Reason is that KWin when parsing that property cancels the parsing when it
comes across a "0"/null id for a shadow pixmap, without further error
handling, so either does not create a shadow or keeps the old.
This patch catches the case of themes without any panel shadow elements and
only sets the _KDE_NET_WM_SHADOW property or wayland shadow if there are
shadows, otherwise removes them if needed.
Test Plan:
Switch between Plasma themes with and without separate shadow elements
defined (e.g. Breeze <-> Fluffy Bunny).
Reviewers: #plasma, mart
Reviewed By: #plasma, mart
Subscribers: plasma-devel
Tags: #plasma
Differential Revision: https://phabricator.kde.org/D20051
Summary:
On Wayland, if some border is disabled, we don't attach corresponding
empty tile. Yet, we set offset of 1 for that border.
KWin relies on offset values to calculate bounding box for shadows.
For example, if a panel has only top border enabled, then the bounding
box will be 2 pixel wider(and 1px taller) than it should be. This can
result in having 1px thin artefacts on neighboring screens.
In general, we don't have to attach empty tiles for disabled borders.
Thus, we can set corresponding offsets to 0.
Reviewers: davidedmundson
Reviewed By: davidedmundson
Subscribers: plasma-devel
Tags: #plasma
Differential Revision: https://phabricator.kde.org/D14999
m_windows keeps track of which window has which borders so it can update them when e.g. theme changes.
Unfortunately, it was never updated after the window was initially added.
Differential Revision: https://phabricator.kde.org/D7505
Summary:
Reduces code duplication and we always opperate on cached value, that
is the platform is only checked once in application life cycle.
Reviewers: #plasma, hein
Subscribers: plasma-devel
Tags: #plasma
Differential Revision: https://phabricator.kde.org/D2342
I noticed that panels had borders on all sides and it turns out PanelShadows was never
actually told which sides should have shadows.
To reduce code duplication I expose the enabled borders as property to the Panel.qml
which itself does the same calculation from QML again and does it many times.
Differential Revision: https://phabricator.kde.org/D1756
Summary:
Removing the shadow only affects the pending state, we also need to
explicitly commit the Surface to apply the state change.
Reviewers: #plasma, mart
Subscribers: plasma-devel
Projects: #plasma
Differential Revision: https://phabricator.kde.org/D1399
Summary:
If the window's platform surface was destroyed, there is also
no shadow to be removed.
Both X and Wayland code will try to create the platform surface
again, and it will lead to crash in other code that doesn't expect
platform surface to be created when the containment is being deleted.
This fixes crash in PanelConfigView::event when removing panels.
Reviewers: graesslin, #plasma
Reviewed By: graesslin, #plasma
Subscribers: plasma-devel
Projects: #plasma
Differential Revision: https://phabricator.kde.org/D951
This change adds support for shadows using the KWin specific shadow
protocol provided by KWayland. The protocol is inspired by the X11
protocol, so it can be easily integrated. The protocol takes a buffer
for each of the shadow parts and provides the same offsets.
To make this possible the code is better split into X11 and Wayland
specific parts.
REVIEW: 124360
This reverts commit aba0ad1268.
The reason for revertion is that it leaks pixmaps.
QX11Info::display should not return a nullptr if there is no QScreen.
This needs fixing in Qt, not workarounds in our software. None of our
X11 specific code in plasma-workspace or frameworks can handle the case
that the Display* or xcb_connection_t* becomes null suddenly. Neither
can Qt internally. If it would happen Qt would abort.
The only application in our workspace which would be "somewhat" safe
is KWin because it caches the returned Display after first invokation
to QX11Info::display.
This is to keep up with the Qt 5.5 changes with null QScreen. BT:
#0 XInternAtom (dpy=0x0, name=0x7f1195725664 "_KDE_NET_WM_SHADOW", onlyIfExists=0)
at /var/tmp/portage/x11-libs/libX11-1.6.2/work/libX11-1.6.2/src/IntAtom.c:174
#1 0x00007f11956e438c in PanelShadows::Private::clearShadow (this=<optimized out>, window=0x7f119958ff90)
at /var/tmp/portage/kde-plasma/plasma-workspace-5.2.1/work/plasma-workspace-5.2.1/shell/panelshadows.cpp:494
#2 0x00007f11956e7139 in PanelShadows::removeWindow (this=0x7f119593b060 <(anonymous namespace)::Q_QGS_privateDialogShadowsSelf::innerFunction()::holder>, window=window@entry=0x7f119958ff90)
at /var/tmp/portage/kde-plasma/plasma-workspace-5.2.1/work/plasma-workspace-5.2.1/shell/panelshadows.cpp:142
#3 0x00007f11956dd8f5 in PanelView::~PanelView (this=0x7f119958ff90, __in_chrg=<optimized out>)
at /var/tmp/portage/kde-plasma/plasma-workspace-5.2.1/work/plasma-workspace-5.2.1/shell/panelview.cpp:124
#4 0x00007f11956dd9af in PanelView::~PanelView (this=0x7f119958ff90, __in_chrg=<optimized out>)
at /var/tmp/portage/kde-plasma/plasma-workspace-5.2.1/work/plasma-workspace-5.2.1/shell/panelview.cpp:125
#5 0x00007f11956effa8 in ShellCorona::removeView (this=0x7f1196c19b40, idx=0) at /var/tmp/portage/kde-plasma/plasma-workspace-5.2.1/work/plasma-workspace-5.2.1/shell/shellcorona.cpp:710
#6 0x00007f11956f0038 in ShellCorona::remove (this=this@entry=0x7f1196c19b40, desktopView=<optimized out>)
at /var/tmp/portage/kde-plasma/plasma-workspace-5.2.1/work/plasma-workspace-5.2.1/shell/shellcorona.cpp:662
#7 0x00007f11956f009f in ShellCorona::screenRemoved (this=0x7f1196c19b40, screen=<optimized out>)
at /var/tmp/portage/kde-plasma/plasma-workspace-5.2.1/work/plasma-workspace-5.2.1/shell/shellcorona.cpp:743
Signed-off-by: Lukáš Tinkl <lukas@kde.org>
REVIEW: 122909