kwin/thumbnailitem.cpp
Vlad Zahorodnii 0c266e760b Replace remaining usages of old connect syntax with new connect syntax
This change replaces the remaining usages of the old connect syntax with
the new connect syntax.

Unfortunately, there are still places where we have to use SIGNAL() and
SLOT() macros, for example the stuff that deals with d-bus business.

Clazy was used to create this change. There were a few cases that needed
manual intervention, the majority of those cases were about resolving
ambiguity caused by overloaded signals.
2020-09-24 09:33:45 +00:00

209 lines
4.8 KiB
C++

/*
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2011 Martin Gräßlin <mgraesslin@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "thumbnailitem.h"
// KWin
#include "x11client.h"
#include "composite.h"
#include "effects.h"
#include "workspace.h"
#include "wayland_server.h"
// Qt
#include <QDebug>
#include <QPainter>
#include <QQuickWindow>
namespace KWin
{
AbstractThumbnailItem::AbstractThumbnailItem(QQuickItem *parent)
: QQuickPaintedItem(parent)
, m_brightness(1.0)
, m_saturation(1.0)
, m_clipToItem()
{
connect(Compositor::self(), &Compositor::compositingToggled, this, &AbstractThumbnailItem::compositingToggled);
compositingToggled();
QTimer::singleShot(0, this, &AbstractThumbnailItem::init);
}
AbstractThumbnailItem::~AbstractThumbnailItem()
{
}
void AbstractThumbnailItem::compositingToggled()
{
m_parent.clear();
if (effects) {
connect(effects, &EffectsHandler::windowAdded, this, &AbstractThumbnailItem::effectWindowAdded);
connect(effects, &EffectsHandler::windowDamaged, this, &AbstractThumbnailItem::repaint);
effectWindowAdded();
}
}
void AbstractThumbnailItem::init()
{
findParentEffectWindow();
if (m_parent) {
m_parent->registerThumbnail(this);
}
}
void AbstractThumbnailItem::findParentEffectWindow()
{
if (effects) {
QQuickWindow *qw = window();
if (!qw) {
qCDebug(KWIN_CORE) << "No QQuickWindow assigned yet";
return;
}
if (auto *w = static_cast<EffectWindowImpl*>(effects->findWindow(qw))) {
m_parent = QPointer<EffectWindowImpl>(w);
}
}
}
void AbstractThumbnailItem::effectWindowAdded()
{
// the window might be added before the EffectWindow is created
// by using this slot we can register the thumbnail when it is finally created
if (m_parent.isNull()) {
findParentEffectWindow();
if (m_parent) {
m_parent->registerThumbnail(this);
}
}
}
void AbstractThumbnailItem::setBrightness(qreal brightness)
{
if (qFuzzyCompare(brightness, m_brightness)) {
return;
}
m_brightness = brightness;
update();
emit brightnessChanged();
}
void AbstractThumbnailItem::setSaturation(qreal saturation)
{
if (qFuzzyCompare(saturation, m_saturation)) {
return;
}
m_saturation = saturation;
update();
emit saturationChanged();
}
void AbstractThumbnailItem::setClipTo(QQuickItem *clip)
{
m_clipToItem = QPointer<QQuickItem>(clip);
emit clipToChanged();
}
WindowThumbnailItem::WindowThumbnailItem(QQuickItem* parent)
: AbstractThumbnailItem(parent)
, m_wId(nullptr)
, m_client(nullptr)
{
}
WindowThumbnailItem::~WindowThumbnailItem()
{
}
void WindowThumbnailItem::setWId(const QUuid &wId)
{
if (m_wId == wId) {
return;
}
m_wId = wId;
if (m_wId != nullptr) {
setClient(workspace()->findAbstractClient([this] (const AbstractClient *c) { return c->internalId() == m_wId; }));
} else if (m_client) {
m_client = nullptr;
emit clientChanged();
}
emit wIdChanged(wId);
}
void WindowThumbnailItem::setClient(AbstractClient *client)
{
if (m_client == client) {
return;
}
m_client = client;
if (m_client) {
setWId(m_client->internalId());
} else {
setWId({});
}
emit clientChanged();
}
void WindowThumbnailItem::paint(QPainter *painter)
{
if (effects) {
return;
}
auto client = workspace()->findAbstractClient([this] (const AbstractClient *c) { return c->internalId() == m_wId; });
if (!client) {
return;
}
QPixmap pixmap = client->icon().pixmap(boundingRect().size().toSize());
const QSize size(boundingRect().size().toSize() - pixmap.size());
painter->drawPixmap(boundingRect().adjusted(size.width()/2.0, size.height()/2.0, -size.width()/2.0, -size.height()/2.0).toRect(),
pixmap);
}
void WindowThumbnailItem::repaint(KWin::EffectWindow *w)
{
if (static_cast<KWin::EffectWindowImpl*>(w)->window()->internalId() == m_wId) {
update();
}
}
DesktopThumbnailItem::DesktopThumbnailItem(QQuickItem *parent)
: AbstractThumbnailItem(parent)
, m_desktop(0)
{
}
DesktopThumbnailItem::~DesktopThumbnailItem()
{
}
void DesktopThumbnailItem::setDesktop(int desktop)
{
desktop = qBound<int>(1, desktop, VirtualDesktopManager::self()->count());
if (desktop == m_desktop) {
return;
}
m_desktop = desktop;
update();
emit desktopChanged(m_desktop);
}
void DesktopThumbnailItem::paint(QPainter *painter)
{
Q_UNUSED(painter)
if (effects) {
return;
}
// TODO: render icon
}
void DesktopThumbnailItem::repaint(EffectWindow *w)
{
if (w->isOnDesktop(m_desktop)) {
update();
}
}
} // namespace KWin