File indexing completed on 2024-11-10 04:57:17
0001 /* 0002 SPDX-FileCopyrightText: 2021 Vlad Zahorodnii <vlad.zahorodnii@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "desktopbackgrounditem.h" 0008 #include "core/output.h" 0009 #include "window.h" 0010 #if KWIN_BUILD_ACTIVITIES 0011 #include "activities.h" 0012 #endif 0013 #include "core/outputbackend.h" 0014 #include "main.h" 0015 #include "scripting_logging.h" 0016 #include "virtualdesktops.h" 0017 #include "workspace.h" 0018 0019 namespace KWin 0020 { 0021 0022 DesktopBackgroundItem::DesktopBackgroundItem(QQuickItem *parent) 0023 : WindowThumbnailItem(parent) 0024 { 0025 } 0026 0027 void DesktopBackgroundItem::componentComplete() 0028 { 0029 WindowThumbnailItem::componentComplete(); 0030 updateWindow(); 0031 } 0032 0033 QString DesktopBackgroundItem::outputName() const 0034 { 0035 return m_output ? m_output->name() : QString(); 0036 } 0037 0038 void DesktopBackgroundItem::setOutputName(const QString &name) 0039 { 0040 setOutput(kwinApp()->outputBackend()->findOutput(name)); 0041 } 0042 0043 Output *DesktopBackgroundItem::output() const 0044 { 0045 return m_output; 0046 } 0047 0048 void DesktopBackgroundItem::setOutput(Output *output) 0049 { 0050 if (m_output != output) { 0051 m_output = output; 0052 updateWindow(); 0053 Q_EMIT outputChanged(); 0054 } 0055 } 0056 0057 VirtualDesktop *DesktopBackgroundItem::desktop() const 0058 { 0059 return m_desktop; 0060 } 0061 0062 void DesktopBackgroundItem::setDesktop(VirtualDesktop *desktop) 0063 { 0064 if (m_desktop != desktop) { 0065 m_desktop = desktop; 0066 updateWindow(); 0067 Q_EMIT desktopChanged(); 0068 } 0069 } 0070 0071 QString DesktopBackgroundItem::activity() const 0072 { 0073 return m_activity; 0074 } 0075 0076 void DesktopBackgroundItem::setActivity(const QString &activity) 0077 { 0078 if (m_activity != activity) { 0079 m_activity = activity; 0080 updateWindow(); 0081 Q_EMIT activityChanged(); 0082 } 0083 } 0084 0085 void DesktopBackgroundItem::updateWindow() 0086 { 0087 if (!isComponentComplete()) { 0088 return; 0089 } 0090 0091 if (Q_UNLIKELY(!m_output)) { 0092 qCWarning(KWIN_SCRIPTING) << "DesktopBackgroundItem.output is required"; 0093 return; 0094 } 0095 0096 VirtualDesktop *desktop = m_desktop; 0097 if (!desktop) { 0098 desktop = VirtualDesktopManager::self()->currentDesktop(); 0099 } 0100 0101 QString activity = m_activity; 0102 if (activity.isEmpty()) { 0103 #if KWIN_BUILD_ACTIVITIES 0104 activity = Workspace::self()->activities()->current(); 0105 #endif 0106 } 0107 0108 Window *clientCandidate = nullptr; 0109 0110 const auto clients = workspace()->windows(); 0111 for (Window *client : clients) { 0112 if (client->isDesktop() && client->isOnOutput(m_output) && client->isOnDesktop(desktop) && client->isOnActivity(activity)) { 0113 // In the unlikely event there are multiple desktop windows (e.g. conky's floating panel is of type "desktop") 0114 // choose the one which matches the ouptut size, if possible. 0115 if (!clientCandidate || client->size() == m_output->geometry().size()) { 0116 clientCandidate = client; 0117 } 0118 } 0119 } 0120 0121 setClient(clientCandidate); 0122 } 0123 0124 } // namespace KWin 0125 0126 #include "moc_desktopbackgrounditem.cpp"