1 /*
2     KWin - the KDE window manager
3     This file is part of the KDE project.
4 
5     SPDX-FileCopyrightText: 2009 Lucas Murray <lmurray@undefinedfire.com>
6     SPDX-FileCopyrightText: 2020 Cyril Rossi <cyril.rossi@enioka.com>
7 
8     SPDX-License-Identifier: GPL-2.0-or-later
9 */
10 
11 #include "kwinscreenedge.h"
12 
13 #include "monitor.h"
14 
15 namespace KWin
16 {
17 
KWinScreenEdge(QWidget * parent)18 KWinScreenEdge::KWinScreenEdge(QWidget *parent)
19     : QWidget(parent)
20 {
21     QMetaObject::invokeMethod(this, "createConnection", Qt::QueuedConnection);
22 }
23 
~KWinScreenEdge()24 KWinScreenEdge::~KWinScreenEdge()
25 {
26 }
27 
monitorHideEdge(ElectricBorder border,bool hidden)28 void KWinScreenEdge::monitorHideEdge(ElectricBorder border, bool hidden)
29 {
30     const int edge = KWinScreenEdge::electricBorderToMonitorEdge(border);
31     monitor()->setEdgeHidden(edge, hidden);
32 }
33 
monitorEnableEdge(ElectricBorder border,bool enabled)34 void KWinScreenEdge::monitorEnableEdge(ElectricBorder border, bool enabled)
35 {
36     const int edge = KWinScreenEdge::electricBorderToMonitorEdge(border);
37     monitor()->setEdgeEnabled(edge, enabled);
38 }
39 
monitorAddItem(const QString & item)40 void KWinScreenEdge::monitorAddItem(const QString &item)
41 {
42     for (int i = 0; i < 8; i++) {
43         monitor()->addEdgeItem(i, item);
44     }
45 }
46 
monitorItemSetEnabled(int index,bool enabled)47 void KWinScreenEdge::monitorItemSetEnabled(int index, bool enabled)
48 {
49     for (int i = 0; i < 8; i++) {
50         monitor()->setEdgeItemEnabled(i, index, enabled);
51     }
52 }
53 
monitorChangeEdge(const QList<int> & borderList,int index)54 void KWinScreenEdge::monitorChangeEdge(const QList<int> &borderList, int index)
55 {
56     for (int border : borderList) {
57         monitorChangeEdge(static_cast<ElectricBorder>(border), index);
58     }
59 }
60 
monitorChangeEdge(ElectricBorder border,int index)61 void KWinScreenEdge::monitorChangeEdge(ElectricBorder border, int index)
62 {
63     if (ELECTRIC_COUNT == border || ElectricNone == border) {
64         return;
65     }
66     m_reference[border] = index;
67     monitor()->selectEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(border), index);
68 }
69 
monitorCheckEffectHasEdge(int index) const70 QList<int> KWinScreenEdge::monitorCheckEffectHasEdge(int index) const
71 {
72     QList<int> list;
73     if (monitor()->selectedEdgeItem(Monitor::Top) == index) {
74         list.append(ElectricTop);
75     }
76     if (monitor()->selectedEdgeItem(Monitor::TopRight) == index) {
77         list.append(ElectricTopRight);
78     }
79     if (monitor()->selectedEdgeItem(Monitor::Right) == index) {
80         list.append(ElectricRight);
81     }
82     if (monitor()->selectedEdgeItem(Monitor::BottomRight) == index) {
83         list.append(ElectricBottomRight);
84     }
85     if (monitor()->selectedEdgeItem(Monitor::Bottom) == index) {
86         list.append(ElectricBottom);
87     }
88     if (monitor()->selectedEdgeItem(Monitor::BottomLeft) == index) {
89         list.append(ElectricBottomLeft);
90     }
91     if (monitor()->selectedEdgeItem(Monitor::Left) == index) {
92         list.append(ElectricLeft);
93     }
94     if (monitor()->selectedEdgeItem(Monitor::TopLeft) == index) {
95         list.append(ElectricTopLeft);
96     }
97 
98     if (list.isEmpty()) {
99         list.append(ElectricNone);
100     }
101     return list;
102 }
103 
selectedEdgeItem(ElectricBorder border) const104 int KWinScreenEdge::selectedEdgeItem(ElectricBorder border) const
105 {
106     return monitor()->selectedEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(border));
107 }
108 
monitorChangeDefaultEdge(ElectricBorder border,int index)109 void KWinScreenEdge::monitorChangeDefaultEdge(ElectricBorder border, int index)
110 {
111     if (ELECTRIC_COUNT == border || ElectricNone == border) {
112         return;
113     }
114     m_default[border] = index;
115 }
116 
monitorChangeDefaultEdge(const QList<int> & borderList,int index)117 void KWinScreenEdge::monitorChangeDefaultEdge(const QList<int> &borderList, int index)
118 {
119     for (int border : borderList) {
120         monitorChangeDefaultEdge(static_cast<ElectricBorder>(border), index);
121     }
122 }
123 
reload()124 void KWinScreenEdge::reload()
125 {
126     for (auto it = m_reference.cbegin(); it != m_reference.cend(); ++it) {
127         monitor()->selectEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(it.key()), it.value());
128     }
129     onChanged();
130 }
131 
setDefaults()132 void KWinScreenEdge::setDefaults()
133 {
134     for (auto it = m_default.cbegin(); it != m_default.cend(); ++it) {
135         monitor()->selectEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(it.key()), it.value());
136     }
137     onChanged();
138 }
139 
electricBorderToMonitorEdge(ElectricBorder border)140 int KWinScreenEdge::electricBorderToMonitorEdge(ElectricBorder border)
141 {
142     switch(border) {
143     case ElectricTop:
144         return Monitor::Top;
145     case ElectricTopRight:
146         return Monitor::TopRight;
147     case ElectricRight:
148         return Monitor::Right;
149     case ElectricBottomRight:
150         return Monitor::BottomRight;
151     case ElectricBottom:
152         return Monitor::Bottom;
153     case ElectricBottomLeft:
154         return Monitor::BottomLeft;
155     case ElectricLeft:
156         return Monitor::Left;
157     case ElectricTopLeft:
158         return Monitor::TopLeft;
159     default: // ELECTRIC_COUNT and ElectricNone
160         return Monitor::None;
161     }
162 }
163 
monitorEdgeToElectricBorder(int edge)164 ElectricBorder KWinScreenEdge::monitorEdgeToElectricBorder(int edge)
165 {
166     const Monitor::Edges monitorEdge = static_cast<Monitor::Edges>(edge);
167     switch (monitorEdge) {
168     case Monitor::Left:
169         return ElectricLeft;
170     case Monitor::Right:
171         return ElectricRight;
172     case Monitor::Top:
173         return ElectricTop;
174     case Monitor::Bottom:
175         return ElectricBottom;
176     case Monitor::TopLeft:
177         return ElectricTopLeft;
178     case Monitor::TopRight:
179         return ElectricTopRight;
180     case Monitor::BottomLeft:
181         return ElectricBottomLeft;
182     case Monitor::BottomRight:
183         return ElectricBottomRight;
184     default:
185         return ElectricNone;
186     }
187 }
188 
onChanged()189 void KWinScreenEdge::onChanged()
190 {
191     bool needSave = isSaveNeeded();
192     for (auto it = m_reference.cbegin(); it != m_reference.cend(); ++it) {
193         needSave |= it.value() != monitor()->selectedEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(it.key()));
194     }
195     Q_EMIT saveNeededChanged(needSave);
196 
197     bool defaults = isDefault();
198     for (auto it = m_default.cbegin(); it != m_default.cend(); ++it) {
199         defaults &= it.value() == monitor()->selectedEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(it.key()));
200     }
201     Q_EMIT defaultChanged(defaults);
202 }
203 
createConnection()204 void KWinScreenEdge::createConnection()
205 {
206         connect(monitor(),
207                 &Monitor::changed,
208                 this,
209                 &KWinScreenEdge::onChanged);
210 }
211 
isSaveNeeded() const212 bool KWinScreenEdge::isSaveNeeded() const
213 {
214     return false;
215 }
216 
isDefault() const217 bool KWinScreenEdge::isDefault() const
218 {
219     return true;
220 }
221 
222 } // namespace
223