Disable screen edge approach area if the edge is blocked

Currently, if the screen edge is blocked and the cursor is inside its
approach geometry, kwin is going to paint screen edge glow.

It doesn't look good and it can have some performance penalties with
fullscreen video games because the direct scanout path will be blocked.

BUG: 454503
This commit is contained in:
Vlad Zahorodnii 2022-06-13 12:16:31 +03:00
parent 29946be29f
commit 4e32ea20d6

View file

@ -583,6 +583,9 @@ void Edge::checkBlocking()
} }
const bool wasTouch = activatesForTouchGesture(); const bool wasTouch = activatesForTouchGesture();
m_blocked = newValue; m_blocked = newValue;
if (m_blocked && m_approaching) {
stopApproaching();
}
if (wasTouch != activatesForTouchGesture()) { if (wasTouch != activatesForTouchGesture()) {
Q_EMIT activatesForTouchGestureChanged(); Q_EMIT activatesForTouchGestureChanged();
} }
@ -1430,7 +1433,7 @@ void ScreenEdges::check(const QPoint &pos, const QDateTime &now, bool forceNoPus
{ {
bool activatedForClient = false; bool activatedForClient = false;
for (auto it = m_edges.begin(); it != m_edges.end(); ++it) { for (auto it = m_edges.begin(); it != m_edges.end(); ++it) {
if (!(*it)->isReserved()) { if (!(*it)->isReserved() || (*it)->isBlocked()) {
continue; continue;
} }
if (!(*it)->activatesForPointer()) { if (!(*it)->activatesForPointer()) {
@ -1460,7 +1463,7 @@ bool ScreenEdges::isEntered(QMouseEvent *event)
bool activatedForClient = false; bool activatedForClient = false;
for (auto it = m_edges.begin(); it != m_edges.end(); ++it) { for (auto it = m_edges.begin(); it != m_edges.end(); ++it) {
Edge *edge = *it; Edge *edge = *it;
if (!edge->isReserved()) { if (!edge->isReserved() || edge->isBlocked()) {
continue; continue;
} }
if (!edge->activatesForPointer()) { if (!edge->activatesForPointer()) {
@ -1504,7 +1507,7 @@ bool ScreenEdges::handleEnterNotifiy(xcb_window_t window, const QPoint &point, c
if (!edge || edge->window() == XCB_WINDOW_NONE) { if (!edge || edge->window() == XCB_WINDOW_NONE) {
continue; continue;
} }
if (!edge->isReserved()) { if (!edge->isReserved() || edge->isBlocked()) {
continue; continue;
} }
if (!edge->activatesForPointer()) { if (!edge->activatesForPointer()) {